@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.
Files changed (85) hide show
  1. package/package.json +3 -2
  2. package/src/kb-manager.js +58 -5
  3. package/src/kb-validator.js +762 -0
  4. package/src/outpost.js +73 -8
  5. package/templates/.claude/agents/chief-of-staff.md +14 -6
  6. package/templates/.claude/agents/concierge.md +9 -2
  7. package/templates/.claude/agents/head-hunter.md +9 -2
  8. package/templates/.claude/agents/librarian.md +11 -4
  9. package/templates/.claude/agents/postman.md +9 -2
  10. package/templates/.claude/agents/recruiter.md +9 -2
  11. package/templates/.claude/skills/anarlog-follow/SKILL.md +53 -29
  12. package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
  13. package/templates/.claude/skills/anarlog-process/SKILL.md +88 -45
  14. package/templates/.claude/skills/anarlog-process/references/extraction.md +19 -11
  15. package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
  16. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +404 -163
  17. package/templates/.claude/skills/candidate-report/SKILL.md +12 -9
  18. package/templates/.claude/skills/changelog/SKILL.md +106 -56
  19. package/templates/.claude/skills/deck-create/SKILL.md +60 -2
  20. package/templates/.claude/skills/deck-review/SKILL.md +4 -1
  21. package/templates/.claude/skills/deck-summarize/SKILL.md +6 -2
  22. package/templates/.claude/skills/deck-summarize/references/brief-template.md +1 -1
  23. package/templates/.claude/skills/doc-collab/SKILL.md +16 -11
  24. package/templates/.claude/skills/doc-create/SKILL.md +6 -3
  25. package/templates/.claude/skills/draft-emails/SKILL.md +31 -25
  26. package/templates/.claude/skills/draft-emails/references/template.md +1 -1
  27. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +14 -8
  28. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +9 -3
  29. package/templates/.claude/skills/extract-entities/SKILL.md +17 -16
  30. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +2 -1
  31. package/templates/.claude/skills/extract-entities/references/conditions.md +6 -5
  32. package/templates/.claude/skills/extract-entities/references/links.md +34 -10
  33. package/templates/.claude/skills/extract-entities/references/recruitment.md +15 -10
  34. package/templates/.claude/skills/extract-entities/references/resolution.md +1 -1
  35. package/templates/.claude/skills/extract-entities/references/sources.md +1 -1
  36. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +10 -4
  37. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
  38. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +8 -2
  39. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
  40. package/templates/.claude/skills/meeting-prep/SKILL.md +23 -18
  41. package/templates/.claude/skills/organize-files/SKILL.md +3 -0
  42. package/templates/.claude/skills/person-identify/SKILL.md +58 -10
  43. package/templates/.claude/skills/person-identify/scripts/identify.sh +110 -11
  44. package/templates/.claude/skills/person-lookup/SKILL.md +8 -3
  45. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +27 -1
  46. package/templates/.claude/skills/req-assess/SKILL.md +19 -11
  47. package/templates/.claude/skills/req-assess/references/interview-template.md +6 -1
  48. package/templates/.claude/skills/req-assess/references/panel-template.md +5 -1
  49. package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
  50. package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
  51. package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
  52. package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
  53. package/templates/.claude/skills/req-decide/SKILL.md +26 -18
  54. package/templates/.claude/skills/req-decide/references/template.md +2 -2
  55. package/templates/.claude/skills/req-forget/SKILL.md +39 -22
  56. package/templates/.claude/skills/req-forget/references/classify.md +12 -10
  57. package/templates/.claude/skills/req-forget/references/locations.md +27 -22
  58. package/templates/.claude/skills/req-forget/references/report-template.md +23 -15
  59. package/templates/.claude/skills/req-scan/SKILL.md +6 -3
  60. package/templates/.claude/skills/req-scan/references/template.md +11 -1
  61. package/templates/.claude/skills/req-screen/SKILL.md +78 -34
  62. package/templates/.claude/skills/req-screen/references/rubric.md +38 -42
  63. package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
  64. package/templates/.claude/skills/req-screen/references/template.md +26 -14
  65. package/templates/.claude/skills/req-track/SKILL.md +44 -44
  66. package/templates/.claude/skills/req-track/references/fields.md +18 -15
  67. package/templates/.claude/skills/req-track/references/overlays.md +42 -0
  68. package/templates/.claude/skills/req-track/references/signals.md +2 -2
  69. package/templates/.claude/skills/req-track/references/templates.md +28 -27
  70. package/templates/.claude/skills/req-workday/SKILL.md +49 -20
  71. package/templates/.claude/skills/req-workday/references/brief.md +81 -0
  72. package/templates/.claude/skills/req-workday/references/templates.md +6 -73
  73. package/templates/.claude/skills/req-workday/references/xlsx-format.md +19 -0
  74. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +96 -20
  75. package/templates/.claude/skills/send-chat/SKILL.md +11 -11
  76. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +3 -0
  77. package/templates/.claude/skills/sync-apple-mail/SKILL.md +3 -0
  78. package/templates/.claude/skills/sync-teams/SKILL.md +3 -0
  79. package/templates/.claude/skills/upstream-instructions/SKILL.md +8 -5
  80. package/templates/.claude/skills/upstream-instructions/references/examples.md +3 -3
  81. package/templates/CLAUDE.md +96 -87
  82. package/templates/MIGRATION.md +359 -0
  83. package/templates/registry.yaml +25 -0
  84. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
  85. package/templates/.claude/skills/anarlog-trim/SKILL.md +0 -186
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forwardimpact/outpost",
3
- "version": "3.12.1",
3
+ "version": "3.13.0",
4
4
  "description": "Personal operations center — context assembled from email, calendar, and knowledge so preparation is continuous instead of a morning scramble.",
