@cleocode/core 2026.3.56 → 2026.3.58

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 (893) 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-schema.d.ts.map +1 -1
  40. package/dist/agents/agent-schema.js +80 -0
  41. package/dist/agents/agent-schema.js.map +1 -0
  42. package/dist/agents/capacity.js +116 -0
  43. package/dist/agents/capacity.js.map +1 -0
  44. package/dist/agents/execution-learning.d.ts +223 -0
  45. package/dist/agents/execution-learning.d.ts.map +1 -0
  46. package/dist/agents/index.d.ts +1 -0
  47. package/dist/agents/index.d.ts.map +1 -1
  48. package/dist/agents/index.js +21 -0
  49. package/dist/agents/index.js.map +1 -0
  50. package/dist/agents/registry.js +314 -0
  51. package/dist/agents/registry.js.map +1 -0
  52. package/dist/agents/retry.js +176 -0
  53. package/dist/agents/retry.js.map +1 -0
  54. package/dist/audit-prune.js +94 -0
  55. package/dist/audit-prune.js.map +1 -0
  56. package/dist/audit.js +68 -0
  57. package/dist/audit.js.map +1 -0
  58. package/dist/backfill/index.d.ts +56 -0
  59. package/dist/backfill/index.d.ts.map +1 -0
  60. package/dist/bootstrap.d.ts +1 -1
  61. package/dist/bootstrap.js +260 -0
  62. package/dist/bootstrap.js.map +1 -0
  63. package/dist/caamp/adapter.js +434 -0
  64. package/dist/caamp/adapter.js.map +1 -0
  65. package/dist/caamp/capability-check.js +38 -0
  66. package/dist/caamp/capability-check.js.map +1 -0
  67. package/dist/caamp/index.js +23 -0
  68. package/dist/caamp/index.js.map +1 -0
  69. package/dist/caamp-init.js +16 -0
  70. package/dist/caamp-init.js.map +1 -0
  71. package/dist/cleo.js +267 -0
  72. package/dist/cleo.js.map +1 -0
  73. package/dist/codebase-map/analyzers/architecture.js +130 -0
  74. package/dist/codebase-map/analyzers/architecture.js.map +1 -0
  75. package/dist/codebase-map/analyzers/concerns.js +122 -0
  76. package/dist/codebase-map/analyzers/concerns.js.map +1 -0
  77. package/dist/codebase-map/analyzers/conventions.js +149 -0
  78. package/dist/codebase-map/analyzers/conventions.js.map +1 -0
  79. package/dist/codebase-map/analyzers/integrations.js +108 -0
  80. package/dist/codebase-map/analyzers/integrations.js.map +1 -0
  81. package/dist/codebase-map/analyzers/stack.js +117 -0
  82. package/dist/codebase-map/analyzers/stack.js.map +1 -0
  83. package/dist/codebase-map/analyzers/structure.js +137 -0
  84. package/dist/codebase-map/analyzers/structure.js.map +1 -0
  85. package/dist/codebase-map/analyzers/testing.js +118 -0
  86. package/dist/codebase-map/analyzers/testing.js.map +1 -0
  87. package/dist/codebase-map/index.js +57 -0
  88. package/dist/codebase-map/index.js.map +1 -0
  89. package/dist/codebase-map/store.js +122 -0
  90. package/dist/codebase-map/store.js.map +1 -0
  91. package/dist/codebase-map/summary.js +152 -0
  92. package/dist/codebase-map/summary.js.map +1 -0
  93. package/dist/compliance/index.js +288 -0
  94. package/dist/compliance/index.js.map +1 -0
  95. package/dist/compliance/protocol-enforcement.js +332 -0
  96. package/dist/compliance/protocol-enforcement.js.map +1 -0
  97. package/dist/compliance/protocol-rules.js +786 -0
  98. package/dist/compliance/protocol-rules.js.map +1 -0
  99. package/dist/compliance/protocol-types.js +80 -0
  100. package/dist/compliance/protocol-types.js.map +1 -0
  101. package/dist/compliance/store.js +53 -0
  102. package/dist/compliance/store.js.map +1 -0
  103. package/dist/config/build-config.js +29 -0
  104. package/dist/config/build-config.js.map +1 -0
  105. package/dist/config.d.ts +47 -0
  106. package/dist/config.d.ts.map +1 -1
  107. package/dist/config.js +287 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/constants.js +18 -0
  110. package/dist/constants.js.map +1 -0
  111. package/dist/context/index.js +137 -0
  112. package/dist/context/index.js.map +1 -0
  113. package/dist/engine-result.js +12 -0
  114. package/dist/engine-result.js.map +1 -0
  115. package/dist/error-catalog.js +404 -0
  116. package/dist/error-catalog.js.map +1 -0
  117. package/dist/error-registry.js +393 -0
  118. package/dist/error-registry.js.map +1 -0
  119. package/dist/errors.js +167 -0
  120. package/dist/errors.js.map +1 -0
  121. package/dist/hooks/handlers/error-hooks.js +43 -0
  122. package/dist/hooks/handlers/error-hooks.js.map +1 -0
  123. package/dist/hooks/handlers/file-hooks.js +80 -0
  124. package/dist/hooks/handlers/file-hooks.js.map +1 -0
  125. package/dist/hooks/handlers/index.js +19 -0
  126. package/dist/hooks/handlers/index.js.map +1 -0
  127. package/dist/hooks/handlers/mcp-hooks.js +80 -0
  128. package/dist/hooks/handlers/mcp-hooks.js.map +1 -0
  129. package/dist/hooks/handlers/session-hooks.js +73 -0
  130. package/dist/hooks/handlers/session-hooks.js.map +1 -0
  131. package/dist/hooks/handlers/task-hooks.js +63 -0
  132. package/dist/hooks/handlers/task-hooks.js.map +1 -0
  133. package/dist/hooks/index.js +13 -0
  134. package/dist/hooks/index.js.map +1 -0
  135. package/dist/hooks/payload-schemas.js +163 -0
  136. package/dist/hooks/payload-schemas.js.map +1 -0
  137. package/dist/hooks/provider-hooks.js +34 -0
  138. package/dist/hooks/provider-hooks.js.map +1 -0
  139. package/dist/hooks/registry.js +176 -0
  140. package/dist/hooks/registry.js.map +1 -0
  141. package/dist/hooks/types.js +62 -0
  142. package/dist/hooks/types.js.map +1 -0
  143. package/dist/hooks.js +136 -0
  144. package/dist/hooks.js.map +1 -0
  145. package/dist/index.d.ts +1 -1
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +6567 -5024
  148. package/dist/index.js.map +4 -4
  149. package/dist/init.js +711 -0
  150. package/dist/init.js.map +1 -0
  151. package/dist/inject/index.js +82 -0
  152. package/dist/inject/index.js.map +1 -0
  153. package/dist/injection.js +343 -0
  154. package/dist/injection.js.map +1 -0
  155. package/dist/intelligence/adaptive-validation.d.ts +151 -0
  156. package/dist/intelligence/adaptive-validation.d.ts.map +1 -0
  157. package/dist/intelligence/impact.js +499 -0
  158. package/dist/intelligence/impact.js.map +1 -0
  159. package/dist/intelligence/index.d.ts +5 -0
  160. package/dist/intelligence/index.d.ts.map +1 -1
  161. package/dist/intelligence/index.js +17 -0
  162. package/dist/intelligence/index.js.map +1 -0
  163. package/dist/intelligence/patterns.js +492 -0
  164. package/dist/intelligence/patterns.js.map +1 -0
  165. package/dist/intelligence/prediction.js +499 -0
  166. package/dist/intelligence/prediction.js.map +1 -0
  167. package/dist/intelligence/types.js +13 -0
  168. package/dist/intelligence/types.js.map +1 -0
  169. package/dist/internal.d.ts +5 -2
  170. package/dist/internal.d.ts.map +1 -1
  171. package/dist/internal.js +258 -0
  172. package/dist/internal.js.map +1 -0
  173. package/dist/issue/create.js +121 -0
  174. package/dist/issue/create.js.map +1 -0
  175. package/dist/issue/diagnostics.js +59 -0
  176. package/dist/issue/diagnostics.js.map +1 -0
  177. package/dist/issue/index.js +10 -0
  178. package/dist/issue/index.js.map +1 -0
  179. package/dist/issue/template-parser.js +267 -0
  180. package/dist/issue/template-parser.js.map +1 -0
  181. package/dist/json-schema-validator.js +76 -0
  182. package/dist/json-schema-validator.js.map +1 -0
  183. package/dist/lifecycle/chain-composition.js +152 -0
  184. package/dist/lifecycle/chain-composition.js.map +1 -0
  185. package/dist/lifecycle/chain-store.js +246 -0
  186. package/dist/lifecycle/chain-store.js.map +1 -0
  187. package/dist/lifecycle/consolidate-rcasd.js +352 -0
  188. package/dist/lifecycle/consolidate-rcasd.js.map +1 -0
  189. package/dist/lifecycle/default-chain.js +167 -0
  190. package/dist/lifecycle/default-chain.js.map +1 -0
  191. package/dist/lifecycle/evidence.js +180 -0
  192. package/dist/lifecycle/evidence.js.map +1 -0
  193. package/dist/lifecycle/frontmatter.js +363 -0
  194. package/dist/lifecycle/frontmatter.js.map +1 -0
  195. package/dist/lifecycle/index.js +753 -0
  196. package/dist/lifecycle/index.js.map +1 -0
  197. package/dist/lifecycle/pipeline.js +656 -0
  198. package/dist/lifecycle/pipeline.js.map +1 -0
  199. package/dist/lifecycle/rcasd-index.js +326 -0
  200. package/dist/lifecycle/rcasd-index.js.map +1 -0
  201. package/dist/lifecycle/rcasd-paths.js +220 -0
  202. package/dist/lifecycle/rcasd-paths.js.map +1 -0
  203. package/dist/lifecycle/resume.js +864 -0
  204. package/dist/lifecycle/resume.js.map +1 -0
  205. package/dist/lifecycle/stage-artifacts.js +94 -0
  206. package/dist/lifecycle/stage-artifacts.js.map +1 -0
  207. package/dist/lifecycle/stages.js +534 -0
  208. package/dist/lifecycle/stages.js.map +1 -0
  209. package/dist/lifecycle/state-machine.js +516 -0
  210. package/dist/lifecycle/state-machine.js.map +1 -0
  211. package/dist/lifecycle/tessera-engine.js +249 -0
  212. package/dist/lifecycle/tessera-engine.js.map +1 -0
  213. package/dist/logger.js +140 -0
  214. package/dist/logger.js.map +1 -0
  215. package/dist/mcp/index.js +146 -0
  216. package/dist/mcp/index.js.map +1 -0
  217. package/dist/memory/auto-extract.js +143 -0
  218. package/dist/memory/auto-extract.js.map +1 -0
  219. package/dist/memory/brain-embedding.js +49 -0
  220. package/dist/memory/brain-embedding.js.map +1 -0
  221. package/dist/memory/brain-lifecycle.js +298 -0
  222. package/dist/memory/brain-lifecycle.js.map +1 -0
  223. package/dist/memory/brain-links.js +148 -0
  224. package/dist/memory/brain-links.js.map +1 -0
  225. package/dist/memory/brain-migration.js +149 -0
  226. package/dist/memory/brain-migration.js.map +1 -0
  227. package/dist/memory/brain-reasoning.js +215 -0
  228. package/dist/memory/brain-reasoning.js.map +1 -0
  229. package/dist/memory/brain-retrieval.js +474 -0
  230. package/dist/memory/brain-retrieval.js.map +1 -0
  231. package/dist/memory/brain-row-types.js +10 -0
  232. package/dist/memory/brain-row-types.js.map +1 -0
  233. package/dist/memory/brain-search.js +519 -0
  234. package/dist/memory/brain-search.js.map +1 -0
  235. package/dist/memory/brain-similarity.js +145 -0
  236. package/dist/memory/brain-similarity.js.map +1 -0
  237. package/dist/memory/claude-mem-migration.js +277 -0
  238. package/dist/memory/claude-mem-migration.js.map +1 -0
  239. package/dist/memory/decisions.js +148 -0
  240. package/dist/memory/decisions.js.map +1 -0
  241. package/dist/memory/engine-compat.js +1030 -0
  242. package/dist/memory/engine-compat.js.map +1 -0
  243. package/dist/memory/index.js +773 -0
  244. package/dist/memory/index.js.map +1 -0
  245. package/dist/memory/learnings.js +121 -0
  246. package/dist/memory/learnings.js.map +1 -0
  247. package/dist/memory/memory-bridge.js +289 -0
  248. package/dist/memory/memory-bridge.js.map +1 -0
  249. package/dist/memory/patterns.js +122 -0
  250. package/dist/memory/patterns.js.map +1 -0
  251. package/dist/memory/pipeline-manifest-sqlite.js +975 -0
  252. package/dist/memory/pipeline-manifest-sqlite.js.map +1 -0
  253. package/dist/memory/session-memory.js +226 -0
  254. package/dist/memory/session-memory.js.map +1 -0
  255. package/dist/metrics/ab-test.js +260 -0
  256. package/dist/metrics/ab-test.js.map +1 -0
  257. package/dist/metrics/aggregation.js +363 -0
  258. package/dist/metrics/aggregation.js.map +1 -0
  259. package/dist/metrics/common.js +64 -0
  260. package/dist/metrics/common.js.map +1 -0
  261. package/dist/metrics/enums.js +78 -0
  262. package/dist/metrics/enums.js.map +1 -0
  263. package/dist/metrics/index.js +19 -0
  264. package/dist/metrics/index.js.map +1 -0
  265. package/dist/metrics/model-provider-registry.js +88 -0
  266. package/dist/metrics/model-provider-registry.js.map +1 -0
  267. package/dist/metrics/otel-integration.js +263 -0
  268. package/dist/metrics/otel-integration.js.map +1 -0
  269. package/dist/metrics/provider-detection.js +103 -0
  270. package/dist/metrics/provider-detection.js.map +1 -0
  271. package/dist/metrics/token-estimation.js +253 -0
  272. package/dist/metrics/token-estimation.js.map +1 -0
  273. package/dist/metrics/token-service.js +450 -0
  274. package/dist/metrics/token-service.js.map +1 -0
  275. package/dist/migration/agent-outputs.js +316 -0
  276. package/dist/migration/agent-outputs.js.map +1 -0
  277. package/dist/migration/checksum.js +92 -0
  278. package/dist/migration/checksum.js.map +1 -0
  279. package/dist/migration/index.js +282 -0
  280. package/dist/migration/index.js.map +1 -0
  281. package/dist/migration/logger.js +360 -0
  282. package/dist/migration/logger.js.map +1 -0
  283. package/dist/migration/preflight.js +9 -0
  284. package/dist/migration/preflight.js.map +1 -0
  285. package/dist/migration/state.js +421 -0
  286. package/dist/migration/state.js.map +1 -0
  287. package/dist/migration/validate.js +241 -0
  288. package/dist/migration/validate.js.map +1 -0
  289. package/dist/nexus/deps.js +375 -0
  290. package/dist/nexus/deps.js.map +1 -0
  291. package/dist/nexus/discover.js +288 -0
  292. package/dist/nexus/discover.js.map +1 -0
  293. package/dist/nexus/hash.js +10 -0
  294. package/dist/nexus/hash.js.map +1 -0
  295. package/dist/nexus/index.js +38 -0
  296. package/dist/nexus/index.js.map +1 -0
  297. package/dist/nexus/migrate-json-to-sqlite.js +115 -0
  298. package/dist/nexus/migrate-json-to-sqlite.js.map +1 -0
  299. package/dist/nexus/permissions.js +105 -0
  300. package/dist/nexus/permissions.js.map +1 -0
  301. package/dist/nexus/query.js +175 -0
  302. package/dist/nexus/query.js.map +1 -0
  303. package/dist/nexus/registry.js +584 -0
  304. package/dist/nexus/registry.js.map +1 -0
  305. package/dist/nexus/sharing/index.js +179 -0
  306. package/dist/nexus/sharing/index.js.map +1 -0
  307. package/dist/nexus/transfer-types.js +8 -0
  308. package/dist/nexus/transfer-types.js.map +1 -0
  309. package/dist/nexus/transfer.js +263 -0
  310. package/dist/nexus/transfer.js.map +1 -0
  311. package/dist/observability/index.js +103 -0
  312. package/dist/observability/index.js.map +1 -0
  313. package/dist/observability/log-filter.js +63 -0
  314. package/dist/observability/log-filter.js.map +1 -0
  315. package/dist/observability/log-parser.js +99 -0
  316. package/dist/observability/log-parser.js.map +1 -0
  317. package/dist/observability/log-reader.js +139 -0
  318. package/dist/observability/log-reader.js.map +1 -0
  319. package/dist/observability/types.js +19 -0
  320. package/dist/observability/types.js.map +1 -0
  321. package/dist/orchestration/analyze.js +107 -0
  322. package/dist/orchestration/analyze.js.map +1 -0
  323. package/dist/orchestration/bootstrap.js +132 -0
  324. package/dist/orchestration/bootstrap.js.map +1 -0
  325. package/dist/orchestration/context.js +56 -0
  326. package/dist/orchestration/context.js.map +1 -0
  327. package/dist/orchestration/critical-path.js +100 -0
  328. package/dist/orchestration/critical-path.js.map +1 -0
  329. package/dist/orchestration/index.js +286 -0
  330. package/dist/orchestration/index.js.map +1 -0
  331. package/dist/orchestration/parallel.js +89 -0
  332. package/dist/orchestration/parallel.js.map +1 -0
  333. package/dist/orchestration/protocol-validators.js +524 -0
  334. package/dist/orchestration/protocol-validators.js.map +1 -0
  335. package/dist/orchestration/skill-ops.js +98 -0
  336. package/dist/orchestration/skill-ops.js.map +1 -0
  337. package/dist/orchestration/status.js +107 -0
  338. package/dist/orchestration/status.js.map +1 -0
  339. package/dist/orchestration/unblock.js +103 -0
  340. package/dist/orchestration/unblock.js.map +1 -0
  341. package/dist/orchestration/validate-spawn.js +67 -0
  342. package/dist/orchestration/validate-spawn.js.map +1 -0
  343. package/dist/orchestration/waves.js +86 -0
  344. package/dist/orchestration/waves.js.map +1 -0
  345. package/dist/otel/index.js +163 -0
  346. package/dist/otel/index.js.map +1 -0
  347. package/dist/output.js +132 -0
  348. package/dist/output.js.map +1 -0
  349. package/dist/pagination.js +61 -0
  350. package/dist/pagination.js.map +1 -0
  351. package/dist/paths.js +337 -0
  352. package/dist/paths.js.map +1 -0
  353. package/dist/phases/deps.js +369 -0
  354. package/dist/phases/deps.js.map +1 -0
  355. package/dist/phases/index.js +349 -0
  356. package/dist/phases/index.js.map +1 -0
  357. package/dist/pipeline/index.js +10 -0
  358. package/dist/pipeline/index.js.map +1 -0
  359. package/dist/pipeline/phase.js +45 -0
  360. package/dist/pipeline/phase.js.map +1 -0
  361. package/dist/platform.js +211 -0
  362. package/dist/platform.js.map +1 -0
  363. package/dist/project-info.js +84 -0
  364. package/dist/project-info.js.map +1 -0
  365. package/dist/reconciliation/index.js +10 -0
  366. package/dist/reconciliation/index.js.map +1 -0
  367. package/dist/reconciliation/link-store.js +129 -0
  368. package/dist/reconciliation/link-store.js.map +1 -0
  369. package/dist/reconciliation/reconciliation-engine.js +298 -0
  370. package/dist/reconciliation/reconciliation-engine.js.map +1 -0
  371. package/dist/release/artifacts.js +427 -0
  372. package/dist/release/artifacts.js.map +1 -0
  373. package/dist/release/changelog-writer.js +151 -0
  374. package/dist/release/changelog-writer.js.map +1 -0
  375. package/dist/release/channel.js +144 -0
  376. package/dist/release/channel.js.map +1 -0
  377. package/dist/release/ci.js +166 -0
  378. package/dist/release/ci.js.map +1 -0
  379. package/dist/release/github-pr.js +225 -0
  380. package/dist/release/github-pr.js.map +1 -0
  381. package/dist/release/guards.js +116 -0
  382. package/dist/release/guards.js.map +1 -0
  383. package/dist/release/index.js +22 -0
  384. package/dist/release/index.js.map +1 -0
  385. package/dist/release/release-config.js +158 -0
  386. package/dist/release/release-config.js.map +1 -0
  387. package/dist/release/release-manifest.js +1019 -0
  388. package/dist/release/release-manifest.js.map +1 -0
  389. package/dist/release/version-bump.js +255 -0
  390. package/dist/release/version-bump.js.map +1 -0
  391. package/dist/remote/index.js +257 -0
  392. package/dist/remote/index.js.map +1 -0
  393. package/dist/repair.js +89 -0
  394. package/dist/repair.js.map +1 -0
  395. package/dist/research/index.js +2 -0
  396. package/dist/research/index.js.map +1 -0
  397. package/dist/roadmap/index.js +59 -0
  398. package/dist/roadmap/index.js.map +1 -0
  399. package/dist/routing/capability-matrix.js +1550 -0
  400. package/dist/routing/capability-matrix.js.map +1 -0
  401. package/dist/routing/index.js +9 -0
  402. package/dist/routing/index.js.map +1 -0
  403. package/dist/scaffold.js +1158 -0
  404. package/dist/scaffold.js.map +1 -0
  405. package/dist/schema-management.js +295 -0
  406. package/dist/schema-management.js.map +1 -0
  407. package/dist/security/index.js +9 -0
  408. package/dist/security/index.js.map +1 -0
  409. package/dist/security/input-sanitization.js +321 -0
  410. package/dist/security/input-sanitization.js.map +1 -0
  411. package/dist/sequence/index.js +295 -0
  412. package/dist/sequence/index.js.map +1 -0
  413. package/dist/sessions/assumptions.js +54 -0
  414. package/dist/sessions/assumptions.js.map +1 -0
  415. package/dist/sessions/briefing.js +377 -0
  416. package/dist/sessions/briefing.js.map +1 -0
  417. package/dist/sessions/context-alert.js +222 -0
  418. package/dist/sessions/context-alert.js.map +1 -0
  419. package/dist/sessions/context-inject.js +61 -0
  420. package/dist/sessions/context-inject.js.map +1 -0
  421. package/dist/sessions/context-monitor.js +98 -0
  422. package/dist/sessions/context-monitor.js.map +1 -0
  423. package/dist/sessions/decisions.js +65 -0
  424. package/dist/sessions/decisions.js.map +1 -0
  425. package/dist/sessions/find.js +63 -0
  426. package/dist/sessions/find.js.map +1 -0
  427. package/dist/sessions/handoff.js +328 -0
  428. package/dist/sessions/handoff.js.map +1 -0
  429. package/dist/sessions/hitl-warnings.js +254 -0
  430. package/dist/sessions/hitl-warnings.js.map +1 -0
  431. package/dist/sessions/index.js +318 -0
  432. package/dist/sessions/index.js.map +1 -0
  433. package/dist/sessions/session-archive.js +40 -0
  434. package/dist/sessions/session-archive.js.map +1 -0
  435. package/dist/sessions/session-cleanup.js +59 -0
  436. package/dist/sessions/session-cleanup.js.map +1 -0
  437. package/dist/sessions/session-drift.js +134 -0
  438. package/dist/sessions/session-drift.js.map +1 -0
  439. package/dist/sessions/session-enforcement.d.ts.map +1 -1
  440. package/dist/sessions/session-enforcement.js +140 -0
  441. package/dist/sessions/session-enforcement.js.map +1 -0
  442. package/dist/sessions/session-grade.js +253 -0
  443. package/dist/sessions/session-grade.js.map +1 -0
  444. package/dist/sessions/session-history.js +42 -0
  445. package/dist/sessions/session-history.js.map +1 -0
  446. package/dist/sessions/session-id.js +81 -0
  447. package/dist/sessions/session-id.js.map +1 -0
  448. package/dist/sessions/session-memory-bridge.js +52 -0
  449. package/dist/sessions/session-memory-bridge.js.map +1 -0
  450. package/dist/sessions/session-show.js +24 -0
  451. package/dist/sessions/session-show.js.map +1 -0
  452. package/dist/sessions/session-stats.js +69 -0
  453. package/dist/sessions/session-stats.js.map +1 -0
  454. package/dist/sessions/session-suspend.js +39 -0
  455. package/dist/sessions/session-suspend.js.map +1 -0
  456. package/dist/sessions/session-switch.js +51 -0
  457. package/dist/sessions/session-switch.js.map +1 -0
  458. package/dist/sessions/session-view.js +76 -0
  459. package/dist/sessions/session-view.js.map +1 -0
  460. package/dist/sessions/statusline-setup.js +85 -0
  461. package/dist/sessions/statusline-setup.js.map +1 -0
  462. package/dist/sessions/types.js +8 -0
  463. package/dist/sessions/types.js.map +1 -0
  464. package/dist/signaldock/claude-code-transport.js +107 -0
  465. package/dist/signaldock/claude-code-transport.js.map +1 -0
  466. package/dist/signaldock/factory.js +25 -0
  467. package/dist/signaldock/factory.js.map +1 -0
  468. package/dist/signaldock/index.js +9 -0
  469. package/dist/signaldock/index.js.map +1 -0
  470. package/dist/signaldock/signaldock-transport.js +122 -0
  471. package/dist/signaldock/signaldock-transport.js.map +1 -0
  472. package/dist/signaldock/transport.js +11 -0
  473. package/dist/signaldock/transport.js.map +1 -0
  474. package/dist/signaldock/types.js +11 -0
  475. package/dist/signaldock/types.js.map +1 -0
  476. package/dist/skills/agents/config.js +94 -0
  477. package/dist/skills/agents/config.js.map +1 -0
  478. package/dist/skills/agents/install.js +116 -0
  479. package/dist/skills/agents/install.js.map +1 -0
  480. package/dist/skills/agents/registry.js +161 -0
  481. package/dist/skills/agents/registry.js.map +1 -0
  482. package/dist/skills/discovery.js +333 -0
  483. package/dist/skills/discovery.js.map +1 -0
  484. package/dist/skills/dispatch.js +347 -0
  485. package/dist/skills/dispatch.js.map +1 -0
  486. package/dist/skills/dynamic-skill-generator.js +100 -0
  487. package/dist/skills/dynamic-skill-generator.js.map +1 -0
  488. package/dist/skills/index.js +44 -0
  489. package/dist/skills/index.js.map +1 -0
  490. package/dist/skills/injection/subagent.js +195 -0
  491. package/dist/skills/injection/subagent.js.map +1 -0
  492. package/dist/skills/injection/token.js +260 -0
  493. package/dist/skills/injection/token.js.map +1 -0
  494. package/dist/skills/install.js +40 -0
  495. package/dist/skills/install.js.map +1 -0
  496. package/dist/skills/manifests/contribution.js +175 -0
  497. package/dist/skills/manifests/contribution.js.map +1 -0
  498. package/dist/skills/manifests/research.js +281 -0
  499. package/dist/skills/manifests/research.js.map +1 -0
  500. package/dist/skills/manifests/resolver.js +146 -0
  501. package/dist/skills/manifests/resolver.js.map +1 -0
  502. package/dist/skills/marketplace.js +90 -0
  503. package/dist/skills/marketplace.js.map +1 -0
  504. package/dist/skills/orchestrator/spawn.js +178 -0
  505. package/dist/skills/orchestrator/spawn.js.map +1 -0
  506. package/dist/skills/orchestrator/startup.js +451 -0
  507. package/dist/skills/orchestrator/startup.js.map +1 -0
  508. package/dist/skills/orchestrator/validator.js +301 -0
  509. package/dist/skills/orchestrator/validator.js.map +1 -0
  510. package/dist/skills/precedence-integration.js +73 -0
  511. package/dist/skills/precedence-integration.js.map +1 -0
  512. package/dist/skills/precedence-types.js +16 -0
  513. package/dist/skills/precedence-types.js.map +1 -0
  514. package/dist/skills/routing-table.js +63 -0
  515. package/dist/skills/routing-table.js.map +1 -0
  516. package/dist/skills/skill-paths.js +220 -0
  517. package/dist/skills/skill-paths.js.map +1 -0
  518. package/dist/skills/test-utility.js +55 -0
  519. package/dist/skills/test-utility.js.map +1 -0
  520. package/dist/skills/types.js +118 -0
  521. package/dist/skills/types.js.map +1 -0
  522. package/dist/skills/validation.js +183 -0
  523. package/dist/skills/validation.js.map +1 -0
  524. package/dist/skills/version.js +57 -0
  525. package/dist/skills/version.js.map +1 -0
  526. package/dist/snapshot/index.js +188 -0
  527. package/dist/snapshot/index.js.map +1 -0
  528. package/dist/spawn/adapter-registry.js +246 -0
  529. package/dist/spawn/adapter-registry.js.map +1 -0
  530. package/dist/spawn/index.js +10 -0
  531. package/dist/spawn/index.js.map +1 -0
  532. package/dist/stats/index.d.ts +1 -0
  533. package/dist/stats/index.d.ts.map +1 -1
  534. package/dist/stats/index.js +339 -0
  535. package/dist/stats/index.js.map +1 -0
  536. package/dist/stats/workflow-telemetry.d.ts +74 -0
  537. package/dist/stats/workflow-telemetry.d.ts.map +1 -0
  538. package/dist/sticky/archive.js +47 -0
  539. package/dist/sticky/archive.js.map +1 -0
  540. package/dist/sticky/convert.js +235 -0
  541. package/dist/sticky/convert.js.map +1 -0
  542. package/dist/sticky/create.js +48 -0
  543. package/dist/sticky/create.js.map +1 -0
  544. package/dist/sticky/id.js +35 -0
  545. package/dist/sticky/id.js.map +1 -0
  546. package/dist/sticky/index.js +16 -0
  547. package/dist/sticky/index.js.map +1 -0
  548. package/dist/sticky/list.js +44 -0
  549. package/dist/sticky/list.js.map +1 -0
  550. package/dist/sticky/purge.js +45 -0
  551. package/dist/sticky/purge.js.map +1 -0
  552. package/dist/sticky/show.js +42 -0
  553. package/dist/sticky/show.js.map +1 -0
  554. package/dist/sticky/types.js +10 -0
  555. package/dist/sticky/types.js.map +1 -0
  556. package/dist/store/atomic.js +167 -0
  557. package/dist/store/atomic.js.map +1 -0
  558. package/dist/store/backup.js +94 -0
  559. package/dist/store/backup.js.map +1 -0
  560. package/dist/store/brain-accessor.js +397 -0
  561. package/dist/store/brain-accessor.js.map +1 -0
  562. package/dist/store/brain-schema.d.ts.map +1 -1
  563. package/dist/store/brain-schema.js +212 -0
  564. package/dist/store/brain-schema.js.map +1 -0
  565. package/dist/store/brain-sqlite.js +271 -0
  566. package/dist/store/brain-sqlite.js.map +1 -0
  567. package/dist/store/cache.js +168 -0
  568. package/dist/store/cache.js.map +1 -0
  569. package/dist/store/chain-schema.js +51 -0
  570. package/dist/store/chain-schema.js.map +1 -0
  571. package/dist/store/converters.d.ts.map +1 -1
  572. package/dist/store/converters.js +120 -0
  573. package/dist/store/converters.js.map +1 -0
  574. package/dist/store/cross-db-cleanup.d.ts +58 -0
  575. package/dist/store/cross-db-cleanup.d.ts.map +1 -0
  576. package/dist/store/data-accessor.js +26 -0
  577. package/dist/store/data-accessor.js.map +1 -0
  578. package/dist/store/data-safety-central.js +269 -0
  579. package/dist/store/data-safety-central.js.map +1 -0
  580. package/dist/store/data-safety.js +274 -0
  581. package/dist/store/data-safety.js.map +1 -0
  582. package/dist/store/db-helpers.d.ts.map +1 -1
  583. package/dist/store/db-helpers.js +221 -0
  584. package/dist/store/db-helpers.js.map +1 -0
  585. package/dist/store/export.js +155 -0
  586. package/dist/store/export.js.map +1 -0
  587. package/dist/store/file-utils.js +270 -0
  588. package/dist/store/file-utils.js.map +1 -0
  589. package/dist/store/git-checkpoint.js +365 -0
  590. package/dist/store/git-checkpoint.js.map +1 -0
  591. package/dist/store/import-logging.js +139 -0
  592. package/dist/store/import-logging.js.map +1 -0
  593. package/dist/store/import-remap.js +145 -0
  594. package/dist/store/import-remap.js.map +1 -0
  595. package/dist/store/import-sort.js +121 -0
  596. package/dist/store/import-sort.js.map +1 -0
  597. package/dist/store/index.js +28 -0
  598. package/dist/store/index.js.map +1 -0
  599. package/dist/store/json.js +208 -0
  600. package/dist/store/json.js.map +1 -0
  601. package/dist/store/lifecycle-store.js +249 -0
  602. package/dist/store/lifecycle-store.js.map +1 -0
  603. package/dist/store/lock.js +70 -0
  604. package/dist/store/lock.js.map +1 -0
  605. package/dist/store/migration-sqlite.d.ts.map +1 -1
  606. package/dist/store/migration-sqlite.js +671 -0
  607. package/dist/store/migration-sqlite.js.map +1 -0
  608. package/dist/store/nexus-schema.js +62 -0
  609. package/dist/store/nexus-schema.js.map +1 -0
  610. package/dist/store/nexus-sqlite.js +217 -0
  611. package/dist/store/nexus-sqlite.js.map +1 -0
  612. package/dist/store/nexus-validation-schemas.js +40 -0
  613. package/dist/store/nexus-validation-schemas.js.map +1 -0
  614. package/dist/store/parsers.js +37 -0
  615. package/dist/store/parsers.js.map +1 -0
  616. package/dist/store/project-detect.js +457 -0
  617. package/dist/store/project-detect.js.map +1 -0
  618. package/dist/store/provider.js +101 -0
  619. package/dist/store/provider.js.map +1 -0
  620. package/dist/store/safety-data-accessor.js +243 -0
  621. package/dist/store/safety-data-accessor.js.map +1 -0
  622. package/dist/store/schema.js +7 -0
  623. package/dist/store/schema.js.map +1 -0
  624. package/dist/store/session-store.js +219 -0
  625. package/dist/store/session-store.js.map +1 -0
  626. package/dist/store/sqlite-backup.js +105 -0
  627. package/dist/store/sqlite-backup.js.map +1 -0
  628. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  629. package/dist/store/sqlite-data-accessor.js +742 -0
  630. package/dist/store/sqlite-data-accessor.js.map +1 -0
  631. package/dist/store/sqlite.d.ts.map +1 -1
  632. package/dist/store/sqlite.js +489 -0
  633. package/dist/store/sqlite.js.map +1 -0
  634. package/dist/store/status-registry.js +8 -0
  635. package/dist/store/status-registry.js.map +1 -0
  636. package/dist/store/task-store.d.ts.map +1 -1
  637. package/dist/store/task-store.js +344 -0
  638. package/dist/store/task-store.js.map +1 -0
  639. package/dist/store/tasks-schema.d.ts +18 -3
  640. package/dist/store/tasks-schema.d.ts.map +1 -1
  641. package/dist/store/tasks-schema.js +574 -0
  642. package/dist/store/tasks-schema.js.map +1 -0
  643. package/dist/store/typed-query.js +15 -0
  644. package/dist/store/typed-query.js.map +1 -0
  645. package/dist/store/validation-schemas.d.ts +32 -0
  646. package/dist/store/validation-schemas.d.ts.map +1 -1
  647. package/dist/store/validation-schemas.js +278 -0
  648. package/dist/store/validation-schemas.js.map +1 -0
  649. package/dist/system/archive-analytics.js +277 -0
  650. package/dist/system/archive-analytics.js.map +1 -0
  651. package/dist/system/archive-stats.js +64 -0
  652. package/dist/system/archive-stats.js.map +1 -0
  653. package/dist/system/audit.js +145 -0
  654. package/dist/system/audit.js.map +1 -0
  655. package/dist/system/backup.js +99 -0
  656. package/dist/system/backup.js.map +1 -0
  657. package/dist/system/cleanup.js +134 -0
  658. package/dist/system/cleanup.js.map +1 -0
  659. package/dist/system/health.js +1054 -0
  660. package/dist/system/health.js.map +1 -0
  661. package/dist/system/index.js +18 -0
  662. package/dist/system/index.js.map +1 -0
  663. package/dist/system/inject-generate.js +122 -0
  664. package/dist/system/inject-generate.js.map +1 -0
  665. package/dist/system/labels.js +38 -0
  666. package/dist/system/labels.js.map +1 -0
  667. package/dist/system/metrics.js +61 -0
  668. package/dist/system/metrics.js.map +1 -0
  669. package/dist/system/migrate.js +43 -0
  670. package/dist/system/migrate.js.map +1 -0
  671. package/dist/system/platform-paths.js +80 -0
  672. package/dist/system/platform-paths.js.map +1 -0
  673. package/dist/system/runtime.js +161 -0
  674. package/dist/system/runtime.js.map +1 -0
  675. package/dist/system/safestop.js +99 -0
  676. package/dist/system/safestop.js.map +1 -0
  677. package/dist/system/storage-preflight.js +123 -0
  678. package/dist/system/storage-preflight.js.map +1 -0
  679. package/dist/task-work/index.js +155 -0
  680. package/dist/task-work/index.js.map +1 -0
  681. package/dist/tasks/add.d.ts +10 -1
  682. package/dist/tasks/add.d.ts.map +1 -1
  683. package/dist/tasks/add.js +510 -0
  684. package/dist/tasks/add.js.map +1 -0
  685. package/dist/tasks/analyze.js +85 -0
  686. package/dist/tasks/analyze.js.map +1 -0
  687. package/dist/tasks/archive.js +90 -0
  688. package/dist/tasks/archive.js.map +1 -0
  689. package/dist/tasks/atomicity.js +83 -0
  690. package/dist/tasks/atomicity.js.map +1 -0
  691. package/dist/tasks/cancel-ops.js +83 -0
  692. package/dist/tasks/cancel-ops.js.map +1 -0
  693. package/dist/tasks/complete.d.ts.map +1 -1
  694. package/dist/tasks/complete.js +224 -0
  695. package/dist/tasks/complete.js.map +1 -0
  696. package/dist/tasks/crossref-extract.js +73 -0
  697. package/dist/tasks/crossref-extract.js.map +1 -0
  698. package/dist/tasks/delete-preview.js +192 -0
  699. package/dist/tasks/delete-preview.js.map +1 -0
  700. package/dist/tasks/delete.js +120 -0
  701. package/dist/tasks/delete.js.map +1 -0
  702. package/dist/tasks/deletion-strategy.js +200 -0
  703. package/dist/tasks/deletion-strategy.js.map +1 -0
  704. package/dist/tasks/dependency-check.js +278 -0
  705. package/dist/tasks/dependency-check.js.map +1 -0
  706. package/dist/tasks/deps-ready.js +32 -0
  707. package/dist/tasks/deps-ready.js.map +1 -0
  708. package/dist/tasks/enforcement.d.ts +22 -0
  709. package/dist/tasks/enforcement.d.ts.map +1 -0
  710. package/dist/tasks/enforcement.js +82 -0
  711. package/dist/tasks/enforcement.js.map +1 -0
  712. package/dist/tasks/epic-enforcement.d.ts +138 -0
  713. package/dist/tasks/epic-enforcement.d.ts.map +1 -0
  714. package/dist/tasks/find.js +148 -0
  715. package/dist/tasks/find.js.map +1 -0
  716. package/dist/tasks/graph-cache.js +127 -0
  717. package/dist/tasks/graph-cache.js.map +1 -0
  718. package/dist/tasks/graph-ops.js +171 -0
  719. package/dist/tasks/graph-ops.js.map +1 -0
  720. package/dist/tasks/graph-rag.js +328 -0
  721. package/dist/tasks/graph-rag.js.map +1 -0
  722. package/dist/tasks/hierarchy-policy.js +149 -0
  723. package/dist/tasks/hierarchy-policy.js.map +1 -0
  724. package/dist/tasks/hierarchy.js +185 -0
  725. package/dist/tasks/hierarchy.js.map +1 -0
  726. package/dist/tasks/id-generator.js +65 -0
  727. package/dist/tasks/id-generator.js.map +1 -0
  728. package/dist/tasks/index.d.ts +1 -1
  729. package/dist/tasks/index.d.ts.map +1 -1
  730. package/dist/tasks/index.js +14 -0
  731. package/dist/tasks/index.js.map +1 -0
  732. package/dist/tasks/labels.js +52 -0
  733. package/dist/tasks/labels.js.map +1 -0
  734. package/dist/tasks/list.js +68 -0
  735. package/dist/tasks/list.js.map +1 -0
  736. package/dist/tasks/phase-tracking.js +133 -0
  737. package/dist/tasks/phase-tracking.js.map +1 -0
  738. package/dist/tasks/pipeline-stage.d.ts +112 -0
  739. package/dist/tasks/pipeline-stage.d.ts.map +1 -0
  740. package/dist/tasks/plan.js +268 -0
  741. package/dist/tasks/plan.js.map +1 -0
  742. package/dist/tasks/relates.js +89 -0
  743. package/dist/tasks/relates.js.map +1 -0
  744. package/dist/tasks/reparent.d.ts +38 -0
  745. package/dist/tasks/reparent.d.ts.map +1 -0
  746. package/dist/tasks/show.js +78 -0
  747. package/dist/tasks/show.js.map +1 -0
  748. package/dist/tasks/size-weighting.js +86 -0
  749. package/dist/tasks/size-weighting.js.map +1 -0
  750. package/dist/tasks/staleness.js +86 -0
  751. package/dist/tasks/staleness.js.map +1 -0
  752. package/dist/tasks/task-ops.js +1340 -0
  753. package/dist/tasks/task-ops.js.map +1 -0
  754. package/dist/tasks/update.d.ts +2 -0
  755. package/dist/tasks/update.d.ts.map +1 -1
  756. package/dist/tasks/update.js +243 -0
  757. package/dist/tasks/update.js.map +1 -0
  758. package/dist/templates/index.js +10 -0
  759. package/dist/templates/index.js.map +1 -0
  760. package/dist/templates/parser.js +254 -0
  761. package/dist/templates/parser.js.map +1 -0
  762. package/dist/ui/aliases.js +153 -0
  763. package/dist/ui/aliases.js.map +1 -0
  764. package/dist/ui/changelog.js +184 -0
  765. package/dist/ui/changelog.js.map +1 -0
  766. package/dist/ui/command-registry.js +168 -0
  767. package/dist/ui/command-registry.js.map +1 -0
  768. package/dist/ui/flags.js +94 -0
  769. package/dist/ui/flags.js.map +1 -0
  770. package/dist/ui/index.js +24 -0
  771. package/dist/ui/index.js.map +1 -0
  772. package/dist/ui/injection-legacy.d.ts +26 -0
  773. package/dist/ui/injection-legacy.d.ts.map +1 -0
  774. package/dist/ui/injection-legacy.js +42 -0
  775. package/dist/ui/injection-legacy.js.map +1 -0
  776. package/dist/upgrade.js +901 -0
  777. package/dist/upgrade.js.map +1 -0
  778. package/dist/validation/chain-validation.js +146 -0
  779. package/dist/validation/chain-validation.js.map +1 -0
  780. package/dist/validation/compliance.js +155 -0
  781. package/dist/validation/compliance.js.map +1 -0
  782. package/dist/validation/docs-sync.js +212 -0
  783. package/dist/validation/docs-sync.js.map +1 -0
  784. package/dist/validation/doctor/checks.js +1069 -0
  785. package/dist/validation/doctor/checks.js.map +1 -0
  786. package/dist/validation/doctor/index.js +9 -0
  787. package/dist/validation/doctor/index.js.map +1 -0
  788. package/dist/validation/doctor/project-cache.js +160 -0
  789. package/dist/validation/doctor/project-cache.js.map +1 -0
  790. package/dist/validation/doctor/utils.js +155 -0
  791. package/dist/validation/doctor/utils.js.map +1 -0
  792. package/dist/validation/engine.js +902 -0
  793. package/dist/validation/engine.js.map +1 -0
  794. package/dist/validation/gap-check.js +175 -0
  795. package/dist/validation/gap-check.js.map +1 -0
  796. package/dist/validation/index.js +40 -0
  797. package/dist/validation/index.js.map +1 -0
  798. package/dist/validation/manifest.js +237 -0
  799. package/dist/validation/manifest.js.map +1 -0
  800. package/dist/validation/operation-gate-validators.js +724 -0
  801. package/dist/validation/operation-gate-validators.js.map +1 -0
  802. package/dist/validation/operation-verification-gates.js +532 -0
  803. package/dist/validation/operation-verification-gates.js.map +1 -0
  804. package/dist/validation/param-utils.js +139 -0
  805. package/dist/validation/param-utils.js.map +1 -0
  806. package/dist/validation/protocol-common.js +300 -0
  807. package/dist/validation/protocol-common.js.map +1 -0
  808. package/dist/validation/protocols/consensus.js +71 -0
  809. package/dist/validation/protocols/consensus.js.map +1 -0
  810. package/dist/validation/protocols/contribution.js +59 -0
  811. package/dist/validation/protocols/contribution.js.map +1 -0
  812. package/dist/validation/protocols/decomposition.js +59 -0
  813. package/dist/validation/protocols/decomposition.js.map +1 -0
  814. package/dist/validation/protocols/implementation.js +59 -0
  815. package/dist/validation/protocols/implementation.js.map +1 -0
  816. package/dist/validation/protocols/release-protocol.js +60 -0
  817. package/dist/validation/protocols/release-protocol.js.map +1 -0
  818. package/dist/validation/protocols/research.js +77 -0
  819. package/dist/validation/protocols/research.js.map +1 -0
  820. package/dist/validation/protocols/specification.js +84 -0
  821. package/dist/validation/protocols/specification.js.map +1 -0
  822. package/dist/validation/protocols/testing-protocol.js +70 -0
  823. package/dist/validation/protocols/testing-protocol.js.map +1 -0
  824. package/dist/validation/protocols/validation-protocol.js +70 -0
  825. package/dist/validation/protocols/validation-protocol.js.map +1 -0
  826. package/dist/validation/schema-integrity.js +170 -0
  827. package/dist/validation/schema-integrity.js.map +1 -0
  828. package/dist/validation/schema-validator.js +176 -0
  829. package/dist/validation/schema-validator.js.map +1 -0
  830. package/dist/validation/validate-ops.js +937 -0
  831. package/dist/validation/validate-ops.js.map +1 -0
  832. package/dist/validation/validation-rules.js +226 -0
  833. package/dist/validation/validation-rules.js.map +1 -0
  834. package/dist/validation/verification.js +321 -0
  835. package/dist/validation/verification.js.map +1 -0
  836. package/migrations/drizzle-brain/20260321000001_t033-brain-indexes/migration.sql +12 -0
  837. package/migrations/drizzle-brain/20260321000001_t033-brain-indexes/snapshot.json +1232 -0
  838. package/migrations/drizzle-tasks/20260321000000_t033-connection-health/migration.sql +518 -0
  839. package/migrations/drizzle-tasks/20260321000000_t033-connection-health/snapshot.json +4312 -0
  840. package/migrations/drizzle-tasks/20260321000002_t060-pipeline-stage-binding/migration.sql +82 -0
  841. package/migrations/drizzle-tasks/20260321000002_t060-pipeline-stage-binding/snapshot.json +9 -0
  842. package/package.json +5 -5
  843. package/schemas/config.schema.json +47 -2
  844. package/src/__tests__/injection-mvi-tiers.test.ts +5 -5
  845. package/src/agents/__tests__/execution-learning.test.ts +684 -0
  846. package/src/agents/__tests__/registry.test.ts +30 -2
  847. package/src/agents/agent-schema.ts +5 -0
  848. package/src/agents/execution-learning.ts +675 -0
  849. package/src/agents/index.ts +13 -0
  850. package/src/backfill/index.ts +282 -0
  851. package/src/bootstrap.ts +1 -1
  852. package/src/config.ts +126 -0
  853. package/src/index.ts +7 -1
  854. package/src/intelligence/__tests__/adaptive-validation.test.ts +694 -0
  855. package/src/intelligence/adaptive-validation.ts +764 -0
  856. package/src/intelligence/index.ts +16 -0
  857. package/src/internal.ts +19 -0
  858. package/src/lifecycle/__tests__/chain-store.test.ts +7 -0
  859. package/src/lifecycle/__tests__/tessera-engine.test.ts +52 -0
  860. package/src/sessions/__tests__/session-edge-cases.test.ts +24 -1
  861. package/src/sessions/session-enforcement.ts +13 -2
  862. package/src/stats/index.ts +7 -0
  863. package/src/stats/workflow-telemetry.ts +487 -0
  864. package/src/store/__tests__/migration-safety.test.ts +3 -0
  865. package/src/store/__tests__/session-store.test.ts +96 -1
  866. package/src/store/__tests__/task-store.test.ts +22 -1
  867. package/src/store/__tests__/test-db-helper.ts +25 -2
  868. package/src/store/brain-schema.ts +4 -1
  869. package/src/store/converters.ts +2 -0
  870. package/src/store/cross-db-cleanup.ts +157 -0
  871. package/src/store/db-helpers.ts +2 -0
  872. package/src/store/migration-sqlite.ts +6 -0
  873. package/src/store/sqlite-data-accessor.ts +20 -28
  874. package/src/store/sqlite.ts +14 -2
  875. package/src/store/task-store.ts +6 -0
  876. package/src/store/tasks-schema.ts +59 -20
  877. package/src/tasks/__tests__/add.test.ts +16 -0
  878. package/src/tasks/__tests__/complete-unblocks.test.ts +10 -1
  879. package/src/tasks/__tests__/complete.test.ts +11 -2
  880. package/src/tasks/__tests__/epic-enforcement.test.ts +904 -0
  881. package/src/tasks/__tests__/minimal-test.test.ts +28 -0
  882. package/src/tasks/__tests__/pipeline-stage.test.ts +403 -0
  883. package/src/tasks/__tests__/update.test.ts +40 -6
  884. package/src/tasks/add.ts +128 -2
  885. package/src/tasks/complete.ts +24 -17
  886. package/src/tasks/enforcement.ts +124 -0
  887. package/src/tasks/epic-enforcement.ts +303 -0
  888. package/src/tasks/index.ts +1 -0
  889. package/src/tasks/pipeline-stage.ts +224 -0
  890. package/src/tasks/update.ts +62 -0
  891. package/templates/CLEO-INJECTION.md +1 -1
  892. package/templates/config.template.json +34 -0
  893. package/templates/global-config.template.json +26 -0
