@forwardimpact/outpost 3.12.0 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +6 -5
  4. package/src/agent-path.js +10 -6
  5. package/src/agent-runner.js +28 -24
  6. package/src/index.js +2 -3
  7. package/src/kb-manager.js +75 -20
  8. package/src/kb-validator.js +762 -0
  9. package/src/outpost.js +108 -39
  10. package/src/posture.js +3 -3
  11. package/src/privilege.js +11 -11
  12. package/src/scheduler.js +14 -12
  13. package/src/socket-server.js +19 -18
  14. package/src/spawn-env.js +7 -6
  15. package/src/state-manager.js +2 -2
  16. package/templates/.claude/agents/chief-of-staff.md +32 -24
  17. package/templates/.claude/agents/concierge.md +26 -17
  18. package/templates/.claude/agents/head-hunter.md +34 -26
  19. package/templates/.claude/agents/librarian.md +26 -18
  20. package/templates/.claude/agents/postman.md +26 -18
  21. package/templates/.claude/agents/recruiter.md +38 -27
  22. package/templates/.claude/skills/anarlog-follow/SKILL.md +91 -66
  23. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  24. package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
  25. package/templates/.claude/skills/anarlog-process/SKILL.md +108 -62
  26. package/templates/.claude/skills/anarlog-process/references/extraction.md +41 -29
  27. package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
  28. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +402 -160
  29. package/templates/.claude/skills/candidate-report/SKILL.md +41 -36
  30. package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
  31. package/templates/.claude/skills/candidate-report/references/report.css +4 -4
  32. package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
  33. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
  34. package/templates/.claude/skills/changelog/SKILL.md +122 -67
  35. package/templates/.claude/skills/deck-create/SKILL.md +90 -32
  36. package/templates/.claude/skills/deck-create/references/slide.css +4 -4
  37. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
  38. package/templates/.claude/skills/deck-review/SKILL.md +63 -58
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +55 -45
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +5 -4
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +39 -34
  44. package/templates/.claude/skills/doc-create/SKILL.md +27 -23
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +63 -53
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +15 -8
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +19 -11
  50. package/templates/.claude/skills/extract-entities/SKILL.md +76 -75
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +6 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +20 -18
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +37 -13
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +30 -24
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +14 -14
  57. package/templates/.claude/skills/extract-entities/references/sources.md +9 -9
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +12 -6
  59. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
  60. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +10 -4
  61. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
  62. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  63. package/templates/.claude/skills/meeting-prep/SKILL.md +42 -36
  64. package/templates/.claude/skills/organize-files/SKILL.md +27 -22
  65. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  66. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  67. package/templates/.claude/skills/person-identify/SKILL.md +77 -27
  68. package/templates/.claude/skills/person-identify/scripts/identify.sh +125 -26
  69. package/templates/.claude/skills/person-lookup/SKILL.md +34 -30
  70. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +46 -17
  71. package/templates/.claude/skills/req-assess/SKILL.md +44 -36
  72. package/templates/.claude/skills/req-assess/references/interview-template.md +7 -2
  73. package/templates/.claude/skills/req-assess/references/panel-template.md +7 -2
  74. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  75. package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
  76. package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
  77. package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
  78. package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
  79. package/templates/.claude/skills/req-decide/SKILL.md +52 -41
  80. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  81. package/templates/.claude/skills/req-decide/references/template.md +2 -2
  82. package/templates/.claude/skills/req-forget/SKILL.md +58 -39
  83. package/templates/.claude/skills/req-forget/references/classify.md +15 -13
  84. package/templates/.claude/skills/req-forget/references/locations.md +27 -22
  85. package/templates/.claude/skills/req-forget/references/report-template.md +24 -16
  86. package/templates/.claude/skills/req-scan/SKILL.md +27 -25
  87. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  88. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  89. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  90. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  91. package/templates/.claude/skills/req-scan/references/template.md +11 -1
  92. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  93. package/templates/.claude/skills/req-screen/SKILL.md +96 -50
  94. package/templates/.claude/skills/req-screen/references/rubric.md +46 -50
  95. package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
  96. package/templates/.claude/skills/req-screen/references/template.md +29 -17
  97. package/templates/.claude/skills/req-track/SKILL.md +76 -76
  98. package/templates/.claude/skills/req-track/references/fields.md +31 -27
  99. package/templates/.claude/skills/req-track/references/overlays.md +42 -0
  100. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  101. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  102. package/templates/.claude/skills/req-track/references/templates.md +28 -27
  103. package/templates/.claude/skills/req-workday/SKILL.md +69 -40
  104. package/templates/.claude/skills/req-workday/references/brief.md +81 -0
  105. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  106. package/templates/.claude/skills/req-workday/references/templates.md +11 -78
  107. package/templates/.claude/skills/req-workday/references/xlsx-format.md +26 -7
  108. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +113 -35
  109. package/templates/.claude/skills/send-chat/SKILL.md +58 -54
  110. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +23 -19
  111. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  112. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  113. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  114. package/templates/.claude/skills/sync-apple-mail/SKILL.md +20 -14
  115. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  116. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  117. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  118. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  119. package/templates/.claude/skills/sync-teams/SKILL.md +46 -43
  120. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  121. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  122. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  123. package/templates/.claude/skills/upstream-instructions/SKILL.md +43 -41
  124. package/templates/.claude/skills/upstream-instructions/references/examples.md +5 -5
  125. package/templates/CLAUDE.md +97 -85
  126. package/templates/MIGRATION.md +359 -0
  127. package/templates/registry.yaml +25 -0
  128. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
  129. package/templates/.claude/skills/anarlog-trim/SKILL.md +0 -183
