@forwardimpact/outpost 3.3.3 → 3.4.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 (65) hide show
  1. package/LICENSE +21 -201
  2. package/config/skill-postures.json +28 -0
  3. package/package.json +1 -1
  4. package/src/agent-runner.js +52 -1
  5. package/src/kb-manager.js +5 -7
  6. package/src/outpost.js +42 -0
  7. package/src/posture.js +77 -0
  8. package/src/socket-server.js +1 -5
  9. package/templates/.claude/agents/chief-of-staff.md +24 -9
  10. package/templates/.claude/agents/concierge.md +14 -0
  11. package/templates/.claude/agents/head-hunter.md +14 -0
  12. package/templates/.claude/agents/librarian.md +19 -7
  13. package/templates/.claude/agents/postman.md +14 -0
  14. package/templates/.claude/agents/recruiter.md +21 -12
  15. package/templates/.claude/skills/anarlog-follow/SKILL.md +7 -7
  16. package/templates/.claude/skills/anarlog-process/SKILL.md +15 -16
  17. package/templates/.claude/skills/anarlog-process/references/extraction.md +5 -5
  18. package/templates/.claude/skills/candidate-report/SKILL.md +9 -9
  19. package/templates/.claude/skills/deck-create/SKILL.md +2 -2
  20. package/templates/.claude/skills/deck-summarize/SKILL.md +2 -2
  21. package/templates/.claude/skills/deck-summarize/references/brief-template.md +1 -1
  22. package/templates/.claude/skills/doc-collab/SKILL.md +8 -8
  23. package/templates/.claude/skills/doc-create/SKILL.md +3 -3
  24. package/templates/.claude/skills/draft-emails/SKILL.md +19 -19
  25. package/templates/.claude/skills/draft-emails/references/template.md +1 -1
  26. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +4 -4
  27. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +2 -2
  28. package/templates/.claude/skills/extract-entities/SKILL.md +16 -17
  29. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +2 -2
  30. package/templates/.claude/skills/extract-entities/references/conditions.md +4 -4
  31. package/templates/.claude/skills/extract-entities/references/links.md +3 -18
  32. package/templates/.claude/skills/extract-entities/references/recruitment.md +8 -8
  33. package/templates/.claude/skills/extract-entities/references/resolution.md +3 -5
  34. package/templates/.claude/skills/extract-entities/references/sources.md +1 -1
  35. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
  36. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +32 -0
  37. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +2 -2
  38. package/templates/.claude/skills/meeting-prep/SKILL.md +18 -19
  39. package/templates/.claude/skills/req-assess/SKILL.md +11 -11
  40. package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
  41. package/templates/.claude/skills/req-assess/references/panel-template.md +1 -1
  42. package/templates/.claude/skills/req-decide/SKILL.md +17 -17
  43. package/templates/.claude/skills/req-decide/references/template.md +1 -1
  44. package/templates/.claude/skills/req-forget/SKILL.md +8 -8
  45. package/templates/.claude/skills/req-forget/references/classify.md +4 -4
  46. package/templates/.claude/skills/req-forget/references/locations.md +10 -10
  47. package/templates/.claude/skills/req-forget/references/report-template.md +8 -8
  48. package/templates/.claude/skills/req-scan/SKILL.md +3 -3
  49. package/templates/.claude/skills/req-scan/references/template.md +1 -1
  50. package/templates/.claude/skills/req-screen/SKILL.md +9 -9
  51. package/templates/.claude/skills/req-screen/references/template.md +1 -1
  52. package/templates/.claude/skills/req-track/SKILL.md +17 -17
  53. package/templates/.claude/skills/req-track/references/fields.md +8 -8
  54. package/templates/.claude/skills/req-track/references/signals.md +2 -2
  55. package/templates/.claude/skills/req-track/references/templates.md +1 -1
  56. package/templates/.claude/skills/req-workday/SKILL.md +12 -12
  57. package/templates/.claude/skills/req-workday/references/templates.md +3 -3
  58. package/templates/.claude/skills/send-chat/SKILL.md +4 -4
  59. package/templates/.claude/skills/upstream-instructions/SKILL.md +154 -0
  60. package/templates/.claude/skills/upstream-instructions/references/examples.md +97 -0
  61. package/templates/CLAUDE.md +47 -53
  62. package/templates/.claude/skills/extract-entities/references/templates-goals-priorities.md +0 -63
  63. package/templates/.claude/skills/upstream-skill/SKILL.md +0 -130
  64. package/templates/.claude/skills/upstream-skill/references/examples.md +0 -80
  65. package/templates/knowledge/Briefings/.gitkeep +0 -0
@@ -19,6 +19,19 @@ benchmark promising matches, and write prospect notes for the user to review.
19
19
 
20
20
  **You never contact candidates.** Outreach is the user's call.
21
21
 
