@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.
- package/README.md +2 -2
- package/bin/fit-outpost.js +3 -2
- package/package.json +6 -5
- 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 +75 -20
- package/src/kb-validator.js +762 -0
- package/src/outpost.js +108 -39
- 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 +32 -24
- package/templates/.claude/agents/concierge.md +26 -17
- package/templates/.claude/agents/head-hunter.md +34 -26
- package/templates/.claude/agents/librarian.md +26 -18
- package/templates/.claude/agents/postman.md +26 -18
- package/templates/.claude/agents/recruiter.md +38 -27
- package/templates/.claude/skills/anarlog-follow/SKILL.md +91 -66
- package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
- package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
- package/templates/.claude/skills/anarlog-process/SKILL.md +108 -62
- package/templates/.claude/skills/anarlog-process/references/extraction.md +41 -29
- package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +402 -160
- package/templates/.claude/skills/candidate-report/SKILL.md +41 -36
- 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 +122 -67
- package/templates/.claude/skills/deck-create/SKILL.md +90 -32
- 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 +63 -58
- package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
- package/templates/.claude/skills/deck-summarize/SKILL.md +55 -45
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +5 -4
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
- package/templates/.claude/skills/doc-collab/SKILL.md +39 -34
- package/templates/.claude/skills/doc-create/SKILL.md +27 -23
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/draft-emails/SKILL.md +63 -53
- package/templates/.claude/skills/draft-emails/references/template.md +2 -2
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +15 -8
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +19 -11
- package/templates/.claude/skills/extract-entities/SKILL.md +76 -75
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +6 -5
- package/templates/.claude/skills/extract-entities/references/conditions.md +20 -18
- package/templates/.claude/skills/extract-entities/references/content.md +10 -9
- package/templates/.claude/skills/extract-entities/references/links.md +37 -13
- package/templates/.claude/skills/extract-entities/references/recruitment.md +30 -24
- package/templates/.claude/skills/extract-entities/references/resolution.md +14 -14
- package/templates/.claude/skills/extract-entities/references/sources.md +9 -9
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +12 -6
- package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +10 -4
- package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
- package/templates/.claude/skills/meeting-prep/SKILL.md +42 -36
- package/templates/.claude/skills/organize-files/SKILL.md +27 -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 +77 -27
- package/templates/.claude/skills/person-identify/scripts/identify.sh +125 -26
- package/templates/.claude/skills/person-lookup/SKILL.md +34 -30
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +46 -17
- package/templates/.claude/skills/req-assess/SKILL.md +44 -36
- package/templates/.claude/skills/req-assess/references/interview-template.md +7 -2
- package/templates/.claude/skills/req-assess/references/panel-template.md +7 -2
- package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
- package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
- package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
- package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
- package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
- package/templates/.claude/skills/req-decide/SKILL.md +52 -41
- package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
- package/templates/.claude/skills/req-decide/references/template.md +2 -2
- package/templates/.claude/skills/req-forget/SKILL.md +58 -39
- package/templates/.claude/skills/req-forget/references/classify.md +15 -13
- package/templates/.claude/skills/req-forget/references/locations.md +27 -22
- package/templates/.claude/skills/req-forget/references/report-template.md +24 -16
- package/templates/.claude/skills/req-scan/SKILL.md +27 -25
- 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/references/template.md +11 -1
- package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
- package/templates/.claude/skills/req-screen/SKILL.md +96 -50
- package/templates/.claude/skills/req-screen/references/rubric.md +46 -50
- package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
- package/templates/.claude/skills/req-screen/references/template.md +29 -17
- package/templates/.claude/skills/req-track/SKILL.md +76 -76
- package/templates/.claude/skills/req-track/references/fields.md +31 -27
- package/templates/.claude/skills/req-track/references/overlays.md +42 -0
- 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 +28 -27
- package/templates/.claude/skills/req-workday/SKILL.md +69 -40
- package/templates/.claude/skills/req-workday/references/brief.md +81 -0
- package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
- package/templates/.claude/skills/req-workday/references/templates.md +11 -78
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +26 -7
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +113 -35
- package/templates/.claude/skills/send-chat/SKILL.md +58 -54
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +23 -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 +20 -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 +46 -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 +43 -41
- package/templates/.claude/skills/upstream-instructions/references/examples.md +5 -5
- package/templates/CLAUDE.md +97 -85
- package/templates/MIGRATION.md +359 -0
- package/templates/registry.yaml +25 -0
- package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
- 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
|