@@ -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 — calendar
23
- events only *enrich* existing notes (see the table below). An attendee who is
24
- only on the invite list, with no interaction or decision attributed to them, is
25
- not profiled. If they matter, they go in the Organization's `## Contacts`. Never
26
- write a placeholder profile; see the
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 `Knowledge/People/`.
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", "Connecting"; body
58
- contains "introduce you to", "want to connect", "meet [Name]"; new person is
59
- CC'd.
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
- They can be **auto-created** by the librarian agent when cross-cutting patterns
5
- are detected, or manually created by the user. Lifecycle: active → resolved.
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, Roles, and People impacted by this condition}
20
- - [[Priorities/{Priority}]]{how it's affected}
21
- - [[Projects/{Project}]] — {how it's affected}
22
- - [[Roles/{Role}]] — {how it's affected}
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
- Priorities are **never auto-created** by `extract-entities`. They are set
4
- deliberately by the user. This template is for manual creation only
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
- * Tracks which source files (synced emails and calendar events) have already
6
- * been processed by the extract-entities skill. The `check` command lists files
7
- * that are new or changed since their last recorded hash; `update` marks files
8
- * as processed by storing their current SHA-256 hash.
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
- * State is persisted as a TSV file at
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 have changed since last processing. */
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 by updating their hashes in state. */
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 by gathering 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.
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
- Help the user prepare for meetings by gathering context from the knowledge base
9
- and calendar. Creates personalized briefing documents with attendee history,
10
- open items, and suggested talking points.
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
- - Knowledge base populated (from `extract-entities` skill)
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
- - `Knowledge/People/*.md` — attendee context
26
- - `Knowledge/Organizations/*.md` — company context
27
- - `Knowledge/Projects/*.md` — project context
28
- - `Knowledge/Priorities/*.md` — active priorities and strategic context for
29
- framing
30
- - `Knowledge/Candidates/*/brief.md` — candidate context (for interview meetings)
31
- - `Knowledge/Roles/*.md` — role/requisition context (for interview meetings);
32
- check the `**Status:**` field to distinguish active from historical reqs
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 creating any meeting brief, you MUST look up the attendees in the
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" Knowledge/`
49
- 3. **READ** — Read their notes: `cat "Knowledge/People/Attendee Name.md"`
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 using this context
56
+ 5. **THEN BRIEF** — Create the meeting brief with this context
52
57
 
53
58
  ## Key Principles
54
59
 
55
- **Ask, don't guess:**
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, not generic:**
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
- ## Processing Flow
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" Knowledge/People/
97
- rg -l "attendee_email" Knowledge/People/
98
- cat "Knowledge/People/Attendee Name.md"
99
- cat "Knowledge/Organizations/Their Company.md"
100
- rg -l "attendee_name" Knowledge/Projects/
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 `Knowledge/Priorities/` for context relevant
106
- to the meeting topic — e.g. if the meeting is about hiring, surface the relevant
107
- hiring Priority's status and progress.
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, not generic
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 preparing for interview meetings (title contains "Interview", "Screening",
145
- "Decomposition", "Panel", or a candidate name from `Knowledge/Candidates/`):
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:** `Knowledge/Candidates/{Name}/brief.md`
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
- `Knowledge/Roles/*.md` file; check the `**Status:**` field for context.
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 acting and never deletes without explicit confirmation. Extracts entities from document files using the extract-entities skill.
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
- previews changes before acting and never deletes without explicit confirmation.
13
+ preview changes before you act. Never delete without explicit confirmation.
11
14
 
12
- After organizing, extract entities from document files by invoking the
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 via the **`extract-entities`**
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 organizing, invoke the **`extract-entities`**
46
- skill on document files to populate the knowledge graph
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 acting:**
54
+ **Always preview before you act:**
51
55
 
52
- - Show what files will be affected BEFORE moving/deleting
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
- - Prefer moving to a "to-review" folder over deleting
62
+ - Move to a "to-review" folder rather than delete
59
63
 
60
- ## Summarizing Contents
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
- ## Finding Files
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
- ## Organizing by File Type
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 matching files. It does NOT delete
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 organizing files, identify document files that may contain entity
95
- information (people, organizations, projects, topics) and invoke the
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 organizing, collect the paths of document files and invoke the
107
- **`extract-entities`** skill, passing the file paths as ad-hoc file inputs.
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, not delete
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 starting with `.` unless asked
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 doing** — always preview first
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
- * Scans the top level of the given directory and moves files into category
6
- * subdirectories: Screenshots, Documents, Images, Archives, and Installers.
7
- * Categories are determined by file extension and name prefix. Files that do
8
- * not match any category are left in place. Does NOT delete anything.
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
- * Counts top-level files in both directories by type (Screenshots, PDFs,
6
- * Images, Documents, Archives, Installers, Other) and prints a human-readable
7
- * table for each. Used by the organize-files skill to preview directory
8
- * contents before organizing.
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";