@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
@@ -1,25 +1,83 @@
1
1
  /**
2
2
  * SQLite backup via VACUUM INTO with snapshot rotation.
3
3
  *
4
- * Produces self-contained, WAL-free copies of tasks.db into
5
- * .cleo/backups/sqlite/ with a configurable rotation limit.
6
- * All errors are swallowed -- backup failure must never interrupt
7
- * normal operation.
4
+ * Produces self-contained, WAL-free copies of CLEO SQLite databases
5
+ * (tasks.db, brain.db, conduit.db at project tier; nexus.db, signaldock.db at
6
+ * global tier) into `.cleo/backups/sqlite/` (project) or
7
+ * `$XDG_DATA_HOME/cleo/backups/sqlite/` (global) with a configurable rotation
8
+ * limit. Also provides raw-file backup for the global-salt binary (not SQLite).
9
+ * All errors are swallowed — backup failure must never interrupt normal operation.
8
10
  *
9
11
  * @task T4873
12
+ * @task T5158 — extended to cover brain.db
13
+ * @task T306 — extended to cover global-tier nexus.db (epic T299)
14
+ * @task T369 — extended to cover conduit.db (project), signaldock.db (global),
15
+ * and global-salt raw-file backup (epic T310)
10
16
  * @epic T4867
11
17
  */
12
18
 
