Completes the loop behind #177: /apply drift could be archived by /outcome, then laundered into 05-cv-templates.md as a reusable template by /setup Path A - promoting a one-off drifted claim into source material for every future application. Path A now verifies extracted statements' factual claims against 01-candidate-profile.md (keeping framing only), and 05-cv-templates.md marks [Used for:] statements as phrasing references, never fact sources. framework_version 1.1.0. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
21 KiB
/setup - Profile Onboarding
You are running the onboarding setup for the AI Job Search framework. Your goal is to collect the user's professional information and populate all profile files so the /apply workflow works out of the box.
There are three paths into setup. Step 0 picks the right one; all three converge on Step 3 (file generation) and Step 4 (confirmation).
Step 0: Welcome & Choose Path
If $ARGUMENTS contains --section <name>, skip directly to that section in Path C for an update-only flow. Do not run the path-selection prompt below.
Otherwise, before greeting the user, scan the documents/ folder. Use Glob with documents/**/* and count files per subfolder (cv/, linkedin/, diplomas/, references/, applications/).
Then welcome the user with a single message that lists three paths. The wording changes based on what was found.
If documents/ has files in one or more subfolders, lead with Path A:
Welcome to the AI Job Search setup!
I'll help you build your professional profile so Claude can evaluate job postings, tailor CVs, write cover letters, and prepare you for interviews.
I see files in your
documents/folder: [list per subfolder, e.g. "2 in cv/, 1 in linkedin/, 3 in references/"]. Three ways to start:Path A: Read my documents folder (recommended for what you have) - I'll read everything in
documents/, cross-reference for consistency, and build your profile from real source materials. Idempotent and safe to re-run as you add more documents.Path B: Single CV import - Paste or @-mention a single CV/resume here. I'll extract it and ask follow-up questions for what's missing.
Path C: Interview mode - I'll walk you through structured questions section by section.
Which would you like?
If documents/ is empty or missing, surface Path A as a "do this if you have materials" option:
Welcome to the AI Job Search setup!
I'll help you build your professional profile so Claude can evaluate job postings, tailor CVs, write cover letters, and prepare you for interviews.
Three ways to start:
Path A: Documents folder (best signal if you have several materials) - Drop your CV / LinkedIn export / diplomas / reference letters in the
documents/folder, then say "go". I'll read everything and build your profile from it. Seedocuments/README.mdfor the folder layout.Path B: Single CV import - Paste or @-mention a single CV/resume here. I'll extract it and ask follow-up questions for what's missing.
Path C: Interview mode - I'll walk you through structured questions section by section. Good if you're starting from scratch.
Which would you like?
Wait for the user's choice. If they pick A but the folder is still empty, tell them what to add (point at documents/README.md) and stop.
Path A: Documents Folder
Reads structured documents in documents/, cross-references them for consistency, and merges extracted data into the seven profile skill files. Read-before-write and idempotent: changes already present will not be proposed again.
Follow these steps exactly in order.
Step A1: Inventory
Use Glob with documents/**/* to scan the full tree. Print:
## Documents Found
**cv/**: [list files, or "(empty)"]
**linkedin/**: [list files, or "(empty)"]
**diplomas/**: [list files, or "(empty)"]
**references/**: [list files, or "(empty)"]
**applications/**: [list subfolders with their files, or "(empty)"]
I will read these and cross-reference before proposing any changes.
If every subfolder is empty, stop and tell the user to populate the folder. Point at documents/README.md for the layout.
Step A2: Read Existing Skill Files
Read these in parallel before extracting anything. You must know what is already there to make the merge intelligent.
.claude/skills/job-application-assistant/01-candidate-profile.md.claude/skills/job-application-assistant/02-behavioral-profile.md.claude/skills/job-application-assistant/03-writing-style.md.claude/skills/job-application-assistant/04-job-evaluation.md.claude/skills/job-application-assistant/05-cv-templates.md.claude/skills/job-application-assistant/06-cover-letter-templates.md.claude/skills/job-application-assistant/07-interview-prep.md
Hold this content in context throughout Path A. Do not re-read.
Step A3: Parse Documents
Read each document found in Step A1. Process subfolders in this order: cv/, linkedin/, diplomas/, references/, applications/.
cv/ documents: name, contact (email, phone, LinkedIn, GitHub), education (degree, institution, dates, thesis), work experience (title, company, dates, location, bullets), skills, publications, awards, profile/summary.
linkedin/ documents: About/summary section (full text, used for behavioral inference), work experience, education, skills and endorsements, certifications, volunteer work, publications, recommendations received (full text). If multiple LinkedIn exports are present, use the most recently modified file.
diplomas/ documents: official degree title and level, institution name (official spelling), graduation date, grade or distinction or GPA if visible.
references/ documents: referee name, title, organization; full text of the letter (extract specific quotes); competency language used.
applications/<company>_<role>/ subfolders:
job_posting.md: role title, company, required skills, experience level, sector, role typecover_letter.tex: opening structure, body structure, bullet style, closing, recurring phrasescv_draft.tex: profile statement, section ordering, framing for this role typeoutcome.md: status (in_progress/hired/offer_declined/rejected/no_response/interview_only), interview stages, notes. Skipin_progressapplications for calibration — they have no final signal yet.
After reading, proceed to Step A4 without intermediate output. The user sees a complete picture in Step A6.
Step A4: Cross-Reference Check
Before mapping anything to skill files, check for inconsistencies:
- Date mismatches between CV / LinkedIn / diploma
- Title mismatches across documents for the same role
- Education mismatches (degree name, graduation date)
- Employer name variations
If inconsistencies are found, present them as a numbered list and wait for the user to resolve each one before continuing:
## Cross-Reference Issues Found
These need to be resolved before I continue. For each one, tell me which version is correct.
1. **Role title mismatch - [COMPANY]:**
CV says: "[TITLE_A]"
LinkedIn says: "[TITLE_B]"
Which is correct?
2. ...
If no inconsistencies, state "No cross-reference issues found." and continue.
Step A5: Build Change Sets
For each skill file, compare extracted document content against the current file content from Step A2. Build two buckets.
Additive changes: entirely new content not in the skill file in any form. Examples: a certification not in 01-candidate-profile.md, a new endorsement skill, a referee not yet listed, a new behavioral quote from a reference letter, a new award.
Conflicting changes: content that touches something already in a skill file but disagrees. Examples: a different date range for an existing job, a different job title for the same role, a different graduation date than what is recorded.
Inference rules (apply when populating from inferred sources):
02-behavioral-profile.md: Source is LinkedIn About + recommendation letters. Extract recurring themes, adjectives, phrases about how the candidate works. Add only to "Strongest Behavioral Traits", "How [Candidate] Works Best", or "Management Style Preferences" sections. Do not overwrite existing scored assessments. Always label inferred additions: [Inferred from LinkedIn About / Reference letter - review before relying on this]03-writing-style.md: Source iscover_letter.texfiles. Extract recurring patterns. Add as observations under "## Patterns Observed in Past Applications". Do not modify existing rules. Only add if 2+ cover letters show a genuine pattern.04-job-evaluation.md: Source isjob_posting.md+outcome.mdpairs. If an application reached interview or offer: note role type and sector as a confirmed strong-fit signal. If 2+ applications repeat a no-response or rejection pattern: note it. Add findings under "## Calibration from Past Applications". Do not modify the existing scoring framework.05-cv-templates.md: Source iscv_draft.texfiles. Extract any profile statement that does not already appear in templates. Label with: [Used for: _]. Ground before extracting: archived drafts are tailored outputs, not source documents - verify every factual claim in an extracted statement (titles, employers, metrics, technologies) against01-candidate-profile.mdand drop or correct any claim the profile does not support, keeping only the framing. A tailored draft that drifted must never become a template future applications start from.06-cover-letter-templates.md: Source iscover_letter.texfiles. Extract opening patterns, bullet structures, closing formulations. Add only what is structurally distinct from existing templates.07-interview-prep.md: Source is CV bullets, LinkedIn descriptions, reference letter quotes. Identify achievements not yet covered by an existing STAR example. Do NOT draft full STAR examples. Add stubs under "## STAR Candidates (Complete Manually)":
### [Achievement title]
**Source:** [CV / LinkedIn / Reference letter - role/company]
**What happened:** [one sentence]
**Why it matters:** [interview question types this could answer]
**S/T/A/R stub:**
- Situation:
- Task:
- Action:
- Result:
Step A6: Present and Confirm Changes
Present the full change set before writing anything.
Additive changes (single grouped list, organized by target file):
## Proposed Additive Changes
### 01-candidate-profile.md
- [ ] New certification: [title], [issuer], [date] - extracted from LinkedIn
- [ ] New reference: [name, title, company]
Quote: "[relevant quote]"
### 02-behavioral-profile.md
- [ ] New behavioral observation [labeled as inference]: "[phrase]"
[and so on per file]
Then ask:
Apply all additive changes? These add new content without touching anything already in the files. Reply yes to apply all, or list the numbers you want to skip.
Wait for the response. Apply only the confirmed items.
Conflicting changes (one at a time):
## Conflict 1 of [N]: Job title - [COMPANY]
**Current in 01-candidate-profile.md:**
[TITLE_A] - [COMPANY] ([START]-[END])
**Proposed (from LinkedIn export):**
[TITLE_B] - [COMPANY] ([START]-[END])
Options:
[keep] Keep the existing text
[replace] Replace with the version from the document
[manual] I'll edit this myself - skip for now
Wait for the user's choice on each conflict. If no conflicts, state "No conflicting changes found." and skip this section.
Step A7: Write Confirmed Changes and Fill Gaps
Apply the confirmed changes with the Edit tool. Make targeted edits only. Do not rewrite entire files. State which changes were applied per file. If a file has no confirmed changes, state "No changes made to [filename]."
Documents cover skills, experience, education, references, and behavioral signal. They do not cover everything /apply and /scrape need. After the writes, ask follow-up questions for gaps:
- Career goals and target role types
- What excites the user in their next role
- Deal-breakers and must-haves
- Salary expectations / baseline (optional)
- Commute or location constraints (if not visible from CV)
- Job search configuration (use the questions from Path C Section 9 below)
Then proceed to Step 3 to populate the non-skill files (CLAUDE.md, cv/main_example.tex, .claude/skills/job-scraper/search-queries.md). Step 3 will detect that the seven skill files are already populated and skip those substeps.
Path B: Single CV Import
If the user provides a single CV/resume:
- Read the document thoroughly.
- Extract all structured information: name, contact, education, experience, skills, publications, awards.
- Present a summary of what was extracted.
- Ask follow-up questions for gaps (behavioral profile, career goals, deal-breakers, salary expectations, references).
- Proceed to Step 3 (file generation).
Path C: Interview Mode
Walk through each section conversationally. Ask questions naturally, not as a form. Let the user answer in their own words and you'll structure the data.
Section 1: Identity & Contact
Ask about:
- Full name
- Location (city, country)
- Phone, email, LinkedIn, GitHub
- Languages spoken (with proficiency levels)
- Current employment status
- Family/commute constraints (if any)
Section 2: Education
For each degree:
- Level (PhD, MSc, BSc, etc.), field, institution, years
- Thesis topic (if applicable)
- Key coursework or topics
Also ask about certifications (online courses, professional certs).
Section 3: Professional Experience
For each role (most recent first):
- Job title, company, dates, location
- Key responsibilities (3-5 bullets)
- Key achievements or projects
- Technologies/tools used
Also ask about independent projects, freelance work, or side projects.
Section 4: Technical Skills
- Programming languages + proficiency level
- ML/AI frameworks and tools
- Domain expertise
- Software tools and platforms
- Any other technical skills
Section 5: Publications & Awards (optional)
- Peer-reviewed papers, conference presentations
- Hackathons, competitions, awards
- Skip if not applicable
Section 6: Behavioral Profile (optional)
If they have a formal assessment (PI, DISC, Myers-Briggs, StrengthsFinder):
- Ask them to describe or share the results
If not, ask behavioral questions:
- "What work environments do you thrive in?"
- "What drains your energy at work?"
- "How do you prefer to work in teams?"
- "How do you make decisions, quickly or deliberately?"
- "What's your communication style?"
- Synthesize answers into a behavioral profile
Section 7: Career Goals & Preferences
- Target roles and industries
- What excites you in work
- Deal-breakers and must-haves
- Salary expectations/baseline (optional)
- What environments to avoid
- Commute/location constraints
Section 8: References (optional)
For each reference:
- Name, title, company, email, phone
- Relationship to the user
Section 9: Job Search Configuration
This section generates the search queries that power /scrape. Use the information from Sections 1, 4, and 7 to build targeted queries.
Ask about:
- Role titles to search for: "What job titles should I search for? For example: Data Scientist, ML Engineer, Geophysicist." Collect 3-8 specific titles.
- Key skills as search terms: "Which of your skills are most likely to appear in job postings?" Pick 3-5 that are distinctive and searchable.
- Target companies (optional): "Are there specific companies you'd like to monitor for openings?"
- Geographic scope: "Which cities or regions should I search in? How far are you willing to commute?" Use this to define the location filter tiers (ideal, acceptable, borderline, too far).
- Job portals: "The framework ships country-agnostic search CLIs (
linkedin-search,freehire-search) plus Danish portal demos (Jobindex, Jobbank, Jobdanmark, Jobnet)./scrapeauto-discovers whatever portal skills are installed under.agents/skills/. Which of these fit your market, and do you use other job boards?" If the user needs a local board that is not shipped, guide them to/add-portal(market-specific skills live in their fork). WebSearch/site:queries remain the fallback for portals without a CLI skill.
Important: Also suggest role types the user may not have considered, based on their skill profile. For example:
- If they have strong Python + domain expertise: "Have you considered roles like 'Technical Consultant' or 'Solutions Engineer' in your domain?"
- If they have ML + a specific industry: "Companies in adjacent industries also hire for these skills. Should I include searches for [adjacent sector]?"
- If they have project management experience alongside technical skills: "Would you also want to search for 'Technical Project Manager' or 'Team Lead' roles?"
This proactive suggestion step helps users discover career paths they might not have considered.
Step 3: Generate Profile Files
Once data collection is complete, generate or finish populating the following files. For Path A, the seven skill files are already populated by Step A7; check each before writing and skip if its content is no longer placeholder text.
1. Update CLAUDE.md
Replace all [PLACEHOLDER] tokens with the user's actual information. Keep the structure, workflow, and verification checklist intact.
2. Populate 01-candidate-profile.md (Path B and C; skip if Path A populated it)
Write the full candidate profile with structured sections: Identity, Education, Professional Experience, Independent Projects, Technical Skills, Publications, Awards, References.
3. Populate 02-behavioral-profile.md (Path B and C; skip if Path A populated it)
Write the behavioral profile based on assessment results or synthesized answers.
4. Update 04-job-evaluation.md (Path B and C; skip if Path A populated it)
Replace skill match areas with the user's actual skills:
- Strong match areas: [their primary skills]
- Moderate match areas: [their secondary skills]
- Weak match areas: [skills they lack]
Update career goals and motivation filters with their actual preferences.
5. Update 05-cv-templates.md (Path B and C; skip if Path A populated it)
Add role-specific profile statement templates based on their background.
6. Update 07-interview-prep.md (Path B and C; skip if Path A populated it)
Create STAR examples from their actual experience (at least 3-4 examples). Path A leaves STAR stubs under "## STAR Candidates (Complete Manually)" rather than full examples; if any stubs are present, mention them in Step 4 so the user knows to flesh them out.
7. Update cv/main_example.tex
Replace placeholder personal data with their actual name, contact info, and add their education and most recent experience entries.
8. Generate .claude/skills/job-scraper/search-queries.md
Replace all placeholder tokens in the search queries file with the user's actual information from Section 9 (or the equivalent follow-up questions in Path A's Step A7):
- Replace
[YOUR_PRIMARY_ROLE_TYPE],[YOUR_PRIMARY_JOB_TITLE], etc. with actual role titles - Replace
[YOUR_KEY_SKILL],[YOUR_DOMAIN_KEYWORD_1], etc. with actual skills and domain terms - Replace
[YOUR_CITY],[YOUR_COUNTRY],[YOUR_REGION]with actual location - Fill in the location filter tiers (ideal, acceptable, borderline, too far) based on commute constraints
- Organize queries into priority categories matching the user's career direction:
- Priority 1: Their strongest/most desired role direction
- Priority 2: Their domain expertise
- Priority 3: Adjacent roles they could pivot into
- Priority 4: Broader roles (wider net)
Step 4: Confirm & Next Steps
Present a summary:
Setup complete! Here's what was generated:
CLAUDE.md- Your full candidate profile.claude/skills/job-application-assistant/01-candidate-profile.md- Structured profile.claude/skills/job-application-assistant/02-behavioral-profile.md- Behavioral assessment.claude/skills/job-application-assistant/04-job-evaluation.md- Personalized evaluation framework.claude/skills/job-application-assistant/05-cv-templates.md- CV templates with your profile statements.claude/skills/job-application-assistant/07-interview-prep.md- STAR examples from your experiencecv/main_example.tex- Your LaTeX CV template.claude/skills/job-scraper/search-queries.md- Job search queries for/scrapeTry it out:
- Run
/scrapeto search for matching jobs right now- Run
/applywith a job posting URL to see the full application workflow- Run
/setup --section searchlater to update your search queries as your priorities evolve
If Path A left any STAR stubs in 07-interview-prep.md, also note:
Path A flagged [N] STAR candidate stubs in
07-interview-prep.mdthat need your situation/task/action/result details before you use them in interviews.
Design Principles
- Three onboarding paths converge on the same skill files. Step 0 picks the right path based on what's in
documents/. Steps 3 and 4 are shared. - Path A is read-before-write and idempotent. Re-running it as documents are added does not duplicate or overwrite existing content; conflicts are surfaced for explicit resolution.
- Path A labels inferred behavioral or style additions so the user can review them critically before relying on them.
- Each section in Path C is a natural conversation, not a form. The user can skip optional sections.
- Synthesize answers into structured formats (the user does not need to know markdown or LaTeX).
- Can be re-run with
--section <name>to update specific sections (e.g.,/setup --section searchto reconfigure job search queries without re-doing the full profile). - Section 9 (search) in Path C, and the equivalent follow-up questions in Path A, proactively suggest role types the user may not have considered.
- At the end, suggest running
/scrapeand/applywith a test job posting.