cognitive-core 0.2.0 → 0.2.2

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 (397) hide show
  1. package/.claude/settings.json +111 -2
  2. package/.sessionlog/settings.json +4 -0
  3. package/dist/atlas.d.ts +10 -0
  4. package/dist/atlas.d.ts.map +1 -1
  5. package/dist/atlas.js +65 -0
  6. package/dist/atlas.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +5 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/learning/index.d.ts +1 -1
  12. package/dist/learning/index.d.ts.map +1 -1
  13. package/dist/learning/index.js.map +1 -1
  14. package/dist/learning/pipeline.d.ts +4 -31
  15. package/dist/learning/pipeline.d.ts.map +1 -1
  16. package/dist/learning/pipeline.js +12 -64
  17. package/dist/learning/pipeline.js.map +1 -1
  18. package/dist/learning/unified-pipeline.d.ts +30 -0
  19. package/dist/learning/unified-pipeline.d.ts.map +1 -1
  20. package/dist/learning/unified-pipeline.js +207 -0
  21. package/dist/learning/unified-pipeline.js.map +1 -1
  22. package/dist/memory/candidate-retrieval.d.ts.map +1 -1
  23. package/dist/memory/candidate-retrieval.js +3 -1
  24. package/dist/memory/candidate-retrieval.js.map +1 -1
  25. package/dist/memory/curated-loader.d.ts +21 -4
  26. package/dist/memory/curated-loader.d.ts.map +1 -1
  27. package/dist/memory/curated-loader.js +53 -16
  28. package/dist/memory/curated-loader.js.map +1 -1
  29. package/dist/memory/index.d.ts +2 -1
  30. package/dist/memory/index.d.ts.map +1 -1
  31. package/dist/memory/index.js +3 -1
  32. package/dist/memory/index.js.map +1 -1
  33. package/dist/memory/playbook.d.ts +6 -0
  34. package/dist/memory/playbook.d.ts.map +1 -1
  35. package/dist/memory/playbook.js +15 -0
  36. package/dist/memory/playbook.js.map +1 -1
  37. package/dist/memory/source-resolver.d.ts +120 -0
  38. package/dist/memory/source-resolver.d.ts.map +1 -0
  39. package/dist/memory/source-resolver.js +300 -0
  40. package/dist/memory/source-resolver.js.map +1 -0
  41. package/dist/types/config.d.ts +141 -0
  42. package/dist/types/config.d.ts.map +1 -1
  43. package/dist/types/config.js +40 -0
  44. package/dist/types/config.js.map +1 -1
  45. package/dist/types/index.d.ts +1 -1
  46. package/dist/types/index.d.ts.map +1 -1
  47. package/dist/types/index.js +1 -1
  48. package/dist/types/index.js.map +1 -1
  49. package/dist/utils/error-classifier.js +8 -8
  50. package/dist/utils/error-classifier.js.map +1 -1
  51. package/dist/workspace/efficacy-toolkit.d.ts +164 -0
  52. package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
  53. package/dist/workspace/efficacy-toolkit.js +281 -0
  54. package/dist/workspace/efficacy-toolkit.js.map +1 -0
  55. package/dist/workspace/index.d.ts +2 -1
  56. package/dist/workspace/index.d.ts.map +1 -1
  57. package/dist/workspace/index.js +3 -1
  58. package/dist/workspace/index.js.map +1 -1
  59. package/dist/workspace/templates/index.d.ts +3 -0
  60. package/dist/workspace/templates/index.d.ts.map +1 -1
  61. package/dist/workspace/templates/index.js +6 -0
  62. package/dist/workspace/templates/index.js.map +1 -1
  63. package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
  64. package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
  65. package/dist/workspace/templates/playbook-decay-detection.js +197 -0
  66. package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
  67. package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
  68. package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
  69. package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
  70. package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
  71. package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
  72. package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
  73. package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
  74. package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
  75. package/dist/workspace/types.d.ts +12 -54
  76. package/dist/workspace/types.d.ts.map +1 -1
  77. package/dist/workspace/types.js.map +1 -1
  78. package/package.json +8 -2
  79. package/playbooks/compound-engineering/adversarial-review.json +51 -0
  80. package/playbooks/compound-engineering/agent-native-architecture.json +59 -0
  81. package/playbooks/compound-engineering/agent-native-review.json +54 -0
  82. package/playbooks/compound-engineering/api-contract-review.json +52 -0
  83. package/playbooks/compound-engineering/brainstorm-requirements.json +55 -0
  84. package/playbooks/compound-engineering/bug-reproduction.json +62 -0
  85. package/playbooks/compound-engineering/confidence-calibration.json +49 -0
  86. package/playbooks/compound-engineering/correctness-review.json +49 -0
  87. package/playbooks/compound-engineering/data-migration-safety.json +59 -0
  88. package/playbooks/compound-engineering/deployment-verification.json +63 -0
  89. package/playbooks/compound-engineering/error-recovery-patterns.json +53 -0
  90. package/playbooks/compound-engineering/implementation-planning.json +64 -0
  91. package/playbooks/compound-engineering/issue-pattern-analysis.json +53 -0
  92. package/playbooks/compound-engineering/knowledge-compounding.json +63 -0
  93. package/playbooks/compound-engineering/learnings-research.json +54 -0
  94. package/playbooks/compound-engineering/maintainability-review.json +49 -0
  95. package/playbooks/compound-engineering/performance-review.json +54 -0
  96. package/playbooks/compound-engineering/plan-adversarial-review.json +56 -0
  97. package/playbooks/compound-engineering/plan-feasibility-review.json +56 -0
  98. package/playbooks/compound-engineering/project-standards-review.json +52 -0
  99. package/playbooks/compound-engineering/reliability-review.json +53 -0
  100. package/playbooks/compound-engineering/review-orchestration.json +64 -0
  101. package/playbooks/compound-engineering/security-review.json +54 -0
  102. package/playbooks/compound-engineering/systematic-execution.json +64 -0
  103. package/playbooks/compound-engineering/testing-review.json +50 -0
  104. package/src/atlas.ts +96 -0
  105. package/src/index.ts +27 -0
  106. package/src/learning/index.ts +1 -0
  107. package/src/learning/unified-pipeline.ts +271 -1
  108. package/src/memory/candidate-retrieval.ts +2 -1
  109. package/src/memory/curated-loader.ts +69 -16
  110. package/src/memory/index.ts +16 -0
  111. package/src/memory/playbook.ts +19 -0
  112. package/src/memory/source-resolver.ts +422 -0
  113. package/src/types/config.ts +46 -0
  114. package/src/types/index.ts +4 -0
  115. package/src/utils/error-classifier.ts +8 -8
  116. package/src/workspace/efficacy-toolkit.ts +496 -0
  117. package/src/workspace/index.ts +29 -0
  118. package/src/workspace/templates/index.ts +24 -0
  119. package/src/workspace/templates/playbook-decay-detection.ts +272 -0
  120. package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
  121. package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
  122. package/src/workspace/types.ts +22 -78
  123. package/tests/fixtures/behavioral-trajectories.ts +210 -0
  124. package/tests/integration/curated-sources-e2e.test.ts +502 -0
  125. package/tests/integration/pipeline-data-correctness.test.ts +794 -0
  126. package/tests/learning/meta-learner.test.ts +418 -0
  127. package/tests/learning/pipeline-memory-updates.test.ts +721 -0
  128. package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
  129. package/tests/memory/candidate-retrieval.test.ts +167 -0
  130. package/tests/memory/compound-engineering-seed.test.ts +338 -0
  131. package/tests/memory/curated-loader-extended.test.ts +225 -0
  132. package/tests/memory/meta.test.ts +399 -0
  133. package/tests/memory/playbook-quality-validation.test.ts +430 -0
  134. package/tests/memory/source-resolver.test.ts +700 -0
  135. package/tests/search/evaluator.test.ts +257 -0
  136. package/tests/search/verification-runner.test.ts +357 -0
  137. package/tests/utils/error-classifier.test.ts +149 -0
  138. package/tests/utils/trajectory-helpers.test.ts +163 -0
  139. package/tests/workspace/efficacy-toolkit.test.ts +404 -0
  140. package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
  141. package/.claude/settings.local.json +0 -11
  142. package/dist/learning/llm-extractor.d.ts +0 -88
  143. package/dist/learning/llm-extractor.d.ts.map +0 -1
  144. package/dist/learning/llm-extractor.js +0 -372
  145. package/dist/learning/llm-extractor.js.map +0 -1
  146. package/dist/learning/loop-coordinator.d.ts +0 -61
  147. package/dist/learning/loop-coordinator.d.ts.map +0 -1
  148. package/dist/learning/loop-coordinator.js +0 -96
  149. package/dist/learning/loop-coordinator.js.map +0 -1
  150. package/references/agent-workspace/CLAUDE.md +0 -74
  151. package/references/agent-workspace/README.md +0 -587
  152. package/references/agent-workspace/media/banner.png +0 -0
  153. package/references/agent-workspace/package-lock.json +0 -2061
  154. package/references/agent-workspace/package.json +0 -54
  155. package/references/agent-workspace/src/handle.ts +0 -122
  156. package/references/agent-workspace/src/index.ts +0 -32
  157. package/references/agent-workspace/src/manager.ts +0 -102
  158. package/references/agent-workspace/src/readers/json.ts +0 -71
  159. package/references/agent-workspace/src/readers/markdown.ts +0 -37
  160. package/references/agent-workspace/src/readers/raw.ts +0 -27
  161. package/references/agent-workspace/src/types.ts +0 -68
  162. package/references/agent-workspace/src/validation.ts +0 -93
  163. package/references/agent-workspace/src/writers/json.ts +0 -17
  164. package/references/agent-workspace/src/writers/markdown.ts +0 -27
  165. package/references/agent-workspace/src/writers/raw.ts +0 -22
  166. package/references/agent-workspace/tests/errors.test.ts +0 -652
  167. package/references/agent-workspace/tests/handle.test.ts +0 -144
  168. package/references/agent-workspace/tests/manager.test.ts +0 -124
  169. package/references/agent-workspace/tests/readers.test.ts +0 -205
  170. package/references/agent-workspace/tests/validation.test.ts +0 -196
  171. package/references/agent-workspace/tests/writers.test.ts +0 -108
  172. package/references/agent-workspace/tsconfig.json +0 -20
  173. package/references/agent-workspace/tsup.config.ts +0 -9
  174. package/references/minimem/.claude/settings.json +0 -7
  175. package/references/minimem/.sudocode/issues.jsonl +0 -18
  176. package/references/minimem/.sudocode/specs.jsonl +0 -1
  177. package/references/minimem/CLAUDE.md +0 -310
  178. package/references/minimem/README.md +0 -556
  179. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
  180. package/references/minimem/claude-plugin/.mcp.json +0 -7
  181. package/references/minimem/claude-plugin/README.md +0 -158
  182. package/references/minimem/claude-plugin/commands/recall.md +0 -47
  183. package/references/minimem/claude-plugin/commands/remember.md +0 -41
  184. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
  185. package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
  186. package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
  187. package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
  188. package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
  189. package/references/minimem/package-lock.json +0 -5373
  190. package/references/minimem/package.json +0 -60
  191. package/references/minimem/scripts/postbuild.js +0 -35
  192. package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
  193. package/references/minimem/src/__tests__/errors.test.ts +0 -265
  194. package/references/minimem/src/__tests__/helpers.ts +0 -199
  195. package/references/minimem/src/__tests__/internal.test.ts +0 -407
  196. package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
  197. package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
  198. package/references/minimem/src/__tests__/session.test.ts +0 -190
  199. package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
  200. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
  201. package/references/minimem/src/cli/commands/append.ts +0 -76
  202. package/references/minimem/src/cli/commands/config.ts +0 -262
  203. package/references/minimem/src/cli/commands/conflicts.ts +0 -413
  204. package/references/minimem/src/cli/commands/daemon.ts +0 -169
  205. package/references/minimem/src/cli/commands/index.ts +0 -12
  206. package/references/minimem/src/cli/commands/init.ts +0 -88
  207. package/references/minimem/src/cli/commands/mcp.ts +0 -177
  208. package/references/minimem/src/cli/commands/push-pull.ts +0 -213
  209. package/references/minimem/src/cli/commands/search.ts +0 -158
  210. package/references/minimem/src/cli/commands/status.ts +0 -84
  211. package/references/minimem/src/cli/commands/sync-init.ts +0 -290
  212. package/references/minimem/src/cli/commands/sync.ts +0 -70
  213. package/references/minimem/src/cli/commands/upsert.ts +0 -197
  214. package/references/minimem/src/cli/config.ts +0 -584
  215. package/references/minimem/src/cli/index.ts +0 -264
  216. package/references/minimem/src/cli/shared.ts +0 -161
  217. package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
  218. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
  219. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
  220. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
  221. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
  222. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
  223. package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
  224. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
  225. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
  226. package/references/minimem/src/cli/sync/central.ts +0 -292
  227. package/references/minimem/src/cli/sync/conflicts.ts +0 -204
  228. package/references/minimem/src/cli/sync/daemon.ts +0 -407
  229. package/references/minimem/src/cli/sync/detection.ts +0 -138
  230. package/references/minimem/src/cli/sync/index.ts +0 -107
  231. package/references/minimem/src/cli/sync/operations.ts +0 -373
  232. package/references/minimem/src/cli/sync/registry.ts +0 -279
  233. package/references/minimem/src/cli/sync/state.ts +0 -355
  234. package/references/minimem/src/cli/sync/validation.ts +0 -206
  235. package/references/minimem/src/cli/sync/watcher.ts +0 -234
  236. package/references/minimem/src/cli/version.ts +0 -34
  237. package/references/minimem/src/core/index.ts +0 -9
  238. package/references/minimem/src/core/indexer.ts +0 -628
  239. package/references/minimem/src/core/searcher.ts +0 -221
  240. package/references/minimem/src/db/schema.ts +0 -183
  241. package/references/minimem/src/db/sqlite-vec.ts +0 -24
  242. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
  243. package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
  244. package/references/minimem/src/embeddings/batch-openai.ts +0 -409
  245. package/references/minimem/src/embeddings/embeddings.ts +0 -434
  246. package/references/minimem/src/index.ts +0 -109
  247. package/references/minimem/src/internal.ts +0 -299
  248. package/references/minimem/src/minimem.ts +0 -1276
  249. package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
  250. package/references/minimem/src/search/graph.ts +0 -234
  251. package/references/minimem/src/search/hybrid.ts +0 -151
  252. package/references/minimem/src/search/search.ts +0 -256
  253. package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
  254. package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
  255. package/references/minimem/src/server/mcp.ts +0 -326
  256. package/references/minimem/src/server/tools.ts +0 -720
  257. package/references/minimem/src/session.ts +0 -460
  258. package/references/minimem/tsconfig.json +0 -19
  259. package/references/minimem/tsup.config.ts +0 -26
  260. package/references/minimem/vitest.config.ts +0 -24
  261. package/references/sessionlog/.husky/pre-commit +0 -1
  262. package/references/sessionlog/.lintstagedrc.json +0 -4
  263. package/references/sessionlog/.prettierignore +0 -4
  264. package/references/sessionlog/.prettierrc.json +0 -11
  265. package/references/sessionlog/LICENSE +0 -21
  266. package/references/sessionlog/README.md +0 -453
  267. package/references/sessionlog/eslint.config.js +0 -58
  268. package/references/sessionlog/package-lock.json +0 -3672
  269. package/references/sessionlog/package.json +0 -65
  270. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +0 -570
  271. package/references/sessionlog/src/__tests__/agent-registry.test.ts +0 -127
  272. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +0 -225
  273. package/references/sessionlog/src/__tests__/claude-generator.test.ts +0 -46
  274. package/references/sessionlog/src/__tests__/commit-msg.test.ts +0 -86
  275. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +0 -224
  276. package/references/sessionlog/src/__tests__/e2e-live.test.ts +0 -890
  277. package/references/sessionlog/src/__tests__/event-log.test.ts +0 -183
  278. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +0 -105
  279. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +0 -375
  280. package/references/sessionlog/src/__tests__/git-hooks.test.ts +0 -78
  281. package/references/sessionlog/src/__tests__/hook-managers.test.ts +0 -121
  282. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +0 -759
  283. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +0 -338
  284. package/references/sessionlog/src/__tests__/redaction.test.ts +0 -136
  285. package/references/sessionlog/src/__tests__/session-repo.test.ts +0 -353
  286. package/references/sessionlog/src/__tests__/session-store.test.ts +0 -166
  287. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +0 -466
  288. package/references/sessionlog/src/__tests__/skill-live.test.ts +0 -461
  289. package/references/sessionlog/src/__tests__/summarize.test.ts +0 -348
  290. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +0 -610
  291. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +0 -632
  292. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +0 -121
  293. package/references/sessionlog/src/__tests__/types.test.ts +0 -166
  294. package/references/sessionlog/src/__tests__/utils.test.ts +0 -333
  295. package/references/sessionlog/src/__tests__/validation.test.ts +0 -103
  296. package/references/sessionlog/src/__tests__/worktree.test.ts +0 -57
  297. package/references/sessionlog/src/agent/agents/claude-code.ts +0 -1089
  298. package/references/sessionlog/src/agent/agents/cursor.ts +0 -361
  299. package/references/sessionlog/src/agent/agents/gemini-cli.ts +0 -632
  300. package/references/sessionlog/src/agent/agents/opencode.ts +0 -540
  301. package/references/sessionlog/src/agent/registry.ts +0 -143
  302. package/references/sessionlog/src/agent/session-types.ts +0 -113
  303. package/references/sessionlog/src/agent/types.ts +0 -220
  304. package/references/sessionlog/src/cli.ts +0 -597
  305. package/references/sessionlog/src/commands/clean.ts +0 -133
  306. package/references/sessionlog/src/commands/disable.ts +0 -84
  307. package/references/sessionlog/src/commands/doctor.ts +0 -145
  308. package/references/sessionlog/src/commands/enable.ts +0 -202
  309. package/references/sessionlog/src/commands/explain.ts +0 -261
  310. package/references/sessionlog/src/commands/reset.ts +0 -105
  311. package/references/sessionlog/src/commands/resume.ts +0 -180
  312. package/references/sessionlog/src/commands/rewind.ts +0 -195
  313. package/references/sessionlog/src/commands/setup-ccweb.ts +0 -275
  314. package/references/sessionlog/src/commands/status.ts +0 -172
  315. package/references/sessionlog/src/config.ts +0 -165
  316. package/references/sessionlog/src/events/event-log.ts +0 -126
  317. package/references/sessionlog/src/git-operations.ts +0 -558
  318. package/references/sessionlog/src/hooks/git-hooks.ts +0 -165
  319. package/references/sessionlog/src/hooks/lifecycle.ts +0 -391
  320. package/references/sessionlog/src/index.ts +0 -650
  321. package/references/sessionlog/src/security/redaction.ts +0 -283
  322. package/references/sessionlog/src/session/state-machine.ts +0 -452
  323. package/references/sessionlog/src/store/checkpoint-store.ts +0 -509
  324. package/references/sessionlog/src/store/native-store.ts +0 -173
  325. package/references/sessionlog/src/store/provider-types.ts +0 -99
  326. package/references/sessionlog/src/store/session-store.ts +0 -266
  327. package/references/sessionlog/src/strategy/attribution.ts +0 -296
  328. package/references/sessionlog/src/strategy/common.ts +0 -207
  329. package/references/sessionlog/src/strategy/content-overlap.ts +0 -228
  330. package/references/sessionlog/src/strategy/manual-commit.ts +0 -988
  331. package/references/sessionlog/src/strategy/types.ts +0 -279
  332. package/references/sessionlog/src/summarize/claude-generator.ts +0 -115
  333. package/references/sessionlog/src/summarize/summarize.ts +0 -432
  334. package/references/sessionlog/src/types.ts +0 -508
  335. package/references/sessionlog/src/utils/chunk-files.ts +0 -49
  336. package/references/sessionlog/src/utils/commit-message.ts +0 -65
  337. package/references/sessionlog/src/utils/detect-agent.ts +0 -36
  338. package/references/sessionlog/src/utils/hook-managers.ts +0 -125
  339. package/references/sessionlog/src/utils/ide-tags.ts +0 -32
  340. package/references/sessionlog/src/utils/paths.ts +0 -79
  341. package/references/sessionlog/src/utils/preview-rewind.ts +0 -80
  342. package/references/sessionlog/src/utils/rewind-conflict.ts +0 -121
  343. package/references/sessionlog/src/utils/shadow-branch.ts +0 -109
  344. package/references/sessionlog/src/utils/string-utils.ts +0 -46
  345. package/references/sessionlog/src/utils/todo-extract.ts +0 -188
  346. package/references/sessionlog/src/utils/trailers.ts +0 -187
  347. package/references/sessionlog/src/utils/transcript-parse.ts +0 -177
  348. package/references/sessionlog/src/utils/transcript-timestamp.ts +0 -59
  349. package/references/sessionlog/src/utils/tree-ops.ts +0 -219
  350. package/references/sessionlog/src/utils/tty.ts +0 -72
  351. package/references/sessionlog/src/utils/validation.ts +0 -65
  352. package/references/sessionlog/src/utils/worktree.ts +0 -58
  353. package/references/sessionlog/src/wire-types.ts +0 -59
  354. package/references/sessionlog/templates/setup-env.sh +0 -153
  355. package/references/sessionlog/tsconfig.json +0 -18
  356. package/references/sessionlog/vitest.config.ts +0 -12
  357. package/references/skill-tree/.claude/settings.json +0 -6
  358. package/references/skill-tree/.sudocode/issues.jsonl +0 -19
  359. package/references/skill-tree/.sudocode/specs.jsonl +0 -3
  360. package/references/skill-tree/CLAUDE.md +0 -126
  361. package/references/skill-tree/README.md +0 -372
  362. package/references/skill-tree/docs/GAPS_v1.md +0 -221
  363. package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
  364. package/references/skill-tree/docs/TODOS.md +0 -91
  365. package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
  366. package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
  367. package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
  368. package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
  369. package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
  370. package/references/skill-tree/docs/scraper/README.md +0 -170
  371. package/references/skill-tree/examples/basic-usage.ts +0 -164
  372. package/references/skill-tree/package-lock.json +0 -1852
  373. package/references/skill-tree/package.json +0 -66
  374. package/references/skill-tree/scraper/README.md +0 -123
  375. package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
  376. package/references/skill-tree/scraper/docs/PLAN.md +0 -336
  377. package/references/skill-tree/scraper/drizzle.config.ts +0 -10
  378. package/references/skill-tree/scraper/package-lock.json +0 -6329
  379. package/references/skill-tree/scraper/package.json +0 -68
  380. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
  381. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
  382. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
  383. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
  384. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
  385. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
  386. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
  387. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
  388. package/references/skill-tree/scraper/tsup.config.ts +0 -14
  389. package/references/skill-tree/scraper/vitest.config.ts +0 -17
  390. package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
  391. package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
  392. package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
  393. package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
  394. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
  395. package/references/skill-tree/test/run-all.ts +0 -106
  396. package/references/skill-tree/test/utils.ts +0 -128
  397. package/references/skill-tree/vitest.config.ts +0 -16
