mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 00:26:26 +00:00
fix(apply): name CVs main_<company>_<role> to avoid overwrites (#171)
CVs from /apply were named cv/main_<company>.tex, so a second role at the same company overwrote the first (cover letters already carried the role). Aligns CV naming to main_<company>_<role>.tex across apply, add-template, the CV template guide, CLAUDE.md, and SETUP.md; /outcome and /interview fallbacks glob main_<company>*.tex to match both legacy and new names. framework_version bumped on both touched framework files.
This commit is contained in:
@@ -156,7 +156,7 @@ Insert (or replace, if one exists) this block immediately after the file's H1 ti
|
|||||||
> - **Compile with:** `<engine>` (not the engine named in the stock guidance below)
|
> - **Compile with:** `<engine>` (not the engine named in the stock guidance below)
|
||||||
> - **Fonts:** <font summary, including any Path note for bundled fonts>
|
> - **Fonts:** <font summary, including any Path note for bundled fonts>
|
||||||
> - **Page limit:** exactly <N> page(s)
|
> - **Page limit:** exactly <N> page(s)
|
||||||
> - **Output file:** unchanged (`cv/main_<company>.tex` / `cover_letters/cover_<company>_<role>.tex`); copy any class/font files the template needs into the output directory, or reference them by relative path
|
> - **Output file:** unchanged (`cv/main_<company>_<role>.tex` / `cover_letters/cover_<company>_<role>.tex`); copy any class/font files the template needs into the output directory, or reference them by relative path
|
||||||
<!-- END ACTIVE-TEMPLATE -->
|
<!-- END ACTIVE-TEMPLATE -->
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ Also read the most recent existing CV and cover letter files for concrete struct
|
|||||||
- Read any existing `cv/main_*.tex` file as a LaTeX template reference
|
- Read any existing `cv/main_*.tex` file as a LaTeX template reference
|
||||||
- Read any existing `cover_letters/cover_*.tex` or `cover_letters/Cover_*.tex` file as a template reference
|
- Read any existing `cover_letters/cover_*.tex` or `cover_letters/Cover_*.tex` file as a template reference
|
||||||
|
|
||||||
### CV (`cv/main_<company>.tex`)
|
### CV (`cv/main_<company>_<role>.tex`)
|
||||||
- Always in **English**
|
- Always in **English**
|
||||||
- Follow the moderncv/banking format from `05-cv-templates.md`
|
- Follow the moderncv/banking format from `05-cv-templates.md`
|
||||||
- Tailor the profile statement and experience bullets to the specific role
|
- Tailor the profile statement and experience bullets to the specific role
|
||||||
@@ -113,7 +113,7 @@ Do NOT read `05-cv-templates.md` or `06-cover-letter-templates.md` — those gov
|
|||||||
### 3. Drafts to Review
|
### 3. Drafts to Review
|
||||||
Both drafts are provided inline below. Do NOT use the Read tool on the draft files — use these exact texts.
|
Both drafts are provided inline below. Do NOT use the Read tool on the draft files — use these exact texts.
|
||||||
|
|
||||||
<CV_DRAFT file="cv/main_<COMPANY>.tex">
|
<CV_DRAFT file="cv/main_<COMPANY>_<ROLE>.tex">
|
||||||
<INSERT_CV_DRAFT_HERE>
|
<INSERT_CV_DRAFT_HERE>
|
||||||
</CV_DRAFT>
|
</CV_DRAFT>
|
||||||
|
|
||||||
@@ -134,7 +134,7 @@ Return your feedback in **two parts**:
|
|||||||
A JSON array of concrete edits the drafter can apply directly without re-reading the files. Each edit is an object:
|
A JSON array of concrete edits the drafter can apply directly without re-reading the files. Each edit is an object:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"file": "cv/main_<COMPANY>.tex" | "cover_letters/cover_<COMPANY>_<ROLE>.tex",
|
"file": "cv/main_<COMPANY>_<ROLE>.tex" | "cover_letters/cover_<COMPANY>_<ROLE>.tex",
|
||||||
"old_string": "<exact text currently in the draft>",
|
"old_string": "<exact text currently in the draft>",
|
||||||
"new_string": "<replacement text>",
|
"new_string": "<replacement text>",
|
||||||
"reason": "<one-line rationale: keyword match / company angle / reframing / style>"
|
"reason": "<one-line rationale: keyword match / company angle / reframing / style>"
|
||||||
@@ -182,7 +182,7 @@ After all edits are applied, the two files on disk are the final drafts.
|
|||||||
### 5a. Compile
|
### 5a. Compile
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd cv && lualatex -interaction=nonstopmode main_<company>.tex
|
cd cv && lualatex -interaction=nonstopmode main_<company>_<role>.tex
|
||||||
cd ../cover_letters && xelatex -interaction=nonstopmode cover_<company>_<role>.tex
|
cd ../cover_letters && xelatex -interaction=nonstopmode cover_<company>_<role>.tex
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@ If either compile fails, fix the error and re-compile until clean.
|
|||||||
|
|
||||||
Read both PDFs via the Read tool and verify:
|
Read both PDFs via the Read tool and verify:
|
||||||
|
|
||||||
**CV (`cv/main_<company>.pdf`):**
|
**CV (`cv/main_<company>_<role>.pdf`):**
|
||||||
- [ ] Exactly 2 pages (not 1, not 3)
|
- [ ] Exactly 2 pages (not 1, not 3)
|
||||||
- [ ] No orphaned `\cventry` titles — a job/education title line must never sit alone at the bottom of page 1 with its bullets on page 2. This is the most common failure.
|
- [ ] No orphaned `\cventry` titles — a job/education title line must never sit alone at the bottom of page 1 with its bullets on page 2. This is the most common failure.
|
||||||
- [ ] Section headings are not isolated at the top of page 2 with only 1-2 lines below
|
- [ ] Section headings are not isolated at the top of page 2 with only 1-2 lines below
|
||||||
@@ -227,7 +227,7 @@ An ATS parser reads the PDF's embedded **text layer**, not the rendered page —
|
|||||||
**1. Extract the text layer:**
|
**1. Extract the text layer:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd cv && pdftotext -layout main_<company>.pdf main_<company>.txt
|
cd cv && pdftotext -layout main_<company>_<role>.pdf main_<company>_<role>.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
Read the `.txt` file.
|
Read the `.txt` file.
|
||||||
@@ -276,7 +276,7 @@ Summarize 3-5 key decisions made to tailor the application:
|
|||||||
|
|
||||||
### Files Created
|
### Files Created
|
||||||
List the files written:
|
List the files written:
|
||||||
- `cv/main_<company>.tex`
|
- `cv/main_<company>_<role>.tex`
|
||||||
- `cover_letters/cover_<company>_<role>.tex`
|
- `cover_letters/cover_<company>_<role>.tex`
|
||||||
|
|
||||||
Tell the user: "Both files are ready for your review. Open them to check the final output before compiling."
|
Tell the user: "Both files are ready for your review. Open them to check the final output before compiling."
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ v1 preps for a **specific application**. Generic no-target practice is out of sc
|
|||||||
- `job_posting.md` - the exact posting the user applied to
|
- `job_posting.md` - the exact posting the user applied to
|
||||||
- `cv_draft.tex` and `cover_letter.tex` - what was actually submitted. **These are what the interviewer read**; every talking point must be consistent with their claims.
|
- `cv_draft.tex` and `cover_letter.tex` - what was actually submitted. **These are what the interviewer read**; every talking point must be consistent with their claims.
|
||||||
- `outcome.md` - the stage reached so far and any recorded feedback from earlier stages. Feedback from stage N is the highest-value input for stage N+1 prep.
|
- `outcome.md` - the stage reached so far and any recorded feedback from earlier stages. Feedback from stage N is the highest-value input for stage N+1 prep.
|
||||||
2. **Fallbacks** (the application may predate `/outcome`): posting via WebFetch on the tracker row's `source` URL, or ask the user to paste it; CV via `cv/main_<company>.tex` and cover letter via `cover_letters/cover_<company>_*.tex`. State plainly which context is missing rather than guessing - and suggest `/outcome <company>` to build the archive for next time.
|
2. **Fallbacks** (the application may predate `/outcome`): posting via WebFetch on the tracker row's `source` URL, or ask the user to paste it; CV via `cv/main_<company>*.tex` and cover letter via `cover_letters/cover_<company>_*.tex`. State plainly which context is missing rather than guessing - and suggest `/outcome <company>` to build the archive for next time.
|
||||||
3. **Ask the user what this interview is** (skip anything `outcome.md` already records): stage (phone screen / technical / case / final round), date, format (phone, video, onsite), and who is interviewing (names and titles, if known).
|
3. **Ask the user what this interview is** (skip anything `outcome.md` already records): stage (phone screen / technical / case / final round), date, format (phone, video, onsite), and who is interviewing (names and titles, if known).
|
||||||
4. **Read the frameworks once** - do not re-read them in later steps:
|
4. **Read the frameworks once** - do not re-read them in later steps:
|
||||||
- `.claude/skills/job-application-assistant/07-interview-prep.md`
|
- `.claude/skills/job-application-assistant/07-interview-prep.md`
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Also collect, without interrogating - one or two open questions are enough:
|
|||||||
|
|
||||||
Create or update `documents/applications/<company>_<role>/`. All content here is personal data - the folder is already gitignored (`documents/applications/**`), so nothing needs redacting.
|
Create or update `documents/applications/<company>_<role>/`. All content here is personal data - the folder is already gitignored (`documents/applications/**`), so nothing needs redacting.
|
||||||
|
|
||||||
1. **`cv_draft.tex` and `cover_letter.tex`** - copy (never move) the submitted files. Locate them via the tracker row's `cv_file`/`cover_letter_file` columns; if those are empty, look for `cv/main_<company>.tex` and `cover_letters/cover_<company>_*.tex`. If a file already exists in the archive, leave it - the archived version is what was actually submitted. If no draft files exist (application made outside `/apply`), skip with a note.
|
1. **`cv_draft.tex` and `cover_letter.tex`** - copy (never move) the submitted files. Locate them via the tracker row's `cv_file`/`cover_letter_file` columns; if those are empty, look for `cv/main_<company>*.tex` and `cover_letters/cover_<company>_*.tex`. If a file already exists in the archive, leave it - the archived version is what was actually submitted. If no draft files exist (application made outside `/apply`), skip with a note.
|
||||||
2. **`job_posting.md`** - if it already exists, leave it. Otherwise try WebFetch on the tracker row's `source` URL and save the posting text. If the URL is dead (postings expire fast - this is exactly why the archive matters), ask the user to paste the posting, or write a stub noting the posting is unavailable. **Never reconstruct a posting from memory.**
|
2. **`job_posting.md`** - if it already exists, leave it. Otherwise try WebFetch on the tracker row's `source` URL and save the posting text. If the URL is dead (postings expire fast - this is exactly why the archive matters), ask the user to paste the posting, or write a stub noting the posting is unavailable. **Never reconstruct a posting from memory.**
|
||||||
3. **`outcome.md`** - write or update it in exactly the format documented in `documents/README.md`, so `/setup` Path A parses it without special cases:
|
3. **`outcome.md`** - write or update it in exactly the format documented in `documents/README.md`, so `/setup` Path A parses it without special cases:
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
framework_version: 1.0.0
|
framework_version: 1.0.1
|
||||||
---
|
---
|
||||||
|
|
||||||
# CV Templates and Tailoring Guide
|
# CV Templates and Tailoring Guide
|
||||||
@@ -10,17 +10,17 @@ framework_version: 1.0.0
|
|||||||
|
|
||||||
All CVs use the moderncv LaTeX package with the "banking" style and "blue" color scheme.
|
All CVs use the moderncv LaTeX package with the "banking" style and "blue" color scheme.
|
||||||
|
|
||||||
**Output file:** `cv/main_<company>.tex`
|
**Output file:** `cv/main_<company>_<role>.tex`
|
||||||
**Compile with:** **lualatex** on MiKTeX/TeX Live. pdflatex often fails on modern MiKTeX installs with `fontawesome5` font-expansion errors; lualatex handles the same sources cleanly.
|
**Compile with:** **lualatex** on MiKTeX/TeX Live. pdflatex often fails on modern MiKTeX installs with `fontawesome5` font-expansion errors; lualatex handles the same sources cleanly.
|
||||||
**Master reference:** `cv/main_example.tex` (comprehensive CV with all competencies, experience, and achievements - use as source when building targeted CVs)
|
**Master reference:** `cv/main_example.tex` (comprehensive CV with all competencies, experience, and achievements - use as source when building targeted CVs)
|
||||||
|
|
||||||
### Compile command
|
### Compile command
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd cv && lualatex -interaction=nonstopmode main_<company>.tex
|
cd cv && lualatex -interaction=nonstopmode main_<company>_<role>.tex
|
||||||
```
|
```
|
||||||
|
|
||||||
Expected output: `Output written on main_<company>.pdf (2 pages, ...)`. Any page count other than 2 is a failure that must be fixed before presenting to the user.
|
Expected output: `Output written on main_<company>_<role>.pdf (2 pages, ...)`. Any page count other than 2 is a failure that must be fixed before presenting to the user.
|
||||||
|
|
||||||
## Document Structure
|
## Document Structure
|
||||||
|
|
||||||
@@ -154,7 +154,7 @@ If there is a gap in your employment history:
|
|||||||
|
|
||||||
After writing the CV and before presenting to the user, always compile and visually inspect the PDF. Iterate until the layout is clean. Workflow:
|
After writing the CV and before presenting to the user, always compile and visually inspect the PDF. Iterate until the layout is clean. Workflow:
|
||||||
|
|
||||||
1. Run `lualatex -interaction=nonstopmode main_<company>.tex`
|
1. Run `lualatex -interaction=nonstopmode main_<company>_<role>.tex`
|
||||||
2. Check the output page count: must be exactly 2
|
2. Check the output page count: must be exactly 2
|
||||||
3. Read the PDF via the Read tool and visually inspect both pages
|
3. Read the PDF via the Read tool and visually inspect both pages
|
||||||
4. Check for **orphaned entries**: a `\cventry` title line must never sit alone at the bottom of page 1 with its bullets on page 2
|
4. Check for **orphaned entries**: a `\cventry` title line must never sit alone at the bottom of page 1 with its bullets on page 2
|
||||||
@@ -183,7 +183,7 @@ Restore the highest-relevance item that was previously cut — a CV that ends mi
|
|||||||
Most employers run CVs through an ATS before a human sees them, and the ATS reads the PDF's embedded **text layer**, not the rendered page. A CV can pass visual inspection and still extract as garbage. After the layout passes the compile-and-inspect loop, verify the text layer:
|
Most employers run CVs through an ATS before a human sees them, and the ATS reads the PDF's embedded **text layer**, not the rendered page. A CV can pass visual inspection and still extract as garbage. After the layout passes the compile-and-inspect loop, verify the text layer:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd cv && pdftotext -layout main_<company>.pdf main_<company>.txt
|
cd cv && pdftotext -layout main_<company>_<role>.pdf main_<company>_<role>.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
`pdftotext` comes from [poppler](https://poppler.freedesktop.org/), not the TeX distribution - it is an **optional** dependency. If it is not installed, skip the mechanical check with a warning and rely on the visual PDF read for keyword coverage.
|
`pdftotext` comes from [poppler](https://poppler.freedesktop.org/), not the TeX distribution - it is an **optional** dependency. If it is not installed, skip the mechanical check with a warning and rely on the visual PDF read for keyword coverage.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ description: >
|
|||||||
and preparing for interviews. Triggers on keywords like: job posting, job application, CV,
|
and preparing for interviews. Triggers on keywords like: job posting, job application, CV,
|
||||||
cover letter, resume, interview prep, job fit, career, application, apply, ansøgning, stilling
|
cover letter, resume, interview prep, job fit, career, application, apply, ansøgning, stilling
|
||||||
allowed-tools: Read, Glob, Grep, WebFetch, WebSearch, Edit, Write, AskUserQuestion
|
allowed-tools: Read, Glob, Grep, WebFetch, WebSearch, Edit, Write, AskUserQuestion
|
||||||
framework_version: 1.0.0
|
framework_version: 1.0.1
|
||||||
---
|
---
|
||||||
|
|
||||||
# Job Application Assistant
|
# Job Application Assistant
|
||||||
@@ -28,7 +28,7 @@ When the user provides a job posting (URL or text), follow this workflow:
|
|||||||
### Step 2: Tailor CV
|
### Step 2: Tailor CV
|
||||||
- Read the most relevant existing CV variant from `cv/` as a starting point
|
- Read the most relevant existing CV variant from `cv/` as a starting point
|
||||||
- Follow the guidelines in `05-cv-templates.md`
|
- Follow the guidelines in `05-cv-templates.md`
|
||||||
- Create `cv/main_<company>.tex` with tailored content
|
- Create `cv/main_<company>_<role>.tex` with tailored content
|
||||||
- Adjust: profile statement, skills section, experience bullet emphasis, section order
|
- Adjust: profile statement, skills section, experience bullet emphasis, section order
|
||||||
|
|
||||||
### Step 3: Write Cover Letter
|
### Step 3: Write Cover Letter
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ This repo is a job application workspace. Claude acts as a career advisor and ap
|
|||||||
## Workflow for New Job Applications
|
## Workflow for New Job Applications
|
||||||
1. User provides a job posting (URL or text)
|
1. User provides a job posting (URL or text)
|
||||||
2. **Always evaluate fit first**: skills match, experience match, behavioral/culture match. Present this assessment to the user before proceeding.
|
2. **Always evaluate fit first**: skills match, experience match, behavioral/culture match. Present this assessment to the user before proceeding.
|
||||||
3. If good fit: create targeted CV (`cv/main_<company>.tex`) and cover letter (`cover_letters/cover_<company>_<role>.tex`)
|
3. If good fit: create targeted CV (`cv/main_<company>_<role>.tex`) and cover letter (`cover_letters/cover_<company>_<role>.tex`)
|
||||||
4. **Verify both documents** (see Verification Checklist below)
|
4. **Verify both documents** (see Verification Checklist below)
|
||||||
5. Prepare interview talking points based on the role requirements and your strengths
|
5. Prepare interview talking points based on the role requirements and your strengths
|
||||||
|
|
||||||
|
|||||||
@@ -228,13 +228,13 @@ After `/apply` creates the LaTeX files:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Bash / zsh / Git Bash
|
# Bash / zsh / Git Bash
|
||||||
cd cv && lualatex main_<company>.tex && cd ..
|
cd cv && lualatex main_<company>_<role>.tex && cd ..
|
||||||
cd cover_letters && xelatex cover_<company>_<role>.tex && cd ..
|
cd cover_letters && xelatex cover_<company>_<role>.tex && cd ..
|
||||||
```
|
```
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# PowerShell
|
# PowerShell
|
||||||
Set-Location cv; lualatex main_<company>.tex; Set-Location ..
|
Set-Location cv; lualatex main_<company>_<role>.tex; Set-Location ..
|
||||||
Set-Location cover_letters; xelatex cover_<company>_<role>.tex; Set-Location ..
|
Set-Location cover_letters; xelatex cover_<company>_<role>.tex; Set-Location ..
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user