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