@cleocode/core 2026.10.21 → 2026.10.22

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 (420) hide show
  1. package/STABILITY.md +1 -1
  2. package/dist/build-provenance.json +2 -2
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +2 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/docs/document-edges.d.ts +38 -0
  7. package/dist/docs/document-edges.d.ts.map +1 -0
  8. package/dist/docs/document-edges.js +62 -0
  9. package/dist/docs/document-edges.js.map +1 -0
  10. package/dist/docs/projection.d.ts +3 -2
  11. package/dist/docs/projection.d.ts.map +1 -1
  12. package/dist/docs/projection.js +33 -36
  13. package/dist/docs/projection.js.map +1 -1
  14. package/dist/events/event-bus.d.ts +6 -5
  15. package/dist/events/event-bus.d.ts.map +1 -1
  16. package/dist/events/event-bus.js +9 -8
  17. package/dist/events/event-bus.js.map +1 -1
  18. package/dist/gateway-client/generated/index.d.ts +2 -2
  19. package/dist/gateway-client/generated/index.d.ts.map +1 -1
  20. package/dist/gateway-client/generated/index.js +1 -1
  21. package/dist/gateway-client/generated/index.js.map +1 -1
  22. package/dist/gateway-client/generated/namespaces.gen.d.ts +1 -0
  23. package/dist/gateway-client/generated/namespaces.gen.d.ts.map +1 -1
  24. package/dist/gateway-client/generated/namespaces.gen.js +2 -1
  25. package/dist/gateway-client/generated/namespaces.gen.js.map +1 -1
  26. package/dist/gateway-client/generated/sdk.gen.d.ts +5 -1
  27. package/dist/gateway-client/generated/sdk.gen.d.ts.map +1 -1
  28. package/dist/gateway-client/generated/sdk.gen.js +11 -0
  29. package/dist/gateway-client/generated/sdk.gen.js.map +1 -1
  30. package/dist/gateway-client/generated/types.gen.d.ts +34 -0
  31. package/dist/gateway-client/generated/types.gen.d.ts.map +1 -1
  32. package/dist/git/base-ref.d.ts +81 -0
  33. package/dist/git/base-ref.d.ts.map +1 -0
  34. package/dist/git/base-ref.js +135 -0
  35. package/dist/git/base-ref.js.map +1 -0
  36. package/dist/git/hooks-install.d.ts +1 -1
  37. package/dist/git/hooks-install.d.ts.map +1 -1
  38. package/dist/git/work-tree.d.ts +40 -0
  39. package/dist/git/work-tree.d.ts.map +1 -1
  40. package/dist/git/work-tree.js +62 -7
  41. package/dist/git/work-tree.js.map +1 -1
  42. package/dist/hooks/handlers/conduit-hooks.d.ts +2 -1
  43. package/dist/hooks/handlers/conduit-hooks.d.ts.map +1 -1
  44. package/dist/hooks/handlers/conduit-hooks.js +9 -23
  45. package/dist/hooks/handlers/conduit-hooks.js.map +1 -1
  46. package/dist/hooks/handlers/index.d.ts +0 -1
  47. package/dist/hooks/handlers/index.d.ts.map +1 -1
  48. package/dist/hooks/handlers/index.js +0 -2
  49. package/dist/hooks/handlers/index.js.map +1 -1
  50. package/dist/hooks.d.ts +1 -1
  51. package/dist/hooks.d.ts.map +1 -1
  52. package/dist/init.d.ts.map +1 -1
  53. package/dist/init.js +5 -12
  54. package/dist/init.js.map +1 -1
  55. package/dist/internal.d.ts +2 -3
  56. package/dist/internal.d.ts.map +1 -1
  57. package/dist/internal.js +1 -1
  58. package/dist/internal.js.map +1 -1
  59. package/dist/lifecycle/index.d.ts +15 -1
  60. package/dist/lifecycle/index.d.ts.map +1 -1
  61. package/dist/lifecycle/index.js +12 -6
  62. package/dist/lifecycle/index.js.map +1 -1
  63. package/dist/lifecycle/stage-guidance.js +1 -1
  64. package/dist/lifecycle/stage-guidance.js.map +1 -1
  65. package/dist/memory/auto-row-quarantine.d.ts +196 -0
  66. package/dist/memory/auto-row-quarantine.d.ts.map +1 -0
  67. package/dist/memory/auto-row-quarantine.js +363 -0
  68. package/dist/memory/auto-row-quarantine.js.map +1 -0
  69. package/dist/memory/auto-row-rules.d.ts +29 -0
  70. package/dist/memory/auto-row-rules.d.ts.map +1 -0
  71. package/dist/memory/auto-row-rules.js +55 -0
  72. package/dist/memory/auto-row-rules.js.map +1 -0
  73. package/dist/memory/brain-lifecycle.d.ts.map +1 -1
  74. package/dist/memory/brain-lifecycle.js +13 -8
  75. package/dist/memory/brain-lifecycle.js.map +1 -1
  76. package/dist/memory/brain-search.d.ts +49 -29
  77. package/dist/memory/brain-search.d.ts.map +1 -1
  78. package/dist/memory/brain-search.js +159 -156
  79. package/dist/memory/brain-search.js.map +1 -1
  80. package/dist/memory/brain-similarity.d.ts +27 -4
  81. package/dist/memory/brain-similarity.d.ts.map +1 -1
  82. package/dist/memory/brain-similarity.js +41 -20
  83. package/dist/memory/brain-similarity.js.map +1 -1
  84. package/dist/memory/brain-stub-prune.d.ts +13 -0
  85. package/dist/memory/brain-stub-prune.d.ts.map +1 -1
  86. package/dist/memory/brain-stub-prune.js +14 -3
  87. package/dist/memory/brain-stub-prune.js.map +1 -1
  88. package/dist/memory/brain-writer-handlers.d.ts +3 -7
  89. package/dist/memory/brain-writer-handlers.d.ts.map +1 -1
  90. package/dist/memory/brain-writer-handlers.js +5 -20
  91. package/dist/memory/brain-writer-handlers.js.map +1 -1
  92. package/dist/memory/brain-writer-thread.d.ts +2 -11
  93. package/dist/memory/brain-writer-thread.d.ts.map +1 -1
  94. package/dist/memory/brain-writer-thread.js +20 -78
  95. package/dist/memory/brain-writer-thread.js.map +1 -1
  96. package/dist/memory/brain-writer-worker.js +1 -8
  97. package/dist/memory/brain-writer-worker.js.map +1 -1
  98. package/dist/memory/dispatch-trace-format.d.ts +13 -14
  99. package/dist/memory/dispatch-trace-format.d.ts.map +1 -1
  100. package/dist/memory/dispatch-trace-format.js +13 -14
  101. package/dist/memory/dispatch-trace-format.js.map +1 -1
  102. package/dist/memory/eligibility.d.ts +22 -0
  103. package/dist/memory/eligibility.d.ts.map +1 -1
  104. package/dist/memory/eligibility.js +36 -0
  105. package/dist/memory/eligibility.js.map +1 -1
  106. package/dist/memory/engine-compat.d.ts.map +1 -1
  107. package/dist/memory/engine-compat.js +11 -1
  108. package/dist/memory/engine-compat.js.map +1 -1
  109. package/dist/memory/evidence-graph-links.d.ts +253 -0
  110. package/dist/memory/evidence-graph-links.d.ts.map +1 -0
  111. package/dist/memory/evidence-graph-links.js +554 -0
  112. package/dist/memory/evidence-graph-links.js.map +1 -0
  113. package/dist/memory/extraction-gate.d.ts +7 -0
  114. package/dist/memory/extraction-gate.d.ts.map +1 -1
  115. package/dist/memory/extraction-gate.js +20 -8
  116. package/dist/memory/extraction-gate.js.map +1 -1
  117. package/dist/memory/global-brain.d.ts +4 -6
  118. package/dist/memory/global-brain.d.ts.map +1 -1
  119. package/dist/memory/global-brain.js +15 -2
  120. package/dist/memory/global-brain.js.map +1 -1
  121. package/dist/memory/graph-auto-populate.d.ts +73 -1
  122. package/dist/memory/graph-auto-populate.d.ts.map +1 -1
  123. package/dist/memory/graph-auto-populate.js +111 -8
  124. package/dist/memory/graph-auto-populate.js.map +1 -1
  125. package/dist/memory/import-from-provider.d.ts +19 -6
  126. package/dist/memory/import-from-provider.d.ts.map +1 -1
  127. package/dist/memory/import-from-provider.js +28 -15
  128. package/dist/memory/import-from-provider.js.map +1 -1
  129. package/dist/memory/lessons-import.d.ts +175 -0
  130. package/dist/memory/lessons-import.d.ts.map +1 -0
  131. package/dist/memory/lessons-import.js +233 -0
  132. package/dist/memory/lessons-import.js.map +1 -0
  133. package/dist/memory/lessons.d.ts +67 -0
  134. package/dist/memory/lessons.d.ts.map +1 -0
  135. package/dist/memory/lessons.js +121 -0
  136. package/dist/memory/lessons.js.map +1 -0
  137. package/dist/memory/memory-bridge.d.ts.map +1 -1
  138. package/dist/memory/memory-bridge.js +3 -2
  139. package/dist/memory/memory-bridge.js.map +1 -1
  140. package/dist/memory/public-api.d.ts.map +1 -1
  141. package/dist/memory/public-api.js +7 -6
  142. package/dist/memory/public-api.js.map +1 -1
  143. package/dist/memory/recall-ranking.d.ts +88 -0
  144. package/dist/memory/recall-ranking.d.ts.map +1 -0
  145. package/dist/memory/recall-ranking.js +130 -0
  146. package/dist/memory/recall-ranking.js.map +1 -0
  147. package/dist/memory/retrieval/build-retrieval-bundle.js +5 -5
  148. package/dist/memory/retrieval/build-retrieval-bundle.js.map +1 -1
  149. package/dist/memory/retrieval/fetch.d.ts +3 -2
  150. package/dist/memory/retrieval/fetch.d.ts.map +1 -1
  151. package/dist/memory/retrieval/fetch.js +4 -3
  152. package/dist/memory/retrieval/fetch.js.map +1 -1
  153. package/dist/memory/retrieval/observe.d.ts +1 -7
  154. package/dist/memory/retrieval/observe.d.ts.map +1 -1
  155. package/dist/memory/retrieval/observe.js +9 -58
  156. package/dist/memory/retrieval/observe.js.map +1 -1
  157. package/dist/memory/retrieval/search.d.ts +5 -6
  158. package/dist/memory/retrieval/search.d.ts.map +1 -1
  159. package/dist/memory/retrieval/search.js +38 -102
  160. package/dist/memory/retrieval/search.js.map +1 -1
  161. package/dist/memory/retrieval/telemetry.d.ts +5 -16
  162. package/dist/memory/retrieval/telemetry.d.ts.map +1 -1
  163. package/dist/memory/retrieval/telemetry.js +5 -22
  164. package/dist/memory/retrieval/telemetry.js.map +1 -1
  165. package/dist/nexus/analyze-orchestrator.d.ts +15 -0
  166. package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
  167. package/dist/nexus/analyze-orchestrator.js +53 -6
  168. package/dist/nexus/analyze-orchestrator.js.map +1 -1
  169. package/dist/nexus/brief-map.d.ts +60 -0
  170. package/dist/nexus/brief-map.d.ts.map +1 -0
  171. package/dist/nexus/brief-map.js +234 -0
  172. package/dist/nexus/brief-map.js.map +1 -0
  173. package/dist/nexus/freshness.d.ts +128 -13
  174. package/dist/nexus/freshness.d.ts.map +1 -1
  175. package/dist/nexus/freshness.js +374 -86
  176. package/dist/nexus/freshness.js.map +1 -1
  177. package/dist/nexus/graph-manifest.d.ts +47 -0
  178. package/dist/nexus/graph-manifest.d.ts.map +1 -1
  179. package/dist/nexus/graph-manifest.js +69 -0
  180. package/dist/nexus/graph-manifest.js.map +1 -1
  181. package/dist/nexus/hooks-augment.d.ts.map +1 -1
  182. package/dist/nexus/hooks-augment.js +7 -3
  183. package/dist/nexus/hooks-augment.js.map +1 -1
  184. package/dist/nexus/index-health.d.ts +112 -0
  185. package/dist/nexus/index-health.d.ts.map +1 -0
  186. package/dist/nexus/index-health.js +199 -0
  187. package/dist/nexus/index-health.js.map +1 -0
  188. package/dist/nexus/living-brain.d.ts.map +1 -1
  189. package/dist/nexus/living-brain.js +2 -15
  190. package/dist/nexus/living-brain.js.map +1 -1
  191. package/dist/nexus/pid-lock.d.ts +50 -0
  192. package/dist/nexus/pid-lock.d.ts.map +1 -0
  193. package/dist/nexus/pid-lock.js +135 -0
  194. package/dist/nexus/pid-lock.js.map +1 -0
  195. package/dist/nexus/projects-clean.d.ts.map +1 -1
  196. package/dist/nexus/projects-clean.js +33 -2
  197. package/dist/nexus/projects-clean.js.map +1 -1
  198. package/dist/nexus/refresh-child.js +4 -0
  199. package/dist/nexus/refresh-child.js.map +1 -1
  200. package/dist/nexus/registry-host.d.ts +70 -0
  201. package/dist/nexus/registry-host.d.ts.map +1 -0
  202. package/dist/nexus/registry-host.js +79 -0
  203. package/dist/nexus/registry-host.js.map +1 -0
  204. package/dist/nexus/registry.d.ts +37 -0
  205. package/dist/nexus/registry.d.ts.map +1 -1
  206. package/dist/nexus/registry.js +49 -1
  207. package/dist/nexus/registry.js.map +1 -1
  208. package/dist/nexus/reindex-on-merge.d.ts +94 -0
  209. package/dist/nexus/reindex-on-merge.d.ts.map +1 -0
  210. package/dist/nexus/reindex-on-merge.js +192 -0
  211. package/dist/nexus/reindex-on-merge.js.map +1 -0
  212. package/dist/orchestrate/handoff-ops.d.ts.map +1 -1
  213. package/dist/orchestrate/handoff-ops.js +1 -13
  214. package/dist/orchestrate/handoff-ops.js.map +1 -1
  215. package/dist/orchestrate/index.d.ts +2 -3
  216. package/dist/orchestrate/index.d.ts.map +1 -1
  217. package/dist/orchestrate/index.js +2 -2
  218. package/dist/orchestrate/index.js.map +1 -1
  219. package/dist/orchestrate/lifecycle-ops.d.ts +3 -0
  220. package/dist/orchestrate/lifecycle-ops.d.ts.map +1 -1
  221. package/dist/orchestrate/lifecycle-ops.js +5 -5
  222. package/dist/orchestrate/lifecycle-ops.js.map +1 -1
  223. package/dist/orchestrate/spawn-ops.d.ts +8 -28
  224. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  225. package/dist/orchestrate/spawn-ops.js +8 -67
  226. package/dist/orchestrate/spawn-ops.js.map +1 -1
  227. package/dist/orchestration/lead-rollup.d.ts +7 -0
  228. package/dist/orchestration/lead-rollup.d.ts.map +1 -1
  229. package/dist/orchestration/lead-rollup.js.map +1 -1
  230. package/dist/orchestration/spawn-prompt.d.ts +8 -29
  231. package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
  232. package/dist/orchestration/spawn-prompt.js +44 -112
  233. package/dist/orchestration/spawn-prompt.js.map +1 -1
  234. package/dist/orchestration/spawn.d.ts +7 -14
  235. package/dist/orchestration/spawn.d.ts.map +1 -1
  236. package/dist/orchestration/spawn.js +2 -5
  237. package/dist/orchestration/spawn.js.map +1 -1
  238. package/dist/orchestration/wave-topic.d.ts +0 -13
  239. package/dist/orchestration/wave-topic.d.ts.map +1 -1
  240. package/dist/orchestration/wave-topic.js +0 -20
  241. package/dist/orchestration/wave-topic.js.map +1 -1
  242. package/dist/release/engine-ops.js +2 -2
  243. package/dist/release/engine-ops.js.map +1 -1
  244. package/dist/release/github-pr.d.ts +8 -5
  245. package/dist/release/github-pr.d.ts.map +1 -1
  246. package/dist/release/github-pr.js +11 -16
  247. package/dist/release/github-pr.js.map +1 -1
  248. package/dist/release/plan.d.ts +4 -2
  249. package/dist/release/plan.d.ts.map +1 -1
  250. package/dist/release/plan.js +11 -4
  251. package/dist/release/plan.js.map +1 -1
  252. package/dist/release/pr-evidence.d.ts +39 -11
  253. package/dist/release/pr-evidence.d.ts.map +1 -1
  254. package/dist/release/pr-evidence.js +122 -31
  255. package/dist/release/pr-evidence.js.map +1 -1
  256. package/dist/release/reconcile.d.ts +15 -0
  257. package/dist/release/reconcile.d.ts.map +1 -1
  258. package/dist/release/reconcile.js +36 -0
  259. package/dist/release/reconcile.js.map +1 -1
  260. package/dist/render/brain/index.d.ts +3 -2
  261. package/dist/render/brain/index.d.ts.map +1 -1
  262. package/dist/render/brain/index.js +4 -2
  263. package/dist/render/brain/index.js.map +1 -1
  264. package/dist/render/brain/migrate-repo-ids.d.ts +19 -0
  265. package/dist/render/brain/migrate-repo-ids.d.ts.map +1 -0
  266. package/dist/render/brain/migrate-repo-ids.js +41 -0
  267. package/dist/render/brain/migrate-repo-ids.js.map +1 -0
  268. package/dist/render/nexus/graph/index.d.ts.map +1 -1
  269. package/dist/render/nexus/graph/index.js +10 -1
  270. package/dist/render/nexus/graph/index.js.map +1 -1
  271. package/dist/resources/admission-ledger.d.ts +39 -4
  272. package/dist/resources/admission-ledger.d.ts.map +1 -1
  273. package/dist/resources/admission-ledger.js +147 -32
  274. package/dist/resources/admission-ledger.js.map +1 -1
  275. package/dist/resources/hook-footprint.d.ts +90 -0
  276. package/dist/resources/hook-footprint.d.ts.map +1 -0
  277. package/dist/resources/hook-footprint.js +245 -0
  278. package/dist/resources/hook-footprint.js.map +1 -0
  279. package/dist/resources/pressure-gate.d.ts +3 -2
  280. package/dist/resources/pressure-gate.d.ts.map +1 -1
  281. package/dist/resources/pressure-gate.js +8 -5
  282. package/dist/resources/pressure-gate.js.map +1 -1
  283. package/dist/resources/run-admission.d.ts +23 -3
  284. package/dist/resources/run-admission.d.ts.map +1 -1
  285. package/dist/resources/run-admission.js +70 -8
  286. package/dist/resources/run-admission.js.map +1 -1
  287. package/dist/resources/run-class.d.ts +1 -0
  288. package/dist/resources/run-class.d.ts.map +1 -1
  289. package/dist/resources/run-class.js +7 -0
  290. package/dist/resources/run-class.js.map +1 -1
  291. package/dist/resources/run-governed.d.ts +13 -1
  292. package/dist/resources/run-governed.d.ts.map +1 -1
  293. package/dist/resources/run-governed.js +29 -6
  294. package/dist/resources/run-governed.js.map +1 -1
  295. package/dist/resources/top-memory.d.ts +67 -0
  296. package/dist/resources/top-memory.d.ts.map +1 -0
  297. package/dist/resources/top-memory.js +143 -0
  298. package/dist/resources/top-memory.js.map +1 -0
  299. package/dist/scaffold/global-scaffold.d.ts +6 -1
  300. package/dist/scaffold/global-scaffold.d.ts.map +1 -1
  301. package/dist/scaffold/global-scaffold.js +11 -2
  302. package/dist/scaffold/global-scaffold.js.map +1 -1
  303. package/dist/scaffold/scaffold-global.d.ts +3 -2
  304. package/dist/scaffold/scaffold-global.d.ts.map +1 -1
  305. package/dist/scaffold/scaffold-global.js +3 -2
  306. package/dist/scaffold/scaffold-global.js.map +1 -1
  307. package/dist/sentient/ingesters/brain-ingester.d.ts.map +1 -1
  308. package/dist/sentient/ingesters/brain-ingester.js +2 -1
  309. package/dist/sentient/ingesters/brain-ingester.js.map +1 -1
  310. package/dist/session/engine-ops.js +1 -1
  311. package/dist/session/engine-ops.js.map +1 -1
  312. package/dist/sessions/briefing.d.ts +26 -0
  313. package/dist/sessions/briefing.d.ts.map +1 -1
  314. package/dist/sessions/briefing.js +46 -0
  315. package/dist/sessions/briefing.js.map +1 -1
  316. package/dist/sessions/session-end-snapshot.d.ts +1 -1
  317. package/dist/sessions/session-end-snapshot.js +1 -1
  318. package/dist/sessions/session-id.d.ts +2 -1
  319. package/dist/sessions/session-id.d.ts.map +1 -1
  320. package/dist/sessions/session-id.js +3 -2
  321. package/dist/sessions/session-id.js.map +1 -1
  322. package/dist/store/agent-resolver.d.ts +0 -6
  323. package/dist/store/agent-resolver.d.ts.map +1 -1
  324. package/dist/store/agent-resolver.js +0 -31
  325. package/dist/store/agent-resolver.js.map +1 -1
  326. package/dist/store/memory-accessor.d.ts +45 -2
  327. package/dist/store/memory-accessor.d.ts.map +1 -1
  328. package/dist/store/memory-accessor.js +81 -7
  329. package/dist/store/memory-accessor.js.map +1 -1
  330. package/dist/store/schema/cleo-shared/brain.d.ts +2 -2
  331. package/dist/store/schema/memory-schema.d.ts +3 -3
  332. package/dist/store/schema/memory-schema.d.ts.map +1 -1
  333. package/dist/store/schema/memory-schema.js +2 -0
  334. package/dist/store/schema/memory-schema.js.map +1 -1
  335. package/dist/store/session-store.d.ts +5 -2
  336. package/dist/store/session-store.d.ts.map +1 -1
  337. package/dist/store/session-store.js +10 -5
  338. package/dist/store/session-store.js.map +1 -1
  339. package/dist/store/sqlite-native.d.ts +5 -4
  340. package/dist/store/sqlite-native.d.ts.map +1 -1
  341. package/dist/store/sqlite-native.js +5 -4
  342. package/dist/store/sqlite-native.js.map +1 -1
  343. package/dist/store/sync/merge/rules.d.ts.map +1 -1
  344. package/dist/store/sync/merge/rules.js +4 -3
  345. package/dist/store/sync/merge/rules.js.map +1 -1
  346. package/dist/store/validation-schemas.d.ts +1 -0
  347. package/dist/store/validation-schemas.d.ts.map +1 -1
  348. package/dist/store/vault-manifest.js +1 -1
  349. package/dist/store/vault-manifest.js.map +1 -1
  350. package/dist/system/project-health.d.ts +7 -0
  351. package/dist/system/project-health.d.ts.map +1 -1
  352. package/dist/system/project-health.js +13 -0
  353. package/dist/system/project-health.js.map +1 -1
  354. package/dist/tasks/add.d.ts.map +1 -1
  355. package/dist/tasks/add.js +0 -15
  356. package/dist/tasks/add.js.map +1 -1
  357. package/dist/tasks/affected-packages.d.ts +26 -11
  358. package/dist/tasks/affected-packages.d.ts.map +1 -1
  359. package/dist/tasks/affected-packages.js +54 -17
  360. package/dist/tasks/affected-packages.js.map +1 -1
  361. package/dist/tasks/affected-scope.d.ts +24 -0
  362. package/dist/tasks/affected-scope.d.ts.map +1 -1
  363. package/dist/tasks/affected-scope.js +57 -0
  364. package/dist/tasks/affected-scope.js.map +1 -1
  365. package/dist/tasks/change-set.d.ts +72 -9
  366. package/dist/tasks/change-set.d.ts.map +1 -1
  367. package/dist/tasks/change-set.js +227 -20
  368. package/dist/tasks/change-set.js.map +1 -1
  369. package/dist/tasks/complete-ci.d.ts.map +1 -1
  370. package/dist/tasks/complete-ci.js +2 -0
  371. package/dist/tasks/complete-ci.js.map +1 -1
  372. package/dist/tasks/complete.d.ts +2 -2
  373. package/dist/tasks/complete.d.ts.map +1 -1
  374. package/dist/tasks/complete.js +38 -17
  375. package/dist/tasks/complete.js.map +1 -1
  376. package/dist/tasks/done-plan.d.ts.map +1 -1
  377. package/dist/tasks/done-plan.js +66 -18
  378. package/dist/tasks/done-plan.js.map +1 -1
  379. package/dist/tasks/epic-enforcement.d.ts +39 -1
  380. package/dist/tasks/epic-enforcement.d.ts.map +1 -1
  381. package/dist/tasks/epic-enforcement.js +46 -2
  382. package/dist/tasks/epic-enforcement.js.map +1 -1
  383. package/dist/tasks/evidence.d.ts +74 -22
  384. package/dist/tasks/evidence.d.ts.map +1 -1
  385. package/dist/tasks/evidence.js +221 -35
  386. package/dist/tasks/evidence.js.map +1 -1
  387. package/dist/tasks/gate-runner.d.ts.map +1 -1
  388. package/dist/tasks/gate-runner.js +2 -12
  389. package/dist/tasks/gate-runner.js.map +1 -1
  390. package/dist/tasks/qa-run-binding.d.ts +2 -0
  391. package/dist/tasks/qa-run-binding.d.ts.map +1 -1
  392. package/dist/tasks/qa-run-binding.js +6 -2
  393. package/dist/tasks/qa-run-binding.js.map +1 -1
  394. package/dist/tasks/test-run-binding.d.ts +2 -0
  395. package/dist/tasks/test-run-binding.d.ts.map +1 -1
  396. package/dist/tasks/test-run-binding.js +8 -3
  397. package/dist/tasks/test-run-binding.js.map +1 -1
  398. package/dist/tasks/verification-policy.d.ts +57 -1
  399. package/dist/tasks/verification-policy.d.ts.map +1 -1
  400. package/dist/tasks/verification-policy.js +94 -1
  401. package/dist/tasks/verification-policy.js.map +1 -1
  402. package/dist/upgrade.d.ts.map +1 -1
  403. package/dist/upgrade.js +2 -15
  404. package/dist/upgrade.js.map +1 -1
  405. package/dist/validation/engine-ops.d.ts.map +1 -1
  406. package/dist/validation/engine-ops.js +39 -19
  407. package/dist/validation/engine-ops.js.map +1 -1
  408. package/package.json +13 -13
  409. package/schemas/config.schema.json +69 -0
  410. package/templates/CLEO-INJECTION.md +4 -5
  411. package/templates/CLEO-REFERENCE.md +2 -4
  412. package/templates/git-hooks/post-merge +25 -0
  413. package/dist/memory/dispatch-trace.d.ts +0 -44
  414. package/dist/memory/dispatch-trace.d.ts.map +0 -1
  415. package/dist/memory/dispatch-trace.js +0 -65
  416. package/dist/memory/dispatch-trace.js.map +0 -1
  417. package/dist/memory/retrieval/increment-citation-counts.d.ts +0 -11
  418. package/dist/memory/retrieval/increment-citation-counts.d.ts.map +0 -1
  419. package/dist/memory/retrieval/increment-citation-counts.js +0 -43
  420. package/dist/memory/retrieval/increment-citation-counts.js.map +0 -1
