@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,13 +1,16 @@
|
|
|
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. Creates or updates Obsidian-compatible notes in
|
|
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. Creates or updates Obsidian-compatible notes in the tier directories. Use when the user asks to process meeting notes or after Anarlog sessions.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Process Anarlog
|
|
7
7
|
|
|
8
|
+
Write tier: `3-Team`; dated entries route per the entry's own tier
|
|
9
|
+
Frontmatter: person, organization, project, topic
|
|
10
|
+
|
|
8
11
|
Process meeting sessions from Anarlog (a local AI meeting-notes app) into the
|
|
9
12
|
knowledge graph. Anarlog records meetings, transcribes them, and generates AI
|
|
10
|
-
summaries. This skill reads that output and feeds it into
|
|
13
|
+
summaries. This skill reads that output and feeds it into the tiers.
|
|
11
14
|
`extract-entities` processes emails and calendar events in the same way.
|
|
12
15
|
|
|
13
16
|
## Trigger
|
|
@@ -18,43 +21,52 @@ summaries. This skill reads that output and feeds it into `Knowledge/`.
|
|
|
18
21
|
|
|
19
22
|
## Prerequisites
|
|
20
23
|
|
|
21
|
-
- Anarlog installed.
|
|
22
|
-
|
|
24
|
+
- Anarlog installed. Meetings live in its local SQLite database (`app.db`).
|
|
25
|
+
Read them only through Anarlog's typed, read-only interfaces (per its own
|
|
26
|
+
`AGENTS.md`): prefer the **Anarlog MCP tools** (`get_meeting`,
|
|
27
|
+
`get_meeting_transcript`) when connected, else the **bundled `anarlog-cli`**
|
|
28
|
+
with `--json`. Never `grep`, crawl `sessions/`, or query SQLite directly.
|
|
23
29
|
- The user identity. The `person-identify` skill writes it to
|
|
24
30
|
`~/.cache/fit/outpost/state/identity.md`.
|
|
25
31
|
|
|
26
32
|
## Inputs
|
|
27
33
|
|
|
28
|
-
-
|
|
29
|
-
[references/sessions.md](references/sessions.md) for the
|
|
30
|
-
rules.
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
- Meetings, read through `anarlog-cli` (`meetings list` / `get` /
|
|
35
|
+
`transcript`) — see [references/sessions.md](references/sessions.md) for the
|
|
36
|
+
CLI contract, content shapes, and skip rules. Older installs without the CLI
|
|
37
|
+
fall back to flat files under
|
|
38
|
+
`~/Library/Application Support/anarlog/sessions/{uuid}/`.
|
|
39
|
+
- `~/.cache/fit/outpost/state/graph_processed` — processed index (TSV, shared
|
|
40
|
+
with `extract-entities`). New meetings key as `anarlog://{id}`. Legacy
|
|
41
|
+
flat-file sessions keep their file-path keys and are never reprocessed.
|
|
33
42
|
- `~/.cache/fit/outpost/state/identity.md` — user identity for self-exclusion
|
|
34
43
|
(the `person-identify` skill writes it).
|
|
35
44
|
|
|
36
45
|
## Outputs
|
|
37
46
|
|
|
38
|
-
- `
|
|
39
|
-
`
|
|
40
|
-
- `
|
|
41
|
-
|
|
47
|
+
- `3-Team/People/`, `3-Team/Organizations/`, `3-Team/Projects/`,
|
|
48
|
+
`3-Team/Topics/` — created or updated.
|
|
49
|
+
- `3-Team/Priorities/` — **updated only**, never auto-created.
|
|
50
|
+
- `2-Confidential/Candidates/{Name}/transcript-{date}.md` — created for
|
|
51
|
+
interview sessions (verbatim transcript; the input `req-assess` waits on).
|
|
42
52
|
- `~/.cache/fit/outpost/state/graph_processed` — updated.
|
|
43
53
|
|
|
44
54
|
<do_confirm_checklist goal="Verify each session was processed correctly">
|
|
45
55
|
|
|
46
56
|
- [ ] Skip the empty, test, and onboarding sessions (per the skip rules).
|
|
47
|
-
- [ ] Read both
|
|
57
|
+
- [ ] Read both the note and the summary (when present). Consult the
|
|
48
58
|
transcript only for disambiguation.
|
|
49
59
|
- [ ] Apply the "Would I prep?" test to each person. Exclude the user.
|
|
50
|
-
- [ ] Write interview sessions to `
|
|
51
|
-
to `
|
|
52
|
-
- [ ]
|
|
60
|
+
- [ ] Write interview sessions to `2-Confidential/Candidates/`. Never write them
|
|
61
|
+
to `3-Team/People/`.
|
|
62
|
+
- [ ] Write a verbatim `transcript-{date}.md` for each interview session
|
|
63
|
+
(skip when that date's file already exists).
|
|
64
|
+
- [ ] Use tier-prefixed absolute links (`[[3-Team/People/Name]]`).
|
|
53
65
|
- [ ] Describe the relationship in each activity entry. Leave out the
|
|
54
66
|
communication method.
|
|
55
67
|
- [ ] Auto-create no new `Priorities/` note (the user sets these). Update the
|
|
56
68
|
progress on every priority the content references.
|
|
57
|
-
- [ ] Update `graph_processed` for every processed
|
|
69
|
+
- [ ] Update `graph_processed` for every processed meeting (`scan.mjs mark`).
|
|
58
70
|
|
|
59
71
|
</do_confirm_checklist>
|
|
60
72
|
|
|
@@ -64,41 +76,64 @@ summaries. This skill reads that output and feeds it into `Knowledge/`.
|
|
|
64
76
|
|
|
65
77
|
Read the user's identity from `~/.cache/fit/outpost/state/identity.md` (run the
|
|
66
78
|
`person-identify` skill first if it is missing or stale). Scan unprocessed
|
|
67
|
-
|
|
79
|
+
meetings:
|
|
68
80
|
|
|
69
81
|
```bash
|
|
70
82
|
node .claude/skills/anarlog-process/scripts/scan.mjs
|
|
71
83
|
```
|
|
72
84
|
|
|
73
|
-
|
|
74
|
-
|
|
85
|
+
The scan reads meetings through `anarlog-cli` (bulk enumerate-and-hash has no
|
|
86
|
+
MCP equivalent), so it finds every meeting — even ones not yet exported to
|
|
87
|
+
flat files. Each row prints the meeting `id` for Steps 2 and 6.
|
|
88
|
+
|
|
89
|
+
Flags: `--changed` (re-check changed content), `--json`, `--count`,
|
|
90
|
+
`--limit N` (default 20), `--legacy`; `cli-path` prints the resolved CLI.
|
|
75
91
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
92
|
+
A meeting needs processing when it has a substantive note or summary and
|
|
93
|
+
`graph_processed` has no `anarlog://{id}` record for it (or, with `--changed`,
|
|
94
|
+
its content hash differs). Already-processed flat-file sessions stay frozen.
|
|
95
|
+
Without `anarlog-cli`, the scan falls back to flat files automatically.
|
|
80
96
|
|
|
81
|
-
Process all unprocessed
|
|
82
|
-
scripts
|
|
83
|
-
metadata fallback).
|
|
97
|
+
Process all unprocessed meetings in one run. **Don't write bespoke scan
|
|
98
|
+
scripts or query the database directly.**
|
|
84
99
|
|
|
85
100
|
### 1. Build the knowledge index
|
|
86
101
|
|
|
87
102
|
```bash
|
|
88
|
-
ls
|
|
89
|
-
|
|
90
|
-
Knowledge/Conditions/ 2>/dev/null
|
|
103
|
+
ls 3-Team/People/ 3-Team/Organizations/ 3-Team/Projects/ \
|
|
104
|
+
3-Team/Topics/ 3-Team/Priorities/ 3-Team/Conditions/ 2>/dev/null
|
|
91
105
|
```
|
|
92
106
|
|
|
93
107
|
Read each note's header to build a mental index of known entities (same approach
|
|
94
108
|
as `extract-entities` Step 0).
|
|
95
109
|
|
|
96
|
-
### 2. Read each
|
|
110
|
+
### 2. Read each meeting
|
|
111
|
+
|
|
112
|
+
For each unprocessed meeting, prefer the MCP tool:
|
|
113
|
+
`get_meeting({ meeting_id: id })`. Fall back to the CLI (already resolved by
|
|
114
|
+
`scan.mjs`) when the MCP server is not connected:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
CLI="$(node .claude/skills/anarlog-process/scripts/scan.mjs cli-path)"
|
|
118
|
+
"$CLI" --json meetings get {id}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
This returns `note.markdown` (the user's own notes — high signal),
|
|
122
|
+
`summaries[].markdown` (the AI summary — usually the richest source),
|
|
123
|
+
`participants`, and `action_items`. Read the note and the summary. Pull the
|
|
124
|
+
transcript only when disambiguation requires it — MCP
|
|
125
|
+
`get_meeting_transcript({ meeting_id: id, offset: 0, limit: 200 })`, or CLI
|
|
126
|
+
`"$CLI" --json meetings transcript {id} --limit 200 --offset 0`.
|
|
127
|
+
|
|
128
|
+
**Exception — interview sessions:** once Step 3 classifies a meeting as an
|
|
129
|
+
interview, fetch the transcript **in full**: page with `offset`/`next_offset`
|
|
130
|
+
until a short page and concatenate `data.text`. This is persistence, not
|
|
131
|
+
extraction — Step 4 stays note/summary-only; Step 5 writes it verbatim.
|
|
97
132
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
133
|
+
MCP/CLI contract, content shapes, and skip rules:
|
|
134
|
+
[references/sessions.md](references/sessions.md). In `--legacy` mode, read the
|
|
135
|
+
`memoPath` / `summaryPath` files the scan reported instead (legacy
|
|
136
|
+
`transcript.json` is already complete — no pagination needed).
|
|
102
137
|
|
|
103
138
|
### 3. Classify the source
|
|
104
139
|
|
|
@@ -126,28 +161,36 @@ rules, and the linking rules.
|
|
|
126
161
|
For **new** entities, use the templates in
|
|
127
162
|
`.claude/skills/extract-entities/references/TEMPLATES.md`. For interview
|
|
128
163
|
sessions, use the candidate brief template from `req-track` (under
|
|
129
|
-
`
|
|
164
|
+
`2-Confidential/Candidates/`).
|
|
130
165
|
|
|
131
166
|
For **existing** entities, never rewrite the file. Apply targeted edits:
|
|
132
167
|
|
|
133
168
|
- Add the new activity entry at the **top** of `## Activity`.
|
|
134
|
-
- Update `Last seen` / `Last activity
|
|
169
|
+
- Update `Last seen` / `Last activity`, and stamp frontmatter `updated` in
|
|
170
|
+
the same edit.
|
|
135
171
|
- Add new key facts (skip duplicates).
|
|
136
172
|
- Update open items (mark completed, add new).
|
|
137
173
|
- Apply state changes.
|
|
138
174
|
|
|
175
|
+
For interview sessions, also write the full transcript from Step 2 to
|
|
176
|
+
`2-Confidential/Candidates/{Name}/transcript-{date}.md`: verbatim, no
|
|
177
|
+
frontmatter, speaker turns labeled by channel (`0` = user, `1` = other —
|
|
178
|
+
cross-check against `participants` when ambiguous). `{date}` is the meeting's
|
|
179
|
+
`started_at` (fall back to `created_at`), `YYYY-MM-DD`. Skip the write when that
|
|
180
|
+
date's file already exists. The file is pure persistence for `req-assess`; never
|
|
181
|
+
mine it for entities.
|
|
182
|
+
|
|
139
183
|
Verify bidirectional links per `extract-entities` Step 10 (Project ↔ Priority).
|
|
140
184
|
|
|
141
185
|
### 6. Update graph state
|
|
142
186
|
|
|
143
|
-
|
|
187
|
+
Mark each processed meeting so the scan does not pick it up again. This
|
|
188
|
+
records its `anarlog://{id}` content hash in `graph_processed`:
|
|
144
189
|
|
|
145
190
|
```bash
|
|
146
|
-
node .claude/skills/
|
|
147
|
-
"$HOME/Library/Application Support/anarlog/sessions/{uuid}/_memo.md"
|
|
148
|
-
|
|
149
|
-
node .claude/skills/extract-entities/scripts/state.mjs update \
|
|
150
|
-
"$HOME/Library/Application Support/anarlog/sessions/{uuid}/_summary.md"
|
|
191
|
+
node .claude/skills/anarlog-process/scripts/scan.mjs mark {id} [{id}…]
|
|
151
192
|
```
|
|
152
193
|
|
|
153
|
-
|
|
194
|
+
Pass every meeting you processed in one call. If the scan ran in `--legacy`
|
|
195
|
+
mode, instead mark the flat files it reported:
|
|
196
|
+
`extract-entities/scripts/state.mjs update <memoPath> <summaryPath>`.
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
# Entity Extraction Signals
|
|
2
2
|
|
|
3
|
-
Reference for `anarlog-process` Steps 3 and 4. Combine
|
|
4
|
-
|
|
3
|
+
Reference for `anarlog-process` Steps 3 and 4. Combine the meeting's note and
|
|
4
|
+
summary (prefer the summary when both exist).
|
|
5
5
|
|
|
6
6
|
## People
|
|
7
7
|
|
|
8
8
|
Look for names in:
|
|
9
9
|
|
|
10
|
-
-
|
|
10
|
+
- Note text ("chat with Sarah Chen", "interview with David Kim").
|
|
11
11
|
- Summary bullets ("the user will serve as the senior engineer", "Alex from the
|
|
12
12
|
platform team").
|
|
13
|
-
- `
|
|
13
|
+
- The meeting's `participants` (from `meetings get`) — a hint only. Confirm
|
|
14
|
+
each person from the note or summary text.
|
|
14
15
|
|
|
15
16
|
For each name, resolve it against the knowledge index (Step 0). Extract the
|
|
16
17
|
role, the organization, and the relationship to the user. Note what they
|
|
@@ -40,10 +41,16 @@ or the `@domain` from `~/.cache/fit/outpost/state/identity.md`.
|
|
|
40
41
|
|
|
41
42
|
## Interview sessions (special case)
|
|
42
43
|
|
|
43
|
-
If the title or the
|
|
44
|
-
**candidate**. Create or update their note in `
|
|
45
|
-
candidate brief template from `req-track`. **Never** write it in
|
|
46
|
-
`
|
|
44
|
+
If the title or the note says "interview with {Name}", the interviewee is a
|
|
45
|
+
**candidate**. Create or update their note in `2-Confidential/Candidates/` with
|
|
46
|
+
the candidate brief template from `req-track`. **Never** write it in
|
|
47
|
+
`3-Team/People/`.
|
|
48
|
+
|
|
49
|
+
Also write the full transcript to
|
|
50
|
+
`2-Confidential/Candidates/{Name}/transcript-{date}.md` (SKILL.md Steps 2 and
|
|
51
|
+
5). This is the input `req-assess` waits on to move the candidate to Stage 2. It
|
|
52
|
+
is separate from the extraction above: persist the transcript file verbatim and
|
|
53
|
+
never mine it for entities.
|
|
47
54
|
|
|
48
55
|
## Content signals
|
|
49
56
|
|
|
@@ -69,7 +76,7 @@ One line per session per entity:
|
|
|
69
76
|
|
|
70
77
|
```markdown
|
|
71
78
|
- **2026-02-14** (meeting): Discussed hiring pipeline. 11 internal
|
|
72
|
-
candidates, plan to shortlist to 6-7. [[People/Sarah Chen]] managing
|
|
79
|
+
candidates, plan to shortlist to 6-7. [[3-Team/People/Sarah Chen]] managing
|
|
73
80
|
the team.
|
|
74
81
|
```
|
|
75
82
|
|
|
@@ -80,8 +87,9 @@ assessment, strengths and concerns, and any interview scores or decisions.
|
|
|
80
87
|
|
|
81
88
|
## Linking rules
|
|
82
89
|
|
|
83
|
-
Use absolute paths everywhere: `[[People/Name]]`,
|
|
84
|
-
`[[
|
|
90
|
+
Use absolute paths everywhere: `[[3-Team/People/Name]]`,
|
|
91
|
+
`[[3-Team/Organizations/Name]]`, `[[3-Team/Projects/Name]]`,
|
|
92
|
+
`[[3-Team/Priorities/Priority Name]]`.
|
|
85
93
|
|
|
86
94
|
When meeting content references an existing Priority, follow the linking
|
|
87
95
|
rules in `extract-entities` Step 7c. Update the progress and add the backlinks.
|
|
@@ -1,81 +1,115 @@
|
|
|
1
|
-
# Anarlog
|
|
2
|
-
|
|
3
|
-
Reference for `anarlog-process` Step
|
|
4
|
-
`~/Library/Application Support/anarlog/
|
|
1
|
+
# Anarlog Meeting Data
|
|
2
|
+
|
|
3
|
+
Reference for `anarlog-process` Step 2. Anarlog stores meetings in a local
|
|
4
|
+
SQLite database (`~/Library/Application Support/anarlog/app.db`). Read them
|
|
5
|
+
through Anarlog's typed, read-only interfaces — its own `AGENTS.md` is
|
|
6
|
+
explicit:
|
|
7
|
+
|
|
8
|
+
> Use Anarlog's typed, read-only interfaces for meeting data. Do not use `find`,
|
|
9
|
+
> `grep`, `rg`, filesystem crawling, or direct SQLite queries.
|
|
10
|
+
|
|
11
|
+
**Prefer the MCP tools** (`get_meeting`, `get_meeting_transcript`,
|
|
12
|
+
`list_meetings`, `get_recurring_meeting_history`) when the `anarlog` MCP server
|
|
13
|
+
is connected — call them directly, no shell needed. **Fall back to the CLI**
|
|
14
|
+
(`anarlog --json ...`) otherwise; `scan.mjs`'s bulk scan (Step 0) always uses
|
|
15
|
+
the CLI regardless, since enumerating and hashing every meeting has no MCP
|
|
16
|
+
equivalent. Resolve the CLI binary once (`scan.mjs` finds it via `ANARLOG_CLI`,
|
|
17
|
+
the app bundle, or `PATH`):
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
CLI="$(node .claude/skills/anarlog-process/scripts/scan.mjs cli-path)"
|
|
21
|
+
```
|
|
5
22
|
|
|
6
|
-
|
|
23
|
+
Every CLI command takes a global `--json` flag and returns a stable envelope;
|
|
24
|
+
MCP tools return the same `data`/`pagination` shape directly as the tool
|
|
25
|
+
result:
|
|
7
26
|
|
|
8
27
|
```json
|
|
9
|
-
{
|
|
10
|
-
"
|
|
11
|
-
"id": "7888363f-4cc6-4987-8470-92f386e5bdfc",
|
|
12
|
-
"participants": [],
|
|
13
|
-
"title": "Director-Level Hiring Pipeline",
|
|
14
|
-
"user_id": "00000000-0000-0000-0000-000000000000"
|
|
15
|
-
}
|
|
28
|
+
{ "schema_version": "1", "command": "meetings.get", "data": { … },
|
|
29
|
+
"pagination": { "offset": 0, "limit": 20, "returned": 20, "next_offset": 20 } }
|
|
16
30
|
```
|
|
17
31
|
|
|
18
|
-
|
|
19
|
-
|
|
32
|
+
Read the payload from `.data` (CLI) or the tool result directly (MCP). Never
|
|
33
|
+
guess a meeting ID — get it from the scan output or `meetings list` /
|
|
34
|
+
`list_meetings`.
|
|
20
35
|
|
|
21
|
-
## `
|
|
36
|
+
## `list_meetings` / `meetings list`
|
|
22
37
|
|
|
23
|
-
|
|
38
|
+
MCP: `list_meetings({ limit, offset, query, series_id })`. CLI:
|
|
39
|
+
`"$CLI" --json meetings list --limit 200 --offset 0` (also `--query`,
|
|
40
|
+
`--series-id`). `data` is an array of meeting summaries:
|
|
24
41
|
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
Chat with Sarah about the product roadmap.
|
|
42
|
+
```json
|
|
43
|
+
{ "id": "a104a542-…", "title": "1-1 with Sarah Chen", "kind": "meeting",
|
|
44
|
+
"status": "active", "created_at": "2026-07-22T08:27:42.499Z",
|
|
45
|
+
"updated_at": "…", "started_at": "", "ended_at": "", "series_id": "" }
|
|
32
46
|
```
|
|
33
47
|
|
|
34
|
-
|
|
48
|
+
Page with `pagination.next_offset` until a short page. `scan.mjs` does this for
|
|
49
|
+
you via the CLI; call `list`/`list_meetings` directly only for ad-hoc lookups
|
|
50
|
+
(e.g. resolving an ID by title).
|
|
35
51
|
|
|
36
|
-
## `
|
|
52
|
+
## `get_meeting` / `meetings get <id>` — the main source
|
|
37
53
|
|
|
38
|
-
|
|
39
|
-
|
|
54
|
+
MCP: `get_meeting({ meeting_id: id })`. CLI: `"$CLI" --json meetings get {id}`.
|
|
55
|
+
`data` carries everything you extract from:
|
|
40
56
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
57
|
+
- **`note`** — the user's own notes (object, or `null`). `note.markdown` is
|
|
58
|
+
high-signal: every name and observation is intentional. May be just a title.
|
|
59
|
+
- **`summaries`** — array of AI-generated summaries; `summaries[].markdown` is
|
|
60
|
+
usually the richest source. Often one entry; can be empty.
|
|
61
|
+
- **`participants`** — array of `{ human_id, display_name, email, role,
|
|
62
|
+
job_title, organization_name }`. Frequently sparse/empty — a hint, not a
|
|
63
|
+
source of truth; still confirm people from the note/summary text.
|
|
64
|
+
- **`action_items`** — array of `{ text, status, assignee_human_id, due_at }`.
|
|
65
|
+
Useful as open items / commitments when populated.
|
|
48
66
|
|
|
49
|
-
|
|
67
|
+
Prefer the summary when both note and summary exist; combine them for full
|
|
68
|
+
coverage.
|
|
50
69
|
|
|
51
|
-
|
|
52
|
-
```
|
|
70
|
+
## `get_meeting_transcript` / `meetings transcript <id>` — disambiguation only
|
|
53
71
|
|
|
54
|
-
|
|
72
|
+
MCP: `get_meeting_transcript({ meeting_id: id, offset: 0, limit: 200 })`. CLI:
|
|
73
|
+
`"$CLI" --json meetings transcript {id} --limit 200 --offset 0` (`limit`
|
|
74
|
+
capped at 500 by both):
|
|
55
75
|
|
|
56
76
|
```json
|
|
57
|
-
{
|
|
58
|
-
"
|
|
59
|
-
"words": [
|
|
60
|
-
{"channel": 0, "text": "Hello", "start_ms": 0, "end_ms": 500},
|
|
61
|
-
{"channel": 1, "text": "Hi", "start_ms": 600, "end_ms": 900}
|
|
62
|
-
]
|
|
63
|
-
}]
|
|
64
|
-
}
|
|
77
|
+
{ "meeting_id": "a104a542-…", "text": "Yeah, so the overall …",
|
|
78
|
+
"words": [ { "channel": 0, "text": " Yeah,", "start_ms": 0, "end_ms": 400 } ] }
|
|
65
79
|
```
|
|
66
80
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
## Skip rules
|
|
81
|
+
`data.text` is the joined page; `pagination.total` is the word count (page with
|
|
82
|
+
`next_offset`). **Do not extract entities from the full transcript** — too
|
|
83
|
+
noisy. Use it only to disambiguate a name, confirm who said what (channel `0` =
|
|
84
|
+
user, channel `1` = other speaker — a heuristic), or find context around a
|
|
85
|
+
decision.
|
|
73
86
|
|
|
74
|
-
|
|
87
|
+
**Exception — interview sessions:** page through the full transcript (not just
|
|
88
|
+
enough to disambiguate) and persist it verbatim to
|
|
89
|
+
`2-Confidential/Candidates/{Name}/transcript-{date}.md`. This doesn't relax the
|
|
90
|
+
no-entity-extraction rule above — the persisted file is a `req-assess` input,
|
|
91
|
+
not a source `anarlog-process` itself mines.
|
|
75
92
|
|
|
76
|
-
|
|
77
|
-
- No `_summary.md` exists.
|
|
78
|
-
- The title is empty or generic ("Hello", "Welcome to Anarlog", "Test").
|
|
93
|
+
## Skip rules
|
|
79
94
|
|
|
80
|
-
|
|
81
|
-
|
|
95
|
+
Skip a meeting when it has **neither** a substantive note **nor** any summary
|
|
96
|
+
(empty / onboarding / test sessions — e.g. a note that is only its title, or a
|
|
97
|
+
generic title like "Hello" / "Welcome to Anarlog" with no content). Process a
|
|
98
|
+
meeting if it has **either** a substantive note **or** a summary. `scan.mjs`
|
|
99
|
+
already applies this, so a meeting in the scan output is worth processing.
|
|
100
|
+
|
|
101
|
+
## Legacy flat files (fallback only)
|
|
102
|
+
|
|
103
|
+
Older Anarlog versions exported each session to
|
|
104
|
+
`~/Library/Application Support/anarlog/sessions/{uuid}/`. `scan.mjs` falls back
|
|
105
|
+
to these only when `anarlog-cli` is unavailable; already-processed flat-file
|
|
106
|
+
sessions are frozen and never reprocessed. Shapes:
|
|
107
|
+
|
|
108
|
+
- **`_meta.json`** — `{ created_at, id, title, participants }` (participants
|
|
109
|
+
often empty). Session date from `created_at`.
|
|
110
|
+
- **`_memo.md`** — YAML frontmatter (`id`, `session_id`) + the user's markdown
|
|
111
|
+
notes. Equivalent to the CLI's `note.markdown`.
|
|
112
|
+
- **`_summary.md`** — YAML frontmatter (`id`, `session_id`, `title`) + an
|
|
113
|
+
AI-generated summary. Equivalent to a `summaries[]` entry.
|
|
114
|
+
- **`transcript.json`** — `{ transcripts: [{ words: [{ channel, text, start_ms,
|
|
115
|
+
end_ms }] }] }`. Same channel convention as above.
|