@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.
- package/README.md +2 -2
- package/bin/fit-outpost.js +3 -2
- package/package.json +4 -4
- package/src/agent-path.js +10 -6
- package/src/agent-runner.js +28 -24
- package/src/index.js +2 -3
- package/src/kb-manager.js +21 -19
- package/src/outpost.js +37 -33
- package/src/posture.js +3 -3
- package/src/privilege.js +11 -11
- package/src/scheduler.js +14 -12
- package/src/socket-server.js +19 -18
- package/src/spawn-env.js +7 -6
- package/src/state-manager.js +2 -2
- package/templates/.claude/agents/chief-of-staff.md +22 -22
- package/templates/.claude/agents/concierge.md +19 -17
- package/templates/.claude/agents/head-hunter.md +27 -26
- package/templates/.claude/agents/librarian.md +17 -16
- package/templates/.claude/agents/postman.md +19 -18
- package/templates/.claude/agents/recruiter.md +31 -27
- package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
- package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
- package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
- package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
- package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
- package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
- package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
- package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
- package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
- package/templates/.claude/skills/candidate-report/references/report.css +4 -4
- package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
- package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
- package/templates/.claude/skills/changelog/SKILL.md +55 -50
- package/templates/.claude/skills/deck-create/SKILL.md +30 -30
- package/templates/.claude/skills/deck-create/references/slide.css +4 -4
- package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/deck-review/SKILL.md +59 -57
- package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
- package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
- package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
- package/templates/.claude/skills/doc-create/SKILL.md +21 -20
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
- package/templates/.claude/skills/draft-emails/references/template.md +2 -2
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
- package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
- package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
- package/templates/.claude/skills/extract-entities/references/content.md +10 -9
- package/templates/.claude/skills/extract-entities/references/links.md +5 -5
- package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
- package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
- package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
- package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
- package/templates/.claude/skills/organize-files/SKILL.md +24 -22
- package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
- package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
- package/templates/.claude/skills/person-identify/SKILL.md +24 -22
- package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
- package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
- package/templates/.claude/skills/req-assess/SKILL.md +27 -27
- package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
- package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
- package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
- package/templates/.claude/skills/req-decide/SKILL.md +28 -25
- package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
- package/templates/.claude/skills/req-forget/SKILL.md +28 -26
- package/templates/.claude/skills/req-forget/references/classify.md +13 -13
- package/templates/.claude/skills/req-forget/references/locations.md +2 -2
- package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
- package/templates/.claude/skills/req-scan/SKILL.md +21 -22
- package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
- package/templates/.claude/skills/req-scan/references/filters.md +13 -13
- package/templates/.claude/skills/req-scan/references/sources.md +7 -7
- package/templates/.claude/skills/req-scan/references/state.md +1 -1
- package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
- package/templates/.claude/skills/req-screen/SKILL.md +31 -29
- package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
- package/templates/.claude/skills/req-screen/references/template.md +4 -4
- package/templates/.claude/skills/req-track/SKILL.md +40 -40
- package/templates/.claude/skills/req-track/references/fields.md +19 -18
- package/templates/.claude/skills/req-track/references/signals.md +12 -12
- package/templates/.claude/skills/req-track/references/statuses.md +3 -2
- package/templates/.claude/skills/req-track/references/templates.md +4 -4
- package/templates/.claude/skills/req-workday/SKILL.md +24 -24
- package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
- package/templates/.claude/skills/req-workday/references/templates.md +13 -13
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
- package/templates/.claude/skills/send-chat/SKILL.md +47 -43
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -19
- package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
- package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
- package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
- package/templates/.claude/skills/sync-apple-mail/SKILL.md +17 -14
- package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
- package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
- package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
- package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
- package/templates/.claude/skills/sync-teams/SKILL.md +43 -43
- package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
- package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
- package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
- package/templates/.claude/skills/upstream-instructions/SKILL.md +39 -40
- package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
- 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
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
17
|
-
of a specification or proposal deck for
|
|
18
|
-
|
|
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
|
|
39
|
-
- [ ] Plain language
|
|
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
|
|
42
|
-
statement
|
|
43
|
-
- [ ]
|
|
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
|
-
- [ ]
|
|
47
|
-
|
|
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
|
|
70
|
+
Read all extracted text before you continue.
|
|
69
71
|
|
|
70
72
|
### 2. Identify the core problem
|
|
71
73
|
|
|
72
|
-
|
|
73
|
-
painful
|
|
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
|
|
80
|
-
proposed solution. A job should still make sense if you discard the
|
|
81
|
-
solution. Don't restate the deck's feature list as jobs
|
|
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
|
|
91
|
-
integration does
|
|
92
|
-
|
|
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
|
|
95
|
-
engineering can proceed. Flag long lead-time items (legal,
|
|
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
|
|
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
|
|
107
|
-
|
|
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
|
|
112
|
-
terms
|
|
113
|
-
they
|
|
114
|
-
|
|
115
|
-
|
|
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
|
|
120
|
-
training-data strategy
|
|
121
|
-
cases
|
|
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
|
|
139
|
+
Tell the user the file path. Give a 3-sentence project summary.
|
|
134
140
|
|
|
135
|
-
##
|
|
141
|
+
## Style
|
|
136
142
|
|
|
137
|
-
|
|
138
|
-
when
|
|
139
|
-
scan
|
|
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
|
|
81
|
-
preprocessing
|
|
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
|
|
6
|
-
* from each slide
|
|
7
|
-
*
|
|
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
|
-
*
|
|
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
|
|
140
|
-
*
|
|
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
|
|
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.
|
|
9
|
-
direct
|
|
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
|
-
-
|
|
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
|
-
**
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
##
|
|
50
|
+
## Process Flow
|
|
51
51
|
|
|
52
52
|
### Step 1: Find the Document
|
|
53
53
|
|
|
54
|
-
Search thoroughly before
|
|
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
|
|
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
|
-
**
|
|
64
|
+
**Create a new document:**
|
|
65
65
|
|
|
66
66
|
1. Ask: "Shall I create Knowledge/[name].md?"
|
|
67
|
-
2. Create with just a title
|
|
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
|
|
73
|
-
|
|
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
|
|
87
|
-
|
|
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
|
-
##
|
|
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
|
|
111
|
-
- Preserve the user's voice
|
|
112
|
-
- Only link to notes that exist
|
|
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
|
|
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.
|
|
10
|
-
render self-contained HTML to PDF.
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
53
|
-
|
|
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
|
|
64
|
-
|
|
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
|
|
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
|
|
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
|
|
82
|
-
or font sizes
|
|
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
|
|
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
|
-
-
|
|
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
|
|
3
|
+
* Convert an HTML document to an A4 PDF with Playwright.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* zero margins
|
|
7
|
-
* @page rules and page-break-after
|
|
8
|
-
* the
|
|
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
|
|
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
|
|
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
|
|
9
|
-
context on every person and conversation. Every draft
|
|
10
|
-
approval before
|
|
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
|
|
35
|
-
`ignored` for threads that need no response (newsletters, spam,
|
|
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
|
-
- [ ]
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- [ ]
|
|
45
|
-
|
|
46
|
-
- [ ]
|
|
47
|
-
|
|
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
|
-
|
|
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
|
|
74
|
+
Be conservative with ignore. When in doubt, draft.
|
|
73
75
|
|
|
74
76
|
### 3. Gather context
|
|
75
77
|
|
|
76
|
-
Before
|
|
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
|
|
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
|
|
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`
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
115
|
-
edits
|
|
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
|
|
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
|
|
132
|
-
|
|
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
|
|
138
|
+
### 8. Mark handled and do not send
|
|
135
139
|
|
|
136
|
-
When
|
|
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`
|
|
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
|
|
25
|
+
user's configured signature automatically. So do **not** add a sign-off, "Best",
|
|
26
26
|
"Cheers", or the user's name.
|