@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,127 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generatePersonaInstructions, getRandomSignoff } from './prompt-generator.js';
3
+ import type { PersonaConfig } from './types.js';
4
+ import { createDefaultPersona } from './defaults.js';
5
+
6
+ function makeBlankPersona(name = 'TestBot'): PersonaConfig {
7
+ return {
8
+ name,
9
+ template: 'none',
10
+ inspiration: '',
11
+ culture: '',
12
+ metaphors: [],
13
+ voice: '',
14
+ traits: [],
15
+ quirks: [],
16
+ opinions: [],
17
+ languageRule: '',
18
+ nameRule: '',
19
+ greetings: [],
20
+ signoffs: [],
21
+ };
22
+ }
23
+
24
+ describe('generatePersonaInstructions', () => {
25
+ it('returns generic instructions for blank persona', () => {
26
+ const blank = makeBlankPersona('BlankBot');
27
+ const result = generatePersonaInstructions(blank);
28
+ expect(result.instructions).toContain('BlankBot');
29
+ expect(result.instructions).toContain('No persona configured');
30
+ expect(result.greeting).toContain('BlankBot');
31
+ });
32
+
33
+ it('generates full instructions for a configured persona', () => {
34
+ const persona = createDefaultPersona('Artisan');
35
+ const result = generatePersonaInstructions(persona);
36
+
37
+ expect(result.instructions).toContain('# Persona: Artisan');
38
+ expect(result.instructions).toContain('## Voice');
39
+ expect(result.instructions).toContain('## Personality Traits');
40
+ expect(result.instructions).toContain('## Character Quirks');
41
+ expect(result.instructions).toContain('## Cultural Texture');
42
+ expect(result.instructions).toContain('## Metaphor Domain');
43
+ expect(result.instructions).toContain('## Opinions');
44
+ expect(result.instructions).toContain('## Identity Persistence');
45
+ expect(result.instructions).toContain('## Important');
46
+ });
47
+
48
+ it('includes inspiration when present', () => {
49
+ const persona = createDefaultPersona('A');
50
+ const result = generatePersonaInstructions(persona);
51
+ expect(result.instructions).toContain('inspired by');
52
+ });
53
+
54
+ it('omits sections when arrays are empty', () => {
55
+ const persona: PersonaConfig = {
56
+ ...makeBlankPersona('Minimal'),
57
+ template: 'custom',
58
+ voice: 'Calm',
59
+ };
60
+ const result = generatePersonaInstructions(persona);
61
+ expect(result.instructions).not.toContain('## Personality Traits');
62
+ expect(result.instructions).not.toContain('## Character Quirks');
63
+ expect(result.instructions).not.toContain('## Metaphor Domain');
64
+ expect(result.instructions).not.toContain('## Opinions');
65
+ });
66
+
67
+ it('omits cultural section when culture is empty', () => {
68
+ const persona: PersonaConfig = {
69
+ ...makeBlankPersona(),
70
+ template: 'custom',
71
+ voice: 'Direct',
72
+ };
73
+ const result = generatePersonaInstructions(persona);
74
+ expect(result.instructions).not.toContain('## Cultural Texture');
75
+ });
76
+
77
+ it('omits identity persistence when nameRule is empty', () => {
78
+ const persona: PersonaConfig = {
79
+ ...makeBlankPersona(),
80
+ template: 'custom',
81
+ voice: 'Direct',
82
+ nameRule: '',
83
+ };
84
+ const result = generatePersonaInstructions(persona);
85
+ expect(result.instructions).not.toContain('## Identity Persistence');
86
+ });
87
+
88
+ it('picks greeting from pool when available', () => {
89
+ const persona: PersonaConfig = {
90
+ ...makeBlankPersona(),
91
+ template: 'custom',
92
+ voice: 'Warm',
93
+ greetings: ['Ciao!'],
94
+ };
95
+ const result = generatePersonaInstructions(persona);
96
+ expect(result.greeting).toBe('Ciao!');
97
+ });
98
+
99
+ it('falls back to generic greeting when pool is empty', () => {
100
+ const persona: PersonaConfig = {
101
+ ...makeBlankPersona('NoGreet'),
102
+ template: 'custom',
103
+ voice: 'Cool',
104
+ greetings: [],
105
+ };
106
+ const result = generatePersonaInstructions(persona);
107
+ expect(result.greeting).toContain('NoGreet');
108
+ });
109
+ });
110
+
111
+ describe('getRandomSignoff', () => {
112
+ it('returns a signoff from the pool', () => {
113
+ const persona = createDefaultPersona('Agent');
114
+ const signoff = getRandomSignoff(persona);
115
+ expect(persona.signoffs).toContain(signoff);
116
+ });
117
+
118
+ it('returns fallback when signoffs array is empty', () => {
119
+ const persona = makeBlankPersona();
120
+ expect(getRandomSignoff(persona)).toBe('Until next time!');
121
+ });
122
+
123
+ it('returns the only signoff when pool has one entry', () => {
124
+ const persona: PersonaConfig = { ...makeBlankPersona(), signoffs: ['Bye!'] };
125
+ expect(getRandomSignoff(persona)).toBe('Bye!');
126
+ });
127
+ });
@@ -0,0 +1,406 @@
1
+ /**
2
+ * Tests for evidence-collector.ts — git evidence collection and
3
+ * verification gap detection for plan reconciliation.
4
+ */
5
+
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import type { Plan, PlanTask } from './planner.js';
8
+ import type { GitTaskEvidence } from './evidence-collector.js';
9
+ import { collectGitEvidence, collectVerificationGaps } from './evidence-collector.js';
10
+
11
+ // Mock child_process.execFileSync
12
+ vi.mock('node:child_process', () => ({
13
+ execFileSync: vi.fn(),
14
+ }));
15
+
16
+ import { execFileSync } from 'node:child_process';
17
+ const mockExecFileSync = vi.mocked(execFileSync);
18
+
19
+ function makePlan(overrides: Partial<Plan> = {}): Plan {
20
+ return {
21
+ id: 'plan-test-123',
22
+ objective: 'Implement authentication module',
23
+ scope: 'Auth only. Not including OAuth.',
24
+ status: 'executing',
25
+ decisions: [],
26
+ tasks: [
27
+ { id: 'task-1', title: 'Add auth middleware', description: 'Create auth middleware for Express', status: 'completed', updatedAt: Date.now() },
28
+ { id: 'task-2', title: 'Add login endpoint', description: 'POST /auth/login endpoint', status: 'completed', updatedAt: Date.now() },
29
+ { id: 'task-3', title: 'Add JWT utils', description: 'JWT signing and verification utilities', status: 'pending', updatedAt: Date.now() },
30
+ ],
31
+ checks: [],
32
+ createdAt: Date.now(),
33
+ updatedAt: Date.now(),
34
+ ...overrides,
35
+ };
36
+ }
37
+
38
+ function makeTask(overrides: Partial<PlanTask> = {}): PlanTask {
39
+ return {
40
+ id: 'task-1',
41
+ title: 'Fix auth bug',
42
+ description: 'Fix the authentication timeout bug',
43
+ status: 'completed',
44
+ updatedAt: Date.now(),
45
+ ...overrides,
46
+ };
47
+ }
48
+
49
+ beforeEach(() => {
50
+ vi.clearAllMocks();
51
+ });
52
+
53
+ describe('collectGitEvidence', () => {
54
+ it('returns report with matched task evidence', () => {
55
+ mockExecFileSync
56
+ .mockReturnValueOnce('feature/auth\n') // git rev-parse
57
+ .mockReturnValueOnce('M\tsrc/auth/middleware.ts\nA\tsrc/auth/login.ts\nM\tsrc/auth/jwt.ts\n'); // git diff
58
+
59
+ const plan = makePlan();
60
+ const report = collectGitEvidence(plan, '/project', 'main');
61
+
62
+ expect(report.planId).toBe('plan-test-123');
63
+ expect(report.planObjective).toBe('Implement authentication module');
64
+ expect(report.evidenceSources).toEqual(['git']);
65
+ expect(report.taskEvidence).toHaveLength(3);
66
+ });
67
+
68
+ it('marks tasks as DONE when status is completed and files match', () => {
69
+ mockExecFileSync
70
+ .mockReturnValueOnce('feature/auth\n')
71
+ .mockReturnValueOnce('M\tsrc/auth/middleware.ts\nA\tsrc/auth/login.ts\n');
72
+
73
+ const plan = makePlan();
74
+ const report = collectGitEvidence(plan, '/project', 'main');
75
+
76
+ const middlewareTask = report.taskEvidence.find((te) => te.taskId === 'task-1');
77
+ expect(middlewareTask?.verdict).toBe('DONE');
78
+ });
79
+
80
+ it('marks tasks as MISSING when no files match', () => {
81
+ mockExecFileSync
82
+ .mockReturnValueOnce('feature/auth\n')
83
+ .mockReturnValueOnce('M\tsrc/unrelated/file.ts\n');
84
+
85
+ const plan = makePlan();
86
+ const report = collectGitEvidence(plan, '/project', 'main');
87
+
88
+ // All tasks should be MISSING since "unrelated" doesn't match any task keywords
89
+ const missing = report.taskEvidence.filter((te) => te.verdict === 'MISSING');
90
+ expect(missing.length).toBeGreaterThan(0);
91
+ });
92
+
93
+ it('marks skipped tasks as SKIPPED', () => {
94
+ mockExecFileSync
95
+ .mockReturnValueOnce('feature/auth\n')
96
+ .mockReturnValueOnce('M\tsrc/auth/middleware.ts\n');
97
+
98
+ const plan = makePlan({
99
+ tasks: [
100
+ { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'skipped', updatedAt: Date.now() },
101
+ ],
102
+ });
103
+ const report = collectGitEvidence(plan, '/project', 'main');
104
+
105
+ expect(report.taskEvidence[0].verdict).toBe('SKIPPED');
106
+ });
107
+
108
+ it('identifies unplanned changes', () => {
109
+ mockExecFileSync
110
+ .mockReturnValueOnce('feature/auth\n')
111
+ .mockReturnValueOnce('M\tsrc/auth/middleware.ts\nM\tsrc/config/database.ts\n');
112
+
113
+ const plan = makePlan({
114
+ tasks: [
115
+ { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'completed', updatedAt: Date.now() },
116
+ ],
117
+ });
118
+ const report = collectGitEvidence(plan, '/project', 'main');
119
+
120
+ expect(report.unplannedChanges.length).toBeGreaterThanOrEqual(1);
121
+ const configChange = report.unplannedChanges.find((uc) => uc.file.path === 'src/config/database.ts');
122
+ expect(configChange).toBeDefined();
123
+ expect(configChange?.possibleReason).toBe('configuration change');
124
+ });
125
+
126
+ it('calculates accuracy score', () => {
127
+ mockExecFileSync
128
+ .mockReturnValueOnce('feature/auth\n')
129
+ .mockReturnValueOnce('M\tsrc/auth/middleware.ts\nA\tsrc/auth/login.ts\n');
130
+
131
+ const plan = makePlan({
132
+ tasks: [
133
+ { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'completed', updatedAt: Date.now() },
134
+ { id: 'task-2', title: 'Add login endpoint', description: 'Login endpoint', status: 'completed', updatedAt: Date.now() },
135
+ ],
136
+ });
137
+ const report = collectGitEvidence(plan, '/project', 'main');
138
+
139
+ expect(report.accuracy).toBeGreaterThanOrEqual(0);
140
+ expect(report.accuracy).toBeLessThanOrEqual(100);
141
+ });
142
+
143
+ it('returns 100% accuracy for empty task list', () => {
144
+ mockExecFileSync
145
+ .mockReturnValueOnce('main\n')
146
+ .mockReturnValueOnce('');
147
+
148
+ const plan = makePlan({ tasks: [] });
149
+ const report = collectGitEvidence(plan, '/project', 'main');
150
+
151
+ expect(report.accuracy).toBe(100);
152
+ });
153
+
154
+ it('handles git failures gracefully', () => {
155
+ mockExecFileSync.mockImplementation(() => {
156
+ throw new Error('Not a git repository');
157
+ });
158
+
159
+ const plan = makePlan();
160
+ const report = collectGitEvidence(plan, '/not-a-repo', 'main');
161
+
162
+ expect(report.taskEvidence).toHaveLength(3);
163
+ expect(report.taskEvidence.every((te) => te.verdict === 'MISSING')).toBe(true);
164
+ expect(report.unplannedChanges).toHaveLength(0);
165
+ });
166
+
167
+ it('falls back to HEAD~5 when branch diff fails', () => {
168
+ mockExecFileSync
169
+ .mockReturnValueOnce('feature/auth\n') // rev-parse
170
+ .mockImplementationOnce(() => { throw new Error('bad revision'); }) // main...HEAD fails
171
+ .mockReturnValueOnce('M\tsrc/auth/middleware.ts\n'); // HEAD~5 fallback
172
+
173
+ const plan = makePlan({
174
+ tasks: [
175
+ { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'completed', updatedAt: Date.now() },
176
+ ],
177
+ });
178
+ const report = collectGitEvidence(plan, '/project', 'main');
179
+
180
+ expect(report.taskEvidence).toHaveLength(1);
181
+ expect(report.taskEvidence[0].verdict).toBe('DONE');
182
+ });
183
+
184
+ it('uses HEAD~10 when on the base branch', () => {
185
+ mockExecFileSync
186
+ .mockReturnValueOnce('main\n') // on main branch
187
+ .mockReturnValueOnce('A\tsrc/auth/login.ts\n'); // diff HEAD~10
188
+
189
+ const plan = makePlan({
190
+ tasks: [
191
+ { id: 'task-1', title: 'Add login endpoint', description: 'Login endpoint', status: 'completed', updatedAt: Date.now() },
192
+ ],
193
+ });
194
+ collectGitEvidence(plan, '/project', 'main');
195
+
196
+ // Second call should use HEAD~10, not main...HEAD
197
+ const diffCall = mockExecFileSync.mock.calls[1];
198
+ const diffArgs = diffCall[1] as string[];
199
+ expect(diffArgs.some((arg: string) => arg.includes('HEAD~10'))).toBe(true);
200
+ });
201
+
202
+ it('parses renamed files correctly', () => {
203
+ mockExecFileSync
204
+ .mockReturnValueOnce('feature/auth\n')
205
+ .mockReturnValueOnce('R100\tsrc/old-auth.ts\tsrc/auth/middleware.ts\n');
206
+
207
+ const plan = makePlan({
208
+ tasks: [
209
+ { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'completed', updatedAt: Date.now() },
210
+ ],
211
+ });
212
+ const report = collectGitEvidence(plan, '/project', 'main');
213
+
214
+ // Should use the new path (after tab) for matching
215
+ const task = report.taskEvidence[0];
216
+ expect(task.matchedFiles.length).toBeGreaterThanOrEqual(1);
217
+ expect(task.matchedFiles[0].status).toBe('renamed');
218
+ });
219
+
220
+ it('parses deleted files', () => {
221
+ mockExecFileSync
222
+ .mockReturnValueOnce('feature/auth\n')
223
+ .mockReturnValueOnce('D\tsrc/auth/old-middleware.ts\n');
224
+
225
+ const plan = makePlan({
226
+ tasks: [
227
+ { id: 'task-1', title: 'Remove old auth middleware', description: 'Delete old auth middleware files', status: 'completed', updatedAt: Date.now() },
228
+ ],
229
+ });
230
+ const report = collectGitEvidence(plan, '/project', 'main');
231
+
232
+ const task = report.taskEvidence[0];
233
+ if (task.matchedFiles.length > 0) {
234
+ expect(task.matchedFiles[0].status).toBe('deleted');
235
+ }
236
+ });
237
+
238
+ it('builds a human-readable summary', () => {
239
+ mockExecFileSync
240
+ .mockReturnValueOnce('feature/auth\n')
241
+ .mockReturnValueOnce('M\tsrc/auth/middleware.ts\n');
242
+
243
+ const plan = makePlan();
244
+ const report = collectGitEvidence(plan, '/project', 'main');
245
+
246
+ expect(report.summary).toContain('/');
247
+ expect(report.summary).toContain('tasks verified by git evidence');
248
+ });
249
+
250
+ it('infers reasons for unplanned changes', () => {
251
+ mockExecFileSync
252
+ .mockReturnValueOnce('feature/auth\n')
253
+ .mockReturnValueOnce(
254
+ 'M\tpackage.json\n' +
255
+ 'M\tsrc/types/auth.d.ts\n' +
256
+ 'A\tsrc/tests/auth.test.ts\n' +
257
+ 'M\tREADME.md\n' +
258
+ 'M\tsrc/index.ts\n' +
259
+ 'M\tsrc/random/file.ts\n'
260
+ );
261
+
262
+ const plan = makePlan({ tasks: [] });
263
+ const report = collectGitEvidence(plan, '/project', 'main');
264
+
265
+ const reasons = report.unplannedChanges.map((uc) => uc.possibleReason);
266
+ expect(reasons).toContain('dependency update');
267
+ expect(reasons).toContain('type definition update');
268
+ expect(reasons).toContain('test file');
269
+ expect(reasons).toContain('documentation');
270
+ expect(reasons).toContain('likely re-export update');
271
+ expect(reasons).toContain('unplanned scope');
272
+ });
273
+ });
274
+
275
+ describe('collectVerificationGaps', () => {
276
+ it('returns empty array when no tasks have verification', () => {
277
+ const tasks: PlanTask[] = [makeTask()];
278
+ const evidence: GitTaskEvidence[] = [
279
+ { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
280
+ ];
281
+
282
+ const gaps = collectVerificationGaps(tasks, evidence);
283
+ expect(gaps).toHaveLength(0);
284
+ });
285
+
286
+ it('flags unproven findings on tasks that modify existing code', () => {
287
+ const tasks: PlanTask[] = [
288
+ makeTask({
289
+ verification: {
290
+ findings: [
291
+ { description: 'Auth timeout under load', severity: 'high', proven: false },
292
+ ],
293
+ },
294
+ }),
295
+ ];
296
+ const evidence: GitTaskEvidence[] = [
297
+ { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
298
+ ];
299
+
300
+ const gaps = collectVerificationGaps(tasks, evidence);
301
+ expect(gaps).toHaveLength(1);
302
+ expect(gaps[0].message).toContain('Unproven finding');
303
+ expect(gaps[0].message).toContain('Auth timeout under load');
304
+ });
305
+
306
+ it('does not flag proven findings', () => {
307
+ const tasks: PlanTask[] = [
308
+ makeTask({
309
+ verification: {
310
+ findings: [
311
+ { description: 'Auth timeout under load', severity: 'high', proven: true, proof: 'Reproduced with load test' },
312
+ ],
313
+ },
314
+ }),
315
+ ];
316
+ const evidence: GitTaskEvidence[] = [
317
+ { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
318
+ ];
319
+
320
+ const gaps = collectVerificationGaps(tasks, evidence);
321
+ expect(gaps).toHaveLength(0);
322
+ });
323
+
324
+ it('does not flag tasks that only add new files', () => {
325
+ const tasks: PlanTask[] = [
326
+ makeTask({
327
+ verification: {
328
+ findings: [
329
+ { description: 'Some finding', severity: 'medium', proven: false },
330
+ ],
331
+ },
332
+ }),
333
+ ];
334
+ const evidence: GitTaskEvidence[] = [
335
+ { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/new-auth.ts', status: 'added' }], verdict: 'DONE' },
336
+ ];
337
+
338
+ const gaps = collectVerificationGaps(tasks, evidence);
339
+ expect(gaps).toHaveLength(0);
340
+ });
341
+
342
+ it('does not flag tasks with no evidence', () => {
343
+ const tasks: PlanTask[] = [
344
+ makeTask({
345
+ verification: {
346
+ findings: [
347
+ { description: 'Some finding', severity: 'medium', proven: false },
348
+ ],
349
+ },
350
+ }),
351
+ ];
352
+ const evidence: GitTaskEvidence[] = []; // no evidence at all
353
+
354
+ const gaps = collectVerificationGaps(tasks, evidence);
355
+ expect(gaps).toHaveLength(0);
356
+ });
357
+
358
+ it('flags multiple unproven findings on the same task', () => {
359
+ const tasks: PlanTask[] = [
360
+ makeTask({
361
+ verification: {
362
+ findings: [
363
+ { description: 'Finding A', severity: 'high', proven: false },
364
+ { description: 'Finding B', severity: 'medium', proven: false },
365
+ { description: 'Finding C', severity: 'low', proven: true },
366
+ ],
367
+ },
368
+ }),
369
+ ];
370
+ const evidence: GitTaskEvidence[] = [
371
+ { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
372
+ ];
373
+
374
+ const gaps = collectVerificationGaps(tasks, evidence);
375
+ expect(gaps).toHaveLength(2);
376
+ expect(gaps[0].message).toContain('Finding A');
377
+ expect(gaps[1].message).toContain('Finding B');
378
+ });
379
+
380
+ it('handles tasks across multiple task IDs', () => {
381
+ const tasks: PlanTask[] = [
382
+ makeTask({
383
+ id: 'task-1',
384
+ verification: {
385
+ findings: [{ description: 'Bug A', severity: 'high', proven: false }],
386
+ },
387
+ }),
388
+ makeTask({
389
+ id: 'task-2',
390
+ title: 'Fix other bug',
391
+ verification: {
392
+ findings: [{ description: 'Bug B', severity: 'medium', proven: false }],
393
+ },
394
+ }),
395
+ ];
396
+ const evidence: GitTaskEvidence[] = [
397
+ { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
398
+ { taskId: 'task-2', taskTitle: 'Fix other bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/other.ts', status: 'modified' }], verdict: 'DONE' },
399
+ ];
400
+
401
+ const gaps = collectVerificationGaps(tasks, evidence);
402
+ expect(gaps).toHaveLength(2);
403
+ expect(gaps[0].taskId).toBe('task-1');
404
+ expect(gaps[1].taskId).toBe('task-2');
405
+ });
406
+ });
@@ -26,6 +26,12 @@ export interface UnplannedChange {
26
26
  possibleReason: string;
27
27
  }
28
28
 
29
+ export interface VerificationGap {
30
+ taskId: string;
31
+ taskTitle: string;
32
+ message: string;
33
+ }
34
+
29
35
  export interface EvidenceReport {
30
36
  planId: string;
31
37
  planObjective: string;
@@ -34,6 +40,8 @@ export interface EvidenceReport {
34
40
  taskEvidence: GitTaskEvidence[];
35
41
  unplannedChanges: UnplannedChange[];
36
42
  missingWork: GitTaskEvidence[];
43
+ /** Advisory gaps for tasks claiming fixes without proven findings. */
44
+ verificationGaps: VerificationGap[];
37
45
  summary: string;
38
46
  }
39
47
 
@@ -93,6 +101,8 @@ export function collectGitEvidence(
93
101
  unplannedChanges.length,
94
102
  );
95
103
 
104
+ const verificationGaps = collectVerificationGaps(plan.tasks, taskEvidence);
105
+
96
106
  return {
97
107
  planId: plan.id,
98
108
  planObjective: plan.objective,
@@ -101,10 +111,50 @@ export function collectGitEvidence(
101
111
  taskEvidence,
102
112
  unplannedChanges,
103
113
  missingWork,
114
+ verificationGaps,
104
115
  summary,
105
116
  };
106
117
  }
107
118
 
119
+ /**
120
+ * Flag tasks that modify existing code but lack proven verification findings.
121
+ * Advisory only — generates warnings, never blocks.
122
+ */
123
+ export function collectVerificationGaps(
124
+ tasks: PlanTask[],
125
+ evidence: GitTaskEvidence[],
126
+ ): VerificationGap[] {
127
+ const gaps: VerificationGap[] = [];
128
+
129
+ for (const task of tasks) {
130
+ if (!taskModifiesExistingCode(task, evidence)) continue;
131
+ if (!task.verification) continue; // no verification field = no claim = no gap
132
+
133
+ const unproven = task.verification.findings.filter((f) => !f.proven);
134
+ for (const finding of unproven) {
135
+ gaps.push({
136
+ taskId: task.id,
137
+ taskTitle: task.title,
138
+ message: `Unproven finding: "${finding.description}" (${finding.severity}). Prove reproducible before fixing.`,
139
+ });
140
+ }
141
+ }
142
+
143
+ return gaps;
144
+ }
145
+
146
+ /**
147
+ * Check if a task modifies existing code (vs. creating new files).
148
+ */
149
+ function taskModifiesExistingCode(
150
+ task: PlanTask,
151
+ evidence: GitTaskEvidence[],
152
+ ): boolean {
153
+ const taskEvidence = evidence.find((e) => e.taskId === task.id);
154
+ if (!taskEvidence) return false;
155
+ return taskEvidence.matchedFiles.some((f) => f.status === 'modified');
156
+ }
157
+
108
158
  function getGitDiff(projectPath: string, baseBranch: string): FileChange[] {
109
159
  try {
110
160
  const currentBranch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {