@forwardimpact/outpost 3.12.1 → 3.13.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 (85) hide show
  1. package/package.json +3 -2
  2. package/src/kb-manager.js +58 -5
  3. package/src/kb-validator.js +762 -0
  4. package/src/outpost.js +73 -8
  5. package/templates/.claude/agents/chief-of-staff.md +14 -6
  6. package/templates/.claude/agents/concierge.md +9 -2
  7. package/templates/.claude/agents/head-hunter.md +9 -2
  8. package/templates/.claude/agents/librarian.md +11 -4
  9. package/templates/.claude/agents/postman.md +9 -2
  10. package/templates/.claude/agents/recruiter.md +9 -2
  11. package/templates/.claude/skills/anarlog-follow/SKILL.md +53 -29
  12. package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
  13. package/templates/.claude/skills/anarlog-process/SKILL.md +88 -45
  14. package/templates/.claude/skills/anarlog-process/references/extraction.md +19 -11
  15. package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
  16. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +404 -163
  17. package/templates/.claude/skills/candidate-report/SKILL.md +12 -9
  18. package/templates/.claude/skills/changelog/SKILL.md +106 -56
  19. package/templates/.claude/skills/deck-create/SKILL.md +60 -2
  20. package/templates/.claude/skills/deck-review/SKILL.md +4 -1
  21. package/templates/.claude/skills/deck-summarize/SKILL.md +6 -2
  22. package/templates/.claude/skills/deck-summarize/references/brief-template.md +1 -1
  23. package/templates/.claude/skills/doc-collab/SKILL.md +16 -11
  24. package/templates/.claude/skills/doc-create/SKILL.md +6 -3
  25. package/templates/.claude/skills/draft-emails/SKILL.md +31 -25
  26. package/templates/.claude/skills/draft-emails/references/template.md +1 -1
  27. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +14 -8
  28. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +9 -3
  29. package/templates/.claude/skills/extract-entities/SKILL.md +17 -16
  30. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +2 -1
  31. package/templates/.claude/skills/extract-entities/references/conditions.md +6 -5
  32. package/templates/.claude/skills/extract-entities/references/links.md +34 -10
  33. package/templates/.claude/skills/extract-entities/references/recruitment.md +15 -10
  34. package/templates/.claude/skills/extract-entities/references/resolution.md +1 -1
  35. package/templates/.claude/skills/extract-entities/references/sources.md +1 -1
  36. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +10 -4
  37. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
  38. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +8 -2
  39. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
  40. package/templates/.claude/skills/meeting-prep/SKILL.md +23 -18
  41. package/templates/.claude/skills/organize-files/SKILL.md +3 -0
  42. package/templates/.claude/skills/person-identify/SKILL.md +58 -10
  43. package/templates/.claude/skills/person-identify/scripts/identify.sh +110 -11
  44. package/templates/.claude/skills/person-lookup/SKILL.md +8 -3
  45. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +27 -1
  46. package/templates/.claude/skills/req-assess/SKILL.md +19 -11
  47. package/templates/.claude/skills/req-assess/references/interview-template.md +6 -1
  48. package/templates/.claude/skills/req-assess/references/panel-template.md +5 -1
  49. package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
  50. package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
  51. package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
  52. package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
  53. package/templates/.claude/skills/req-decide/SKILL.md +26 -18
  54. package/templates/.claude/skills/req-decide/references/template.md +2 -2
  55. package/templates/.claude/skills/req-forget/SKILL.md +39 -22
  56. package/templates/.claude/skills/req-forget/references/classify.md +12 -10
  57. package/templates/.claude/skills/req-forget/references/locations.md +27 -22
  58. package/templates/.claude/skills/req-forget/references/report-template.md +23 -15
  59. package/templates/.claude/skills/req-scan/SKILL.md +6 -3
  60. package/templates/.claude/skills/req-scan/references/template.md +11 -1
  61. package/templates/.claude/skills/req-screen/SKILL.md +78 -34
  62. package/templates/.claude/skills/req-screen/references/rubric.md +38 -42
  63. package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
  64. package/templates/.claude/skills/req-screen/references/template.md +26 -14
  65. package/templates/.claude/skills/req-track/SKILL.md +44 -44
  66. package/templates/.claude/skills/req-track/references/fields.md +18 -15
  67. package/templates/.claude/skills/req-track/references/overlays.md +42 -0
  68. package/templates/.claude/skills/req-track/references/signals.md +2 -2
  69. package/templates/.claude/skills/req-track/references/templates.md +28 -27
  70. package/templates/.claude/skills/req-workday/SKILL.md +49 -20
  71. package/templates/.claude/skills/req-workday/references/brief.md +81 -0
  72. package/templates/.claude/skills/req-workday/references/templates.md +6 -73
  73. package/templates/.claude/skills/req-workday/references/xlsx-format.md +19 -0
  74. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +96 -20
  75. package/templates/.claude/skills/send-chat/SKILL.md +11 -11
  76. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +3 -0
  77. package/templates/.claude/skills/sync-apple-mail/SKILL.md +3 -0
  78. package/templates/.claude/skills/sync-teams/SKILL.md +3 -0
  79. package/templates/.claude/skills/upstream-instructions/SKILL.md +8 -5
  80. package/templates/.claude/skills/upstream-instructions/references/examples.md +3 -3
  81. package/templates/CLAUDE.md +96 -87
  82. package/templates/MIGRATION.md +359 -0
  83. package/templates/registry.yaml +25 -0
  84. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
  85. package/templates/.claude/skills/anarlog-trim/SKILL.md +0 -186
@@ -1,186 +0,0 @@
1
- ---
2
- name: anarlog-trim
3
- description: Trim an Anarlog transcript to its logical end. A recording often continues after a meeting finishes. This skill finds the natural conclusion (goodbyes, sign-offs) and cuts the transcript there. Use when the user asks to trim, cut, or clean up an Anarlog transcript.
4
- ---
5
-
6
- # Trim Transcript
7
-
8
- Find the logical end of an Anarlog meeting transcript. Trim everything after it.
9
- Meetings that Anarlog records often have noise at the end. The mic stays on
10
- after the goodbyes and captures ambient sound, unrelated chatter, or silence.
11
- This skill identifies the natural conclusion and edits the transcript in place.
12
-
13
- ## Trigger
14
-
15
- Run this skill:
16
-
17
- - When the user asks to trim, cut, or clean up an Anarlog transcript
18
- - When given a specific session ID to trim
19
- - When another skill (e.g., anarlog-process) flags a transcript that has too
20
- much content at the end
21
-
22
- ## Prerequisites
23
-
24
- - Anarlog installed with session data at
25
- `~/Library/Application Support/anarlog/sessions/`
26
-
27
- ## Inputs
28
-
29
- - **Session ID** — the UUID of the Anarlog session to trim
30
- - `~/Library/Application Support/anarlog/sessions/{uuid}/transcript.json` — the
31
- word-level transcript
32
-
33
- ## Outputs
34
-
35
- - `~/Library/Application Support/anarlog/sessions/{uuid}/transcript.json` —
36
- this skill edits it in place and removes the words after the logical end
37
- - `~/Library/Application Support/anarlog/sessions/{uuid}/audio.mp3` — this skill
38
- deletes it. A trim indicates the recording captured audio beyond the consented
39
- meeting. Delete the full audio to respect participant privacy.
40
- - A printed summary of the original duration, the trim point, the new duration,
41
- and the words removed
42
-
43
- ---
44
-
45
- ## Steps
46
-
47
- ### Step 0 — Validate the session
48
-
49
- 1. Confirm the session directory exists:
50
-
51
- ```text
52
- ~/Library/Application Support/anarlog/sessions/{uuid}/
53
- ```
54
-
55
- 2. Confirm `transcript.json` exists and has at least one transcript with words.
56
- 3. Read `_meta.json` to get the session title for context.
57
-
58
- ### Step 1 — Reconstruct readable text
59
-
60
- Convert the word-level transcript into readable text with timestamps. Group
61
- words into lines by speaker channel and approximate sentence boundaries. The
62
- goal is a human-readable view you can analyze for the logical end.
63
-
64
- Use this approach:
65
-
66
- ```python
67
- #!/usr/bin/env bun
68
- import json
69
-
70
- data = json.load(open('transcript.json'))
71
- words = data['transcripts'][0]['words']
72
-
73
- # Reconstruct text grouped by ~30-second windows with channel labels
74
- current_min = -1
75
- for i, w in enumerate(words):
76
- minute_mark = int(w['start_ms'] / 30000) # 30-second buckets
77
- if minute_mark != current_min:
78
- current_min = minute_mark
79
- mins = w['start_ms'] / 60000
80
- print(f'\n[{mins:.1f}m ch{w["channel"]}]', end='')
81
- print(w['text'], end='')
82
- ```
83
-
84
- ### Step 2 — Identify the logical end
85
-
86
- Read through the reconstructed text. Find the **first point where the meeting
87
- clearly ended**. Look for these signals, roughly in order of strength:
88
-
89
- **Strong end signals (any one is sufficient):**
90
-
91
- - Explicit farewells: "bye", "bye bye", "goodbye", "take care", "have a good
92
- day/evening/weekend", "cheers"
93
- - Final thank-yous followed by no substantive content: "thank you so much",
94
- "thanks a lot", "thanks everyone"
95
- - Meeting close phrases: "that's all", "we're done", "let's wrap up", "I'll let
96
- you go"
97
-
98
- **Support signals (they strengthen the case but are not sufficient alone):**
99
-
100
- - Long silence gaps (>30 seconds) after a farewell exchange
101
- - Channel drops — only one speaker remains after goodbyes
102
- - Shift to clearly unrelated content (ambient noise transcribed as fragments)
103
- - Filler-only content: repeated "um", "uh", fragments with no meaning
104
-
105
- **The trim point** is the end of the last meaningful farewell exchange. Include
106
- the final "bye" / "thank you" / "take care" from both parties if present. Then
107
- cut everything after.
108
-
109
- ### Step 3 — Confirm with the user
110
-
111
- Before you modify the file, show the user:
112
-
113
- 1. The **session title** and **original duration**
114
- 2. The **last ~20 words before the proposed trim point** (as readable text)
115
- 3. The **first ~20 words after the proposed trim point** (what will be removed)
116
- 4. The **new duration** and the **number of words to remove**
117
-
118
- Wait for the user to approve before you continue.
119
-
120
- ### Step 4 — Trim the transcript
121
-
122
- After the user approves:
123
-
124
- 1. Read the current `transcript.json` (fresh read, not cached).
125
- 2. Slice the words array at the identified index.
126
- 3. Write the modified JSON back to `transcript.json`.
127
-
128
- ```python
129
- import json
130
-
131
- path = f'~/Library/Application Support/anarlog/sessions/{uuid}/transcript.json'
132
- data = json.load(open(path))
133
- data['transcripts'][0]['words'] = data['transcripts'][0]['words'][:trim_index]
134
- json.dump(data, open(path, 'w'), indent=2)
135
- ```
136
-
137
- 4. Print a summary:
138
-
139
- ```text
140
- Trimmed: {title}
141
- Before: {original_words} words, {original_duration}
142
- After: {new_words} words, {new_duration}
143
- Removed: {removed_words} words ({removed_duration} of trailing content)
144
- ```
145
-
146
- ### Step 5 — Delete the audio recording
147
-
148
- A transcript that needs a trim means that the recording captured audio beyond
149
- the consented meeting. That audio holds ambient conversation, unrelated
150
- chatter, or other people who did not consent to the recording. Delete the full
151
- audio file to respect participant privacy.
152
-
153
- 1. Delete the audio file:
154
-
155
- ```bash
156
- rm "~/Library/Application Support/anarlog/sessions/{uuid}/audio.mp3"
157
- ```
158
-
159
- 2. Confirm that the file is gone and tell the user:
160
-
161
- ```text
162
- Audio deleted: audio.mp3 removed (recording contained unconsented content beyond the meeting)
163
- ```
164
-
165
- This step is **not optional**. It does **not require separate user
166
- confirmation**. The user already approved the trim. That approval implicitly
167
- acknowledges that the recording went beyond the meeting boundary.
168
-
169
- ### Step 6 — Verify
170
-
171
- Read back the last 10 words of the trimmed transcript. Confirm that the write
172
- succeeded and that the transcript ends at the expected point. Confirm that
173
- `audio.mp3` no longer exists in the session directory.
174
-
175
- ---
176
-
177
- ## Quality checklist
178
-
179
- - [ ] Validate the session ID and confirm the transcript exists
180
- - [ ] Identify the logical end from the farewell and close signals
181
- - [ ] Show the trim point to the user and get approval before you edit
182
- - [ ] Write the transcript file with valid JSON
183
- - [ ] Delete the audio recording (it holds unconsented content from beyond the
184
- meeting)
185
- - [ ] Verify after the trim that the transcript ends as expected and that the
186
- audio is gone