5
5
  "homepage": "https://www.forwardimpact.team",
6
6
  "repository": {
@@ -51,7 +51,8 @@
51
51
  "@forwardimpact/libcli": "^0.1.0",
52
52
  "@forwardimpact/libpreflight": "^0.1.0",
53
53
  "@forwardimpact/libtelemetry": "^0.1.33",
54
- "@forwardimpact/libutil": "^0.1.0"
54
+ "@forwardimpact/libutil": "^0.1.0",
55
+ "yaml": "^2.9.0"
55
56
  },
56
57
  "devDependencies": {
57
58
  "@forwardimpact/libmock": "^0.1.0"
package/src/kb-manager.js CHANGED
@@ -6,6 +6,8 @@ import { join, dirname, resolve, basename } from "node:path";
6
6
  import { homedir } from "node:os";
7
7
  import { createLogger } from "@forwardimpact/libtelemetry";
8
8
 
9
+ import { LEGACY_ROOTS } from "./kb-validator.js";
10
+
9
11
  /** Manage the knowledge base lifecycle: init, update, and settings merge. */
10
12
  export class KBManager {
11
13
  #fs;
@@ -207,14 +209,23 @@ export class KBManager {
207
209
  }
208
210
 
209
211
  await this.#ensureDir(dest);
210
- // Create the top-level roots only. `Knowledge/` is the shared graph, and
211
- // the team syncs it. `Drafts/` and `Briefings/` are personal and local.
212
- // The skills that write into the entity subdirectories (People,
213
- // Organizations, ...) create them on demand.
214
- for (const d of ["Knowledge", "Drafts", "Briefings"])
212
+ // Create the tier directories and the personal `Briefings/` root only.
213
+ // The numbered tiers are the knowledge graph and the units of sharing;
214
+ // every other root entry is personal. The skills that write into the
215
+ // entity subdirectories (People, Organizations, ...) create them on
216
+ // demand inside each tier.
217
+ for (const d of [
218
+ "0-Draft",
219
+ "1-Management",
220
+ "2-Confidential",
221
+ "3-Team",
222
+ "4-Public",
223
+ "Briefings",
224
+ ])
215
225
  await this.#ensureDir(join(dest, d));
216
226
 
217
227
  await this.copyBundledFiles(templateDir, dest);
228
+ await this.#installRegistry(templateDir, dest);
218
229
  await this.#linkIntoDocuments(dest);
219
230
 
220
231
  this.#logger.info(
@@ -265,10 +276,52 @@ export class KBManager {
265
276
  };
266
277
  }
267
278
  await this.copyBundledFiles(templateDir, dest);
279
+ await this.#installRegistry(templateDir, dest);
280
+ await this.#installMigrationGuide(templateDir, dest);
268
281
  this.#logger.info(`\nKnowledge base updated: ${dest}`);
269
282
  return { ok: true, value: { dest } };
270
283
  }
271
284
 
285
+ /**
286
+ * Install the default `registry.yaml` when the KB has none. The registry
287
+ * is a personal surface humans edit, so this method never overwrites an
288
+ * existing one. `copyBundledFiles` copies named files only and never picks
289
+ * it up.
290
+ * @param {string} tpl - Template directory
291
+ * @param {string} dest - Knowledge base directory
292
+ * @returns {Promise<void>}
293
+ */
294
+ async #installRegistry(tpl, dest) {
295
+ const src = join(tpl, "registry.yaml");
296
+ const destPath = join(dest, "registry.yaml");
297
+ if (!(await this.#exists(src)) || (await this.#exists(destPath))) return;
298
+ await this.#fs.copyFile(src, destPath);
299
+ this.#logger.info(` Installed registry.yaml`);
300
+ }
301
+
302
+ /**
303
+ * Install MIGRATION.md while the KB still carries a legacy layout
304
+ * (`Knowledge/` or `Drafts/` at the root). A conforming KB never receives
305
+ * it, and this method removes nothing.
306
+ * @param {string} tpl - Template directory
307
+ * @param {string} dest - Knowledge base directory
308
+ * @returns {Promise<void>}
309
+ */
310
+ async #installMigrationGuide(tpl, dest) {
311
+ let legacy = false;
312
+ for (const marker of LEGACY_ROOTS) {
313
+ if (await this.#exists(join(dest, marker))) legacy = true;
314
+ }
315
+ if (!legacy) return;
316
+ await this.#fs.copyFile(
317
+ join(tpl, "MIGRATION.md"),
318
+ join(dest, "MIGRATION.md"),
319
+ );
320
+ this.#logger.info(
321
+ ` Installed MIGRATION.md — this knowledge base carries the legacy layout. Follow it to migrate to tiers.`,
322
+ );
323
+ }
324
+
272
325
  /**
273
326
  * @param {string} p
274
327
  * @returns {string}