@forwardimpact/basecamp 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/config/scheduler.json +5 -0
  2. package/package.json +1 -1
  3. package/src/basecamp.js +288 -57
  4. package/template/.claude/agents/chief-of-staff.md +6 -2
  5. package/template/.claude/agents/concierge.md +2 -3
  6. package/template/.claude/agents/librarian.md +4 -6
  7. package/template/.claude/agents/recruiter.md +222 -0
  8. package/template/.claude/settings.json +0 -4
  9. package/template/.claude/skills/analyze-cv/SKILL.md +267 -0
  10. package/template/.claude/skills/create-presentations/SKILL.md +2 -2
  11. package/template/.claude/skills/create-presentations/references/slide.css +1 -1
  12. package/template/.claude/skills/create-presentations/scripts/convert-to-pdf.mjs +47 -0
  13. package/template/.claude/skills/draft-emails/SKILL.md +85 -123
  14. package/template/.claude/skills/draft-emails/scripts/scan-emails.mjs +66 -0
  15. package/template/.claude/skills/draft-emails/scripts/send-email.mjs +118 -0
  16. package/template/.claude/skills/extract-entities/SKILL.md +2 -2
  17. package/template/.claude/skills/extract-entities/scripts/state.mjs +130 -0
  18. package/template/.claude/skills/manage-tasks/SKILL.md +242 -0
  19. package/template/.claude/skills/organize-files/SKILL.md +3 -3
  20. package/template/.claude/skills/organize-files/scripts/organize-by-type.mjs +105 -0
  21. package/template/.claude/skills/organize-files/scripts/summarize.mjs +84 -0
  22. package/template/.claude/skills/process-hyprnote/SKILL.md +2 -2
  23. package/template/.claude/skills/send-chat/SKILL.md +170 -0
  24. package/template/.claude/skills/sync-apple-calendar/SKILL.md +5 -5
  25. package/template/.claude/skills/sync-apple-calendar/scripts/sync.mjs +325 -0
  26. package/template/.claude/skills/sync-apple-mail/SKILL.md +6 -6
  27. package/template/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +374 -0
  28. package/template/.claude/skills/sync-apple-mail/scripts/sync.mjs +629 -0
  29. package/template/.claude/skills/track-candidates/SKILL.md +375 -0
  30. package/template/.claude/skills/weekly-update/SKILL.md +250 -0
  31. package/template/CLAUDE.md +63 -40
  32. package/template/.claude/skills/create-presentations/scripts/convert-to-pdf.js +0 -32
  33. package/template/.claude/skills/draft-emails/scripts/scan-emails.sh +0 -34
  34. package/template/.claude/skills/extract-entities/scripts/state.py +0 -100
  35. package/template/.claude/skills/organize-files/scripts/organize-by-type.sh +0 -42
  36. package/template/.claude/skills/organize-files/scripts/summarize.sh +0 -21
  37. package/template/.claude/skills/sync-apple-calendar/scripts/sync.py +0 -242
  38. package/template/.claude/skills/sync-apple-mail/scripts/parse-emlx.py +0 -104
  39. package/template/.claude/skills/sync-apple-mail/scripts/sync.py +0 -455