22
+ ## Priorities
23
+
24
+ At the start of every wake, before acting, read `Knowledge/Priorities/`. The
25
+ user's priorities are the lens for all your work this wake.
26
+
27
+ - **Always consider them.** Weigh each action against whether it advances a
28
+ priority, and favour work that does.
29
+ - **Always flag risks.** When you encounter a chat, email, transcript, or any
30
+ other signal that could **contradict, block, or slow** a priority, record it
31
+ under a `## Priority Watch` heading in your triage report — name the priority,
32
+ quote the evidence, and state the risk — and echo it in the `Priority Watch`
33
+ line of your output. Never let such a signal pass silently.
34
+
22
35
  ## Routing
23
36
 
24
37
  | Trigger | Skill |
@@ -54,4 +67,5 @@ wake — the chief-of-staff reads it.
54
67
  Decision: {source chosen and why}
55
68
  Action: {what was scanned, e.g. "scanned HN Who Wants to Be Hired March 2026, 47 posts"}
56
69
  Prospects: {N} new ({strong} strong, {moderate} moderate), {total} total
70
+ Priority Watch: {priority at risk + one-line why, or "none"}
57
71
  ```
@@ -14,6 +14,19 @@ skills:
14
14
  You are the librarian — the user's knowledge curator. Each time you are woken,
15
15
  you process new data into the knowledge graph and keep everything organized.
16
16
 
17
+ ## Priorities
18
+
19
+ At the start of every wake, before acting, read `Knowledge/Priorities/`. The
20
+ user's priorities are the lens for all your work this wake.
21
+
22
+ - **Always consider them.** Weigh each action against whether it advances a
23
+ priority, and favour work that does.
24
+ - **Always flag risks.** When you encounter a chat, email, transcript, or any
25
+ other signal that could **contradict, block, or slow** a priority, record it
26
+ under a `## Priority Watch` heading in your triage report — name the priority,
27
+ quote the evidence, and state the risk — and echo it in the `Priority Watch`
28
+ line of your output. Never let such a signal pass silently.
29
+
17
30
  ## 1. Observe
18
31
 
19
32
  Assess what needs processing:
@@ -24,21 +37,19 @@ Assess what needs processing:
24
37
 
25
38
  2. Count existing knowledge graph entities:
26
39
 
27
- ls knowledge/People/ knowledge/Organizations/ knowledge/Projects/
28
- knowledge/Topics/ knowledge/Goals/ knowledge/Priorities/ 2>/dev/null | wc -l
40
+ ls Knowledge/People/ Knowledge/Organizations/ Knowledge/Projects/
41
+ Knowledge/Topics/ Knowledge/Priorities/ 2>/dev/null | wc -l
29
42
 
30
43
  Write triage results to `~/.cache/fit/outpost/state/librarian_triage.md`:
31
44
 
32
45
  ```
33
46
  # Knowledge Triage — {YYYY-MM-DD HH:MM}
34
-
35
47
  ## Pending Processing
36
48
  - {count} unprocessed synced files
37
-
38
49
  ## Knowledge Graph
39
- - {count} People / {count} Organizations / {count} Projects / {count} Topics
40
- - {count} Goals / {count} Priorities
41
-
50
+ - {count} People / {count} Orgs / {count} Projects / {count} Topics / {count} Priorities
51
+ ## Priority Watch
52
+ - {priority risks found while processing, or "none"}
42
53
  ## Summary
43
54
  {unprocessed} files to process, graph has {total} entities
44
55
  ```
@@ -56,4 +67,5 @@ After acting, output exactly:
56
67
  ```
57
68
  Decision: {what you observed and why you chose this action}
58
69
  Action: {what you did, e.g. "extract-entities on 7 files"}
70
+ Priority Watch: {priority at risk + one-line why, or "none"}
59
71
  ```
@@ -15,6 +15,19 @@ skills:
15
15
  You are the postman — the user's communication gatekeeper. Each wake: sync mail
16
16
  and Teams, triage what's new, take the most valuable action.
17
17
 
18
+ ## Priorities
19
+
20
+ At the start of every wake, before acting, read `Knowledge/Priorities/`. The
21
+ user's priorities are the lens for all your work this wake.
22
+
23
+ - **Always consider them.** Weigh each action against whether it advances a
24
+ priority, and favour work that does.
25
+ - **Always flag risks.** When you encounter a chat, email, transcript, or any
26
+ other signal that could **contradict, block, or slow** a priority, record it
27
+ under a `## Priority Watch` heading in your triage report — name the priority,
28
+ quote the evidence, and state the risk — and echo it in the `Priority Watch`
29
+ line of your output. Never let such a signal pass silently.
30
+
18
31
  ## Routing
19
32
 
20
33
  | Trigger | Skill |
@@ -44,4 +57,5 @@ After acting, emit exactly:
44
57
  ```
45
58
  Decision: {what you observed and why you chose this action}
46
59
  Action: {what you did, e.g. "draft-emails for thread 123"}
60
+ Priority Watch: {priority at risk + one-line why, or "none"}
47
61
  ```
