@soleri/core 2.1.0 → 2.5.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 (377) hide show
  1. package/dist/brain/brain.d.ts +10 -1
  2. package/dist/brain/brain.d.ts.map +1 -1
  3. package/dist/brain/brain.js +116 -13
  4. package/dist/brain/brain.js.map +1 -1
  5. package/dist/brain/intelligence.d.ts +36 -1
  6. package/dist/brain/intelligence.d.ts.map +1 -1
  7. package/dist/brain/intelligence.js +119 -14
  8. package/dist/brain/intelligence.js.map +1 -1
  9. package/dist/brain/types.d.ts +34 -2
  10. package/dist/brain/types.d.ts.map +1 -1
  11. package/dist/cognee/client.d.ts +3 -0
  12. package/dist/cognee/client.d.ts.map +1 -1
  13. package/dist/cognee/client.js +17 -0
  14. package/dist/cognee/client.js.map +1 -1
  15. package/dist/cognee/sync-manager.d.ts +94 -0
  16. package/dist/cognee/sync-manager.d.ts.map +1 -0
  17. package/dist/cognee/sync-manager.js +293 -0
  18. package/dist/cognee/sync-manager.js.map +1 -0
  19. package/dist/control/identity-manager.d.ts +22 -0
  20. package/dist/control/identity-manager.d.ts.map +1 -0
  21. package/dist/control/identity-manager.js +233 -0
  22. package/dist/control/identity-manager.js.map +1 -0
  23. package/dist/control/intent-router.d.ts +32 -0
  24. package/dist/control/intent-router.d.ts.map +1 -0
  25. package/dist/control/intent-router.js +242 -0
  26. package/dist/control/intent-router.js.map +1 -0
  27. package/dist/control/types.d.ts +68 -0
  28. package/dist/control/types.d.ts.map +1 -0
  29. package/dist/control/types.js +9 -0
  30. package/dist/control/types.js.map +1 -0
  31. package/dist/curator/curator.d.ts +37 -1
  32. package/dist/curator/curator.d.ts.map +1 -1
  33. package/dist/curator/curator.js +199 -1
  34. package/dist/curator/curator.js.map +1 -1
  35. package/dist/errors/classify.d.ts +13 -0
  36. package/dist/errors/classify.d.ts.map +1 -0
  37. package/dist/errors/classify.js +97 -0
  38. package/dist/errors/classify.js.map +1 -0
  39. package/dist/errors/index.d.ts +6 -0
  40. package/dist/errors/index.d.ts.map +1 -0
  41. package/dist/errors/index.js +4 -0
  42. package/dist/errors/index.js.map +1 -0
  43. package/dist/errors/retry.d.ts +40 -0
  44. package/dist/errors/retry.d.ts.map +1 -0
  45. package/dist/errors/retry.js +97 -0
  46. package/dist/errors/retry.js.map +1 -0
  47. package/dist/errors/types.d.ts +48 -0
  48. package/dist/errors/types.d.ts.map +1 -0
  49. package/dist/errors/types.js +59 -0
  50. package/dist/errors/types.js.map +1 -0
  51. package/dist/facades/types.d.ts +1 -1
  52. package/dist/governance/governance.d.ts +42 -0
  53. package/dist/governance/governance.d.ts.map +1 -0
  54. package/dist/governance/governance.js +488 -0
  55. package/dist/governance/governance.js.map +1 -0
  56. package/dist/governance/index.d.ts +3 -0
  57. package/dist/governance/index.d.ts.map +1 -0
  58. package/dist/governance/index.js +2 -0
  59. package/dist/governance/index.js.map +1 -0
  60. package/dist/governance/types.d.ts +102 -0
  61. package/dist/governance/types.d.ts.map +1 -0
  62. package/dist/governance/types.js +3 -0
  63. package/dist/governance/types.js.map +1 -0
  64. package/dist/index.d.ts +52 -3
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +47 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/intake/content-classifier.d.ts +14 -0
  69. package/dist/intake/content-classifier.d.ts.map +1 -0
  70. package/dist/intake/content-classifier.js +125 -0
  71. package/dist/intake/content-classifier.js.map +1 -0
  72. package/dist/intake/dedup-gate.d.ts +17 -0
  73. package/dist/intake/dedup-gate.d.ts.map +1 -0
  74. package/dist/intake/dedup-gate.js +66 -0
  75. package/dist/intake/dedup-gate.js.map +1 -0
  76. package/dist/intake/intake-pipeline.d.ts +63 -0
  77. package/dist/intake/intake-pipeline.d.ts.map +1 -0
  78. package/dist/intake/intake-pipeline.js +373 -0
  79. package/dist/intake/intake-pipeline.js.map +1 -0
  80. package/dist/intake/types.d.ts +65 -0
  81. package/dist/intake/types.d.ts.map +1 -0
  82. package/dist/intake/types.js +3 -0
  83. package/dist/intake/types.js.map +1 -0
  84. package/dist/intelligence/loader.js +1 -1
  85. package/dist/intelligence/loader.js.map +1 -1
  86. package/dist/intelligence/types.d.ts +3 -1
  87. package/dist/intelligence/types.d.ts.map +1 -1
  88. package/dist/logging/logger.d.ts +37 -0
  89. package/dist/logging/logger.d.ts.map +1 -0
  90. package/dist/logging/logger.js +145 -0
  91. package/dist/logging/logger.js.map +1 -0
  92. package/dist/logging/types.d.ts +19 -0
  93. package/dist/logging/types.d.ts.map +1 -0
  94. package/dist/logging/types.js +2 -0
  95. package/dist/logging/types.js.map +1 -0
  96. package/dist/loop/loop-manager.d.ts +100 -0
  97. package/dist/loop/loop-manager.d.ts.map +1 -0
  98. package/dist/loop/loop-manager.js +379 -0
  99. package/dist/loop/loop-manager.js.map +1 -0
  100. package/dist/loop/types.d.ts +103 -0
  101. package/dist/loop/types.d.ts.map +1 -0
  102. package/dist/loop/types.js +11 -0
  103. package/dist/loop/types.js.map +1 -0
  104. package/dist/persistence/index.d.ts +3 -0
  105. package/dist/persistence/index.d.ts.map +1 -0
  106. package/dist/persistence/index.js +2 -0
  107. package/dist/persistence/index.js.map +1 -0
  108. package/dist/persistence/sqlite-provider.d.ts +25 -0
  109. package/dist/persistence/sqlite-provider.d.ts.map +1 -0
  110. package/dist/persistence/sqlite-provider.js +59 -0
  111. package/dist/persistence/sqlite-provider.js.map +1 -0
  112. package/dist/persistence/types.d.ts +36 -0
  113. package/dist/persistence/types.d.ts.map +1 -0
  114. package/dist/persistence/types.js +8 -0
  115. package/dist/persistence/types.js.map +1 -0
  116. package/dist/planning/gap-analysis.d.ts +72 -0
  117. package/dist/planning/gap-analysis.d.ts.map +1 -0
  118. package/dist/planning/gap-analysis.js +442 -0
  119. package/dist/planning/gap-analysis.js.map +1 -0
  120. package/dist/planning/gap-types.d.ts +29 -0
  121. package/dist/planning/gap-types.d.ts.map +1 -0
  122. package/dist/planning/gap-types.js +28 -0
  123. package/dist/planning/gap-types.js.map +1 -0
  124. package/dist/planning/planner.d.ts +421 -4
  125. package/dist/planning/planner.d.ts.map +1 -1
  126. package/dist/planning/planner.js +949 -21
  127. package/dist/planning/planner.js.map +1 -1
  128. package/dist/playbooks/generic/brainstorming.d.ts +9 -0
  129. package/dist/playbooks/generic/brainstorming.d.ts.map +1 -0
  130. package/dist/playbooks/generic/brainstorming.js +105 -0
  131. package/dist/playbooks/generic/brainstorming.js.map +1 -0
  132. package/dist/playbooks/generic/code-review.d.ts +11 -0
  133. package/dist/playbooks/generic/code-review.d.ts.map +1 -0
  134. package/dist/playbooks/generic/code-review.js +176 -0
  135. package/dist/playbooks/generic/code-review.js.map +1 -0
  136. package/dist/playbooks/generic/subagent-execution.d.ts +9 -0
  137. package/dist/playbooks/generic/subagent-execution.d.ts.map +1 -0
  138. package/dist/playbooks/generic/subagent-execution.js +68 -0
  139. package/dist/playbooks/generic/subagent-execution.js.map +1 -0
  140. package/dist/playbooks/generic/systematic-debugging.d.ts +9 -0
  141. package/dist/playbooks/generic/systematic-debugging.d.ts.map +1 -0
  142. package/dist/playbooks/generic/systematic-debugging.js +87 -0
  143. package/dist/playbooks/generic/systematic-debugging.js.map +1 -0
  144. package/dist/playbooks/generic/tdd.d.ts +9 -0
  145. package/dist/playbooks/generic/tdd.d.ts.map +1 -0
  146. package/dist/playbooks/generic/tdd.js +70 -0
  147. package/dist/playbooks/generic/tdd.js.map +1 -0
  148. package/dist/playbooks/generic/verification.d.ts +9 -0
  149. package/dist/playbooks/generic/verification.d.ts.map +1 -0
  150. package/dist/playbooks/generic/verification.js +74 -0
  151. package/dist/playbooks/generic/verification.js.map +1 -0
  152. package/dist/playbooks/index.d.ts +4 -0
  153. package/dist/playbooks/index.d.ts.map +1 -0
  154. package/dist/playbooks/index.js +5 -0
  155. package/dist/playbooks/index.js.map +1 -0
  156. package/dist/playbooks/playbook-registry.d.ts +42 -0
  157. package/dist/playbooks/playbook-registry.d.ts.map +1 -0
  158. package/dist/playbooks/playbook-registry.js +227 -0
  159. package/dist/playbooks/playbook-registry.js.map +1 -0
  160. package/dist/playbooks/playbook-seeder.d.ts +47 -0
  161. package/dist/playbooks/playbook-seeder.d.ts.map +1 -0
  162. package/dist/playbooks/playbook-seeder.js +104 -0
  163. package/dist/playbooks/playbook-seeder.js.map +1 -0
  164. package/dist/playbooks/playbook-types.d.ts +132 -0
  165. package/dist/playbooks/playbook-types.d.ts.map +1 -0
  166. package/dist/playbooks/playbook-types.js +12 -0
  167. package/dist/playbooks/playbook-types.js.map +1 -0
  168. package/dist/project/project-registry.d.ts +79 -0
  169. package/dist/project/project-registry.d.ts.map +1 -0
  170. package/dist/project/project-registry.js +274 -0
  171. package/dist/project/project-registry.js.map +1 -0
  172. package/dist/project/types.d.ts +28 -0
  173. package/dist/project/types.d.ts.map +1 -0
  174. package/dist/project/types.js +5 -0
  175. package/dist/project/types.js.map +1 -0
  176. package/dist/prompts/index.d.ts +4 -0
  177. package/dist/prompts/index.d.ts.map +1 -0
  178. package/dist/prompts/index.js +3 -0
  179. package/dist/prompts/index.js.map +1 -0
  180. package/dist/prompts/parser.d.ts +17 -0
  181. package/dist/prompts/parser.d.ts.map +1 -0
  182. package/dist/prompts/parser.js +47 -0
  183. package/dist/prompts/parser.js.map +1 -0
  184. package/dist/prompts/template-manager.d.ts +25 -0
  185. package/dist/prompts/template-manager.d.ts.map +1 -0
  186. package/dist/prompts/template-manager.js +71 -0
  187. package/dist/prompts/template-manager.js.map +1 -0
  188. package/dist/prompts/types.d.ts +26 -0
  189. package/dist/prompts/types.d.ts.map +1 -0
  190. package/dist/prompts/types.js +5 -0
  191. package/dist/prompts/types.js.map +1 -0
  192. package/dist/runtime/admin-extra-ops.d.ts +15 -0
  193. package/dist/runtime/admin-extra-ops.d.ts.map +1 -0
  194. package/dist/runtime/admin-extra-ops.js +595 -0
  195. package/dist/runtime/admin-extra-ops.js.map +1 -0
  196. package/dist/runtime/admin-ops.d.ts +15 -0
  197. package/dist/runtime/admin-ops.d.ts.map +1 -0
  198. package/dist/runtime/admin-ops.js +329 -0
  199. package/dist/runtime/admin-ops.js.map +1 -0
  200. package/dist/runtime/capture-ops.d.ts +15 -0
  201. package/dist/runtime/capture-ops.d.ts.map +1 -0
  202. package/dist/runtime/capture-ops.js +363 -0
  203. package/dist/runtime/capture-ops.js.map +1 -0
  204. package/dist/runtime/cognee-sync-ops.d.ts +12 -0
  205. package/dist/runtime/cognee-sync-ops.d.ts.map +1 -0
  206. package/dist/runtime/cognee-sync-ops.js +55 -0
  207. package/dist/runtime/cognee-sync-ops.js.map +1 -0
  208. package/dist/runtime/core-ops.d.ts +9 -3
  209. package/dist/runtime/core-ops.d.ts.map +1 -1
  210. package/dist/runtime/core-ops.js +693 -10
  211. package/dist/runtime/core-ops.js.map +1 -1
  212. package/dist/runtime/curator-extra-ops.d.ts +9 -0
  213. package/dist/runtime/curator-extra-ops.d.ts.map +1 -0
  214. package/dist/runtime/curator-extra-ops.js +71 -0
  215. package/dist/runtime/curator-extra-ops.js.map +1 -0
  216. package/dist/runtime/domain-ops.d.ts.map +1 -1
  217. package/dist/runtime/domain-ops.js +61 -15
  218. package/dist/runtime/domain-ops.js.map +1 -1
  219. package/dist/runtime/grading-ops.d.ts +14 -0
  220. package/dist/runtime/grading-ops.d.ts.map +1 -0
  221. package/dist/runtime/grading-ops.js +105 -0
  222. package/dist/runtime/grading-ops.js.map +1 -0
  223. package/dist/runtime/intake-ops.d.ts +14 -0
  224. package/dist/runtime/intake-ops.d.ts.map +1 -0
  225. package/dist/runtime/intake-ops.js +110 -0
  226. package/dist/runtime/intake-ops.js.map +1 -0
  227. package/dist/runtime/loop-ops.d.ts +14 -0
  228. package/dist/runtime/loop-ops.d.ts.map +1 -0
  229. package/dist/runtime/loop-ops.js +251 -0
  230. package/dist/runtime/loop-ops.js.map +1 -0
  231. package/dist/runtime/memory-cross-project-ops.d.ts +12 -0
  232. package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -0
  233. package/dist/runtime/memory-cross-project-ops.js +165 -0
  234. package/dist/runtime/memory-cross-project-ops.js.map +1 -0
  235. package/dist/runtime/memory-extra-ops.d.ts +13 -0
  236. package/dist/runtime/memory-extra-ops.d.ts.map +1 -0
  237. package/dist/runtime/memory-extra-ops.js +173 -0
  238. package/dist/runtime/memory-extra-ops.js.map +1 -0
  239. package/dist/runtime/orchestrate-ops.d.ts +17 -0
  240. package/dist/runtime/orchestrate-ops.d.ts.map +1 -0
  241. package/dist/runtime/orchestrate-ops.js +246 -0
  242. package/dist/runtime/orchestrate-ops.js.map +1 -0
  243. package/dist/runtime/planning-extra-ops.d.ts +25 -0
  244. package/dist/runtime/planning-extra-ops.d.ts.map +1 -0
  245. package/dist/runtime/planning-extra-ops.js +663 -0
  246. package/dist/runtime/planning-extra-ops.js.map +1 -0
  247. package/dist/runtime/playbook-ops.d.ts +14 -0
  248. package/dist/runtime/playbook-ops.d.ts.map +1 -0
  249. package/dist/runtime/playbook-ops.js +141 -0
  250. package/dist/runtime/playbook-ops.js.map +1 -0
  251. package/dist/runtime/project-ops.d.ts +15 -0
  252. package/dist/runtime/project-ops.d.ts.map +1 -0
  253. package/dist/runtime/project-ops.js +186 -0
  254. package/dist/runtime/project-ops.js.map +1 -0
  255. package/dist/runtime/runtime.d.ts.map +1 -1
  256. package/dist/runtime/runtime.js +65 -3
  257. package/dist/runtime/runtime.js.map +1 -1
  258. package/dist/runtime/types.d.ts +29 -0
  259. package/dist/runtime/types.d.ts.map +1 -1
  260. package/dist/runtime/vault-extra-ops.d.ts +10 -0
  261. package/dist/runtime/vault-extra-ops.d.ts.map +1 -0
  262. package/dist/runtime/vault-extra-ops.js +536 -0
  263. package/dist/runtime/vault-extra-ops.js.map +1 -0
  264. package/dist/telemetry/telemetry.d.ts +48 -0
  265. package/dist/telemetry/telemetry.d.ts.map +1 -0
  266. package/dist/telemetry/telemetry.js +87 -0
  267. package/dist/telemetry/telemetry.js.map +1 -0
  268. package/dist/vault/playbook.d.ts +34 -0
  269. package/dist/vault/playbook.d.ts.map +1 -0
  270. package/dist/vault/playbook.js +60 -0
  271. package/dist/vault/playbook.js.map +1 -0
  272. package/dist/vault/vault.d.ts +97 -4
  273. package/dist/vault/vault.d.ts.map +1 -1
  274. package/dist/vault/vault.js +424 -65
  275. package/dist/vault/vault.js.map +1 -1
  276. package/package.json +7 -3
  277. package/src/__tests__/admin-extra-ops.test.ts +467 -0
  278. package/src/__tests__/admin-ops.test.ts +271 -0
  279. package/src/__tests__/brain-intelligence.test.ts +205 -0
  280. package/src/__tests__/brain.test.ts +134 -3
  281. package/src/__tests__/capture-ops.test.ts +509 -0
  282. package/src/__tests__/cognee-integration.test.ts +80 -0
  283. package/src/__tests__/cognee-sync-manager.test.ts +103 -0
  284. package/src/__tests__/core-ops.test.ts +292 -2
  285. package/src/__tests__/curator-extra-ops.test.ts +381 -0
  286. package/src/__tests__/domain-ops.test.ts +66 -0
  287. package/src/__tests__/errors.test.ts +388 -0
  288. package/src/__tests__/governance.test.ts +522 -0
  289. package/src/__tests__/grading-ops.test.ts +361 -0
  290. package/src/__tests__/identity-manager.test.ts +243 -0
  291. package/src/__tests__/intake-pipeline.test.ts +162 -0
  292. package/src/__tests__/intent-router.test.ts +222 -0
  293. package/src/__tests__/logger.test.ts +200 -0
  294. package/src/__tests__/loop-ops.test.ts +469 -0
  295. package/src/__tests__/memory-cross-project-ops.test.ts +248 -0
  296. package/src/__tests__/memory-extra-ops.test.ts +352 -0
  297. package/src/__tests__/orchestrate-ops.test.ts +289 -0
  298. package/src/__tests__/persistence.test.ts +225 -0
  299. package/src/__tests__/planner.test.ts +416 -7
  300. package/src/__tests__/planning-extra-ops.test.ts +706 -0
  301. package/src/__tests__/playbook-registry.test.ts +326 -0
  302. package/src/__tests__/playbook-seeder.test.ts +163 -0
  303. package/src/__tests__/playbook.test.ts +389 -0
  304. package/src/__tests__/project-ops.test.ts +381 -0
  305. package/src/__tests__/template-manager.test.ts +222 -0
  306. package/src/__tests__/vault-extra-ops.test.ts +482 -0
  307. package/src/brain/brain.ts +185 -16
  308. package/src/brain/intelligence.ts +179 -10
  309. package/src/brain/types.ts +40 -2
  310. package/src/cognee/client.ts +18 -0
  311. package/src/cognee/sync-manager.ts +389 -0
  312. package/src/control/identity-manager.ts +354 -0
  313. package/src/control/intent-router.ts +326 -0
  314. package/src/control/types.ts +102 -0
  315. package/src/curator/curator.ts +295 -1
  316. package/src/errors/classify.ts +102 -0
  317. package/src/errors/index.ts +5 -0
  318. package/src/errors/retry.ts +132 -0
  319. package/src/errors/types.ts +81 -0
  320. package/src/governance/governance.ts +698 -0
  321. package/src/governance/index.ts +18 -0
  322. package/src/governance/types.ts +111 -0
  323. package/src/index.ts +213 -2
  324. package/src/intake/content-classifier.ts +146 -0
  325. package/src/intake/dedup-gate.ts +92 -0
  326. package/src/intake/intake-pipeline.ts +503 -0
  327. package/src/intake/types.ts +69 -0
  328. package/src/intelligence/loader.ts +1 -1
  329. package/src/intelligence/types.ts +3 -1
  330. package/src/logging/logger.ts +154 -0
  331. package/src/logging/types.ts +21 -0
  332. package/src/loop/loop-manager.ts +448 -0
  333. package/src/loop/types.ts +115 -0
  334. package/src/persistence/index.ts +7 -0
  335. package/src/persistence/sqlite-provider.ts +62 -0
  336. package/src/persistence/types.ts +44 -0
  337. package/src/planning/gap-analysis.ts +775 -0
  338. package/src/planning/gap-types.ts +61 -0
  339. package/src/planning/planner.ts +1273 -24
  340. package/src/playbooks/generic/brainstorming.ts +110 -0
  341. package/src/playbooks/generic/code-review.ts +181 -0
  342. package/src/playbooks/generic/subagent-execution.ts +74 -0
  343. package/src/playbooks/generic/systematic-debugging.ts +92 -0
  344. package/src/playbooks/generic/tdd.ts +75 -0
  345. package/src/playbooks/generic/verification.ts +79 -0
  346. package/src/playbooks/index.ts +27 -0
  347. package/src/playbooks/playbook-registry.ts +284 -0
  348. package/src/playbooks/playbook-seeder.ts +119 -0
  349. package/src/playbooks/playbook-types.ts +162 -0
  350. package/src/project/project-registry.ts +370 -0
  351. package/src/project/types.ts +31 -0
  352. package/src/prompts/index.ts +3 -0
  353. package/src/prompts/parser.ts +59 -0
  354. package/src/prompts/template-manager.ts +77 -0
  355. package/src/prompts/types.ts +28 -0
  356. package/src/runtime/admin-extra-ops.ts +652 -0
  357. package/src/runtime/admin-ops.ts +340 -0
  358. package/src/runtime/capture-ops.ts +404 -0
  359. package/src/runtime/cognee-sync-ops.ts +63 -0
  360. package/src/runtime/core-ops.ts +787 -9
  361. package/src/runtime/curator-extra-ops.ts +85 -0
  362. package/src/runtime/domain-ops.ts +67 -15
  363. package/src/runtime/grading-ops.ts +130 -0
  364. package/src/runtime/intake-ops.ts +126 -0
  365. package/src/runtime/loop-ops.ts +277 -0
  366. package/src/runtime/memory-cross-project-ops.ts +191 -0
  367. package/src/runtime/memory-extra-ops.ts +186 -0
  368. package/src/runtime/orchestrate-ops.ts +278 -0
  369. package/src/runtime/planning-extra-ops.ts +718 -0
  370. package/src/runtime/playbook-ops.ts +169 -0
  371. package/src/runtime/project-ops.ts +202 -0
  372. package/src/runtime/runtime.ts +77 -3
  373. package/src/runtime/types.ts +29 -0
  374. package/src/runtime/vault-extra-ops.ts +606 -0
  375. package/src/telemetry/telemetry.ts +118 -0
  376. package/src/vault/playbook.ts +87 -0
  377. package/src/vault/vault.ts +575 -98
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Generic Playbook: Test-Driven Development
3
+ *
4
+ * RED -> GREEN -> REFACTOR cycle.
5
+ * Ported from Salvador's TDD playbook with agent-agnostic tool injections.
6
+ */
7
+ export const tddPlaybook = {
8
+ id: 'generic-tdd',
9
+ tier: 'generic',
10
+ title: 'Test-Driven Development',
11
+ trigger: 'Use when intent is BUILD or FIX and implementation involves writing new code or modifying existing behavior. Activates for any task that produces production code.',
12
+ description: 'Enforces the RED-GREEN-REFACTOR cycle: write a failing test first, implement minimal code to pass it, then refactor. No production code exists without a test that demanded it. Tests drive the design — if something is hard to test, the design needs simplification.',
13
+ steps: `1. RED — Write the test first
14
+ - Write a test that describes the desired behavior
15
+ - Run it and watch it FAIL (read the actual output)
16
+ - If it passes without new code, the test is wrong or the feature already exists
17
+
18
+ 2. GREEN — Write minimal code to pass
19
+ - Write the simplest implementation that makes the test pass
20
+ - Do NOT write more code than the test demands
21
+ - Run the test and watch it PASS (read the actual output)
22
+
23
+ 3. REFACTOR — Clean up while green
24
+ - Improve structure, naming, duplication — without changing behavior
25
+ - Run tests after every change — they must stay green
26
+ - Commit when clean
27
+
28
+ 4. REPEAT — Next behavior, next test
29
+ - Each cycle should take 2-5 minutes
30
+ - If a cycle takes longer, the step is too big — break it down
31
+
32
+ IRON LAW: If you wrote production code before the test, DELETE IT and start over.`,
33
+ expectedOutcome: 'Every piece of production code is demanded by a failing test. Test suite is comprehensive, fast, and trustworthy. Design emerges from testing pressure — simple, decoupled, focused.',
34
+ category: 'methodology',
35
+ tags: ['tdd', 'testing', 'red-green-refactor', 'discipline', 'generic'],
36
+ matchIntents: ['BUILD', 'FIX'],
37
+ matchKeywords: ['implement', 'build', 'create', 'add', 'fix', 'refactor', 'feature', 'code'],
38
+ gates: [
39
+ {
40
+ phase: 'post-task',
41
+ requirement: 'Test must exist and fail before implementation code is written',
42
+ checkType: 'tdd-red',
43
+ },
44
+ {
45
+ phase: 'completion',
46
+ requirement: 'All tests pass with actual output verified (not self-reported)',
47
+ checkType: 'tdd-green',
48
+ },
49
+ ],
50
+ taskTemplates: [
51
+ {
52
+ taskType: 'test',
53
+ titleTemplate: 'Write failing tests for: {objective}',
54
+ acceptanceCriteria: [
55
+ 'Tests describe desired behavior, not implementation details',
56
+ 'Tests run and FAIL (output read and verified)',
57
+ 'No production code written yet',
58
+ ],
59
+ tools: ['search_intelligent'],
60
+ order: 'before-implementation',
61
+ },
62
+ ],
63
+ toolInjections: ['search_intelligent'],
64
+ verificationCriteria: [
65
+ 'Test suite passes (run command, read output)',
66
+ 'No skipped or pending tests',
67
+ 'Coverage covers the new/modified code paths',
68
+ ],
69
+ };
70
+ //# sourceMappingURL=tdd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tdd.js","sourceRoot":"","sources":["../../../src/playbooks/generic/tdd.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,WAAW,GAAuB;IAC7C,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,yBAAyB;IAChC,OAAO,EACL,oKAAoK;IACtK,WAAW,EACT,yQAAyQ;IAC3Q,KAAK,EAAE;;;;;;;;;;;;;;;;;;;kFAmByE;IAChF,eAAe,EACb,sLAAsL;IACxL,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,SAAS,CAAC;IACvE,YAAY,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;IAC9B,aAAa,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC;IAC5F,KAAK,EAAE;QACL;YACE,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,gEAAgE;YAC7E,SAAS,EAAE,SAAS;SACrB;QACD;YACE,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,gEAAgE;YAC7E,SAAS,EAAE,WAAW;SACvB;KACF;IACD,aAAa,EAAE;QACb;YACE,QAAQ,EAAE,MAAM;YAChB,aAAa,EAAE,sCAAsC;YACrD,kBAAkB,EAAE;gBAClB,6DAA6D;gBAC7D,+CAA+C;gBAC/C,gCAAgC;aACjC;YACD,KAAK,EAAE,CAAC,oBAAoB,CAAC;YAC7B,KAAK,EAAE,uBAAuB;SAC/B;KACF;IACD,cAAc,EAAE,CAAC,oBAAoB,CAAC;IACtC,oBAAoB,EAAE;QACpB,8CAA8C;QAC9C,6BAA6B;QAC7B,6CAA6C;KAC9C;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generic Playbook: Verification Before Completion
3
+ *
4
+ * Evidence-based completion — no self-reported success.
5
+ * Ported from Salvador's verification playbook.
6
+ */
7
+ import type { PlaybookDefinition } from '../playbook-types.js';
8
+ export declare const verificationPlaybook: PlaybookDefinition;
9
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../src/playbooks/generic/verification.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,eAAO,MAAM,oBAAoB,EAAE,kBAqElC,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Generic Playbook: Verification Before Completion
3
+ *
4
+ * Evidence-based completion — no self-reported success.
5
+ * Ported from Salvador's verification playbook.
6
+ */
7
+ export const verificationPlaybook = {
8
+ id: 'generic-verification',
9
+ tier: 'generic',
10
+ title: 'Verification Before Completion',
11
+ trigger: 'Use at the completion of any task or plan. Activates automatically as a completion gate. Prevents the common failure mode of claiming success without running verification commands.',
12
+ description: 'Every completion claim must be backed by evidence: run the command, read the output, only then assert the result. No self-reported success. No "the tests should pass." Actual output or it didn\'t happen.',
13
+ steps: `1. IDENTIFY VERIFICATION COMMANDS
14
+ - What commands prove this works? (test runner, build, lint, type check)
15
+ - What manual checks are needed? (UI renders, API responds, file exists)
16
+ - What acceptance criteria need evidence?
17
+
18
+ 2. RUN EACH COMMAND
19
+ - Execute each verification command
20
+ - READ THE ACTUAL OUTPUT (not just the exit code)
21
+ - If any command fails: the task is NOT complete
22
+
23
+ 3. COLLECT EVIDENCE
24
+ - For each claim, record the command and its output
25
+ - "Tests pass" → show the test runner output
26
+ - "Build succeeds" → show the build output
27
+ - "No regressions" → show the full test suite output
28
+
29
+ 4. VERIFY AGAINST ACCEPTANCE CRITERIA
30
+ - Check each acceptance criterion against collected evidence
31
+ - Mark each as: VERIFIED (with evidence) or UNVERIFIED
32
+ - If any criterion is UNVERIFIED: the task is NOT complete
33
+
34
+ COMMON FALSE COMPLETIONS:
35
+ | Claim | NOT Sufficient | Required |
36
+ |-------|---------------|----------|
37
+ | "Tests pass" | "I believe tests pass" | npm test output showing all pass |
38
+ | "Build works" | "Should compile fine" | npm run build output with 0 errors |
39
+ | "No regressions" | "Didn't change much" | Full test suite output |
40
+ | "Types correct" | "Looks right to me" | tsc --noEmit output |`,
41
+ expectedOutcome: 'Every completion claim is backed by command output evidence. No ambiguity about whether the work is actually done.',
42
+ category: 'methodology',
43
+ tags: ['verification', 'evidence', 'completion', 'discipline', 'generic'],
44
+ matchIntents: ['BUILD', 'FIX', 'IMPROVE', 'DELIVER'],
45
+ matchKeywords: ['done', 'complete', 'finish', 'ship', 'merge', 'deploy', 'release'],
46
+ gates: [
47
+ {
48
+ phase: 'completion',
49
+ requirement: 'All acceptance criteria must have evidence (command output, not self-report)',
50
+ checkType: 'verification-evidence',
51
+ },
52
+ ],
53
+ taskTemplates: [
54
+ {
55
+ taskType: 'verification',
56
+ titleTemplate: 'Verify: {objective}',
57
+ acceptanceCriteria: [
58
+ 'All verification commands executed and output read',
59
+ 'All acceptance criteria matched against evidence',
60
+ 'No unverified claims remain',
61
+ ],
62
+ tools: [],
63
+ order: 'after-implementation',
64
+ },
65
+ ],
66
+ toolInjections: [],
67
+ verificationCriteria: [
68
+ 'Test suite passes (actual output, not self-report)',
69
+ 'Build succeeds (actual output)',
70
+ 'Type checking passes (actual output)',
71
+ 'All acceptance criteria have matching evidence',
72
+ ],
73
+ };
74
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../../../src/playbooks/generic/verification.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAuB;IACtD,EAAE,EAAE,sBAAsB;IAC1B,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,gCAAgC;IACvC,OAAO,EACL,sLAAsL;IACxL,WAAW,EACT,6MAA6M;IAC/M,KAAK,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;gEA2BuD;IAC9D,eAAe,EACb,oHAAoH;IACtH,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,CAAC;IACzE,YAAY,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IACpD,aAAa,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IACnF,KAAK,EAAE;QACL;YACE,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,8EAA8E;YAC3F,SAAS,EAAE,uBAAuB;SACnC;KACF;IACD,aAAa,EAAE;QACb;YACE,QAAQ,EAAE,cAAc;YACxB,aAAa,EAAE,qBAAqB;YACpC,kBAAkB,EAAE;gBAClB,oDAAoD;gBACpD,kDAAkD;gBAClD,6BAA6B;aAC9B;YACD,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,sBAAsB;SAC9B;KACF;IACD,cAAc,EAAE,EAAE;IAClB,oBAAoB,EAAE;QACpB,oDAAoD;QACpD,gCAAgC;QAChC,sCAAsC;QACtC,gDAAgD;KACjD;CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { PlaybookTier, PlaybookIntent, BrainstormSection, PlaybookGate, PlaybookTaskTemplate, PlaybookDefinition, MergedPlaybook, PlaybookMatchResult, } from './playbook-types.js';
2
+ export { getBuiltinPlaybook, getAllBuiltinPlaybooks, scorePlaybook, mergePlaybooks, matchPlaybooks, } from './playbook-registry.js';
3
+ export { playbookDefinitionToEntry, entryToPlaybookDefinition, seedDefaultPlaybooks, } from './playbook-seeder.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/playbooks/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // ─── Playbook Registry ──────────────────────────────────────────────
2
+ export { getBuiltinPlaybook, getAllBuiltinPlaybooks, scorePlaybook, mergePlaybooks, matchPlaybooks, } from './playbook-registry.js';
3
+ // ─── Playbook Seeder ────────────────────────────────────────────────
4
+ export { playbookDefinitionToEntry, entryToPlaybookDefinition, seedDefaultPlaybooks, } from './playbook-seeder.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/playbooks/index.ts"],"names":[],"mappings":"AAYA,uEAAuE;AACvE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,wBAAwB,CAAC;AAEhC,uEAAuE;AACvE,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Playbook Registry
3
+ *
4
+ * Matches playbooks to plan context (intent + keywords) and merges
5
+ * generic + domain tiers into a single MergedPlaybook.
6
+ *
7
+ * Resolution order: vault first (user overrides), built-in fallback.
8
+ */
9
+ import type { PlaybookDefinition, PlaybookMatchResult, MergedPlaybook, PlaybookIntent } from './playbook-types.js';
10
+ /**
11
+ * Get a built-in playbook by ID.
12
+ */
13
+ export declare function getBuiltinPlaybook(id: string): PlaybookDefinition | undefined;
14
+ /**
15
+ * Get all built-in playbooks.
16
+ */
17
+ export declare function getAllBuiltinPlaybooks(): readonly PlaybookDefinition[];
18
+ /**
19
+ * Score a playbook against the given intent and text.
20
+ * Returns 0 if no match, positive score if matched.
21
+ */
22
+ export declare function scorePlaybook(playbook: PlaybookDefinition, intent: PlaybookIntent | undefined, text: string): number;
23
+ /**
24
+ * Create a MergedPlaybook from a generic and/or domain match.
25
+ */
26
+ export declare function mergePlaybooks(generic?: PlaybookDefinition, domain?: PlaybookDefinition): MergedPlaybook;
27
+ /**
28
+ * Match playbooks for a plan based on intent and objective/scope text.
29
+ *
30
+ * Resolution:
31
+ * 1. Search built-in playbooks (vault search is wired separately by the caller)
32
+ * 2. Find best generic match
33
+ * 3. Find best domain match
34
+ * 4. If domain has `extends`, resolve the generic it extends
35
+ * 5. Merge into MergedPlaybook
36
+ *
37
+ * @param intent - The detected intent (BUILD, FIX, REVIEW, etc.)
38
+ * @param text - The plan objective + scope text to match against
39
+ * @param vaultPlaybooks - Optional vault-stored playbooks (searched first, override builtins)
40
+ */
41
+ export declare function matchPlaybooks(intent: PlaybookIntent | undefined, text: string, vaultPlaybooks?: PlaybookDefinition[]): PlaybookMatchResult;
42
+ //# sourceMappingURL=playbook-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-registry.d.ts","sourceRoot":"","sources":["../../src/playbooks/playbook-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EAGd,cAAc,EACf,MAAM,qBAAqB,CAAC;AAqC7B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAE7E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,SAAS,kBAAkB,EAAE,CAEtE;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,GACX,MAAM,CAiBR;AA8GD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,CAAC,EAAE,kBAAkB,EAC5B,MAAM,CAAC,EAAE,kBAAkB,GAC1B,cAAc,CAUhB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,kBAAkB,EAAE,GACpC,mBAAmB,CAqCrB"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Playbook Registry
3
+ *
4
+ * Matches playbooks to plan context (intent + keywords) and merges
5
+ * generic + domain tiers into a single MergedPlaybook.
6
+ *
7
+ * Resolution order: vault first (user overrides), built-in fallback.
8
+ */
9
+ // Built-in generic playbook definitions
10
+ import { tddPlaybook } from './generic/tdd.js';
11
+ import { brainstormingPlaybook } from './generic/brainstorming.js';
12
+ import { codeReviewPlaybook } from './generic/code-review.js';
13
+ import { subagentExecutionPlaybook } from './generic/subagent-execution.js';
14
+ import { systematicDebuggingPlaybook } from './generic/systematic-debugging.js';
15
+ import { verificationPlaybook } from './generic/verification.js';
16
+ // =============================================================================
17
+ // SCORING WEIGHTS
18
+ // =============================================================================
19
+ /** Points awarded when the plan intent matches a playbook's matchIntents. */
20
+ const INTENT_MATCH_SCORE = 10;
21
+ /** Points awarded per keyword hit in the plan text. */
22
+ const KEYWORD_MATCH_SCORE = 5;
23
+ /** Minimum total score for a playbook to be considered a match. */
24
+ const MIN_MATCH_SCORE = 5;
25
+ // =============================================================================
26
+ // BUILT-IN REGISTRY
27
+ // =============================================================================
28
+ const BUILTIN_PLAYBOOKS = [
29
+ // Generic tier
30
+ tddPlaybook,
31
+ brainstormingPlaybook,
32
+ codeReviewPlaybook,
33
+ subagentExecutionPlaybook,
34
+ systematicDebuggingPlaybook,
35
+ verificationPlaybook,
36
+ ];
37
+ /**
38
+ * Get a built-in playbook by ID.
39
+ */
40
+ export function getBuiltinPlaybook(id) {
41
+ return BUILTIN_PLAYBOOKS.find((p) => p.id === id);
42
+ }
43
+ /**
44
+ * Get all built-in playbooks.
45
+ */
46
+ export function getAllBuiltinPlaybooks() {
47
+ return BUILTIN_PLAYBOOKS;
48
+ }
49
+ // =============================================================================
50
+ // MATCHING
51
+ // =============================================================================
52
+ /**
53
+ * Score a playbook against the given intent and text.
54
+ * Returns 0 if no match, positive score if matched.
55
+ */
56
+ export function scorePlaybook(playbook, intent, text) {
57
+ let score = 0;
58
+ const lowerText = text.toLowerCase();
59
+ // Intent match
60
+ if (intent && playbook.matchIntents.includes(intent)) {
61
+ score += INTENT_MATCH_SCORE;
62
+ }
63
+ // Keyword match
64
+ for (const keyword of playbook.matchKeywords) {
65
+ if (lowerText.includes(keyword.toLowerCase())) {
66
+ score += KEYWORD_MATCH_SCORE;
67
+ }
68
+ }
69
+ return score;
70
+ }
71
+ /**
72
+ * Find the best matching playbook from a list for the given context.
73
+ * Returns the highest-scoring playbook above the threshold, or undefined.
74
+ */
75
+ function findBestMatch(playbooks, intent, text, minScore = MIN_MATCH_SCORE) {
76
+ let best;
77
+ for (const playbook of playbooks) {
78
+ const score = scorePlaybook(playbook, intent, text);
79
+ if (score >= minScore && (!best || score > best.score)) {
80
+ best = { playbook, score };
81
+ }
82
+ }
83
+ return best;
84
+ }
85
+ // =============================================================================
86
+ // MERGING
87
+ // =============================================================================
88
+ /**
89
+ * Merge gates from generic and domain playbooks.
90
+ * Domain gates come after generic gates. No deduplication — they serve different purposes.
91
+ */
92
+ function mergeGates(generic, domain) {
93
+ const gates = [];
94
+ if (generic)
95
+ gates.push(...generic.gates);
96
+ if (domain)
97
+ gates.push(...domain.gates);
98
+ return gates;
99
+ }
100
+ /**
101
+ * Merge task templates from generic and domain playbooks.
102
+ * Domain templates with the same order position override generic ones of the same taskType.
103
+ */
104
+ function mergeTaskTemplates(generic, domain) {
105
+ const genericTemplates = generic?.taskTemplates ?? [];
106
+ const domainTemplates = domain?.taskTemplates ?? [];
107
+ // Start with generic templates
108
+ const merged = [...genericTemplates];
109
+ for (const domainTemplate of domainTemplates) {
110
+ // Check if domain overrides a generic template at the same order + taskType
111
+ const overrideIndex = merged.findIndex((g) => g.order === domainTemplate.order && g.taskType === domainTemplate.taskType);
112
+ if (overrideIndex >= 0) {
113
+ // Domain overrides generic
114
+ merged[overrideIndex] = domainTemplate;
115
+ }
116
+ else {
117
+ // Domain adds a new template
118
+ merged.push(domainTemplate);
119
+ }
120
+ }
121
+ return merged;
122
+ }
123
+ /**
124
+ * Merge tool injections from generic and domain playbooks.
125
+ * Deduplicated — each tool appears only once.
126
+ */
127
+ function mergeTools(generic, domain) {
128
+ const tools = new Set();
129
+ if (generic) {
130
+ for (const tool of generic.toolInjections)
131
+ tools.add(tool);
132
+ }
133
+ if (domain) {
134
+ for (const tool of domain.toolInjections)
135
+ tools.add(tool);
136
+ }
137
+ return Array.from(tools);
138
+ }
139
+ /**
140
+ * Merge verification criteria from generic and domain playbooks.
141
+ * All criteria from both tiers — domain typically adds domain-specific checks.
142
+ */
143
+ function mergeVerification(generic, domain) {
144
+ const criteria = [];
145
+ if (generic)
146
+ criteria.push(...generic.verificationCriteria);
147
+ if (domain)
148
+ criteria.push(...domain.verificationCriteria);
149
+ // Deduplicate exact matches
150
+ return [...new Set(criteria)];
151
+ }
152
+ /**
153
+ * Build a human-readable label for the merged playbook.
154
+ */
155
+ function buildLabel(generic, domain) {
156
+ if (generic && domain) {
157
+ return `${domain.title} (extends ${generic.title})`;
158
+ }
159
+ if (domain)
160
+ return domain.title;
161
+ if (generic)
162
+ return generic.title;
163
+ return 'Unknown';
164
+ }
165
+ /**
166
+ * Create a MergedPlaybook from a generic and/or domain match.
167
+ */
168
+ export function mergePlaybooks(generic, domain) {
169
+ return {
170
+ generic,
171
+ domain,
172
+ mergedGates: mergeGates(generic, domain),
173
+ mergedTasks: mergeTaskTemplates(generic, domain),
174
+ mergedTools: mergeTools(generic, domain),
175
+ mergedVerification: mergeVerification(generic, domain),
176
+ label: buildLabel(generic, domain),
177
+ };
178
+ }
179
+ // =============================================================================
180
+ // MAIN API
181
+ // =============================================================================
182
+ /**
183
+ * Match playbooks for a plan based on intent and objective/scope text.
184
+ *
185
+ * Resolution:
186
+ * 1. Search built-in playbooks (vault search is wired separately by the caller)
187
+ * 2. Find best generic match
188
+ * 3. Find best domain match
189
+ * 4. If domain has `extends`, resolve the generic it extends
190
+ * 5. Merge into MergedPlaybook
191
+ *
192
+ * @param intent - The detected intent (BUILD, FIX, REVIEW, etc.)
193
+ * @param text - The plan objective + scope text to match against
194
+ * @param vaultPlaybooks - Optional vault-stored playbooks (searched first, override builtins)
195
+ */
196
+ export function matchPlaybooks(intent, text, vaultPlaybooks) {
197
+ // Combine vault (higher priority) and built-in playbooks
198
+ const allPlaybooks = [...(vaultPlaybooks ?? []), ...BUILTIN_PLAYBOOKS];
199
+ const generics = allPlaybooks.filter((p) => p.tier === 'generic');
200
+ const domains = allPlaybooks.filter((p) => p.tier === 'domain');
201
+ // Find best domain match first (domain is more specific)
202
+ const domainMatch = findBestMatch(domains, intent, text);
203
+ // Find best generic match
204
+ let genericMatch = findBestMatch(generics, intent, text);
205
+ // If domain extends a specific generic, prefer that one
206
+ if (domainMatch?.playbook.extends) {
207
+ const extendedGeneric = allPlaybooks.find((p) => p.id === domainMatch.playbook.extends);
208
+ if (extendedGeneric) {
209
+ genericMatch = { playbook: extendedGeneric, score: domainMatch.score };
210
+ }
211
+ }
212
+ // No match at all
213
+ if (!genericMatch && !domainMatch) {
214
+ return { playbook: null };
215
+ }
216
+ const merged = mergePlaybooks(genericMatch?.playbook, domainMatch?.playbook);
217
+ return {
218
+ playbook: merged,
219
+ genericMatch: genericMatch
220
+ ? { id: genericMatch.playbook.id, source: 'builtin', score: genericMatch.score }
221
+ : undefined,
222
+ domainMatch: domainMatch
223
+ ? { id: domainMatch.playbook.id, source: 'builtin', score: domainMatch.score }
224
+ : undefined,
225
+ };
226
+ }
227
+ //# sourceMappingURL=playbook-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-registry.js","sourceRoot":"","sources":["../../src/playbooks/playbook-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Playbook Seeder
3
+ *
4
+ * Seeds default playbooks into the vault on activation.
5
+ * Idempotent — only seeds playbooks that don't already exist.
6
+ * Never overwrites user-modified playbooks.
7
+ *
8
+ * Also provides conversion utilities between PlaybookDefinition and
9
+ * IntelligenceEntry for vault storage.
10
+ */
11
+ import type { IntelligenceEntry } from '../intelligence/types.js';
12
+ import type { PlaybookDefinition } from './playbook-types.js';
13
+ import type { Vault } from '../vault/vault.js';
14
+ /**
15
+ * Convert a PlaybookDefinition to a vault IntelligenceEntry.
16
+ *
17
+ * Field mapping:
18
+ * id -> id title -> title
19
+ * 'playbook' -> type category -> domain
20
+ * 'suggestion' -> severity
21
+ * trigger -> context (prefixed with full definition JSON for reconstruction)
22
+ * description -> description
23
+ * tags -> tags
24
+ * steps -> example
25
+ * expectedOutcome -> why
26
+ */
27
+ export declare function playbookDefinitionToEntry(def: PlaybookDefinition): IntelligenceEntry;
28
+ /**
29
+ * Extract a PlaybookDefinition from a vault IntelligenceEntry.
30
+ * Returns null if the entry doesn't contain PlaybookDefinition metadata.
31
+ */
32
+ export declare function entryToPlaybookDefinition(entry: IntelligenceEntry): PlaybookDefinition | null;
33
+ /**
34
+ * Seed default built-in playbooks into the vault.
35
+ * Idempotent — skips playbooks that already exist (never overwrites).
36
+ */
37
+ export declare function seedDefaultPlaybooks(vault: Vault): {
38
+ seeded: number;
39
+ skipped: number;
40
+ errors: number;
41
+ details: Array<{
42
+ id: string;
43
+ action: 'seeded' | 'skipped' | 'error';
44
+ reason?: string;
45
+ }>;
46
+ };
47
+ //# sourceMappingURL=playbook-seeder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-seeder.d.ts","sourceRoot":"","sources":["../../src/playbooks/playbook-seeder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,kBAAkB,GAAG,iBAAiB,CAgBpF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,IAAI,CAqB7F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzF,CAmCA"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Playbook Seeder
3
+ *
4
+ * Seeds default playbooks into the vault on activation.
5
+ * Idempotent — only seeds playbooks that don't already exist.
6
+ * Never overwrites user-modified playbooks.
7
+ *
8
+ * Also provides conversion utilities between PlaybookDefinition and
9
+ * IntelligenceEntry for vault storage.
10
+ */
11
+ import { getAllBuiltinPlaybooks } from './playbook-registry.js';
12
+ /**
13
+ * Convert a PlaybookDefinition to a vault IntelligenceEntry.
14
+ *
15
+ * Field mapping:
16
+ * id -> id title -> title
17
+ * 'playbook' -> type category -> domain
18
+ * 'suggestion' -> severity
19
+ * trigger -> context (prefixed with full definition JSON for reconstruction)
20
+ * description -> description
21
+ * tags -> tags
22
+ * steps -> example
23
+ * expectedOutcome -> why
24
+ */
25
+ export function playbookDefinitionToEntry(def) {
26
+ // Serialize the full definition as JSON metadata so playbook_match can reconstruct it
27
+ const metadata = JSON.stringify(def);
28
+ return {
29
+ id: def.id,
30
+ type: 'playbook',
31
+ domain: def.category,
32
+ title: def.title,
33
+ severity: 'suggestion',
34
+ description: def.description,
35
+ context: `__PLAYBOOK_DEF__${metadata}__END_DEF__\n${def.trigger}`,
36
+ example: def.steps,
37
+ why: def.expectedOutcome,
38
+ tags: def.tags,
39
+ };
40
+ }
41
+ /**
42
+ * Extract a PlaybookDefinition from a vault IntelligenceEntry.
43
+ * Returns null if the entry doesn't contain PlaybookDefinition metadata.
44
+ */
45
+ export function entryToPlaybookDefinition(entry) {
46
+ if (entry.type !== 'playbook')
47
+ return null;
48
+ const context = entry.context ?? '';
49
+ const startMarker = '__PLAYBOOK_DEF__';
50
+ const endMarker = '__END_DEF__';
51
+ const startIdx = context.indexOf(startMarker);
52
+ const endIdx = context.indexOf(endMarker);
53
+ if (startIdx < 0 || endIdx < 0)
54
+ return null;
55
+ try {
56
+ const json = context.slice(startIdx + startMarker.length, endIdx);
57
+ const def = JSON.parse(json);
58
+ // Validate it has the essential fields
59
+ if (!def.id || !def.tier || !def.title)
60
+ return null;
61
+ return def;
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ /**
68
+ * Seed default built-in playbooks into the vault.
69
+ * Idempotent — skips playbooks that already exist (never overwrites).
70
+ */
71
+ export function seedDefaultPlaybooks(vault) {
72
+ const result = {
73
+ seeded: 0,
74
+ skipped: 0,
75
+ errors: 0,
76
+ details: [],
77
+ };
78
+ const playbooks = getAllBuiltinPlaybooks();
79
+ for (const playbook of playbooks) {
80
+ try {
81
+ // Check if already exists
82
+ const existing = vault.get(playbook.id);
83
+ if (existing) {
84
+ result.skipped++;
85
+ result.details.push({ id: playbook.id, action: 'skipped', reason: 'already exists' });
86
+ continue;
87
+ }
88
+ const entry = playbookDefinitionToEntry(playbook);
89
+ vault.add(entry);
90
+ result.seeded++;
91
+ result.details.push({ id: playbook.id, action: 'seeded' });
92
+ }
93
+ catch (error) {
94
+ result.errors++;
95
+ result.details.push({
96
+ id: playbook.id,
97
+ action: 'error',
98
+ reason: error instanceof Error ? error.message : String(error),
99
+ });
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ //# sourceMappingURL=playbook-seeder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-seeder.js","sourceRoot":"","sources":["../../src/playbooks/playbook-seeder.ts"],"names":[],"mappings":"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"}