@@ -0,0 +1,487 @@
1
+ /**
2
+ * Workflow Telemetry Module — Agent Workflow Compliance Metrics
3
+ *
4
+ * Computes compliance metrics for WF-001 through WF-005 workflow rules
5
+ * defined in T063. Queries existing data from tasks, sessions, and audit_log
6
+ * tables — no new infrastructure required.
7
+ *
8
+ * Metrics produced:
9
+ * - AC compliance rate: % of tasks with ≥3 acceptance criteria
10
+ * - Session compliance rate: % of task completions that occurred within a session
11
+ * - Gate compliance rate: Average verification gates set per completed task
12
+ * - Workflow violations: Count of tasks that bypassed WF rules
13
+ *
14
+ * @task T065
15
+ * @epic T056
16
+ */
17
+
18
+ import { getLogger } from '../logger.js';
19
+
20
+ const log = getLogger('workflow-telemetry');
21
+
22
+ /** Per-rule compliance breakdown. */
23
+ export interface WorkflowRuleMetric {
24
+ /** Rule identifier, e.g. WF-001. */
25
+ rule: string;
26
+ /** Human-readable rule description. */
27
+ description: string;
28
+ /** Total tasks or events that were subject to this rule. */
29
+ total: number;
30
+ /** Number that violated the rule. */
31
+ violations: number;
32
+ /** Compliance rate 0..1 (1 = fully compliant). */
33
+ complianceRate: number;
34
+ }
35
+
36
+ /** Full workflow compliance report. */
37
+ export interface WorkflowComplianceReport {
38
+ /** ISO timestamp when metrics were computed. */
39
+ generatedAt: string;
40
+ /** Time window filtered (ISO cutoff) or null for all-time. */
41
+ since: string | null;
42
+ /** Overall compliance score 0..1 (average of all rule rates). */
43
+ overallScore: number;
44
+ /** Grade letter derived from overallScore. */
45
+ grade: string;
46
+ /** Per-rule breakdown. */
47
+ rules: WorkflowRuleMetric[];
48
+ /** Task-level violation samples (up to 20). */
49
+ violationSamples: Array<{
50
+ taskId: string;
51
+ rule: string;
52
+ detail: string;
53
+ }>;
54
+ /** Raw counts for context. */
55
+ summary: {
56
+ totalTasks: number;
57
+ completedTasks: number;
58
+ tasksWithAC: number;
59
+ tasksWithoutAC: number;
60
+ completionsInSession: number;
61
+ completionsOutsideSession: number;
62
+ tasksWithGates: number;
63
+ avgGatesSet: number;
64
+ };
65
+ }
66
+
67
+ // ---------------------------------------------------------------------------
68
+ // Internal types for raw DB rows
69
+ // ---------------------------------------------------------------------------
70
+
71
+ interface RawTask {
72
+ id: string;
73
+ status: string;
74
+ acceptanceJson: string | null;
75
+ verificationJson: string | null;
76
+ sessionId: string | null;
77
+ completedAt: string | null;
78
+ createdAt: string;
79
+ }
80
+
81
+ interface RawAuditRow {
82
+ action: string;
83
+ timestamp: string;
84
+ taskId: string | null;
85
+ sessionId: string | null;
86
+ afterJson: string | null;
87
+ operation: string | null;
88
+ domain: string | null;
89
+ }
90
+
91
+ // ---------------------------------------------------------------------------
92
+ // DB helpers
93
+ // ---------------------------------------------------------------------------
94
+
95
+ async function queryTasks(cwd: string, since: string | null): Promise<RawTask[]> {
96
+ try {
97
+ const { getDb } = await import('../store/sqlite.js');
98
+ const { tasks } = await import('../store/tasks-schema.js');
99
+ const { and, gte } = await import('drizzle-orm');
100
+
101
+ const db = await getDb(cwd);
102
+
103
+ const conditions = [];
104
+ if (since) {
105
+ // Include tasks created or completed since the cutoff
106
+ conditions.push(gte(tasks.createdAt, since));
107
+ }
108
+
109
+ const rows = await db
110
+ .select({
111
+ id: tasks.id,
112
+ status: tasks.status,
113
+ acceptanceJson: tasks.acceptanceJson,
114
+ verificationJson: tasks.verificationJson,
115
+ sessionId: tasks.sessionId,
116
+ completedAt: tasks.completedAt,
117
+ createdAt: tasks.createdAt,
118
+ })
119
+ .from(tasks)
120
+ .where(conditions.length > 0 ? and(...conditions) : undefined)
121
+ .all();
122
+
123
+ return rows as RawTask[];
124
+ } catch (err) {
125
+ log.warn({ err }, 'Failed to query tasks for workflow telemetry');
126
+ return [];
127
+ }
128
+ }
129
+
130
+ async function queryCompletionAuditRows(cwd: string, since: string | null): Promise<RawAuditRow[]> {
131
+ try {
132
+ const { getDb } = await import('../store/sqlite.js');
133
+ const { auditLog } = await import('../store/tasks-schema.js');
134
+ const { and, gte } = await import('drizzle-orm');
135
+
136
+ const db = await getDb(cwd);
137
+
138
+ // Completion events: action = 'task_completed' OR 'complete'
139
+ // OR operation = 'complete' in dispatch layer
140
+ const conditions = [];
141
+ if (since) conditions.push(gte(auditLog.timestamp, since));
142
+
143
+ const allRows = await db
144
+ .select({
145
+ action: auditLog.action,
146
+ timestamp: auditLog.timestamp,
147
+ taskId: auditLog.taskId,
148
+ sessionId: auditLog.sessionId,
149
+ afterJson: auditLog.afterJson,
150
+ operation: auditLog.operation,
151
+ domain: auditLog.domain,
152
+ })
153
+ .from(auditLog)
154
+ .where(conditions.length > 0 ? and(...conditions) : undefined)
155
+ .orderBy(auditLog.timestamp)
156
+ .all();
157
+
158
+ // Filter to completion events only
159
+ return (allRows as RawAuditRow[]).filter((row) => {
160
+ const isComplete =
161
+ row.action === 'task_completed' ||
162
+ row.action === 'complete' ||
163
+ (row.operation === 'complete' && row.domain === 'tasks');
164
+
165
+ // Also catch status_changed → done
166
+ if (!isComplete && row.afterJson) {
167
+ try {
168
+ const after = JSON.parse(row.afterJson) as Record<string, unknown>;
169
+ return after?.status === 'done';
170
+ } catch {
171
+ return false;
172
+ }
173
+ }
174
+ return isComplete;
175
+ });
176
+ } catch (err) {
177
+ log.warn({ err }, 'Failed to query audit log for workflow telemetry');
178
+ return [];
179
+ }
180
+ }
181
+
182
+ // ---------------------------------------------------------------------------
183
+ // Metric helpers
184
+ // ---------------------------------------------------------------------------
185
+
186
+ function parseAcceptanceCriteria(acceptanceJson: string | null): string[] {
187
+ if (!acceptanceJson) return [];
188
+ try {
189
+ const parsed = JSON.parse(acceptanceJson);
190
+ return Array.isArray(parsed) ? parsed : [];
191
+ } catch {
192
+ return [];
193
+ }
194
+ }
195
+
196
+ function parseVerification(verificationJson: string | null): Record<string, unknown> | null {
197
+ if (!verificationJson) return null;
198
+ try {
199
+ return JSON.parse(verificationJson) as Record<string, unknown>;
200
+ } catch {
201
+ return null;
202
+ }
203
+ }
204
+
205
+ function countTrueGates(gates: Record<string, unknown>): number {
206
+ if (!gates || typeof gates !== 'object') return 0;
207
+ return Object.values(gates).filter((v) => v === true).length;
208
+ }
209
+
210
+ function gradeFromScore(score: number): string {
211
+ if (score >= 0.95) return 'A+';
212
+ if (score >= 0.9) return 'A';
213
+ if (score >= 0.8) return 'B';
214
+ if (score >= 0.7) return 'C';
215
+ if (score >= 0.6) return 'D';
216
+ return 'F';
217
+ }
218
+
219
+ // ---------------------------------------------------------------------------
220
+ // Public API
221
+ // ---------------------------------------------------------------------------
222
+
223
+ /**
224
+ * Compute workflow compliance metrics from existing task, session, and audit data.
225
+ *
226
+ * Rules evaluated:
227
+ * WF-001: Tasks MUST have ≥3 acceptance criteria (T058)
228
+ * WF-002: Task completions MUST occur within an active session (T059)
229
+ * WF-003: Completed tasks SHOULD have verification gates set (T061)
230
+ * WF-004: Tasks with verification SHOULD have all 3 gates set
231
+ * WF-005: Tasks MUST have session binding on creation (non-epic)
232
+ */
233
+ export async function getWorkflowComplianceReport(opts: {
234
+ since?: string;
235
+ cwd?: string;
236
+ }): Promise<WorkflowComplianceReport> {
237
+ const cwd = opts.cwd ?? process.cwd();
238
+ const since = opts.since ?? null;
239
+ const generatedAt = new Date().toISOString();
240
+
241
+ const [allTasks, completionEvents] = await Promise.all([
242
+ queryTasks(cwd, since),
243
+ queryCompletionAuditRows(cwd, since),
244
+ ]);
245
+
246
+ // Include all tasks in WF checks. Epics will naturally show 0 AC criteria
247
+ // which counts as a violation — this is acceptable since epics should also
248
+ // have AC defined. The raw task query does not include the type column to
249
+ // keep the query minimal, so we don't filter by type here.
250
+ const nonEpicTasks = allTasks;
251
+
252
+ const completedTasks = allTasks.filter((t) => t.status === 'done' || t.completedAt != null);
253
+
254
+ // -------------------------------------------------------------------------
255
+ // WF-001: AC compliance — tasks with ≥3 acceptance criteria
256
+ // -------------------------------------------------------------------------
257
+ const wf001Violations: Array<{ taskId: string; rule: string; detail: string }> = [];
258
+ let tasksWithAC = 0;
259
+ let tasksWithoutAC = 0;
260
+
261
+ for (const task of nonEpicTasks) {
262
+ const ac = parseAcceptanceCriteria(task.acceptanceJson);
263
+ if (ac.length >= 3) {
264
+ tasksWithAC++;
265
+ } else {
266
+ tasksWithoutAC++;
267
+ if (wf001Violations.length < 10) {
268
+ wf001Violations.push({
269
+ taskId: task.id,
270
+ rule: 'WF-001',
271
+ detail: `has ${ac.length} AC item(s), needs ≥3`,
272
+ });
273
+ }
274
+ }
275
+ }
276
+
277
+ const wf001Total = nonEpicTasks.length;
278
+ const wf001Rate = wf001Total > 0 ? tasksWithAC / wf001Total : 1;
279
+
280
+ // -------------------------------------------------------------------------
281
+ // WF-002: Session compliance — completions that occurred inside a session
282
+ // -------------------------------------------------------------------------
283
+ const wf002Violations: Array<{ taskId: string; rule: string; detail: string }> = [];
284
+ let completionsInSession = 0;
285
+ let completionsOutsideSession = 0;
286
+
287
+ for (const event of completionEvents) {
288
+ if (event.sessionId && event.sessionId !== 'unknown' && event.sessionId !== 'system') {
289
+ completionsInSession++;
290
+ } else {
291
+ completionsOutsideSession++;
292
+ if (wf002Violations.length < 5) {
293
+ wf002Violations.push({
294
+ taskId: event.taskId ?? 'unknown',
295
+ rule: 'WF-002',
296
+ detail: 'task completed outside an active session',
297
+ });
298
+ }
299
+ }
300
+ }
301
+
302
+ const wf002Total = completionEvents.length;
303
+ const wf002Rate = wf002Total > 0 ? completionsInSession / wf002Total : 1;
304
+
305
+ // -------------------------------------------------------------------------
306
+ // WF-003: Gate compliance — completed tasks with verification initialized
307
+ // -------------------------------------------------------------------------
308
+ const wf003Violations: Array<{ taskId: string; rule: string; detail: string }> = [];
309
+ let tasksWithGates = 0;
310
+ let tasksWithoutGates = 0;
311
+ let totalGatesSet = 0;
312
+ let gateTaskCount = 0;
313
+
314
+ for (const task of completedTasks) {
315
+ const verification = parseVerification(task.verificationJson);
316
+ if (verification) {
317
+ tasksWithGates++;
318
+ const gates = (verification.gates ?? {}) as Record<string, unknown>;
319
+ const setCount = countTrueGates(gates);
320
+ totalGatesSet += setCount;
321
+ gateTaskCount++;
322
+ } else {
323
+ tasksWithoutGates++;
324
+ if (wf003Violations.length < 5) {
325
+ wf003Violations.push({
326
+ taskId: task.id,
327
+ rule: 'WF-003',
328
+ detail: 'completed without verification gates',
329
+ });
330
+ }
331
+ }
332
+ }
333
+
334
+ const wf003Total = completedTasks.length;
335
+ const wf003Rate = wf003Total > 0 ? tasksWithGates / wf003Total : 1;
336
+ const avgGatesSet =
337
+ gateTaskCount > 0 ? Math.round((totalGatesSet / gateTaskCount) * 100) / 100 : 0;
338
+
339
+ // -------------------------------------------------------------------------
340
+ // WF-004: Full gate compliance — tasks with verification where all 3 gates are set
341
+ // -------------------------------------------------------------------------
342
+ const wf004Violations: Array<{ taskId: string; rule: string; detail: string }> = [];
343
+ let allGatesSet = 0;
344
+ let partialGates = 0;
345
+
346
+ for (const task of completedTasks) {
347
+ const verification = parseVerification(task.verificationJson);
348
+ if (!verification) continue; // Already captured in WF-003
349
+
350
+ const gates = (verification.gates ?? {}) as Record<string, unknown>;
351
+ const setCount = countTrueGates(gates);
352
+ const totalGates = Object.keys(gates).length;
353
+
354
+ if (totalGates > 0 && setCount === totalGates) {
355
+ allGatesSet++;
356
+ } else if (totalGates > 0) {
357
+ partialGates++;
358
+ if (wf004Violations.length < 5) {
359
+ wf004Violations.push({
360
+ taskId: task.id,
361
+ rule: 'WF-004',
362
+ detail: `only ${setCount}/${totalGates} verification gates set`,
363
+ });
364
+ }
365
+ }
366
+ }
367
+
368
+ const wf004Total = tasksWithGates;
369
+ const wf004Rate = wf004Total > 0 ? allGatesSet / wf004Total : 1;
370
+
371
+ // -------------------------------------------------------------------------
372
+ // WF-005: Session binding on creation — tasks with sessionId set
373
+ // -------------------------------------------------------------------------
374
+ const wf005Violations: Array<{ taskId: string; rule: string; detail: string }> = [];
375
+ let tasksWithSessionBinding = 0;
376
+ let tasksWithoutSessionBinding = 0;
377
+
378
+ for (const task of nonEpicTasks) {
379
+ if (task.sessionId && task.sessionId !== 'unknown' && task.sessionId !== 'system') {
380
+ tasksWithSessionBinding++;
381
+ } else {
382
+ tasksWithoutSessionBinding++;
383
+ if (wf005Violations.length < 5) {
384
+ wf005Violations.push({
385
+ taskId: task.id,
386
+ rule: 'WF-005',
387
+ detail: 'created without session binding',
388
+ });
389
+ }
390
+ }
391
+ }
392
+
393
+ const wf005Total = nonEpicTasks.length;
394
+ const wf005Rate = wf005Total > 0 ? tasksWithSessionBinding / wf005Total : 1;
395
+
396
+ // -------------------------------------------------------------------------
397
+ // Aggregate
398
+ // -------------------------------------------------------------------------
399
+
400
+ const rules: WorkflowRuleMetric[] = [
401
+ {
402
+ rule: 'WF-001',
403
+ description: 'Tasks must have ≥3 acceptance criteria',
404
+ total: wf001Total,
405
+ violations: tasksWithoutAC,
406
+ complianceRate: Math.round(wf001Rate * 10000) / 10000,
407
+ },
408
+ {
409
+ rule: 'WF-002',
410
+ description: 'Task completions must occur within an active session',
411
+ total: wf002Total,
412
+ violations: completionsOutsideSession,
413
+ complianceRate: Math.round(wf002Rate * 10000) / 10000,
414
+ },
415
+ {
416
+ rule: 'WF-003',
417
+ description: 'Completed tasks should have verification gates initialized',
418
+ total: wf003Total,
419
+ violations: tasksWithoutGates,
420
+ complianceRate: Math.round(wf003Rate * 10000) / 10000,
421
+ },
422
+ {
423
+ rule: 'WF-004',
424
+ description: 'Verification gates should all be marked passed before completion',
425
+ total: wf004Total,
426
+ violations: partialGates,
427
+ complianceRate: Math.round(wf004Rate * 10000) / 10000,
428
+ },
429
+ {
430
+ rule: 'WF-005',
431
+ description: 'Tasks must be created with active session binding',
432
+ total: wf005Total,
433
+ violations: tasksWithoutSessionBinding,
434
+ complianceRate: Math.round(wf005Rate * 10000) / 10000,
435
+ },
436
+ ];
437
+
438
+ // Overall score: weighted average (MUST rules count double vs SHOULD)
439
+ // WF-001, WF-002, WF-005 are MUST; WF-003, WF-004 are SHOULD
440
+ const mustWeight = 2;
441
+ const shouldWeight = 1;
442
+ const wf001w = wf001Total > 0 ? mustWeight : 0;
443
+ const wf002w = wf002Total > 0 ? mustWeight : 0;
444
+ const wf003w = wf003Total > 0 ? shouldWeight : 0;
445
+ const wf004w = wf004Total > 0 ? shouldWeight : 0;
446
+ const wf005w = wf005Total > 0 ? mustWeight : 0;
447
+ const totalWeight = wf001w + wf002w + wf003w + wf004w + wf005w;
448
+
449
+ const overallScore =
450
+ totalWeight > 0
451
+ ? (wf001w * wf001Rate +
452
+ wf002w * wf002Rate +
453
+ wf003w * wf003Rate +
454
+ wf004w * wf004Rate +
455
+ wf005w * wf005Rate) /
456
+ totalWeight
457
+ : 1;
458
+
459
+ const roundedScore = Math.round(overallScore * 10000) / 10000;
460
+
461
+ const violationSamples = [
462
+ ...wf001Violations,
463
+ ...wf002Violations,
464
+ ...wf003Violations,
465
+ ...wf004Violations,
466
+ ...wf005Violations,
467
+ ].slice(0, 20);
468
+
469
+ return {
470
+ generatedAt,
471
+ since,
472
+ overallScore: roundedScore,
473
+ grade: gradeFromScore(roundedScore),
474
+ rules,
475
+ violationSamples,
476
+ summary: {
477
+ totalTasks: allTasks.length,
478
+ completedTasks: completedTasks.length,
479
+ tasksWithAC,
480
+ tasksWithoutAC,
481
+ completionsInSession,
482
+ completionsOutsideSession,
483
+ tasksWithGates,
484
+ avgGatesSet,
485
+ },
486
+ };
487
+ }
@@ -397,6 +397,9 @@ describe('Migration Safety Integration Tests', () => {
397
397
  const tempDbPath = join(cleoDir, 'tasks.db.migrating');
398
398
  const result = await migrateJsonToSqliteAtomic(tempDir, tempDbPath);
399
399
 
400
+ if (!result.success) {
401
+ console.error('ATOMIC MIGRATION ERRORS:', JSON.stringify(result.errors, null, 2));
402
+ }
400
403
  expect(result.success).toBe(true);
401
404
 
402
405
  // Verify temp file was created
@@ -8,7 +8,7 @@
8
8
  * @epic T4638
9
9
  */
10
10
 
11
- import { mkdtemp, rm } from 'node:fs/promises';
11
+ import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
12
12
  import { tmpdir } from 'node:os';
13
13
  import { join } from 'node:path';
14
14
  import type { Session } from '@cleocode/contracts';
@@ -34,6 +34,17 @@ describe('SQLite session-store', () => {
34
34
  const cleoDir = join(tempDir, '.cleo');
35
35
  process.env['CLEO_DIR'] = cleoDir;
36
36
 
37
+ // Create .cleo dir and write test config so enforcement checks don't block
38
+ await mkdir(cleoDir, { recursive: true });
39
+ await writeFile(
40
+ join(cleoDir, 'config.json'),
41
+ JSON.stringify({
42
+ enforcement: { session: { requiredForMutate: false } },
43
+ lifecycle: { mode: 'off' },
44
+ verification: { enabled: false },
45
+ }),
46
+ );
47
+
37
48
  const { closeDb } = await import('../sqlite.js');
38
49
  closeDb();
39
50
  });
@@ -89,6 +100,19 @@ describe('SQLite session-store', () => {
89
100
 
90
101
  it('preserves taskWork state', async () => {
91
102
  const { createSession, getSession } = await import('../session-store.js');
103
+ // Insert FK parent task before creating session with currentTask reference
104
+ const { getDb } = await import('../sqlite.js');
105
+ const { tasks: tasksTable } = await import('../tasks-schema.js');
106
+ const db = await getDb();
107
+ db.insert(tasksTable)
108
+ .values({
109
+ id: 'T001',
110
+ title: 'Task T001',
111
+ status: 'pending',
112
+ priority: 'medium',
113
+ createdAt: new Date().toISOString(),
114
+ })
115
+ .run();
92
116
 
93
117
  const now = new Date().toISOString();
94
118
  const session = makeSession({
@@ -269,6 +293,20 @@ describe('SQLite session-store', () => {
269
293
  describe('startTask', () => {
270
294
  it('starts work on a task', async () => {
271
295
  const { createSession, startTask, getCurrentTask } = await import('../session-store.js');
296
+ // Insert FK parent task: task_work_history.task_id -> tasks.id CASCADE
297
+ // and sessions.current_task -> tasks.id SET NULL.
298
+ const { getDb } = await import('../sqlite.js');
299
+ const { tasks: tasksTable } = await import('../tasks-schema.js');
300
+ const db = await getDb();
301
+ db.insert(tasksTable)
302
+ .values({
303
+ id: 'T001',
304
+ title: 'Task T001',
305
+ status: 'pending',
306
+ priority: 'medium',
307
+ createdAt: new Date().toISOString(),
308
+ })
309
+ .run();
272
310
  await createSession(makeSession({ id: 'sess-001' }));
273
311
 
274
312
  await startTask('sess-001', 'T001');
@@ -280,6 +318,28 @@ describe('SQLite session-store', () => {
280
318
 
281
319
  it('updates current task when set again', async () => {
282
320
  const { createSession, startTask, getCurrentTask } = await import('../session-store.js');
321
+ // Insert FK parent tasks before calling startTask.
322
+ const { getDb } = await import('../sqlite.js');
323
+ const { tasks: tasksTable } = await import('../tasks-schema.js');
324
+ const db = await getDb();
325
+ db.insert(tasksTable)
326
+ .values([
327
+ {
328
+ id: 'T001',
329
+ title: 'Task T001',
330
+ status: 'pending',
331
+ priority: 'medium',
332
+ createdAt: new Date().toISOString(),
333
+ },
334
+ {
335
+ id: 'T002',
336
+ title: 'Task T002',
337
+ status: 'pending',
338
+ priority: 'medium',
339
+ createdAt: new Date().toISOString(),
340
+ },
341
+ ])
342
+ .run();
283
343
  await createSession(makeSession({ id: 'sess-001' }));
284
344
 
285
345
  await startTask('sess-001', 'T001');
@@ -312,6 +372,19 @@ describe('SQLite session-store', () => {
312
372
  const { createSession, startTask, stopTask, getCurrentTask } = await import(
313
373
  '../session-store.js'
314
374
  );
375
+ // Insert FK parent task before calling startTask.
376
+ const { getDb } = await import('../sqlite.js');
377
+ const { tasks: tasksTable } = await import('../tasks-schema.js');
378
+ const db = await getDb();
379
+ db.insert(tasksTable)
380
+ .values({
381
+ id: 'T001',
382
+ title: 'Task T001',
383
+ status: 'pending',
384
+ priority: 'medium',
385
+ createdAt: new Date().toISOString(),
386
+ })
387
+ .run();
315
388
  await createSession(makeSession({ id: 'sess-001' }));
316
389
  await startTask('sess-001', 'T001');
317
390
 
@@ -325,6 +398,17 @@ describe('SQLite session-store', () => {
325
398
  describe('workHistory', () => {
326
399
  it('records task work changes in history', async () => {
327
400
  const { createSession, startTask, workHistory } = await import('../session-store.js');
401
+ // Insert FK parent tasks before calling startTask
402
+ const { getDb } = await import('../sqlite.js');
403
+ const { tasks: tasksTable } = await import('../tasks-schema.js');
404
+ const db = await getDb();
405
+ db.insert(tasksTable)
406
+ .values([
407
+ { id: 'T001', title: 'Task T001', status: 'pending', priority: 'medium', createdAt: new Date().toISOString() },
408
+ { id: 'T002', title: 'Task T002', status: 'pending', priority: 'medium', createdAt: new Date().toISOString() },
409
+ { id: 'T003', title: 'Task T003', status: 'pending', priority: 'medium', createdAt: new Date().toISOString() },
410
+ ])
411
+ .run();
328
412
  await createSession(makeSession({ id: 'sess-001' }));
329
413
 
330
414
  await startTask('sess-001', 'T001');
@@ -340,6 +424,17 @@ describe('SQLite session-store', () => {
340
424
 
341
425
  it('respects limit parameter', async () => {
342
426
  const { createSession, startTask, workHistory } = await import('../session-store.js');
427
+ // Insert FK parent tasks before calling startTask
428
+ const { getDb } = await import('../sqlite.js');
429
+ const { tasks: tasksTable } = await import('../tasks-schema.js');
430
+ const db = await getDb();
431
+ db.insert(tasksTable)
432
+ .values([
433
+ { id: 'T001', title: 'Task T001', status: 'pending', priority: 'medium', createdAt: new Date().toISOString() },
434
+ { id: 'T002', title: 'Task T002', status: 'pending', priority: 'medium', createdAt: new Date().toISOString() },
435
+ { id: 'T003', title: 'Task T003', status: 'pending', priority: 'medium', createdAt: new Date().toISOString() },
436
+ ])
437
+ .run();
343
438
  await createSession(makeSession({ id: 'sess-001' }));
344
439
 
345
440
  await startTask('sess-001', 'T001');
@@ -8,7 +8,7 @@
8
8
  * @epic T4638
9
9
  */
10
10
 
11
- import { mkdtemp, rm } from 'node:fs/promises';
11
+ import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
12
12
  import { tmpdir } from 'node:os';
13
13
  import { join } from 'node:path';
14
14
  import type { Task } from '@cleocode/contracts';
@@ -33,6 +33,17 @@ describe('SQLite task-store', () => {
33
33
  const cleoDir = join(tempDir, '.cleo');
34
34
  process.env['CLEO_DIR'] = cleoDir;
35
35
 
36
+ // Create .cleo dir and write test config so enforcement checks don't block
37
+ await mkdir(cleoDir, { recursive: true });
38
+ await writeFile(
39
+ join(cleoDir, 'config.json'),
40
+ JSON.stringify({
41
+ enforcement: { session: { requiredForMutate: false } },
42
+ lifecycle: { mode: 'off' },
43
+ verification: { enabled: false },
44
+ }),
45
+ );
46
+
36
47
  // Reset singleton
37
48
  const { closeDb } = await import('../sqlite.js');
38
49
  closeDb();
@@ -93,6 +104,16 @@ describe('SQLite task-store', () => {
93
104
 
94
105
  it('creates task with provenance', async () => {
95
106
  const { createTask, getTask } = await import('../task-store.js');
107
+ // Insert FK parent session before creating a task that references it
108
+ const { createSession } = await import('../session-store.js');
109
+ await createSession({
110
+ id: 'sess-001',
111
+ name: 'Test session',
112
+ status: 'active',
113
+ scope: { type: 'global' },
114
+ taskWork: { taskId: null, setAt: null },
115
+ startedAt: new Date().toISOString(),
116
+ });
96
117
  const task = makeTask({
97
118
  id: 'T003',
98
119
  provenance: {