@soleri/core 9.0.3 → 9.2.0

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 (701) hide show
  1. package/dist/brain/intelligence.d.ts +27 -0
  2. package/dist/brain/intelligence.d.ts.map +1 -1
  3. package/dist/brain/intelligence.js +160 -14
  4. package/dist/brain/intelligence.js.map +1 -1
  5. package/dist/brain/learning-radar.d.ts +4 -0
  6. package/dist/brain/learning-radar.d.ts.map +1 -1
  7. package/dist/brain/learning-radar.js +20 -1
  8. package/dist/brain/learning-radar.js.map +1 -1
  9. package/dist/brain/strength-scorer.d.ts +31 -0
  10. package/dist/brain/strength-scorer.d.ts.map +1 -0
  11. package/dist/brain/strength-scorer.js +264 -0
  12. package/dist/brain/strength-scorer.js.map +1 -0
  13. package/dist/chat/agent-loop.d.ts.map +1 -1
  14. package/dist/chat/agent-loop.js +2 -0
  15. package/dist/chat/agent-loop.js.map +1 -1
  16. package/dist/chat/notifications.d.ts.map +1 -1
  17. package/dist/chat/notifications.js +2 -0
  18. package/dist/chat/notifications.js.map +1 -1
  19. package/dist/claudemd/compose.js +1 -1
  20. package/dist/claudemd/compose.js.map +1 -1
  21. package/dist/control/intent-router.d.ts.map +1 -1
  22. package/dist/control/intent-router.js +12 -4
  23. package/dist/control/intent-router.js.map +1 -1
  24. package/dist/curator/contradiction-detector.d.ts +27 -0
  25. package/dist/curator/contradiction-detector.d.ts.map +1 -0
  26. package/dist/curator/contradiction-detector.js +62 -0
  27. package/dist/curator/contradiction-detector.js.map +1 -0
  28. package/dist/curator/curator.d.ts +3 -4
  29. package/dist/curator/curator.d.ts.map +1 -1
  30. package/dist/curator/curator.js +90 -525
  31. package/dist/curator/curator.js.map +1 -1
  32. package/dist/curator/duplicate-detector.d.ts +14 -0
  33. package/dist/curator/duplicate-detector.d.ts.map +1 -0
  34. package/dist/curator/duplicate-detector.js +77 -0
  35. package/dist/curator/duplicate-detector.js.map +1 -0
  36. package/dist/curator/health-audit.d.ts +15 -0
  37. package/dist/curator/health-audit.d.ts.map +1 -0
  38. package/dist/curator/health-audit.js +97 -0
  39. package/dist/curator/health-audit.js.map +1 -0
  40. package/dist/curator/metadata-enricher.d.ts +17 -0
  41. package/dist/curator/metadata-enricher.d.ts.map +1 -0
  42. package/dist/curator/metadata-enricher.js +60 -0
  43. package/dist/curator/metadata-enricher.js.map +1 -0
  44. package/dist/curator/schema.d.ts +7 -0
  45. package/dist/curator/schema.d.ts.map +1 -0
  46. package/dist/curator/schema.js +62 -0
  47. package/dist/curator/schema.js.map +1 -0
  48. package/dist/curator/tag-manager.d.ts +36 -0
  49. package/dist/curator/tag-manager.d.ts.map +1 -0
  50. package/dist/curator/tag-manager.js +78 -0
  51. package/dist/curator/tag-manager.js.map +1 -0
  52. package/dist/engine/bin/soleri-engine.js +55 -3
  53. package/dist/engine/bin/soleri-engine.js.map +1 -1
  54. package/dist/engine/core-ops.d.ts.map +1 -1
  55. package/dist/engine/core-ops.js +33 -10
  56. package/dist/engine/core-ops.js.map +1 -1
  57. package/dist/engine/module-manifest.d.ts.map +1 -1
  58. package/dist/engine/module-manifest.js +22 -2
  59. package/dist/engine/module-manifest.js.map +1 -1
  60. package/dist/engine/register-engine.d.ts.map +1 -1
  61. package/dist/engine/register-engine.js +26 -2
  62. package/dist/engine/register-engine.js.map +1 -1
  63. package/dist/errors/retry.d.ts.map +1 -1
  64. package/dist/errors/retry.js +2 -0
  65. package/dist/errors/retry.js.map +1 -1
  66. package/dist/facades/types.d.ts +1 -1
  67. package/dist/flows/chain-types.d.ts +18 -18
  68. package/dist/flows/gate-evaluator.d.ts.map +1 -1
  69. package/dist/flows/gate-evaluator.js +22 -0
  70. package/dist/flows/gate-evaluator.js.map +1 -1
  71. package/dist/flows/types.d.ts +157 -28
  72. package/dist/flows/types.d.ts.map +1 -1
  73. package/dist/flows/types.js +4 -0
  74. package/dist/flows/types.js.map +1 -1
  75. package/dist/index.d.ts +10 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +9 -1
  78. package/dist/index.js.map +1 -1
  79. package/dist/intake/intake-pipeline.d.ts.map +1 -1
  80. package/dist/intake/intake-pipeline.js +1 -0
  81. package/dist/intake/intake-pipeline.js.map +1 -1
  82. package/dist/intake/text-ingester.d.ts.map +1 -1
  83. package/dist/intake/text-ingester.js +2 -0
  84. package/dist/intake/text-ingester.js.map +1 -1
  85. package/dist/llm/key-pool.d.ts +1 -1
  86. package/dist/llm/key-pool.d.ts.map +1 -1
  87. package/dist/llm/key-pool.js +3 -4
  88. package/dist/llm/key-pool.js.map +1 -1
  89. package/dist/llm/utils.d.ts.map +1 -1
  90. package/dist/llm/utils.js +2 -0
  91. package/dist/llm/utils.js.map +1 -1
  92. package/dist/migrations/migration-runner.test-helpers.d.ts +13 -0
  93. package/dist/migrations/migration-runner.test-helpers.d.ts.map +1 -0
  94. package/dist/migrations/migration-runner.test-helpers.js +47 -0
  95. package/dist/migrations/migration-runner.test-helpers.js.map +1 -0
  96. package/dist/operator/operator-profile.d.ts +44 -0
  97. package/dist/operator/operator-profile.d.ts.map +1 -0
  98. package/dist/operator/operator-profile.js +377 -0
  99. package/dist/operator/operator-profile.js.map +1 -0
  100. package/dist/operator/operator-signals.d.ts +45 -0
  101. package/dist/operator/operator-signals.d.ts.map +1 -0
  102. package/dist/operator/operator-signals.js +228 -0
  103. package/dist/operator/operator-signals.js.map +1 -0
  104. package/dist/operator/operator-types.d.ts +360 -0
  105. package/dist/operator/operator-types.d.ts.map +1 -0
  106. package/dist/operator/operator-types.js +24 -0
  107. package/dist/operator/operator-types.js.map +1 -0
  108. package/dist/packs/types.d.ts +27 -27
  109. package/dist/paths.d.ts +40 -0
  110. package/dist/paths.d.ts.map +1 -0
  111. package/dist/paths.js +98 -0
  112. package/dist/paths.js.map +1 -0
  113. package/dist/persistence/index.d.ts +1 -1
  114. package/dist/persistence/index.d.ts.map +1 -1
  115. package/dist/persistence/index.js +1 -1
  116. package/dist/persistence/index.js.map +1 -1
  117. package/dist/persistence/sqlite-provider.d.ts +2 -0
  118. package/dist/persistence/sqlite-provider.d.ts.map +1 -1
  119. package/dist/persistence/sqlite-provider.js +8 -5
  120. package/dist/persistence/sqlite-provider.js.map +1 -1
  121. package/dist/planning/evidence-collector.d.ts +13 -1
  122. package/dist/planning/evidence-collector.d.ts.map +1 -1
  123. package/dist/planning/evidence-collector.js +33 -0
  124. package/dist/planning/evidence-collector.js.map +1 -1
  125. package/dist/planning/gap-analysis.d.ts +5 -4
  126. package/dist/planning/gap-analysis.d.ts.map +1 -1
  127. package/dist/planning/gap-analysis.js +7 -341
  128. package/dist/planning/gap-analysis.js.map +1 -1
  129. package/dist/planning/gap-passes.d.ts +19 -0
  130. package/dist/planning/gap-passes.d.ts.map +1 -0
  131. package/dist/planning/gap-passes.js +157 -0
  132. package/dist/planning/gap-passes.js.map +1 -0
  133. package/dist/planning/gap-patterns.d.ts +29 -0
  134. package/dist/planning/gap-patterns.d.ts.map +1 -0
  135. package/dist/planning/gap-patterns.js +129 -0
  136. package/dist/planning/gap-patterns.js.map +1 -0
  137. package/dist/planning/gap-types.d.ts +1 -1
  138. package/dist/planning/gap-types.d.ts.map +1 -1
  139. package/dist/planning/gap-types.js +1 -0
  140. package/dist/planning/gap-types.js.map +1 -1
  141. package/dist/planning/github-projection.d.ts +122 -0
  142. package/dist/planning/github-projection.d.ts.map +1 -0
  143. package/dist/planning/github-projection.js +294 -0
  144. package/dist/planning/github-projection.js.map +1 -0
  145. package/dist/planning/impact-analyzer.d.ts +26 -0
  146. package/dist/planning/impact-analyzer.d.ts.map +1 -0
  147. package/dist/planning/impact-analyzer.js +199 -0
  148. package/dist/planning/impact-analyzer.js.map +1 -0
  149. package/dist/planning/plan-lifecycle.d.ts +136 -0
  150. package/dist/planning/plan-lifecycle.d.ts.map +1 -0
  151. package/dist/planning/plan-lifecycle.js +296 -0
  152. package/dist/planning/plan-lifecycle.js.map +1 -0
  153. package/dist/planning/planner-types.d.ts +202 -0
  154. package/dist/planning/planner-types.d.ts.map +1 -0
  155. package/dist/planning/planner-types.js +6 -0
  156. package/dist/planning/planner-types.js.map +1 -0
  157. package/dist/planning/planner.d.ts +31 -383
  158. package/dist/planning/planner.d.ts.map +1 -1
  159. package/dist/planning/planner.js +154 -878
  160. package/dist/planning/planner.js.map +1 -1
  161. package/dist/planning/rationalization-detector.d.ts +32 -0
  162. package/dist/planning/rationalization-detector.d.ts.map +1 -0
  163. package/dist/planning/rationalization-detector.js +89 -0
  164. package/dist/planning/rationalization-detector.js.map +1 -0
  165. package/dist/planning/reconciliation-engine.d.ts +47 -0
  166. package/dist/planning/reconciliation-engine.d.ts.map +1 -0
  167. package/dist/planning/reconciliation-engine.js +128 -0
  168. package/dist/planning/reconciliation-engine.js.map +1 -0
  169. package/dist/planning/task-verifier.d.ts +85 -0
  170. package/dist/planning/task-verifier.d.ts.map +1 -0
  171. package/dist/planning/task-verifier.js +227 -0
  172. package/dist/planning/task-verifier.js.map +1 -0
  173. package/dist/plugins/types.d.ts +4 -4
  174. package/dist/runtime/admin-ops.d.ts +2 -2
  175. package/dist/runtime/admin-ops.d.ts.map +1 -1
  176. package/dist/runtime/admin-ops.js +44 -17
  177. package/dist/runtime/admin-ops.js.map +1 -1
  178. package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
  179. package/dist/runtime/admin-setup-ops.js +21 -46
  180. package/dist/runtime/admin-setup-ops.js.map +1 -1
  181. package/dist/runtime/archive-ops.d.ts +10 -0
  182. package/dist/runtime/archive-ops.d.ts.map +1 -0
  183. package/dist/runtime/archive-ops.js +310 -0
  184. package/dist/runtime/archive-ops.js.map +1 -0
  185. package/dist/runtime/capture-ops.d.ts.map +1 -1
  186. package/dist/runtime/capture-ops.js +42 -7
  187. package/dist/runtime/capture-ops.js.map +1 -1
  188. package/dist/runtime/claude-md-helpers.js +1 -1
  189. package/dist/runtime/claude-md-helpers.js.map +1 -1
  190. package/dist/runtime/context-health.d.ts +31 -0
  191. package/dist/runtime/context-health.d.ts.map +1 -0
  192. package/dist/runtime/context-health.js +57 -0
  193. package/dist/runtime/context-health.js.map +1 -0
  194. package/dist/runtime/facades/archive-facade.d.ts +10 -0
  195. package/dist/runtime/facades/archive-facade.d.ts.map +1 -0
  196. package/dist/runtime/facades/archive-facade.js +11 -0
  197. package/dist/runtime/facades/archive-facade.js.map +1 -0
  198. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  199. package/dist/runtime/facades/brain-facade.js +2 -0
  200. package/dist/runtime/facades/brain-facade.js.map +1 -1
  201. package/dist/runtime/facades/chat-facade.d.ts +7 -0
  202. package/dist/runtime/facades/chat-facade.d.ts.map +1 -1
  203. package/dist/runtime/facades/chat-facade.js +15 -800
  204. package/dist/runtime/facades/chat-facade.js.map +1 -1
  205. package/dist/runtime/facades/chat-service-ops.d.ts +9 -0
  206. package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -0
  207. package/dist/runtime/facades/chat-service-ops.js +330 -0
  208. package/dist/runtime/facades/chat-service-ops.js.map +1 -0
  209. package/dist/runtime/facades/chat-session-ops.d.ts +8 -0
  210. package/dist/runtime/facades/chat-session-ops.d.ts.map +1 -0
  211. package/dist/runtime/facades/chat-session-ops.js +136 -0
  212. package/dist/runtime/facades/chat-session-ops.js.map +1 -0
  213. package/dist/runtime/facades/chat-state.d.ts +31 -0
  214. package/dist/runtime/facades/chat-state.d.ts.map +1 -0
  215. package/dist/runtime/facades/chat-state.js +32 -0
  216. package/dist/runtime/facades/chat-state.js.map +1 -0
  217. package/dist/runtime/facades/chat-transport-ops.d.ts +9 -0
  218. package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -0
  219. package/dist/runtime/facades/chat-transport-ops.js +337 -0
  220. package/dist/runtime/facades/chat-transport-ops.js.map +1 -0
  221. package/dist/runtime/facades/control-facade.d.ts.map +1 -1
  222. package/dist/runtime/facades/control-facade.js +4 -1
  223. package/dist/runtime/facades/control-facade.js.map +1 -1
  224. package/dist/runtime/facades/index.d.ts.map +1 -1
  225. package/dist/runtime/facades/index.js +6 -0
  226. package/dist/runtime/facades/index.js.map +1 -1
  227. package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
  228. package/dist/runtime/facades/memory-facade.js +75 -6
  229. package/dist/runtime/facades/memory-facade.js.map +1 -1
  230. package/dist/runtime/facades/operator-facade.d.ts +8 -0
  231. package/dist/runtime/facades/operator-facade.d.ts.map +1 -0
  232. package/dist/runtime/facades/operator-facade.js +220 -0
  233. package/dist/runtime/facades/operator-facade.js.map +1 -0
  234. package/dist/runtime/facades/orchestrate-facade.js +3 -3
  235. package/dist/runtime/facades/orchestrate-facade.js.map +1 -1
  236. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  237. package/dist/runtime/facades/plan-facade.js +39 -6
  238. package/dist/runtime/facades/plan-facade.js.map +1 -1
  239. package/dist/runtime/facades/review-facade.d.ts +7 -0
  240. package/dist/runtime/facades/review-facade.d.ts.map +1 -0
  241. package/dist/runtime/facades/review-facade.js +8 -0
  242. package/dist/runtime/facades/review-facade.js.map +1 -0
  243. package/dist/runtime/facades/sync-facade.d.ts +7 -0
  244. package/dist/runtime/facades/sync-facade.d.ts.map +1 -0
  245. package/dist/runtime/facades/sync-facade.js +8 -0
  246. package/dist/runtime/facades/sync-facade.js.map +1 -0
  247. package/dist/runtime/facades/vault-facade.d.ts +4 -1
  248. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  249. package/dist/runtime/facades/vault-facade.js +13 -66
  250. package/dist/runtime/facades/vault-facade.js.map +1 -1
  251. package/dist/runtime/github-integration.d.ts +49 -0
  252. package/dist/runtime/github-integration.d.ts.map +1 -0
  253. package/dist/runtime/github-integration.js +113 -0
  254. package/dist/runtime/github-integration.js.map +1 -0
  255. package/dist/runtime/grading-ops.js +1 -1
  256. package/dist/runtime/grading-ops.js.map +1 -1
  257. package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
  258. package/dist/runtime/memory-extra-ops.js +6 -2
  259. package/dist/runtime/memory-extra-ops.js.map +1 -1
  260. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  261. package/dist/runtime/orchestrate-ops.js +367 -40
  262. package/dist/runtime/orchestrate-ops.js.map +1 -1
  263. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  264. package/dist/runtime/planning-extra-ops.js +69 -4
  265. package/dist/runtime/planning-extra-ops.js.map +1 -1
  266. package/dist/runtime/review-ops.d.ts +10 -0
  267. package/dist/runtime/review-ops.d.ts.map +1 -0
  268. package/dist/runtime/review-ops.js +97 -0
  269. package/dist/runtime/review-ops.js.map +1 -0
  270. package/dist/runtime/runtime.d.ts.map +1 -1
  271. package/dist/runtime/runtime.js +27 -12
  272. package/dist/runtime/runtime.js.map +1 -1
  273. package/dist/runtime/session-briefing.d.ts +3 -0
  274. package/dist/runtime/session-briefing.d.ts.map +1 -1
  275. package/dist/runtime/session-briefing.js +68 -1
  276. package/dist/runtime/session-briefing.js.map +1 -1
  277. package/dist/runtime/sync-ops.d.ts +12 -0
  278. package/dist/runtime/sync-ops.d.ts.map +1 -0
  279. package/dist/runtime/sync-ops.js +288 -0
  280. package/dist/runtime/sync-ops.js.map +1 -0
  281. package/dist/runtime/types.d.ts +10 -4
  282. package/dist/runtime/types.d.ts.map +1 -1
  283. package/dist/runtime/vault-extra-ops.d.ts +5 -4
  284. package/dist/runtime/vault-extra-ops.d.ts.map +1 -1
  285. package/dist/runtime/vault-extra-ops.js +5 -300
  286. package/dist/runtime/vault-extra-ops.js.map +1 -1
  287. package/dist/runtime/vault-sharing-ops.d.ts +4 -4
  288. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -1
  289. package/dist/runtime/vault-sharing-ops.js +5 -300
  290. package/dist/runtime/vault-sharing-ops.js.map +1 -1
  291. package/dist/skills/sync-skills.d.ts +27 -0
  292. package/dist/skills/sync-skills.d.ts.map +1 -0
  293. package/dist/skills/sync-skills.js +81 -0
  294. package/dist/skills/sync-skills.js.map +1 -0
  295. package/dist/update-check.d.ts +14 -0
  296. package/dist/update-check.d.ts.map +1 -0
  297. package/dist/update-check.js +96 -0
  298. package/dist/update-check.js.map +1 -0
  299. package/dist/vault/linking.d.ts +10 -12
  300. package/dist/vault/linking.d.ts.map +1 -1
  301. package/dist/vault/linking.js +104 -161
  302. package/dist/vault/linking.js.map +1 -1
  303. package/dist/vault/vault-entries.d.ts +69 -0
  304. package/dist/vault/vault-entries.d.ts.map +1 -0
  305. package/dist/vault/vault-entries.js +257 -0
  306. package/dist/vault/vault-entries.js.map +1 -0
  307. package/dist/vault/vault-interfaces.d.ts +153 -0
  308. package/dist/vault/vault-interfaces.d.ts.map +1 -0
  309. package/dist/vault/vault-interfaces.js +2 -0
  310. package/dist/vault/vault-interfaces.js.map +1 -0
  311. package/dist/vault/vault-maintenance.d.ts +40 -0
  312. package/dist/vault/vault-maintenance.d.ts.map +1 -0
  313. package/dist/vault/vault-maintenance.js +142 -0
  314. package/dist/vault/vault-maintenance.js.map +1 -0
  315. package/dist/vault/vault-markdown-sync.d.ts +22 -0
  316. package/dist/vault/vault-markdown-sync.d.ts.map +1 -0
  317. package/dist/vault/vault-markdown-sync.js +143 -0
  318. package/dist/vault/vault-markdown-sync.js.map +1 -0
  319. package/dist/vault/vault-memories.d.ts +61 -0
  320. package/dist/vault/vault-memories.d.ts.map +1 -0
  321. package/dist/vault/vault-memories.js +240 -0
  322. package/dist/vault/vault-memories.js.map +1 -0
  323. package/dist/vault/vault-schema.d.ts +9 -0
  324. package/dist/vault/vault-schema.d.ts.map +1 -0
  325. package/dist/vault/vault-schema.js +179 -0
  326. package/dist/vault/vault-schema.js.map +1 -0
  327. package/dist/vault/vault.d.ts +29 -81
  328. package/dist/vault/vault.d.ts.map +1 -1
  329. package/dist/vault/vault.js +78 -931
  330. package/dist/vault/vault.js.map +1 -1
  331. package/package.json +1 -1
  332. package/src/agency/agency-manager.test.ts +600 -0
  333. package/src/agency/default-rules.test.ts +228 -0
  334. package/src/{__tests__ → brain}/brain-intelligence.test.ts +37 -14
  335. package/src/{__tests__ → brain}/brain.test.ts +1 -1
  336. package/src/brain/intelligence.ts +196 -15
  337. package/src/brain/learning-radar.ts +22 -1
  338. package/src/{__tests__ → brain}/second-brain-features.test.ts +4 -4
  339. package/src/{__tests__ → brain}/session-lifecycle.test.ts +2 -2
  340. package/src/brain/strength-scorer.ts +404 -0
  341. package/src/capabilities/chain-mapping.test.ts +66 -0
  342. package/src/capabilities/registry.test.ts +369 -0
  343. package/src/chat/agent-loop.test.ts +394 -0
  344. package/src/chat/agent-loop.ts +2 -0
  345. package/src/{__tests__ → chat}/chat-differentiators.test.ts +3 -3
  346. package/src/{__tests__ → chat}/chat-enhanced.test.ts +4 -4
  347. package/src/{__tests__ → chat}/chat-transport.test.ts +6 -6
  348. package/src/chat/mcp-bridge.test.ts +173 -0
  349. package/src/chat/notifications.ts +2 -0
  350. package/src/chat/output-compressor.test.ts +164 -0
  351. package/src/claudemd/compose.test.ts +178 -0
  352. package/src/claudemd/compose.ts +1 -1
  353. package/src/claudemd/inject.test.ts +211 -0
  354. package/src/context/context-engine.test.ts +461 -0
  355. package/src/control/identity-manager.test.ts +305 -0
  356. package/src/control/intent-router.test.ts +360 -0
  357. package/src/control/intent-router.ts +13 -4
  358. package/src/curator/classifier.test.ts +104 -0
  359. package/src/curator/contradiction-detector.test.ts +180 -0
  360. package/src/curator/contradiction-detector.ts +87 -0
  361. package/src/{__tests__ → curator}/curator-pipeline-e2e.test.ts +10 -10
  362. package/src/{__tests__ → curator}/curator.test.ts +77 -1
  363. package/src/curator/curator.ts +115 -777
  364. package/src/curator/duplicate-detector.test.ts +183 -0
  365. package/src/curator/duplicate-detector.ts +103 -0
  366. package/src/curator/health-audit.ts +126 -0
  367. package/src/curator/metadata-enricher.ts +84 -0
  368. package/src/curator/quality-gate.test.ts +135 -0
  369. package/src/curator/schema.ts +65 -0
  370. package/src/curator/tag-manager.test.ts +165 -0
  371. package/src/curator/tag-manager.ts +109 -0
  372. package/src/domain-packs/inject-rules.test.ts +117 -0
  373. package/src/domain-packs/knowledge-installer.test.ts +171 -0
  374. package/src/domain-packs/loader.test.ts +86 -0
  375. package/src/domain-packs/pack-runtime.test.ts +140 -0
  376. package/src/domain-packs/skills-installer.test.ts +135 -0
  377. package/src/domain-packs/token-resolver.test.ts +150 -0
  378. package/src/domain-packs/types.test.ts +130 -0
  379. package/src/enforcement/adapters/claude-code.test.ts +216 -0
  380. package/src/enforcement/registry.test.ts +264 -0
  381. package/src/engine/bin/soleri-engine.ts +59 -3
  382. package/src/engine/core-ops.test.ts +254 -0
  383. package/src/engine/core-ops.ts +35 -10
  384. package/src/engine/module-manifest.test.ts +124 -0
  385. package/src/engine/module-manifest.ts +22 -2
  386. package/src/engine/register-engine.test.ts +230 -0
  387. package/src/engine/register-engine.ts +26 -2
  388. package/src/errors/classify.test.ts +199 -0
  389. package/src/errors/retry.test.ts +156 -0
  390. package/src/errors/retry.ts +2 -0
  391. package/src/errors/types.test.ts +108 -0
  392. package/src/events/event-bus.test.ts +149 -0
  393. package/src/extensions/middleware.test.ts +234 -0
  394. package/src/facades/facade-factory.test.ts +424 -0
  395. package/src/flows/chain-runner.test.ts +273 -0
  396. package/src/flows/context-router.test.ts +52 -0
  397. package/src/flows/dispatch-registry.test.ts +128 -0
  398. package/src/flows/epilogue.test.ts +107 -0
  399. package/src/flows/executor.test.ts +263 -0
  400. package/src/flows/gate-evaluator.test.ts +194 -0
  401. package/src/flows/gate-evaluator.ts +25 -0
  402. package/src/flows/types.ts +4 -0
  403. package/src/governance/governance.test.ts +726 -0
  404. package/src/health/health-registry.test.ts +186 -0
  405. package/src/health/vault-integrity.test.ts +110 -0
  406. package/src/index.ts +92 -0
  407. package/src/intake/content-classifier.test.ts +209 -0
  408. package/src/intake/dedup-gate.test.ts +131 -0
  409. package/src/intake/intake-pipeline.test.ts +506 -0
  410. package/src/intake/intake-pipeline.ts +1 -0
  411. package/src/intake/text-ingester.test.ts +194 -0
  412. package/src/intake/text-ingester.ts +2 -0
  413. package/src/llm/key-pool.test.ts +236 -0
  414. package/src/llm/key-pool.ts +3 -4
  415. package/src/llm/llm-client.test.ts +345 -0
  416. package/src/llm/oauth-discovery.test.ts +180 -0
  417. package/src/llm/utils.test.ts +327 -0
  418. package/src/llm/utils.ts +2 -0
  419. package/src/{__tests__ → logging}/logger.test.ts +41 -62
  420. package/src/loop/loop-manager.test.ts +519 -0
  421. package/src/migrations/migration-runner.edge-cases.test.ts +319 -0
  422. package/src/migrations/migration-runner.test-helpers.ts +64 -0
  423. package/src/migrations/migration-runner.test.ts +385 -0
  424. package/src/operator/auto-signal-pipeline.test.ts +207 -0
  425. package/src/operator/operator-profile-extended.test.ts +320 -0
  426. package/src/operator/operator-profile.test.ts +314 -0
  427. package/src/operator/operator-profile.ts +469 -0
  428. package/src/operator/operator-signals-extended.test.ts +245 -0
  429. package/src/operator/operator-signals.test.ts +281 -0
  430. package/src/operator/operator-signals.ts +261 -0
  431. package/src/operator/operator-types.ts +444 -0
  432. package/src/operator/prompts/hook-precompact-operator-dispatch.md +94 -0
  433. package/src/operator/prompts/subagent-soft-signal-extractor.md +125 -0
  434. package/src/operator/prompts/subagent-synthesis-cognition.md +181 -0
  435. package/src/operator/prompts/subagent-synthesis-communication.md +140 -0
  436. package/src/operator/prompts/subagent-synthesis-technical.md +160 -0
  437. package/src/operator/prompts/subagent-synthesis-trust.md +143 -0
  438. package/src/{__tests__ → packs}/pack-lockfile.test.ts +3 -3
  439. package/src/{__tests__ → packs}/pack-system.test.ts +2 -2
  440. package/src/paths.ts +115 -0
  441. package/src/persistence/index.ts +1 -1
  442. package/src/persistence/sqlite-provider.test.ts +540 -0
  443. package/src/persistence/sqlite-provider.ts +8 -5
  444. package/src/persona/defaults.test.ts +59 -0
  445. package/src/persona/loader.test.ts +67 -0
  446. package/src/persona/prompt-generator.test.ts +127 -0
  447. package/src/planning/evidence-collector.test.ts +406 -0
  448. package/src/planning/evidence-collector.ts +50 -0
  449. package/src/planning/gap-analysis-alternatives.test.ts +169 -0
  450. package/src/planning/gap-analysis.ts +21 -636
  451. package/src/planning/gap-passes.test.ts +372 -0
  452. package/src/planning/gap-passes.ts +298 -0
  453. package/src/planning/gap-patterns.test.ts +320 -0
  454. package/src/planning/gap-patterns.ts +234 -0
  455. package/src/planning/gap-types.ts +4 -1
  456. package/src/planning/github-projection.test.ts +177 -0
  457. package/src/planning/github-projection.ts +425 -0
  458. package/src/planning/impact-analyzer.test.ts +180 -0
  459. package/src/planning/impact-analyzer.ts +264 -0
  460. package/src/planning/plan-lifecycle.test.ts +312 -0
  461. package/src/planning/plan-lifecycle.ts +346 -0
  462. package/src/planning/planner-types.ts +215 -0
  463. package/src/{__tests__ → planning}/planner.test.ts +169 -15
  464. package/src/planning/planner.ts +197 -1228
  465. package/src/planning/rationalization-detector.test.ts +171 -0
  466. package/src/planning/rationalization-detector.ts +138 -0
  467. package/src/planning/reconciliation-engine.test.ts +141 -0
  468. package/src/planning/reconciliation-engine.ts +162 -0
  469. package/src/planning/task-verifier.test.ts +235 -0
  470. package/src/planning/task-verifier.ts +303 -0
  471. package/src/planning/verification-protocol.test.ts +201 -0
  472. package/src/playbooks/generic/generic-playbooks.test.ts +438 -0
  473. package/src/playbooks/index.test.ts +77 -0
  474. package/src/playbooks/playbook-executor.test.ts +255 -0
  475. package/src/playbooks/playbook-registry.test.ts +232 -0
  476. package/src/playbooks/playbook-seeder.test.ts +153 -0
  477. package/src/plugins/plugin-loader.test.ts +212 -0
  478. package/src/plugins/plugin-registry.test.ts +272 -0
  479. package/src/project/project-registry.test.ts +428 -0
  480. package/src/prompts/parser.test.ts +100 -0
  481. package/src/prompts/template-manager.test.ts +109 -0
  482. package/src/{__tests__ → queue}/async-infrastructure.test.ts +3 -3
  483. package/src/queue/job-queue.test.ts +331 -0
  484. package/src/queue/pipeline-runner.test.ts +209 -0
  485. package/src/runtime/admin-extra-ops.test.ts +527 -0
  486. package/src/runtime/admin-ops.test.ts +257 -0
  487. package/src/runtime/admin-ops.ts +45 -17
  488. package/src/runtime/admin-setup-ops.test.ts +328 -0
  489. package/src/runtime/admin-setup-ops.ts +20 -43
  490. package/src/runtime/archive-ops.test.ts +269 -0
  491. package/src/runtime/archive-ops.ts +347 -0
  492. package/src/runtime/capture-ops.test.ts +433 -0
  493. package/src/runtime/capture-ops.ts +50 -8
  494. package/src/runtime/chain-ops.test.ts +149 -0
  495. package/src/runtime/claude-md-helpers.test.ts +191 -0
  496. package/src/runtime/claude-md-helpers.ts +1 -1
  497. package/src/runtime/context-health.test.ts +78 -0
  498. package/src/runtime/context-health.ts +85 -0
  499. package/src/runtime/curator-extra-ops.test.ts +202 -0
  500. package/src/runtime/deprecation.test.ts +98 -0
  501. package/src/runtime/domain-ops.test.ts +268 -0
  502. package/src/runtime/facades/admin-facade.test.ts +333 -0
  503. package/src/runtime/facades/agency-facade.test.ts +278 -0
  504. package/src/runtime/facades/archive-facade.test.ts +294 -0
  505. package/src/runtime/facades/archive-facade.ts +14 -0
  506. package/src/runtime/facades/brain-facade.test.ts +714 -0
  507. package/src/runtime/facades/brain-facade.ts +2 -0
  508. package/src/runtime/facades/chat-facade.test.ts +166 -0
  509. package/src/runtime/facades/chat-facade.ts +15 -906
  510. package/src/runtime/facades/chat-service-ops.test.ts +276 -0
  511. package/src/runtime/facades/chat-service-ops.ts +374 -0
  512. package/src/runtime/facades/chat-session-ops.test.ts +197 -0
  513. package/src/runtime/facades/chat-session-ops.ts +146 -0
  514. package/src/runtime/facades/chat-state.ts +60 -0
  515. package/src/runtime/facades/chat-transport-ops.test.ts +269 -0
  516. package/src/runtime/facades/chat-transport-ops.ts +380 -0
  517. package/src/runtime/facades/context-facade.test.ts +108 -0
  518. package/src/runtime/facades/control-facade.test.ts +436 -0
  519. package/src/runtime/facades/control-facade.ts +6 -1
  520. package/src/runtime/facades/curator-facade.test.ts +303 -0
  521. package/src/runtime/facades/index.ts +6 -0
  522. package/src/runtime/facades/loop-facade.test.ts +245 -0
  523. package/src/runtime/facades/memory-facade.test.ts +269 -0
  524. package/src/runtime/facades/memory-facade.ts +78 -6
  525. package/src/runtime/facades/operator-facade.test.ts +208 -0
  526. package/src/runtime/facades/operator-facade.ts +236 -0
  527. package/src/runtime/facades/orchestrate-facade.test.ts +185 -0
  528. package/src/runtime/facades/orchestrate-facade.ts +3 -3
  529. package/src/runtime/facades/plan-facade.test.ts +266 -0
  530. package/src/runtime/facades/plan-facade.ts +42 -6
  531. package/src/runtime/facades/review-facade.test.ts +82 -0
  532. package/src/runtime/facades/review-facade.ts +11 -0
  533. package/src/runtime/facades/sync-facade.test.ts +113 -0
  534. package/src/runtime/facades/sync-facade.ts +11 -0
  535. package/src/runtime/facades/vault-facade.test.ts +631 -0
  536. package/src/runtime/facades/vault-facade.ts +15 -70
  537. package/src/runtime/feature-flags.test.ts +140 -0
  538. package/src/runtime/github-integration.test.ts +89 -0
  539. package/src/runtime/github-integration.ts +159 -0
  540. package/src/runtime/grading-ops.test.ts +141 -0
  541. package/src/runtime/grading-ops.ts +1 -1
  542. package/src/runtime/intake-ops.test.ts +208 -0
  543. package/src/runtime/loop-ops.test.ts +238 -0
  544. package/src/runtime/memory-cross-project-ops.test.ts +177 -0
  545. package/src/runtime/memory-extra-ops.test.ts +453 -0
  546. package/src/runtime/memory-extra-ops.ts +6 -2
  547. package/src/runtime/orchestrate-ops.test.ts +302 -0
  548. package/src/runtime/orchestrate-ops.ts +435 -46
  549. package/src/runtime/pack-ops.test.ts +158 -0
  550. package/src/runtime/planning-extra-ops.test.ts +583 -0
  551. package/src/runtime/planning-extra-ops.ts +72 -4
  552. package/src/{__tests__ → runtime}/playbook-ops-execution.test.ts +3 -3
  553. package/src/runtime/playbook-ops.test.ts +262 -0
  554. package/src/runtime/plugin-ops.test.ts +201 -0
  555. package/src/runtime/project-ops.test.ts +235 -0
  556. package/src/runtime/review-ops.test.ts +142 -0
  557. package/src/runtime/review-ops.ts +99 -0
  558. package/src/runtime/runtime.test.ts +363 -0
  559. package/src/runtime/runtime.ts +39 -12
  560. package/src/runtime/session-briefing.test.ts +302 -0
  561. package/src/runtime/session-briefing.ts +80 -1
  562. package/src/runtime/sync-ops.test.ts +221 -0
  563. package/src/runtime/sync-ops.ts +325 -0
  564. package/src/runtime/telemetry-ops.test.ts +132 -0
  565. package/src/runtime/types.ts +10 -4
  566. package/src/runtime/vault-extra-ops.test.ts +246 -0
  567. package/src/runtime/vault-extra-ops.ts +5 -332
  568. package/src/runtime/vault-linking-ops.test.ts +237 -0
  569. package/src/runtime/vault-sharing-ops.test.ts +130 -0
  570. package/src/runtime/vault-sharing-ops.ts +5 -329
  571. package/src/skills/sync-skills.ts +108 -0
  572. package/src/streams/normalize.test.ts +95 -0
  573. package/src/streams/replayable-stream.test.ts +166 -0
  574. package/src/telemetry/telemetry.test.ts +143 -0
  575. package/src/transport/http-server.test.ts +394 -0
  576. package/src/transport/lsp-server.test.ts +458 -0
  577. package/src/transport/rate-limiter.test.ts +126 -0
  578. package/src/transport/session-manager.test.ts +133 -0
  579. package/src/transport/token-auth.test.ts +136 -0
  580. package/src/transport/ws-server.test.ts +294 -0
  581. package/src/update-check.ts +111 -0
  582. package/src/vault/__tests__/vault-characterization.test.ts +168 -0
  583. package/src/vault/content-hash.test.ts +78 -0
  584. package/src/vault/git-vault-sync.test.ts +234 -0
  585. package/src/vault/knowledge-review.test.ts +269 -0
  586. package/src/vault/linking.test.ts +358 -0
  587. package/src/vault/linking.ts +149 -183
  588. package/src/vault/obsidian-sync.test.ts +342 -0
  589. package/src/vault/playbook.test.ts +152 -0
  590. package/src/vault/scope-detector.test.ts +187 -0
  591. package/src/vault/vault-branching.test.ts +250 -0
  592. package/src/{__tests__ → vault}/vault-connect.test.ts +1 -1
  593. package/src/vault/vault-entries.ts +282 -0
  594. package/src/vault/vault-interfaces.ts +56 -0
  595. package/src/vault/vault-maintenance.ts +205 -0
  596. package/src/vault/vault-manager.test.ts +206 -0
  597. package/src/vault/vault-markdown-sync.test.ts +203 -0
  598. package/src/vault/vault-markdown-sync.ts +160 -0
  599. package/src/vault/vault-memories.ts +339 -0
  600. package/src/{__tests__ → vault}/vault-scaling.test.ts +1 -1
  601. package/src/vault/vault-schema.ts +181 -0
  602. package/src/{__tests__ → vault}/vault-sharing.test.ts +4 -4
  603. package/src/{__tests__ → vault}/vault.test.ts +2 -2
  604. package/src/vault/vault.ts +89 -1171
  605. package/dist/cognee/client.d.ts +0 -43
  606. package/dist/cognee/client.d.ts.map +0 -1
  607. package/dist/cognee/client.js +0 -375
  608. package/dist/cognee/client.js.map +0 -1
  609. package/dist/cognee/sync-manager.d.ts +0 -153
  610. package/dist/cognee/sync-manager.d.ts.map +0 -1
  611. package/dist/cognee/sync-manager.js +0 -390
  612. package/dist/cognee/sync-manager.js.map +0 -1
  613. package/dist/cognee/types.d.ts +0 -62
  614. package/dist/cognee/types.d.ts.map +0 -1
  615. package/dist/cognee/types.js +0 -3
  616. package/dist/cognee/types.js.map +0 -1
  617. package/dist/governance/index.d.ts +0 -3
  618. package/dist/governance/index.d.ts.map +0 -1
  619. package/dist/governance/index.js +0 -2
  620. package/dist/governance/index.js.map +0 -1
  621. package/dist/health/doctor-checks.d.ts +0 -15
  622. package/dist/health/doctor-checks.d.ts.map +0 -1
  623. package/dist/health/doctor-checks.js +0 -98
  624. package/dist/health/doctor-checks.js.map +0 -1
  625. package/dist/persistence/postgres-provider.d.ts +0 -81
  626. package/dist/persistence/postgres-provider.d.ts.map +0 -1
  627. package/dist/persistence/postgres-provider.js +0 -256
  628. package/dist/persistence/postgres-provider.js.map +0 -1
  629. package/dist/runtime/cognee-sync-ops.d.ts +0 -12
  630. package/dist/runtime/cognee-sync-ops.d.ts.map +0 -1
  631. package/dist/runtime/cognee-sync-ops.js +0 -93
  632. package/dist/runtime/cognee-sync-ops.js.map +0 -1
  633. package/dist/runtime/core-ops.d.ts +0 -23
  634. package/dist/runtime/core-ops.d.ts.map +0 -1
  635. package/dist/runtime/core-ops.js +0 -1296
  636. package/dist/runtime/core-ops.js.map +0 -1
  637. package/dist/runtime/facades/cognee-facade.d.ts +0 -8
  638. package/dist/runtime/facades/cognee-facade.d.ts.map +0 -1
  639. package/dist/runtime/facades/cognee-facade.js +0 -156
  640. package/dist/runtime/facades/cognee-facade.js.map +0 -1
  641. package/src/__tests__/admin-extra-ops.test.ts +0 -484
  642. package/src/__tests__/admin-ops.test.ts +0 -268
  643. package/src/__tests__/admin-setup-ops.test.ts +0 -355
  644. package/src/__tests__/agency-manager.test.ts +0 -374
  645. package/src/__tests__/agent-loop.test.ts +0 -256
  646. package/src/__tests__/capture-ops.test.ts +0 -784
  647. package/src/__tests__/claudemd.test.ts +0 -282
  648. package/src/__tests__/content-hash.test.ts +0 -60
  649. package/src/__tests__/context-engine.test.ts +0 -251
  650. package/src/__tests__/core-ops.test.ts +0 -550
  651. package/src/__tests__/curator-extra-ops.test.ts +0 -383
  652. package/src/__tests__/deprecation.test.ts +0 -78
  653. package/src/__tests__/domain-ops.test.ts +0 -226
  654. package/src/__tests__/domain-packs.test.ts +0 -421
  655. package/src/__tests__/enforcement.test.ts +0 -153
  656. package/src/__tests__/errors.test.ts +0 -388
  657. package/src/__tests__/extensions.test.ts +0 -233
  658. package/src/__tests__/facade-factory.test.ts +0 -271
  659. package/src/__tests__/feature-flags.test.ts +0 -137
  660. package/src/__tests__/flows.test.ts +0 -604
  661. package/src/__tests__/git-vault-sync.test.ts +0 -230
  662. package/src/__tests__/governance.test.ts +0 -522
  663. package/src/__tests__/grading-ops.test.ts +0 -361
  664. package/src/__tests__/health-registry.test.ts +0 -173
  665. package/src/__tests__/identity-manager.test.ts +0 -243
  666. package/src/__tests__/intake-pipeline.test.ts +0 -162
  667. package/src/__tests__/intent-router.test.ts +0 -222
  668. package/src/__tests__/knowledge-review.test.ts +0 -104
  669. package/src/__tests__/llm-client.test.ts +0 -69
  670. package/src/__tests__/llm.test.ts +0 -556
  671. package/src/__tests__/loader.test.ts +0 -176
  672. package/src/__tests__/loop-ops.test.ts +0 -469
  673. package/src/__tests__/lsp-transport.test.ts +0 -442
  674. package/src/__tests__/memory-cross-project-ops.test.ts +0 -248
  675. package/src/__tests__/memory-extra-ops.test.ts +0 -352
  676. package/src/__tests__/migration-runner.test.ts +0 -170
  677. package/src/__tests__/module-manifest-drift.test.ts +0 -59
  678. package/src/__tests__/normalize.test.ts +0 -85
  679. package/src/__tests__/obsidian-sync.test.ts +0 -354
  680. package/src/__tests__/orchestrate-ops.test.ts +0 -289
  681. package/src/__tests__/pack-ops.test.ts +0 -146
  682. package/src/__tests__/persistence.test.ts +0 -291
  683. package/src/__tests__/planning-extra-ops.test.ts +0 -706
  684. package/src/__tests__/playbook-executor.test.ts +0 -249
  685. package/src/__tests__/playbook-registry.test.ts +0 -326
  686. package/src/__tests__/playbook-seeder.test.ts +0 -163
  687. package/src/__tests__/playbook.test.ts +0 -389
  688. package/src/__tests__/plugin-ops.test.ts +0 -411
  689. package/src/__tests__/plugin-system.test.ts +0 -509
  690. package/src/__tests__/project-ops.test.ts +0 -381
  691. package/src/__tests__/replayable-stream.test.ts +0 -177
  692. package/src/__tests__/runtime.test.ts +0 -95
  693. package/src/__tests__/scope-detector.test.ts +0 -121
  694. package/src/__tests__/template-manager.test.ts +0 -222
  695. package/src/__tests__/token-resolver.test.ts +0 -79
  696. package/src/__tests__/transport.test.ts +0 -758
  697. package/src/__tests__/vault-branching.test.ts +0 -274
  698. package/src/__tests__/vault-extra-ops.test.ts +0 -482
  699. package/src/__tests__/vault-integrity.test.ts +0 -71
  700. package/src/__tests__/vault-manager.test.ts +0 -238
  701. package/src/__tests__/ws-transport.test.ts +0 -479
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Impact Analyzer — post-implementation impact analysis.
3
+ *
4
+ * Scans modified files for downstream consumers (imports/requires),
5
+ * detects scope violations, and assigns a risk level.
6
+ * Uses only `fs` and `path` — zero external dependencies.
7
+ */
8
+ export interface AffectedConsumer {
9
+ file: string;
10
+ imports: string[];
11
+ }
12
+ export interface ImpactReport {
13
+ modifiedFiles: string[];
14
+ affectedConsumers: AffectedConsumer[];
15
+ untestedConsumers: string[];
16
+ scopeViolations: string[];
17
+ riskLevel: 'low' | 'medium' | 'high';
18
+ recommendations: string[];
19
+ }
20
+ export declare class ImpactAnalyzer {
21
+ /**
22
+ * Analyze the downstream impact of modified files.
23
+ */
24
+ analyzeImpact(modifiedFiles: string[], projectPath: string, planScope?: string[]): ImpactReport;
25
+ }
26
+ //# sourceMappingURL=impact-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-analyzer.d.ts","sourceRoot":"","sources":["../../src/planning/impact-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA6BD,qBAAa,cAAc;IACzB;;OAEG;IACH,aAAa,CACX,aAAa,EAAE,MAAM,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,YAAY;CAyBhB"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Impact Analyzer — post-implementation impact analysis.
3
+ *
4
+ * Scans modified files for downstream consumers (imports/requires),
5
+ * detects scope violations, and assigns a risk level.
6
+ * Uses only `fs` and `path` — zero external dependencies.
7
+ */
8
+ import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs';
9
+ import { join, relative, basename, extname } from 'node:path';
10
+ // ---------------------------------------------------------------------------
11
+ // Constants
12
+ // ---------------------------------------------------------------------------
13
+ const CODE_EXTENSIONS = new Set([
14
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
15
+ '.vue', '.svelte',
16
+ ]);
17
+ const TEST_PATTERNS = [
18
+ /\.test\./,
19
+ /\.spec\./,
20
+ /__tests__/,
21
+ /\.stories\./,
22
+ ];
23
+ const SKIP_DIRS = new Set([
24
+ 'node_modules', '.git', 'dist', 'build', 'coverage',
25
+ '.next', '.nuxt', '.svelte-kit', '.turbo',
26
+ ]);
27
+ const MAX_FILES = 5000;
28
+ // ---------------------------------------------------------------------------
29
+ // ImpactAnalyzer
30
+ // ---------------------------------------------------------------------------
31
+ export class ImpactAnalyzer {
32
+ /**
33
+ * Analyze the downstream impact of modified files.
34
+ */
35
+ analyzeImpact(modifiedFiles, projectPath, planScope) {
36
+ if (modifiedFiles.length === 0 || !existsSync(projectPath)) {
37
+ return emptyReport(modifiedFiles);
38
+ }
39
+ const sourceFiles = collectSourceFiles(projectPath);
40
+ const consumers = findConsumers(modifiedFiles, sourceFiles, projectPath);
41
+ const untestedConsumers = filterUntested(consumers);
42
+ const scopeViolations = detectScopeViolations(modifiedFiles, planScope);
43
+ const riskLevel = assessRisk(consumers.length);
44
+ const recommendations = buildRecommendations(consumers, untestedConsumers, scopeViolations);
45
+ return {
46
+ modifiedFiles,
47
+ affectedConsumers: consumers,
48
+ untestedConsumers,
49
+ scopeViolations,
50
+ riskLevel,
51
+ recommendations,
52
+ };
53
+ }
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Helpers (all synchronous, all < 30 LOC)
57
+ // ---------------------------------------------------------------------------
58
+ function emptyReport(modifiedFiles) {
59
+ return {
60
+ modifiedFiles,
61
+ affectedConsumers: [],
62
+ untestedConsumers: [],
63
+ scopeViolations: [],
64
+ riskLevel: 'low',
65
+ recommendations: [],
66
+ };
67
+ }
68
+ /**
69
+ * Recursively collect source files under projectPath (up to MAX_FILES).
70
+ */
71
+ function collectSourceFiles(dir, result = []) {
72
+ if (result.length >= MAX_FILES)
73
+ return result;
74
+ let entries;
75
+ try {
76
+ entries = readdirSync(dir);
77
+ }
78
+ catch {
79
+ return result;
80
+ }
81
+ for (const entry of entries) {
82
+ if (result.length >= MAX_FILES)
83
+ break;
84
+ if (SKIP_DIRS.has(entry))
85
+ continue;
86
+ const full = join(dir, entry);
87
+ let stat;
88
+ try {
89
+ stat = statSync(full);
90
+ }
91
+ catch {
92
+ continue;
93
+ }
94
+ if (stat.isDirectory()) {
95
+ collectSourceFiles(full, result);
96
+ }
97
+ else if (CODE_EXTENSIONS.has(extname(entry))) {
98
+ result.push(full);
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ /**
104
+ * Find source files that import any of the modified files.
105
+ */
106
+ function findConsumers(modifiedFiles, sourceFiles, projectPath) {
107
+ const patterns = buildImportPatterns(modifiedFiles, projectPath);
108
+ if (patterns.length === 0)
109
+ return [];
110
+ const consumers = [];
111
+ for (const file of sourceFiles) {
112
+ // Skip the modified files themselves
113
+ if (modifiedFiles.some((m) => file.endsWith(m) || file === m))
114
+ continue;
115
+ const matched = matchImports(file, patterns);
116
+ if (matched.length > 0) {
117
+ consumers.push({ file: relative(projectPath, file), imports: matched });
118
+ }
119
+ }
120
+ return consumers;
121
+ }
122
+ /**
123
+ * Build regex-friendly stems from modified file paths.
124
+ */
125
+ function buildImportPatterns(modifiedFiles, projectPath) {
126
+ return modifiedFiles.map((f) => {
127
+ const rel = f.startsWith('/') ? relative(projectPath, f) : f;
128
+ // Strip extension for import matching
129
+ const stem = rel.replace(/\.[^.]+$/, '');
130
+ // Also match the bare filename without extension
131
+ const bare = basename(rel).replace(/\.[^.]+$/, '');
132
+ return bare.length >= 3 ? bare : stem;
133
+ }).filter((p) => p.length >= 3);
134
+ }
135
+ /**
136
+ * Read a file and return which patterns appear in its import/require lines.
137
+ */
138
+ function matchImports(filePath, patterns) {
139
+ let content;
140
+ try {
141
+ content = readFileSync(filePath, 'utf-8');
142
+ }
143
+ catch {
144
+ return [];
145
+ }
146
+ const importRegex = /(?:import\s+.*?from\s+['"]([^'"]+)['"]|require\s*\(\s*['"]([^'"]+)['"]\s*\))/g;
147
+ const importPaths = [];
148
+ let match;
149
+ while ((match = importRegex.exec(content)) !== null) {
150
+ importPaths.push(match[1] ?? match[2]);
151
+ }
152
+ return patterns.filter((p) => importPaths.some((imp) => imp.includes(p)));
153
+ }
154
+ /**
155
+ * Filter consumers that are NOT test files.
156
+ */
157
+ function filterUntested(consumers) {
158
+ return consumers
159
+ .map((c) => c.file)
160
+ .filter((f) => !TEST_PATTERNS.some((p) => p.test(f)));
161
+ }
162
+ /**
163
+ * Flag modified files not in the declared plan scope.
164
+ */
165
+ function detectScopeViolations(modifiedFiles, planScope) {
166
+ if (!planScope || planScope.length === 0)
167
+ return [];
168
+ return modifiedFiles.filter((f) => {
169
+ const lower = f.toLowerCase();
170
+ return !planScope.some((s) => lower.includes(s.toLowerCase()));
171
+ });
172
+ }
173
+ /**
174
+ * Assign risk based on consumer count.
175
+ */
176
+ function assessRisk(consumerCount) {
177
+ if (consumerCount <= 1)
178
+ return 'low';
179
+ if (consumerCount <= 5)
180
+ return 'medium';
181
+ return 'high';
182
+ }
183
+ /**
184
+ * Generate actionable recommendation strings.
185
+ */
186
+ function buildRecommendations(consumers, untestedConsumers, scopeViolations) {
187
+ const recs = [];
188
+ if (consumers.length > 0) {
189
+ recs.push(`Run tests for ${consumers.length} affected consumer(s): ${consumers.map((c) => c.file).slice(0, 5).join(', ')}`);
190
+ }
191
+ for (const file of untestedConsumers.slice(0, 3)) {
192
+ recs.push(`Review import changes in ${file} (no test coverage detected)`);
193
+ }
194
+ for (const file of scopeViolations.slice(0, 3)) {
195
+ recs.push(`Scope violation: ${file} was modified but not in the declared plan scope`);
196
+ }
197
+ return recs;
198
+ }
199
+ //# sourceMappingURL=impact-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-analyzer.js","sourceRoot":"","sources":["../../src/planning/impact-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Plan lifecycle FSM — state transitions, grade thresholds, and structural validation.
3
+ * Extracted from planner.ts to isolate pure lifecycle logic from persistence.
4
+ */
5
+ import type { PlanGap } from './gap-types.js';
6
+ /**
7
+ * Plan lifecycle status.
8
+ * Ported from Salvador's PlanLifecycleStatus with full 8-state lifecycle.
9
+ *
10
+ * Lifecycle: brainstorming → draft → approved → executing → [validating] → reconciling → completed → archived
11
+ */
12
+ export type PlanStatus = 'brainstorming' | 'draft' | 'approved' | 'executing' | 'validating' | 'reconciling' | 'completed' | 'archived';
13
+ /**
14
+ * Valid status transitions.
15
+ * Each key maps to the set of statuses it can transition to.
16
+ * Ported from Salvador's LIFECYCLE_TRANSITIONS.
17
+ */
18
+ export declare const LIFECYCLE_TRANSITIONS: Record<PlanStatus, PlanStatus[]>;
19
+ /**
20
+ * Statuses where the 30-minute TTL should NOT apply.
21
+ * Plans in these states may span multiple sessions.
22
+ */
23
+ export declare const NON_EXPIRING_STATUSES: PlanStatus[];
24
+ /**
25
+ * Validate a lifecycle status transition.
26
+ * Returns true if the transition is valid, false otherwise.
27
+ */
28
+ export declare function isValidTransition(from: PlanStatus, to: PlanStatus): boolean;
29
+ /**
30
+ * Get the valid next statuses for a given status.
31
+ */
32
+ export declare function getValidNextStatuses(status: PlanStatus): PlanStatus[];
33
+ /**
34
+ * Check if a status should have TTL expiration.
35
+ * Plans in executing/reconciling states persist indefinitely.
36
+ */
37
+ export declare function shouldExpire(status: PlanStatus): boolean;
38
+ /**
39
+ * Apply an FSM transition to a plan status.
40
+ * Throws if the transition is invalid. Returns the new status and timestamp.
41
+ * Does NOT mutate the plan — caller applies the result.
42
+ */
43
+ export declare function applyTransition(currentStatus: PlanStatus, targetStatus: PlanStatus): {
44
+ status: PlanStatus;
45
+ updatedAt: number;
46
+ };
47
+ export type PlanGrade = 'A+' | 'A' | 'B' | 'C' | 'D' | 'F';
48
+ /**
49
+ * Convert a numeric score to a letter grade.
50
+ * Thresholds: A+=95, A=90, B=80, C=70, D=60, F=<60
51
+ */
52
+ export declare function scoreToGrade(score: number): PlanGrade;
53
+ /**
54
+ * Convert a letter grade to the minimum score required.
55
+ */
56
+ export declare function gradeToMinScore(grade: PlanGrade): number;
57
+ /**
58
+ * Error thrown when a plan's grade is below the minimum required for approval.
59
+ */
60
+ export declare class PlanGradeRejectionError extends Error {
61
+ readonly grade: PlanGrade;
62
+ readonly score: number;
63
+ readonly minGrade: PlanGrade;
64
+ readonly gaps: PlanGap[];
65
+ constructor(grade: PlanGrade, score: number, minGrade: PlanGrade, gaps: PlanGap[]);
66
+ }
67
+ /**
68
+ * Calculate score from gaps with severity-weighted deductions and iteration leniency.
69
+ */
70
+ export declare function calculateScore(gaps: PlanGap[], iteration?: number): number;
71
+ /**
72
+ * Detect circular dependencies among tasks.
73
+ * Uses DFS with in-stack tracking.
74
+ */
75
+ export declare function hasCircularDependencies(tasks: ReadonlyArray<{
76
+ id: string;
77
+ dependsOn?: string[];
78
+ }>): boolean;
79
+ import type { PlanTask, TaskStatus, Plan, PlanDecision } from './planner-types.js';
80
+ export interface IterateChanges {
81
+ objective?: string;
82
+ scope?: string;
83
+ decisions?: (string | PlanDecision)[];
84
+ addTasks?: Array<{
85
+ title: string;
86
+ description: string;
87
+ }>;
88
+ removeTasks?: string[];
89
+ approach?: string;
90
+ context?: string;
91
+ success_criteria?: string[];
92
+ tool_chain?: string[];
93
+ flow?: string;
94
+ target_mode?: string;
95
+ }
96
+ /**
97
+ * Apply iteration changes to a plan (mutates in place).
98
+ * Caller is responsible for status validation and persistence.
99
+ */
100
+ export declare function applyIteration(plan: Plan, changes: IterateChanges): void;
101
+ /**
102
+ * Replace plan tasks with a new split set, validating dependency references.
103
+ * Caller is responsible for status validation and persistence.
104
+ */
105
+ /**
106
+ * Apply a task status update with auto-metrics (startedAt, completedAt, durationMs).
107
+ * Caller is responsible for plan status validation and persistence.
108
+ */
109
+ export declare function applyTaskStatusUpdate(task: PlanTask, status: TaskStatus): void;
110
+ /**
111
+ * Create a new Plan object (factory). Does not persist.
112
+ */
113
+ export declare function createPlanObject(params: {
114
+ objective: string;
115
+ scope: string;
116
+ decisions?: (string | PlanDecision)[];
117
+ tasks?: Array<{
118
+ title: string;
119
+ description: string;
120
+ }>;
121
+ approach?: string;
122
+ context?: string;
123
+ success_criteria?: string[];
124
+ tool_chain?: string[];
125
+ flow?: string;
126
+ target_mode?: string;
127
+ alternatives?: import('./planner-types.js').PlanAlternative[];
128
+ initialStatus?: 'brainstorming' | 'draft';
129
+ }): Plan;
130
+ export declare function applySplitTasks(plan: Plan, tasks: Array<{
131
+ title: string;
132
+ description: string;
133
+ dependsOn?: string[];
134
+ acceptanceCriteria?: string[];
135
+ }>): void;
136
+ //# sourceMappingURL=plan-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-lifecycle.d.ts","sourceRoot":"","sources":["../../src/planning/plan-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Plan lifecycle FSM — state transitions, grade thresholds, and structural validation.
3
+ * Extracted from planner.ts to isolate pure lifecycle logic from persistence.
4
+ */
5
+ import { SEVERITY_WEIGHTS, CATEGORY_PENALTY_CAPS, CATEGORY_BONUS_CAPS } from './gap-types.js';
6
+ /**
7
+ * Valid status transitions.
8
+ * Each key maps to the set of statuses it can transition to.
9
+ * Ported from Salvador's LIFECYCLE_TRANSITIONS.
10
+ */
11
+ export const LIFECYCLE_TRANSITIONS = {
12
+ brainstorming: ['draft'],
13
+ draft: ['approved'],
14
+ approved: ['executing'],
15
+ executing: ['validating', 'reconciling'],
16
+ validating: ['reconciling', 'executing'],
17
+ reconciling: ['completed'],
18
+ completed: ['archived'],
19
+ archived: [],
20
+ };
21
+ /**
22
+ * Statuses where the 30-minute TTL should NOT apply.
23
+ * Plans in these states may span multiple sessions.
24
+ */
25
+ export const NON_EXPIRING_STATUSES = [
26
+ 'brainstorming',
27
+ 'executing',
28
+ 'validating',
29
+ 'reconciling',
30
+ ];
31
+ /**
32
+ * Validate a lifecycle status transition.
33
+ * Returns true if the transition is valid, false otherwise.
34
+ */
35
+ export function isValidTransition(from, to) {
36
+ return LIFECYCLE_TRANSITIONS[from].includes(to);
37
+ }
38
+ /**
39
+ * Get the valid next statuses for a given status.
40
+ */
41
+ export function getValidNextStatuses(status) {
42
+ return LIFECYCLE_TRANSITIONS[status];
43
+ }
44
+ /**
45
+ * Check if a status should have TTL expiration.
46
+ * Plans in executing/reconciling states persist indefinitely.
47
+ */
48
+ export function shouldExpire(status) {
49
+ return !NON_EXPIRING_STATUSES.includes(status);
50
+ }
51
+ /**
52
+ * Apply an FSM transition to a plan status.
53
+ * Throws if the transition is invalid. Returns the new status and timestamp.
54
+ * Does NOT mutate the plan — caller applies the result.
55
+ */
56
+ export function applyTransition(currentStatus, targetStatus) {
57
+ if (!isValidTransition(currentStatus, targetStatus)) {
58
+ const valid = getValidNextStatuses(currentStatus);
59
+ throw new Error(`Invalid transition: '${currentStatus}' → '${targetStatus}'. ` +
60
+ `Valid transitions from '${currentStatus}': ${valid.length > 0 ? valid.join(', ') : 'none'}`);
61
+ }
62
+ return { status: targetStatus, updatedAt: Date.now() };
63
+ }
64
+ /**
65
+ * Convert a numeric score to a letter grade.
66
+ * Thresholds: A+=95, A=90, B=80, C=70, D=60, F=<60
67
+ */
68
+ export function scoreToGrade(score) {
69
+ if (score >= 95)
70
+ return 'A+';
71
+ if (score >= 90)
72
+ return 'A';
73
+ if (score >= 80)
74
+ return 'B';
75
+ if (score >= 70)
76
+ return 'C';
77
+ if (score >= 60)
78
+ return 'D';
79
+ return 'F';
80
+ }
81
+ /**
82
+ * Convert a letter grade to the minimum score required.
83
+ */
84
+ export function gradeToMinScore(grade) {
85
+ switch (grade) {
86
+ case 'A+':
87
+ return 95;
88
+ case 'A':
89
+ return 90;
90
+ case 'B':
91
+ return 80;
92
+ case 'C':
93
+ return 70;
94
+ case 'D':
95
+ return 60;
96
+ case 'F':
97
+ return 0;
98
+ }
99
+ }
100
+ /**
101
+ * Error thrown when a plan's grade is below the minimum required for approval.
102
+ */
103
+ export class PlanGradeRejectionError extends Error {
104
+ grade;
105
+ score;
106
+ minGrade;
107
+ gaps;
108
+ constructor(grade, score, minGrade, gaps) {
109
+ const gapSummary = gaps
110
+ .filter((g) => g.severity === 'critical' || g.severity === 'major')
111
+ .map((g) => `- [${g.severity}] ${g.description}`)
112
+ .join('\n');
113
+ super(`Plan grade ${grade} (${score}/100) is below the minimum required grade ${minGrade} for approval. ` +
114
+ `Iterate on the plan to address gaps before approving.\n${gapSummary}`);
115
+ this.name = 'PlanGradeRejectionError';
116
+ this.grade = grade;
117
+ this.score = score;
118
+ this.minGrade = minGrade;
119
+ this.gaps = gaps;
120
+ }
121
+ }
122
+ // ─── Score Calculation ───────────────────────────────────────────
123
+ /**
124
+ * Calculate score from gaps with severity-weighted deductions and iteration leniency.
125
+ */
126
+ export function calculateScore(gaps, iteration = 1) {
127
+ const categoryDeductions = new Map();
128
+ const categoryBonuses = new Map();
129
+ for (const gap of gaps) {
130
+ let weight = SEVERITY_WEIGHTS[gap.severity];
131
+ if (gap.severity === 'minor') {
132
+ if (iteration === 1)
133
+ weight = 0;
134
+ else if (iteration === 2)
135
+ weight = 1;
136
+ }
137
+ const category = gap.category;
138
+ if (weight < 0) {
139
+ categoryBonuses.set(category, (categoryBonuses.get(category) ?? 0) + Math.abs(weight));
140
+ }
141
+ else {
142
+ categoryDeductions.set(category, (categoryDeductions.get(category) ?? 0) + weight);
143
+ }
144
+ }
145
+ let deductions = 0;
146
+ for (const [category, total] of categoryDeductions) {
147
+ const cap = CATEGORY_PENALTY_CAPS[category];
148
+ deductions += cap !== undefined ? Math.min(total, cap) : total;
149
+ }
150
+ let bonuses = 0;
151
+ for (const [category, total] of categoryBonuses) {
152
+ const cap = CATEGORY_BONUS_CAPS[category];
153
+ bonuses += cap !== undefined ? Math.min(total, cap) : total;
154
+ }
155
+ return Math.max(0, Math.min(100, 100 - deductions + bonuses));
156
+ }
157
+ // ─── Structural Validation ───────────────────────────────────────
158
+ /**
159
+ * Detect circular dependencies among tasks.
160
+ * Uses DFS with in-stack tracking.
161
+ */
162
+ export function hasCircularDependencies(tasks) {
163
+ const visited = new Set();
164
+ const inStack = new Set();
165
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
166
+ const dfs = (taskId) => {
167
+ if (inStack.has(taskId))
168
+ return true;
169
+ if (visited.has(taskId))
170
+ return false;
171
+ visited.add(taskId);
172
+ inStack.add(taskId);
173
+ const task = taskMap.get(taskId);
174
+ if (task?.dependsOn) {
175
+ for (const dep of task.dependsOn) {
176
+ if (dfs(dep))
177
+ return true;
178
+ }
179
+ }
180
+ inStack.delete(taskId);
181
+ return false;
182
+ };
183
+ for (const task of tasks) {
184
+ if (dfs(task.id))
185
+ return true;
186
+ }
187
+ return false;
188
+ }
189
+ /**
190
+ * Apply iteration changes to a plan (mutates in place).
191
+ * Caller is responsible for status validation and persistence.
192
+ */
193
+ export function applyIteration(plan, changes) {
194
+ const now = Date.now();
195
+ if (changes.objective !== undefined)
196
+ plan.objective = changes.objective;
197
+ if (changes.scope !== undefined)
198
+ plan.scope = changes.scope;
199
+ if (changes.decisions !== undefined)
200
+ plan.decisions = changes.decisions;
201
+ if (changes.approach !== undefined)
202
+ plan.approach = changes.approach;
203
+ if (changes.context !== undefined)
204
+ plan.context = changes.context;
205
+ if (changes.success_criteria !== undefined)
206
+ plan.success_criteria = changes.success_criteria;
207
+ if (changes.tool_chain !== undefined)
208
+ plan.tool_chain = changes.tool_chain;
209
+ if (changes.flow !== undefined)
210
+ plan.flow = changes.flow;
211
+ if (changes.target_mode !== undefined)
212
+ plan.target_mode = changes.target_mode;
213
+ if (changes.removeTasks?.length) {
214
+ const removeSet = new Set(changes.removeTasks);
215
+ plan.tasks = plan.tasks.filter((t) => !removeSet.has(t.id));
216
+ }
217
+ if (changes.addTasks?.length) {
218
+ const maxIndex = plan.tasks.reduce((max, t) => {
219
+ const num = parseInt(t.id.replace('task-', ''), 10);
220
+ return isNaN(num) ? max : Math.max(max, num);
221
+ }, 0);
222
+ for (let i = 0; i < changes.addTasks.length; i++) {
223
+ plan.tasks.push({
224
+ id: `task-${maxIndex + i + 1}`, title: changes.addTasks[i].title,
225
+ description: changes.addTasks[i].description, status: 'pending', updatedAt: now,
226
+ });
227
+ }
228
+ }
229
+ plan.updatedAt = now;
230
+ }
231
+ /**
232
+ * Replace plan tasks with a new split set, validating dependency references.
233
+ * Caller is responsible for status validation and persistence.
234
+ */
235
+ /**
236
+ * Apply a task status update with auto-metrics (startedAt, completedAt, durationMs).
237
+ * Caller is responsible for plan status validation and persistence.
238
+ */
239
+ export function applyTaskStatusUpdate(task, status) {
240
+ const now = Date.now();
241
+ if (status === 'in_progress' && !task.startedAt)
242
+ task.startedAt = now;
243
+ if (status === 'completed' || status === 'skipped' || status === 'failed') {
244
+ task.completedAt = now;
245
+ if (task.startedAt) {
246
+ if (!task.metrics)
247
+ task.metrics = {};
248
+ task.metrics.durationMs = now - task.startedAt;
249
+ }
250
+ }
251
+ task.status = status;
252
+ task.updatedAt = now;
253
+ }
254
+ /**
255
+ * Create a new Plan object (factory). Does not persist.
256
+ */
257
+ export function createPlanObject(params) {
258
+ const now = Date.now();
259
+ return {
260
+ id: `plan-${now}-${Math.random().toString(36).slice(2, 8)}`,
261
+ objective: params.objective, scope: params.scope,
262
+ status: params.initialStatus ?? 'draft',
263
+ decisions: params.decisions ?? [],
264
+ tasks: (params.tasks ?? []).map((t, i) => ({
265
+ id: `task-${i + 1}`, title: t.title, description: t.description,
266
+ status: 'pending', updatedAt: now,
267
+ })),
268
+ ...(params.approach !== undefined && { approach: params.approach }),
269
+ ...(params.context !== undefined && { context: params.context }),
270
+ ...(params.success_criteria !== undefined && { success_criteria: params.success_criteria }),
271
+ ...(params.tool_chain !== undefined && { tool_chain: params.tool_chain }),
272
+ ...(params.flow !== undefined && { flow: params.flow }),
273
+ ...(params.target_mode !== undefined && { target_mode: params.target_mode }),
274
+ ...(params.alternatives !== undefined && { alternatives: params.alternatives }),
275
+ checks: [], createdAt: now, updatedAt: now,
276
+ };
277
+ }
278
+ export function applySplitTasks(plan, tasks) {
279
+ const now = Date.now();
280
+ plan.tasks = tasks.map((t, i) => ({
281
+ id: `task-${i + 1}`, title: t.title, description: t.description,
282
+ status: 'pending', dependsOn: t.dependsOn,
283
+ ...(t.acceptanceCriteria && { acceptanceCriteria: t.acceptanceCriteria }), updatedAt: now,
284
+ }));
285
+ const taskIds = new Set(plan.tasks.map((t) => t.id));
286
+ for (const task of plan.tasks) {
287
+ if (task.dependsOn) {
288
+ for (const dep of task.dependsOn) {
289
+ if (!taskIds.has(dep))
290
+ throw new Error(`Task '${task.id}' depends on unknown task '${dep}'`);
291
+ }
292
+ }
293
+ }
294
+ plan.updatedAt = now;
295
+ }
296
+ //# sourceMappingURL=plan-lifecycle.js.map