@cleocode/core 2026.4.9 → 2026.4.12

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 (1011) hide show
  1. package/dist/adapters/adapter-registry.js +64 -0
  2. package/dist/adapters/adapter-registry.js.map +1 -0
  3. package/dist/adapters/discovery.js +83 -0
  4. package/dist/adapters/discovery.js.map +1 -0
  5. package/dist/adapters/index.js +9 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/adapters/manager.js +260 -0
  8. package/dist/adapters/manager.js.map +1 -0
  9. package/dist/admin/export-tasks.js +171 -0
  10. package/dist/admin/export-tasks.js.map +1 -0
  11. package/dist/admin/export.js +103 -0
  12. package/dist/admin/export.js.map +1 -0
  13. package/dist/admin/help.js +106 -0
  14. package/dist/admin/help.js.map +1 -0
  15. package/dist/admin/import-tasks.js +182 -0
  16. package/dist/admin/import-tasks.js.map +1 -0
  17. package/dist/admin/import.js +129 -0
  18. package/dist/admin/import.js.map +1 -0
  19. package/dist/admin/index.js +13 -0
  20. package/dist/admin/index.js.map +1 -0
  21. package/dist/adrs/find.js +134 -0
  22. package/dist/adrs/find.js.map +1 -0
  23. package/dist/adrs/index.js +15 -0
  24. package/dist/adrs/index.js.map +1 -0
  25. package/dist/adrs/link-pipeline.js +160 -0
  26. package/dist/adrs/link-pipeline.js.map +1 -0
  27. package/dist/adrs/list.js +43 -0
  28. package/dist/adrs/list.js.map +1 -0
  29. package/dist/adrs/parse.js +51 -0
  30. package/dist/adrs/parse.js.map +1 -0
  31. package/dist/adrs/show.js +22 -0
  32. package/dist/adrs/show.js.map +1 -0
  33. package/dist/adrs/sync.js +188 -0
  34. package/dist/adrs/sync.js.map +1 -0
  35. package/dist/adrs/types.js +9 -0
  36. package/dist/adrs/types.js.map +1 -0
  37. package/dist/adrs/validate.js +57 -0
  38. package/dist/adrs/validate.js.map +1 -0
  39. package/dist/agents/agent-registry.js +288 -0
  40. package/dist/agents/agent-registry.js.map +1 -0
  41. package/dist/agents/agent-schema.d.ts +2 -2
  42. package/dist/agents/agent-schema.js +82 -0
  43. package/dist/agents/agent-schema.js.map +1 -0
  44. package/dist/agents/capacity.js +116 -0
  45. package/dist/agents/capacity.js.map +1 -0
  46. package/dist/agents/execution-learning.js +474 -0
  47. package/dist/agents/execution-learning.js.map +1 -0
  48. package/dist/agents/health-monitor.js +217 -0
  49. package/dist/agents/health-monitor.js.map +1 -0
  50. package/dist/agents/index.js +29 -0
  51. package/dist/agents/index.js.map +1 -0
  52. package/dist/agents/registry.js +314 -0
  53. package/dist/agents/registry.js.map +1 -0
  54. package/dist/agents/retry.js +215 -0
  55. package/dist/agents/retry.js.map +1 -0
  56. package/dist/audit-prune.js +94 -0
  57. package/dist/audit-prune.js.map +1 -0
  58. package/dist/audit.js +68 -0
  59. package/dist/audit.js.map +1 -0
  60. package/dist/backfill/index.js +229 -0
  61. package/dist/backfill/index.js.map +1 -0
  62. package/dist/bootstrap.js +344 -0
  63. package/dist/bootstrap.js.map +1 -0
  64. package/dist/caamp/adapter.js +259 -0
  65. package/dist/caamp/adapter.js.map +1 -0
  66. package/dist/caamp/capability-check.js +38 -0
  67. package/dist/caamp/capability-check.js.map +1 -0
  68. package/dist/caamp/index.js +21 -0
  69. package/dist/caamp/index.js.map +1 -0
  70. package/dist/caamp-init.js +16 -0
  71. package/dist/caamp-init.js.map +1 -0
  72. package/dist/cleo.js +322 -0
  73. package/dist/cleo.js.map +1 -0
  74. package/dist/code/index.js +10 -0
  75. package/dist/code/index.js.map +1 -0
  76. package/dist/code/outline.js +165 -0
  77. package/dist/code/outline.js.map +1 -0
  78. package/dist/code/parser.js +295 -0
  79. package/dist/code/parser.js.map +1 -0
  80. package/dist/code/search.js +135 -0
  81. package/dist/code/search.js.map +1 -0
  82. package/dist/code/unfold.js +155 -0
  83. package/dist/code/unfold.js.map +1 -0
  84. package/dist/codebase-map/analyzers/architecture.d.ts.map +1 -1
  85. package/dist/codebase-map/analyzers/architecture.js +129 -0
  86. package/dist/codebase-map/analyzers/architecture.js.map +1 -0
  87. package/dist/codebase-map/analyzers/concerns.js +122 -0
  88. package/dist/codebase-map/analyzers/concerns.js.map +1 -0
  89. package/dist/codebase-map/analyzers/conventions.js +149 -0
  90. package/dist/codebase-map/analyzers/conventions.js.map +1 -0
  91. package/dist/codebase-map/analyzers/integrations.js +108 -0
  92. package/dist/codebase-map/analyzers/integrations.js.map +1 -0
  93. package/dist/codebase-map/analyzers/stack.js +117 -0
  94. package/dist/codebase-map/analyzers/stack.js.map +1 -0
  95. package/dist/codebase-map/analyzers/structure.js +137 -0
  96. package/dist/codebase-map/analyzers/structure.js.map +1 -0
  97. package/dist/codebase-map/analyzers/testing.js +118 -0
  98. package/dist/codebase-map/analyzers/testing.js.map +1 -0
  99. package/dist/codebase-map/index.js +57 -0
  100. package/dist/codebase-map/index.js.map +1 -0
  101. package/dist/codebase-map/store.js +122 -0
  102. package/dist/codebase-map/store.js.map +1 -0
  103. package/dist/codebase-map/summary.js +152 -0
  104. package/dist/codebase-map/summary.js.map +1 -0
  105. package/dist/compliance/index.js +288 -0
  106. package/dist/compliance/index.js.map +1 -0
  107. package/dist/compliance/protocol-enforcement.js +332 -0
  108. package/dist/compliance/protocol-enforcement.js.map +1 -0
  109. package/dist/compliance/protocol-rules.js +786 -0
  110. package/dist/compliance/protocol-rules.js.map +1 -0
  111. package/dist/compliance/protocol-types.js +79 -0
  112. package/dist/compliance/protocol-types.js.map +1 -0
  113. package/dist/compliance/store.js +53 -0
  114. package/dist/compliance/store.js.map +1 -0
  115. package/dist/conduit/conduit-client.js +107 -0
  116. package/dist/conduit/conduit-client.js.map +1 -0
  117. package/dist/conduit/factory.js +52 -0
  118. package/dist/conduit/factory.js.map +1 -0
  119. package/dist/conduit/http-transport.js +155 -0
  120. package/dist/conduit/http-transport.js.map +1 -0
  121. package/dist/conduit/index.js +15 -0
  122. package/dist/conduit/index.js.map +1 -0
  123. package/dist/conduit/local-transport.d.ts +18 -8
  124. package/dist/conduit/local-transport.d.ts.map +1 -1
  125. package/dist/conduit/local-transport.js +255 -0
  126. package/dist/conduit/local-transport.js.map +1 -0
  127. package/dist/conduit/sse-transport.js +299 -0
  128. package/dist/conduit/sse-transport.js.map +1 -0
  129. package/dist/config/build-config.js +29 -0
  130. package/dist/config/build-config.js.map +1 -0
  131. package/dist/config.d.ts.map +1 -1
  132. package/dist/config.js +400 -0
  133. package/dist/config.js.map +1 -0
  134. package/dist/constants.js +18 -0
  135. package/dist/constants.js.map +1 -0
  136. package/dist/context/index.js +137 -0
  137. package/dist/context/index.js.map +1 -0
  138. package/dist/crypto/credentials.js +191 -0
  139. package/dist/crypto/credentials.js.map +1 -0
  140. package/dist/discovery.js +182 -0
  141. package/dist/discovery.js.map +1 -0
  142. package/dist/engine-result.js +12 -0
  143. package/dist/engine-result.js.map +1 -0
  144. package/dist/error-catalog.js +404 -0
  145. package/dist/error-catalog.js.map +1 -0
  146. package/dist/error-registry.js +393 -0
  147. package/dist/error-registry.js.map +1 -0
  148. package/dist/errors.d.ts +19 -0
  149. package/dist/errors.d.ts.map +1 -1
  150. package/dist/errors.js +173 -0
  151. package/dist/errors.js.map +1 -0
  152. package/dist/hooks/handlers/agent-hooks.js +106 -0
  153. package/dist/hooks/handlers/agent-hooks.js.map +1 -0
  154. package/dist/hooks/handlers/context-hooks.js +111 -0
  155. package/dist/hooks/handlers/context-hooks.js.map +1 -0
  156. package/dist/hooks/handlers/error-hooks.js +52 -0
  157. package/dist/hooks/handlers/error-hooks.js.map +1 -0
  158. package/dist/hooks/handlers/file-hooks.js +104 -0
  159. package/dist/hooks/handlers/file-hooks.js.map +1 -0
  160. package/dist/hooks/handlers/handler-helpers.js +61 -0
  161. package/dist/hooks/handlers/handler-helpers.js.map +1 -0
  162. package/dist/hooks/handlers/index.js +28 -0
  163. package/dist/hooks/handlers/index.js.map +1 -0
  164. package/dist/hooks/handlers/memory-bridge-refresh.js +42 -0
  165. package/dist/hooks/handlers/memory-bridge-refresh.js.map +1 -0
  166. package/dist/hooks/handlers/notification-hooks.js +62 -0
  167. package/dist/hooks/handlers/notification-hooks.js.map +1 -0
  168. package/dist/hooks/handlers/session-hooks.d.ts +21 -0
  169. package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
  170. package/dist/hooks/handlers/session-hooks.js +142 -0
  171. package/dist/hooks/handlers/session-hooks.js.map +1 -0
  172. package/dist/hooks/handlers/task-hooks.js +65 -0
  173. package/dist/hooks/handlers/task-hooks.js.map +1 -0
  174. package/dist/hooks/handlers/work-capture-hooks.js +165 -0
  175. package/dist/hooks/handlers/work-capture-hooks.js.map +1 -0
  176. package/dist/hooks/index.js +13 -0
  177. package/dist/hooks/index.js.map +1 -0
  178. package/dist/hooks/payload-schemas.d.ts +2 -2
  179. package/dist/hooks/payload-schemas.js +220 -0
  180. package/dist/hooks/payload-schemas.js.map +1 -0
  181. package/dist/hooks/provider-hooks.js +66 -0
  182. package/dist/hooks/provider-hooks.js.map +1 -0
  183. package/dist/hooks/registry.js +229 -0
  184. package/dist/hooks/registry.js.map +1 -0
  185. package/dist/hooks/types.js +66 -0
  186. package/dist/hooks/types.js.map +1 -0
  187. package/dist/hooks.js +136 -0
  188. package/dist/hooks.js.map +1 -0
  189. package/dist/index.js +175 -68684
  190. package/dist/index.js.map +1 -7
  191. package/dist/init.d.ts +1 -2
  192. package/dist/init.d.ts.map +1 -1
  193. package/dist/init.js +851 -0
  194. package/dist/init.js.map +1 -0
  195. package/dist/inject/index.js +82 -0
  196. package/dist/inject/index.js.map +1 -0
  197. package/dist/injection.js +343 -0
  198. package/dist/injection.js.map +1 -0
  199. package/dist/intelligence/adaptive-validation.js +497 -0
  200. package/dist/intelligence/adaptive-validation.js.map +1 -0
  201. package/dist/intelligence/impact.js +675 -0
  202. package/dist/intelligence/impact.js.map +1 -0
  203. package/dist/intelligence/index.js +22 -0
  204. package/dist/intelligence/index.js.map +1 -0
  205. package/dist/intelligence/patterns.js +492 -0
  206. package/dist/intelligence/patterns.js.map +1 -0
  207. package/dist/intelligence/prediction.js +499 -0
  208. package/dist/intelligence/prediction.js.map +1 -0
  209. package/dist/intelligence/types.js +13 -0
  210. package/dist/intelligence/types.js.map +1 -0
  211. package/dist/internal.d.ts +15 -5
  212. package/dist/internal.d.ts.map +1 -1
  213. package/dist/internal.js +306 -0
  214. package/dist/internal.js.map +1 -0
  215. package/dist/issue/create.js +121 -0
  216. package/dist/issue/create.js.map +1 -0
  217. package/dist/issue/diagnostics.js +59 -0
  218. package/dist/issue/diagnostics.js.map +1 -0
  219. package/dist/issue/index.js +10 -0
  220. package/dist/issue/index.js.map +1 -0
  221. package/dist/issue/template-parser.js +267 -0
  222. package/dist/issue/template-parser.js.map +1 -0
  223. package/dist/json-schema-validator.js +76 -0
  224. package/dist/json-schema-validator.js.map +1 -0
  225. package/dist/lib/index.js +11 -0
  226. package/dist/lib/index.js.map +1 -0
  227. package/dist/lib/retry.js +152 -0
  228. package/dist/lib/retry.js.map +1 -0
  229. package/dist/lib/tree-sitter-languages.js +71 -0
  230. package/dist/lib/tree-sitter-languages.js.map +1 -0
  231. package/dist/lifecycle/chain-composition.js +152 -0
  232. package/dist/lifecycle/chain-composition.js.map +1 -0
  233. package/dist/lifecycle/chain-store.js +246 -0
  234. package/dist/lifecycle/chain-store.js.map +1 -0
  235. package/dist/lifecycle/consolidate-rcasd.js +352 -0
  236. package/dist/lifecycle/consolidate-rcasd.js.map +1 -0
  237. package/dist/lifecycle/default-chain.js +176 -0
  238. package/dist/lifecycle/default-chain.js.map +1 -0
  239. package/dist/lifecycle/evidence.js +180 -0
  240. package/dist/lifecycle/evidence.js.map +1 -0
  241. package/dist/lifecycle/frontmatter.js +363 -0
  242. package/dist/lifecycle/frontmatter.js.map +1 -0
  243. package/dist/lifecycle/index.js +756 -0
  244. package/dist/lifecycle/index.js.map +1 -0
  245. package/dist/lifecycle/pipeline.js +656 -0
  246. package/dist/lifecycle/pipeline.js.map +1 -0
  247. package/dist/lifecycle/rcasd-index.js +326 -0
  248. package/dist/lifecycle/rcasd-index.js.map +1 -0
  249. package/dist/lifecycle/rcasd-paths.js +220 -0
  250. package/dist/lifecycle/rcasd-paths.js.map +1 -0
  251. package/dist/lifecycle/resume.js +864 -0
  252. package/dist/lifecycle/resume.js.map +1 -0
  253. package/dist/lifecycle/stage-artifacts.js +94 -0
  254. package/dist/lifecycle/stage-artifacts.js.map +1 -0
  255. package/dist/lifecycle/stage-guidance.js +234 -0
  256. package/dist/lifecycle/stage-guidance.js.map +1 -0
  257. package/dist/lifecycle/stages.js +534 -0
  258. package/dist/lifecycle/stages.js.map +1 -0
  259. package/dist/lifecycle/state-machine.js +516 -0
  260. package/dist/lifecycle/state-machine.js.map +1 -0
  261. package/dist/lifecycle/tessera-engine.js +249 -0
  262. package/dist/lifecycle/tessera-engine.js.map +1 -0
  263. package/dist/logger.js +140 -0
  264. package/dist/logger.js.map +1 -0
  265. package/dist/memory/auto-extract.js +177 -0
  266. package/dist/memory/auto-extract.js.map +1 -0
  267. package/dist/memory/brain-embedding.js +66 -0
  268. package/dist/memory/brain-embedding.js.map +1 -0
  269. package/dist/memory/brain-lifecycle.js +298 -0
  270. package/dist/memory/brain-lifecycle.js.map +1 -0
  271. package/dist/memory/brain-links.js +161 -0
  272. package/dist/memory/brain-links.js.map +1 -0
  273. package/dist/memory/brain-maintenance.js +114 -0
  274. package/dist/memory/brain-maintenance.js.map +1 -0
  275. package/dist/memory/brain-migration.js +149 -0
  276. package/dist/memory/brain-migration.js.map +1 -0
  277. package/dist/memory/brain-reasoning.js +215 -0
  278. package/dist/memory/brain-reasoning.js.map +1 -0
  279. package/dist/memory/brain-retrieval.js +542 -0
  280. package/dist/memory/brain-retrieval.js.map +1 -0
  281. package/dist/memory/brain-row-types.js +10 -0
  282. package/dist/memory/brain-row-types.js.map +1 -0
  283. package/dist/memory/brain-search.js +519 -0
  284. package/dist/memory/brain-search.js.map +1 -0
  285. package/dist/memory/brain-similarity.js +145 -0
  286. package/dist/memory/brain-similarity.js.map +1 -0
  287. package/dist/memory/claude-mem-migration.js +277 -0
  288. package/dist/memory/claude-mem-migration.js.map +1 -0
  289. package/dist/memory/decisions.js +162 -0
  290. package/dist/memory/decisions.js.map +1 -0
  291. package/dist/memory/embedding-local.js +97 -0
  292. package/dist/memory/embedding-local.js.map +1 -0
  293. package/dist/memory/embedding-queue.js +271 -0
  294. package/dist/memory/embedding-queue.js.map +1 -0
  295. package/dist/memory/embedding-worker.js +58 -0
  296. package/dist/memory/embedding-worker.js.map +1 -0
  297. package/dist/memory/engine-compat.js +1397 -0
  298. package/dist/memory/engine-compat.js.map +1 -0
  299. package/dist/memory/index.js +1140 -0
  300. package/dist/memory/index.js.map +1 -0
  301. package/dist/memory/learnings.d.ts +2 -2
  302. package/dist/memory/learnings.js +121 -0
  303. package/dist/memory/learnings.js.map +1 -0
  304. package/dist/memory/memory-bridge.js +370 -0
  305. package/dist/memory/memory-bridge.js.map +1 -0
  306. package/dist/memory/patterns.d.ts +4 -4
  307. package/dist/memory/patterns.js +122 -0
  308. package/dist/memory/patterns.js.map +1 -0
  309. package/dist/memory/pipeline-manifest-sqlite.js +975 -0
  310. package/dist/memory/pipeline-manifest-sqlite.js.map +1 -0
  311. package/dist/memory/session-memory.js +331 -0
  312. package/dist/memory/session-memory.js.map +1 -0
  313. package/dist/metrics/ab-test.js +260 -0
  314. package/dist/metrics/ab-test.js.map +1 -0
  315. package/dist/metrics/aggregation.js +363 -0
  316. package/dist/metrics/aggregation.js.map +1 -0
  317. package/dist/metrics/common.js +64 -0
  318. package/dist/metrics/common.js.map +1 -0
  319. package/dist/metrics/enums.js +78 -0
  320. package/dist/metrics/enums.js.map +1 -0
  321. package/dist/metrics/index.js +19 -0
  322. package/dist/metrics/index.js.map +1 -0
  323. package/dist/metrics/model-provider-registry.js +88 -0
  324. package/dist/metrics/model-provider-registry.js.map +1 -0
  325. package/dist/metrics/otel-integration.js +263 -0
  326. package/dist/metrics/otel-integration.js.map +1 -0
  327. package/dist/metrics/provider-detection.js +103 -0
  328. package/dist/metrics/provider-detection.js.map +1 -0
  329. package/dist/metrics/token-estimation.js +253 -0
  330. package/dist/metrics/token-estimation.js.map +1 -0
  331. package/dist/metrics/token-service.js +450 -0
  332. package/dist/metrics/token-service.js.map +1 -0
  333. package/dist/migration/agent-outputs.js +316 -0
  334. package/dist/migration/agent-outputs.js.map +1 -0
  335. package/dist/migration/checksum.js +92 -0
  336. package/dist/migration/checksum.js.map +1 -0
  337. package/dist/migration/index.js +282 -0
  338. package/dist/migration/index.js.map +1 -0
  339. package/dist/migration/logger.js +360 -0
  340. package/dist/migration/logger.js.map +1 -0
  341. package/dist/migration/preflight.js +9 -0
  342. package/dist/migration/preflight.js.map +1 -0
  343. package/dist/migration/state.js +421 -0
  344. package/dist/migration/state.js.map +1 -0
  345. package/dist/migration/validate.js +241 -0
  346. package/dist/migration/validate.js.map +1 -0
  347. package/dist/mvi-helpers.js +74 -0
  348. package/dist/mvi-helpers.js.map +1 -0
  349. package/dist/nexus/deps.js +375 -0
  350. package/dist/nexus/deps.js.map +1 -0
  351. package/dist/nexus/discover.js +288 -0
  352. package/dist/nexus/discover.js.map +1 -0
  353. package/dist/nexus/hash.js +10 -0
  354. package/dist/nexus/hash.js.map +1 -0
  355. package/dist/nexus/index.js +40 -0
  356. package/dist/nexus/index.js.map +1 -0
  357. package/dist/nexus/migrate-json-to-sqlite.js +115 -0
  358. package/dist/nexus/migrate-json-to-sqlite.js.map +1 -0
  359. package/dist/nexus/permissions.js +105 -0
  360. package/dist/nexus/permissions.js.map +1 -0
  361. package/dist/nexus/query.js +175 -0
  362. package/dist/nexus/query.js.map +1 -0
  363. package/dist/nexus/registry.js +584 -0
  364. package/dist/nexus/registry.js.map +1 -0
  365. package/dist/nexus/sharing/index.js +288 -0
  366. package/dist/nexus/sharing/index.js.map +1 -0
  367. package/dist/nexus/transfer-types.js +8 -0
  368. package/dist/nexus/transfer-types.js.map +1 -0
  369. package/dist/nexus/transfer.js +263 -0
  370. package/dist/nexus/transfer.js.map +1 -0
  371. package/dist/nexus/workspace.js +355 -0
  372. package/dist/nexus/workspace.js.map +1 -0
  373. package/dist/observability/index.js +103 -0
  374. package/dist/observability/index.js.map +1 -0
  375. package/dist/observability/log-filter.js +63 -0
  376. package/dist/observability/log-filter.js.map +1 -0
  377. package/dist/observability/log-parser.js +99 -0
  378. package/dist/observability/log-parser.js.map +1 -0
  379. package/dist/observability/log-reader.js +139 -0
  380. package/dist/observability/log-reader.js.map +1 -0
  381. package/dist/observability/types.js +19 -0
  382. package/dist/observability/types.js.map +1 -0
  383. package/dist/orchestration/analyze.js +107 -0
  384. package/dist/orchestration/analyze.js.map +1 -0
  385. package/dist/orchestration/bootstrap.js +132 -0
  386. package/dist/orchestration/bootstrap.js.map +1 -0
  387. package/dist/orchestration/context.js +56 -0
  388. package/dist/orchestration/context.js.map +1 -0
  389. package/dist/orchestration/critical-path.js +100 -0
  390. package/dist/orchestration/critical-path.js.map +1 -0
  391. package/dist/orchestration/hierarchy.js +183 -0
  392. package/dist/orchestration/hierarchy.js.map +1 -0
  393. package/dist/orchestration/index.js +287 -0
  394. package/dist/orchestration/index.js.map +1 -0
  395. package/dist/orchestration/parallel.js +89 -0
  396. package/dist/orchestration/parallel.js.map +1 -0
  397. package/dist/orchestration/protocol-validators.js +815 -0
  398. package/dist/orchestration/protocol-validators.js.map +1 -0
  399. package/dist/orchestration/skill-ops.js +98 -0
  400. package/dist/orchestration/skill-ops.js.map +1 -0
  401. package/dist/orchestration/status.js +107 -0
  402. package/dist/orchestration/status.js.map +1 -0
  403. package/dist/orchestration/unblock.js +103 -0
  404. package/dist/orchestration/unblock.js.map +1 -0
  405. package/dist/orchestration/validate-spawn.js +67 -0
  406. package/dist/orchestration/validate-spawn.js.map +1 -0
  407. package/dist/orchestration/waves.js +86 -0
  408. package/dist/orchestration/waves.js.map +1 -0
  409. package/dist/otel/index.js +163 -0
  410. package/dist/otel/index.js.map +1 -0
  411. package/dist/output.d.ts +32 -11
  412. package/dist/output.d.ts.map +1 -1
  413. package/dist/output.js +164 -0
  414. package/dist/output.js.map +1 -0
  415. package/dist/pagination.js +64 -0
  416. package/dist/pagination.js.map +1 -0
  417. package/dist/paths.d.ts +39 -9
  418. package/dist/paths.d.ts.map +1 -1
  419. package/dist/paths.js +842 -0
  420. package/dist/paths.js.map +1 -0
  421. package/dist/phases/deps.js +372 -0
  422. package/dist/phases/deps.js.map +1 -0
  423. package/dist/phases/index.js +349 -0
  424. package/dist/phases/index.js.map +1 -0
  425. package/dist/pipeline/index.js +10 -0
  426. package/dist/pipeline/index.js.map +1 -0
  427. package/dist/pipeline/phase.js +45 -0
  428. package/dist/pipeline/phase.js.map +1 -0
  429. package/dist/platform.js +211 -0
  430. package/dist/platform.js.map +1 -0
  431. package/dist/project-info.js +84 -0
  432. package/dist/project-info.js.map +1 -0
  433. package/dist/reconciliation/index.js +10 -0
  434. package/dist/reconciliation/index.js.map +1 -0
  435. package/dist/reconciliation/link-store.js +129 -0
  436. package/dist/reconciliation/link-store.js.map +1 -0
  437. package/dist/reconciliation/reconciliation-engine.js +298 -0
  438. package/dist/reconciliation/reconciliation-engine.js.map +1 -0
  439. package/dist/release/artifacts.js +427 -0
  440. package/dist/release/artifacts.js.map +1 -0
  441. package/dist/release/changelog-writer.js +151 -0
  442. package/dist/release/changelog-writer.js.map +1 -0
  443. package/dist/release/channel.js +144 -0
  444. package/dist/release/channel.js.map +1 -0
  445. package/dist/release/ci.js +166 -0
  446. package/dist/release/ci.js.map +1 -0
  447. package/dist/release/github-pr.js +225 -0
  448. package/dist/release/github-pr.js.map +1 -0
  449. package/dist/release/guards.js +116 -0
  450. package/dist/release/guards.js.map +1 -0
  451. package/dist/release/index.js +22 -0
  452. package/dist/release/index.js.map +1 -0
  453. package/dist/release/release-config.js +158 -0
  454. package/dist/release/release-config.js.map +1 -0
  455. package/dist/release/release-manifest.js +1019 -0
  456. package/dist/release/release-manifest.js.map +1 -0
  457. package/dist/release/version-bump.js +255 -0
  458. package/dist/release/version-bump.js.map +1 -0
  459. package/dist/remote/index.js +257 -0
  460. package/dist/remote/index.js.map +1 -0
  461. package/dist/repair.js +130 -0
  462. package/dist/repair.js.map +1 -0
  463. package/dist/research/index.js +2 -0
  464. package/dist/research/index.js.map +1 -0
  465. package/dist/roadmap/index.js +59 -0
  466. package/dist/roadmap/index.js.map +1 -0
  467. package/dist/routing/capability-matrix.js +1556 -0
  468. package/dist/routing/capability-matrix.js.map +1 -0
  469. package/dist/routing/index.js +9 -0
  470. package/dist/routing/index.js.map +1 -0
  471. package/dist/scaffold.d.ts +15 -2
  472. package/dist/scaffold.d.ts.map +1 -1
  473. package/dist/scaffold.js +1759 -0
  474. package/dist/scaffold.js.map +1 -0
  475. package/dist/schema-management.js +295 -0
  476. package/dist/schema-management.js.map +1 -0
  477. package/dist/security/index.js +9 -0
  478. package/dist/security/index.js.map +1 -0
  479. package/dist/security/input-sanitization.js +321 -0
  480. package/dist/security/input-sanitization.js.map +1 -0
  481. package/dist/sequence/index.js +295 -0
  482. package/dist/sequence/index.js.map +1 -0
  483. package/dist/sessions/assumptions.js +54 -0
  484. package/dist/sessions/assumptions.js.map +1 -0
  485. package/dist/sessions/briefing.js +377 -0
  486. package/dist/sessions/briefing.js.map +1 -0
  487. package/dist/sessions/context-alert.js +222 -0
  488. package/dist/sessions/context-alert.js.map +1 -0
  489. package/dist/sessions/context-inject.js +61 -0
  490. package/dist/sessions/context-inject.js.map +1 -0
  491. package/dist/sessions/context-monitor.js +98 -0
  492. package/dist/sessions/context-monitor.js.map +1 -0
  493. package/dist/sessions/decisions.js +65 -0
  494. package/dist/sessions/decisions.js.map +1 -0
  495. package/dist/sessions/find.js +65 -0
  496. package/dist/sessions/find.js.map +1 -0
  497. package/dist/sessions/handoff.js +328 -0
  498. package/dist/sessions/handoff.js.map +1 -0
  499. package/dist/sessions/hitl-warnings.js +254 -0
  500. package/dist/sessions/hitl-warnings.js.map +1 -0
  501. package/dist/sessions/index.js +327 -0
  502. package/dist/sessions/index.js.map +1 -0
  503. package/dist/sessions/session-archive.js +40 -0
  504. package/dist/sessions/session-archive.js.map +1 -0
  505. package/dist/sessions/session-cleanup.js +59 -0
  506. package/dist/sessions/session-cleanup.js.map +1 -0
  507. package/dist/sessions/session-drift.js +134 -0
  508. package/dist/sessions/session-drift.js.map +1 -0
  509. package/dist/sessions/session-enforcement.js +144 -0
  510. package/dist/sessions/session-enforcement.js.map +1 -0
  511. package/dist/sessions/session-grade.js +253 -0
  512. package/dist/sessions/session-grade.js.map +1 -0
  513. package/dist/sessions/session-history.js +42 -0
  514. package/dist/sessions/session-history.js.map +1 -0
  515. package/dist/sessions/session-id.js +81 -0
  516. package/dist/sessions/session-id.js.map +1 -0
  517. package/dist/sessions/session-memory-bridge.js +52 -0
  518. package/dist/sessions/session-memory-bridge.js.map +1 -0
  519. package/dist/sessions/session-show.js +24 -0
  520. package/dist/sessions/session-show.js.map +1 -0
  521. package/dist/sessions/session-stats.js +69 -0
  522. package/dist/sessions/session-stats.js.map +1 -0
  523. package/dist/sessions/session-suspend.js +39 -0
  524. package/dist/sessions/session-suspend.js.map +1 -0
  525. package/dist/sessions/session-switch.js +51 -0
  526. package/dist/sessions/session-switch.js.map +1 -0
  527. package/dist/sessions/session-view.js +76 -0
  528. package/dist/sessions/session-view.js.map +1 -0
  529. package/dist/sessions/snapshot.js +213 -0
  530. package/dist/sessions/snapshot.js.map +1 -0
  531. package/dist/sessions/statusline-setup.js +85 -0
  532. package/dist/sessions/statusline-setup.js.map +1 -0
  533. package/dist/sessions/types.js +8 -0
  534. package/dist/sessions/types.js.map +1 -0
  535. package/dist/skills/agents/config.js +94 -0
  536. package/dist/skills/agents/config.js.map +1 -0
  537. package/dist/skills/agents/install.js +116 -0
  538. package/dist/skills/agents/install.js.map +1 -0
  539. package/dist/skills/agents/registry.js +161 -0
  540. package/dist/skills/agents/registry.js.map +1 -0
  541. package/dist/skills/discovery.js +333 -0
  542. package/dist/skills/discovery.js.map +1 -0
  543. package/dist/skills/dispatch.js +347 -0
  544. package/dist/skills/dispatch.js.map +1 -0
  545. package/dist/skills/dynamic-skill-generator.d.ts +0 -2
  546. package/dist/skills/dynamic-skill-generator.d.ts.map +1 -1
  547. package/dist/skills/dynamic-skill-generator.js +87 -0
  548. package/dist/skills/dynamic-skill-generator.js.map +1 -0
  549. package/dist/skills/index.js +44 -0
  550. package/dist/skills/index.js.map +1 -0
  551. package/dist/skills/injection/subagent.js +195 -0
  552. package/dist/skills/injection/subagent.js.map +1 -0
  553. package/dist/skills/injection/token.js +260 -0
  554. package/dist/skills/injection/token.js.map +1 -0
  555. package/dist/skills/install.js +40 -0
  556. package/dist/skills/install.js.map +1 -0
  557. package/dist/skills/manifests/contribution.js +175 -0
  558. package/dist/skills/manifests/contribution.js.map +1 -0
  559. package/dist/skills/manifests/research.js +281 -0
  560. package/dist/skills/manifests/research.js.map +1 -0
  561. package/dist/skills/manifests/resolver.js +146 -0
  562. package/dist/skills/manifests/resolver.js.map +1 -0
  563. package/dist/skills/marketplace.js +90 -0
  564. package/dist/skills/marketplace.js.map +1 -0
  565. package/dist/skills/orchestrator/spawn.js +178 -0
  566. package/dist/skills/orchestrator/spawn.js.map +1 -0
  567. package/dist/skills/orchestrator/startup.js +451 -0
  568. package/dist/skills/orchestrator/startup.js.map +1 -0
  569. package/dist/skills/orchestrator/validator.js +301 -0
  570. package/dist/skills/orchestrator/validator.js.map +1 -0
  571. package/dist/skills/precedence-integration.js +73 -0
  572. package/dist/skills/precedence-integration.js.map +1 -0
  573. package/dist/skills/precedence-types.js +16 -0
  574. package/dist/skills/precedence-types.js.map +1 -0
  575. package/dist/skills/routing-table.js +63 -0
  576. package/dist/skills/routing-table.js.map +1 -0
  577. package/dist/skills/skill-paths.js +217 -0
  578. package/dist/skills/skill-paths.js.map +1 -0
  579. package/dist/skills/test-utility.js +55 -0
  580. package/dist/skills/test-utility.js.map +1 -0
  581. package/dist/skills/types.js +118 -0
  582. package/dist/skills/types.js.map +1 -0
  583. package/dist/skills/validation.js +183 -0
  584. package/dist/skills/validation.js.map +1 -0
  585. package/dist/skills/version.js +57 -0
  586. package/dist/skills/version.js.map +1 -0
  587. package/dist/snapshot/index.js +188 -0
  588. package/dist/snapshot/index.js.map +1 -0
  589. package/dist/spawn/adapter-registry.js +246 -0
  590. package/dist/spawn/adapter-registry.js.map +1 -0
  591. package/dist/spawn/index.js +10 -0
  592. package/dist/spawn/index.js.map +1 -0
  593. package/dist/stats/index.js +343 -0
  594. package/dist/stats/index.js.map +1 -0
  595. package/dist/stats/workflow-telemetry.js +400 -0
  596. package/dist/stats/workflow-telemetry.js.map +1 -0
  597. package/dist/sticky/archive.js +47 -0
  598. package/dist/sticky/archive.js.map +1 -0
  599. package/dist/sticky/convert.js +235 -0
  600. package/dist/sticky/convert.js.map +1 -0
  601. package/dist/sticky/create.js +48 -0
  602. package/dist/sticky/create.js.map +1 -0
  603. package/dist/sticky/id.js +35 -0
  604. package/dist/sticky/id.js.map +1 -0
  605. package/dist/sticky/index.js +16 -0
  606. package/dist/sticky/index.js.map +1 -0
  607. package/dist/sticky/list.js +44 -0
  608. package/dist/sticky/list.js.map +1 -0
  609. package/dist/sticky/purge.js +45 -0
  610. package/dist/sticky/purge.js.map +1 -0
  611. package/dist/sticky/show.js +42 -0
  612. package/dist/sticky/show.js.map +1 -0
  613. package/dist/sticky/types.js +10 -0
  614. package/dist/sticky/types.js.map +1 -0
  615. package/dist/store/agent-registry-accessor.d.ts +203 -12
  616. package/dist/store/agent-registry-accessor.d.ts.map +1 -1
  617. package/dist/store/agent-registry-accessor.js +783 -0
  618. package/dist/store/agent-registry-accessor.js.map +1 -0
  619. package/dist/store/api-key-kdf.d.ts +73 -0
  620. package/dist/store/api-key-kdf.d.ts.map +1 -0
  621. package/dist/store/api-key-kdf.js +84 -0
  622. package/dist/store/api-key-kdf.js.map +1 -0
  623. package/dist/store/atomic.js +167 -0
  624. package/dist/store/atomic.js.map +1 -0
  625. package/dist/store/backup.js +94 -0
  626. package/dist/store/backup.js.map +1 -0
  627. package/dist/store/brain-accessor.js +397 -0
  628. package/dist/store/brain-accessor.js.map +1 -0
  629. package/dist/store/brain-schema.d.ts +8 -8
  630. package/dist/store/brain-schema.js +215 -0
  631. package/dist/store/brain-schema.js.map +1 -0
  632. package/dist/store/brain-sqlite.js +222 -0
  633. package/dist/store/brain-sqlite.js.map +1 -0
  634. package/dist/store/cache.js +168 -0
  635. package/dist/store/cache.js.map +1 -0
  636. package/dist/store/chain-schema.js +51 -0
  637. package/dist/store/chain-schema.js.map +1 -0
  638. package/dist/store/cleanup-legacy.d.ts +128 -0
  639. package/dist/store/cleanup-legacy.d.ts.map +1 -0
  640. package/dist/store/cleanup-legacy.js +171 -0
  641. package/dist/store/cleanup-legacy.js.map +1 -0
  642. package/dist/store/conduit-sqlite.d.ts +184 -0
  643. package/dist/store/conduit-sqlite.d.ts.map +1 -0
  644. package/dist/store/conduit-sqlite.js +570 -0
  645. package/dist/store/conduit-sqlite.js.map +1 -0
  646. package/dist/store/converters.js +124 -0
  647. package/dist/store/converters.js.map +1 -0
  648. package/dist/store/cross-db-cleanup.js +319 -0
  649. package/dist/store/cross-db-cleanup.js.map +1 -0
  650. package/dist/store/data-accessor.js +26 -0
  651. package/dist/store/data-accessor.js.map +1 -0
  652. package/dist/store/data-safety-central.js +269 -0
  653. package/dist/store/data-safety-central.js.map +1 -0
  654. package/dist/store/data-safety.js +274 -0
  655. package/dist/store/data-safety.js.map +1 -0
  656. package/dist/store/db-helpers.js +224 -0
  657. package/dist/store/db-helpers.js.map +1 -0
  658. package/dist/store/export.js +155 -0
  659. package/dist/store/export.js.map +1 -0
  660. package/dist/store/file-utils.js +270 -0
  661. package/dist/store/file-utils.js.map +1 -0
  662. package/dist/store/git-checkpoint.js +365 -0
  663. package/dist/store/git-checkpoint.js.map +1 -0
  664. package/dist/store/global-salt.d.ts +78 -0
  665. package/dist/store/global-salt.d.ts.map +1 -0
  666. package/dist/store/global-salt.js +147 -0
  667. package/dist/store/global-salt.js.map +1 -0
  668. package/dist/store/import-logging.js +139 -0
  669. package/dist/store/import-logging.js.map +1 -0
  670. package/dist/store/import-remap.js +145 -0
  671. package/dist/store/import-remap.js.map +1 -0
  672. package/dist/store/import-sort.js +121 -0
  673. package/dist/store/import-sort.js.map +1 -0
  674. package/dist/store/index.d.ts +1 -0
  675. package/dist/store/index.d.ts.map +1 -1
  676. package/dist/store/index.js +29 -0
  677. package/dist/store/index.js.map +1 -0
  678. package/dist/store/json.js +208 -0
  679. package/dist/store/json.js.map +1 -0
  680. package/dist/store/lifecycle-store.js +249 -0
  681. package/dist/store/lifecycle-store.js.map +1 -0
  682. package/dist/store/lock.js +70 -0
  683. package/dist/store/lock.js.map +1 -0
  684. package/dist/store/migrate-signaldock-to-conduit.d.ts +81 -0
  685. package/dist/store/migrate-signaldock-to-conduit.d.ts.map +1 -0
  686. package/dist/store/migrate-signaldock-to-conduit.js +555 -0
  687. package/dist/store/migrate-signaldock-to-conduit.js.map +1 -0
  688. package/dist/store/migration-manager.js +151 -0
  689. package/dist/store/migration-manager.js.map +1 -0
  690. package/dist/store/migration-sqlite.js +676 -0
  691. package/dist/store/migration-sqlite.js.map +1 -0
  692. package/dist/store/nexus-schema.js +62 -0
  693. package/dist/store/nexus-schema.js.map +1 -0
  694. package/dist/store/nexus-sqlite.d.ts +14 -2
  695. package/dist/store/nexus-sqlite.d.ts.map +1 -1
  696. package/dist/store/nexus-sqlite.js +242 -0
  697. package/dist/store/nexus-sqlite.js.map +1 -0
  698. package/dist/store/nexus-validation-schemas.js +40 -0
  699. package/dist/store/nexus-validation-schemas.js.map +1 -0
  700. package/dist/store/parsers.js +37 -0
  701. package/dist/store/parsers.js.map +1 -0
  702. package/dist/store/project-detect.js +457 -0
  703. package/dist/store/project-detect.js.map +1 -0
  704. package/dist/store/provider.js +101 -0
  705. package/dist/store/provider.js.map +1 -0
  706. package/dist/store/safety-data-accessor.js +257 -0
  707. package/dist/store/safety-data-accessor.js.map +1 -0
  708. package/dist/store/schema.js +7 -0
  709. package/dist/store/schema.js.map +1 -0
  710. package/dist/store/session-store.js +219 -0
  711. package/dist/store/session-store.js.map +1 -0
  712. package/dist/store/signaldock-sqlite.d.ts +122 -19
  713. package/dist/store/signaldock-sqlite.d.ts.map +1 -1
  714. package/dist/store/signaldock-sqlite.js +550 -0
  715. package/dist/store/signaldock-sqlite.js.map +1 -0
  716. package/dist/store/sqlite-backup.d.ts +121 -10
  717. package/dist/store/sqlite-backup.d.ts.map +1 -1
  718. package/dist/store/sqlite-backup.js +359 -0
  719. package/dist/store/sqlite-backup.js.map +1 -0
  720. package/dist/store/sqlite-data-accessor.js +787 -0
  721. package/dist/store/sqlite-data-accessor.js.map +1 -0
  722. package/dist/store/sqlite.d.ts.map +1 -1
  723. package/dist/store/sqlite.js +481 -0
  724. package/dist/store/sqlite.js.map +1 -0
  725. package/dist/store/status-registry.js +8 -0
  726. package/dist/store/status-registry.js.map +1 -0
  727. package/dist/store/task-store.js +358 -0
  728. package/dist/store/task-store.js.map +1 -0
  729. package/dist/store/tasks-schema.d.ts +8 -8
  730. package/dist/store/tasks-schema.js +610 -0
  731. package/dist/store/tasks-schema.js.map +1 -0
  732. package/dist/store/typed-query.js +15 -0
  733. package/dist/store/typed-query.js.map +1 -0
  734. package/dist/store/validation-schemas.d.ts +37 -37
  735. package/dist/store/validation-schemas.js +278 -0
  736. package/dist/store/validation-schemas.js.map +1 -0
  737. package/dist/system/archive-analytics.js +277 -0
  738. package/dist/system/archive-analytics.js.map +1 -0
  739. package/dist/system/archive-stats.js +64 -0
  740. package/dist/system/archive-stats.js.map +1 -0
  741. package/dist/system/audit.js +145 -0
  742. package/dist/system/audit.js.map +1 -0
  743. package/dist/system/backup.d.ts +65 -3
  744. package/dist/system/backup.d.ts.map +1 -1
  745. package/dist/system/backup.js +280 -0
  746. package/dist/system/backup.js.map +1 -0
  747. package/dist/system/cleanup.js +134 -0
  748. package/dist/system/cleanup.js.map +1 -0
  749. package/dist/system/health.js +1100 -0
  750. package/dist/system/health.js.map +1 -0
  751. package/dist/system/index.js +18 -0
  752. package/dist/system/index.js.map +1 -0
  753. package/dist/system/inject-generate.js +122 -0
  754. package/dist/system/inject-generate.js.map +1 -0
  755. package/dist/system/labels.js +38 -0
  756. package/dist/system/labels.js.map +1 -0
  757. package/dist/system/metrics.js +61 -0
  758. package/dist/system/metrics.js.map +1 -0
  759. package/dist/system/migrate.js +43 -0
  760. package/dist/system/migrate.js.map +1 -0
  761. package/dist/system/platform-paths.js +80 -0
  762. package/dist/system/platform-paths.js.map +1 -0
  763. package/dist/system/runtime.d.ts +0 -2
  764. package/dist/system/runtime.d.ts.map +1 -1
  765. package/dist/system/runtime.js +161 -0
  766. package/dist/system/runtime.js.map +1 -0
  767. package/dist/system/safestop.js +99 -0
  768. package/dist/system/safestop.js.map +1 -0
  769. package/dist/system/storage-preflight.js +123 -0
  770. package/dist/system/storage-preflight.js.map +1 -0
  771. package/dist/task-work/index.js +159 -0
  772. package/dist/task-work/index.js.map +1 -0
  773. package/dist/tasks/add.d.ts +1 -1
  774. package/dist/tasks/add.d.ts.map +1 -1
  775. package/dist/tasks/add.js +736 -0
  776. package/dist/tasks/add.js.map +1 -0
  777. package/dist/tasks/analyze.js +85 -0
  778. package/dist/tasks/analyze.js.map +1 -0
  779. package/dist/tasks/archive.js +90 -0
  780. package/dist/tasks/archive.js.map +1 -0
  781. package/dist/tasks/atomicity.js +83 -0
  782. package/dist/tasks/atomicity.js.map +1 -0
  783. package/dist/tasks/cancel-ops.js +83 -0
  784. package/dist/tasks/cancel-ops.js.map +1 -0
  785. package/dist/tasks/complete.d.ts.map +1 -1
  786. package/dist/tasks/complete.js +214 -0
  787. package/dist/tasks/complete.js.map +1 -0
  788. package/dist/tasks/crossref-extract.js +73 -0
  789. package/dist/tasks/crossref-extract.js.map +1 -0
  790. package/dist/tasks/delete-preview.js +192 -0
  791. package/dist/tasks/delete-preview.js.map +1 -0
  792. package/dist/tasks/delete.js +120 -0
  793. package/dist/tasks/delete.js.map +1 -0
  794. package/dist/tasks/deletion-strategy.js +200 -0
  795. package/dist/tasks/deletion-strategy.js.map +1 -0
  796. package/dist/tasks/dependency-check.js +278 -0
  797. package/dist/tasks/dependency-check.js.map +1 -0
  798. package/dist/tasks/deps-ready.js +32 -0
  799. package/dist/tasks/deps-ready.js.map +1 -0
  800. package/dist/tasks/enforcement.js +86 -0
  801. package/dist/tasks/enforcement.js.map +1 -0
  802. package/dist/tasks/epic-enforcement.js +294 -0
  803. package/dist/tasks/epic-enforcement.js.map +1 -0
  804. package/dist/tasks/find.d.ts.map +1 -1
  805. package/dist/tasks/find.js +157 -0
  806. package/dist/tasks/find.js.map +1 -0
  807. package/dist/tasks/graph-cache.js +127 -0
  808. package/dist/tasks/graph-cache.js.map +1 -0
  809. package/dist/tasks/graph-ops.js +171 -0
  810. package/dist/tasks/graph-ops.js.map +1 -0
  811. package/dist/tasks/graph-rag.js +328 -0
  812. package/dist/tasks/graph-rag.js.map +1 -0
  813. package/dist/tasks/hierarchy-policy.js +149 -0
  814. package/dist/tasks/hierarchy-policy.js.map +1 -0
  815. package/dist/tasks/hierarchy.js +185 -0
  816. package/dist/tasks/hierarchy.js.map +1 -0
  817. package/dist/tasks/id-generator.js +65 -0
  818. package/dist/tasks/id-generator.js.map +1 -0
  819. package/dist/tasks/index.js +14 -0
  820. package/dist/tasks/index.js.map +1 -0
  821. package/dist/tasks/labels.d.ts.map +1 -1
  822. package/dist/tasks/labels.js +55 -0
  823. package/dist/tasks/labels.js.map +1 -0
  824. package/dist/tasks/list.js +75 -0
  825. package/dist/tasks/list.js.map +1 -0
  826. package/dist/tasks/phase-tracking.js +133 -0
  827. package/dist/tasks/phase-tracking.js.map +1 -0
  828. package/dist/tasks/pipeline-stage.js +248 -0
  829. package/dist/tasks/pipeline-stage.js.map +1 -0
  830. package/dist/tasks/plan.js +268 -0
  831. package/dist/tasks/plan.js.map +1 -0
  832. package/dist/tasks/relates.d.ts.map +1 -1
  833. package/dist/tasks/relates.js +101 -0
  834. package/dist/tasks/relates.js.map +1 -0
  835. package/dist/tasks/show.d.ts.map +1 -1
  836. package/dist/tasks/show.js +83 -0
  837. package/dist/tasks/show.js.map +1 -0
  838. package/dist/tasks/size-weighting.js +86 -0
  839. package/dist/tasks/size-weighting.js.map +1 -0
  840. package/dist/tasks/staleness.js +86 -0
  841. package/dist/tasks/staleness.js.map +1 -0
  842. package/dist/tasks/task-ops.js +1741 -0
  843. package/dist/tasks/task-ops.js.map +1 -0
  844. package/dist/tasks/update.d.ts.map +1 -1
  845. package/dist/tasks/update.js +303 -0
  846. package/dist/tasks/update.js.map +1 -0
  847. package/dist/templates/index.js +10 -0
  848. package/dist/templates/index.js.map +1 -0
  849. package/dist/templates/parser.js +254 -0
  850. package/dist/templates/parser.js.map +1 -0
  851. package/dist/ui/aliases.js +153 -0
  852. package/dist/ui/aliases.js.map +1 -0
  853. package/dist/ui/changelog.js +184 -0
  854. package/dist/ui/changelog.js.map +1 -0
  855. package/dist/ui/command-registry.js +168 -0
  856. package/dist/ui/command-registry.js.map +1 -0
  857. package/dist/ui/flags.js +94 -0
  858. package/dist/ui/flags.js.map +1 -0
  859. package/dist/ui/index.js +24 -0
  860. package/dist/ui/index.js.map +1 -0
  861. package/dist/upgrade.js +1148 -0
  862. package/dist/upgrade.js.map +1 -0
  863. package/dist/validation/chain-validation.js +146 -0
  864. package/dist/validation/chain-validation.js.map +1 -0
  865. package/dist/validation/compliance.js +155 -0
  866. package/dist/validation/compliance.js.map +1 -0
  867. package/dist/validation/docs-sync.js +212 -0
  868. package/dist/validation/docs-sync.js.map +1 -0
  869. package/dist/validation/doctor/checks.js +1069 -0
  870. package/dist/validation/doctor/checks.js.map +1 -0
  871. package/dist/validation/doctor/index.js +9 -0
  872. package/dist/validation/doctor/index.js.map +1 -0
  873. package/dist/validation/doctor/project-cache.js +160 -0
  874. package/dist/validation/doctor/project-cache.js.map +1 -0
  875. package/dist/validation/doctor/utils.js +155 -0
  876. package/dist/validation/doctor/utils.js.map +1 -0
  877. package/dist/validation/engine.d.ts.map +1 -1
  878. package/dist/validation/engine.js +914 -0
  879. package/dist/validation/engine.js.map +1 -0
  880. package/dist/validation/gap-check.js +175 -0
  881. package/dist/validation/gap-check.js.map +1 -0
  882. package/dist/validation/index.js +40 -0
  883. package/dist/validation/index.js.map +1 -0
  884. package/dist/validation/manifest.js +237 -0
  885. package/dist/validation/manifest.js.map +1 -0
  886. package/dist/validation/operation-gate-validators.js +724 -0
  887. package/dist/validation/operation-gate-validators.js.map +1 -0
  888. package/dist/validation/operation-verification-gates.js +532 -0
  889. package/dist/validation/operation-verification-gates.js.map +1 -0
  890. package/dist/validation/param-utils.d.ts +5 -3
  891. package/dist/validation/param-utils.d.ts.map +1 -1
  892. package/dist/validation/param-utils.js +141 -0
  893. package/dist/validation/param-utils.js.map +1 -0
  894. package/dist/validation/protocol-common.js +300 -0
  895. package/dist/validation/protocol-common.js.map +1 -0
  896. package/dist/validation/protocols/_shared.d.ts.map +1 -1
  897. package/dist/validation/protocols/_shared.js +82 -0
  898. package/dist/validation/protocols/_shared.js.map +1 -0
  899. package/dist/validation/protocols/architecture-decision.js +31 -0
  900. package/dist/validation/protocols/architecture-decision.js.map +1 -0
  901. package/dist/validation/protocols/artifact-publish.js +28 -0
  902. package/dist/validation/protocols/artifact-publish.js.map +1 -0
  903. package/dist/validation/protocols/consensus.js +41 -0
  904. package/dist/validation/protocols/consensus.js.map +1 -0
  905. package/dist/validation/protocols/contribution.js +27 -0
  906. package/dist/validation/protocols/contribution.js.map +1 -0
  907. package/dist/validation/protocols/decomposition.js +28 -0
  908. package/dist/validation/protocols/decomposition.js.map +1 -0
  909. package/dist/validation/protocols/implementation.js +24 -0
  910. package/dist/validation/protocols/implementation.js.map +1 -0
  911. package/dist/validation/protocols/provenance.js +29 -0
  912. package/dist/validation/protocols/provenance.js.map +1 -0
  913. package/dist/validation/protocols/release.js +29 -0
  914. package/dist/validation/protocols/release.js.map +1 -0
  915. package/dist/validation/protocols/research.js +24 -0
  916. package/dist/validation/protocols/research.js.map +1 -0
  917. package/dist/validation/protocols/specification.js +27 -0
  918. package/dist/validation/protocols/specification.js.map +1 -0
  919. package/dist/validation/protocols/testing.js +30 -0
  920. package/dist/validation/protocols/testing.js.map +1 -0
  921. package/dist/validation/protocols/validation.js +30 -0
  922. package/dist/validation/protocols/validation.js.map +1 -0
  923. package/dist/validation/schema-integrity.js +170 -0
  924. package/dist/validation/schema-integrity.js.map +1 -0
  925. package/dist/validation/schema-validator.js +176 -0
  926. package/dist/validation/schema-validator.js.map +1 -0
  927. package/dist/validation/validate-ops.js +937 -0
  928. package/dist/validation/validate-ops.js.map +1 -0
  929. package/dist/validation/validation-rules.js +226 -0
  930. package/dist/validation/validation-rules.js.map +1 -0
  931. package/dist/validation/verification.js +321 -0
  932. package/dist/validation/verification.js.map +1 -0
  933. package/package.json +10 -8
  934. package/src/__tests__/paths-walkup.test.ts +305 -0
  935. package/src/__tests__/paths.test.ts +61 -17
  936. package/src/adapters/__tests__/manager.test.ts +0 -1
  937. package/src/codebase-map/analyzers/architecture.ts +0 -1
  938. package/src/conduit/__tests__/local-credential-flow.test.ts +20 -18
  939. package/src/conduit/__tests__/local-transport.test.ts +14 -12
  940. package/src/conduit/local-transport.ts +23 -13
  941. package/src/config.ts +0 -1
  942. package/src/errors.ts +24 -0
  943. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.ts +2 -5
  944. package/src/hooks/handlers/session-hooks.ts +42 -0
  945. package/src/init.ts +1 -2
  946. package/src/internal.ts +67 -3
  947. package/src/lifecycle/cant/lifecycle-rcasd.cant +133 -0
  948. package/src/memory/__tests__/engine-compat.test.ts +2 -2
  949. package/src/memory/__tests__/pipeline-manifest-sqlite.test.ts +4 -4
  950. package/src/observability/__tests__/index.test.ts +4 -4
  951. package/src/observability/__tests__/log-filter.test.ts +4 -4
  952. package/src/output.ts +73 -75
  953. package/src/paths.ts +91 -14
  954. package/src/scaffold.ts +22 -3
  955. package/src/sessions/__tests__/session-grade.integration.test.ts +1 -1
  956. package/src/sessions/__tests__/session-grade.test.ts +2 -2
  957. package/src/skills/__tests__/dynamic-skill-generator.test.ts +0 -2
  958. package/src/skills/dynamic-skill-generator.ts +0 -2
  959. package/src/store/__tests__/agent-registry-accessor.test.ts +807 -0
  960. package/src/store/__tests__/api-key-kdf.test.ts +113 -0
  961. package/src/store/__tests__/cleanup-legacy.test.ts +268 -0
  962. package/src/store/__tests__/conduit-sqlite.test.ts +413 -0
  963. package/src/store/__tests__/database-topology-integration.test.ts +504 -0
  964. package/src/store/__tests__/global-salt.test.ts +195 -0
  965. package/src/store/__tests__/migrate-signaldock-to-conduit.test.ts +715 -0
  966. package/src/store/__tests__/signaldock-sqlite.test.ts +652 -0
  967. package/src/store/__tests__/sqlite-backup-global.test.ts +585 -0
  968. package/src/store/__tests__/sqlite-backup.test.ts +122 -10
  969. package/src/store/__tests__/t310-integration.test.ts +1150 -0
  970. package/src/store/agent-registry-accessor.ts +847 -140
  971. package/src/store/api-key-kdf.ts +104 -0
  972. package/src/store/cleanup-legacy.ts +208 -0
  973. package/src/store/conduit-sqlite.ts +655 -0
  974. package/src/store/global-salt.ts +175 -0
  975. package/src/store/index.ts +7 -0
  976. package/src/store/migrate-signaldock-to-conduit.ts +669 -0
  977. package/src/store/nexus-sqlite.ts +32 -3
  978. package/src/store/signaldock-sqlite.ts +431 -254
  979. package/src/store/sqlite-backup.ts +544 -38
  980. package/src/store/sqlite.ts +19 -3
  981. package/src/system/__tests__/backup.test.ts +237 -0
  982. package/src/system/backup.ts +186 -26
  983. package/src/system/runtime.ts +4 -6
  984. package/src/tasks/__tests__/error-hints.test.ts +256 -0
  985. package/src/tasks/add.ts +99 -9
  986. package/src/tasks/complete.ts +4 -1
  987. package/src/tasks/find.ts +4 -1
  988. package/src/tasks/labels.ts +4 -1
  989. package/src/tasks/relates.ts +16 -4
  990. package/src/tasks/show.ts +4 -1
  991. package/src/tasks/update.ts +32 -3
  992. package/src/validation/__tests__/error-hints.test.ts +97 -0
  993. package/src/validation/engine.ts +16 -1
  994. package/src/validation/param-utils.ts +10 -7
  995. package/src/validation/protocols/_shared.ts +14 -6
  996. package/src/validation/protocols/cant/architecture-decision.cant +80 -0
  997. package/src/validation/protocols/cant/artifact-publish.cant +95 -0
  998. package/src/validation/protocols/cant/consensus.cant +74 -0
  999. package/src/validation/protocols/cant/contribution.cant +82 -0
  1000. package/src/validation/protocols/cant/decomposition.cant +92 -0
  1001. package/src/validation/protocols/cant/implementation.cant +67 -0
  1002. package/src/validation/protocols/cant/provenance.cant +88 -0
  1003. package/src/validation/protocols/cant/release.cant +96 -0
  1004. package/src/validation/protocols/cant/research.cant +66 -0
  1005. package/src/validation/protocols/cant/specification.cant +67 -0
  1006. package/src/validation/protocols/cant/testing.cant +88 -0
  1007. package/src/validation/protocols/cant/validation.cant +65 -0
  1008. package/src/validation/protocols/protocols-markdown/decomposition.md +0 -4
  1009. package/templates/cleo-gitignore +19 -3
  1010. package/templates/config.template.json +0 -1
  1011. package/templates/global-config.template.json +0 -1
