@soleri/core 9.0.4 → 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 +24 -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 +23 -8
  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 +28 -4
  382. package/src/engine/core-ops.test.ts +254 -0
  383. package/src/engine/core-ops.ts +25 -8
  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
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Vault facade — knowledge management ops.
3
- * search, CRUD, import/export, intake, archival.
3
+ * search, CRUD, import/export, intake, sharing, linking.
4
+ * Archival and lifecycle ops are in archive-facade.ts.
5
+ * Sync ops (git, obsidian, packs) are in sync-facade.ts.
6
+ * Review ops are in review-facade.ts.
4
7
  */
5
8
 
6
9
  import { z } from 'zod';
@@ -13,7 +16,6 @@ import { createCaptureOps } from '../capture-ops.js';
13
16
  import { createIntakeOps } from '../intake-ops.js';
14
17
  import { createVaultSharingOps } from '../vault-sharing-ops.js';
15
18
  import { createVaultLinkingOps } from '../vault-linking-ops.js';
16
- import { ObsidianSync } from '../../vault/obsidian-sync.js';
17
19
 
18
20
  export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
19
21
  const { vault, brain, intakePipeline, textIngester, vaultManager } = runtime;
@@ -83,16 +85,25 @@ export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
83
85
  tags: z.array(z.string()).optional(),
84
86
  limit: z.number().optional(),
85
87
  offset: z.number().optional(),
88
+ verbose: z.boolean().optional().describe('Return full entry objects instead of summaries'),
86
89
  }),
87
90
  handler: async (params) => {
88
- return vault.list({
91
+ const verbose = params.verbose === true;
92
+ const entries = vault.list({
89
93
  domain: params.domain as string | undefined,
90
94
  type: params.type as string | undefined,
91
95
  severity: params.severity as string | undefined,
92
96
  tags: params.tags as string[] | undefined,
93
- limit: (params.limit as number) ?? 50,
97
+ limit: (params.limit as number) ?? 20,
94
98
  offset: (params.offset as number) ?? 0,
95
99
  });
100
+ if (verbose) {
101
+ return entries;
102
+ }
103
+ // Return lightweight summaries to reduce response size
104
+ return (entries as Array<{ id: string; title: string; type: string; domain: string; tags?: string[] }>).map(
105
+ (e) => ({ id: e.id, title: e.title, type: e.type, domain: e.domain, tags: e.tags ?? [] }),
106
+ );
96
107
  },
97
108
  },
98
109
  {
@@ -432,72 +443,6 @@ export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
432
443
  },
433
444
  },
434
445
 
435
- // ─── Obsidian Sync ──────────────────────────────────────────
436
- {
437
- name: 'obsidian_export',
438
- description:
439
- 'Export vault entries to Obsidian-compatible markdown files with YAML frontmatter. Creates domain subdirectories.',
440
- auth: 'read',
441
- schema: z.object({
442
- obsidianDir: z.string().describe('Path to Obsidian vault directory'),
443
- types: z.array(z.string()).optional().describe('Filter by entry types'),
444
- domains: z.array(z.string()).optional().describe('Filter by domains'),
445
- dryRun: z.boolean().optional().describe('Preview without writing files'),
446
- }),
447
- handler: async (params) => {
448
- const sync = new ObsidianSync({ vault });
449
- return sync.export(params.obsidianDir as string, {
450
- types: params.types as string[] | undefined,
451
- domains: params.domains as string[] | undefined,
452
- dryRun: params.dryRun as boolean | undefined,
453
- });
454
- },
455
- },
456
- {
457
- name: 'obsidian_import',
458
- description:
459
- 'Import Obsidian markdown files with YAML frontmatter into the vault. Parses title, type, domain, tags from frontmatter.',
460
- auth: 'write',
461
- schema: z.object({
462
- obsidianDir: z.string().describe('Path to Obsidian vault directory to import from'),
463
- defaultType: z
464
- .string()
465
- .optional()
466
- .describe('Default type for entries without frontmatter type'),
467
- defaultDomain: z.string().optional().describe('Default domain for entries without one'),
468
- dryRun: z.boolean().optional().describe('Preview without modifying vault'),
469
- }),
470
- handler: async (params) => {
471
- const sync = new ObsidianSync({ vault });
472
- return sync.import(params.obsidianDir as string, {
473
- defaultType: params.defaultType as string | undefined,
474
- defaultDomain: params.defaultDomain as string | undefined,
475
- dryRun: params.dryRun as boolean | undefined,
476
- });
477
- },
478
- },
479
- {
480
- name: 'obsidian_sync',
481
- description:
482
- 'Bidirectional sync between vault and Obsidian directory. Modes: push (vault→Obsidian), pull (Obsidian→vault), bidirectional.',
483
- auth: 'write',
484
- schema: z.object({
485
- obsidianDir: z.string().describe('Path to Obsidian vault directory'),
486
- mode: z
487
- .enum(['push', 'pull', 'bidirectional'])
488
- .optional()
489
- .describe('Sync mode. Default: bidirectional'),
490
- dryRun: z.boolean().optional().describe('Preview without making changes'),
491
- }),
492
- handler: async (params) => {
493
- const sync = new ObsidianSync({ vault });
494
- return sync.sync(params.obsidianDir as string, {
495
- mode: params.mode as 'push' | 'pull' | 'bidirectional' | undefined,
496
- dryRun: params.dryRun as boolean | undefined,
497
- });
498
- },
499
- },
500
-
501
446
  // ─── Satellite ops ───────────────────────────────────────────