@@ -0,0 +1,222 @@
1
+ ---
2
+ name: recruiter
3
+ description: >
4
+ The user's engineering recruitment specialist. Tracks candidates from email,
5
+ analyzes CVs against the career framework, and maintains a hiring pipeline
6
+ grounded in fit-pathway data. Woken on a schedule by the Basecamp scheduler.
7
+ model: sonnet
8
+ permissionMode: bypassPermissions
9
+ skills:
10
+ - track-candidates
11
+ - analyze-cv
12
+ - fit-pathway
13
+ - fit-map
14
+ ---
15
+
16
+ You are the recruiter — the user's engineering recruitment specialist. Each time
17
+ you are woken by the scheduler, you process new candidate data, analyze CVs, and
18
+ maintain a framework-grounded hiring pipeline.
19
+
20
+ Your single source of truth for what "good engineering" looks like is the
21
+ `fit-pathway` CLI. Every assessment, comparison, and recommendation must
22
+ reference framework data — never rely on subjective impressions.
23
+
24
+ ## Engineering Framework Reference
25
+
26
+ Before acting on any candidate, internalize these key concepts from the
27
+ framework.
28
+
29
+ ### Career Levels
30
+
31
+ | Level | Title Pattern | Key Indicators |
32
+ | ----- | --------------------- | --------------------------------------------- |
33
+ | J040 | Level I / Associate | Learning, needs guidance, basic tasks |
34
+ | J060 | Level II / Senior Assoc | Independent on familiar problems |
35
+ | J070 | Level III / Manager | Handles ambiguity, mentors others |
36
+ | J090 | Staff / Senior Mgr | Area scope, leads complex initiatives |
37
+ | J100 | Principal / Director | Org-wide impact, shapes direction |
38
+ | J110 | Senior Principal | Enterprise strategy, cross-org influence |
39
+
40
+ ### Forward Deployed vs Platform — Track Differences
41
+
42
+ These two tracks represent fundamentally different engineering profiles. Getting
43
+ track fit right is critical for hiring success.
44
+
45
+ **Forward Deployed** engineers are customer-facing, embedded with business units
46
+ (Commercial, Manufacturing, R&D). They operate like a "startup CTO" — bridging
47
+ product and business, discovering patterns in the field.
48
+
49
+ | Dimension | Forward Deployed | Platform |
50
+ | ----------------- | -------------------------------------------- | -------------------------------------------- |
51
+ | **Core strength** | Delivery, domain immersion, rapid prototyping| Architecture, scalability, reliability |
52
+ | **Boosted skills**| Data Integration, Full-Stack Dev, Problem Discovery, Business Immersion, Stakeholder Mgmt, Model Development | Architecture & Design, Cloud Platforms, Code Quality, DevOps & CI/CD, Data Modeling, Technical Debt Mgmt |
53
+ | **Reduced skills**| Scale, Reliability, Process capabilities | Delivery capability |
54
+ | **Key behaviours**| Own the Outcome (+1), Be Polymath Oriented (+1), Don't Lose Your Curiosity (+1), Communicate with Precision (+1) | Think in Systems (+1), Communicate with Precision (+1) |
55
+ | **Mindset** | Ship fast, learn from users, bridge business & tech | Build for the long term, treat devs as customers |
56
+ | **Typical CV signals** | Multiple industries, customer projects, MVPs, analytics | Infrastructure, platform teams, APIs, shared services |
57
+
58
+ **Hiring implications:**
59
+
60
+ - A Forward Deployed hire who lacks business immersion and stakeholder skills
61
+ will struggle to embed with business units — even if technically strong.
62
+ - A Platform hire who lacks systems thinking and architectural rigour will build
63
+ fragile foundations — even if they ship fast.
64
+ - Candidates with both profiles are rare and valuable — flag them explicitly.
65
+ - When in doubt about track fit, recommend interviewing for both tracks and let
66
+ the interview reveal which context energizes the candidate.
67
+
68
+ ### Disciplines
69
+
70
+ ```
71
+ software_engineering — tracks: forward_deployed, platform, sre, dx
72
+ data_engineering — tracks: forward_deployed, platform, sre
73
+ data_science — tracks: forward_deployed
74
+ engineering_management — tracks: dx
75
+ product_management — no tracks
76
+ ```
77
+
78
+ Use `npx fit-pathway discipline {id}` to see skill tiers and behaviour
79
+ modifiers for each discipline.
80
+
81
+ ## Pool Diversity
82
+
83
+ Engineering has an industry-wide gender diversity problem. We will always hire
84
+ the most qualified engineer for the job — merit is non-negotiable. But a
85
+ non-diverse candidate pool usually means the sourcing process is broken, not that
86
+ qualified diverse candidates don't exist.
87
+
88
+ **Your responsibilities:**
89
+
90
+ 1. **Track gender composition of the active pipeline.** In every triage report,
91
+ include a diversity summary: how many candidates are women vs the total pool.
92
+ 2. **Flag women candidates explicitly.** When a woman candidate enters the
93
+ pipeline, highlight her in the triage under a `## Women Candidates` section
94
+ so she is not overlooked in a large pool. Include her name, status, and
95
+ assessed fit.
96
+ 3. **Push back on homogeneous pools.** If the active pipeline for a role has
97
+ fewer than 30% women candidates, add a `⚠️ Diversity gap` warning to the
98
+ triage report with a clear recommendation: _"Ask recruiters/agencies to
99
+ actively source women candidates for this role before shortlisting."_
100
+ 4. **Never lower the bar.** Diversity goals apply to the candidate pool, not to
101
+ hiring decisions. Every candidate is assessed on the same framework criteria.
102
+ Do not adjust skill ratings, level estimates, or recommendations based on
103
+ gender.
104
+ 5. **Track sourcing channels.** When a sourcing channel consistently produces
105
+ homogeneous candidate pools, note it in `knowledge/Candidates/Insights.md`
106
+ so the user can address it with the agency.
107
+
108
+ ## 1. Sync Candidates
109
+
110
+ Check for new recruitment-related email threads. Look for candidates that the
111
+ postman agent may have flagged:
112
+
113
+ ```bash
114
+ # Check postman's latest triage for recruitment signals
115
+ cat ~/.cache/fit/basecamp/state/postman_triage.md 2>/dev/null
116
+ ```
117
+
118
+ Then run the `track-candidates` skill workflow to process new email threads,
119
+ extract candidate profiles, and update the pipeline.
120
+
121
+ ## 2. Analyze CVs
122
+
123
+ After tracking, check for candidates with CV attachments that haven't been
124
+ assessed:
125
+
126
+ ```bash
127
+ # Find candidates with CVs but no assessment
128
+ for dir in knowledge/Candidates/*/; do
129
+ name=$(basename "$dir")
130
+ if ls "$dir"CV.* 1>/dev/null 2>&1 && [ ! -f "$dir/assessment.md" ]; then
131
+ echo "Needs assessment: $name"
132
+ fi
133
+ done
134
+ ```
135
+
136
+ For each unassessed candidate with a CV, run the `analyze-cv` skill workflow.
137
+ If the target role is known from the candidate brief, use it:
138
+
139
+ ```bash
140
+ # Look up the role for context
141
+ npx fit-pathway job {discipline} {level} --track={track}
142
+ ```
143
+
144
+ If the target role isn't specified, estimate from the CV and the position being
145
+ recruited for.
146
+
147
+ ## 3. Triage Pipeline
148
+
149
+ After processing, update the recruiter triage file:
150
+
151
+ ```bash
152
+ # Write to state
153
+ cat > ~/.cache/fit/basecamp/state/recruiter_triage.md << 'EOF'
154
+ # Recruitment Pipeline — {YYYY-MM-DD HH:MM}
155
+
156
+ ## Needs Action
157
+ - **{Name}** — {status}, CV received, no assessment yet
158
+ - **{Name}** — {status}, interview not scheduled
159
+
160
+ ## Recently Assessed
161
+ - **{Name}** — {recommendation}: {one-line rationale}
162
+
163
+ ## Pipeline Summary
164
+ {total} candidates, {new} new, {screening} screening, {interviewing} in interviews
165
+
166
+ ## Track Distribution
167
+ - Forward Deployed fit: {N} candidates
168
+ - Platform fit: {N} candidates
169
+ - Either track: {N} candidates
170
+
171
+ ## Diversity
172
+ - Women: {N}/{total} ({%})
173
+ - ⚠️ Diversity gap — {warning if below 30%, or "Pool is balanced" if not}
174
+
175
+ ## Women Candidates
176
+ - **{Name}** — {status}, {track fit}, {recommendation}
177
+ EOF
178
+ ```
179
+
180
+ ## 4. Act
181
+
182
+ Choose the single most valuable action from:
183
+
184
+ 1. **Track new candidates** — if postman flagged recruitment emails with
185
+ unprocessed candidates
186
+ 2. **Analyze a CV** — if a candidate has a CV but no assessment
187
+ 3. **Update pipeline status** — if email threads show status advancement
188
+ (interview scheduled, offer extended, etc.)
189
+ 4. **Nothing** — if the pipeline is current, report "all current"
190
+
191
+ ### Using fit-pathway During Assessment
192
+
193
+ Always ground your work in framework data. Key commands:
194
+
195
+ ```bash
196
+ # Compare what a role expects on each track
197
+ npx fit-pathway job software_engineering J060 --track=forward_deployed
198
+ npx fit-pathway job software_engineering J060 --track=platform
199
+
200
+ # See skill detail for nuanced assessment
201
+ npx fit-pathway skill {skill_id}
202
+
203
+ # Check what changes between levels (for level estimation)
204
+ npx fit-pathway progress {discipline} {level} --compare={higher_level}
205
+
206
+ # See all available skills and their IDs
207
+ npx fit-pathway skill --list
208
+
209
+ # View interview questions for a role (useful for interview prep)
210
+ npx fit-pathway interview {discipline} {level} --track={track}
211
+ ```
212
+
213
+ ## 5. Report
214
+
215
+ After acting, output exactly:
216
+
217
+ ```
218
+ Decision: {what you observed and why you chose this action}
219
+ Action: {what you did, e.g. "analyze-cv for John Smith against J060 forward_deployed"}
220
+ Pipeline: {N} total, {N} new, {N} assessed, {N} interviewing
221
+ Diversity: {N}/{total} women ({%}) — {balanced | ⚠️ gap}
222
+ ```
@@ -3,10 +3,6 @@
3
3
  "permissions": {
4
4
  "defaultMode": "acceptEdits",
5
5
  "allow": [
6
- "Bash(python3 *)",
7
- "Bash(sqlite3 *)",
8
- "Bash(bash scripts/*)",
9
- "Bash(sh scripts/*)",
10
6
  "Bash(node *)",
11
7
  "Bash(npm install *)",
12
8
  "Bash(npx *)",
@@ -0,0 +1,267 @@
1
+ ---
2
+ name: analyze-cv
3
+ description: >
4
+ Analyze candidate CVs against the engineering career framework using
5
+ fit-pathway as the reference point. Assess skill alignment, identify track
6
+ fit (forward_deployed vs platform), estimate career level, and produce
7
+ structured assessments. Use when the user asks to evaluate a CV, compare a
8
+ candidate to a role, or assess engineering fit.
9
+ ---
10
+
11
+ # Analyze CV
12
+
13
+ Analyze a candidate's CV against the engineering career framework defined in
14
+ `fit-pathway`. Produces a structured assessment: estimated career level, track
15
+ fit, skill alignment, gaps, and a hiring recommendation. Every assessment is
16
+ grounded in the framework — no subjective impressions.
17
+
18
+ ## Trigger
19
+
20
+ Run this skill:
21
+
22
+ - When the user asks to analyze, evaluate, or assess a CV
23
+ - When a new CV is added to `knowledge/Candidates/{Name}/`
24
+ - When the user asks "is this person a fit for {role}?"
25
+ - When comparing a candidate's background against a specific job level and track
26
+
27
+ ## Prerequisites
28
+
29
+ - `fit-pathway` CLI installed (`npx fit-pathway` must work)
30
+ - A CV file (PDF or DOCX) accessible on the filesystem
31
+ - Optionally, a target role specified by the user (discipline + level + track)
32
+
33
+ ## Inputs
34
+
35
+ - CV file path (e.g. `knowledge/Candidates/{Name}/CV.pdf` or a path the user
36
+ provides)
37
+ - Target role (optional): `{discipline} {level} --track={track}`
38
+ - Existing candidate brief (if available):
39
+ `knowledge/Candidates/{Name}/brief.md`
40
+
41
+ ## Outputs
42
+
43
+ - `knowledge/Candidates/{Name}/assessment.md` — structured CV assessment
44
+ - Updated `knowledge/Candidates/{Name}/brief.md` — skills and summary enriched
45
+ from CV analysis
46
+
47
+ ---
48
+
49
+ ## Step 1: Read the CV
50
+
51
+ Read the candidate's CV file. Extract:
52
+
53
+ | Field | What to look for |
54
+ | ---------------------- | ------------------------------------------------------ |
55
+ | **Current role** | Most recent job title |
56
+ | **Years of experience**| Total and per-role tenure |
57
+ | **Technical skills** | Languages, frameworks, platforms, tools mentioned |
58
+ | **Domain experience** | Industries, business domains, customer-facing work |
59
+ | **Education** | Degrees, certifications, relevant courses |
60
+ | **Leadership signals** | Team size, mentoring, cross-team work, architecture |
61
+ | **Scope signals** | Scale of systems, user base, revenue impact |
62
+ | **Communication** | Publications, talks, open source, documentation |
63
+ | **Gender** | Pronouns, gendered titles, first name if unambiguous |
64
+
65
+ ## Step 2: Look Up the Framework Reference
66
+
67
+ Use `fit-pathway` to load the reference data for assessment.
68
+
69
+ ### If a target role is specified
70
+
71
+ ```bash
72
+ # Get the full job definition
73
+ npx fit-pathway job {discipline} {level} --track={track}
74
+
75
+ # Get the skill matrix for comparison
76
+ npx fit-pathway job {discipline} {level} --track={track} --skills
77
+ ```
78
+
79
+ ### If no target role is specified
80
+
81
+ Estimate the most likely discipline and level from the CV, then look it up:
82
+
83
+ ```bash
84
+ # See available disciplines and their tracks
85
+ npx fit-pathway discipline
86
+
87
+ # See available levels
88
+ npx fit-pathway level
89
+
90
+ # Look up the estimated role
91
+ npx fit-pathway job {discipline} {level} --track={track}
92
+ ```
93
+
94
+ **Estimation heuristics:**
95
+
96
+ | CV Signal | Likely Level |
97
+ | -------------------------------------------- | ---------------- |
98
+ | 0-2 years, junior titles, learning signals | J040 (Level I) |
99
+ | 2-5 years, mid-level titles, independent | J060 (Level II) |
100
+ | 5-8 years, senior titles, mentoring signals | J070 (Level III) |
101
+ | 8-12 years, staff/lead titles, area scope | J090 (Staff) |
102
+ | 12+ years, principal titles, org-wide impact | J100 (Principal) |
103
+
104
+ ### Track fit estimation
105
+
106
+ Use `fit-pathway` to compare tracks:
107
+
108
+ ```bash
109
+ npx fit-pathway track forward_deployed
110
+ npx fit-pathway track platform
111
+ ```
112
+
113
+ Map CV evidence to track indicators:
114
+
115
+ | Forward Deployed signals | Platform signals |
116
+ | -------------------------------------------- | ------------------------------------------- |
117
+ | Customer-facing projects | Internal tooling / shared services |
118
+ | Business domain immersion | Infrastructure / platform-as-product |
119
+ | Rapid prototyping, MVPs | Architecture, system design |
120
+ | Data integration, analytics | CI/CD, DevOps, reliability |
121
+ | Stakeholder management | Code quality, technical debt management |
122
+ | Cross-functional work | Scalability, performance engineering |
123
+ | Multiple industries or domain breadth | Deep platform ownership |
124
+
125
+ ## Step 3: Map CV to Framework Skills
126
+
127
+ For each skill in the target job's skill matrix, assess the candidate's likely
128
+ proficiency based on CV evidence:
129
+
130
+ ```bash
131
+ # Get skill detail for nuanced assessment
132
+ npx fit-pathway skill {skill_id}
133
+ ```
134
+
135
+ Use the proficiency definitions from the framework:
136
+
137
+ | Proficiency | CV Evidence |
138
+ | -------------- | -------------------------------------------------------- |
139
+ | `awareness` | Mentioned but no project evidence |
140
+ | `foundational` | Used in projects, basic application |
141
+ | `working` | Primary tool/skill in multiple roles, independent usage |
142
+ | `practitioner` | Led teams using this skill, mentored others, deep work |
143
+ | `expert` | Published, shaped org practice, industry recognition |
144
+
145
+ **Be conservative.** CVs inflate; default one level below what's claimed unless
146
+ there's concrete evidence (metrics, project details, scope indicators).
147
+
148
+ ## Step 4: Assess Behaviour Indicators
149
+
150
+ Check the CV for behaviour signals aligned with the framework:
151
+
152
+ ```bash
153
+ npx fit-pathway behaviour --list
154
+ ```
155
+
156
+ Map CV evidence to behaviours:
157
+
158
+ | Behaviour | CV Evidence |
159
+ | ---------------------------- | -------------------------------------------------- |
160
+ | Own the Outcome | End-to-end ownership, P&L impact, delivery metrics |
161
+ | Think in Systems | Architecture decisions, system-wide reasoning |
162
+ | Communicate with Precision | Technical writing, documentation, talks |
163
+ | Be Polymath Oriented | Cross-domain work, diverse tech stack |
164
+ | Don't Lose Your Curiosity | Side projects, continuous learning, certifications |
165
+
166
+ ## Step 5: Identify Gaps and Strengths
167
+
168
+ Compare the candidate's estimated skill profile against the target job:
169
+
170
+ ```bash
171
+ # If comparing progression potential
172
+ npx fit-pathway progress {discipline} {level} --track={track}
173
+ ```
174
+
175
+ Classify each skill as:
176
+
177
+ - **Strong match** — candidate meets or exceeds the expected proficiency
178
+ - **Adequate** — candidate is within one level of expected proficiency
179
+ - **Gap** — candidate is two or more levels below expected proficiency
180
+ - **Not evidenced** — CV doesn't mention this skill area
181
+
182
+ ## Step 6: Write Assessment
183
+
184
+ Create `knowledge/Candidates/{Name}/assessment.md`:
185
+
186
+ ```markdown
187
+ # CV Assessment — {Full Name}
188
+
189
+ **Assessed against:** {Discipline} {Level} — {Track}
190
+ **Date:** {YYYY-MM-DD}
191
+ **CV source:** [{filename}](./{filename})
192
+
193
+ ## Summary
194
+
195
+ {2-3 sentence summary: overall fit, key strengths, primary concerns}
196
+
197
+ ## Estimated Profile
198
+
199
+ | Dimension | Assessment |
200
+ | ---------------- | ----------------------------------------- |
201
+ | **Level** | {estimated level and confidence} |
202
+ | **Track fit** | {forward_deployed / platform / either} |
203
+ | **Discipline** | {best discipline match} |
204
+ | **Gender** | {Woman / Man / —} |
205
+
206
+ ## Skill Alignment
207
+
208
+ | Skill | Expected | Estimated | Status |
209
+ | --- | --- | --- | --- |
210
+ | {skill} | {framework level} | {CV-based estimate} | {Strong/Adequate/Gap/Not evidenced} |
211
+
212
+ ### Key Strengths
213
+ - {Strength 1 — with CV evidence}
214
+ - {Strength 2 — with CV evidence}
215
+
216
+ ### Key Gaps
217
+ - {Gap 1 — what's missing and why it matters for the role}
218
+ - {Gap 2 — what's missing and why it matters for the role}
219
+
220
+ ## Behaviour Indicators
221
+
222
+ | Behaviour | Expected Maturity | CV Evidence | Signal |
223
+ | --- | --- | --- | --- |
224
+ | {behaviour} | {maturity} | {evidence or "—"} | {Strong/Weak/None} |
225
+
226
+ ## Track Fit Analysis
227
+
228
+ {Paragraph explaining why this candidate fits forward_deployed, platform,
229
+ or could work on either. Reference specific CV evidence.}
230
+
231
+ ## Hiring Recommendation
232
+
233
+ **Recommendation:** {Proceed / Proceed with reservations / Do not proceed}
234
+
235
+ **Rationale:** {3-5 sentences grounding the recommendation in framework data.
236
+ Reference specific skill gaps or strengths and their impact on the role.}
237
+
238
+ **Interview focus areas:**
239
+ - {Area 1 — what to probe in interviews to validate}
240
+ - {Area 2 — what to probe in interviews to validate}
241
+ ```
242
+
243
+ ## Step 7: Enrich Candidate Brief
244
+
245
+ If `knowledge/Candidates/{Name}/brief.md` exists, update it with findings:
246
+
247
+ - Add or update the **Skills** section with framework skill IDs
248
+ - Update **Summary** if the CV provides better context
249
+ - Set the **Gender** field if identifiable from the CV and not already set
250
+ - Add a link to the assessment: `- [CV Assessment](./assessment.md)`
251
+
252
+ **Use precise edits — don't rewrite the entire file.**
253
+
254
+ If no brief exists, note that the `track-candidates` skill should be run first
255
+ to create the candidate profile from email threads.
256
+
257
+ ## Quality Checklist
258
+
259
+ - [ ] Assessment is grounded in `fit-pathway` framework data, not subjective
260
+ opinion
261
+ - [ ] Every skill rating cites specific CV evidence or marks "Not evidenced"
262
+ - [ ] Estimated level is conservative (one below CV claims unless proven)
263
+ - [ ] Track fit analysis references specific skill modifiers from the framework
264
+ - [ ] Gaps are actionable — they suggest interview focus areas
265
+ - [ ] Assessment file uses correct path format and links to CV
266
+ - [ ] Candidate brief updated with skill tags and assessment link
267
+ - [ ] Gender field set in both assessment and brief where identifiable
@@ -41,7 +41,7 @@ Run when the user asks to create a presentation, slide deck, or pitch deck.
41
41
  4. Include the required CSS from [references/slide.css](references/slide.css)
42
42
  5. Run the conversion script:
43
43
 
44
- node scripts/convert-to-pdf.js
44
+ node scripts/convert-to-pdf.mjs
45
45
 
46
46
  6. Tell the user: "Your presentation is ready at ~/Desktop/presentation.pdf"
47
47
 
@@ -49,7 +49,7 @@ Run when the user asks to create a presentation, slide deck, or pitch deck.
49
49
 
50
50
  The conversion script accepts optional arguments:
51
51
 
52
- node scripts/convert-to-pdf.js [input.html] [output.pdf]
52
+ node scripts/convert-to-pdf.mjs [input.html] [output.pdf]
53
53
 
54
54
  Defaults: input = `/tmp/basecamp-presentation.html`, output =
55
55
  `~/Desktop/presentation.pdf`
@@ -1,7 +1,7 @@
1
1
  /* Required CSS for HTML slide decks rendered to PDF via Playwright.
2
2
  *
3
3
  * Include this in the <style> block of /tmp/basecamp-presentation.html.
4
- * See scripts/convert-to-pdf.js for the rendering script.
4
+ * See scripts/convert-to-pdf.mjs for the rendering script.
5
5
  *
6
6
  * PDF rendering rules:
7
7
  * - No layered elements — style content directly, no separate backgrounds
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Convert HTML slides to PDF using Playwright.
4
+ *
5
+ * Renders an HTML file containing slide markup (1280x720px per slide) into a
6
+ * PDF document. Each slide is sized to exactly 1280x720 pixels with background
7
+ * colours and images preserved. Defaults to reading from /tmp and writing to
8
+ * ~/Desktop when no arguments are given.
9
+ *
10
+ * Requires: npm install playwright && npx playwright install chromium
11
+ */
12
+
13
+ import { join } from "node:path";
14
+ import { resolve } from "node:path";
15
+ import { homedir } from "node:os";
16
+
17
+ const HELP = `convert-to-pdf — render HTML slides to PDF via Playwright
18
+
19
+ Usage: node scripts/convert-to-pdf.mjs [input.html] [output.pdf] [-h|--help]
20
+
21
+ Arguments:
22
+ input.html HTML slides file (default: /tmp/basecamp-presentation.html)
23
+ output.pdf Output PDF path (default: ~/Desktop/presentation.pdf)
24
+
25
+ Requires: npm install playwright && npx playwright install chromium`;
26
+
27
+ if (process.argv.includes("-h") || process.argv.includes("--help")) {
28
+ console.log(HELP);
29
+ process.exit(0);
30
+ }
31
+
32
+ const positional = process.argv.slice(2).filter((a) => !a.startsWith("-"));
33
+ const input = positional[0] || "/tmp/basecamp-presentation.html";
34
+ const output = positional[1] || join(homedir(), "Desktop", "presentation.pdf");
35
+
36
+ const { chromium } = await import("playwright");
37
+ const browser = await chromium.launch();
38
+ const page = await browser.newPage();
39
+ await page.goto(`file://${resolve(input)}`, { waitUntil: "networkidle" });
40
+ await page.pdf({
41
+ path: output,
42
+ width: "1280px",
43
+ height: "720px",
44
+ printBackground: true,
45
+ });
46
+ await browser.close();
47
+ console.log(`Done: ${output}`);