package/src/atlas.ts CHANGED
@@ -9,6 +9,15 @@ import type {
9
9
  import type { KnowledgeMatch } from './types/knowledge.js';
10
10
  import { createDefaultConfig } from './types/index.js';
11
11
  import { MemorySystem, createMemorySystem, type TeamExperience } from './memory/index.js';
12
+ import {
13
+ loadCuratedPlaybooks as loadCuratedPlaybooksFn,
14
+ BUNDLED_SEED_PACK_DIR,
15
+ } from './memory/curated-loader.js';
16
+ import {
17
+ resolvePlaybookSource,
18
+ sourceStateKey,
19
+ type SourceState,
20
+ } from './memory/source-resolver.js';
12
21
  import {
13
22
  UnifiedLearningPipeline,
14
23
  createUnifiedPipeline,
@@ -271,6 +280,9 @@ export class Atlas {
271
280
 
272
281
  // Initialize playbook-based components if playbooks are available
273
282
  if (this.memory.playbooks) {
283
+ // Load curated playbooks (bundled seed pack + additional dirs)
284
+ await this.loadCuratedPlaybooks();
285
+
274
286
  this.skillLibrary = createSkillLibrary(
275
287
  this.memory.playbooks,
276
288
  this.config.skillLibrary
@@ -290,6 +302,90 @@ export class Atlas {
290
302
  }
291
303
  }
292
304
 
305
+ /**
306
+ * Load curated playbooks from bundled seed pack, additional directories,
307
+ * and resolved sources (local paths or git repos).
308
+ * Called during init() when curatedPlaybooks config is enabled.
309
+ */
310
+ private async loadCuratedPlaybooks(): Promise<void> {
311
+ const cfg = this.config.curatedPlaybooks;
312
+ const recreate = cfg.recreateOnInit;
313
+
314
+ // Load bundled seed pack (shipped with cognitive-core)
315
+ if (cfg.loadBundledSeedPack) {
316
+ const loadOpts = recreate
317
+ ? { recreate: true, sourceId: 'bundled' }
318
+ : { sourceId: 'bundled' };
319
+ await loadCuratedPlaybooksFn(
320
+ BUNDLED_SEED_PACK_DIR,
321
+ this.memory.playbooks,
322
+ loadOpts,
323
+ );
324
+ }
325
+
326
+ // Load from additional directories (backward compat)
327
+ for (const dir of cfg.additionalDirs) {
328
+ const loadOpts = recreate
329
+ ? { recreate: true, sourceId: dir }
330
+ : { sourceId: dir };
331
+ await loadCuratedPlaybooksFn(dir, this.memory.playbooks, loadOpts);
332
+ }
333
+
334
+ // Resolve and load from sources (local paths + git repos)
335
+ if (cfg.sources.length > 0) {
336
+ const cacheDir = join(this.config.storage.baseDir, cfg.cache.dir);
337
+ for (const source of cfg.sources) {
338
+ await this.loadFromSource(source, cacheDir, recreate);
339
+ }
340
+ }
341
+ }
342
+
343
+ /**
344
+ * Resolve a single source (local or git) and load its playbooks.
345
+ */
346
+ private async loadFromSource(
347
+ source: string,
348
+ cacheDir: string,
349
+ recreate: boolean,
350
+ ): Promise<void> {
351
+ const cfg = this.config.curatedPlaybooks;
352
+
353
+ const resolved = await resolvePlaybookSource(source, {
354
+ cacheDir,
355
+ maxAgeMs: cfg.cache.maxAgeMs,
356
+ forceUpdate: recreate,
357
+ getSourceState: (s) =>
358
+ this.persistence.getSystemState<SourceState>(sourceStateKey(s)),
359
+ setSourceState: (s, state) =>
360
+ this.persistence.setSystemState(sourceStateKey(s), state),
361
+ });
362
+
363
+ if (!resolved) return;
364
+
365
+ // For git sources: skip loading if SHA hasn't changed and we're not recreating
366
+ // (playbooks are already in the library from a previous init).
367
+ // For local paths: always load (the loader handles dedup via getByName).
368
+ if (resolved.isGit && !resolved.updated && !recreate) return;
369
+
370
+ const loadOpts = recreate
371
+ ? { recreate: true, sourceId: resolved.sourceId }
372
+ : { sourceId: resolved.sourceId };
373
+
374
+ const result = await loadCuratedPlaybooksFn(
375
+ resolved.playbookDir,
376
+ this.memory.playbooks,
377
+ loadOpts,
378
+ );
379
+
380
+ // Update source state with playbook count
381
+ const stateKey = sourceStateKey(source);
382
+ const prevState = this.persistence.getSystemState<SourceState>(stateKey);
383
+ if (prevState) {
384
+ prevState.playbookCount = result.loaded;
385
+ this.persistence.setSystemState(stateKey, prevState);
386
+ }
387
+ }
388
+
293
389
  /**
294
390
  * Set the LLM provider for solving (deprecated)
295
391
  * @deprecated Use setAgentManager() with backends for real execution
package/src/index.ts CHANGED
@@ -435,6 +435,33 @@ export {
435
435
  type AgenticTaskResult,
436
436
  type AgenticTaskMetrics,
437
437
  AgenticTaskOutputError,
438
+ // Efficacy toolkit
439
+ computeNormalizedGain,
440
+ computeTemporalTrend,
441
+ computeDomainBreakdown,
442
+ buildEfficacyProfile,
443
+ buildPortfolioSnapshot,
444
+ type PlaybookEfficacyProfile,
445
+ type DomainBreakdown,
446
+ type TemporalTrend,
447
+ type UsageProfile,
448
+ type EvolutionSummary,
449
+ type PortfolioSnapshot,
450
+ type PlaybookHealthFlag,
451
+ type RedundancyPair,
452
+ // Efficacy templates
453
+ playbookEfficacyAuditTemplate,
454
+ type PlaybookEfficacyAuditInput,
455
+ type PlaybookEfficacyAuditOutput,
456
+ type PlaybookRecommendation,
457
+ playbookDecayDetectionTemplate,
458
+ type PlaybookDecayDetectionInput,
459
+ type PlaybookDecayDetectionOutput,
460
+ type DecaySignal,
461
+ playbookLifecycleReviewTemplate,
462
+ type PlaybookLifecycleReviewInput,
463
+ type PlaybookLifecycleReviewOutput,
464
+ type LifecycleRecommendation,
438
465
  } from './workspace/index.js';
439
466
 
440
467
  // Persistence - Unified SQLite database for system-internal state
@@ -106,6 +106,7 @@ export {
106
106
  createUnifiedPipeline,
107
107
  type UnifiedPipelineConfig,
108
108
  type UnifiedPipelineFeatures,
109
+ type EfficacyMaintenanceConfig,
109
110
  type ImmediateResult,
110
111
  type UnifiedBatchResult,
111
112
  type UnifiedPipelineStats,
@@ -54,7 +54,12 @@ import { playbookExtractionTemplate } from '../workspace/templates/playbook-extr
54
54
 
55
55
  // Meta-learning and effectiveness
56
56
  import { MetaLearner, type MetaLearnerConfig } from './meta-learner.js';
57
- import { LearningEffectivenessTracker } from './effectiveness.js';
57
+ import { LearningEffectivenessTracker, type TaskAnnotation, type PlaybookEffectivenessEntry } from './effectiveness.js';
58
+
59
+ // Efficacy templates (used in maintenance tasks)
60
+ import { playbookDecayDetectionTemplate, type PlaybookDecayDetectionOutput } from '../workspace/templates/playbook-decay-detection.js';
61
+ import { playbookEfficacyAuditTemplate } from '../workspace/templates/playbook-efficacy-audit.js';
62
+ import { playbookLifecycleReviewTemplate } from '../workspace/templates/playbook-lifecycle-review.js';
58
63
 
59
64
  // Energy evaluator (batch trigger)
60
65
  import {
@@ -121,6 +126,8 @@ export interface UnifiedPipelineFeatures {
121
126
  effectivenessTracking?: boolean;
122
127
  /** Enable healing orchestrator with built-in detectors (default: true) */
123
128
  healing?: boolean;
129
+ /** Enable efficacy maintenance tasks (decay detection, audit, lifecycle review) (default: true) */
130
+ efficacy?: boolean;
124
131
  }
125
132
 
126
133
  /**
@@ -140,10 +147,30 @@ export interface UnifiedPipelineConfig {
140
147
  metaLearner: Partial<MetaLearnerConfig>;
141
148
  /** Feature flags */
142
149
  features: UnifiedPipelineFeatures;
150
+ /** Efficacy maintenance config */
151
+ efficacy: EfficacyMaintenanceConfig;
143
152
  /** Max latency warning threshold for instant loop in ms (default: 200) */
144
153
  maxInstantLatencyMs: number;
145
154
  }
146
155
 
156
+ /**
157
+ * Configuration for efficacy maintenance tasks.
158
+ */
159
+ export interface EfficacyMaintenanceConfig {
160
+ /** Run lifecycle review every Nth maintenance cycle (default: 3) */
161
+ lifecycleReviewFrequency: number;
162
+ /** Minimum playbooks required before running efficacy tasks (default: 1) */
163
+ minPlaybooks: number;
164
+ /** Minimum annotations required before running efficacy tasks (default: 3) */
165
+ minAnnotations: number;
166
+ }
167
+
168
+ const DEFAULT_EFFICACY_CONFIG: EfficacyMaintenanceConfig = {
169
+ lifecycleReviewFrequency: 3,
170
+ minPlaybooks: 1,
171
+ minAnnotations: 3,
172
+ };
173
+
147
174
  const DEFAULT_UNIFIED_CONFIG: UnifiedPipelineConfig = {
148
175
  instant: {},
149
176
  batch: {
@@ -153,6 +180,7 @@ const DEFAULT_UNIFIED_CONFIG: UnifiedPipelineConfig = {
153
180
  maintenance: {},
154
181
  metaLearner: {},
155
182
  features: {},
183
+ efficacy: DEFAULT_EFFICACY_CONFIG,
156
184
  maxInstantLatencyMs: 200,
157
185
  };
158
186
 
@@ -267,6 +295,7 @@ export class UnifiedLearningPipeline {
267
295
  private batchCyclesRun = 0;
268
296
  private maintenanceCyclesRun = 0;
269
297
  private _onLatencyWarning: ((durationMs: number) => void) | null = null;
298
+ private lastDecayResult: PlaybookDecayDetectionOutput | null = null;
270
299
 
271
300
  constructor(
272
301
  memory: MemorySystem,
@@ -284,6 +313,7 @@ export class UnifiedLearningPipeline {
284
313
  maintenance: { ...DEFAULT_UNIFIED_CONFIG.maintenance, ...config?.maintenance },
285
314
  metaLearner: { ...DEFAULT_UNIFIED_CONFIG.metaLearner, ...config?.metaLearner },
286
315
  features: { ...DEFAULT_UNIFIED_CONFIG.features, ...config?.features },
316
+ efficacy: { ...DEFAULT_EFFICACY_CONFIG, ...config?.efficacy },
287
317
  };
288
318
 
289
319
  this.memory = memory;
@@ -822,6 +852,246 @@ export class UnifiedLearningPipeline {
822
852
  },
823
853
  });
824
854
  }
855
+
856
+ // Efficacy maintenance tasks
857
+ this.registerEfficacyMaintenanceTasks();
858
+ }
859
+
860
+ /**
861
+ * Register efficacy maintenance tasks (decay detection, audit, lifecycle review).
862
+ * All tasks are log-only — results are returned in details but no automatic mutations.
863
+ */
864
+ private registerEfficacyMaintenanceTasks(): void {
865
+ if (!(this.config.features.efficacy ?? true)) return;
866
+
867
+ const efficacyCfg = this.config.efficacy;
868
+
869
+ // 1. Playbook Decay Detection (priority 70) — runs every maintenance cycle
870
+ this.maintenanceScheduler.registerTask({
871
+ name: 'playbook-decay-detection',
872
+ priority: 70,
873
+ execute: async () => {
874
+ const start = Date.now();
875
+ this.lastDecayResult = null;
876
+
877
+ const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } =
878
+ await this.getEfficacyData();
879
+
880
+ if (playbooks.length < efficacyCfg.minPlaybooks || annotations.length < efficacyCfg.minAnnotations) {
881
+ return {
882
+ taskName: 'playbook-decay-detection',
883
+ success: true,
884
+ durationMs: Date.now() - start,
885
+ details: { skipped: true, reason: 'insufficient data' },
886
+ };
887
+ }
888
+
889
+ const result = await playbookDecayDetectionTemplate.heuristicFallback!({
890
+ playbooks,
891
+ annotations,
892
+ playbookEffectiveness,
893
+ unguidedSuccessRate,
894
+ });
895
+
896
+ this.lastDecayResult = result;
897
+
898
+ return {
899
+ taskName: 'playbook-decay-detection',
900
+ success: true,
901
+ durationMs: Date.now() - start,
902
+ details: {
903
+ decayingCount: result.decaying.length,
904
+ atRiskCount: result.atRisk.length,
905
+ healthyCount: result.healthy.length,
906
+ decaying: result.decaying,
907
+ atRisk: result.atRisk,
908
+ portfolioAssessment: result.portfolioAssessment,
909
+ },
910
+ };
911
+ },
912
+ });
913
+
914
+ // 2. Playbook Efficacy Audit (priority 65) — audits flagged playbooks from decay detection
915
+ this.maintenanceScheduler.registerTask({
916
+ name: 'playbook-efficacy-audit',
917
+ priority: 65,
918
+ execute: async () => {
919
+ const start = Date.now();
920
+
921
+ if (!this.lastDecayResult) {
922
+ return {
923
+ taskName: 'playbook-efficacy-audit',
924
+ success: true,
925
+ durationMs: Date.now() - start,
926
+ details: { skipped: true, reason: 'no decay detection results' },
927
+ };
928
+ }
929
+
930
+ const flagged = [
931
+ ...this.lastDecayResult.decaying,
932
+ ...this.lastDecayResult.atRisk,
933
+ ];
934
+
935
+ if (flagged.length === 0) {
936
+ return {
937
+ taskName: 'playbook-efficacy-audit',
938
+ success: true,
939
+ durationMs: Date.now() - start,
940
+ details: { skipped: true, reason: 'no flagged playbooks' },
941
+ };
942
+ }
943
+
944
+ const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } =
945
+ await this.getEfficacyData();
946
+
947
+ const playbookMap = new Map(playbooks.map(p => [p.id, p]));
948
+ const effectivenessMap = new Map(playbookEffectiveness.map(e => [e.playbookId, e]));
949
+ const trajectoryDomainMap = this.buildTrajectoryDomainMap(annotations);
950
+
951
+ const audits: Array<{
952
+ playbookId: string;
953
+ health: string;
954
+ recommendations: unknown[];
955
+ summary: string;
956
+ }> = [];
957
+
958
+ for (const signal of flagged) {
959
+ const playbook = playbookMap.get(signal.playbookId);
960
+ if (!playbook) continue;
961
+
962
+ const auditResult = await playbookEfficacyAuditTemplate.heuristicFallback!({
963
+ playbook,
964
+ annotations,
965
+ playbookEffectiveness: effectivenessMap.get(signal.playbookId),
966
+ unguidedSuccessRate,
967
+ trajectoryDomainMap,
968
+ });
969
+
970
+ audits.push({
971
+ playbookId: signal.playbookId,
972
+ health: auditResult.assessment.health,
973
+ recommendations: auditResult.assessment.recommendations,
974
+ summary: auditResult.assessment.summary,
975
+ });
976
+ }
977
+
978
+ return {
979
+ taskName: 'playbook-efficacy-audit',
980
+ success: true,
981
+ durationMs: Date.now() - start,
982
+ details: {
983
+ auditsPerformed: audits.length,
984
+ audits,
985
+ },
986
+ };
987
+ },
988
+ });
989
+
990
+ // 3. Playbook Lifecycle Review (priority 50) — runs every Nth maintenance cycle
991
+ this.maintenanceScheduler.registerTask({
992
+ name: 'playbook-lifecycle-review',
993
+ priority: 50,
994
+ execute: async () => {
995
+ const start = Date.now();
996
+
997
+ // Only run every Nth maintenance cycle
998
+ if (this.maintenanceCyclesRun % efficacyCfg.lifecycleReviewFrequency !== 0) {
999
+ return {
1000
+ taskName: 'playbook-lifecycle-review',
1001
+ success: true,
1002
+ durationMs: Date.now() - start,
1003
+ details: {
1004
+ skipped: true,
1005
+ reason: `runs every ${efficacyCfg.lifecycleReviewFrequency} maintenance cycles`,
1006
+ },
1007
+ };
1008
+ }
1009
+
1010
+ const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } =
1011
+ await this.getEfficacyData();
1012
+
1013
+ if (playbooks.length < efficacyCfg.minPlaybooks || annotations.length < efficacyCfg.minAnnotations) {
1014
+ return {
1015
+ taskName: 'playbook-lifecycle-review',
1016
+ success: true,
1017
+ durationMs: Date.now() - start,
1018
+ details: { skipped: true, reason: 'insufficient data' },
1019
+ };
1020
+ }
1021
+
1022
+ const trajectoryDomainMap = this.buildTrajectoryDomainMap(annotations);
1023
+
1024
+ const result = await playbookLifecycleReviewTemplate.heuristicFallback!({
1025
+ playbooks,
1026
+ annotations,
1027
+ playbookEffectiveness,
1028
+ unguidedSuccessRate,
1029
+ trajectoryDomainMap,
1030
+ });
1031
+
1032
+ return {
1033
+ taskName: 'playbook-lifecycle-review',
1034
+ success: true,
1035
+ durationMs: Date.now() - start,
1036
+ details: {
1037
+ totalPlaybooks: result.snapshot.totalPlaybooks,
1038
+ recommendationsCount: result.recommendations.length,
1039
+ recommendations: result.recommendations,
1040
+ insights: result.insights,
1041
+ actionPlan: result.actionPlan,
1042
+ snapshot: {
1043
+ avgConfidence: result.snapshot.avgConfidence,
1044
+ avgSuccessRate: result.snapshot.avgSuccessRate,
1045
+ confidenceBands: result.snapshot.confidenceBands,
1046
+ decayingCount: result.snapshot.decaying.length,
1047
+ staleCount: result.snapshot.stale.length,
1048
+ },
1049
+ },
1050
+ };
1051
+ },
1052
+ });
1053
+ }
1054
+
1055
+ /**
1056
+ * Fetch shared efficacy data used by all three efficacy maintenance tasks.
1057
+ */
1058
+ private async getEfficacyData(): Promise<{
1059
+ annotations: TaskAnnotation[];
1060
+ playbooks: Playbook[];
1061
+ playbookEffectiveness: PlaybookEffectivenessEntry[];
1062
+ unguidedSuccessRate: number;
1063
+ }> {
1064
+ const playbooks = await this.memory.playbooks.getAll();
1065
+
1066
+ let annotations: TaskAnnotation[] = [];
1067
+ let playbookEffectiveness: PlaybookEffectivenessEntry[] = [];
1068
+ let unguidedSuccessRate = 0;
1069
+
1070
+ if (this.effectivenessTracker) {
1071
+ annotations = await this.effectivenessTracker.getAll();
1072
+ const metrics = await this.effectivenessTracker.computeMetrics();
1073
+ playbookEffectiveness = metrics.playbookEffectiveness;
1074
+ unguidedSuccessRate = metrics.unguidedSuccessRate;
1075
+ }
1076
+
1077
+ return { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate };
1078
+ }
1079
+
1080
+ /**
1081
+ * Build a trajectoryId→domain map from annotations.
1082
+ * Uses accumulated trajectories when available, otherwise infers from task annotations.
1083
+ */
1084
+ private buildTrajectoryDomainMap(_annotations: TaskAnnotation[]): Map<string, string> {
1085
+ const domainMap = new Map<string, string>();
1086
+
1087
+ // Map from accumulated trajectories (has task.domain directly).
1088
+ // Annotations don't carry domain, so historical trajectories will
1089
+ // fall through to the toolkit's 'unknown' default — acceptable for log-only mode.
1090
+ for (const t of this.accumulated) {
1091
+ domainMap.set(t.id, t.task.domain);
1092
+ }
1093
+
1094
+ return domainMap;
825
1095
  }
826
1096
 
827
1097
  /**
@@ -63,7 +63,8 @@ export function getCandidates<T>(
63
63
  const item = resolver.get(id);
64
64
  if (item) items.push(item);
65
65
  }
66
- return items;
66
+ // If all IDs were stale/unresolvable, fall back to full scan
67
+ if (items.length > 0) return items;
67
68
  }
68
69
 
69
70
  // Too few candidates — fall back
@@ -6,17 +6,30 @@
6
6
  * drop all curated playbooks and reload from source files without
7
7
  * losing extracted or imported playbooks.
8
8
  *
9
+ * Supports recursive directory scanning and source-prefix-based
10
+ * deletion for per-source recreate (multiple sources don't clobber
11
+ * each other).
12
+ *
9
13
  * Inspired by Dash's separation of curated knowledge (file-loaded)
10
14
  * vs learnings (runtime-discovered).
11
15
  */
12
16
 
13
- import { readFile, readdir, stat } from 'node:fs/promises';
14
- import { join, relative } from 'node:path';
17
+ import { readFile, readdir } from 'node:fs/promises';
18
+ import { join, relative, dirname } from 'node:path';
15
19
  import { existsSync } from 'node:fs';
20
+ import { fileURLToPath } from 'node:url';
16
21
  import type { PlaybookProvenance } from '../types/index.js';