@@ -328,7 +328,21 @@ export async function getDb(cwd?: string): Promise<NodeSQLiteDatabase<typeof sch
328
328
  // causing data loss when the WAL contained uncommitted writes.
329
329
  await autoRecoverFromBackup(nativeDb, dbPath, cwd);
330
330
 
331
- // Check if tasks.db or its WAL/SHM are dangerously tracked by git (ADR-013, T5158, T5188)
331
+ // Check if tasks.db or its WAL/SHM are dangerously tracked by git (ADR-013, T5158, T5188).
332
+ //
333
+ // As of ADR-013 §9 (2026-04-07) the canonical resolution is:
334
+ // 1. `.cleo/tasks.db` + WAL/SHM and `.cleo/brain.db` + WAL/SHM are
335
+ // git-ignored at the project root and untracked via `git rm --cached`.
336
+ // 2. Recovery is provided by VACUUM INTO snapshots in
337
+ // `.cleo/backups/sqlite/` (auto-rotated, 10 per DB, refreshed on
338
+ // every `cleo session end` via the backup-session-end hook).
339
+ // 3. Full 4-file snapshots (including config.json + project-info.json)
340
+ // are created on demand via `cleo backup add` / listed via
341
+ // `cleo backup list` / restored via `cleo restore backup`.
342
+ //
343
+ // The warning below is retained as a regression guard: if someone
344
+ // accidentally re-stages the DB into project git, this warning fires at
345
+ // every process startup so they fix it before real data loss occurs.
332
346
  if (!_gitTrackingChecked) {
333
347
  _gitTrackingChecked = true;
334
348
  try {
@@ -343,12 +357,14 @@ export async function getDb(cwd?: string): Promise<NodeSQLiteDatabase<typeof sch
343
357
  cwd: gitCwd,
344
358
  stdio: 'pipe',
345
359
  });