@@ -94,6 +94,14 @@ function saveImportHashes(stateFile, hashes) {
94
94
  // ---------------------------------------------------------------------------
95
95
  // Public API
96
96
  // ---------------------------------------------------------------------------
97
+ /** Observation type for a provider memory entry (`feedback` entries become learnings). */
98
+ function observeType(entryType) {
99
+ if (entryType === 'project')
100
+ return 'feature';
101
+ if (entryType === 'user')
102
+ return 'change';
103
+ return 'discovery';
104
+ }
97
105
  /**
98
106
  * Import `*.md` memory files from a provider directory into `brain.db`.
99
107
  *
@@ -146,29 +154,34 @@ export async function importMemoryFiles(opts) {
146
154
  }
147
155
  const entryType = type ?? 'project';
148
156
  if (!dryRun) {
149
- if (entryType === 'feedback') {
150
- await dispatch('mutate', 'memory', 'learning.store', {
157
+ const response = entryType === 'feedback'
158
+ ? await dispatch('mutate', 'memory', 'learning.store', {
151
159
  insight: `[MIGRATED] ${title}: ${fullText}`,
152
160
  source: 'manual',
153
161
  confidence: 0.8,
154
162
  actionable: false,
155
- }, { command: 'memory', operation: 'memory.learning.store' });
156
- }
157
- else {
158
- const observeType = entryType === 'project'
159
- ? 'feature'
160
- : entryType === 'reference'
161
- ? 'discovery'
162
- : entryType === 'user'
163
- ? 'change'
164
- : 'discovery';
165
- await dispatch('mutate', 'memory', 'observe', {
163
+ })
164
+ : await dispatch('mutate', 'memory', 'observe', {
166
165
  text: `[MIGRATED] ${title}: ${fullText}`,
167
166
  title: `[MIGRATED] ${title}`,
168
- type: observeType,
167
+ type: observeType(entryType),
169
168
  sourceType: 'manual',
170
- }, { command: 'memory', operation: 'memory.observe' });
169
+ });
170
+ // T13949: observe refuses a duplicate with E_OBSERVE_NOT_STORED; a merge
171
+ // means the entry is already in BRAIN, so it is skipped, not imported. A
172
+ // deferred or rejected write carries no real id and stays an error.
173
+ if (!response.success &&
174
+ response.error?.code === 'E_OBSERVE_NOT_STORED' &&
175
+ response.error.details?.['gateAction'] === 'merged') {
176
+ importedHashes.add(hash);
177
+ stats.skipped++;
178
+ const existing = response.error.details?.['id'];
179
+ const into = typeof existing === 'string' ? existing : 'an existing entry';
180
+ skippedEntries.push({ file: fileName, reason: `already in BRAIN as ${into}` });
181
+ continue;
171
182
  }
183
+ if (!response.success)
184
+ throw new Error(response.error?.message ?? 'Import write failed');
172
185
  importedHashes.add(hash);
173
186
  }
174
187
  stats.imported++;
@@ -1 +1 @@
1
- {"version":3,"file":"import-from-provider.js","sourceRoot":"","sources":["../../src/memory/import-from-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import-from-provider.js","sourceRoot":"","sources":["../../src/memory/import-from-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * One-time import of a Claude Code memory directory as BRAIN lessons
3
+ * (T13949 part (c), owner decision D11181).
4
+ *
5
+ * A dry run plans every file: which become lessons, which are skipped and why,
6
+ * with the source provenance of each. The plan carries a digest; an apply
7
+ * re-plans the directory and writes only when the digest still matches the
8
+ * approved one, so what is written is exactly what was reviewed. An apply
9
+ * records a receipt (file, sha256, lesson id) before and after writing, and
10
+ * never deletes or edits a source file.
11
+ *
12
+ * Mapping: a `feedback` memory is a process rule and becomes a lesson in the
13
+ * main (global) brain; a `project` memory is a fact about one project and
14
+ * becomes a lesson in that project's brain, so it never reaches other
15
+ * projects' recall or syncs to them. Its frontmatter `description` is the
16
+ * one-line rule (the lesson title) and its body the why. `user` and
17
+ * `reference` memories are not lessons. A memory marked wrong or superseded
18
+ * (its description or first body line starts with PARTLY WRONG, WRONG or
19
+ * SUPERSEDED) and any file the reviewer excludes are skipped. Each lesson's
20
+ * text ends with its provenance line (source file and content hash), so the
21
+ * same file imported twice is deduplicated.
22
+ *
23
+ * Code placed in `packages/core/` per Package-Boundary Check — verified against AGENTS.md.
24
+ *
25
+ * @module memory/lessons-import
26
+ * @task T13949
27
+ */
28
+ /** Brain a lesson is written to. */
29
+ export type LessonImportScope = 'global' | 'project';
30
+ /** One memory file planned as a lesson. */
31
+ export interface LessonImportCandidate {
32
+ /** File name inside the source directory. */
33
+ file: string;
34
+ /** SHA-256 of the file's bytes. */
35
+ sha256: string;
36
+ /** Frontmatter `name`, when present. */
37
+ name: string | null;
38
+ /** Frontmatter memory type (`feedback` or `project`). */
39
+ memoryType: string;
40
+ /** Brain the lesson is written to: `global` for feedback, `project` for project memories. */
41
+ scope: LessonImportScope;
42
+ /** The one-line rule (lesson title). */
43
+ rule: string;
44
+ /** The why, ending with the provenance line (lesson text). */
45
+ text: string;
46
+ }
47
+ /** A memory file the import leaves out, and why. */
48
+ export interface LessonImportSkip {
49
+ /** File name inside the source directory. */
50
+ file: string;
51
+ /** Why it is not imported. */
52
+ reason: string;
53
+ }
54
+ /** What an import would write. */
55
+ export interface LessonImportPlan {
56
+ /** Absolute source directory. */
57
+ sourceDir: string;
58
+ /** Files that become lessons, sorted by file name. */
59
+ candidates: LessonImportCandidate[];
60
+ /** Files left out, sorted by file name. */
61
+ skipped: LessonImportSkip[];
62
+ /** Digest of the candidate set (file, content hash, scope); an apply must match it. */
63
+ digest: string;
64
+ }
65
+ /** One written lesson in a receipt. */
66
+ export interface LessonImportWrite {
67
+ /** Source file. */
68
+ file: string;
69
+ /** Source content hash. */
70
+ sha256: string;
71
+ /** Brain the lesson was written to. */
72
+ scope: LessonImportScope;
73
+ /** Lesson id in that brain. */
74
+ id: string;
75
+ /** False when the same lesson already existed (the id names that entry). */
76
+ stored: boolean;
77
+ }
78
+ /** Receipt of an applied import. */
79
+ export interface LessonImportReceipt {
80
+ /** Receipt format version. */
81
+ version: 1;
82
+ /** ISO timestamp of the apply. */
83
+ importedAt: string;
84
+ /** `started` before the first write; `complete` after the last. */
85
+ status: 'started' | 'complete';
86
+ /** Absolute source directory. */
87
+ sourceDir: string;
88
+ /** Approved digest. */
89
+ digest: string;
90
+ /** Lessons written (or found already present), in plan order. */
91
+ written: LessonImportWrite[];
92
+ }
93
+ /** An import refused before any write. */
94
+ export declare class LessonImportError extends Error {
95
+ readonly code: 'E_LESSON_IMPORT_SOURCE' | 'E_LESSON_IMPORT_DIGEST_MISMATCH';
96
+ /**
97
+ * @param code - Stable error code.
98
+ * @param message - Human-readable reason.
99
+ */
100
+ constructor(code: 'E_LESSON_IMPORT_SOURCE' | 'E_LESSON_IMPORT_DIGEST_MISMATCH', message: string);
101
+ }
102
+ /**
103
+ * The Claude Code memory directory of a project: `~/.claude/projects/<root
104
+ * with every path separator replaced by '-'>/memory`.
105
+ *
106
+ * @param projectRoot - Absolute project root.
107
+ * @param home - Home directory (for tests).
108
+ * @returns The directory path; it may not exist.
109
+ * @example
110
+ * ```ts
111
+ * defaultLessonImportDir('/Users/me/repo'); // ~/.claude/projects/-Users-me-repo/memory
112
+ * ```
113
+ */
114
+ export declare function defaultLessonImportDir(projectRoot: string, home?: string): string;
115
+ /**
116
+ * Plan an import: read every `*.md` file except `MEMORY.md` and decide which
117
+ * become lessons, and where. Reads only.
118
+ *
119
+ * @param sourceDir - Memory directory to import.
120
+ * @param options - `exclude`: file names the reviewer dropped; they are skipped
121
+ * before the digest, so the digest pins the final set.
122
+ * @returns The plan with its digest.
123
+ * @throws LessonImportError when the directory does not exist.
124
+ * @example
125
+ * ```ts
126
+ * const plan = planLessonImport(defaultLessonImportDir(root), { exclude: ['old.md'] });
127
+ * ```
128
+ */
129
+ export declare function planLessonImport(sourceDir: string, options?: {
130
+ exclude?: readonly string[];
131
+ }): LessonImportPlan;
132
+ /** Writes one lesson to the brain its scope names; injectable for tests. */
133
+ export type LessonWriter = (lesson: {
134
+ text: string;
135
+ title: string;
136
+ scope: LessonImportScope;
137
+ }) => Promise<{
138
+ id: string;
139
+ stored?: boolean;
140
+ }>;
141
+ /**
142
+ * Apply an approved import: re-plan the directory with the same exclusions,
143
+ * refuse unless the digest still matches, record a receipt, then write each
144
+ * lesson to the main brain (feedback) or the project brain (project).
145
+ *
146
+ * @param projectRoot - Project whose brain receives project lessons.
147
+ * @param sourceDir - Memory directory to import.
148
+ * @param expectDigest - Digest of the approved dry run.
149
+ * @param receiptPath - Where the receipt is written (before the first write).
150
+ * @param options - `exclude` as in the dry run; `write` overrides the brain writers; `now` for tests.
151
+ * @returns The completed receipt.
152
+ * @throws LessonImportError when the directory changed since the approved plan.
153
+ * @example
154
+ * ```ts
155
+ * const receipt = await applyLessonImport(dir, plan.digest, receiptPath);
156
+ * ```
157
+ */
158
+ export declare function applyLessonImport(projectRoot: string, sourceDir: string, expectDigest: string, receiptPath: string, options?: {
159
+ exclude?: readonly string[];
160
+ write?: LessonWriter;
161
+ now?: Date;
162
+ }): Promise<LessonImportReceipt>;
163
+ /**
164
+ * Default receipt path of an applied lessons import.
165
+ *
166
+ * @param projectRoot - Project root.
167
+ * @param importedAt - ISO timestamp of the apply.
168
+ * @returns Absolute path under `.cleo/backups/migrations/`.
169
+ * @example
170
+ * ```ts
171
+ * defaultLessonImportReceiptPath(root, '2026-10-24T00:00:00.000Z');
172
+ * ```
173
+ */
174
+ export declare function defaultLessonImportReceiptPath(projectRoot: string, importedAt: string): string;
175
+ //# sourceMappingURL=lessons-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lessons-import.d.ts","sourceRoot":"","sources":["../../src/memory/lessons-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * One-time import of a Claude Code memory directory as BRAIN lessons
3
+ * (T13949 part (c), owner decision D11181).
4
+ *
5
+ * A dry run plans every file: which become lessons, which are skipped and why,
6
+ * with the source provenance of each. The plan carries a digest; an apply
7
+ * re-plans the directory and writes only when the digest still matches the
8
+ * approved one, so what is written is exactly what was reviewed. An apply
9
+ * records a receipt (file, sha256, lesson id) before and after writing, and
10
+ * never deletes or edits a source file.
11
+ *
12
+ * Mapping: a `feedback` memory is a process rule and becomes a lesson in the
13
+ * main (global) brain; a `project` memory is a fact about one project and
14
+ * becomes a lesson in that project's brain, so it never reaches other
15
+ * projects' recall or syncs to them. Its frontmatter `description` is the
16
+ * one-line rule (the lesson title) and its body the why. `user` and
17
+ * `reference` memories are not lessons. A memory marked wrong or superseded
18
+ * (its description or first body line starts with PARTLY WRONG, WRONG or
19
+ * SUPERSEDED) and any file the reviewer excludes are skipped. Each lesson's
20
+ * text ends with its provenance line (source file and content hash), so the
21
+ * same file imported twice is deduplicated.
22
+ *
23
+ * Code placed in `packages/core/` per Package-Boundary Check — verified against AGENTS.md.
24
+ *
25
+ * @module memory/lessons-import
26
+ * @task T13949
27
+ */
28
+ import { createHash } from 'node:crypto';
29
+ import { existsSync, mkdirSync, readdirSync, readFileSync } from 'node:fs';
30
+ import { homedir } from 'node:os';
31
+ import { dirname, join } from 'node:path';
32
+ import { writeJsonFileAtomic } from '../store/file-utils.js';
33
+ import { parseMemoryFileFrontmatter } from './import-from-provider.js';
34
+ import { lessonRuleError } from './lessons.js';
35
+ /** Where each memory type lands as a lesson; other types are skipped. */
36
+ const LESSON_SCOPE_BY_TYPE = {
37
+ feedback: 'global',
38
+ project: 'project',
39
+ };
40
+ /** A memory its author marked as no longer true. */
41
+ const RETRACTED = /^(?:partly\s+wrong|wrong|superseded)\b/i;
42
+ /**
43
+ * Source type of imported lessons: agent-written memories, so `agent`
44
+ * confidence in both brains. Each lesson's provenance line names its source
45
+ * file.
46
+ */
47
+ const LESSON_IMPORT_SOURCE_TYPE = 'agent';
48
+ /** A frontmatter scalar without its surrounding YAML quotes. */
49
+ function unquote(value) {
50
+ const text = value.trim();
51
+ if (text.length >= 2 && text.startsWith('"') && text.endsWith('"'))
52
+ return text.slice(1, -1).replace(/\\(["\\])/g, '$1');
53
+ if (text.length >= 2 && text.startsWith("'") && text.endsWith("'"))
54
+ return text.slice(1, -1).replace(/''/g, "'");
55
+ return text;
56
+ }
57
+ /** An import refused before any write. */
58
+ export class LessonImportError extends Error {
59
+ code;
60
+ /**
61
+ * @param code - Stable error code.
62
+ * @param message - Human-readable reason.
63
+ */
64
+ constructor(code, message) {
65
+ super(message);
66
+ this.code = code;
67
+ this.name = 'LessonImportError';
68
+ }
69
+ }
70
+ /**
71
+ * The Claude Code memory directory of a project: `~/.claude/projects/<root
72
+ * with every path separator replaced by '-'>/memory`.
73
+ *
74
+ * @param projectRoot - Absolute project root.
75
+ * @param home - Home directory (for tests).
76
+ * @returns The directory path; it may not exist.
77
+ * @example
78
+ * ```ts
79
+ * defaultLessonImportDir('/Users/me/repo'); // ~/.claude/projects/-Users-me-repo/memory
80
+ * ```
81
+ */
82
+ export function defaultLessonImportDir(projectRoot, home = homedir()) {
83
+ return join(home, '.claude', 'projects', projectRoot.replace(/[\\/]/g, '-'), 'memory');
84
+ }
85
+ /**
86
+ * Plan an import: read every `*.md` file except `MEMORY.md` and decide which
87
+ * become lessons, and where. Reads only.
88
+ *
89
+ * @param sourceDir - Memory directory to import.
90
+ * @param options - `exclude`: file names the reviewer dropped; they are skipped
91
+ * before the digest, so the digest pins the final set.
92
+ * @returns The plan with its digest.
93
+ * @throws LessonImportError when the directory does not exist.
94
+ * @example
95
+ * ```ts
96
+ * const plan = planLessonImport(defaultLessonImportDir(root), { exclude: ['old.md'] });
97
+ * ```
98
+ */
99
+ export function planLessonImport(sourceDir, options = {}) {
100
+ const excluded = new Set(options.exclude ?? []);
101
+ if (!existsSync(sourceDir))
102
+ // @sync-invariant none:input-shape a missing source directory is refused before any write
103
+ throw new LessonImportError('E_LESSON_IMPORT_SOURCE', `Source directory not found: ${sourceDir}`);
104
+ const candidates = [];
105
+ const skipped = [];
106
+ const files = readdirSync(sourceDir)
107
+ .filter((file) => file.endsWith('.md') && file !== 'MEMORY.md')
108
+ .sort();
109
+ for (const file of files) {
110
+ if (excluded.has(file)) {
111
+ skipped.push({ file, reason: 'excluded by the reviewer' });
112
+ continue;
113
+ }
114
+ const bytes = readFileSync(join(sourceDir, file));
115
+ const sha256 = createHash('sha256').update(bytes).digest('hex');
116
+ const { name, description, type, body } = parseMemoryFileFrontmatter(bytes.toString('utf-8'));
117
+ const scope = type ? LESSON_SCOPE_BY_TYPE[type] : undefined;
118
+ if (!type || !scope) {
119
+ skipped.push({ file, reason: `memory type ${type ?? '(none)'} is not a lesson` });
120
+ continue;
121
+ }
122
+ const rule = unquote(description ?? name ?? '');
123
+ const firstLine = body
124
+ .trim()
125
+ .split('\n')[0]
126
+ ?.replace(/^[#>*\s-]+/, '') ?? '';
127
+ if (RETRACTED.test(rule) || RETRACTED.test(firstLine)) {
128
+ skipped.push({ file, reason: 'marked wrong or superseded by its author' });
129
+ continue;
130
+ }
131
+ const ruleError = lessonRuleError(rule);
132
+ if (ruleError) {
133
+ skipped.push({ file, reason: `no usable one-line rule: ${ruleError}` });
134
+ continue;
135
+ }
136
+ if (!body.trim()) {
137
+ skipped.push({ file, reason: 'empty body (no why)' });
138
+ continue;
139
+ }
140
+ const provenance = `Imported from Claude memory ${file} (sha256 ${sha256.slice(0, 16)}).`;
141
+ candidates.push({
142
+ file,
143
+ sha256,
144
+ name: name ?? null,
145
+ memoryType: type,
146
+ scope,
147
+ rule,
148
+ text: `${body.trim()}\n\n${provenance}`,
149
+ });
150
+ }
151
+ const digest = createHash('sha256')
152
+ .update(candidates.map((c) => `${c.file}\0${c.sha256}\0${c.scope}`).join('\n'))
153
+ .digest('hex')
154
+ .slice(0, 16);
155
+ return { sourceDir, candidates, skipped, digest };
156
+ }
157
+ /**
158
+ * Apply an approved import: re-plan the directory with the same exclusions,
159
+ * refuse unless the digest still matches, record a receipt, then write each
160
+ * lesson to the main brain (feedback) or the project brain (project).
161
+ *
162
+ * @param projectRoot - Project whose brain receives project lessons.
163
+ * @param sourceDir - Memory directory to import.
164
+ * @param expectDigest - Digest of the approved dry run.
165
+ * @param receiptPath - Where the receipt is written (before the first write).
166
+ * @param options - `exclude` as in the dry run; `write` overrides the brain writers; `now` for tests.
167
+ * @returns The completed receipt.
168
+ * @throws LessonImportError when the directory changed since the approved plan.
169
+ * @example
170
+ * ```ts
171
+ * const receipt = await applyLessonImport(dir, plan.digest, receiptPath);
172
+ * ```
173
+ */
174
+ export async function applyLessonImport(projectRoot, sourceDir, expectDigest, receiptPath, options = {}) {
175
+ const plan = planLessonImport(sourceDir, { exclude: options.exclude ?? [] });
176
+ if (plan.digest !== expectDigest)
177
+ // @sync-invariant none:input-shape the approved plan no longer holds; nothing is written
178
+ throw new LessonImportError('E_LESSON_IMPORT_DIGEST_MISMATCH', `The memory directory now plans digest ${plan.digest}, not the approved ${expectDigest}; run the dry run again`);
179
+ const write = options.write ??
180
+ (async ({ scope, ...lesson }) => {
181
+ const params = { ...lesson, type: 'lesson', sourceType: LESSON_IMPORT_SOURCE_TYPE };
182
+ if (scope === 'global') {
183
+ const { observeGlobalBrain } = await import('./global-brain.js');
184
+ return observeGlobalBrain(params);
185
+ }
186
+ const { observeBrain } = await import('./retrieval/observe.js');
187
+ return observeBrain(projectRoot, params);
188
+ });
189
+ const receipt = {
190
+ version: 1,
191
+ importedAt: (options.now ?? new Date()).toISOString(),
192
+ status: 'started',
193
+ sourceDir: plan.sourceDir,
194
+ digest: plan.digest,
195
+ written: [],
196
+ };
197
+ mkdirSync(dirname(receiptPath), { recursive: true });
198
+ writeJsonFileAtomic(receiptPath, receipt);
199
+ for (const candidate of plan.candidates) {
200
+ const result = await write({
201
+ text: candidate.text,
202
+ title: candidate.rule,
203
+ scope: candidate.scope,
204
+ });
205
+ receipt.written.push({
206
+ file: candidate.file,
207
+ sha256: candidate.sha256,
208
+ scope: candidate.scope,
209
+ id: result.id,
210
+ stored: result.stored !== false,
211
+ });
212
+ // Each write is recorded as it lands, so an interrupted import names every lesson it made.
213
+ writeJsonFileAtomic(receiptPath, receipt);
214
+ }
215
+ const complete = { ...receipt, status: 'complete' };
216
+ writeJsonFileAtomic(receiptPath, complete);
217
+ return complete;
218
+ }
219
+ /**
220
+ * Default receipt path of an applied lessons import.
221
+ *
222
+ * @param projectRoot - Project root.
223
+ * @param importedAt - ISO timestamp of the apply.
224
+ * @returns Absolute path under `.cleo/backups/migrations/`.
225
+ * @example
226
+ * ```ts
227
+ * defaultLessonImportReceiptPath(root, '2026-10-24T00:00:00.000Z');
228
+ * ```
229
+ */
230
+ export function defaultLessonImportReceiptPath(projectRoot, importedAt) {
231
+ return join(projectRoot, '.cleo', 'backups', 'migrations', `lessons-import-${importedAt.replace(/[:.]/g, '-')}.json`);
232
+ }
233
+ //# sourceMappingURL=lessons-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lessons-import.js","sourceRoot":"","sources":["../../src/memory/lessons-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,yEAAyE;AACzE,MAAM,oBAAoB,GAAgD;IACxE,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,oDAAoD;AACpD,MAAM,SAAS,GAAG,yCAAyC,CAAC;AAK5D;;;;GAIG;AACH,MAAM,yBAAyB,GAAkD,OAAO,CAAC;AAEzF,gEAAgE;AAChE,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAChE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAChE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAsED,0CAA0C;AAC1C,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAM/B;IALX;;;OAGG;IACH,YACW,IAAkE,EAC3E,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAA8D;QAI3E,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,OAAe,OAAO,EAAE;IAClF,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,UAA2C,EAAE;IAE7C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QACxB,0FAA0F;QAC1F,MAAM,IAAI,iBAAiB,CACzB,wBAAwB,EACxB,+BAA+B,SAAS,EAAE,CAC3C,CAAC;IACJ,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;SACjC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,WAAW,CAAC;SAC9D,IAAI,EAAE,CAAC;IACV,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,IAAI,IAAI,QAAQ,kBAAkB,EAAE,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,GACb,IAAI;aACD,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,SAAS,EAAE,EAAE,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,+BAA+B,IAAI,YAAY,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;QAC1F,UAAU,CAAC,IAAI,CAAC;YACd,IAAI;YACJ,MAAM;YACN,IAAI,EAAE,IAAI,IAAI,IAAI;YAClB,UAAU,EAAE,IAAI;YAChB,KAAK;YACL,IAAI;YACJ,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,UAAU,EAAE;SACxC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC;SAChC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9E,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACpD,CAAC;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,SAAiB,EACjB,YAAoB,EACpB,WAAmB,EACnB,UAA6E,EAAE;IAE/E,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY;QAC9B,yFAAyF;QACzF,MAAM,IAAI,iBAAiB,CACzB,iCAAiC,EACjC,yCAAyC,IAAI,CAAC,MAAM,sBAAsB,YAAY,yBAAyB,CAChH,CAAC;IACJ,MAAM,KAAK,GACT,OAAO,CAAC,KAAK;QACb,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,QAAiB,EAAE,UAAU,EAAE,yBAAyB,EAAE,CAAC;YAC7F,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBACjE,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAChE,OAAO,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,MAAM,OAAO,GAAwB;QACnC,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QACrD,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;YACzB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,IAAI;YACrB,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,KAAK;SAChC,CAAC,CAAC;QACH,2FAA2F;QAC3F,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,QAAQ,GAAwB,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACzE,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,8BAA8B,CAAC,WAAmB,EAAE,UAAkB;IACpF,OAAO,IAAI,CACT,WAAW,EACX,OAAO,EACP,SAAS,EACT,YAAY,EACZ,kBAAkB,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAC1D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Lessons: the curated, one-line-per-rule index of what went wrong and what
3
+ * to do instead (T13949, owner decision D11181).
4
+ *
5
+ * A lesson is an observation of type `lesson`: the title holds the one-line
6
+ * rule and the narrative holds why (the incident). Process lessons default to
7
+ * the global (main) brain so every project and device reads them. The index
8
+ * lists current lessons newest first; an invalidated (superseded) lesson is
9
+ * hidden.
10
+ *
11
+ * Code placed in `packages/core/` per Package-Boundary Check — verified against AGENTS.md.
12
+ *
13
+ * @module memory/lessons
14
+ * @task T13949
15
+ */
16
+ /** Longest one-line rule a lesson title may hold. */
17
+ export declare const LESSON_RULE_MAX = 200;
18
+ /** Which store a lessons read covers. */
19
+ export type LessonScope = 'project' | 'global' | 'all';
20
+ /** One row of the lessons index. */
21
+ export interface LessonEntry {
22
+ /** Observation id. */
23
+ id: string;
24
+ /** The one-line rule (the observation title). */
25
+ rule: string;
26
+ /** Why: the incident behind the rule (the observation narrative). */
27
+ why: string;
28
+ /** Creation time, SQLite `datetime` shape. */
29
+ createdAt: string;
30
+ /** Store the lesson lives in. */
31
+ scope: 'project' | 'global';
32
+ }
33
+ /**
34
+ * Validate the one-line rule of a lesson before it is stored.
35
+ *
36
+ * @param title - The proposed rule; required for a lesson.
37
+ * @returns An error message, or `null` when the rule is acceptable.
38
+ * @example
39
+ * ```ts
40
+ * lessonRuleError('Run biome on the exact changed files before push'); // null
41
+ * ```
42
+ */
43
+ export declare function lessonRuleError(title: string | undefined): string | null;
44
+ /**
45
+ * List current lessons, newest first, from the project brain, the global
46
+ * (main) brain, or both.
47
+ *
48
+ * With scope `all` each store is read on its own: a store that fails is
49
+ * reported to `onStoreError` and the other store's lessons are still listed.
50
+ * When every store fails the call throws one error naming each store's cause,
51
+ * and `onStoreError` is not called.
52
+ *
53
+ * @param projectRoot - Project whose brain is read for `project` / `all`.
54
+ * @param options - `scope` (default `all`), `limit` (default 50) and
55
+ * `onStoreError`, told which store failed under scope `all`.
56
+ * @returns Lessons merged across the requested stores, newest first.
57
+ * @example
58
+ * ```ts
59
+ * const lessons = await listLessons(root, { scope: 'all', limit: 20 });
60
+ * ```
61
+ */
62
+ export declare function listLessons(projectRoot: string, options?: {
63
+ scope?: LessonScope;
64
+ limit?: number;
65
+ onStoreError?: (scope: 'project' | 'global', error: Error) => void;
66
+ }): Promise<LessonEntry[]>;
67
+ //# sourceMappingURL=lessons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lessons.d.ts","sourceRoot":"","sources":["../../src/memory/lessons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,qDAAqD;AACrD,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,yCAAyC;AACzC,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAOxE;AAoBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/D,GACL,OAAO,CAAC,WAAW,EAAE,CAAC,CA6CxB"}