13
- import { existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from 'node:fs';
19
+ import {
20
+ chmodSync,
21
+ copyFileSync,
22
+ existsSync,
23
+ mkdirSync,
24
+ readdirSync,
25
+ statSync,
26
+ unlinkSync,
27
+ } from 'node:fs';
14
28
  import { join } from 'node:path';
15
- import { getCleoDir } from '../paths.js';
29
+ import { getCleoDir, getCleoHome } from '../paths.js';
30
+ import { getBrainNativeDb } from './brain-sqlite.js';
31
+ import { getConduitNativeDb } from './conduit-sqlite.js';
32
+ import { getGlobalSaltPath } from './global-salt.js';
33
+ import { getNexusNativeDb } from './nexus-sqlite.js';
34
+ import { getGlobalSignaldockNativeDb } from './signaldock-sqlite.js';
16
35
  import { getNativeDb } from './sqlite.js';
17
36
 
37
+ /** Maximum number of snapshots retained per database (oldest rotated out). */
18
38
  const MAX_SNAPSHOTS = 10;
39
+ /** Debounce window (ms) during which duplicate snapshot requests are suppressed. */
19
40
  const DEBOUNCE_MS = 30_000; // 30 seconds
20
41
 
21
- let _lastBackupEpoch = 0;
42
+ /**
43
+ * Per-database snapshot book-keeping: last snapshot timestamp (epoch ms)
44
+ * keyed by the canonical snapshot prefix (e.g. `"tasks"` / `"brain"`).
45
+ */
46
+ const _lastBackupEpoch: Record<string, number> = {};
22
47
 
48
+ /**
49
+ * Registered snapshot target — each one maps a logical key (prefix used in
50
+ * snapshot filenames) to a function returning the live {@link DatabaseSync}
51
+ * handle. `null` means the database has not been initialized in the current
52
+ * process and its snapshot step should be skipped.
53
+ */
54
+ interface SnapshotTarget {
55
+ /** Canonical name used in snapshot filenames, e.g. `"tasks"` or `"brain"`. */
56
+ prefix: string;
57
+ /** Resolves the live native handle, or `null` if not yet initialized. */
58
+ getDb: () => { exec: (sql: string) => void } | null;
59
+ }
60
+
61
+ /**
62
+ * Canonical list of snapshot targets. Ordering is insertion order — tasks.db
63
+ * snapshots first (highest-value operational state), then brain.db, then
64
+ * conduit.db (project messaging state).
65
+ *
66
+ * @task T369
67
+ * @epic T310
68
+ */
69
+ const SNAPSHOT_TARGETS: SnapshotTarget[] = [
70
+ { prefix: 'tasks', getDb: getNativeDb },
71
+ { prefix: 'brain', getDb: getBrainNativeDb },
72
+ { prefix: 'conduit', getDb: getConduitNativeDb }, // Added T369 — project messaging DB
73
+ ];
74
+
75
+ /**
76
+ * Format a Date as `YYYYMMDD-HHmmss` (local time) for snapshot filenames.
77
+ *
78
+ * Matches the regex `/^(?:tasks|brain)-\d{8}-\d{6}\.db$/` used by the rotation
79
+ * and listing logic below.
80
+ */
23
81
  function formatTimestamp(d: Date): string {
24
82
  const pad = (n: number, len = 2) => String(n).padStart(len, '0');
25
83
  return (
@@ -28,10 +86,26 @@ function formatTimestamp(d: Date): string {
28
86
  );
29
87
  }
30
88
 
31
- function rotateSnapshots(backupDir: string): void {
89
+ /**
90
+ * Build the regex that matches snapshot filenames for the given prefix.
91
+ * Isolated so both {@link rotateSnapshots} and {@link listSqliteBackupsForPrefix}
92
+ * share a single source of truth.
93
+ */
94
+ function snapshotPattern(prefix: string): RegExp {
95
+ // Escape the prefix in case it ever contains regex metacharacters.
96
+ const safe = prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
97
+ return new RegExp(`^${safe}-\\d{8}-\\d{6}\\.db$`);
98
+ }
99
+
100
+ /**
101
+ * Rotate snapshots for a single prefix: delete the oldest files until fewer
102
+ * than {@link MAX_SNAPSHOTS} remain. Non-fatal on any filesystem error.
103
+ */
104
+ function rotateSnapshots(backupDir: string, prefix: string): void {
32
105
  try {
106
+ const pattern = snapshotPattern(prefix);
33
107
  const files = readdirSync(backupDir)
34
- .filter((f) => f.match(/^tasks-\d{8}-\d{6}\.db$/))
108
+ .filter((f) => pattern.test(f))
35
109
  .map((f) => ({
36
110
  name: f,
37
111
  path: join(backupDir, f),
@@ -40,7 +114,8 @@ function rotateSnapshots(backupDir: string): void {
40
114
  .sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first
41
115
 
42
116
  while (files.length >= MAX_SNAPSHOTS) {
43
- const oldest = files.shift()!;
117
+ const oldest = files.shift();
118
+ if (!oldest) break;
44
119
  unlinkSync(oldest.path);
45
120
  }
46
121
  } catch {
@@ -48,23 +123,73 @@ function rotateSnapshots(backupDir: string): void {
48
123
  }
49
124
  }
50
125
 
126
+ /** Options accepted by {@link vacuumIntoBackup} and {@link vacuumIntoBackupAll}. */
51
127
  export interface VacuumOptions {
128
+ /**
129
+ * Working directory used to resolve the project-local `.cleo/backups/sqlite/`
130
+ * directory. Defaults to `process.cwd()` (delegated to {@link getCleoDir}).
131
+ */
52
132
  cwd?: string;
133
+ /** When true, bypass the {@link DEBOUNCE_MS} debounce window. */
53
134
  force?: boolean;
54
135
  }
55
136
 
56
137
  /**
57
- * Create a VACUUM INTO snapshot of the SQLite database.
138
+ * Create a VACUUM INTO snapshot of a single SQLite database.
58
139
  *
59
- * Debounced by default (30s). Pass `force: true` to bypass debounce.
60
- * WAL checkpoint is run before the snapshot for consistency.
61
- * Oldest snapshots are rotated out when MAX_SNAPSHOTS is reached.
140
+ * Runs `PRAGMA wal_checkpoint(TRUNCATE)` first to flush the WAL for a
141
+ * consistent snapshot, then issues `VACUUM INTO '<dest>'` which SQLite
142
+ * implements as an atomic, fully defragmented clone.
62
143
  *
63
- * Non-fatal: all errors are swallowed.
144
+ * Non-fatal: all errors are swallowed via the outer try in
145
+ * {@link vacuumIntoBackupAll}; failures here must never block normal
146
+ * operation.
147
+ *
148
+ * @param target — snapshot target descriptor (prefix + native DB getter)
149
+ * @param backupDir — absolute path to `.cleo/backups/sqlite/`
150
+ * @param now — reference timestamp for the filename
151
+ */
152
+ function snapshotOne(target: SnapshotTarget, backupDir: string, now: Date): void {
153
+ const db = target.getDb();
154
+ if (!db) return; // DB not initialized in this process — skip silently
155
+
156
+ const dest = join(backupDir, `${target.prefix}-${formatTimestamp(now)}.db`);
157
+
158
+ // TRUNCATE checkpoint: flushes all WAL frames to the main DB and truncates
159
+ // the WAL file to zero bytes, ensuring a consistent DB state before the
160
+ // VACUUM INTO snapshot (ADR-013, section 3 point 7). This is safe because
161
+ // the .db files are excluded from project git tracking (.gitignore + git
162
+ // rm --cached), so git operations cannot restore a stale WAL. The root
163
+ // cause of the 2026-02-25 data loss was that WAL files were still tracked
164
+ // in the project git index; that has been resolved (T4894, T5158).
165
+ db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
166
+
167
+ rotateSnapshots(backupDir, target.prefix);
168
+
169
+ // Escape single quotes in path (path is programmatic, but be safe).
170
+ const safeDest = dest.replace(/'/g, "''");
171
+ db.exec(`VACUUM INTO '${safeDest}'`);
172
+ }
173
+
174
+ /**
175
+ * Create a VACUUM INTO snapshot of the primary SQLite database (tasks.db).
176
+ *
177
+ * Debounced by default (30s). Pass `force: true` to bypass debounce. This
178
+ * function is retained for backward compatibility with existing call sites
179
+ * in `data-safety.ts` / `data-safety-central.ts` that only snapshot tasks.db.
180
+ *
181
+ * Prefer {@link vacuumIntoBackupAll} for new code — it snapshots every
182
+ * registered database (currently tasks.db + brain.db) and shares the same
183
+ * debounce + rotation guarantees.
184
+ *
185
+ * Non-fatal: all errors are swallowed — backup failure must never
186
+ * interrupt normal operation.
64
187
  */
65
188
  export async function vacuumIntoBackup(opts: VacuumOptions = {}): Promise<void> {
66
189
  const now = Date.now();
67
- if (!opts.force && now - _lastBackupEpoch < DEBOUNCE_MS) {
190
+ const prefix = 'tasks';
191
+ const last = _lastBackupEpoch[prefix] ?? 0;
192
+ if (!opts.force && now - last < DEBOUNCE_MS) {
68
193
  return; // debounced
69
194
  }
70
195
 
@@ -73,36 +198,61 @@ export async function vacuumIntoBackup(opts: VacuumOptions = {}): Promise<void>
73
198
  const backupDir = join(cleoDir, 'backups', 'sqlite');
74
199
  mkdirSync(backupDir, { recursive: true });
75
200
 
76
- const db = getNativeDb();
77
- if (!db) return; // SQLite not initialized
201
+ const target = SNAPSHOT_TARGETS.find((t) => t.prefix === prefix);
202
+ if (!target) return;
78
203
 
79
- const dest = join(backupDir, `tasks-${formatTimestamp(new Date())}.db`);
80
-
81
- // TRUNCATE checkpoint: flushes all WAL frames to the main DB and truncates
82
- // the WAL file to zero bytes, ensuring a consistent DB state before the
83
- // VACUUM INTO snapshot (ADR-013, section 3 point 7). This is safe because
84
- // tasks.db* files are excluded from project git tracking (.gitignore +
85
- // git rm --cached), so git operations cannot restore a stale WAL.
86
- // The root cause of the 2026-02-25 data loss was that WAL files were
87
- // still tracked in the project git index; that has been resolved (T4894).
88
- db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
89
-
90
- rotateSnapshots(backupDir);
204
+ snapshotOne(target, backupDir, new Date());
205
+ _lastBackupEpoch[prefix] = Date.now();
206
+ } catch {
207
+ // non-fatal backup failure must never interrupt normal operation
208
+ }
209
+ }
91
210
 
92
- // Escape single quotes in path (path is programmatic, but be safe)
93
- const safeDest = dest.replace(/'/g, "''");
94
- db.exec(`VACUUM INTO '${safeDest}'`);
211
+ /**
212
+ * Create VACUUM INTO snapshots of all registered CLEO SQLite databases
213
+ * (currently tasks.db + brain.db). Each database is debounced independently.
214
+ *
215
+ * This is the preferred entry point for session-lifecycle hooks and
216
+ * pre-destructive-operation snapshots — it guarantees that BRAIN memory is
217
+ * snapshotted alongside task state.
218
+ *
219
+ * Non-fatal: errors are swallowed per database so a brain.db failure cannot
220
+ * block a tasks.db snapshot (and vice versa).
221
+ */
222
+ export async function vacuumIntoBackupAll(opts: VacuumOptions = {}): Promise<void> {
223
+ const nowMs = Date.now();
224
+ const now = new Date();
95
225
 
96
- _lastBackupEpoch = Date.now();
226
+ let backupDir: string;
227
+ try {
228
+ const cleoDir = getCleoDir(opts.cwd);
229
+ backupDir = join(cleoDir, 'backups', 'sqlite');
230
+ mkdirSync(backupDir, { recursive: true });
97
231
  } catch {
98
- // non-fatal -- backup failure must never interrupt normal operation
232
+ return; // cannot resolve backup dir abort silently
233
+ }
234
+
235
+ for (const target of SNAPSHOT_TARGETS) {
236
+ const last = _lastBackupEpoch[target.prefix] ?? 0;
237
+ if (!opts.force && nowMs - last < DEBOUNCE_MS) {
238
+ continue; // debounced — skip this target only
239
+ }
240
+ try {
241
+ snapshotOne(target, backupDir, now);
242
+ _lastBackupEpoch[target.prefix] = Date.now();
243
+ } catch {
244
+ // non-fatal — continue with remaining targets
245
+ }
99
246
  }
100
247
  }
101
248
 
102
249
  /**
103
- * List existing SQLite backup snapshots, newest first.
250
+ * List existing snapshots for a given prefix (`"tasks"` or `"brain"`),
251
+ * newest first. Returns an empty array if the backup directory does not
252
+ * exist.
104
253
  */
105
- export function listSqliteBackups(
254
+ function listSqliteBackupsForPrefix(
255
+ prefix: string,
106
256
  cwd?: string,
107
257
  ): Array<{ name: string; path: string; mtimeMs: number }> {
108
258
  try {
@@ -110,8 +260,9 @@ export function listSqliteBackups(
110
260
  const backupDir = join(cleoDir, 'backups', 'sqlite');
111
261
  if (!existsSync(backupDir)) return [];
112
262
 
263
+ const pattern = snapshotPattern(prefix);
113
264
  return readdirSync(backupDir)
114
- .filter((f) => f.match(/^tasks-\d{8}-\d{6}\.db$/))
265
+ .filter((f) => pattern.test(f))
115
266
  .map((f) => ({
116
267
  name: f,
117
268
  path: join(backupDir, f),
@@ -122,3 +273,358 @@ export function listSqliteBackups(
122
273
  return [];
123
274
  }
124
275
  }
276
+
277
+ /**
278
+ * List existing tasks.db snapshots (newest first).
279
+ *
280
+ * Retained for backward compatibility. For new code prefer
281
+ * {@link listSqliteBackupsAll}.
282
+ */
283
+ export function listSqliteBackups(
284
+ cwd?: string,
285
+ ): Array<{ name: string; path: string; mtimeMs: number }> {
286
+ return listSqliteBackupsForPrefix('tasks', cwd);
287
+ }
288
+
289
+ /**
290
+ * List existing brain.db snapshots (newest first).
291
+ */
292
+ export function listBrainBackups(
293
+ cwd?: string,
294
+ ): Array<{ name: string; path: string; mtimeMs: number }> {
295
+ return listSqliteBackupsForPrefix('brain', cwd);
296
+ }
297
+
298
+ /**
299
+ * Aggregated listing of all registered SQLite snapshots.
300
+ *
301
+ * Returns an object keyed by snapshot prefix (`tasks`, `brain`) where each
302
+ * value is the per-prefix list sorted newest-first. Missing prefixes are
303
+ * represented as empty arrays.
304
+ */
305
+ export function listSqliteBackupsAll(
306
+ cwd?: string,
307
+ ): Record<string, Array<{ name: string; path: string; mtimeMs: number }>> {
308
+ const out: Record<string, Array<{ name: string; path: string; mtimeMs: number }>> = {};
309
+ for (const target of SNAPSHOT_TARGETS) {
310
+ out[target.prefix] = listSqliteBackupsForPrefix(target.prefix, cwd);
311
+ }
312
+ return out;
313
+ }
314
+
315
+ // ============================================================================
316
+ // Global-tier backup (ADR-036 §Backup Mechanism)
317
+ // @task T306
318
+ // @epic T299
319
+ // ============================================================================
320
+
321
+ /**
322
+ * Backup scope: project (per-project `.cleo/`) or global (`$XDG_DATA_HOME/cleo/`).
323
+ *
324
+ * @task T306
325
+ * @epic T299
326
+ */
327
+ export type BackupScope = 'project' | 'global';
328
+
329
+ /**
330
+ * Registered global-tier snapshot targets. Both `nexus` and `signaldock` are
331
+ * active as of T369 (epic T310).
332
+ *
333
+ * @task T369
334
+ * @epic T310
335
+ */
336
+ const GLOBAL_SNAPSHOT_TARGETS: SnapshotTarget[] = [
337
+ { prefix: 'nexus', getDb: getNexusNativeDb },
338
+ { prefix: 'signaldock', getDb: getGlobalSignaldockNativeDb }, // Activated T369 — global agent registry
339
+ ];
340
+
341
+ /**
342
+ * Resolve the global-tier backup directory, creating it on first use.
343
+ *
344
+ * Uses `cleoHomeOverride` when provided (test isolation) or falls back to
345
+ * `getCleoHome()` (XDG-compliant; never hardcodes `~/.cleo`).
346
+ */
347
+ function resolveGlobalBackupDir(cleoHomeOverride?: string): string {
348
+ const base = cleoHomeOverride ?? getCleoHome();
349
+ return join(base, 'backups', 'sqlite');
350
+ }
351
+
352
+ /**
353
+ * Snapshot a global-tier SQLite database via VACUUM INTO.
354
+ *
355
+ * Writes to `$XDG_DATA_HOME/cleo/backups/sqlite/<dbName>-YYYYMMDD-HHmmss.db`
356
+ * and enforces a per-prefix rotation window (default 10 snapshots).
357
+ *
358
+ * Non-fatal: errors from any individual step are surfaced via the return value
359
+ * but never thrown — a failed snapshot MUST NOT interrupt normal operation.
360
+ *
361
+ * @param dbName - Which global-tier DB to snapshot (`'nexus'` or `'signaldock'`)
362
+ * @param opts.rotation - Maximum retained snapshots per prefix (default 10)
363
+ * @param opts.cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
364
+ * @returns Object containing the new snapshot path and any rotated (deleted) file paths
365
+ *
366
+ * @task T306
367
+ * @task T369 — activated signaldock target (epic T310)
368
+ * @epic T299
369
+ * @why ADR-036 §Backup Mechanism requires VACUUM INTO rotation at the global tier;
370
+ * nexus.db has zero backup coverage prior to v2026.4.11.
371
+ */
372
+ export async function vacuumIntoGlobalBackup(
373
+ dbName: 'nexus' | 'signaldock',
374
+ opts?: { rotation?: number; cleoHomeOverride?: string },
375
+ ): Promise<{ snapshotPath: string; rotated: string[] }> {
376
+ const maxSnaps = opts?.rotation ?? MAX_SNAPSHOTS;
377
+ const backupDir = resolveGlobalBackupDir(opts?.cleoHomeOverride);
378
+
379
+ mkdirSync(backupDir, { recursive: true });
380
+
381
+ const target = GLOBAL_SNAPSHOT_TARGETS.find((t) => t.prefix === dbName);
382
+ if (!target) {
383
+ return { snapshotPath: '', rotated: [] };
384
+ }
385
+
386
+ const db = target.getDb();
387
+ if (!db) {
388
+ return { snapshotPath: '', rotated: [] };
389
+ }
390
+
391
+ const now = new Date();
392
+ const snapshotName = `${dbName}-${formatTimestamp(now)}.db`;
393
+ const snapshotPath = join(backupDir, snapshotName);
394
+
395
+ // Collect files that will be rotated out before writing the new one.
396
+ const rotated: string[] = [];
397
+ try {
398
+ const pattern = snapshotPattern(dbName);
399
+ const existing = readdirSync(backupDir)
400
+ .filter((f) => pattern.test(f))
401
+ .map((f) => ({
402
+ name: f,
403
+ path: join(backupDir, f),
404
+ mtimeMs: statSync(join(backupDir, f)).mtimeMs,
405
+ }))
406
+ .sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first
407
+
408
+ // Remove oldest until we have room for the new snapshot.
409
+ while (existing.length >= maxSnaps) {
410
+ const oldest = existing.shift();
411
+ if (!oldest) break;
412
+ try {
413
+ unlinkSync(oldest.path);
414
+ rotated.push(oldest.path);
415
+ } catch {
416
+ // non-fatal rotation failure
417
+ }
418
+ }
419
+ } catch {
420
+ // non-fatal — continue even if rotation enumeration fails
421
+ }
422
+
423
+ // Checkpoint then VACUUM INTO for a WAL-free, atomic snapshot.
424
+ db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
425
+ const safeDest = snapshotPath.replace(/'/g, "''");
426
+ db.exec(`VACUUM INTO '${safeDest}'`);
427
+
428
+ return { snapshotPath, rotated };
429
+ }
430
+
431
+ /**
432
+ * A single entry returned by {@link listGlobalSqliteBackups}.
433
+ *
434
+ * @task T306
435
+ * @epic T299
436
+ */
437
+ export interface GlobalBackupEntry {
438
+ /** Snapshot filename, e.g. `nexus-20260408-143022.db`. */
439
+ name: string;
440
+ /** Absolute path to the snapshot file. */
441
+ path: string;
442
+ /** File size in bytes. */
443
+ size: number;
444
+ /** Last-modified timestamp. */
445
+ mtime: Date;
446
+ }
447
+
448
+ /**
449
+ * List global-tier SQLite backups from `$XDG_DATA_HOME/cleo/backups/sqlite/`,
450
+ * optionally filtered by prefix (e.g. `'nexus'`). Sorted newest-first by mtime.
451
+ *
452
+ * Returns an empty array when the backup directory does not exist.
453
+ *
454
+ * @param prefix - Optional prefix filter; when omitted all `.db` snapshot files are listed
455
+ * @param cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
456
+ *
457
+ * @task T306
458
+ * @epic T299
459
+ */
460
+ export function listGlobalSqliteBackups(
461
+ prefix?: string,
462
+ cleoHomeOverride?: string,
463
+ ): GlobalBackupEntry[] {
464
+ try {
465
+ const backupDir = resolveGlobalBackupDir(cleoHomeOverride);
466
+ if (!existsSync(backupDir)) return [];
467
+
468
+ const pattern = prefix ? snapshotPattern(prefix) : /^[a-zA-Z0-9_-]+-\d{8}-\d{6}\.db$/;
469
+
470
+ return readdirSync(backupDir)
471
+ .filter((f) => pattern.test(f))
472
+ .map((f) => {
473
+ const filePath = join(backupDir, f);
474
+ const s = statSync(filePath);
475
+ return { name: f, path: filePath, size: s.size, mtime: new Date(s.mtimeMs) };
476
+ })
477
+ .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); // newest first
478
+ } catch {
479
+ return [];
480
+ }
481
+ }
482
+
483
+ // ============================================================================
484
+ // Global-salt raw-file backup (ADR-037 §5)
485
+ // @task T369
486
+ // @epic T310
487
+ // ============================================================================
488
+
489
+ /** Filename prefix for global-salt backup files. */
490
+ const GLOBAL_SALT_BACKUP_PREFIX = 'global-salt';
491
+
492
+ /** Regex matching global-salt backup filenames: `global-salt-YYYYMMDD-HHmmss`. */
493
+ const GLOBAL_SALT_BACKUP_PATTERN = /^global-salt-\d{8}-\d{6}$/;
494
+
495
+ /**
496
+ * Resolve the backup directory for global-salt files: `{cleoHome}/backups/`.
497
+ * Global-salt backups live directly under `backups/` (not `backups/sqlite/`)
498
+ * to make clear they are binary files, not SQLite databases.
499
+ */
500
+ function resolveGlobalSaltBackupDir(cleoHomeOverride?: string): string {
501
+ const base = cleoHomeOverride ?? getCleoHome();
502
+ return join(base, 'backups');
503
+ }
504
+
505
+ /**
506
+ * Rotate global-salt backup files: delete the oldest until fewer than
507
+ * {@link MAX_SNAPSHOTS} remain. Returns the paths of deleted files.
508
+ * Non-fatal on any filesystem error.
509
+ */
510
+ function rotateGlobalSaltBackups(backupDir: string): string[] {
511
+ const rotated: string[] = [];
512
+ try {
513
+ const files = readdirSync(backupDir)
514
+ .filter((f) => GLOBAL_SALT_BACKUP_PATTERN.test(f))
515
+ .map((f) => ({
516
+ name: f,
517
+ path: join(backupDir, f),
518
+ mtimeMs: statSync(join(backupDir, f)).mtimeMs,
519
+ }))
520
+ .sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first
521
+
522
+ while (files.length >= MAX_SNAPSHOTS) {
523
+ const oldest = files.shift();
524
+ if (!oldest) break;
525
+ try {
526
+ unlinkSync(oldest.path);
527
+ rotated.push(oldest.path);
528
+ } catch {
529
+ // non-fatal rotation failure
530
+ }
531
+ }
532
+ } catch {
533
+ // non-fatal
534
+ }
535
+ return rotated;
536
+ }
537
+
538
+ /**
539
+ * Creates a raw-file backup of the global-salt binary at
540
+ * `${getCleoHome()}/backups/global-salt-YYYYMMDD-HHmmss` with `0o600`
541
+ * permissions. Rotates to {@link MAX_SNAPSHOTS} (10) copies, deleting the
542
+ * oldest when the limit is reached.
543
+ *
544
+ * Non-fatal: errors are swallowed — salt backup failure must never block cleo.
545
+ * Returns empty strings and no rotated paths on failure.
546
+ *
547
+ * @param opts.cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
548
+ * @returns Object with the new snapshot path and any rotated (deleted) file paths
549
+ *
550
+ * @task T369
551
+ * @epic T310
552
+ * @why ADR-037 §5 — global-salt is security-critical; losing it invalidates
553
+ * all API keys. Backup enables recovery from accidental deletion.
554
+ */
555
+ export async function backupGlobalSalt(opts?: {
556
+ cleoHomeOverride?: string;
557
+ }): Promise<{ snapshotPath: string; rotated: string[] }> {
558
+ try {
559
+ const cleoHome = opts?.cleoHomeOverride ?? getCleoHome();
560
+ const saltSourcePath = opts?.cleoHomeOverride
561
+ ? join(cleoHome, 'global-salt')
562
+ : getGlobalSaltPath();
563
+
564
+ if (!existsSync(saltSourcePath)) {
565
+ return { snapshotPath: '', rotated: [] };
566
+ }
567
+
568
+ const backupDir = resolveGlobalSaltBackupDir(opts?.cleoHomeOverride);
569
+ mkdirSync(backupDir, { recursive: true });
570
+
571
+ const rotated = rotateGlobalSaltBackups(backupDir);
572
+
573
+ const snapshotName = `${GLOBAL_SALT_BACKUP_PREFIX}-${formatTimestamp(new Date())}`;
574
+ const snapshotPath = join(backupDir, snapshotName);
575
+
576
+ copyFileSync(saltSourcePath, snapshotPath);
577
+ chmodSync(snapshotPath, 0o600);
578
+
579
+ return { snapshotPath, rotated };
580
+ } catch {
581
+ // non-fatal — backup failure must never interrupt normal operation
582
+ return { snapshotPath: '', rotated: [] };
583
+ }
584
+ }
585
+
586
+ /**
587
+ * A single entry returned by {@link listGlobalSaltBackups}.
588
+ *
589
+ * @task T369
590
+ * @epic T310
591
+ */
592
+ export interface GlobalSaltBackupEntry {
593
+ /** Backup filename, e.g. `global-salt-20260408-143022`. */
594
+ name: string;
595
+ /** Absolute path to the backup file. */
596
+ path: string;
597
+ /** File size in bytes (should be 32 for a valid global-salt). */
598
+ size: number;
599
+ /** Last-modified timestamp. */
600
+ mtime: Date;
601
+ }
602
+
603
+ /**
604
+ * List global-salt backup files from `$XDG_DATA_HOME/cleo/backups/`, sorted
605
+ * newest-first by mtime.
606
+ *
607
+ * Returns an empty array when the backup directory does not exist.
608
+ *
609
+ * @param cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
610
+ *
611
+ * @task T369
612
+ * @epic T310
613
+ */
614
+ export function listGlobalSaltBackups(cleoHomeOverride?: string): GlobalSaltBackupEntry[] {
615
+ try {
616
+ const backupDir = resolveGlobalSaltBackupDir(cleoHomeOverride);
617
+ if (!existsSync(backupDir)) return [];
618
+
619
+ return readdirSync(backupDir)
620
+ .filter((f) => GLOBAL_SALT_BACKUP_PATTERN.test(f))
621
+ .map((f) => {
622
+ const filePath = join(backupDir, f);
623
+ const s = statSync(filePath);
624
+ return { name: f, path: filePath, size: s.size, mtime: new Date(s.mtimeMs) };
625
+ })
626
+ .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); // newest first
627
+ } catch {
628
+ return [];
629
+ }
630
+ }