17
22
  import { createPlaybook } from '../types/index.js';
18
23
  import type { PlaybookLibrary } from './playbook.js';
19
24
 
25
+ /**
26
+ * Path to the bundled compound-engineering seed pack shipped with cognitive-core.
27
+ * Resolves relative to this file's location in the package.
28
+ */
29
+ const __filename_curated = fileURLToPath(import.meta.url);
30
+ const __dirname_curated = dirname(__filename_curated);
31
+ export const BUNDLED_SEED_PACK_DIR = join(__dirname_curated, '../../playbooks/compound-engineering');
32
+
20
33
  /**
21
34
  * Schema for a curated playbook JSON file
22
35
  */
@@ -55,17 +68,49 @@ export interface CuratedLoadResult {
55
68
  recreated: boolean;
56
69
  }
57
70
 
71
+ /**
72
+ * Options for loadCuratedPlaybooks
73
+ */
74
+ export interface CuratedLoadOptions {
75
+ /** If true, delete existing curated playbooks before loading */
76
+ recreate?: boolean;
77
+ /**
78
+ * Source identifier for provenance tracking.
79
+ * Used as prefix in provenance.sourceFile for per-source recreate.
80
+ * If provided and recreate is true, only playbooks from this source are deleted.
81
+ */
82
+ sourceId?: string;
83
+ }
84
+
85
+ /**
86
+ * Recursively find all JSON files in a directory tree.
87
+ */
88
+ async function findJsonFiles(dir: string): Promise<string[]> {
89
+ const entries = await readdir(dir, { withFileTypes: true });
90
+ const files: string[] = [];
91
+ for (const entry of entries) {
92
+ const fullPath = join(dir, entry.name);
93
+ if (entry.isDirectory()) {
94
+ files.push(...await findJsonFiles(fullPath));
95
+ } else if (entry.name.endsWith('.json')) {
96
+ files.push(fullPath);
97
+ }
98
+ }
99
+ return files;
100
+ }
101
+
58
102
  /**
59
103
  * Load curated playbooks from a directory of JSON files into the library.
104
+ * Supports recursive directory scanning.
60
105
  *
61
106
  * @param curatedDir - Directory containing curated playbook JSON files
62
107
  * @param library - PlaybookLibrary to load into
63
- * @param options.recreate - If true, delete existing curated playbooks before loading
108
+ * @param options - Load options (recreate, sourceId)
64
109
  */