@@ -3,8 +3,7 @@ name: recruiter
3
3
  description: >
4
4
  The user's engineering recruitment specialist. Screens CVs, assesses
5
5
  interviews, and produces hiring recommendations grounded in the fit-pathway
6
- agent-aligned engineering standard. Maintains a three-stage hiring pipeline.
7
- Woken on a schedule by the Outpost scheduler.
6
+ agent-aligned engineering standard. Woken on a schedule by the Outpost scheduler.
8
7
  model: sonnet
9
8
  permissionMode: bypassPermissions
10
9
  skills:
@@ -18,8 +17,21 @@ skills:
18
17
  ---
19
18
 
20
19
  You are the recruiter — the user's engineering recruitment specialist. The
21
- single source of truth for "good engineering" is the `fit-pathway` CLI. Every
22
- assessment, comparison, and recommendation references the standard.
20
+ single source of truth for "good engineering" is the `fit-pathway` CLI; every
21
+ assessment and recommendation references the standard.
22
+
23
+ ## Priorities
24
+
25
+ At the start of every wake, before acting, read `Knowledge/Priorities/`. The
26
+ user's priorities are the lens for all your work this wake.
27
+
28
+ - **Always consider them.** Weigh each action against whether it advances a
29
+ priority, and favour work that does.
30
+ - **Always flag risks.** When you encounter a chat, email, transcript, or any
31
+ other signal that could **contradict, block, or slow** a priority, record it
32
+ under a `## Priority Watch` heading in your triage report — name the priority,
33
+ quote the evidence, and state the risk — and echo it in the `Priority Watch`
34
+ line of your output. Never let such a signal pass silently.
23
35
 
24
36
  ## Routing
25
37
 
@@ -40,19 +52,15 @@ screen > sync. Stage 3 **never** triggers automatically — only on user request
40
52
  Present level estimates with confidence language ("likely J060").
41
53
  - **Standard-grounded.** Use `bunx fit-pathway job/skill/progress/interview`
42
54
  before claiming fit, gaps, or level.
43
- - **Data minimization.** Record only role-relevant data. No special-category
44
- data. Flag inactive rejected/withdrawn candidates after 6 months for the user
45
- to decide.
55
+ - **Data minimization.** Record only role-relevant data; no special-category
56
+ data. Flag inactive rejected/withdrawn candidates after 6 months for the user.
46
57
  - **Aggregate diversity only.** Track pool-level gender stats; never sort,
47
58
  filter, or rank by protected characteristics. Gender recorded only from
48
59
  explicit pronouns/titles, never name-inferred.
49
- - Strategic links to `knowledge/Priorities/` and `knowledge/Goals/` belong in
50
- the triage report when a hiring priority is live.
51
60
 
52
61
  Triage state goes to `~/.cache/fit/outpost/state/recruiter_triage.md` every wake
53
- the chief-of-staff reads it. The triage covers needs-action by stage, recently
54
- processed candidates, pipeline totals by stage and track, aggregate diversity,
55
- and any data-retention flags.
62
+ (the chief-of-staff reads it): needs-action by stage, recently processed
63
+ candidates, pipeline totals by stage/track, aggregate diversity, retention flags.
56
64
 
57
65
  ## Output
58
66
 
@@ -60,4 +68,5 @@ and any data-retention flags.
60
68
  Decision: {observation and chosen action}
61
69
  Action: {e.g. "req-screen for John Smith against J060 forward_deployed"}
62
70
  Stage: {1 | 2 | sync | erasure}
71
+ Priority Watch: {priority at risk + one-line why, or "none"}
63
72
  ```
@@ -31,8 +31,8 @@ content appears.
31
31
  ## Inputs
32
32
 
33
33
  - Live `transcript.json` (growing during the session).
34
- - `knowledge/People/`, `knowledge/Candidates/{Name}/{brief,screening,panel}.md`,
35
- `knowledge/Roles/`, `knowledge/Organizations/`, `knowledge/Projects/`.
34
+ - `Knowledge/People/`, `Knowledge/Candidates/{Name}/{brief,screening,panel}.md`,
35
+ `Knowledge/Roles/`, `Knowledge/Organizations/`, `Knowledge/Projects/`.
36
36
  - `~/.cache/fit/outpost/apple_calendar/*.json` for context.
37
37
 
38
38
  ## Outputs
@@ -91,8 +91,8 @@ Phase 2 context loading and Phase 3 dimensions.
91
91
  Extract names from title and participant list. For each:
92
92
 
93
93
  ```bash
94
- rg -l "{name}" knowledge/People/
95
- rg -l "{name}" knowledge/Candidates/
94
+ rg -l "{name}" Knowledge/People/
95
+ rg -l "{name}" Knowledge/Candidates/
96
96
  ```
97
97
 
98
98
  Read matching notes for role, organization, history, open items, prior
@@ -100,8 +100,8 @@ interactions.
100
100
 
101
101
  #### 5. Load type-specific context
102
102
 
103
- **Interviews:** read `knowledge/Candidates/{Name}/{brief,screening,panel}.md`,
104
- look up the `Req` field's matching `knowledge/Roles/*.md`, and load standard
103
+ **Interviews:** read `Knowledge/Candidates/{Name}/{brief,screening,panel}.md`,
104
+ look up the `Req` field's matching `Knowledge/Roles/*.md`, and load standard
105
105
  expectations:
106
106
 
107
107
  ```bash
@@ -109,7 +109,7 @@ bunx fit-pathway job {discipline} {level} --track={track}
109
109
  ```
110
110
 
111
111
  **General meetings:** read attendee People notes plus referenced
112
- Project/Organization notes. Check open tasks: `rg "{name}" knowledge/Tasks/`.
112
+ Project/Organization notes. Check open tasks: `rg "{name}" Knowledge/Tasks/`.
113
113
 
114
114
  #### 6. Build the coaching brief
115
115
 
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: anarlog-process
3
- description: Process Anarlog meeting sessions (memos, summaries, transcripts) into the knowledge graph. Extracts people, organizations, projects, and topics from AI-generated meeting summaries and user notes, creating or updating Obsidian-compatible notes in knowledge/. Use when the user asks to process meeting notes or after Anarlog sessions.
3
+ description: Process Anarlog meeting sessions (memos, summaries, transcripts) into the knowledge graph. Extracts people, organizations, projects, and topics from AI-generated meeting summaries and user notes, creating or updating Obsidian-compatible notes in Knowledge/. Use when the user asks to process meeting notes or after Anarlog sessions.
4
4
  ---
5
5
 
6
6
  # Process Anarlog
7
7
 
8
8
  Process meeting sessions from Anarlog (a local AI meeting-notes app) into the
9
9
  knowledge graph. Anarlog records meetings, transcribes them, and generates AI
10
- summaries; this skill reads that output and feeds it into `knowledge/` — the
10
+ summaries; this skill reads that output and feeds it into `Knowledge/` — the
11
11
  same way `extract-entities` processes emails and calendar events.
12
12
 
13
13
  ## Trigger
@@ -35,9 +35,9 @@ same way `extract-entities` processes emails and calendar events.
35
35
 
36
36
  ## Outputs
37
37
 
38
- - `knowledge/People/`, `knowledge/Organizations/`, `knowledge/Projects/`,
39
- `knowledge/Topics/` — created or updated.
40
- - `knowledge/Goals/`, `knowledge/Priorities/` — **updated only**, never
38
+ - `Knowledge/People/`, `Knowledge/Organizations/`, `Knowledge/Projects/`,
39
+ `Knowledge/Topics/` — created or updated.
40
+ - `Knowledge/Priorities/` — **updated only**, never
41
41
  auto-created.
42
42
  - `~/.cache/fit/outpost/state/graph_processed` — updated.
43
43
 
@@ -47,12 +47,12 @@ same way `extract-entities` processes emails and calendar events.
47
47
  - [ ] Both `_memo.md` and `_summary.md` read (when present); transcript
48
48
  consulted only for disambiguation.
49
49
  - [ ] "Would I prep?" test applied to each person; self excluded.
50
- - [ ] Interview sessions wrote to `knowledge/Candidates/`, not
51
- `knowledge/People/`.
50
+ - [ ] Interview sessions wrote to `Knowledge/Candidates/`, not
51
+ `Knowledge/People/`.
52
52
  - [ ] All links use absolute paths `[[Folder/Name]]`.
53
53
  - [ ] Activity entries describe relationship, not communication method.
54
- - [ ] No new `Goals/` or `Priorities/` auto-created (user-set only); any
55
- referenced goal had its progress updated.
54
+ - [ ] No new `Priorities/` auto-created (user-set only); any
55
+ referenced priority had its progress updated.
56
56
  - [ ] `graph_processed` updated for every processed file (memo + summary).
57
57
 
58
58
  </do_confirm_checklist>
@@ -83,9 +83,9 @@ metadata fallback).
83
83
  ### 1. Build the knowledge index
84
84
 
85
85
  ```bash
86
- ls knowledge/People/ knowledge/Organizations/ knowledge/Projects/ \
87
- knowledge/Topics/ knowledge/Goals/ knowledge/Priorities/ \
88
- knowledge/Conditions/ 2>/dev/null
86
+ ls Knowledge/People/ Knowledge/Organizations/ Knowledge/Projects/ \
87
+ Knowledge/Topics/ Knowledge/Priorities/ \
88
+ Knowledge/Conditions/ 2>/dev/null
89
89
  ```
90
90
 
91
91
  Read each note's header to build a mental index of known entities (same approach
@@ -104,7 +104,7 @@ Anarlog sessions are **meetings** and follow the meeting rules from
104
104
  `extract-entities`:
105
105
 
106
106
  - **Can create** People, Organization, Project, and Topic notes.
107
- - **Can update** existing notes — including Goals and Priorities, which are
107
+ - **Can update** existing notes — including Priorities, which are
108
108
  user-set and never auto-created.
109
109
  - **Can detect** state changes.
110
110
 
@@ -123,7 +123,7 @@ interview-note rules, and linking rules — live in
123
123
  For **new** entities, use the templates in
124
124
  `.claude/skills/extract-entities/references/TEMPLATES.md`. For interview
125
125
  sessions, use the candidate brief template from `req-track` (under
126
- `knowledge/Candidates/`).
126
+ `Knowledge/Candidates/`).
127
127
 
128
128
  For **existing** entities, apply targeted edits — never rewrite the file:
129
129
 
@@ -133,8 +133,7 @@ For **existing** entities, apply targeted edits — never rewrite the file:
133
133
  - Update open items (mark completed, add new).
134
134
  - Apply state changes.
135
135
 
136
- Verify bidirectional links per `extract-entities` Step 10 (GoalProject, Goal
137
- ↔ Priority, Project ↔ Priority).
136
+ Verify bidirectional links per `extract-entities` Step 10 (ProjectPriority).
138
137
 
139
138
  ### 6. Update graph state
140
139
 
@@ -39,8 +39,8 @@ Never create or update a note for the user — match against name, email, or
39
39
  ## Interview sessions (special case)
40
40
 
41
41
  If the title or memo indicates "interview with {Name}", the interviewee is a
42
- **candidate** — create or update their note in `knowledge/Candidates/` (using
43
- the candidate brief template from `req-track`), **not** in `knowledge/People/`.
42
+ **candidate** — create or update their note in `Knowledge/Candidates/` (using
43
+ the candidate brief template from `req-track`), **not** in `Knowledge/People/`.
44
44
 
45
45
  ## Content signals
46
46
 
@@ -77,8 +77,8 @@ strengths and concerns, any interview scoring or decisions.
77
77
  ## Linking rules
78
78
 
79
79
  Use absolute paths everywhere: `[[People/Name]]`, `[[Organizations/Name]]`,
80
- `[[Projects/Name]]`, `[[Goals/Goal Name]]`, `[[Priorities/Priority Name]]`.
80
+ `[[Projects/Name]]`, `[[Priorities/Priority Name]]`.
81
81
 
82
- When meeting content references an existing Goal or Priority, follow the linking
82
+ When meeting content references an existing Priority, follow the linking
83
83
  rules in `extract-entities` Step 7c — update progress and add backlinks, but
84
- **never** auto-create Goal or Priority notes.
84
+ **never** auto-create Priority notes.
@@ -25,11 +25,11 @@ before deciding whether to invest interview time.
25
25
  - `@forwardimpact/pathway` CLI installed (`bunx fit-pathway --help`).
26
26
  - Playwright for PDF output
27
27
  (`bun install playwright && bunx playwright install chromium`).
28
- - Candidate has a `brief.md` in `knowledge/Candidates/{Name}/`.
28
+ - Candidate has a `brief.md` in `Knowledge/Candidates/{Name}/`.
29
29
 
30
30
  ## Inputs
31
31
 
32
- - **Candidate name** — locates `knowledge/Candidates/{Name}/brief.md`.
32
+ - **Candidate name** — locates `Knowledge/Candidates/{Name}/brief.md`.
33
33
  - **Target role** — discipline, level, track (e.g.
34
34
  `software_engineering J070 forward_deployed`). If not given, infer from the
35
35
  candidate's `Req` field → Role file. Ask the user if it can't be inferred.
@@ -38,7 +38,7 @@ before deciding whether to invest interview time.
38
38
 
39
39
  ## Outputs
40
40
 
41
- - `drafts/{Recipient}-{CandidateSurname}-Report.html` — the A4 one-pager.
41
+ - `Drafts/{Recipient}-{CandidateSurname}-Report.html` — the A4 one-pager.
42
42
  - Optional PDF via `scripts/render-pdf.mjs`.
43
43
 
44
44
  <do_confirm_checklist goal="Verify the report before delivering it">
@@ -62,16 +62,16 @@ before deciding whether to invest interview time.
62
62
  Read whatever exists for the candidate:
63
63
 
64
64
  ```
65
- knowledge/Candidates/{Name}/brief.md # required
66
- knowledge/Candidates/{Name}/screening.md # if produced by req-screen
67
- knowledge/Candidates/{Name}/interview-*.md # if produced by req-assess
68
- knowledge/Candidates/{Name}/CV.pdf|CV.md # raw CV if needed
65
+ Knowledge/Candidates/{Name}/brief.md # required
66
+ Knowledge/Candidates/{Name}/screening.md # if produced by req-screen
67
+ Knowledge/Candidates/{Name}/interview-*.md # if produced by req-assess
68
+ Knowledge/Candidates/{Name}/CV.pdf|CV.md # raw CV if needed
69
69
  ```
70
70
 
71
71
  If `screening.md` exists, treat its skill and behaviour ratings as the primary
72
72
  source — they're already standard-calibrated. Otherwise map manually in Step 3.
73
73
 
74
- Search the graph for surrounding context: `rg "{Candidate Name}" knowledge/`.
74
+ Search the graph for surrounding context: `rg "{Candidate Name}" Knowledge/`.
75
75
 
76
76
  ### 2. Load the standard benchmark
77
77
 
@@ -119,7 +119,7 @@ preview overflows, cut content.
119
119
  Save the completed HTML to:
120
120
 
121
121
  ```
122
- drafts/{Recipient}-{CandidateSurname}-Report.html
122
+ Drafts/{Recipient}-{CandidateSurname}-Report.html
123
123
  ```
124
124
 
125
125
  `{Recipient}` is the first name of the person the report is for.
@@ -22,7 +22,7 @@ Run when the user asks to create a presentation, slide deck, or pitch deck.
22
22
  ## Inputs
23
23
 
24
24
  - User's description of the presentation
25
- - `knowledge/` — optional context about company, product, team, projects
25
+ - `Knowledge/` — optional context about company, product, team, projects
26
26
 
27
27
  ## Outputs
28
28
 
@@ -32,7 +32,7 @@ Run when the user asks to create a presentation, slide deck, or pitch deck.
32
32
 
33
33
  ## Workflow
34
34
 
35
- 1. Check `knowledge/` for relevant context about the company, product, team,
35
+ 1. Check `Knowledge/` for relevant context about the company, product, team,
36
36
  etc.
37
37
  2. Ensure Playwright is installed:
38
38
  `bun install playwright && bunx playwright install chromium`
@@ -30,7 +30,7 @@ from a slide deck; or understand what a project deck is actually asking for.
30
30
  ## Outputs
31
31
 
32
32
  - One markdown file per deck (or one combined file for related decks) written to
33
- `knowledge/Projects/{Project Name} - Engineering Brief.md`.
33
+ `Knowledge/Projects/{Project Name} - Engineering Brief.md`.
34
34
 
35
35
  <do_confirm_checklist goal="Verify the brief is engineer-actionable before
36
36
  delivering">
@@ -125,7 +125,7 @@ mismatches.
125
125
 
126
126
  Use the structure in
127
127
  [references/brief-template.md](references/brief-template.md). Save to
128
- `knowledge/Projects/{Project Name} - Engineering Brief.md`. For multiple related
128
+ `Knowledge/Projects/{Project Name} - Engineering Brief.md`. For multiple related
129
129
  decks, write one combined brief with shared dependencies.
130
130
 
131
131
  ### 9. Save and report
@@ -1,7 +1,7 @@
1
1
  # Engineering Brief Template
2
2
 
3
3
  Reference template for `deck-summarize` Step 8. Save the assembled brief to
4
- `knowledge/Projects/{Project Name} - Engineering Brief.md`.
4
+ `Knowledge/Projects/{Project Name} - Engineering Brief.md`.
5
5
 
6
6
  ```markdown
7
7
  ---
@@ -20,12 +20,12 @@ Run when the user asks to create, edit, review, or collaborate on a document.
20
20
  ## Inputs
21
21
 
22
22
  - User's editing instructions
23
- - `knowledge/` — existing notes and documents
23
+ - `Knowledge/` — existing notes and documents
24
24
  - Document to edit (user-specified or searched)
25
25
 
26
26
  ## Outputs
27
27
 
28
- - Created or modified documents in `knowledge/` or user-specified location
28
+ - Created or modified documents in `Knowledge/` or user-specified location
29
29
 
30
30
  ---
31
31
 
@@ -54,8 +54,8 @@ Follow their choice for the entire session.
54
54
  Search thoroughly before saying a document doesn't exist:
55
55
 
56
56
  ```bash
57
- rg -l -i "roadmap" knowledge/
58
- find knowledge/ -iname "*roadmap*" 2>/dev/null
57
+ rg -l -i "roadmap" Knowledge/
58
+ find Knowledge/ -iname "*roadmap*" 2>/dev/null
59
59
  ```
60
60
 
61
61
  **If found:** Read it and proceed. **If NOT found:** Ask "I couldn't find
@@ -63,7 +63,7 @@ find knowledge/ -iname "*roadmap*" 2>/dev/null
63
63
 
64
64
  **Creating new documents:**
65
65
 
66
- 1. Ask: "Shall I create knowledge/[name].md?"
66
+ 1. Ask: "Shall I create Knowledge/[name].md?"
67
67
  2. Create with just a title — don't pre-populate with structure
68
68
  3. Ask: "What would you like in this?"
69
69
 
@@ -97,9 +97,9 @@ don't reorganize unless asked.
97
97
  When the user mentions people, companies, or projects:
98
98
 
99
99
  ```bash
100
- rg -l "Name" knowledge/
101
- cat "knowledge/People/Person.md"
102
- cat "knowledge/Organizations/Company.md"
100
+ rg -l "Name" Knowledge/
101
+ cat "Knowledge/People/Person.md"
102
+ cat "Knowledge/Organizations/Company.md"
103
103
  ```
104
104
 
105
105
  Use `[[wiki-links]]` to connect to other notes. Only link to notes that exist.
@@ -23,18 +23,18 @@ submission, brief, or any multi-page PDF that is not a slide deck.
23
23
  ## Inputs
24
24
 
25
25
  - User's description of the document
26
- - `knowledge/` — optional context about company, product, team, projects
26
+ - `Knowledge/` — optional context about company, product, team, projects
27
27
 
28
28
  ## Outputs
29
29
 
30
30
  - An HTML file and a PDF rendered from it, placed where the user specifies
31
- (default: `knowledge/Projects/`)
31
+ (default: `Knowledge/Projects/`)
32
32
 
33
33
  ---
34
34
 
35
35
  ## Workflow
36
36
 
37
- 1. Check `knowledge/` for relevant context about the company, product, team,
37
+ 1. Check `Knowledge/` for relevant context about the company, product, team,
38
38
  projects, or people mentioned.
39
39
  2. Ensure Playwright is installed:
40
40
  `bun install playwright && bunx playwright install chromium`
@@ -22,13 +22,13 @@ The user asks to draft, reply to, respond to, or send an email.
22
22
 
23
23
  | Data | Location |
24
24
  | --------------- | -------------------------------------------- |
25
- | People | `knowledge/People/*.md` |
26
- | Organizations | `knowledge/Organizations/*.md` |
25
+ | People | `Knowledge/People/*.md` |
26
+ | Organizations | `Knowledge/Organizations/*.md` |
27
27
  | Email threads | `~/.cache/fit/outpost/apple_mail/*.md` |
28
28
  | Calendar events | `~/.cache/fit/outpost/apple_calendar/*.json` |
29
- | Handled IDs | `drafts/handled` (one ID per line) |
30
- | Ignored IDs | `drafts/ignored` (one ID per line) |
31
- | Draft files | `drafts/{email_id}_draft.md` |
29
+ | Handled IDs | `Drafts/handled` (one ID per line) |
30
+ | Ignored IDs | `Drafts/ignored` (one ID per line) |
31
+ | Draft files | `Drafts/{email_id}_draft.md` |
32
32
 
33
33
  `handled` and `ignored` both exclude threads from `scan-emails.mjs`. Use
34
34
  `handled` for resolved threads (sent here, replied manually, resolved via DM);
@@ -37,7 +37,7 @@ 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.
40
+ - [ ] Sender and organization were looked up in `Knowledge/` before drafting.
41
41
  - [ ] Draft is a single email (not multiple variants) and matches the incoming
42
42
  tone.
43
43
  - [ ] Body has no sign-off / name / "Best" — Apple Mail signature handles it.
@@ -45,7 +45,7 @@ reply).
45
45
  direct-to-candidate draft is flagged `⚠️ RECRUITER ONLY`.
46
46
  - [ ] No sensitive personal data (health, politics, etc.) was included.
47
47
  - [ ] User has explicitly approved the draft before any send.
48
- - [ ] Send used `--draft <path>` so cleanup and `drafts/handled` happen
48
+ - [ ] Send used `--draft <path>` so cleanup and `Drafts/handled` happen
49
49
  automatically.
50
50
 
51
51
  </do_confirm_checklist>
@@ -59,11 +59,11 @@ node scripts/scan-emails.mjs
59
59
  ```
60
60
 
61
61
  Outputs `email_id<TAB>subject` for unprocessed emails (those not in
62
- `drafts/handled` or `drafts/ignored`).
62
+ `Drafts/handled` or `Drafts/ignored`).
63
63
 
64
64
  ### 2. Classify
65
65
 
66
- **Ignore** (append ID to `drafts/ignored`): newsletters, marketing, automated
66
+ **Ignore** (append ID to `Drafts/ignored`): newsletters, marketing, automated
67
67
  notifications, spam, outbound with no reply.
68
68
 
69
69
  **Draft a response**: meeting requests, personal mail from known contacts,
@@ -73,12 +73,12 @@ Be conservative with ignore — when in doubt, draft.
73
73
 
74
74
  ### 3. Gather context
75
75
 
76
- Before drafting, look up the sender and organization in `knowledge/`:
76
+ Before drafting, look up the sender and organization in `Knowledge/`:
77
77
 
78
78
  ```bash
79
- rg -l "sender_name" knowledge/
80
- cat "knowledge/People/Sender Name.md"
81
- cat "knowledge/Organizations/Company Name.md"
79
+ rg -l "sender_name" Knowledge/
80
+ cat "Knowledge/People/Sender Name.md"
81
+ cat "Knowledge/Organizations/Company Name.md"
82
82
  ```
83
83
 
84
84
  For scheduling emails, also read the relevant calendar event:
@@ -93,7 +93,7 @@ unclear or the person has multiple contexts, **ask** rather than guess.
93
93
 
94
94
  ### 4. Write the draft
95
95
 
96
- Save to `drafts/{email_id}_draft.md` using the template in
96
+ Save to `Drafts/{email_id}_draft.md` using the template in
97
97
  [references/template.md](references/template.md). Reference past interactions
98
98
  naturally; for scheduling, propose specific times from calendar availability.
99
99
 
@@ -101,7 +101,7 @@ naturally; for scheduling, propose specific times from calendar availability.
101
101
 
102
102
  Candidates **must never** be copied on internal threads about them.
103
103
 
104
- - Identify the candidate from the thread and `knowledge/Candidates/`.
104
+ - Identify the candidate from the thread and `Knowledge/Candidates/`.
105
105
  - Strip the candidate from To/CC; draft to internal stakeholders only.
106
106
  - Direct-to-candidate emails carry the warning header
107
107
  `⚠️ RECRUITER ONLY — This email goes directly to the candidate.`
@@ -124,18 +124,18 @@ node scripts/send-email.mjs \
124
124
  --cc "other@example.com" \
125
125
  --subject "Re: Subject" \
126
126
  --body "Plain text body" \
127
- --draft "drafts/12345_draft.md"
127
+ --draft "Drafts/12345_draft.md"
128
128
  ```
129
129
 
130
130
  Required: `--to`, `--subject`, `--body` (plain text). Optional: `--cc`, `--bcc`,
131
131
  `--draft`. With `--draft`, the draft file is deleted and the email ID is
132
- appended to `drafts/handled` automatically.
132
+ appended to `Drafts/handled` automatically.
133
133
 
134
134
  ### 8. Mark handled without sending
135
135
 
136
136
  When a thread is resolved through other channels:
137
137
 
138
138
  ```bash
139
- echo "$EMAIL_ID" >> drafts/handled
140
- rm -f "drafts/${EMAIL_ID}_draft.md"
139
+ echo "$EMAIL_ID" >> Drafts/handled
140
+ rm -f "Drafts/${EMAIL_ID}_draft.md"
141
141
  ```
@@ -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` using this layout:
4
4
 
5
5
  ```markdown
6
6
  # Draft Response
@@ -3,7 +3,7 @@
3
3
  * Scan for unprocessed emails and output their IDs and subjects.
4
4
  *
5
5
  * Checks ~/.cache/fit/outpost/apple_mail/ for email thread markdown files not
6
- * yet listed in drafts/handled or drafts/ignored. Outputs one tab-separated
6
+ * yet listed in Drafts/handled or Drafts/ignored. Outputs one tab-separated
7
7
  * line per unprocessed thread: email_id<TAB>subject. Used by the draft-emails
8
8
  * skill to identify threads that need a reply.
9
9
  */
