Compare commits
	
		
			2 commits
		
	
	
		
			ba194a11ac
			...
			2dccfcbb69
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 2dccfcbb69 | ||
|   | 5057293b4b | 
					 3 changed files with 273 additions and 2 deletions
				
			
		
							
								
								
									
										84
									
								
								main.js
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								main.js
									
									
									
									
									
								
							|  | @ -1,12 +1,15 @@ | |||
| const promises = require('fs/promises'); | ||||
| const pdf = require('pdf-parse'); | ||||
| const Anthropic = require('@anthropic-ai/sdk'); | ||||
| const { Document, Packer, Paragraph, TextRun } = require('docx'); | ||||
| const fs = require('fs'); | ||||
| 
 | ||||
| require('dotenv').config(); | ||||
| 
 | ||||
| const today = new Date(); | ||||
| let jobDescription = ''; | ||||
| let coverLetterRawText = ''; | ||||
| 
 | ||||
| console.log(today); | ||||
| 
 | ||||
| const anthropic = new Anthropic({ | ||||
|   apiKey: process.env.ANTHROPIC_API_KEY | ||||
|  | @ -38,6 +41,73 @@ async function readJobDescription(filePath) { | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| function generateCoverLetter(rawText, outputFilename) { | ||||
|   // Parse the raw markup
 | ||||
|   const header = rawText.match(/<header>(.*?)<\/header>/s)[1].trim(); | ||||
|   const greeting = rawText.match(/<greeting>(.*?)<\/greeting>/s)[1].trim(); | ||||
|   const introduction = rawText.match(/<introduction>(.*?)<\/introduction>/s)[1].trim(); | ||||
|   const body = rawText.match(/<body>(.*?)<\/body>/s)[1].trim(); | ||||
|   const conclusion = rawText.match(/<conclusion>(.*?)<\/conclusion>/s)[1].trim(); | ||||
|   const signature = rawText.match(/<signature>(.*?)<\/signature>/s)[1].trim(); | ||||
| 
 | ||||
|   // Create a new document using docx
 | ||||
|   const doc = new Document({ | ||||
|     sections: [ | ||||
|       { | ||||
|         properties: {}, | ||||
|         children: [ | ||||
|           new Paragraph({ | ||||
|             children: [ | ||||
|               new TextRun(header), | ||||
|               new TextRun("\n\n"), // Add line breaks between sections
 | ||||
|             ], | ||||
|           }), | ||||
|           new Paragraph({ | ||||
|             children: [ | ||||
|               new TextRun(greeting), | ||||
|               new TextRun("\n\n"), | ||||
|             ], | ||||
|           }), | ||||
|           new Paragraph({ | ||||
|             children: [ | ||||
|               new TextRun(introduction), | ||||
|               new TextRun("\n\n"), | ||||
|             ], | ||||
|           }), | ||||
|           new Paragraph({ | ||||
|             children: [ | ||||
|               new TextRun(body), | ||||
|               new TextRun("\n\n"), | ||||
|             ], | ||||
|           }), | ||||
|           new Paragraph({ | ||||
|             children: [ | ||||
|               new TextRun(conclusion), | ||||
|               new TextRun("\n\n"), | ||||
|             ], | ||||
|           }), | ||||
|           new Paragraph({ | ||||
|             children: [ | ||||
|               new TextRun(signature), | ||||
|               new TextRun("\n\n"), | ||||
|             ], | ||||
|           }), | ||||
|         ], | ||||
|       }, | ||||
|     ], | ||||
|   }); | ||||
| 
 | ||||
|   // Create a packer to generate the .docx file
 | ||||
|   Packer.toBuffer(doc).then((buffer) => { | ||||
|     // Save the document as a .docx file
 | ||||
|     fs.writeFileSync(outputFilename, buffer); | ||||
|     console.log(`${outputFilename} created successfully!`); | ||||
|   }).catch(error => { | ||||
|     console.error("Error generating the document:", error); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| async function main() { | ||||
|   try { | ||||
|  | @ -61,7 +131,12 @@ async function main() { | |||
| 
 | ||||
|     const cover_letter_response = await anthropic.messages.create(cover_letter_api); | ||||
| 
 | ||||
|     console.log(cover_letter_response) | ||||
|     coverLetterRawText = cover_letter_response.content[0].text.split('<cover_letter>')[1].split('</cover_letter>')[0].trim() | ||||
|     // console.log(coverLetterRawText)
 | ||||
| 
 | ||||
|     generateCoverLetter(coverLetterRawText, 'test.docx') | ||||
| 
 | ||||
| 
 | ||||
|     | ||||
| 
 | ||||
| 
 | ||||
|  | @ -72,6 +147,11 @@ async function main() { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| readJobDescription('./data/job_description.txt') | ||||
| // Call the main function
 | ||||
| main(); | ||||
							
								
								
									
										190
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										190
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							|  | @ -10,6 +10,7 @@ | |||
|       "license": "ISC", | ||||
|       "dependencies": { | ||||
|         "@anthropic-ai/sdk": "^0.36.3", | ||||
|         "docx": "^9.1.1", | ||||
|         "dotenv": "^16.4.7", | ||||
|         "pdf-parse": "^1.1.1" | ||||
|       } | ||||
|  | @ -90,6 +91,12 @@ | |||
|         "node": ">= 0.8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/core-util-is": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", | ||||
|       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/debug": { | ||||
|       "version": "3.2.7", | ||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", | ||||
|  | @ -108,6 +115,38 @@ | |||
|         "node": ">=0.4.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/docx": { | ||||
|       "version": "9.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/docx/-/docx-9.1.1.tgz", | ||||
|       "integrity": "sha512-jz941pdz4+gMljZ1pV+95FwuWEouKi4u1Elhv3ptqeytGOSyX+u131hRYg4wgqLU+x2CbGsz9eTYgo2uMMz65Q==", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "@types/node": "^22.7.5", | ||||
|         "hash.js": "^1.1.7", | ||||
|         "jszip": "^3.10.1", | ||||
|         "nanoid": "^5.0.4", | ||||
|         "xml": "^1.0.1", | ||||
|         "xml-js": "^1.6.8" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=10" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/docx/node_modules/@types/node": { | ||||
|       "version": "22.13.1", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", | ||||
|       "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "undici-types": "~6.20.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/docx/node_modules/undici-types": { | ||||
|       "version": "6.20.0", | ||||
|       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", | ||||
|       "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/dotenv": { | ||||
|       "version": "16.4.7", | ||||
|       "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", | ||||
|  | @ -162,6 +201,16 @@ | |||
|         "node": ">= 12.20" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/hash.js": { | ||||
|       "version": "1.1.7", | ||||
|       "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", | ||||
|       "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "inherits": "^2.0.3", | ||||
|         "minimalistic-assert": "^1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/humanize-ms": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", | ||||
|  | @ -171,6 +220,45 @@ | |||
|         "ms": "^2.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/immediate": { | ||||
|       "version": "3.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", | ||||
|       "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/inherits": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", | ||||
|       "license": "ISC" | ||||
|     }, | ||||
|     "node_modules/isarray": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", | ||||
|       "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/jszip": { | ||||
|       "version": "3.10.1", | ||||
|       "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", | ||||
|       "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", | ||||
|       "license": "(MIT OR GPL-3.0-or-later)", | ||||
|       "dependencies": { | ||||
|         "lie": "~3.3.0", | ||||
|         "pako": "~1.0.2", | ||||
|         "readable-stream": "~2.3.6", | ||||
|         "setimmediate": "^1.0.5" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lie": { | ||||
|       "version": "3.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", | ||||
|       "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "immediate": "~3.0.5" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mime-db": { | ||||
|       "version": "1.52.0", | ||||
|       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", | ||||
|  | @ -192,12 +280,36 @@ | |||
|         "node": ">= 0.6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/minimalistic-assert": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", | ||||
|       "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", | ||||
|       "license": "ISC" | ||||
|     }, | ||||
|     "node_modules/ms": { | ||||
|       "version": "2.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", | ||||
|       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/nanoid": { | ||||
|       "version": "5.0.9", | ||||
|       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", | ||||
|       "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", | ||||
|       "funding": [ | ||||
|         { | ||||
|           "type": "github", | ||||
|           "url": "https://github.com/sponsors/ai" | ||||
|         } | ||||
|       ], | ||||
|       "license": "MIT", | ||||
|       "bin": { | ||||
|         "nanoid": "bin/nanoid.js" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": "^18 || >=20" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/node-domexception": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", | ||||
|  | @ -243,6 +355,12 @@ | |||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/pako": { | ||||
|       "version": "1.0.11", | ||||
|       "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", | ||||
|       "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", | ||||
|       "license": "(MIT AND Zlib)" | ||||
|     }, | ||||
|     "node_modules/pdf-parse": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz", | ||||
|  | @ -256,6 +374,54 @@ | |||
|         "node": ">=6.8.1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/process-nextick-args": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | ||||
|       "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/readable-stream": { | ||||
|       "version": "2.3.8", | ||||
|       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", | ||||
|       "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "core-util-is": "~1.0.0", | ||||
|         "inherits": "~2.0.3", | ||||
|         "isarray": "~1.0.0", | ||||
|         "process-nextick-args": "~2.0.0", | ||||
|         "safe-buffer": "~5.1.1", | ||||
|         "string_decoder": "~1.1.1", | ||||
|         "util-deprecate": "~1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/safe-buffer": { | ||||
|       "version": "5.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||||
|       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/sax": { | ||||
|       "version": "1.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", | ||||
|       "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", | ||||
|       "license": "ISC" | ||||
|     }, | ||||
|     "node_modules/setimmediate": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", | ||||
|       "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/string_decoder": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | ||||
|       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "safe-buffer": "~5.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/tr46": { | ||||
|       "version": "0.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", | ||||
|  | @ -268,6 +434,12 @@ | |||
|       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/util-deprecate": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | ||||
|       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/web-streams-polyfill": { | ||||
|       "version": "4.0.0-beta.3", | ||||
|       "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", | ||||
|  | @ -292,6 +464,24 @@ | |||
|         "tr46": "~0.0.3", | ||||
|         "webidl-conversions": "^3.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/xml": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", | ||||
|       "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", | ||||
|       "license": "MIT" | ||||
|     }, | ||||
|     "node_modules/xml-js": { | ||||
|       "version": "1.6.11", | ||||
|       "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", | ||||
|       "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "sax": "^1.2.4" | ||||
|       }, | ||||
|       "bin": { | ||||
|         "xml-js": "bin/cli.js" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| { | ||||
|   "dependencies": { | ||||
|     "@anthropic-ai/sdk": "^0.36.3", | ||||
|     "docx": "^9.1.1", | ||||
|     "dotenv": "^16.4.7", | ||||
|     "pdf-parse": "^1.1.1" | ||||
|   }, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue