@forwardimpact/outpost 3.11.0 → 3.12.1

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 (114) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +4 -4
  4. package/src/agent-path.js +10 -6
  5. package/src/agent-runner.js +28 -24
  6. package/src/index.js +2 -3
  7. package/src/kb-manager.js +21 -19
  8. package/src/outpost.js +37 -33
  9. package/src/posture.js +3 -3
  10. package/src/privilege.js +11 -11
  11. package/src/scheduler.js +14 -12
  12. package/src/socket-server.js +19 -18
  13. package/src/spawn-env.js +7 -6
  14. package/src/state-manager.js +2 -2
  15. package/templates/.claude/agents/chief-of-staff.md +22 -22
  16. package/templates/.claude/agents/concierge.md +19 -17
  17. package/templates/.claude/agents/head-hunter.md +27 -26
  18. package/templates/.claude/agents/librarian.md +17 -16
  19. package/templates/.claude/agents/postman.md +19 -18
  20. package/templates/.claude/agents/recruiter.md +31 -27
  21. package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
  22. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  23. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
  24. package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
  25. package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
  26. package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
  27. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
  28. package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
  29. package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
  30. package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
  31. package/templates/.claude/skills/candidate-report/references/report.css +4 -4
  32. package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
  33. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
  34. package/templates/.claude/skills/changelog/SKILL.md +55 -50
  35. package/templates/.claude/skills/deck-create/SKILL.md +30 -30
  36. package/templates/.claude/skills/deck-create/references/slide.css +4 -4
  37. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
  38. package/templates/.claude/skills/deck-review/SKILL.md +59 -57
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
  44. package/templates/.claude/skills/doc-create/SKILL.md +21 -20
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
  50. package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +5 -5
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
  57. package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
  59. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
  60. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  61. package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
  62. package/templates/.claude/skills/organize-files/SKILL.md +24 -22
  63. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  64. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  65. package/templates/.claude/skills/person-identify/SKILL.md +24 -22
  66. package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
  67. package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
  68. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
  69. package/templates/.claude/skills/req-assess/SKILL.md +27 -27
  70. package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
  71. package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
  72. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  73. package/templates/.claude/skills/req-decide/SKILL.md +28 -25
  74. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  75. package/templates/.claude/skills/req-forget/SKILL.md +28 -26
  76. package/templates/.claude/skills/req-forget/references/classify.md +13 -13
  77. package/templates/.claude/skills/req-forget/references/locations.md +2 -2
  78. package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
  79. package/templates/.claude/skills/req-scan/SKILL.md +21 -22
  80. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  81. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  82. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  83. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  84. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  85. package/templates/.claude/skills/req-screen/SKILL.md +31 -29
  86. package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
  87. package/templates/.claude/skills/req-screen/references/template.md +4 -4
  88. package/templates/.claude/skills/req-track/SKILL.md +40 -40
  89. package/templates/.claude/skills/req-track/references/fields.md +19 -18
  90. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  91. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  92. package/templates/.claude/skills/req-track/references/templates.md +4 -4
  93. package/templates/.claude/skills/req-workday/SKILL.md +24 -24
  94. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  95. package/templates/.claude/skills/req-workday/references/templates.md +13 -13
  96. package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
  97. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
  98. package/templates/.claude/skills/send-chat/SKILL.md +47 -43
  99. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -19
  100. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  101. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  102. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  103. package/templates/.claude/skills/sync-apple-mail/SKILL.md +17 -14
  104. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  105. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  106. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  107. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  108. package/templates/.claude/skills/sync-teams/SKILL.md +43 -43
  109. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  110. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  111. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  112. package/templates/.claude/skills/upstream-instructions/SKILL.md +39 -40
  113. package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
  114. package/templates/CLAUDE.md +40 -37
@@ -1,21 +1,22 @@
1
1
  ---
2
2
  name: deck-summarize
3
- description: Synthesize PowerPoint decks into engineer-friendly markdown briefs covering Jobs-To-Be-Done, dependencies, and synthetic data needs. Use when the user asks to break down, summarize, or make sense of a slide deck (.pptx) for engineering work.
3
+ description: Synthesize PowerPoint decks into engineer-friendly markdown briefs. Each brief covers Jobs-To-Be-Done, dependencies, and synthetic data needs. Use when the user asks to break down, summarize, or make sense of a slide deck (.pptx) for engineering work.
4
4
  compatibility: Node.js only — no external dependencies.
5
5
  ---
6
6
 
7
7
  # Synthesize Deck
8
8
 
9
9
  Turn messy PowerPoint specification decks into clear, actionable markdown briefs
10
- that forward deployed engineers can build from. Strip business jargon and focus
11
- on what matters: what needs to be built, what blocks progress, what data is
12
- needed to start prototyping.
10
+ that forward deployed engineers can build from. Strip business jargon. Focus on
11
+ what matters: what the team must build, what blocks progress, and what data you
12
+ need to start a prototype.
13
13
 
14
14
  ## Trigger
15
15
 
16
- The user asks to summarize, synthesize, or break down a `.pptx` deck; make sense
17
- of a specification or proposal deck for engineering; create an engineering brief
18
- from a slide deck; or understand what a project deck is actually asking for.
16
+ Run when the user asks to summarize, synthesize, or break down a `.pptx` deck.
17
+ Run when the user wants to make sense of a specification or proposal deck for
18
+ engineering. Run when the user asks for an engineering brief from a slide deck.
19
+ Run when the user wants to understand what a project deck really asks for.
19
20
 
20
21
  ## Prerequisites
21
22
 
@@ -35,16 +36,17 @@ from a slide deck; or understand what a project deck is actually asking for.
35
36
  <do_confirm_checklist goal="Verify the brief is engineer-actionable before
36
37
  delivering">
37
38
 
38
- - [ ] No invented requirements every claim traces to the deck.
39
- - [ ] Plain language; no marketing jargon (no "synergize", "orchestrate",
39
+ - [ ] No invented requirements. Every claim traces to the deck.
40
+ - [ ] Plain language, with no marketing jargon (no "synergize", "orchestrate",
40
41
  "leverage", "intelligent \_\_\_ hub").
41
- - [ ] JTBDs describe the user's goal, not the proposed solution; one job per
42
- statement; each includes the "so that".
43
- - [ ] Data dependencies table flags blockers (missing, locked, compliance).
42
+ - [ ] JTBDs describe the user's goal. They do not describe the proposed
43
+ solution. One job per statement. Each job includes the "so that".
44
+ - [ ] The data-dependencies table flags blockers (missing, locked, compliance).
44
45
  - [ ] Synthetic data needs name fields, ranges, edge cases, and volume.
45
46
  - [ ] Gaps and open questions list what an engineer would notice missing.
46
- - [ ] Brief is under 2,000 lines a summary, not a transcription.
47
- - [ ] Knowledge base looked up for mentioned people, orgs, and projects.
47
+ - [ ] The brief is under 2,000 lines. It summarizes the deck. It does not
48
+ transcribe it.
49
+ - [ ] You looked up mentioned people, orgs, and projects in the knowledge base.
48
50
 
49
51
  </do_confirm_checklist>
50
52
 
@@ -65,20 +67,21 @@ For multiple decks, pass all files at once. To save the extracted text:
65
67
  node .claude/skills/deck-summarize/scripts/extract-pptx.mjs "$FILE_PATH" -o /tmp/deck_extract.txt
66
68
  ```
67
69
 
68
- Read all extracted text before continuing.
70
+ Read all extracted text before you continue.
69
71
 
70
72
  ### 2. Identify the core problem
71
73
 
72
- Plain-language answers to: what process exists today; what's broken, slow, or
73
- painful; who suffers. Don't restate the deck's framing.
74
+ Give plain-language answers. Name the process that exists today. Name what is
75
+ broken, slow, or painful. Name who suffers. Don't restate how the deck frames
76
+ the problem.
74
77
 
75
78
  ### 3. Extract Jobs-To-Be-Done
76
79
 
77
80
  Format: `When [situation], I need to [action], so that [outcome].`
78
81
 
79
- Group by user role/persona. One job per statement. Use the user's goal, not the
80
- proposed solution. A job should still make sense if you discard the deck's
81
- solution. Don't restate the deck's feature list as jobs and don't reuse its
82
+ Group by user role/persona. One job per statement. Use the user's goal. Do not
83
+ use the proposed solution. A job should still make sense if you discard the
84
+ deck's solution. Don't restate the deck's feature list as jobs. Don't reuse its
82
85
  jargon.
83
86
 
84
87
  ### 4. Map dependencies
@@ -87,39 +90,42 @@ jargon.
87
90
  [references/brief-template.md](references/brief-template.md#data-dependencies-table).
88
91
  Flag blockers (missing, locked, unstructured, compliance).
89
92
 
90
- **4b. Systems & integrations** — every external system/API/platform: what the
91
- integration does, read-only vs read-write, API vs manual/scraping, access
92
- confirmed?
93
+ **4b. Systems & integrations** — list every external system, API, and platform.
94
+ For each one, say what the integration does. Say whether it is read-only or
95
+ read-write. Say whether access runs through an API or through manual work or
96
+ scraping. Say whether someone confirmed access.
93
97
 
94
- **4c. People & approvals** — approvals, reviews, or co-creation needed before
95
- engineering can proceed. Flag long lead-time items (legal, compliance, vendor
96
- contracts).
98
+ **4c. People & approvals** — list the approvals, reviews, or co-creation that
99
+ must happen before engineering can proceed. Flag long lead-time items (legal,
100
+ compliance, vendor contracts).
97
101
 
98
102
  ### 5. Define synthetic-data needs
99
103
 
100
104
  For each core feature/use case:
101
105
 
102
106
  - **Generate:** entity, key fields and types, realistic value ranges and
103
- distributions, edge cases that matter, volume for meaningful testing.
107
+ distributions, edge cases that matter, volume for a meaningful test.
104
108
  - **Simulate:** workflows and state transitions, time-series patterns,
105
109
  multi-actor interactions, error/failure modes.
106
- - **Format:** prefer CSV/JSON; PII-shaped fake data only never real PII;
107
- include happy-path _and_ adversarial examples; consider ML training/eval data.
110
+ - **Format:** prefer CSV/JSON. Use PII-shaped fake data only. Never use real
111
+ PII. Include happy-path _and_ adversarial examples. Consider ML training and
112
+ eval data.
108
113
 
109
114
  ### 6. Translate the proposed solution
110
115
 
111
- Describe the build in engineering terms: components, what each does in plain
112
- terms, how they connect, end-to-end data flow, AI/ML capabilities and what
113
- they're actually doing. Translate branded names — e.g. "Intelligent Intake Hub"
114
- "OCR + NLP pipeline that extracts structured fields from scanned enrollment
115
- forms"; "Copay Guardian" "Anomaly detection on weekly claims data".
116
+ Describe the build in engineering terms. Cover the components and what each does
117
+ in plain terms. Cover how they connect and the end-to-end data flow. Cover the
118
+ AI/ML capabilities and what they actually do. Translate branded names. For
119
+ example, "Intelligent Intake Hub"
120
+ "OCR + NLP pipeline that extracts structured fields from scanned enrollment
121
+ forms". "Copay Guardian" → "Anomaly detection on weekly claims data".
116
122
 
117
123
  ### 7. Identify what's missing
118
124
 
119
- Call out: features without clear data sources; AI capabilities without a
120
- training-data strategy; assumed integrations; user workflows that skip edge
121
- cases; metrics promised without measurement infrastructure; timeline–scope
122
- mismatches.
125
+ Call out features without clear data sources. Call out AI capabilities without a
126
+ training-data strategy. Call out assumed integrations. Call out user workflows
127
+ that skip edge cases. Call out metrics promised without measurement
128
+ infrastructure. Call out timeline–scope mismatches.
123
129
 
124
130
  ### 8. Assemble the brief
125
131
 
@@ -130,10 +136,10 @@ decks, write one combined brief with shared dependencies.
130
136
 
131
137
  ### 9. Save and report
132
138
 
133
- Tell the user the file path and give a 3-sentence project summary.
139
+ Tell the user the file path. Give a 3-sentence project summary.
134
140
 
135
- ## Writing style
141
+ ## Style
136
142
 
137
- Plain language, concrete over abstract, honest about uncertainty, opinionated
138
- when helpful (flag dependency or timeline risks), short sentences. Engineers
139
- scan, they don't read essays.
143
+ Use plain language. Choose the concrete over the abstract. Be honest about
144
+ uncertainty. Be opinionated when it helps, and flag dependency or timeline
145
+ risks. Keep sentences short. Engineers scan. They don't read essays.
@@ -76,9 +76,10 @@ what's realistic and what depends on what}
76
76
 
77
77
  ## Data dependencies table
78
78
 
79
- For Step 4a, fill in this table. Flag any data that doesn't seem to exist yet,
80
- is locked behind inaccessible systems, is unstructured and would need heavy
81
- preprocessing, or carries compliance/privacy constraints.
79
+ For Step 4a, fill in this table. Flag any data that doesn't seem to exist yet.
80
+ Flag data that is locked behind inaccessible systems. Flag unstructured data
81
+ that would need heavy preprocessing. Flag data that carries compliance or
82
+ privacy constraints.
82
83
 
83
84
  | Data | Where It Lives | Format | Access | Blocker? |
84
85
  | ----------- | -------------------------- | ---------------------------------- | ------------------------------- | -------------- |
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * Extract text from PowerPoint (.pptx) slides.
4
4
  *
5
- * PPTX files are ZIP archives containing XML. This script extracts all text
6
- * from each slide and outputs it as structured markdown with slide headings.
7
- * Handles multiple files and outputs to stdout or a file.
5
+ * A PPTX file is a ZIP archive that holds XML. This script extracts all text
6
+ * from each slide. It outputs the text as structured markdown with slide
7
+ * headings. It handles multiple files. It writes to stdout or to a file.
8
8
  *
9
9
  * Usage:
10
10
  * node scripts/extract-pptx.mjs <path-to-pptx>
@@ -12,7 +12,8 @@
12
12
  * node scripts/extract-pptx.mjs file1.pptx file2.pptx
13
13
  * node scripts/extract-pptx.mjs -h|--help
14
14
  *
15
- * No external dependencies uses Node.js built-in modules only.
15
+ * The script needs no external dependencies. It uses Node.js built-in
16
+ * modules only.
16
17
  */
17
18
 
18
19
  import { readFileSync, writeFileSync } from "node:fs";
@@ -26,7 +27,7 @@ Usage:
26
27
  node scripts/extract-pptx.mjs -h|--help
27
28
 
28
29
  Options:
29
- -o <path> Write output to file instead of stdout
30
+ -o <path> Write output to a file instead of stdout
30
31
  -h, --help Show this help
31
32
 
32
33
  Output: Markdown-formatted text with ## Slide N headings per slide.
@@ -136,8 +137,8 @@ function readEntry(buf, entry) {
136
137
  }
137
138
 
138
139
  /**
139
- * Extract all text content from slide XML using the DrawingML namespace.
140
- * Matches <a:t>text</a:t> elements used by PowerPoint.
140
+ * Extract all text content from slide XML with the DrawingML namespace.
141
+ * The pattern matches the <a:t>text</a:t> elements that PowerPoint uses.
141
142
  * @param {string} xml
142
143
  * @returns {string[]}
143
144
  */
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: doc-collab
3
- description: Help the user create, edit, and refine documents in the knowledge base. Use when the user asks to create, edit, review, or collaborate on a document. Supports direct editing and approval-based workflows with knowledge base context for entity references.
3
+ description: Help the user create, edit, and refine documents in the knowledge base. Use when the user asks to create, edit, review, or collaborate on a document. Supports direct edits and approval-based workflows, with context from the knowledge base for entity references.
4
4
  ---
5
5
 
6
6
  # Document Collaboration
7
7
 
8
- Help the user create, edit, and refine documents in the knowledge base. Supports
9
- direct editing and approval-based workflows. Always uses knowledge base context
10
- for entity references.
8
+ Help the user create, edit, and refine documents in the knowledge base. This
9
+ skill supports direct edits and approval-based workflows. It always uses context
10
+ from the knowledge base for entity references.
11
11
 
12
12
  ## Trigger
13
13
 
@@ -19,7 +19,7 @@ Run when the user asks to create, edit, review, or collaborate on a document.
19
19
 
20
20
  ## Inputs
21
21
 
22
- - User's editing instructions
22
+ - The user's edit instructions
23
23
  - `Knowledge/` — existing notes and documents
24
24
  - Document to edit (user-specified or searched)
25
25
 
@@ -31,46 +31,46 @@ Run when the user asks to create, edit, review, or collaborate on a document.
31
31
 
32
32
  ## First: Ask About Edit Mode
33
33
 
34
- **Before doing anything, ask:** "Should I make edits directly, or show you
34
+ **Ask before you do anything:** "Should I make edits directly, or show you
35
35
  changes first for approval?"
36
36
 
37
- - **Direct mode:** Make edits immediately, confirm after
38
- - **Approval mode:** Show proposed changes, wait for approval
37
+ - **Direct mode:** Make edits immediately, then confirm
38
+ - **Approval mode:** Show proposed changes, then wait for approval
39
39
 
40
40
  Follow their choice for the entire session.
41
41
 
42
42
  ## Core Principles
43
43
 
44
- - **Re-read before every response** — the user may have edited the file manually
44
+ - **Re-read before every response** — the user may edit the file manually
45
45
  - **Be concise** — don't propose outlines unless asked
46
- - **Don't assume** — if unclear, ask ONE simple question
47
- - **Use knowledge context** — search knowledge base for mentioned entities, use
48
- `[[wiki-links]]`
46
+ - **Don't assume** — if something is unclear, ask ONE simple question
47
+ - **Use knowledge context** — search the knowledge base for mentioned entities,
48
+ then use `[[wiki-links]]`
49
49
 
50
- ## Processing Flow
50
+ ## Process Flow
51
51
 
52
52
  ### Step 1: Find the Document
53
53
 
54
- Search thoroughly before saying a document doesn't exist:
54
+ Search thoroughly before you say a document doesn't exist:
55
55
 
56
56
  ```bash
57
57
  rg -l -i "roadmap" Knowledge/
58
58
  find Knowledge/ -iname "*roadmap*" 2>/dev/null
59
59
  ```
60
60
 
61
- **If found:** Read it and proceed. **If NOT found:** Ask "I couldn't find
61
+ **If found:** Read it. Then proceed. **If NOT found:** Ask "I couldn't find
62
62
  [name]. Shall I create it?"
63
63
 
64
- **Creating new documents:**
64
+ **Create a new document:**
65
65
 
66
66
  1. Ask: "Shall I create Knowledge/[name].md?"
67
- 2. Create with just a title — don't pre-populate with structure
67
+ 2. Create it with just a title. Don't pre-populate it with structure
68
68
  3. Ask: "What would you like in this?"
69
69
 
70
70
  ### Step 2: Understand the Request
71
71
 
72
- **NEVER make unsolicited edits.** If the user hasn't specified what to change,
73
- ask: "What would you like to change?"
72
+ **NEVER make unsolicited edits.** If the user did not say what to change, ask:
73
+ "What would you like to change?"
74
74
 
75
75
  Types of requests:
76
76
 
@@ -83,8 +83,8 @@ Types of requests:
83
83
 
84
84
  ### Step 3: Execute Changes
85
85
 
86
- Make targeted edits change only what's needed. Preserve the user's voice and
87
- don't reorganize unless asked.
86
+ Make targeted edits. Change only what's needed. Preserve the user's voice. Don't
87
+ reorganize unless the user asks.
88
88
 
89
89
  ### Step 4: Confirm and Continue
90
90
 
@@ -92,7 +92,7 @@ don't reorganize unless asked.
92
92
  - Ask: "What's next?"
93
93
  - Don't read back the entire document unless asked
94
94
 
95
- ## Searching Knowledge for Context
95
+ ## Search Knowledge for Context
96
96
 
97
97
  When the user mentions people, companies, or projects:
98
98
 
@@ -107,6 +107,6 @@ Use `[[wiki-links]]` to connect to other notes. Only link to notes that exist.
107
107
  ## Constraints
108
108
 
109
109
  - Match the user's tone and style
110
- - Make surgical edits change only what's needed
111
- - Preserve the user's voice don't reorganize unless asked
112
- - Only link to notes that exist use `[[Person Name]]` for existing notes
110
+ - Make surgical edits that change only what's needed
111
+ - Preserve the user's voice, and don't reorganize unless the user asks
112
+ - Only link to notes that exist, and use `[[Person Name]]` for existing notes
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: doc-create
3
- description: Generate PDF documents from user requests using Playwright to render HTML to A4 PDF. Use when the user asks to create a document, proposal, report, or any multi-page PDF that is not a slide deck. Pulls context from the knowledge base for company info, project details, and people.
3
+ description: Generate PDF documents from user requests. Playwright renders the HTML to an A4 PDF. Use when the user asks to create a document, proposal, report, or any multi-page PDF that is not a slide deck. Pulls context from the knowledge base for company info, project details, and people.
4
4
  compatibility: Requires Node.js installed. Playwright is installed on first use.
5
5
  ---
6
6
 
7
7
  # Create Documents
8
8
 
9
- Generate multi-page A4 PDF documents from user requests. Uses Playwright to
10
- render self-contained HTML to PDF. Can pull context from the knowledge base for
11
- company info, project details, and people.
9
+ Generate multi-page A4 PDF documents from user requests. This skill uses
10
+ Playwright to render self-contained HTML to PDF. It can pull context from the
11
+ knowledge base for company info, project details, and people.
12
12
 
13
13
  ## Trigger
14
14
 
@@ -18,7 +18,7 @@ submission, brief, or any multi-page PDF that is not a slide deck.
18
18
  ## Prerequisites
19
19
 
20
20
  - Node.js installed
21
- - Playwright will be installed on first use
21
+ - Playwright installs on first use
22
22
 
23
23
  ## Inputs
24
24
 
@@ -36,21 +36,21 @@ submission, brief, or any multi-page PDF that is not a slide deck.
36
36
 
37
37
  1. Check `Knowledge/` for relevant context about the company, product, team,
38
38
  projects, or people mentioned.
39
- 2. Ensure Playwright is installed:
39
+ 2. Make sure Playwright is installed:
40
40
  `bun install playwright && bunx playwright install chromium`
41
41
  3. Create a self-contained HTML file with all CSS inlined. The HTML must handle
42
- its own page layout see **HTML Document Rules** below.
42
+ its own page layout. See **HTML Document Rules** below.
43
43
  4. Run the conversion script:
44
44
 
45
45
  ```text
46
46
  node .claude/skills/doc-create/scripts/convert-to-pdf.mjs <input.html> [output.pdf]
47
47
  ```
48
48
 
49
- If output is omitted, the PDF is written alongside the HTML file with the
50
- same name.
49
+ If you omit the output path, the script writes the PDF next to the HTML file
50
+ with the same name.
51
51
  5. Read the PDF back to visually verify it renders correctly. Check each page
52
- for overflow, clipped content, and correct page breaks. Fix and re-render if
53
- needed.
52
+ for overflow, clipped content, and correct page breaks. If you find a
53
+ problem, fix it and re-render.
54
54
 
55
55
  **Do NOT show HTML code to the user. Just create the PDF and deliver it.**
56
56
 
@@ -60,8 +60,9 @@ submission, brief, or any multi-page PDF that is not a slide deck.
60
60
 
61
61
  - Each page is a `<div class="page">` sized to exactly 210mm × 297mm (A4)
62
62
  - Use `page-break-after: always` on every `.page` except the last
63
- - Handle margins with padding inside `.page`, not with PDF margin settings
64
- - The PDF is rendered with zero margins — the HTML owns all spacing
63
+ - Handle margins with padding inside `.page` rather than with PDF margin
64
+ settings
65
+ - Playwright renders the PDF with zero margins, so the HTML owns all spacing
65
66
 
66
67
  **Print colours:**
67
68
 
@@ -70,16 +71,16 @@ submission, brief, or any multi-page PDF that is not a slide deck.
70
71
 
71
72
  **Fonts:**
72
73
 
73
- - Use system fonts only no external font loading
74
+ - Use system fonts only, and do not load an external font
74
75
  - Monospace stack: `'SF Mono', 'Menlo', 'Monaco', 'Consolas', monospace`
75
76
  - Sans-serif stack:
76
77
  `-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif`
77
78
 
78
- **Content fitting:**
79
+ **Content fit:**
79
80
 
80
81
  - After the first render, visually check every page for overflow
81
- - Content must not bleed past the `.page` boundary if it does, reduce spacing
82
- or font sizes and re-render
82
+ - Content must not bleed past the `.page` boundary. If it does, reduce spacing
83
+ or font sizes, then re-render
83
84
  - Page numbers, if used, must not overlap with content. Position them in a
84
85
  corner that has whitespace
85
86
 
@@ -93,14 +94,14 @@ submission, brief, or any multi-page PDF that is not a slide deck.
93
94
 
94
95
  - Use absolute `file://` paths for local images
95
96
  - Inline small images as base64 data URIs when possible
96
- - Verify images appear in the rendered PDF Playwright can fail silently on
97
- missing images
97
+ - Verify images appear in the rendered PDF, because Playwright can fail silently
98
+ on missing images
98
99
 
99
100
  ## Design Principles
100
101
 
101
102
  - Clean, professional typography with clear hierarchy
102
103
  - Use monospace for section headers and numbers for a technical/engineering feel
103
- - Tables should be compact and readable right-align monetary values
104
+ - Keep tables compact and readable, and right-align monetary values
104
105
  - Use colour sparingly: one accent colour, one dark, lots of white space
105
106
  - Dark-background panels (timelines, hero sections) create visual contrast
106
107
  - Callout boxes with left borders draw attention to key statements
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env bun
2
2
  /**
3
- * Convert an HTML document to A4 PDF using Playwright.
3
+ * Convert an HTML document to an A4 PDF with Playwright.
4
4
  *
5
- * Renders an HTML file into an A4 PDF with background colours preserved and
6
- * zero margins (the HTML is expected to handle its own page layout via CSS
7
- * @page rules and page-break-after). Defaults to writing the PDF alongside
8
- * the input file when no output path is given.
5
+ * The script renders an HTML file into an A4 PDF. It keeps the background
6
+ * colours. It sets zero margins. The script expects the HTML to handle its own
7
+ * page layout through CSS @page rules and page-break-after. Without an output
8
+ * path, the script writes the PDF next to the input file.
9
9
  *
10
10
  * Requires: bun install playwright && bunx playwright install chromium
11
11
  */
12
12
 
13
13
  import { resolve, dirname, basename, join } from "node:path";
14
14
 
15
- const HELP = `convert-to-pdf — render an HTML document to A4 PDF via Playwright
15
+ const HELP = `convert-to-pdf — render an HTML document to A4 PDF with Playwright
16
16
 
17
17
  Usage: bun scripts/convert-to-pdf.mjs <input.html> [output.pdf] [-h|--help]
18
18
 
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: draft-emails
3
- description: Draft and send email responses using the knowledge base and calendar for context. Use when the user asks to draft, reply to, respond to, or send an email.
3
+ description: Draft and send email responses with context from the knowledge base and calendar. Use when the user asks to draft, reply to, respond to, or send an email.
4
4
  ---
5
5
 
6
6
  # Draft Emails
7
7
 
8
- Draft and send email responses using the knowledge base and calendar for full
9
- context on every person and conversation. Every draft requires explicit user
10
- approval before sending.
8
+ Draft and send email responses. Use the knowledge base and calendar for full
9
+ context on every person and conversation. Every draft needs explicit user
10
+ approval before you send it.
11
11
 
12
12
  ## Trigger
13
13
 
@@ -31,20 +31,22 @@ The user asks to draft, reply to, respond to, or send an email.
31
31
  | Draft files | `Drafts/{email_id}_draft.md` |
32
32
 
33
33
  `handled` and `ignored` both exclude threads from `scan-emails.mjs`. Use
34
- `handled` for resolved threads (sent here, replied manually, resolved via DM);
35
- `ignored` for threads that need no response (newsletters, spam, outbound with no
36
- reply).
34
+ `handled` for resolved threads (sent here, replied manually, resolved through a
35
+ DM). Use `ignored` for threads that need no response (newsletters, spam,
36
+ outbound with no reply).
37
37
 
38
38
  <do_confirm_checklist goal="Verify a draft is safe and ready before sending">
39
39
 
40
- - [ ] Sender and organization were looked up in `Knowledge/` before drafting.
41
- - [ ] Draft is a single email (not multiple variants) and matches the incoming
42
- tone.
43
- - [ ] Body has no sign-off / name / "Best" — Apple Mail signature handles it.
44
- - [ ] Recruitment thread: candidate excluded from internal recipients; any
45
- direct-to-candidate draft is flagged `⚠️ RECRUITER ONLY`.
46
- - [ ] No sensitive personal data (health, politics, etc.) was included.
47
- - [ ] User has explicitly approved the draft before any send.
40
+ - [ ] You looked up the sender and the organization in `Knowledge/` before you
41
+ drafted.
42
+ - [ ] The draft is a single email (not multiple variants). It matches the
43
+ incoming tone.
44
+ - [ ] The body has no sign-off, name, or "Best". The Apple Mail signature
45
+ handles it.
46
+ - [ ] In a recruitment thread, the candidate is excluded from internal
47
+ recipients. Any direct-to-candidate draft carries `⚠️ RECRUITER ONLY`.
48
+ - [ ] The draft includes no sensitive personal data (health, politics, etc.).
49
+ - [ ] The user explicitly approved the draft before any send.
48
50
  - [ ] Send used `--draft <path>` so cleanup and `Drafts/handled` happen
49
51
  automatically.
50
52
 
@@ -58,7 +60,7 @@ reply).
58
60
  node scripts/scan-emails.mjs
59
61
  ```
60
62
 
61
- Outputs `email_id<TAB>subject` for unprocessed emails (those not in
63
+ The script outputs `email_id<TAB>subject` for unprocessed emails (those not in
62
64
  `Drafts/handled` or `Drafts/ignored`).
63
65
 
64
66
  ### 2. Classify
@@ -69,11 +71,11 @@ notifications, spam, outbound with no reply.
69
71
  **Draft a response**: meeting requests, personal mail from known contacts,
70
72
  business inquiries or follow-ups, requests for information or action.
71
73
 
72
- Be conservative with ignore when in doubt, draft.
74
+ Be conservative with ignore. When in doubt, draft.
73
75
 
74
76
  ### 3. Gather context
75
77
 
76
- Before drafting, look up the sender and organization in `Knowledge/`:
78
+ Before you draft, look up the sender and the organization in `Knowledge/`:
77
79
 
78
80
  ```bash
79
81
  rg -l "sender_name" Knowledge/
@@ -81,42 +83,44 @@ cat "Knowledge/People/Sender Name.md"
81
83
  cat "Knowledge/Organizations/Company Name.md"
82
84
  ```
83
85
 
84
- For scheduling emails, also read the relevant calendar event:
86
+ For an email that arranges a meeting time, also read the relevant calendar
87
+ event:
85
88
 
86
89
  ```bash
87
90
  ls ~/.cache/fit/outpost/apple_calendar/ 2>/dev/null
88
91
  cat "$HOME/.cache/fit/outpost/apple_calendar/event123.json"
89
92
  ```
90
93
 
91
- Extract role, organization, relationship history, and open items. If intent is
92
- unclear or the person has multiple contexts, **ask** rather than guess.
94
+ Extract role, organization, relationship history, and open items. If the intent
95
+ is unclear or the person has multiple contexts, **ask** rather than guess.
93
96
 
94
97
  ### 4. Write the draft
95
98
 
96
- Save to `Drafts/{email_id}_draft.md` using the template in
99
+ Save to `Drafts/{email_id}_draft.md` with the template in
97
100
  [references/template.md](references/template.md). Reference past interactions
98
- naturally; for scheduling, propose specific times from calendar availability.
101
+ naturally. To arrange a meeting, propose specific times from the calendar
102
+ availability.
99
103
 
100
104
  ### 5. Recruitment & staffing emails
101
105
 
102
- Candidates **must never** be copied on internal threads about them.
106
+ You **must never** copy candidates on internal threads about them.
103
107
 
104
108
  - Identify the candidate from the thread and `Knowledge/Candidates/`.
105
- - Strip the candidate from To/CC; draft to internal stakeholders only.
109
+ - Strip the candidate from To/CC. Draft to internal stakeholders only.
106
110
  - Direct-to-candidate emails carry the warning header
107
111
  `⚠️ RECRUITER ONLY — This email goes directly to the candidate.`
108
112
 
109
113
  If a thread mentions a candidate and includes multiple internal recipients,
110
- treat it as internal and exclude the candidate.
114
+ treat it as internal. Exclude the candidate.
111
115
 
112
116
  ### 6. Present and approve
113
117
 
114
- Show the draft to the user. Wait for explicit approval before sending. Apply
115
- edits and present again as needed.
118
+ Show the draft to the user. Wait for explicit approval before you send. Apply
119
+ edits. Present the draft again as needed.
116
120
 
117
121
  ### 7. Send
118
122
 
119
- After approval, send via Apple Mail:
123
+ After the user approves, send the email through Apple Mail:
120
124
 
121
125
  ```bash
122
126
  node scripts/send-email.mjs \
@@ -128,12 +132,12 @@ node scripts/send-email.mjs \
128
132
  ```
129
133
 
130
134
  Required: `--to`, `--subject`, `--body` (plain text). Optional: `--cc`, `--bcc`,
131
- `--draft`. With `--draft`, the draft file is deleted and the email ID is
132
- appended to `Drafts/handled` automatically.
135
+ `--draft`. With `--draft`, the script deletes the draft file. It also appends
136
+ the email ID to `Drafts/handled` automatically.
133
137
 
134
- ### 8. Mark handled without sending
138
+ ### 8. Mark handled and do not send
135
139
 
136
- When a thread is resolved through other channels:
140
+ When other channels resolve a thread:
137
141
 
138
142
  ```bash
139
143
  echo "$EMAIL_ID" >> Drafts/handled
@@ -1,6 +1,6 @@
1
1
  # Draft File Template
2
2
 
3
- Save each draft to `Drafts/{email_id}_draft.md` using this layout:
3
+ Save each draft to `Drafts/{email_id}_draft.md` with this layout:
4
4
 
5
5
  ```markdown
6
6
  # Draft Response
@@ -22,5 +22,5 @@ Save each draft to `Drafts/{email_id}_draft.md` using this layout:
22
22
  ```
23
23
 
24
24
  The body must end with the last sentence of content. Apple Mail appends the
25
- user's configured signature automatically, so do **not** add a sign-off, "Best",
25
+ user's configured signature automatically. So do **not** add a sign-off, "Best",
26
26
  "Cheers", or the user's name.