@@ -17,7 +17,7 @@ const HELP = `scan-emails — list unprocessed email threads
17
17
  Usage: node scripts/scan-emails.mjs [-h|--help]
18
18
 
19
19
  Scans ~/.cache/fit/outpost/apple_mail/ for .md thread files not yet
20
- recorded in drafts/handled or drafts/ignored. Outputs one line per
20
+ recorded in Drafts/handled or Drafts/ignored. Outputs one line per
21
21
  unprocessed thread as: email_id<TAB>subject`;
22
22
 
23
23
  if (process.argv.includes("-h") || process.argv.includes("--help")) {
@@ -49,8 +49,8 @@ function extractSubject(filePath) {
49
49
  function main() {
50
50
  if (!existsSync(MAIL_DIR)) return;
51
51
 
52
- const handled = loadIdSet("drafts/handled");
53
- const ignored = loadIdSet("drafts/ignored");
52
+ const handled = loadIdSet("Drafts/handled");
53
+ const ignored = loadIdSet("Drafts/ignored");
54
54
 
55
55
  for (const name of readdirSync(MAIL_DIR).sort()) {
56
56
  if (!name.endsWith(".md")) continue;
@@ -30,7 +30,7 @@ Options:
30
30
  --bcc <addrs> Comma-separated BCC recipients
31
31
  --subject <subj> Email subject line (required)
32
32
  --body <text> Plain-text email body (required)
33
- --draft <path> Draft file — deleted after send, ID appended to drafts/handled
33
+ --draft <path> Draft file — deleted after send, ID appended to Drafts/handled
34
34
  -h, --help Show this help message and exit
35
35
 
36
36
  Mail.app must be running. No signature or sign-off needed — Apple Mail appends it.`;
@@ -113,7 +113,7 @@ function handleDraftCleanup(draft) {
113
113
  const draftBasename = basename(draft, ".md");
114
114
  const emailId = draftBasename.replace(/_draft$/, "");
115
115
  if (emailId) {
116
- appendFileSync("drafts/handled", emailId + "\n");
116
+ appendFileSync("Drafts/handled", emailId + "\n");
117
117
  console.log(`Marked as handled: ${emailId}`);
118
118
  }
119
119
  }