502
447
  ...createVaultExtraOps(runtime),
503
448
  ...createCaptureOps(runtime),
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Colocated unit tests for feature-flags.ts — filesystem + env var behavior.
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { FeatureFlags } from './feature-flags.js';
7
+ import { join } from 'node:path';
8
+ import { mkdtempSync, rmSync, writeFileSync, readFileSync } from 'node:fs';
9
+ import { tmpdir } from 'node:os';
10
+
11
+ describe('FeatureFlags', () => {
12
+ let tempDir: string;
13
+
14
+ beforeEach(() => {
15
+ tempDir = mkdtempSync(join(tmpdir(), 'soleri-ff-test-'));
16
+ });
17
+
18
+ afterEach(() => {
19
+ rmSync(tempDir, { recursive: true, force: true });
20
+ for (const key of Object.keys(process.env)) {
21
+ if (key.startsWith('SOLERI_FLAG_')) delete process.env[key];
22
+ }
23
+ });
24
+
25
+ describe('defaults', () => {
26
+ it('has auth-enforcement off by default', () => {
27
+ expect(new FeatureFlags().isEnabled('auth-enforcement')).toBe(false);
28
+ });
29
+
30
+ it('has hot-reload on by default', () => {
31
+ expect(new FeatureFlags().isEnabled('hot-reload')).toBe(true);
32
+ });
33
+
34
+ it('has cognee-sync on by default', () => {
35
+ expect(new FeatureFlags().isEnabled('cognee-sync')).toBe(true);
36
+ });
37
+
38
+ it('has agency-mode off by default', () => {
39
+ expect(new FeatureFlags().isEnabled('agency-mode')).toBe(false);
40
+ });
41
+
42
+ it('returns false for unknown flags', () => {
43
+ expect(new FeatureFlags().isEnabled('does-not-exist')).toBe(false);
44
+ });
45
+ });
46
+
47
+ describe('file persistence', () => {
48
+ it('persists and loads flags from file', () => {
49
+ const path = join(tempDir, 'flags.json');
50
+ const f1 = new FeatureFlags(path);
51
+ f1.set('auth-enforcement', true);
52
+
53
+ const f2 = new FeatureFlags(path);
54
+ expect(f2.isEnabled('auth-enforcement')).toBe(true);
55
+ });
56
+
57
+ it('creates parent directories if needed', () => {
58
+ const path = join(tempDir, 'nested', 'deep', 'flags.json');
59
+ const flags = new FeatureFlags(path);
60
+ flags.set('hot-reload', false);
61
+ const data = JSON.parse(readFileSync(path, 'utf-8'));
62
+ expect(data['hot-reload']).toBe(false);
63
+ });
64
+
65
+ it('handles corrupt JSON gracefully', () => {
66
+ const path = join(tempDir, 'bad.json');
67
+ writeFileSync(path, '{{{invalid');
68
+ const flags = new FeatureFlags(path);
69
+ // Falls back to defaults
70
+ expect(flags.isEnabled('hot-reload')).toBe(true);
71
+ });
72
+
73
+ it('ignores non-boolean values in file', () => {
74
+ const path = join(tempDir, 'mixed.json');
75
+ writeFileSync(path, JSON.stringify({ 'hot-reload': 'yes', telemetry: false }));
76
+ const flags = new FeatureFlags(path);
77
+ // 'yes' is not boolean, so default (true) stays
78
+ expect(flags.isEnabled('hot-reload')).toBe(true);
79
+ expect(flags.isEnabled('telemetry')).toBe(false);
80
+ });
81
+
82
+ it('works in-memory when no file path given', () => {
83
+ const flags = new FeatureFlags();
84
+ flags.set('custom-flag', true);
85
+ expect(flags.isEnabled('custom-flag')).toBe(true);
86
+ });
87
+ });
88
+
89
+ describe('env var overrides', () => {
90
+ it('SOLERI_FLAG_TELEMETRY=false overrides default', () => {
91
+ process.env.SOLERI_FLAG_TELEMETRY = 'false';
92
+ expect(new FeatureFlags().isEnabled('telemetry')).toBe(false);
93
+ });
94
+
95
+ it('supports =1 as truthy', () => {
96
+ process.env.SOLERI_FLAG_AGENCY_MODE = '1';
97
+ expect(new FeatureFlags().isEnabled('agency-mode')).toBe(true);
98
+ });
99
+
100
+ it('env overrides file values', () => {
101
+ const path = join(tempDir, 'flags.json');
102
+ writeFileSync(path, JSON.stringify({ telemetry: true }));
103
+ process.env.SOLERI_FLAG_TELEMETRY = 'false';
104
+ expect(new FeatureFlags(path).isEnabled('telemetry')).toBe(false);
105
+ });
106
+
107
+ it('supports custom flag names via env', () => {
108
+ process.env.SOLERI_FLAG_MY_EXPERIMENT = 'true';
109
+ expect(new FeatureFlags().isEnabled('my-experiment')).toBe(true);
110
+ });
111
+ });
112
+
113
+ describe('getAll', () => {
114
+ it('includes all built-in flags', () => {
115
+ const all = new FeatureFlags().getAll();
116
+ expect(Object.keys(all)).toContain('auth-enforcement');
117
+ expect(Object.keys(all)).toContain('hot-reload');
118
+ expect(Object.keys(all)).toContain('telemetry');
119
+ expect(Object.keys(all)).toContain('cognee-sync');
120
+ });
121
+
122
+ it('reports source as env when env var set', () => {
123
+ process.env.SOLERI_FLAG_TELEMETRY = 'true';
124
+ const all = new FeatureFlags().getAll();
125
+ expect(all['telemetry'].source).toBe('env');
126
+ });
127
+
128
+ it('reports source as default for built-in without env', () => {
129
+ const all = new FeatureFlags().getAll();
130
+ expect(all['hot-reload'].source).toBe('default');
131
+ });
132
+
133
+ it('reports source as runtime for custom flags', () => {
134
+ const flags = new FeatureFlags();
135
+ flags.set('my-flag', true);
136
+ expect(flags.getAll()['my-flag'].source).toBe('runtime');
137
+ expect(flags.getAll()['my-flag'].description).toBe('Custom flag');
138
+ });
139
+ });
140
+ });
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ parseRemoteUrl,
4
+ extractIssueNumber,
5
+ detectGitHubRemote,
6
+ getIssueDetails,
7
+ closeIssueWithComment,
8
+ } from './github-integration.js';
9
+
10
+ describe('parseRemoteUrl', () => {
11
+ it('parses HTTPS remote with .git suffix', () => {
12
+ const result = parseRemoteUrl('https://github.com/acme/widget.git');
13
+ expect(result).toEqual({ owner: 'acme', repo: 'widget' });
14
+ });
15
+
16
+ it('parses HTTPS remote without .git suffix', () => {
17
+ const result = parseRemoteUrl('https://github.com/acme/widget');
18
+ expect(result).toEqual({ owner: 'acme', repo: 'widget' });
19
+ });
20
+
21
+ it('parses SSH remote with .git suffix', () => {
22
+ const result = parseRemoteUrl('git@github.com:acme/widget.git');
23
+ expect(result).toEqual({ owner: 'acme', repo: 'widget' });
24
+ });
25
+
26
+ it('parses SSH remote without .git suffix', () => {
27
+ const result = parseRemoteUrl('git@github.com:acme/widget');
28
+ expect(result).toEqual({ owner: 'acme', repo: 'widget' });
29
+ });
30
+
31
+ it('returns null for non-GitHub URLs', () => {
32
+ expect(parseRemoteUrl('https://gitlab.com/acme/widget.git')).toBeNull();
33
+ });
34
+
35
+ it('returns null for empty string', () => {
36
+ expect(parseRemoteUrl('')).toBeNull();
37
+ });
38
+
39
+ it('returns null for random text', () => {
40
+ expect(parseRemoteUrl('not-a-url-at-all')).toBeNull();
41
+ });
42
+ });
43
+
44
+ describe('extractIssueNumber', () => {
45
+ it('extracts issue number from #NNN', () => {
46
+ expect(extractIssueNumber('fixes #42')).toBe(42);
47
+ });
48
+
49
+ it('extracts first match when multiple present', () => {
50
+ expect(extractIssueNumber('#10 and #20')).toBe(10);
51
+ });
52
+
53
+ it('returns null when no issue number', () => {
54
+ expect(extractIssueNumber('no issues here')).toBeNull();
55
+ });
56
+
57
+ it('returns null for empty string', () => {
58
+ expect(extractIssueNumber('')).toBeNull();
59
+ });
60
+
61
+ it('handles issue in sentence context', () => {
62
+ expect(extractIssueNumber('closes #789 in this PR')).toBe(789);
63
+ });
64
+ });
65
+
66
+ describe('detectGitHubRemote', () => {
67
+ it('returns null when git command fails', async () => {
68
+ // Pass a path that is not a git repo
69
+ const result = await detectGitHubRemote('/tmp/definitely-not-a-repo-' + Date.now());
70
+ expect(result).toBeNull();
71
+ });
72
+ });
73
+
74
+ describe('getIssueDetails', () => {
75
+ it('returns null when gh CLI is not available or fails', async () => {
76
+ // gh issue view on a non-existent repo will fail
77
+ const result = await getIssueDetails('nonexistent-owner-xyz', 'nonexistent-repo-xyz', 99999);
78
+ expect(result).toBeNull();
79
+ });
80
+ });
81
+
82
+ describe('closeIssueWithComment', () => {
83
+ it('does not throw when gh CLI is not available', async () => {
84
+ // Should degrade gracefully
85
+ await expect(
86
+ closeIssueWithComment('nonexistent-owner-xyz', 'nonexistent-repo-xyz', 99999, 'test'),
87
+ ).resolves.toBeUndefined();
88
+ });
89
+ });
@@ -0,0 +1,159 @@
1
+ /**
2
+ * GitHub integration helpers for the planning lifecycle.
3
+ *
4
+ * Provides lightweight wrappers around git and the `gh` CLI for:
5
+ * - Detecting the GitHub remote from a project path
6
+ * - Extracting issue numbers from text
7
+ * - Closing issues with a comment
8
+ * - Fetching issue details
9
+ *
10
+ * All functions degrade gracefully — if `gh` is not installed or not
11
+ * authenticated, they return null / no-op instead of throwing.
12
+ */
13
+
14
+ import { execFile } from 'node:child_process';
15
+ import { promisify } from 'node:util';
16
+
17
+ const execFileAsync = promisify(execFile);
18
+
19
+ // ---------------------------------------------------------------------------
20
+ // Types
21
+ // ---------------------------------------------------------------------------
22
+
23
+ export interface GitHubRemote {
24
+ owner: string;
25
+ repo: string;
26
+ }
27
+
28
+ export interface GitHubIssueDetails {
29
+ title: string;
30
+ body: string;
31
+ labels: string[];
32
+ }
33
+
34
+ // ---------------------------------------------------------------------------
35
+ // detectGitHubRemote
36
+ // ---------------------------------------------------------------------------
37
+
38
+ /**
39
+ * Detect the GitHub owner/repo from the git remote in a project directory.
40
+ * Parses both HTTPS and SSH remote URLs.
41
+ * Returns null if not a git repo or no GitHub remote found.
42
+ */
43
+ export async function detectGitHubRemote(projectPath: string): Promise<GitHubRemote | null> {
44
+ try {
45
+ const { stdout } = await execFileAsync('git', ['remote', 'get-url', 'origin'], {
46
+ cwd: projectPath,
47
+ timeout: 10_000,
48
+ signal: AbortSignal.timeout(10_000),
49
+ });
50
+ return parseRemoteUrl(stdout.trim());
51
+ } catch {
52
+ return null;
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Parse a GitHub owner/repo from a remote URL.
58
+ * Supports HTTPS and SSH formats.
59
+ */
60
+ export function parseRemoteUrl(url: string): GitHubRemote | null {
61
+ // HTTPS: https://github.com/owner/repo.git
62
+ const https = url.match(/github\.com\/([^/]+)\/([^/\s]+?)(?:\.git)?$/);
63
+ if (https) return { owner: https[1], repo: https[2] };
64
+
65
+ // SSH: git@github.com:owner/repo.git
66
+ const ssh = url.match(/github\.com:([^/]+)\/([^/\s]+?)(?:\.git)?$/);
67
+ if (ssh) return { owner: ssh[1], repo: ssh[2] };
68
+
69
+ return null;
70
+ }
71
+
72
+ // ---------------------------------------------------------------------------
73
+ // extractIssueNumber
74
+ // ---------------------------------------------------------------------------
75
+
76
+ /**
77
+ * Extract a GitHub issue number (#NNN) from arbitrary text.
78
+ * Matches patterns like "#123", "issue #456", "fixes #789", "closes #42".
79
+ * Returns the first match, or null if none found.
80
+ */
81
+ export function extractIssueNumber(text: string): number | null {
82
+ const match = text.match(/#(\d+)/);
83
+ if (!match) return null;
84
+ const num = parseInt(match[1], 10);
85
+ return Number.isFinite(num) ? num : null;
86
+ }
87
+
88
+ // ---------------------------------------------------------------------------
89
+ // getIssueDetails
90
+ // ---------------------------------------------------------------------------
91
+
92
+ /**
93
+ * Fetch issue details (title, body, labels) using the `gh` CLI.
94
+ * Returns null if `gh` is not available or the issue cannot be fetched.
95
+ */
96
+ export async function getIssueDetails(
97
+ owner: string,
98
+ repo: string,
99
+ issueNumber: number,
100
+ ): Promise<GitHubIssueDetails | null> {
101
+ try {
102
+ const { stdout } = await execFileAsync(
103
+ 'gh',
104
+ [
105
+ 'issue', 'view', String(issueNumber),
106
+ '--repo', `${owner}/${repo}`,
107
+ '--json', 'title,body,labels',
108
+ ],
109
+ {
110
+ timeout: 10_000,
111
+ signal: AbortSignal.timeout(10_000),
112
+ },
113
+ );
114
+ const parsed = JSON.parse(stdout.trim()) as {
115
+ title: string;
116
+ body: string;
117
+ labels: Array<{ name: string }>;
118
+ };
119
+ return {
120
+ title: parsed.title,
121
+ body: parsed.body ?? '',
122
+ labels: (parsed.labels ?? []).map((l) => l.name),
123
+ };
124
+ } catch {
125
+ return null;
126
+ }
127
+ }
128
+
129
+ // ---------------------------------------------------------------------------
130
+ // closeIssueWithComment
131
+ // ---------------------------------------------------------------------------
132
+
133
+ /**
134
+ * Close a GitHub issue and leave a comment summarizing what was done.
135
+ * No-ops gracefully if `gh` is not available.
136
+ */
137
+ export async function closeIssueWithComment(
138
+ owner: string,
139
+ repo: string,
140
+ issueNumber: number,
141
+ comment: string,
142
+ ): Promise<void> {
143
+ const repoSlug = `${owner}/${repo}`;
144
+ try {
145
+ // Add comment first, then close
146
+ await execFileAsync(
147
+ 'gh',
148
+ ['issue', 'comment', String(issueNumber), '--repo', repoSlug, '--body', comment],
149
+ { timeout: 10_000, signal: AbortSignal.timeout(10_000) },
150
+ );
151
+ await execFileAsync(
152
+ 'gh',
153
+ ['issue', 'close', String(issueNumber), '--repo', repoSlug],
154
+ { timeout: 10_000, signal: AbortSignal.timeout(10_000) },
155
+ );
156
+ } catch {
157
+ // Graceful degradation — gh not available or auth expired
158
+ }
159
+ }
@@ -0,0 +1,141 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { createGradingOps } from './grading-ops.js';
3
+ import type { AgentRuntime } from './types.js';
4
+ import type { OpDefinition } from '../facades/types.js';
5
+
6
+ function makeMockRuntime() {
7
+ return {
8
+ planner: {
9
+ grade: vi.fn().mockReturnValue({
10
+ grade: 'B',
11
+ score: 82,
12
+ iteration: 1,
13
+ gaps: [
14
+ { severity: 'major', category: 'scope', description: 'Missing scope', recommendation: 'Add scope', location: 'plan.scope' },
15
+ { severity: 'minor', category: 'detail', description: 'Low detail', recommendation: 'Add detail' },
16
+ { severity: 'critical', category: 'risk', description: 'No risk analysis', recommendation: 'Add risks' },
17
+ ],
18
+ }),
19
+ getCheckHistory: vi.fn().mockReturnValue([
20
+ { grade: 'C', score: 70, iteration: 1 },
21
+ { grade: 'B', score: 82, iteration: 2 },
22
+ ]),
23
+ getLatestCheck: vi.fn().mockReturnValue({ grade: 'B', score: 82, iteration: 2 }),
24
+ meetsGrade: vi.fn().mockReturnValue({ meets: true, currentScore: 92, threshold: 90 }),
25
+ },
26
+ } as unknown as AgentRuntime;
27
+ }
28
+
29
+ describe('createGradingOps', () => {
30
+ let ops: OpDefinition[];
31
+ let runtime: ReturnType<typeof makeMockRuntime>;
32
+
33
+ function findOp(name: string): OpDefinition {
34
+ const op = ops.find((o) => o.name === name);
35
+ if (!op) throw new Error(`Op "${name}" not found`);
36
+ return op;
37
+ }
38
+
39
+ it('returns 5 ops', () => {
40
+ runtime = makeMockRuntime();
41
+ ops = createGradingOps(runtime);
42
+ expect(ops).toHaveLength(5);
43
+ });
44
+
45
+ it('has correct op names', () => {
46
+ runtime = makeMockRuntime();
47
+ ops = createGradingOps(runtime);
48
+ const names = ops.map((o) => o.name);
49
+ expect(names).toEqual([
50
+ 'plan_grade',
51
+ 'plan_check_history',
52
+ 'plan_latest_check',
53
+ 'plan_meets_grade',
54
+ 'plan_auto_improve',
55
+ ]);
56
+ });
57
+
58
+ it('all ops have read auth', () => {
59
+ runtime = makeMockRuntime();
60
+ ops = createGradingOps(runtime);
61
+ for (const op of ops) {
62
+ expect(op.auth).toBe('read');
63
+ }
64
+ });
65
+
66
+ describe('plan_grade', () => {
67
+ it('delegates to planner.grade', async () => {
68
+ runtime = makeMockRuntime();
69
+ ops = createGradingOps(runtime);
70
+ const result = await findOp('plan_grade').handler({ planId: 'p1' });
71
+ expect(runtime.planner.grade).toHaveBeenCalledWith('p1');
72
+ expect(result).toHaveProperty('grade', 'B');
73
+ });
74
+ });
75
+
76
+ describe('plan_check_history', () => {
77
+ it('returns count and checks array', async () => {
78
+ runtime = makeMockRuntime();
79
+ ops = createGradingOps(runtime);
80
+ const result = (await findOp('plan_check_history').handler({ planId: 'p1' })) as Record<string, unknown>;
81
+ expect(result.planId).toBe('p1');
82
+ expect(result.count).toBe(2);
83
+ expect(result.checks).toHaveLength(2);
84
+ });
85
+ });
86
+
87
+ describe('plan_latest_check', () => {
88
+ it('returns the latest check', async () => {
89
+ runtime = makeMockRuntime();
90
+ ops = createGradingOps(runtime);
91
+ const result = await findOp('plan_latest_check').handler({ planId: 'p1' });
92
+ expect(result).toHaveProperty('grade', 'B');
93
+ });
94
+
95
+ it('returns message when no checks found', async () => {
96
+ runtime = makeMockRuntime();
97
+ (runtime.planner.getLatestCheck as ReturnType<typeof vi.fn>).mockReturnValue(null);
98
+ ops = createGradingOps(runtime);
99
+ const result = (await findOp('plan_latest_check').handler({ planId: 'p1' })) as Record<string, unknown>;
100
+ expect(result.message).toBe('No checks found for this plan.');
101
+ });
102
+ });
103
+
104
+ describe('plan_meets_grade', () => {
105
+ it('delegates to planner.meetsGrade', async () => {
106
+ runtime = makeMockRuntime();
107
+ ops = createGradingOps(runtime);
108
+ const result = await findOp('plan_meets_grade').handler({ planId: 'p1', targetGrade: 'A' });
109
+ expect(runtime.planner.meetsGrade).toHaveBeenCalledWith('p1', 'A');
110
+ expect(result).toHaveProperty('meets', true);
111
+ });
112
+ });
113
+
114
+ describe('plan_auto_improve', () => {
115
+ it('sorts gaps by severity and groups them', async () => {
116
+ runtime = makeMockRuntime();
117
+ ops = createGradingOps(runtime);
118
+ const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<string, unknown>;
119
+ expect(result.grade).toBe('B');
120
+ expect(result.score).toBe(82);
121
+ expect(result.totalGaps).toBe(3);
122
+ expect(result.nextAction).toBe('iterate');
123
+
124
+ const grouped = result.gapsBySeverity as Record<string, unknown[]>;
125
+ expect(grouped.critical).toHaveLength(1);
126
+ expect(grouped.major).toHaveLength(1);
127
+ expect(grouped.minor).toHaveLength(1);
128
+ });
129
+
130
+ it('returns approve as nextAction when score >= 90', async () => {
131
+ runtime = makeMockRuntime();
132
+ (runtime.planner.grade as ReturnType<typeof vi.fn>).mockReturnValue({
133
+ grade: 'A', score: 92, iteration: 3, gaps: [],
134
+ });
135
+ ops = createGradingOps(runtime);
136
+ const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<string, unknown>;
137
+ expect(result.nextAction).toBe('approve');
138
+ expect(result.totalGaps).toBe(0);
139
+ });
140
+ });
141
+ });
@@ -22,7 +22,7 @@ export function createGradingOps(runtime: AgentRuntime): OpDefinition[] {
22
22
  {
23
23
  name: 'plan_grade',
24
24
  description:
25
- 'Grade a plan using 7-pass gap analysis — severity-weighted scoring (critical=30, major=15, minor=2) with substance bonuses for vault-informed depth. Returns grade, score, gaps with recommendations, and iteration number.',
25
+ 'Grade a plan using 8-pass gap analysis — severity-weighted scoring (critical=30, major=15, minor=2) with substance bonuses for vault-informed depth. Includes alternative analysis (pass 8) — plans without alternatives cap at ~85. Returns grade, score, gaps with recommendations, and iteration number.',
26
26
  auth: 'read',
27
27
  schema: z.object({
28
28
  planId: z.string().describe('The plan ID to grade.'),