Files
gh-robin-collins-claude-cod…/skills/employment-application/scripts/generate_cover_letter.js
2025-11-30 08:52:43 +08:00

168 lines
4.9 KiB
JavaScript

#!/usr/bin/env node
/**
* Cover Letter Generator Template
*
* This script provides a template for generating professional cover letters
* using the docx library with proper formatting and structure.
*
* Usage: Customize the content sections below with job-specific information
*/
const { Document, Packer, Paragraph, TextRun, AlignmentType } = require('docx');
const fs = require('fs');
// Configuration
const OUTPUT_FILE = 'Collins_Robin_Cover_Letter.docx';
const APPLICANT_NAME = 'Robin Collins';
const APPLICANT_EMAIL = 'robin.f.collins@outlook.com';
const APPLICANT_PHONE = '0475 795 732';
// Job-specific configuration - CUSTOMIZE THESE
const POSITION_TITLE = '[Position Title]';
const COMPANY_NAME = '[Company Name]';
const HIRING_MANAGER = '[Hiring Manager Name or "Hiring Manager"]';
const DATE = new Date().toLocaleDateString('en-AU', { year: 'numeric', month: 'long', day: 'numeric' });
/**
* Content sections - CUSTOMIZE WITH JOB-SPECIFIC CONTENT
*/
const OPENING_PARAGRAPH = `Dear ${HIRING_MANAGER},
I am writing to express my strong interest in the ${POSITION_TITLE} position at ${COMPANY_NAME}. [Add 1-2 sentences about your unique value proposition and why you're an excellent fit for this specific role.]`;
const BODY_PARAGRAPH_1 = `[Address first key selection criterion or requirement. Lead with the criterion, provide specific evidence from your experience with quantifiable results, and connect to the organizational need.]`;
const BODY_PARAGRAPH_2 = `[Address second key selection criterion. Include specific achievements, metrics, and demonstrate how your experience directly applies to role requirements.]`;
const BODY_PARAGRAPH_3 = `[Optional: Address additional selection criteria or provide compelling examples that differentiate you as a candidate.]`;
const CLOSING_PARAGRAPH = `I am excited about the opportunity to bring my [key skills/experience] to ${COMPANY_NAME} and contribute to [specific organizational goal or initiative]. I would welcome the opportunity to discuss how my background aligns with your needs in greater detail. Thank you for considering my application.
Sincerely,
${APPLICANT_NAME}
${APPLICANT_EMAIL}
${APPLICANT_PHONE}`;
/**
* Style definitions
*/
const styles = {
default: {
document: {
run: { font: 'Calibri', size: 22 } // 11pt
}
},
paragraphStyles: [
{
id: 'Header',
name: 'Header',
basedOn: 'Normal',
run: { font: 'Calibri', size: 22, bold: true },
paragraph: { spacing: { after: 120 }, alignment: AlignmentType.LEFT }
},
{
id: 'Body',
name: 'Body',
basedOn: 'Normal',
run: { font: 'Calibri', size: 22 },
paragraph: { spacing: { after: 240, line: 360 }, alignment: AlignmentType.LEFT }
},
{
id: 'Closing',
name: 'Closing',
basedOn: 'Normal',
run: { font: 'Calibri', size: 22 },
paragraph: { spacing: { before: 240, after: 120 }, alignment: AlignmentType.LEFT }
}
]
};
/**
* Generate cover letter document
*/
function generateCoverLetter() {
const doc = new Document({
styles: styles,
sections: [{
properties: {
page: {
margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } // 1 inch margins
}
},
children: [
// Header with contact info
new Paragraph({
style: 'Header',
children: [new TextRun(APPLICANT_NAME)]
}),
new Paragraph({
children: [
new TextRun(`${APPLICANT_EMAIL} | ${APPLICANT_PHONE}`)
],
spacing: { after: 240 }
}),
// Date
new Paragraph({
children: [new TextRun(DATE)],
spacing: { after: 240 }
}),
// Opening
new Paragraph({
style: 'Body',
children: [new TextRun(OPENING_PARAGRAPH)]
}),
// Body paragraphs
new Paragraph({
style: 'Body',
children: [new TextRun(BODY_PARAGRAPH_1)]
}),
new Paragraph({
style: 'Body',
children: [new TextRun(BODY_PARAGRAPH_2)]
}),
// Optional third body paragraph (comment out if not needed)
new Paragraph({
style: 'Body',
children: [new TextRun(BODY_PARAGRAPH_3)]
}),
// Closing
new Paragraph({
style: 'Closing',
children: [new TextRun(CLOSING_PARAGRAPH)]
})
]
}]
});
return doc;
}
/**
* Save document to file
*/
async function main() {
try {
const doc = generateCoverLetter();
const buffer = await Packer.toBuffer(doc);
fs.writeFileSync(OUTPUT_FILE, buffer);
console.log(`✅ Cover letter created successfully: ${OUTPUT_FILE}`);
} catch (error) {
console.error('❌ Error generating cover letter:', error);
process.exit(1);
}
}
// Run if called directly
if (require.main === module) {
main();
}
module.exports = { generateCoverLetter };