65
110
  export async function loadCuratedPlaybooks(
66
111
  curatedDir: string,
67
112
  library: PlaybookLibrary,
68
- options?: { recreate?: boolean }
113
+ options?: CuratedLoadOptions
69
114
  ): Promise<CuratedLoadResult> {
70
115
  const result: CuratedLoadResult = {
71
116
  loaded: 0,
@@ -78,20 +123,23 @@ export async function loadCuratedPlaybooks(
78
123
  return result;
79
124
  }
80
125
 
81
- // Recreate: drop all curated playbooks first
126
+ // Recreate: drop curated playbooks before loading
82
127
  if (options?.recreate) {
83
- await library.deleteByOrigin('curated');
128
+ if (options.sourceId) {
129
+ // Per-source recreate: only delete playbooks from this source
130
+ await library.deleteByCuratedSource(options.sourceId);
131
+ } else {
132
+ // Global recreate: delete all curated playbooks
133
+ await library.deleteByOrigin('curated');
134
+ }
84
135
  result.recreated = true;
85
136
  }
86
137
 
87
- // Find all JSON files in the directory (non-recursive)
88
- const files = await readdir(curatedDir);
89
- const jsonFiles = files.filter((f) => f.endsWith('.json'));
138
+ // Find all JSON files recursively
139
+ const jsonFiles = await findJsonFiles(curatedDir);
90
140
 
91
- for (const file of jsonFiles) {
92
- const filePath = join(curatedDir, file);
93
- const fileStat = await stat(filePath);
94
- if (!fileStat.isFile()) continue;
141
+ for (const filePath of jsonFiles) {
142
+ const relativeToDir = relative(curatedDir, filePath);
95
143
 
96
144
  try {
97
145
  const content = await readFile(filePath, 'utf-8');
@@ -100,7 +148,7 @@ export async function loadCuratedPlaybooks(
100
148
  // Validate required fields
101
149
  if (!parsed.name || !parsed.applicability || !parsed.guidance) {
102
150
  result.errors.push({
103
- file,
151
+ file: relativeToDir,
104
152
  error: 'Missing required fields: name, applicability, guidance',
105
153
  });
106
154
  continue;
@@ -113,10 +161,15 @@ export async function loadCuratedPlaybooks(
113
161
  continue;
114
162
  }
115
163
 
164
+ // Build sourceFile with optional source prefix
116
165
  const relativePath = relative(process.cwd(), filePath);
166
+ const sourceFile = options?.sourceId
167
+ ? `${options.sourceId}:${relativeToDir}`
168
+ : relativePath;
169
+
117
170
  const provenance: PlaybookProvenance = {
118
171
  origin: 'curated',
119
- sourceFile: relativePath,
172
+ sourceFile,
120
173
  curatedBy: parsed.curatedBy,
121
174
  recordedAt: new Date(),
122
175
  };
@@ -150,7 +203,7 @@ export async function loadCuratedPlaybooks(
150
203
  result.loaded++;
151
204
  } catch (error) {
152
205
  result.errors.push({
153
- file,
206
+ file: relativeToDir,
154
207
  error: error instanceof Error ? error.message : String(error),
155
208
  });
156
209
  }
@@ -99,10 +99,26 @@ export type { SqlitePersistenceConfig } from '../persistence/index.js';
99
99
  // Curated playbook loading
100
100
  export {
101
101
  loadCuratedPlaybooks,
102
+ BUNDLED_SEED_PACK_DIR,
102
103
  type CuratedPlaybookFile,
103
104
  type CuratedLoadResult,
105
+ type CuratedLoadOptions,
104
106
  } from './curated-loader.js';
105
107
 
108
+ // Source resolver (git + local path resolution for curated sources)
109
+ export {
110
+ resolvePlaybookSource,
111
+ isGitSource,
112
+ parseGitSource,
113
+ discoverPlaybookDir,
114
+ sourceStateKey,
115
+ type ParsedGitSource,
116
+ type PlaybookManifest,
117
+ type SourceState,
118
+ type ResolveResult,
119
+ type ResolveOptions,
120
+ } from './source-resolver.js';
121
+
106
122
  // Skill export (compile playbooks → Open Agent Skills format)
107
123
  export {
108
124
  compilePlaybookToSkill,
@@ -616,6 +616,25 @@ export class PlaybookLibrary {
616
616
  return toDelete.length;
617
617
  }
618
618
 
619
+ /**
620
+ * Delete curated playbooks whose provenance.sourceFile starts with the given prefix.
621
+ * Used by the source resolver to recreate playbooks from a specific source
622
+ * without affecting other curated sources.
623
+ */
624
+ async deleteByCuratedSource(sourcePrefix: string): Promise<number> {
625
+ await this.init();
626
+ const toDelete = this.getAllSync().filter(
627
+ (p) =>
628
+ p.provenance?.origin === 'curated' &&
629
+ p.provenance.sourceFile?.startsWith(sourcePrefix),
630
+ );
631
+ for (const playbook of toDelete) {
632
+ this.persistence.deletePlaybook(playbook.id);
633
+ this._index.remove(playbook.id);
634
+ }
635
+ return toDelete.length;
636
+ }
637
+
619
638
  /**
620
639
  * Get provenance summary across all playbooks
621
640
  */