@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
|
@@ -19,11 +19,11 @@ Calendar events. Internal-only meetings still enrich Project and Topic notes
|
|
|
19
19
|
(decisions, agenda items). Only skip all-day placeholders with no attendees and
|
|
20
20
|
no description (e.g. "Block", "OOO").
|
|
21
21
|
|
|
22
|
-
**Stub guard:** calendar attendance alone never creates a People note
|
|
23
|
-
events only *enrich* existing notes (see the table below).
|
|
24
|
-
only on the invite list, with no interaction or decision
|
|
25
|
-
|
|
26
|
-
write a placeholder profile
|
|
22
|
+
**Stub guard:** calendar attendance alone never creates a People note. Calendar
|
|
23
|
+
events only *enrich* existing notes (see the table below). Do not profile an
|
|
24
|
+
attendee who is only on the invite list, with no interaction or decision
|
|
25
|
+
attributed to them. If they matter, they go in the Organization's `## Contacts`.
|
|
26
|
+
Never write a placeholder profile. See the
|
|
27
27
|
[minimum content bar](resolution.md#minimum-content-bar--no-stubs).
|
|
28
28
|
|
|
29
29
|
## Skip entirely
|
|
@@ -40,7 +40,7 @@ write a placeholder profile; see the
|
|
|
40
40
|
|
|
41
41
|
## Process — update existing notes only
|
|
42
42
|
|
|
43
|
-
- Emails from people already in `
|
|
43
|
+
- Emails from people already in `3-Team/People/`.
|
|
44
44
|
- Emails referencing existing projects or organizations.
|
|
45
45
|
|
|
46
46
|
## Process — can create new notes
|
|
@@ -54,9 +54,9 @@ write a placeholder profile; see the
|
|
|
54
54
|
If an email is a warm introduction from someone with a note, and they introduce
|
|
55
55
|
a new person, **create** a note for the introduced person.
|
|
56
56
|
|
|
57
|
-
Signals: subject contains "Intro:", "Introduction:", "Meet",
|
|
58
|
-
contains "introduce you to", "want to connect",
|
|
59
|
-
|
|
57
|
+
Signals: the subject contains "Intro:", "Introduction:", "Meet", or
|
|
58
|
+
"Connecting". The body contains "introduce you to", "want to connect", or
|
|
59
|
+
"meet [Name]". The sender CCs the new person.
|
|
60
60
|
|
|
61
61
|
## Self-exclusion
|
|
62
62
|
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
# Condition Template
|
|
2
2
|
|
|
3
3
|
Conditions are time-bound organizational states that affect multiple entities.
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
The librarian agent can **auto-create** them when it detects cross-cutting
|
|
5
|
+
patterns. The user can also create them manually. Lifecycle: active → resolved.
|
|
6
6
|
|
|
7
7
|
```markdown
|
|
8
|
+
---
|
|
9
|
+
type: condition
|
|
10
|
+
created: {YYYY-MM-DD}
|
|
11
|
+
updated: {YYYY-MM-DD}
|
|
12
|
+
---
|
|
13
|
+
|
|
8
14
|
# {Condition Name}
|
|
9
15
|
|
|
10
16
|
## Info
|
|
@@ -16,10 +22,10 @@ are detected, or manually created by the user. Lifecycle: active → resolved.
|
|
|
16
22
|
**Resolution signal:** {What would indicate this condition has ended}
|
|
17
23
|
|
|
18
24
|
## Affects
|
|
19
|
-
{Priorities, Projects,
|
|
20
|
-
|
|
21
|
-
- [[
|
|
22
|
-
- [[
|
|
25
|
+
{Priorities, Projects, and People impacted by this condition. A Role file
|
|
26
|
+
links here instead — a Condition never links into a narrower tier.}
|
|
27
|
+
- [[3-Team/Priorities/{Priority}]] — {how it's affected}
|
|
28
|
+
- [[3-Team/Projects/{Project}]] — {how it's affected}
|
|
23
29
|
|
|
24
30
|
## Agent implications
|
|
25
31
|
{How agents should modify their behavior while this condition is active}
|
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
# People and Organization Templates
|
|
2
2
|
|
|
3
|
+
Every template opens with the YAML frontmatter block: the core keys (`type`,
|
|
4
|
+
`created`, `updated`) plus the type's conditional keys from `registry.yaml`.
|
|
5
|
+
A key lifted into frontmatter (`aliases` here) leaves the body; unmatched
|
|
6
|
+
bold keys stay body prose.
|
|
7
|
+
|
|
3
8
|
## People
|
|
4
9
|
|
|
5
10
|
```markdown
|
|
11
|
+
---
|
|
12
|
+
type: person
|
|
13
|
+
created: {YYYY-MM-DD}
|
|
14
|
+
updated: {YYYY-MM-DD}
|
|
15
|
+
aliases:
|
|
16
|
+
- "{name variant}"
|
|
17
|
+
---
|
|
18
|
+
|
|
6
19
|
# {Full Name}
|
|
7
20
|
|
|
8
21
|
## Info
|
|
9
22
|
**Role:** {role or inferred role with qualifier}
|
|
10
|
-
**Organization:** [[Organizations/{organization}]]
|
|
11
|
-
**Reports to:** [[People/{{Person}}]]
|
|
23
|
+
**Organization:** [[3-Team/Organizations/{organization}]]
|
|
24
|
+
**Reports to:** [[3-Team/People/{{Person}}]]
|
|
12
25
|
**Email:** {email}
|
|
13
|
-
**Aliases:** {comma-separated variants}
|
|
14
26
|
**First met:** {YYYY-MM-DD}
|
|
15
27
|
**Last seen:** {YYYY-MM-DD}
|
|
16
28
|
|
|
@@ -18,12 +30,12 @@
|
|
|
18
30
|
{2-3 sentences: who they are, why you know them, what you're working on}
|
|
19
31
|
|
|
20
32
|
## Connected to
|
|
21
|
-
- [[Organizations/{Org}]] — works at
|
|
22
|
-
- [[People/{Person}]] — {relationship}
|
|
23
|
-
- [[Projects/{Project}]] — {role}
|
|
33
|
+
- [[3-Team/Organizations/{Org}]] — works at
|
|
34
|
+
- [[3-Team/People/{Person}]] — {relationship}
|
|
35
|
+
- [[3-Team/Projects/{Project}]] — {role}
|
|
24
36
|
|
|
25
37
|
## Activity
|
|
26
|
-
- **{YYYY-MM-DD}** ({meeting|email|voice memo}): {Summary with [[Folder/Name]] links}
|
|
38
|
+
- **{YYYY-MM-DD}** ({meeting|email|voice memo}): {Summary with [[3-Team/Folder/Name]] links}
|
|
27
39
|
|
|
28
40
|
## Key facts
|
|
29
41
|
{substantive facts only — leave empty if none}
|
|
@@ -35,6 +47,14 @@
|
|
|
35
47
|
## Organizations
|
|
36
48
|
|
|
37
49
|
```markdown
|
|
50
|
+
---
|
|
51
|
+
type: organization
|
|
52
|
+
created: {YYYY-MM-DD}
|
|
53
|
+
updated: {YYYY-MM-DD}
|
|
54
|
+
aliases:
|
|
55
|
+
- "{name variant}"
|
|
56
|
+
---
|
|
57
|
+
|
|
38
58
|
# {Organization Name}
|
|
39
59
|
|
|
40
60
|
## Info
|
|
@@ -42,7 +62,6 @@
|
|
|
42
62
|
**Industry:** {industry}
|
|
43
63
|
**Relationship:** {customer|prospect|partner|vendor}
|
|
44
64
|
**Domain:** {primary email domain}
|
|
45
|
-
**Aliases:** {comma-separated}
|
|
46
65
|
**First met:** {YYYY-MM-DD}
|
|
47
66
|
**Last seen:** {YYYY-MM-DD}
|
|
48
67
|
|
|
@@ -50,13 +69,13 @@
|
|
|
50
69
|
{2-3 sentences}
|
|
51
70
|
|
|
52
71
|
## People
|
|
53
|
-
- [[People/{Person}]] — {role}
|
|
72
|
+
- [[3-Team/People/{Person}]] — {role}
|
|
54
73
|
|
|
55
74
|
## Contacts
|
|
56
75
|
{for transactional contacts who don't get their own notes}
|
|
57
76
|
|
|
58
77
|
## Projects
|
|
59
|
-
- [[Projects/{Project}]] — {relationship}
|
|
78
|
+
- [[3-Team/Projects/{Project}]] — {relationship}
|
|
60
79
|
|
|
61
80
|
## Activity
|
|
62
81
|
- **{YYYY-MM-DD}** ({type}): {Summary}
|
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
# Priority Templates
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
deliberately
|
|
3
|
+
`extract-entities` **never auto-creates** Priorities. The user sets them
|
|
4
|
+
deliberately. Use this template only for a note you write by hand.
|
|
5
5
|
`extract-entities` and `anarlog-process` only **link to** and **update progress
|
|
6
6
|
on** existing notes.
|
|
7
7
|
|
|
8
8
|
## Priorities
|
|
9
9
|
|
|
10
10
|
```markdown
|
|
11
|
+
---
|
|
12
|
+
type: priority
|
|
13
|
+
created: {YYYY-MM-DD}
|
|
14
|
+
updated: {YYYY-MM-DD}
|
|
15
|
+
---
|
|
16
|
+
|
|
11
17
|
# {Priority Name}
|
|
12
18
|
|
|
13
19
|
## About
|
|
14
20
|
{2-3 sentences: what this strategic direction means and why it matters}
|
|
15
21
|
|
|
16
22
|
**Status:** {active|paused|retired}
|
|
17
|
-
**Owner:** [[People/{Person}]]
|
|
23
|
+
**Owner:** [[3-Team/People/{Person}]]
|
|
18
24
|
**Set:** {YYYY-MM-DD}
|
|
19
25
|
|
|
20
26
|
## What this means
|
|
@@ -25,7 +31,7 @@ on** existing notes.
|
|
|
25
31
|
here — there is no separate Goals entity.}
|
|
26
32
|
|
|
27
33
|
## Projects
|
|
28
|
-
- [[Projects/{Project}]] — {relationship}
|
|
34
|
+
- [[3-Team/Projects/{Project}]] — {relationship}
|
|
29
35
|
|
|
30
36
|
## Key facts
|
|
31
37
|
{substantive facts only — leave empty if none}
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
## Projects
|
|
4
4
|
|
|
5
5
|
```markdown
|
|
6
|
+
---
|
|
7
|
+
type: project
|
|
8
|
+
created: {YYYY-MM-DD}
|
|
9
|
+
updated: {YYYY-MM-DD}
|
|
10
|
+
---
|
|
11
|
+
|
|
6
12
|
# {Project Name}
|
|
7
13
|
|
|
8
14
|
## Info
|
|
@@ -15,17 +21,17 @@
|
|
|
15
21
|
{2-3 sentences}
|
|
16
22
|
|
|
17
23
|
## Priorities
|
|
18
|
-
- [[Priorities/{Priority}]] — {how this project contributes}
|
|
24
|
+
- [[3-Team/Priorities/{Priority}]] — {how this project contributes}
|
|
19
25
|
|
|
20
26
|
## People
|
|
21
|
-
- [[People/{Person}]] — {role}
|
|
27
|
+
- [[3-Team/People/{Person}]] — {role}
|
|
22
28
|
|
|
23
29
|
## Organizations
|
|
24
|
-
- [[Organizations/{Org}]] — {relationship}
|
|
30
|
+
- [[3-Team/Organizations/{Org}]] — {relationship}
|
|
25
31
|
|
|
26
32
|
## Related
|
|
27
|
-
- [[Priorities/{Priority}]] — {relationship}
|
|
28
|
-
- [[Topics/{Topic}]] — {relationship}
|
|
33
|
+
- [[3-Team/Priorities/{Priority}]] — {relationship}
|
|
34
|
+
- [[3-Team/Topics/{Topic}]] — {relationship}
|
|
29
35
|
|
|
30
36
|
## Timeline
|
|
31
37
|
**{YYYY-MM-DD}** ({type})
|
|
@@ -42,6 +48,12 @@
|
|
|
42
48
|
## Topics
|
|
43
49
|
|
|
44
50
|
```markdown
|
|
51
|
+
---
|
|
52
|
+
type: topic
|
|
53
|
+
created: {YYYY-MM-DD}
|
|
54
|
+
updated: {YYYY-MM-DD}
|
|
55
|
+
---
|
|
56
|
+
|
|
45
57
|
# {Topic Name}
|
|
46
58
|
|
|
47
59
|
## About
|
|
@@ -53,8 +65,8 @@
|
|
|
53
65
|
**Last mentioned:** {YYYY-MM-DD}
|
|
54
66
|
|
|
55
67
|
## Related
|
|
56
|
-
- [[People/{Person}]] — {relationship}
|
|
57
|
-
- [[Organizations/{Org}]] — {relationship}
|
|
68
|
+
- [[3-Team/People/{Person}]] — {relationship}
|
|
69
|
+
- [[3-Team/Organizations/{Org}]] — {relationship}
|
|
58
70
|
|
|
59
71
|
## Log
|
|
60
72
|
**{YYYY-MM-DD}** ({type}: {title})
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Manage graph_processed state for entity extraction.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* that are new or changed since their last recorded hash
|
|
8
|
-
* as processed
|
|
5
|
+
* The script tracks which source files the extract-entities skill already
|
|
6
|
+
* processed. Those files are synced emails and calendar events. The `check`
|
|
7
|
+
* command lists files that are new or changed since their last recorded hash.
|
|
8
|
+
* The `update` command marks files as processed. It stores the current
|
|
9
|
+
* SHA-256 hash of each file.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
+
* The script keeps the state in a TSV file at
|
|
11
12
|
* ~/.cache/fit/outpost/state/graph_processed (path<TAB>hash).
|
|
12
13
|
*/
|
|
13
14
|
|
|
@@ -43,7 +44,7 @@ const SOURCE_DIRS = [
|
|
|
43
44
|
join(HOME, ".cache/fit/outpost/teams_chat"),
|
|
44
45
|
];
|
|
45
46
|
|
|
46
|
-
/** Compute SHA-256 hash of a file. */
|
|
47
|
+
/** Compute the SHA-256 hash of a file. */
|
|
47
48
|
function fileHash(filePath) {
|
|
48
49
|
const data = readFileSync(filePath);
|
|
49
50
|
return createHash("sha256").update(data).digest("hex");
|
|
@@ -74,7 +75,7 @@ function saveState(state) {
|
|
|
74
75
|
writeFileSync(STATE_FILE, text);
|
|
75
76
|
}
|
|
76
77
|
|
|
77
|
-
/** Find source files that are new or
|
|
78
|
+
/** Find source files that are new or changed since the last run. */
|
|
78
79
|
function check() {
|
|
79
80
|
const state = loadState();
|
|
80
81
|
const newFiles = [];
|
|
@@ -97,7 +98,7 @@ function check() {
|
|
|
97
98
|
return newFiles.length;
|
|
98
99
|
}
|
|
99
100
|
|
|
100
|
-
/** Mark files as processed
|
|
101
|
+
/** Mark files as processed. Update their hashes in the state file. */
|
|
101
102
|
function update(filePaths) {
|
|
102
103
|
const state = loadState();
|
|
103
104
|
for (const fp of filePaths) {
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: meeting-prep
|
|
3
|
-
description: Prepare for meetings
|
|
3
|
+
description: Prepare for meetings. Gather context from the knowledge base and calendar. Use when the user asks to prep for a meeting or wants a briefing on upcoming meetings. Creates personalized briefings with attendee history, open items, and suggested talking points.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Meeting Prep
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
Write tier: none (the output is personal `Briefings/`)
|
|
9
|
+
Frontmatter: none
|
|
10
|
+
|
|
11
|
+
Help the user prepare for meetings. Gather context from the knowledge base and
|
|
12
|
+
calendar. Create personalized briefing documents with attendee history, open
|
|
13
|
+
items, and suggested talking points.
|
|
11
14
|
|
|
12
15
|
## Trigger
|
|
13
16
|
|
|
@@ -17,19 +20,21 @@ meetings.
|
|
|
17
20
|
## Prerequisites
|
|
18
21
|
|
|
19
22
|
- Calendar data synced in `~/.cache/fit/outpost/apple_calendar/`
|
|
20
|
-
-
|
|
23
|
+
- A populated knowledge base (from the `extract-entities` skill)
|
|
21
24
|
|
|
22
25
|
## Inputs
|
|
23
26
|
|
|
24
27
|
- `~/.cache/fit/outpost/apple_calendar/*.json` — calendar events
|
|
25
|
-
- `
|
|
26
|
-
- `
|
|
27
|
-
- `
|
|
28
|
-
- `
|
|
29
|
-
|
|
30
|
-
- `
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
- `3-Team/People/*.md` — attendee context
|
|
29
|
+
- `3-Team/Organizations/*.md` — company context
|
|
30
|
+
- `3-Team/Projects/*.md` — project context
|
|
31
|
+
- `3-Team/Priorities/*.md` — active priorities and strategic context to
|
|
32
|
+
frame the brief
|
|
33
|
+
- `2-Confidential/Candidates/*/brief.md` — candidate context (for interview
|
|
34
|
+
meetings)
|
|
35
|
+
- `2-Confidential/Roles/*.md` — role/requisition context (for interview
|
|
36
|
+
meetings). Check the `**Status:**` field to distinguish active from historical
|
|
37
|
+
reqs
|
|
33
38
|
|
|
34
39
|
## Outputs
|
|
35
40
|
|
|
@@ -39,32 +44,32 @@ meetings.
|
|
|
39
44
|
|
|
40
45
|
## Critical: Always Look Up Context First
|
|
41
46
|
|
|
42
|
-
**BEFORE
|
|
47
|
+
**BEFORE you create any meeting brief, you MUST look up the attendees in the
|
|
43
48
|
knowledge base.**
|
|
44
49
|
|
|
45
50
|
When the user asks to prep for a meeting:
|
|
46
51
|
|
|
47
52
|
1. **STOP** — Do not create a generic brief
|
|
48
|
-
2. **SEARCH** — Look up each attendee: `rg -l "Attendee Name"
|
|
49
|
-
3. **READ** — Read their notes: `cat "
|
|
53
|
+
2. **SEARCH** — Look up each attendee: `rg -l "Attendee Name" [0-9]-*/`
|
|
54
|
+
3. **READ** — Read their notes: `cat "3-Team/People/Attendee Name.md"`
|
|
50
55
|
4. **UNDERSTAND** — Extract role, organization, history, open items
|
|
51
|
-
5. **THEN BRIEF** — Create the meeting brief
|
|
56
|
+
5. **THEN BRIEF** — Create the meeting brief with this context
|
|
52
57
|
|
|
53
58
|
## Key Principles
|
|
54
59
|
|
|
55
|
-
**Ask
|
|
60
|
+
**Ask. Do not guess:**
|
|
56
61
|
|
|
57
62
|
- If unclear which meeting, ASK
|
|
58
63
|
- If multiple upcoming meetings, offer choices
|
|
59
64
|
- **WRONG:** "Here's a generic meeting prep template"
|
|
60
65
|
- **RIGHT:** "I see meetings with Sarah (2pm) and John (4pm). Which one?"
|
|
61
66
|
|
|
62
|
-
**Be thorough
|
|
67
|
+
**Be thorough. Do not be generic:**
|
|
63
68
|
|
|
64
|
-
- Include specific history, open items, and context from knowledge base
|
|
69
|
+
- Include specific history, open items, and context from the knowledge base
|
|
65
70
|
- Reference actual past interactions and commitments
|
|
66
71
|
|
|
67
|
-
##
|
|
72
|
+
## Process Flow
|
|
68
73
|
|
|
69
74
|
### Step 1: Identify the Meeting
|
|
70
75
|
|
|
@@ -82,7 +87,7 @@ If "prep me for my next meeting":
|
|
|
82
87
|
|
|
83
88
|
- Query upcoming events with `--upcoming 2h`
|
|
84
89
|
- Find the next meeting with external attendees
|
|
85
|
-
- Confirm with user if unclear
|
|
90
|
+
- Confirm with the user if unclear
|
|
86
91
|
|
|
87
92
|
### Step 2: Parse Calendar Event
|
|
88
93
|
|
|
@@ -93,18 +98,18 @@ Extract: summary, start/end time, attendees (names and emails), description.
|
|
|
93
98
|
For each attendee:
|
|
94
99
|
|
|
95
100
|
```bash
|
|
96
|
-
rg -l "attendee_name"
|
|
97
|
-
rg -l "attendee_email"
|
|
98
|
-
cat "
|
|
99
|
-
cat "
|
|
100
|
-
rg -l "attendee_name"
|
|
101
|
+
rg -l "attendee_name" 3-Team/People/
|
|
102
|
+
rg -l "attendee_email" 3-Team/People/
|
|
103
|
+
cat "3-Team/People/Attendee Name.md"
|
|
104
|
+
cat "3-Team/Organizations/Their Company.md"
|
|
105
|
+
rg -l "attendee_name" 3-Team/Projects/
|
|
101
106
|
```
|
|
102
107
|
|
|
103
108
|
Extract: role/title, company, key facts, previous interactions, open items.
|
|
104
109
|
|
|
105
|
-
Also check `
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
Also check `3-Team/Priorities/` for context relevant to the meeting topic.
|
|
111
|
+
For example, if the meeting is about hiring, surface the relevant hiring
|
|
112
|
+
Priority's status and progress.
|
|
108
113
|
|
|
109
114
|
### Step 4: Create Meeting Brief
|
|
110
115
|
|
|
@@ -134,19 +139,20 @@ Suggested Talking Points
|
|
|
134
139
|
**Guidelines:**
|
|
135
140
|
|
|
136
141
|
- Use `[[Name]]` wiki-link syntax for cross-references
|
|
137
|
-
- Keep "About" section to 2-3 sentences max
|
|
142
|
+
- Keep the "About" section to 2-3 sentences max
|
|
138
143
|
- History: reverse chronological, 3-5 most relevant items
|
|
139
|
-
- Talking points: concrete
|
|
144
|
+
- Talking points: concrete. Avoid generic suggestions
|
|
140
145
|
- If no notes exist for a person, mention that and offer to create one
|
|
141
146
|
|
|
142
147
|
### Interview Meeting Context
|
|
143
148
|
|
|
144
|
-
When
|
|
145
|
-
"Decomposition", "Panel", or a candidate name from
|
|
149
|
+
When you prepare for interview meetings (title contains "Interview",
|
|
150
|
+
"Screening", "Decomposition", "Panel", or a candidate name from
|
|
151
|
+
`2-Confidential/Candidates/`):
|
|
146
152
|
|
|
147
|
-
1. **Read the candidate brief:** `
|
|
153
|
+
1. **Read the candidate brief:** `2-Confidential/Candidates/{Name}/brief.md`
|
|
148
154
|
2. **Read the Role file:** Look up the `Req` field and read the corresponding
|
|
149
|
-
`
|
|
155
|
+
`2-Confidential/Roles/*.md` file. Check the `**Status:**` field for context.
|
|
150
156
|
3. **Include in the briefing:**
|
|
151
157
|
- Candidate's current status, skills, and screening recommendation
|
|
152
158
|
- Role context: hiring manager, domain lead, remaining positions
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: organize-files
|
|
3
|
-
description: Organize, tidy up, and find files in ~/Desktop/ and ~/Downloads/. Use when the user asks to find, organize, clean up, or tidy files on their Mac. Always previews changes before
|
|
3
|
+
description: Organize, tidy up, and find files in ~/Desktop/ and ~/Downloads/. Use when the user asks to find, organize, clean up, or tidy files on their Mac. Always previews changes before it acts. Never deletes without explicit confirmation. Extracts entities from document files with the extract-entities skill.
|
|
4
4
|
compatibility: Requires macOS filesystem access
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Organize Files
|
|
8
8
|
|
|
9
|
+
Write tier: none (delegates graph writes to extract-entities)
|
|
10
|
+
Frontmatter: none
|
|
11
|
+
|
|
9
12
|
Organize, tidy up, and find files in `~/Desktop/` and `~/Downloads/`. Always
|
|
10
|
-
|
|
13
|
+
preview changes before you act. Never delete without explicit confirmation.
|
|
11
14
|
|
|
12
|
-
After
|
|
15
|
+
After you organize, extract entities from document files. Invoke the
|
|
13
16
|
**`extract-entities`** skill.
|
|
14
17
|
|
|
15
18
|
## Trigger
|
|
@@ -29,7 +32,7 @@ Run when the user asks to find, organize, clean up, or tidy files on their Mac.
|
|
|
29
32
|
|
|
30
33
|
- Organized files moved to logical subdirectories within `~/Desktop/` and
|
|
31
34
|
`~/Downloads/`
|
|
32
|
-
- Entity extraction triggered on document files
|
|
35
|
+
- Entity extraction triggered on document files with the **`extract-entities`**
|
|
33
36
|
skill
|
|
34
37
|
- Summary of actions taken
|
|
35
38
|
|
|
@@ -42,22 +45,23 @@ Run when the user asks to find, organize, clean up, or tidy files on their Mac.
|
|
|
42
45
|
2. **Organize files** — Move files into logical subfolders
|
|
43
46
|
3. **Tidy up** — Clean up cluttered `~/Desktop/` and `~/Downloads/`
|
|
44
47
|
4. **Create structure** — Set up folder hierarchies
|
|
45
|
-
5. **Extract entities** — After
|
|
46
|
-
skill on document files to populate the knowledge
|
|
48
|
+
5. **Extract entities** — After you organize, invoke the
|
|
49
|
+
**`extract-entities`** skill on document files to populate the knowledge
|
|
50
|
+
graph
|
|
47
51
|
|
|
48
52
|
## Key Principles
|
|
49
53
|
|
|
50
|
-
**Always preview before
|
|
54
|
+
**Always preview before you act:**
|
|
51
55
|
|
|
52
|
-
- Show
|
|
56
|
+
- Show which files change BEFORE you move or delete them
|
|
53
57
|
- List proposed changes and ask for confirmation
|
|
54
58
|
|
|
55
59
|
**Be conservative with destructive operations:**
|
|
56
60
|
|
|
57
61
|
- Never delete without explicit confirmation
|
|
58
|
-
-
|
|
62
|
+
- Move to a "to-review" folder rather than delete
|
|
59
63
|
|
|
60
|
-
##
|
|
64
|
+
## Summarize the Contents
|
|
61
65
|
|
|
62
66
|
Get an overview of both directories:
|
|
63
67
|
|
|
@@ -65,7 +69,7 @@ Get an overview of both directories:
|
|
|
65
69
|
node scripts/summarize.mjs
|
|
66
70
|
```
|
|
67
71
|
|
|
68
|
-
##
|
|
72
|
+
## Find Files
|
|
69
73
|
|
|
70
74
|
```bash
|
|
71
75
|
find ~/Downloads -maxdepth 1 -name "*.pdf" -type f
|
|
@@ -76,7 +80,7 @@ find ~/Downloads -maxdepth 1 -type f -mtime +30 # older than 30 days
|
|
|
76
80
|
find ~/Desktop -maxdepth 1 \( -name "Screenshot*" -o -name "Screen Shot*" \)
|
|
77
81
|
```
|
|
78
82
|
|
|
79
|
-
##
|
|
83
|
+
## Organize by File Type
|
|
80
84
|
|
|
81
85
|
Organize a directory into type-based subdirectories (Documents, Images,
|
|
82
86
|
Archives, Installers, Screenshots):
|
|
@@ -86,13 +90,13 @@ node scripts/organize-by-type.mjs ~/Downloads
|
|
|
86
90
|
node scripts/organize-by-type.mjs ~/Desktop
|
|
87
91
|
```
|
|
88
92
|
|
|
89
|
-
The script creates subdirectories and moves
|
|
90
|
-
anything.
|
|
93
|
+
The script creates subdirectories and moves the files that match. It does NOT
|
|
94
|
+
delete anything.
|
|
91
95
|
|
|
92
96
|
## Entity Extraction
|
|
93
97
|
|
|
94
|
-
After
|
|
95
|
-
information (people, organizations, projects, topics)
|
|
98
|
+
After you organize the files, identify document files that may contain entity
|
|
99
|
+
information (people, organizations, projects, topics). Then invoke the
|
|
96
100
|
**`extract-entities`** skill to process them.
|
|
97
101
|
|
|
98
102
|
### Which files to send for extraction
|
|
@@ -103,8 +107,8 @@ information (people, organizations, projects, topics) and invoke the
|
|
|
103
107
|
|
|
104
108
|
### How to invoke
|
|
105
109
|
|
|
106
|
-
After
|
|
107
|
-
**`extract-entities`** skill
|
|
110
|
+
After you organize, collect the paths of the document files. Then invoke the
|
|
111
|
+
**`extract-entities`** skill and pass the file paths as ad-hoc file inputs.
|
|
108
112
|
|
|
109
113
|
## Output Format
|
|
110
114
|
|
|
@@ -141,10 +145,11 @@ Entity extraction: invoked extract-entities on 12 document files
|
|
|
141
145
|
|
|
142
146
|
## Safety Rules
|
|
143
147
|
|
|
144
|
-
1. **Never delete without permission** — "cleanup" means organize
|
|
148
|
+
1. **Never delete without permission** — "cleanup" means organize. It does not
|
|
149
|
+
mean delete
|
|
145
150
|
2. **Don't touch system folders** — /System, /Library, /Applications
|
|
146
|
-
3. **Don't touch hidden files** — files
|
|
151
|
+
3. **Don't touch hidden files** — files that start with `.` unless asked
|
|
147
152
|
4. **Limit scope** — only operate on `~/Desktop/` and `~/Downloads/`
|
|
148
|
-
5. **Limit depth** — use `-maxdepth 1` unless user wants recursive
|
|
149
|
-
6. **Show before
|
|
153
|
+
5. **Limit depth** — use `-maxdepth 1` unless the user wants recursive
|
|
154
|
+
6. **Show before you act** — always preview first
|
|
150
155
|
7. **Quote paths** — handle spaces: `"$HOME/My Documents"`
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Organize files in a directory by type into subdirectories.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* subdirectories: Screenshots, Documents, Images, Archives, and
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* The script scans the top level of the given directory. It moves files into
|
|
6
|
+
* category subdirectories: Screenshots, Documents, Images, Archives, and
|
|
7
|
+
* Installers. The file extension and the name prefix set the category. The
|
|
8
|
+
* script leaves a file in place if it matches no category. It does NOT delete
|
|
9
|
+
* anything.
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
12
|
import {
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Summarize the contents of ~/Desktop/ and ~/Downloads/.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Images, Documents, Archives, Installers, Other)
|
|
7
|
-
* table for each.
|
|
8
|
-
* contents before
|
|
5
|
+
* The script counts top-level files in both directories by type
|
|
6
|
+
* (Screenshots, PDFs, Images, Documents, Archives, Installers, Other). It
|
|
7
|
+
* prints a human-readable table for each directory. The organize-files skill
|
|
8
|
+
* uses this script to preview directory contents before it organizes them.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { existsSync, readdirSync, statSync } from "node:fs";
|