@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.
- package/package.json +3 -2
- package/src/kb-manager.js +58 -5
- package/src/kb-validator.js +762 -0
- package/src/outpost.js +73 -8
- package/templates/.claude/agents/chief-of-staff.md +14 -6
- package/templates/.claude/agents/concierge.md +9 -2
- package/templates/.claude/agents/head-hunter.md +9 -2
- package/templates/.claude/agents/librarian.md +11 -4
- package/templates/.claude/agents/postman.md +9 -2
- package/templates/.claude/agents/recruiter.md +9 -2
- package/templates/.claude/skills/anarlog-follow/SKILL.md +53 -29
- package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
- package/templates/.claude/skills/anarlog-process/SKILL.md +88 -45
- package/templates/.claude/skills/anarlog-process/references/extraction.md +19 -11
- package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +404 -163
- package/templates/.claude/skills/candidate-report/SKILL.md +12 -9
- package/templates/.claude/skills/changelog/SKILL.md +106 -56
- package/templates/.claude/skills/deck-create/SKILL.md +60 -2
- package/templates/.claude/skills/deck-review/SKILL.md +4 -1
- package/templates/.claude/skills/deck-summarize/SKILL.md +6 -2
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +1 -1
- package/templates/.claude/skills/doc-collab/SKILL.md +16 -11
- package/templates/.claude/skills/doc-create/SKILL.md +6 -3
- package/templates/.claude/skills/draft-emails/SKILL.md +31 -25
- package/templates/.claude/skills/draft-emails/references/template.md +1 -1
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +14 -8
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +9 -3
- package/templates/.claude/skills/extract-entities/SKILL.md +17 -16
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +2 -1
- package/templates/.claude/skills/extract-entities/references/conditions.md +6 -5
- package/templates/.claude/skills/extract-entities/references/links.md +34 -10
- package/templates/.claude/skills/extract-entities/references/recruitment.md +15 -10
- package/templates/.claude/skills/extract-entities/references/resolution.md +1 -1
- package/templates/.claude/skills/extract-entities/references/sources.md +1 -1
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +10 -4
- package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +8 -2
- package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
- package/templates/.claude/skills/meeting-prep/SKILL.md +23 -18
- package/templates/.claude/skills/organize-files/SKILL.md +3 -0
- package/templates/.claude/skills/person-identify/SKILL.md +58 -10
- package/templates/.claude/skills/person-identify/scripts/identify.sh +110 -11
- package/templates/.claude/skills/person-lookup/SKILL.md +8 -3
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +27 -1
- package/templates/.claude/skills/req-assess/SKILL.md +19 -11
- package/templates/.claude/skills/req-assess/references/interview-template.md +6 -1
- package/templates/.claude/skills/req-assess/references/panel-template.md +5 -1
- 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 +26 -18
- package/templates/.claude/skills/req-decide/references/template.md +2 -2
- package/templates/.claude/skills/req-forget/SKILL.md +39 -22
- package/templates/.claude/skills/req-forget/references/classify.md +12 -10
- package/templates/.claude/skills/req-forget/references/locations.md +27 -22
- package/templates/.claude/skills/req-forget/references/report-template.md +23 -15
- package/templates/.claude/skills/req-scan/SKILL.md +6 -3
- package/templates/.claude/skills/req-scan/references/template.md +11 -1
- package/templates/.claude/skills/req-screen/SKILL.md +78 -34
- package/templates/.claude/skills/req-screen/references/rubric.md +38 -42
- package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
- package/templates/.claude/skills/req-screen/references/template.md +26 -14
- package/templates/.claude/skills/req-track/SKILL.md +44 -44
- package/templates/.claude/skills/req-track/references/fields.md +18 -15
- package/templates/.claude/skills/req-track/references/overlays.md +42 -0
- package/templates/.claude/skills/req-track/references/signals.md +2 -2
- package/templates/.claude/skills/req-track/references/templates.md +28 -27
- package/templates/.claude/skills/req-workday/SKILL.md +49 -20
- package/templates/.claude/skills/req-workday/references/brief.md +81 -0
- package/templates/.claude/skills/req-workday/references/templates.md +6 -73
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +19 -0
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +96 -20
- package/templates/.claude/skills/send-chat/SKILL.md +11 -11
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +3 -0
- package/templates/.claude/skills/sync-apple-mail/SKILL.md +3 -0
- package/templates/.claude/skills/sync-teams/SKILL.md +3 -0
- package/templates/.claude/skills/upstream-instructions/SKILL.md +8 -5
- package/templates/.claude/skills/upstream-instructions/references/examples.md +3 -3
- package/templates/CLAUDE.md +96 -87
- 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 -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
|