346
- // If we get here, the file IS tracked — that's dangerous
360
+ // If we get here, the file IS tracked — that's dangerous.
347
361
  const basename = fileToCheck.split(/[\\/]/).pop();
362
+ const relPath = fileToCheck.replace(gitCwd + sep, '');
348
363
  log.warn(
349
364
  { path: fileToCheck },
350
365
  `${basename} is tracked by project git — this risks data loss on branch switch. ` +
351
- `Run: git rm --cached ${fileToCheck.replace(gitCwd + sep, '')} (see ADR-013, T5188)`,
366
+ `Resolution (ADR-013 §9): \`git rm --cached ${relPath}\` and rely on ` +
367
+ `\`.cleo/backups/sqlite/\` snapshots + \`cleo backup add\` for recovery.`,
352
368
  );
353
369
  } catch {
354
370
  // Exit code 1 = not tracked = good
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Tests for the system backup module.
3
+ *
4
+ * Focus areas (T5158):
5
+ * - createBackup uses VACUUM INTO via the live SQLite handle and falls back
6
+ * gracefully when the handle is unavailable (non-fatal).
7
+ * - createBackup uses atomic tmp-then-rename for JSON files.
8
+ * - createBackup writes a .meta.json sidecar enumerating captured files.
9
+ * - listSystemBackups reads back the sidecars.
10
+ * - restoreBackup materializes files back into .cleo/.
11
+ *
12
+ * These tests rely on filesystem-level state in a temporary directory —
13
+ * they do NOT open a real CLEO database. SQLite handles are provided via
14
+ * vi.doMock to exercise the VACUUM INTO code path.
15
+ *
16
+ * @task T5158
17
+ */
18
+
19
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
20
+ import { mkdtemp, rm } from 'node:fs/promises';
21
+ import { tmpdir } from 'node:os';
22
+ import { join } from 'node:path';
23
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
24
+
25
+ describe('system/backup', () => {
26
+ let testDir: string;
27
+
28
+ beforeEach(async () => {
29
+ vi.resetModules();
30
+ testDir = await mkdtemp(join(tmpdir(), 'cleo-system-backup-'));
31
+ mkdirSync(join(testDir, '.cleo'), { recursive: true });
32
+ });
33
+
34
+ afterEach(async () => {
35
+ await rm(testDir, { recursive: true, force: true });
36
+ });
37
+
38
+ it('createBackup snapshots SQLite files via VACUUM INTO and JSON via atomic write', async () => {
39
+ const tasksExec = vi.fn((sql: string) => {
40
+ // Simulate VACUUM INTO by creating the destination file.
41
+ const match = sql.match(/VACUUM INTO '(.+)'/);
42
+ if (match) writeFileSync(match[1]!, 'vacuumed-tasks');
43
+ });
44
+ const brainExec = vi.fn((sql: string) => {
45
+ const match = sql.match(/VACUUM INTO '(.+)'/);
46
+ if (match) writeFileSync(match[1]!, 'vacuumed-brain');
47
+ });
48
+
49
+ // createBackup dynamically imports sqlite.js / brain-sqlite.js to
50
+ // ensure the DBs are open before snapshotting; mocks must cover both
51
+ // the `getDb`/`getBrainDb` open entry points AND the
52
+ // `getNativeDb`/`getBrainNativeDb` handle accessors.
53
+ vi.doMock('../../store/sqlite.js', () => ({
54
+ getDb: vi.fn().mockResolvedValue({}),
55
+ getNativeDb: () => ({ exec: tasksExec }),
56
+ }));
57
+ vi.doMock('../../store/brain-sqlite.js', () => ({
58
+ getBrainDb: vi.fn().mockResolvedValue({}),
59
+ getBrainNativeDb: () => ({ exec: brainExec }),
60
+ }));
61
+
62
+ // Seed source files so existsSync checks pass in createBackup.
63
+ writeFileSync(join(testDir, '.cleo', 'tasks.db'), 'live-tasks');
64
+ writeFileSync(join(testDir, '.cleo', 'brain.db'), 'live-brain');
65
+ writeFileSync(join(testDir, '.cleo', 'config.json'), '{"version":"test"}');
66
+ writeFileSync(join(testDir, '.cleo', 'project-info.json'), '{"projectId":"test"}');
67
+
68
+ const { createBackup } = await import('../backup.js');
69
+ const result = await createBackup(testDir, { type: 'snapshot', note: 't5158-test' });
70
+
71
+ expect(result.files).toEqual(
72
+ expect.arrayContaining(['tasks.db', 'brain.db', 'config.json', 'project-info.json']),
73
+ );
74
+
75
+ // VACUUM INTO was invoked with wal_checkpoint preceding it.
76
+ const tasksCalls = tasksExec.mock.calls.map((c) => c[0]);
77
+ const brainCalls = brainExec.mock.calls.map((c) => c[0]);
78
+ const tasksWal = tasksCalls.findIndex((c) => c.includes('wal_checkpoint'));
79
+ const tasksVacuum = tasksCalls.findIndex((c) => c.includes('VACUUM INTO'));
80
+ expect(tasksWal).toBeGreaterThanOrEqual(0);
81
+ expect(tasksVacuum).toBeGreaterThan(tasksWal);
82
+ const brainWal = brainCalls.findIndex((c) => c.includes('wal_checkpoint'));
83
+ const brainVacuum = brainCalls.findIndex((c) => c.includes('VACUUM INTO'));
84
+ expect(brainWal).toBeGreaterThanOrEqual(0);
85
+ expect(brainVacuum).toBeGreaterThan(brainWal);
86
+
87
+ // Snapshot files materialized in the backup dir.
88
+ const snapshotDir = join(testDir, '.cleo', 'backups', 'snapshot');
89
+ const files = readdirSync(snapshotDir);
90
+ expect(files.some((f) => f.startsWith('tasks.db.'))).toBe(true);
91
+ expect(files.some((f) => f.startsWith('brain.db.'))).toBe(true);
92
+ expect(files.some((f) => f.startsWith('config.json.'))).toBe(true);
93
+ expect(files.some((f) => f.startsWith('project-info.json.'))).toBe(true);
94
+
95
+ // Metadata sidecar.
96
+ const metaFile = files.find((f) => f.endsWith('.meta.json'));
97
+ expect(metaFile).toBeDefined();
98
+ const meta = JSON.parse(readFileSync(join(snapshotDir, metaFile!), 'utf-8'));
99
+ expect(meta.note).toBe('t5158-test');
100
+ expect(meta.files).toEqual(
101
+ expect.arrayContaining(['tasks.db', 'brain.db', 'config.json', 'project-info.json']),
102
+ );
103
+ });
104
+
105
+ it('createBackup skips SQLite files when the native handle is null (non-fatal)', async () => {
106
+ vi.doMock('../../store/sqlite.js', () => ({
107
+ getDb: vi.fn().mockResolvedValue({}),
108
+ getNativeDb: () => null,
109
+ }));
110
+ vi.doMock('../../store/brain-sqlite.js', () => ({
111
+ getBrainDb: vi.fn().mockResolvedValue({}),
112
+ getBrainNativeDb: () => null,
113
+ }));
114
+
115
+ writeFileSync(join(testDir, '.cleo', 'tasks.db'), 'live-tasks');
116
+ writeFileSync(join(testDir, '.cleo', 'brain.db'), 'live-brain');
117
+ writeFileSync(join(testDir, '.cleo', 'config.json'), '{"v":1}');
118
+
119
+ const { createBackup } = await import('../backup.js');
120
+ const result = await createBackup(testDir);
121
+
122
+ // JSON file captured, SQLite files skipped because no handle available.
123
+ expect(result.files).toContain('config.json');
124
+ expect(result.files).not.toContain('tasks.db');
125
+ expect(result.files).not.toContain('brain.db');
126
+ });
127
+
128
+ it('listSystemBackups reads sidecars from all known backup type dirs', async () => {
129
+ const snapshotDir = join(testDir, '.cleo', 'backups', 'snapshot');
130
+ const safetyDir = join(testDir, '.cleo', 'backups', 'safety');
131
+ mkdirSync(snapshotDir, { recursive: true });
132
+ mkdirSync(safetyDir, { recursive: true });
133
+
134
+ writeFileSync(
135
+ join(snapshotDir, 'snapshot-A.meta.json'),
136
+ JSON.stringify({
137
+ backupId: 'snapshot-A',
138
+ type: 'snapshot',
139
+ timestamp: '2026-04-07T12:00:00.000Z',
140
+ files: ['config.json'],
141
+ }),
142
+ );
143
+ writeFileSync(
144
+ join(safetyDir, 'safety-B.meta.json'),
145
+ JSON.stringify({
146
+ backupId: 'safety-B',
147
+ type: 'safety',
148
+ timestamp: '2026-04-07T13:00:00.000Z',
149
+ files: ['tasks.db'],
150
+ }),
151
+ );
152
+
153
+ const { listSystemBackups } = await import('../backup.js');
154
+ const entries = listSystemBackups(testDir);
155
+
156
+ expect(entries.length).toBe(2);
157
+ // Newest first.
158
+ expect(entries[0]?.backupId).toBe('safety-B');
159
+ expect(entries[1]?.backupId).toBe('snapshot-A');
160
+ });
161
+
162
+ it('restoreBackup materializes captured files back into .cleo/', async () => {
163
+ const snapshotDir = join(testDir, '.cleo', 'backups', 'snapshot');
164
+ mkdirSync(snapshotDir, { recursive: true });
165
+ const backupId = 'snapshot-restore-test';
166
+
167
+ writeFileSync(join(snapshotDir, `tasks.db.${backupId}`), 'restored-tasks');
168
+ writeFileSync(join(snapshotDir, `config.json.${backupId}`), '{"restored":true}');
169
+ writeFileSync(
170
+ join(snapshotDir, `${backupId}.meta.json`),
171
+ JSON.stringify({
172
+ backupId,
173
+ type: 'snapshot',
174
+ timestamp: '2026-04-07T14:00:00.000Z',
175
+ files: ['tasks.db', 'config.json'],
176
+ }),
177
+ );
178
+
179
+ // Pre-existing live copies the restore will overwrite.
180
+ writeFileSync(join(testDir, '.cleo', 'tasks.db'), 'stale-tasks');
181
+ writeFileSync(join(testDir, '.cleo', 'config.json'), '{"stale":true}');
182
+
183
+ const { restoreBackup } = await import('../backup.js');
184
+ const result = restoreBackup(testDir, { backupId });
185
+
186
+ expect(result.restored).toBe(true);
187
+ expect(result.filesRestored).toEqual(expect.arrayContaining(['tasks.db', 'config.json']));
188
+ expect(readFileSync(join(testDir, '.cleo', 'tasks.db'), 'utf-8')).toBe('restored-tasks');
189
+ expect(readFileSync(join(testDir, '.cleo', 'config.json'), 'utf-8')).toBe('{"restored":true}');
190
+ });
191
+
192
+ it('restoreBackup throws NOT_FOUND for a missing backupId', async () => {
193
+ const { restoreBackup } = await import('../backup.js');
194
+ expect(() => restoreBackup(testDir, { backupId: 'nonexistent' })).toThrowError(
195
+ /Backup not found/,
196
+ );
197
+ });
198
+ });
199
+
200
+ // Sanity: ensure the safety snapshot produced by the vacuumed blob is readable
201
+ // as a normal file (we treat .db files as opaque blobs during restore).
202
+ describe('system/backup — restored .db files are byte-identical', () => {
203
+ let testDir: string;
204
+ beforeEach(async () => {
205
+ vi.resetModules();
206
+ testDir = await mkdtemp(join(tmpdir(), 'cleo-system-backup-restore-'));
207
+ mkdirSync(join(testDir, '.cleo'), { recursive: true });
208
+ });
209
+ afterEach(async () => {
210
+ await rm(testDir, { recursive: true, force: true });
211
+ });
212
+
213
+ it('restoreBackup copies .db files without re-vacuuming', async () => {
214
+ const snapshotDir = join(testDir, '.cleo', 'backups', 'snapshot');
215
+ mkdirSync(snapshotDir, { recursive: true });
216
+ const backupId = 'snapshot-byte-identity';
217
+ const payload = Buffer.from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
218
+ writeFileSync(join(snapshotDir, `tasks.db.${backupId}`), payload);
219
+ writeFileSync(
220
+ join(snapshotDir, `${backupId}.meta.json`),
221
+ JSON.stringify({
222
+ backupId,
223
+ type: 'snapshot',
224
+ timestamp: '2026-04-07T15:00:00.000Z',
225
+ files: ['tasks.db'],
226
+ }),
227
+ );
228
+
229
+ const { restoreBackup } = await import('../backup.js');
230
+ const result = restoreBackup(testDir, { backupId });
231
+ expect(result.restored).toBe(true);
232
+
233
+ const liveBytes = readFileSync(join(testDir, '.cleo', 'tasks.db'));
234
+ expect(Buffer.compare(liveBytes, payload)).toBe(0);
235
+ expect(existsSync(join(testDir, '.cleo', 'tasks.db'))).toBe(true);
236
+ });
237
+ });
@@ -1,33 +1,124 @@
1
1
  /**
2
2
  * Backup and restore core module.
3
+ *
4
+ * Produces full-`.cleo/` snapshots containing tasks.db, brain.db, config.json
5
+ * and project-info.json using the safest available method for each file type:
6
+ *
7
+ * - SQLite databases: `VACUUM INTO` via the live native handle (see
8
+ * {@link ../store/sqlite-backup.ts}). This is the ONLY safe way to
9
+ * snapshot a WAL-mode SQLite database while it is open — raw filesystem
10
+ * copies can capture torn writes or stale WAL frames.
11
+ *
12
+ * - JSON files: atomic tmp-then-rename via {@link atomicWrite} so a partial
13
+ * write can never corrupt the backup target.
14
+ *
15
+ * Snapshots are recorded under `.cleo/backups/{type}/` with a JSON sidecar
16
+ * (`{backupId}.meta.json`) enumerating which files were captured and how.
17
+ * Restores read the same sidecars and materialize each file back into the
18
+ * live `.cleo/` directory.
19
+ *
20
+ * This is the backing store for the `cleo backup` and `cleo restore backup`
21
+ * CLI verbs (see packages/cleo/src/cli/commands/backup.ts and restore.ts).
22
+ *
3
23
  * @task T4783
24
+ * @task T5158 — extended to use VACUUM INTO for .db files and atomicWrite for JSON
4
25
  */
5
26
 
6
- import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
7
- import { join } from 'node:path';
27
+ import {
28
+ copyFileSync,
29
+ existsSync,
30
+ mkdirSync,
31
+ readdirSync,
32
+ readFileSync,
33
+ renameSync,
34
+ unlinkSync,
35
+ writeFileSync,
36
+ } from 'node:fs';
37
+ import { dirname, join } from 'node:path';
8
38
  import { ExitCode } from '@cleocode/contracts';
9
39
  import { CleoError } from '../errors.js';
40
+ import { getBrainNativeDb } from '../store/brain-sqlite.js';
41
+ import { getNativeDb } from '../store/sqlite.js';
10
42
 
43
+ /** Safe wrapper around VACUUM INTO: flushes WAL then clones the DB. */
44
+ function safeSqliteSnapshot(db: { exec: (sql: string) => void } | null, destPath: string): boolean {
45
+ if (!db) return false;
46
+ db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
47
+ const safeDest = destPath.replace(/'/g, "''");
48
+ db.exec(`VACUUM INTO '${safeDest}'`);
49
+ return true;
50
+ }
51
+
52
+ /**
53
+ * Synchronous atomic write: writes to a sibling `.tmp` file and renames on
54
+ * success. Mirrors the behavior of `write-file-atomic` but in a sync flavor
55
+ * suitable for `createBackup()` which has a sync contract throughout its
56
+ * call chain.
57
+ *
58
+ * On rename failure the tmp file is best-effort cleaned up. Throws on the
59
+ * originating error so callers can decide how to handle the backup partial.
60
+ */
61
+ function atomicWriteSync(destPath: string, data: Buffer | string): void {
62
+ mkdirSync(dirname(destPath), { recursive: true });
63
+ const tmp = `${destPath}.${process.pid}.${Date.now()}.tmp`;
64
+ try {
65
+ writeFileSync(tmp, data);
66
+ renameSync(tmp, destPath);
67
+ } catch (err) {
68
+ try {
69
+ unlinkSync(tmp);
70
+ } catch {
71
+ /* ignore cleanup failure */
72
+ }
73
+ throw err;
74
+ }
75
+ }
76
+
77
+ /** Result shape returned by {@link createBackup}. */
11
78
  export interface BackupResult {
79
+ /** Unique backup identifier (timestamped). */
12
80
  backupId: string;
81
+ /** Absolute path to the directory containing the snapshot files. */
13
82
  path: string;
83
+ /** ISO-8601 timestamp when the backup was created. */
14
84
  timestamp: string;
85
+ /** Backup category (`snapshot`, `safety`, `migration`). */
15
86
  type: string;
87
+ /** Files that were successfully captured into this backup. */
16
88
  files: string[];
17
89
  }
18
90
 
91
+ /** Result shape returned by {@link restoreBackup}. */
19
92
  export interface RestoreResult {
93
+ /** Whether any files were actually restored (false if none matched). */
20
94
  restored: boolean;
95
+ /** The backup identifier that was restored. */
21
96
  backupId: string;
97
+ /** ISO-8601 timestamp of the original backup. */
22
98
  timestamp: string;
99
+ /** File names that were successfully restored back into `.cleo/`. */
23
100
  filesRestored: string[];
24
101
  }
25
102
 
26
- /** Create a backup of CLEO data files. */
27
- export function createBackup(
103
+ /**
104
+ * Create a backup of the canonical CLEO data files.
105
+ *
106
+ * Produces safe copies via VACUUM INTO (for SQLite) and atomicWrite
107
+ * (for JSON) into `.cleo/backups/{type}/`. Writes a `{backupId}.meta.json`
108
+ * sidecar describing the snapshot.
109
+ *
110
+ * Opens both `tasks.db` and `brain.db` through their canonical drizzle
111
+ * accessors before snapshotting so that the native DB handles are live
112
+ * when `safeSqliteSnapshot` asks for them. This makes the function
113
+ * self-contained — callers do not need to pre-open the DBs.
114
+ *
115
+ * Async because opening the database engines requires async migration
116
+ * reconciliation (ADR-012). The CLI dispatch layer awaits this result.
117
+ */
118
+ export async function createBackup(
28
119
  projectRoot: string,
29
120
  opts?: { type?: string; note?: string },
30
- ): BackupResult {
121
+ ): Promise<BackupResult> {
31
122
  const cleoDir = join(projectRoot, '.cleo');
32
123
  const btype = opts?.type || 'snapshot';
33
124
  const timestamp = new Date().toISOString();
@@ -38,27 +129,72 @@ export function createBackup(
38
129
  mkdirSync(backupDir, { recursive: true });
39
130
  }
40
131
 
41
- const filesToBackup = ['tasks.db', 'brain.db', 'config.json', 'project-info.json'];
132
+ // Ensure both SQLite engines are initialized so getNativeDb/
133
+ // getBrainNativeDb return live handles when we call them below. Both
134
+ // opens are best-effort — if one fails we still snapshot whatever we
135
+ // can reach (plus the JSON files). Dynamic imports avoid pulling
136
+ // drizzle into test suites that mock the store layer.
137
+ try {
138
+ const { getDb } = await import('../store/sqlite.js');
139
+ await getDb(projectRoot);
140
+ } catch {
141
+ // tasks.db open failed — will be skipped by the sqlite target below
142
+ }
143
+ try {
144
+ const { getBrainDb } = await import('../store/brain-sqlite.js');
145
+ await getBrainDb(projectRoot);
146
+ } catch {
147
+ // brain.db open failed — will be skipped by the sqlite target below
148
+ }
149
+
150
+ /**
151
+ * Per-file backup strategy. SQLite files go through `safeSqliteSnapshot`
152
+ * (VACUUM INTO), JSON files through `atomicWrite`. Anything not in this
153
+ * table is skipped.
154
+ */
155
+ const sqliteTargets: Array<{
156
+ file: string;
157
+ getDb: () => { exec: (sql: string) => void } | null;
158
+ }> = [
159
+ { file: 'tasks.db', getDb: getNativeDb },
160
+ { file: 'brain.db', getDb: getBrainNativeDb },
161
+ ];
162
+ const jsonTargets: string[] = ['config.json', 'project-info.json'];
42
163
  const backedUp: string[] = [];
43
164
 
44
- for (const file of filesToBackup) {
45
- const src = join(cleoDir, file);
46
- if (existsSync(src)) {
47
- const dest = join(backupDir, `${file}.${backupId}`);
48
- try {
49
- const content = readFileSync(src);
50
- writeFileSync(dest, content);
51
- backedUp.push(file);
52
- } catch {
53
- // skip files that fail to copy
165
+ // SQLite via VACUUM INTO.
166
+ for (const target of sqliteTargets) {
167
+ const src = join(cleoDir, target.file);
168
+ if (!existsSync(src)) continue;
169
+ const dest = join(backupDir, `${target.file}.${backupId}`);
170
+ try {
171
+ const ok = safeSqliteSnapshot(target.getDb(), dest);
172
+ if (ok) {
173
+ backedUp.push(target.file);
54
174
  }
175
+ } catch {
176
+ // skip files that fail to snapshot — backup remains partial but usable
177
+ }
178
+ }
179
+
180
+ // JSON via atomic write.
181
+ for (const file of jsonTargets) {
182
+ const src = join(cleoDir, file);
183
+ if (!existsSync(src)) continue;
184
+ const dest = join(backupDir, `${file}.${backupId}`);
185
+ try {
186
+ const content = readFileSync(src);
187
+ atomicWriteSync(dest, content);
188
+ backedUp.push(file);
189
+ } catch {
190
+ // skip files that fail to copy
55
191
  }
56
192
  }
57
193
 
58
- // Write metadata
194
+ // Write metadata sidecar.
59
195
  const metaPath = join(backupDir, `${backupId}.meta.json`);
60
196
  try {
61
- writeFileSync(
197
+ atomicWriteSync(
62
198
  metaPath,
63
199
  JSON.stringify(
64
200
  {
@@ -71,7 +207,6 @@ export function createBackup(
71
207
  null,
72
208
  2,
73
209
  ),
74
- 'utf-8',
75
210
  );
76
211
  } catch {
77
212
  // non-fatal
@@ -82,10 +217,15 @@ export function createBackup(
82
217
 
83
218
  /** A single backup entry returned by listSystemBackups. */
84
219
  export interface BackupEntry {
220
+ /** Unique backup identifier (timestamped). */
85
221
  backupId: string;
222
+ /** Backup category (`snapshot`, `safety`, `migration`). */
86
223
  type: string;
224
+ /** ISO-8601 timestamp when the backup was created. */
87
225
  timestamp: string;
226
+ /** Optional human-readable note attached at creation time. */
88
227
  note?: string;
228
+ /** File names captured in this backup. */
89
229
  files: string[];
90
230
  }
91
231
 
@@ -131,7 +271,18 @@ export function listSystemBackups(projectRoot: string): BackupEntry[] {
131
271
  return entries.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
132
272
  }
133
273
 
134
- /** Restore from a backup. */
274
+ /**
275
+ * Restore a backup into the live `.cleo/` directory.
276
+ *
277
+ * This operation overwrites the in-place copies of the files recorded in
278
+ * the backup's sidecar. SQLite files are restored via a plain `copyFileSync`
279
+ * because restore runs BEFORE the next CLEO process opens the database — no
280
+ * WAL is active at that point — so a filesystem copy is safe. Callers must
281
+ * ensure no CLEO process is concurrently writing to the target database.
282
+ *
283
+ * JSON files are restored via `atomicWrite` (tmp-then-rename) so a crash
284
+ * mid-restore cannot produce a truncated config.
285
+ */
135
286
  export function restoreBackup(
136
287
  projectRoot: string,
137
288
  params: { backupId: string; force?: boolean },
@@ -168,14 +319,23 @@ export function restoreBackup(
168
319
  const restored: string[] = [];
169
320
  for (const file of meta.files ?? []) {
170
321
  const backupFile = join(backupDir, `${file}.${params.backupId}`);
171
- if (existsSync(backupFile)) {
172
- try {
322
+ if (!existsSync(backupFile)) continue;
323
+ const destPath = join(cleoDir, file);
324
+ try {
325
+ if (file.endsWith('.db')) {
326
+ // Atomic filesystem copy — target DB must not be in use (caller's
327
+ // responsibility). Raw copy is safe here because no VACUUM INTO is
328
+ // applicable (we are writing to the final location, not into a
329
+ // snapshot).
330
+ copyFileSync(backupFile, destPath);
331
+ } else {
332
+ // JSON via atomic tmp-then-rename.
173
333
  const content = readFileSync(backupFile);
174
- writeFileSync(join(cleoDir, file), content);
175
- restored.push(file);
176
- } catch {
177
- // skip files that fail to restore
334
+ atomicWriteSync(destPath, content);
178
335
  }
336
+ restored.push(file);
337
+ } catch {
338
+ // skip files that fail to restore
179
339
  }
180
340
  }
181
341
 
@@ -35,8 +35,6 @@ export interface RuntimeDiagnostics {
35
35
  };
36
36
  naming: {
37
37
  cli: string;
38
- /** Legacy field. CLI dispatch only. */
39
- mcp: string;
40
38
  server: string;
41
39
  };
42
40
  node: string;
@@ -73,14 +71,14 @@ function detectFromDataRoot(dataRoot: string): RuntimeChannel | null {
73
71
  return null;
74
72
  }
75
73
 
76
- function getExpectedNaming(channel: RuntimeChannel): { cli: string; mcp: string; server: string } {
74
+ function getExpectedNaming(channel: RuntimeChannel): { cli: string; server: string } {
77
75
  switch (channel) {
78
76
  case 'dev':
79
- return { cli: 'cleo-dev', mcp: 'cli', server: 'cleo-dev' };
77
+ return { cli: 'cleo-dev', server: 'cleo-dev' };
80
78
  case 'beta':
81
- return { cli: 'cleo-beta', mcp: 'cli', server: 'cleo-beta' };
79
+ return { cli: 'cleo-beta', server: 'cleo-beta' };
82
80
  default:
83
- return { cli: 'cleo', mcp: 'cli', server: 'cleo' };
81
+ return { cli: 'cleo', server: 'cleo' };
84
82
  }
85
83
  }
86
84