beth-copilot 1.0.18 → 2.0.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 (429) hide show
  1. package/CHANGELOG.md +79 -28
  2. package/README.md +127 -298
  3. package/assets/beth-questioning.png +0 -0
  4. package/assets/yellowstone-beth.png +0 -0
  5. package/bin/cli.js +124 -715
  6. package/dist/__tests__/inject-skills.test.d.ts +9 -0
  7. package/dist/__tests__/inject-skills.test.d.ts.map +1 -0
  8. package/dist/__tests__/inject-skills.test.js +143 -0
  9. package/dist/__tests__/inject-skills.test.js.map +1 -0
  10. package/dist/__tests__/skills/disambiguation.test.d.ts +10 -0
  11. package/dist/__tests__/skills/disambiguation.test.d.ts.map +1 -0
  12. package/dist/__tests__/skills/disambiguation.test.js +192 -0
  13. package/dist/__tests__/skills/disambiguation.test.js.map +1 -0
  14. package/dist/__tests__/skills/hook-injection.test.d.ts +11 -0
  15. package/dist/__tests__/skills/hook-injection.test.d.ts.map +1 -0
  16. package/dist/__tests__/skills/hook-injection.test.js +173 -0
  17. package/dist/__tests__/skills/hook-injection.test.js.map +1 -0
  18. package/dist/__tests__/skills/mapping-completeness.test.d.ts +17 -0
  19. package/dist/__tests__/skills/mapping-completeness.test.d.ts.map +1 -0
  20. package/dist/__tests__/skills/mapping-completeness.test.js +281 -0
  21. package/dist/__tests__/skills/mapping-completeness.test.js.map +1 -0
  22. package/dist/__tests__/skills/pipeline-integration.test.d.ts +18 -0
  23. package/dist/__tests__/skills/pipeline-integration.test.d.ts.map +1 -0
  24. package/dist/__tests__/skills/pipeline-integration.test.js +234 -0
  25. package/dist/__tests__/skills/pipeline-integration.test.js.map +1 -0
  26. package/dist/__tests__/skills/skill-routing.test.d.ts +15 -0
  27. package/dist/__tests__/skills/skill-routing.test.d.ts.map +1 -0
  28. package/dist/__tests__/skills/skill-routing.test.js +723 -0
  29. package/dist/__tests__/skills/skill-routing.test.js.map +1 -0
  30. package/dist/__tests__/skills/trigger-coverage.test.d.ts +24 -0
  31. package/dist/__tests__/skills/trigger-coverage.test.d.ts.map +1 -0
  32. package/dist/__tests__/skills/trigger-coverage.test.js +746 -0
  33. package/dist/__tests__/skills/trigger-coverage.test.js.map +1 -0
  34. package/dist/__tests__/smoke.test.d.ts +8 -0
  35. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  36. package/dist/__tests__/smoke.test.js +62 -0
  37. package/dist/__tests__/smoke.test.js.map +1 -0
  38. package/dist/__tests__/verify-skills.test.d.ts +9 -0
  39. package/dist/__tests__/verify-skills.test.d.ts.map +1 -0
  40. package/dist/__tests__/verify-skills.test.js +78 -0
  41. package/dist/__tests__/verify-skills.test.js.map +1 -0
  42. package/dist/cli/commands/beads.e2e.test.d.ts +15 -0
  43. package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
  44. package/dist/cli/commands/beads.e2e.test.js +585 -0
  45. package/dist/cli/commands/beads.e2e.test.js.map +1 -0
  46. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
  47. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
  48. package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
  49. package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
  50. package/dist/cli/commands/close.d.ts +54 -0
  51. package/dist/cli/commands/close.d.ts.map +1 -0
  52. package/dist/cli/commands/close.e2e.test.d.ts +11 -0
  53. package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
  54. package/dist/cli/commands/close.e2e.test.js +71 -0
  55. package/dist/cli/commands/close.e2e.test.js.map +1 -0
  56. package/dist/cli/commands/close.js +95 -0
  57. package/dist/cli/commands/close.js.map +1 -0
  58. package/dist/cli/commands/close.test.d.ts +13 -0
  59. package/dist/cli/commands/close.test.d.ts.map +1 -0
  60. package/dist/cli/commands/close.test.js +254 -0
  61. package/dist/cli/commands/close.test.js.map +1 -0
  62. package/dist/cli/commands/doctor.d.ts +7 -1
  63. package/dist/cli/commands/doctor.d.ts.map +1 -1
  64. package/dist/cli/commands/doctor.e2e.test.js +3 -59
  65. package/dist/cli/commands/doctor.e2e.test.js.map +1 -1
  66. package/dist/cli/commands/doctor.js +38 -18
  67. package/dist/cli/commands/doctor.js.map +1 -1
  68. package/dist/cli/commands/doctor.test.js +32 -25
  69. package/dist/cli/commands/doctor.test.js.map +1 -1
  70. package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
  71. package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
  72. package/dist/cli/commands/framework-isolation.test.js +118 -0
  73. package/dist/cli/commands/framework-isolation.test.js.map +1 -0
  74. package/dist/cli/commands/help.e2e.test.js +5 -9
  75. package/dist/cli/commands/help.e2e.test.js.map +1 -1
  76. package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
  77. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  78. package/dist/cli/commands/init-logic.e2e.test.js +315 -0
  79. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  80. package/dist/cli/commands/init.test.js +4 -21
  81. package/dist/cli/commands/init.test.js.map +1 -1
  82. package/dist/cli/commands/land.d.ts +130 -0
  83. package/dist/cli/commands/land.d.ts.map +1 -0
  84. package/dist/cli/commands/land.js +592 -0
  85. package/dist/cli/commands/land.js.map +1 -0
  86. package/dist/cli/commands/land.test.d.ts +19 -0
  87. package/dist/cli/commands/land.test.d.ts.map +1 -0
  88. package/dist/cli/commands/land.test.js +567 -0
  89. package/dist/cli/commands/land.test.js.map +1 -0
  90. package/dist/cli/commands/mcp.e2e.test.js +24 -31
  91. package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
  92. package/dist/cli/commands/pipeline.e2e.test.js +28 -31
  93. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  94. package/dist/cli/commands/pre-push-guard.d.ts +74 -0
  95. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  96. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  97. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  98. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  99. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  100. package/dist/cli/commands/pre-push-guard.js +212 -0
  101. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  102. package/dist/cli/commands/pre-push-guard.test.d.ts +14 -0
  103. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  104. package/dist/cli/commands/pre-push-guard.test.js +314 -0
  105. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  106. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  107. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  108. package/dist/cli/commands/quickstart-expanded.e2e.test.js +152 -0
  109. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  110. package/dist/cli/commands/quickstart.d.ts +0 -1
  111. package/dist/cli/commands/quickstart.d.ts.map +1 -1
  112. package/dist/cli/commands/quickstart.js +9 -83
  113. package/dist/cli/commands/quickstart.js.map +1 -1
  114. package/dist/cli/commands/quickstart.test.js +8 -129
  115. package/dist/cli/commands/quickstart.test.js.map +1 -1
  116. package/dist/cli/commands/update.d.ts +35 -0
  117. package/dist/cli/commands/update.d.ts.map +1 -0
  118. package/dist/cli/commands/update.e2e.test.d.ts +24 -0
  119. package/dist/cli/commands/update.e2e.test.d.ts.map +1 -0
  120. package/dist/cli/commands/update.e2e.test.js +240 -0
  121. package/dist/cli/commands/update.e2e.test.js.map +1 -0
  122. package/dist/cli/commands/update.js +255 -0
  123. package/dist/cli/commands/update.js.map +1 -0
  124. package/dist/core/agents/frontmatter.test.js +1 -1
  125. package/dist/core/agents/frontmatter.test.js.map +1 -1
  126. package/dist/core/agents/handoffs.test.js +1 -1
  127. package/dist/core/agents/handoffs.test.js.map +1 -1
  128. package/dist/core/agents/loader.d.ts +4 -2
  129. package/dist/core/agents/loader.d.ts.map +1 -1
  130. package/dist/core/agents/loader.js +5 -3
  131. package/dist/core/agents/loader.js.map +1 -1
  132. package/dist/core/agents/loader.test.js +42 -4
  133. package/dist/core/agents/loader.test.js.map +1 -1
  134. package/dist/core/agents/suite.test.js +12 -9
  135. package/dist/core/agents/suite.test.js.map +1 -1
  136. package/dist/core/agents/tools.test.js +15 -9
  137. package/dist/core/agents/tools.test.js.map +1 -1
  138. package/dist/core/agents/types.test.js +1 -1
  139. package/dist/core/agents/types.test.js.map +1 -1
  140. package/dist/core/skills/loader.test.js +1 -1
  141. package/dist/core/skills/loader.test.js.map +1 -1
  142. package/dist/index.d.ts +3 -11
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +5 -12
  145. package/dist/index.js.map +1 -1
  146. package/dist/lib/pathValidation.d.ts +0 -5
  147. package/dist/lib/pathValidation.d.ts.map +1 -1
  148. package/dist/lib/pathValidation.js +0 -11
  149. package/dist/lib/pathValidation.js.map +1 -1
  150. package/dist/lib/pathValidation.test.js +2 -14
  151. package/dist/lib/pathValidation.test.js.map +1 -1
  152. package/package.json +13 -10
  153. package/sbom.json +1927 -847
  154. package/templates/.github/agents/beth.agent.md +331 -105
  155. package/templates/.github/agents/developer.agent.md +73 -102
  156. package/templates/.github/agents/product-manager.agent.md +24 -68
  157. package/templates/.github/agents/researcher.agent.md +21 -69
  158. package/templates/.github/agents/security-reviewer.agent.md +39 -82
  159. package/templates/.github/agents/tester.agent.md +44 -65
  160. package/templates/.github/agents/ux-designer.agent.md +25 -76
  161. package/templates/.github/copilot-instructions.md +246 -225
  162. package/templates/.github/copilot-mcp-config.json +12 -0
  163. package/templates/.github/dependabot.yml +68 -0
  164. package/templates/.github/hooks/scripts/inject-skills.mjs +139 -0
  165. package/templates/.github/hooks/scripts/verify-skills.mjs +47 -0
  166. package/templates/.github/hooks/skill-enforcement.json +18 -0
  167. package/templates/.github/pull_request_template.md +48 -0
  168. package/templates/.github/skills/framer-components/SKILL.md +0 -0
  169. package/templates/.github/skills/prd/SKILL.md +0 -0
  170. package/templates/.github/skills/security-analysis/SKILL.md +798 -798
  171. package/templates/.github/skills/shadcn-ui/SKILL.md +561 -561
  172. package/templates/.github/skills/vercel-react-best-practices/AGENTS.md +0 -0
  173. package/templates/.github/skills/vercel-react-best-practices/SKILL.md +0 -0
  174. package/templates/.github/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -0
  175. package/templates/.github/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -0
  176. package/templates/.github/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -0
  177. package/templates/.github/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -0
  178. package/templates/.github/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -0
  179. package/templates/.github/skills/vercel-react-best-practices/rules/async-parallel.md +0 -0
  180. package/templates/.github/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -0
  181. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -0
  182. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -0
  183. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -0
  184. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -0
  185. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -0
  186. package/templates/.github/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -0
  187. package/templates/.github/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -0
  188. package/templates/.github/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -0
  189. package/templates/.github/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -0
  190. package/templates/.github/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -0
  191. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -0
  192. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -0
  193. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -0
  194. package/templates/.github/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -0
  195. package/templates/.github/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -0
  196. package/templates/.github/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -0
  197. package/templates/.github/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -0
  198. package/templates/.github/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -0
  199. package/templates/.github/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -0
  200. package/templates/.github/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -0
  201. package/templates/.github/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -0
  202. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -0
  203. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -0
  204. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -0
  205. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -0
  206. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -0
  207. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -0
  208. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -0
  209. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -0
  210. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -0
  211. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -0
  212. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -0
  213. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -0
  214. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -0
  215. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -0
  216. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -0
  217. package/templates/.github/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -0
  218. package/templates/.github/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -0
  219. package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -0
  220. package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -0
  221. package/templates/.github/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -0
  222. package/templates/.github/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -0
  223. package/templates/.github/skills/vercel-react-best-practices/rules/server-serialization.md +0 -0
  224. package/templates/.github/skills/web-design-guidelines/SKILL.md +0 -0
  225. package/templates/.vscode/settings.json +16 -16
  226. package/templates/AGENTS.md +103 -54
  227. package/templates/Backlog.md +80 -80
  228. package/templates/mcp.json.example +0 -3
  229. package/assets/beth-portrait-small.txt +0 -13
  230. package/assets/beth-portrait.txt +0 -60
  231. package/bin/beth-animation.sh +0 -155
  232. package/bin/lib/animation.js +0 -189
  233. package/bin/lib/pathValidation.js +0 -233
  234. package/bin/lib/pathValidation.test.js +0 -280
  235. package/dist/cli/commands/client-config.d.ts +0 -31
  236. package/dist/cli/commands/client-config.d.ts.map +0 -1
  237. package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
  238. package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
  239. package/dist/cli/commands/client-config.e2e.test.js +0 -556
  240. package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
  241. package/dist/cli/commands/client-config.js +0 -73
  242. package/dist/cli/commands/client-config.js.map +0 -1
  243. package/dist/cli/commands/client-config.test.d.ts +0 -6
  244. package/dist/cli/commands/client-config.test.d.ts.map +0 -1
  245. package/dist/cli/commands/client-config.test.js +0 -133
  246. package/dist/cli/commands/client-config.test.js.map +0 -1
  247. package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
  248. package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
  249. package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
  250. package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
  251. package/dist/core/context.d.ts +0 -171
  252. package/dist/core/context.d.ts.map +0 -1
  253. package/dist/core/context.js +0 -353
  254. package/dist/core/context.js.map +0 -1
  255. package/dist/core/context.test.d.ts +0 -8
  256. package/dist/core/context.test.d.ts.map +0 -1
  257. package/dist/core/context.test.js +0 -253
  258. package/dist/core/context.test.js.map +0 -1
  259. package/dist/core/handoffs.d.ts +0 -151
  260. package/dist/core/handoffs.d.ts.map +0 -1
  261. package/dist/core/handoffs.js +0 -220
  262. package/dist/core/handoffs.js.map +0 -1
  263. package/dist/core/handoffs.test.d.ts +0 -8
  264. package/dist/core/handoffs.test.d.ts.map +0 -1
  265. package/dist/core/handoffs.test.js +0 -231
  266. package/dist/core/handoffs.test.js.map +0 -1
  267. package/dist/core/orchestrator.d.ts +0 -246
  268. package/dist/core/orchestrator.d.ts.map +0 -1
  269. package/dist/core/orchestrator.js +0 -514
  270. package/dist/core/orchestrator.js.map +0 -1
  271. package/dist/core/orchestrator.test.d.ts +0 -8
  272. package/dist/core/orchestrator.test.d.ts.map +0 -1
  273. package/dist/core/orchestrator.test.js +0 -517
  274. package/dist/core/orchestrator.test.js.map +0 -1
  275. package/dist/core/router.d.ts +0 -102
  276. package/dist/core/router.d.ts.map +0 -1
  277. package/dist/core/router.js +0 -178
  278. package/dist/core/router.js.map +0 -1
  279. package/dist/core/router.test.d.ts +0 -8
  280. package/dist/core/router.test.d.ts.map +0 -1
  281. package/dist/core/router.test.js +0 -215
  282. package/dist/core/router.test.js.map +0 -1
  283. package/dist/init.test.js +0 -288
  284. package/dist/providers/azure.d.ts +0 -147
  285. package/dist/providers/azure.d.ts.map +0 -1
  286. package/dist/providers/azure.js +0 -491
  287. package/dist/providers/azure.js.map +0 -1
  288. package/dist/providers/azure.test.d.ts +0 -11
  289. package/dist/providers/azure.test.d.ts.map +0 -1
  290. package/dist/providers/azure.test.js +0 -330
  291. package/dist/providers/azure.test.js.map +0 -1
  292. package/dist/providers/config.d.ts +0 -87
  293. package/dist/providers/config.d.ts.map +0 -1
  294. package/dist/providers/config.js +0 -193
  295. package/dist/providers/config.js.map +0 -1
  296. package/dist/providers/config.test.d.ts +0 -7
  297. package/dist/providers/config.test.d.ts.map +0 -1
  298. package/dist/providers/config.test.js +0 -370
  299. package/dist/providers/config.test.js.map +0 -1
  300. package/dist/providers/index.d.ts +0 -18
  301. package/dist/providers/index.d.ts.map +0 -1
  302. package/dist/providers/index.js +0 -14
  303. package/dist/providers/index.js.map +0 -1
  304. package/dist/providers/interface.d.ts +0 -191
  305. package/dist/providers/interface.d.ts.map +0 -1
  306. package/dist/providers/interface.js +0 -94
  307. package/dist/providers/interface.js.map +0 -1
  308. package/dist/providers/retry.d.ts +0 -128
  309. package/dist/providers/retry.d.ts.map +0 -1
  310. package/dist/providers/retry.js +0 -205
  311. package/dist/providers/retry.js.map +0 -1
  312. package/dist/providers/retry.test.d.ts +0 -7
  313. package/dist/providers/retry.test.d.ts.map +0 -1
  314. package/dist/providers/retry.test.js +0 -439
  315. package/dist/providers/retry.test.js.map +0 -1
  316. package/dist/providers/streaming.d.ts +0 -157
  317. package/dist/providers/streaming.d.ts.map +0 -1
  318. package/dist/providers/streaming.js +0 -233
  319. package/dist/providers/streaming.js.map +0 -1
  320. package/dist/providers/streaming.test.d.ts +0 -7
  321. package/dist/providers/streaming.test.d.ts.map +0 -1
  322. package/dist/providers/streaming.test.js +0 -372
  323. package/dist/providers/streaming.test.js.map +0 -1
  324. package/dist/providers/types.d.ts +0 -209
  325. package/dist/providers/types.d.ts.map +0 -1
  326. package/dist/providers/types.js +0 -53
  327. package/dist/providers/types.js.map +0 -1
  328. package/dist/providers/types.test.d.ts +0 -7
  329. package/dist/providers/types.test.d.ts.map +0 -1
  330. package/dist/providers/types.test.js +0 -141
  331. package/dist/providers/types.test.js.map +0 -1
  332. package/dist/tools/cli/beads.d.ts +0 -27
  333. package/dist/tools/cli/beads.d.ts.map +0 -1
  334. package/dist/tools/cli/beads.js +0 -172
  335. package/dist/tools/cli/beads.js.map +0 -1
  336. package/dist/tools/cli/beads.test.d.ts +0 -8
  337. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  338. package/dist/tools/cli/beads.test.js +0 -264
  339. package/dist/tools/cli/beads.test.js.map +0 -1
  340. package/dist/tools/cli/editFile.d.ts +0 -17
  341. package/dist/tools/cli/editFile.d.ts.map +0 -1
  342. package/dist/tools/cli/editFile.js +0 -125
  343. package/dist/tools/cli/editFile.js.map +0 -1
  344. package/dist/tools/cli/editFile.test.d.ts +0 -8
  345. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  346. package/dist/tools/cli/editFile.test.js +0 -177
  347. package/dist/tools/cli/editFile.test.js.map +0 -1
  348. package/dist/tools/cli/readFile.d.ts +0 -25
  349. package/dist/tools/cli/readFile.d.ts.map +0 -1
  350. package/dist/tools/cli/readFile.js +0 -118
  351. package/dist/tools/cli/readFile.js.map +0 -1
  352. package/dist/tools/cli/readFile.test.d.ts +0 -8
  353. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  354. package/dist/tools/cli/readFile.test.js +0 -194
  355. package/dist/tools/cli/readFile.test.js.map +0 -1
  356. package/dist/tools/cli/search.d.ts +0 -16
  357. package/dist/tools/cli/search.d.ts.map +0 -1
  358. package/dist/tools/cli/search.js +0 -261
  359. package/dist/tools/cli/search.js.map +0 -1
  360. package/dist/tools/cli/search.test.d.ts +0 -8
  361. package/dist/tools/cli/search.test.d.ts.map +0 -1
  362. package/dist/tools/cli/search.test.js +0 -172
  363. package/dist/tools/cli/search.test.js.map +0 -1
  364. package/dist/tools/cli/subagent.d.ts +0 -43
  365. package/dist/tools/cli/subagent.d.ts.map +0 -1
  366. package/dist/tools/cli/subagent.js +0 -99
  367. package/dist/tools/cli/subagent.js.map +0 -1
  368. package/dist/tools/cli/subagent.test.d.ts +0 -8
  369. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  370. package/dist/tools/cli/subagent.test.js +0 -190
  371. package/dist/tools/cli/subagent.test.js.map +0 -1
  372. package/dist/tools/cli/terminal.d.ts +0 -19
  373. package/dist/tools/cli/terminal.d.ts.map +0 -1
  374. package/dist/tools/cli/terminal.js +0 -164
  375. package/dist/tools/cli/terminal.js.map +0 -1
  376. package/dist/tools/cli/terminal.test.d.ts +0 -8
  377. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  378. package/dist/tools/cli/terminal.test.js +0 -161
  379. package/dist/tools/cli/terminal.test.js.map +0 -1
  380. package/dist/tools/index.d.ts +0 -25
  381. package/dist/tools/index.d.ts.map +0 -1
  382. package/dist/tools/index.js +0 -41
  383. package/dist/tools/index.js.map +0 -1
  384. package/dist/tools/interface.d.ts +0 -64
  385. package/dist/tools/interface.d.ts.map +0 -1
  386. package/dist/tools/interface.js +0 -37
  387. package/dist/tools/interface.js.map +0 -1
  388. package/dist/tools/interface.test.d.ts +0 -7
  389. package/dist/tools/interface.test.d.ts.map +0 -1
  390. package/dist/tools/interface.test.js +0 -179
  391. package/dist/tools/interface.test.js.map +0 -1
  392. package/dist/tools/mcp/bridge.d.ts +0 -48
  393. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  394. package/dist/tools/mcp/bridge.js +0 -128
  395. package/dist/tools/mcp/bridge.js.map +0 -1
  396. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  397. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  398. package/dist/tools/mcp/bridge.test.js +0 -300
  399. package/dist/tools/mcp/bridge.test.js.map +0 -1
  400. package/dist/tools/mcp/client.d.ts +0 -135
  401. package/dist/tools/mcp/client.d.ts.map +0 -1
  402. package/dist/tools/mcp/client.js +0 -263
  403. package/dist/tools/mcp/client.js.map +0 -1
  404. package/dist/tools/mcp/client.test.d.ts +0 -8
  405. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  406. package/dist/tools/mcp/client.test.js +0 -390
  407. package/dist/tools/mcp/client.test.js.map +0 -1
  408. package/dist/tools/registry.d.ts +0 -82
  409. package/dist/tools/registry.d.ts.map +0 -1
  410. package/dist/tools/registry.js +0 -99
  411. package/dist/tools/registry.js.map +0 -1
  412. package/dist/tools/registry.test.d.ts +0 -7
  413. package/dist/tools/registry.test.d.ts.map +0 -1
  414. package/dist/tools/registry.test.js +0 -199
  415. package/dist/tools/registry.test.js.map +0 -1
  416. package/dist/tools/suite.test.d.ts +0 -11
  417. package/dist/tools/suite.test.d.ts.map +0 -1
  418. package/dist/tools/suite.test.js +0 -119
  419. package/dist/tools/suite.test.js.map +0 -1
  420. package/dist/tools/types.d.ts +0 -75
  421. package/dist/tools/types.d.ts.map +0 -1
  422. package/dist/tools/types.js +0 -30
  423. package/dist/tools/types.js.map +0 -1
  424. package/dist/tools/types.test.d.ts +0 -7
  425. package/dist/tools/types.test.d.ts.map +0 -1
  426. package/dist/tools/types.test.js +0 -178
  427. package/dist/tools/types.test.js.map +0 -1
  428. package/templates/.vscode/mcp.json +0 -20
  429. package/templates/CLAUDE.md +0 -129
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Agent-Skill Mapping Completeness Tests
3
+ *
4
+ * Verifies that the skill enforcement system is complete — no orphan skills,
5
+ * no missing mappings, no drift between what's on disk and what's in the hooks.
6
+ *
7
+ * What these tests catch:
8
+ * - New skills added to .github/skills/ but not added to the test matrix
9
+ * - Skills removed from disk but still referenced in inject-skills.mjs
10
+ * - inject-skills.mjs agent map drifting from copilot-instructions.md docs
11
+ * - Agent definitions (.agent.md) missing from .github/agents/
12
+ * - Skills with no SKILL.md file inside their directory
13
+ *
14
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — "Implementation Notes"
15
+ */
16
+ import { describe, it, expect } from 'vitest';
17
+ import { join } from 'node:path';
18
+ import { readdirSync, existsSync, readFileSync, statSync } from 'node:fs';
19
+ import { execFileSync } from 'node:child_process';
20
+ const PROJECT_ROOT = process.cwd();
21
+ const SKILLS_DIR = join(PROJECT_ROOT, '.github/skills');
22
+ const AGENTS_DIR = join(PROJECT_ROOT, '.github/agents');
23
+ const INJECT_SCRIPT = join(PROJECT_ROOT, '.github/hooks/scripts/inject-skills.mjs');
24
+ // ─── Helpers ───────────────────────────────────────────────────────────────
25
+ /** Get all skill directory names from .github/skills/ */
26
+ function getAllSkillDirs() {
27
+ return readdirSync(SKILLS_DIR)
28
+ .filter((name) => statSync(join(SKILLS_DIR, name)).isDirectory());
29
+ }
30
+ /** Get all agent .md files from .github/agents/ */
31
+ function getAllAgentFiles() {
32
+ if (!existsSync(AGENTS_DIR))
33
+ return [];
34
+ return readdirSync(AGENTS_DIR)
35
+ .filter((name) => name.endsWith('.agent.md'));
36
+ }
37
+ /** Run inject-skills.mjs for an agent type and return the raw output */
38
+ function runInjectHook(agentType) {
39
+ const result = execFileSync('node', [INJECT_SCRIPT], {
40
+ input: JSON.stringify({ agent_type: agentType, cwd: PROJECT_ROOT }),
41
+ encoding: 'utf8',
42
+ cwd: PROJECT_ROOT,
43
+ timeout: 10000,
44
+ });
45
+ return JSON.parse(result);
46
+ }
47
+ /** Read inject-skills.mjs source to extract the AGENT_SKILLS map */
48
+ function getAgentSkillsMap() {
49
+ const source = readFileSync(INJECT_SCRIPT, 'utf8');
50
+ // Extract all skill paths per agent by parsing the source line by line
51
+ const result = {};
52
+ let currentAgent = '';
53
+ let currentSection = '';
54
+ for (const line of source.split('\n')) {
55
+ // Match agent name: 'developer': {
56
+ const agentMatch = line.match(/^\s*'([^']+)'\s*:\s*\{/);
57
+ if (agentMatch) {
58
+ currentAgent = agentMatch[1];
59
+ result[currentAgent] = { inject: [], readFile: [] };
60
+ continue;
61
+ }
62
+ // Match section: inject: [ or readFile: [
63
+ const sectionMatch = line.match(/^\s*(inject|readFile)\s*:\s*\[/);
64
+ if (sectionMatch && currentAgent) {
65
+ currentSection = sectionMatch[1];
66
+ // Check for inline single-item array: inject: ['.github/...']
67
+ const inlineMatch = line.match(/\[\s*'([^']+)'\s*\]/);
68
+ if (inlineMatch) {
69
+ result[currentAgent][currentSection].push(inlineMatch[1]);
70
+ currentSection = '';
71
+ }
72
+ continue;
73
+ }
74
+ // Match skill path inside array: '.github/skills/...'
75
+ const pathMatch = line.match(/^\s*'([^']+\.(?:md|MD))'/);
76
+ if (pathMatch && currentAgent && currentSection) {
77
+ result[currentAgent][currentSection].push(pathMatch[1]);
78
+ }
79
+ // End of array
80
+ if (line.match(/^\s*\]/) && currentSection) {
81
+ currentSection = '';
82
+ }
83
+ // End of agent object
84
+ if (line.match(/^\s*\},?\s*$/) && currentAgent && !currentSection) {
85
+ currentAgent = '';
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ // ─── Known agents from the hook ────────────────────────────────────────────
91
+ const HOOKED_AGENTS = ['developer', 'ux-designer', 'product-manager', 'security-reviewer', 'tester', 'researcher'];
92
+ // ─── Skills covered in the E2E test plan (docs/E2E-SKILL-TESTS.md) ────────
93
+ // Every skill in the 72-test matrix. Used to detect orphan skills.
94
+ const SKILLS_IN_TEST_PLAN = new Set([
95
+ // Category 1 (hook-enforced)
96
+ 'web-design-guidelines', 'framer-components', 'shadcn-ui',
97
+ 'vercel-react-best-practices', 'prd', 'security-analysis', 'web-search',
98
+ // Category 2 (azure)
99
+ 'azure-prepare', 'azure-validate', 'azure-deploy', 'azure-compute',
100
+ 'azure-storage', 'azure-ai', 'azure-aigateway', 'azure-kusto',
101
+ 'azure-messaging', 'azure-hosted-copilot-sdk', 'appinsights-instrumentation',
102
+ 'microsoft-foundry', 'azure-rbac', 'azure-compliance', 'entra-app-registration',
103
+ 'azure-cost-optimization', 'azure-cloud-migrate', 'azure-diagnostics',
104
+ 'azure-resource-lookup', 'azure-resource-visualizer',
105
+ // Category 3 (design)
106
+ 'frontend-design', 'brainstorming', 'document-review', 'every-style-editor',
107
+ // Category 4 (product)
108
+ 'proof', 'changelog',
109
+ // Category 5 (developer workflow)
110
+ 'create-agent-skills', 'git-worktree', 'feature-video',
111
+ 'resolve_parallel', 'resolve_todo_parallel', 'resolve-pr-parallel',
112
+ 'lfg', 'slfg', 'deepen-plan', 'agent-browser', 'agent-native-architecture',
113
+ 'rclone', 'gemini-imagegen', 'generate_command',
114
+ // Category 6 (testing)
115
+ 'test-browser', 'test-xcode', 'report-bug', 'reproduce-bug', 'triage',
116
+ // Category 7 (orchestration)
117
+ 'orchestrating-swarms', 'setup', 'heal-skill', 'file-todos',
118
+ // Category 8 (CE)
119
+ 'ce:brainstorm', 'ce:plan', 'ce:work', 'ce:review', 'ce:compound',
120
+ // Category 9 (language)
121
+ 'dhh-rails-style', 'andrew-kane-gem-writer', 'dspy-ruby',
122
+ // Category 10 (remaining)
123
+ 'compound-docs', 'agent-native-audit',
124
+ ]);
125
+ // ─── Tests ─────────────────────────────────────────────────────────────────
126
+ describe('Skill Inventory: All on-disk skills accounted for', () => {
127
+ const allSkillDirs = getAllSkillDirs();
128
+ it('every skill directory has a SKILL.md file', () => {
129
+ const missing = [];
130
+ for (const dir of allSkillDirs) {
131
+ if (!existsSync(join(SKILLS_DIR, dir, 'SKILL.md'))) {
132
+ missing.push(dir);
133
+ }
134
+ }
135
+ expect(missing).toHaveLength(0);
136
+ });
137
+ it('no empty skill directories', () => {
138
+ const empty = [];
139
+ for (const dir of allSkillDirs) {
140
+ const contents = readdirSync(join(SKILLS_DIR, dir));
141
+ if (contents.length === 0) {
142
+ empty.push(dir);
143
+ }
144
+ }
145
+ expect(empty).toHaveLength(0);
146
+ });
147
+ it('reports skills NOT in the E2E test plan (potential gaps)', () => {
148
+ const uncovered = [];
149
+ for (const dir of allSkillDirs) {
150
+ if (!SKILLS_IN_TEST_PLAN.has(dir)) {
151
+ uncovered.push(dir);
152
+ }
153
+ }
154
+ // These are known skills that are intentionally NOT in the 72-test matrix.
155
+ // They may be aliases, deprecated, or workflow variants.
156
+ // This test documents them explicitly so new additions are caught.
157
+ const KNOWN_UNCOVERED = new Set([
158
+ // These are workflow: prefixed aliases of ce: skills
159
+ 'workflows:brainstorm', 'workflows:compound', 'workflows:plan',
160
+ 'workflows:review', 'workflows:work',
161
+ // Alternate/older skill names
162
+ 'create-agent-skill', 'skill-creator',
163
+ // Deploy docs (documentation-only, not a routable skill)
164
+ 'deploy-docs',
165
+ ]);
166
+ const trueGaps = uncovered.filter((s) => !KNOWN_UNCOVERED.has(s));
167
+ // If this fails, a new skill was added but not put in the test matrix
168
+ expect(trueGaps).toHaveLength(0);
169
+ });
170
+ });
171
+ describe('inject-skills.mjs: Source-of-truth validation', () => {
172
+ it('covers all 6 known agent types', () => {
173
+ for (const agent of HOOKED_AGENTS) {
174
+ const output = runInjectHook(agent);
175
+ expect(output.hookSpecificOutput).toBeDefined();
176
+ expect(output.hookSpecificOutput.additionalContext).toBeTruthy();
177
+ }
178
+ });
179
+ it('every skill path in the hook actually exists on disk', () => {
180
+ const agentMap = getAgentSkillsMap();
181
+ const broken = [];
182
+ for (const [agent, config] of Object.entries(agentMap)) {
183
+ for (const path of [...config.inject, ...config.readFile]) {
184
+ const fullPath = join(PROJECT_ROOT, path);
185
+ if (!existsSync(fullPath)) {
186
+ broken.push(`${agent}: ${path}`);
187
+ }
188
+ }
189
+ }
190
+ expect(broken).toHaveLength(0);
191
+ });
192
+ it('every skill file referenced in the hook is non-empty', () => {
193
+ const agentMap = getAgentSkillsMap();
194
+ const empty = [];
195
+ for (const [agent, config] of Object.entries(agentMap)) {
196
+ for (const path of [...config.inject, ...config.readFile]) {
197
+ const fullPath = join(PROJECT_ROOT, path);
198
+ if (existsSync(fullPath)) {
199
+ const content = readFileSync(fullPath, 'utf8');
200
+ if (content.trim().length === 0) {
201
+ empty.push(`${agent}: ${path}`);
202
+ }
203
+ }
204
+ }
205
+ }
206
+ expect(empty).toHaveLength(0);
207
+ });
208
+ it('no duplicate skill paths within any single agent', () => {
209
+ const agentMap = getAgentSkillsMap();
210
+ const dupes = [];
211
+ for (const [agent, config] of Object.entries(agentMap)) {
212
+ const allPaths = [...config.inject, ...config.readFile];
213
+ const unique = new Set(allPaths);
214
+ if (unique.size !== allPaths.length) {
215
+ dupes.push(`${agent}: has duplicate skill paths`);
216
+ }
217
+ }
218
+ expect(dupes).toHaveLength(0);
219
+ });
220
+ });
221
+ describe('Agent definitions: .agent.md files', () => {
222
+ const agentFiles = getAllAgentFiles();
223
+ it('every hooked agent has a corresponding .agent.md file', () => {
224
+ // Map from hook agent names to expected file names
225
+ const expectedFiles = HOOKED_AGENTS.map((a) => `${a}.agent.md`);
226
+ const missing = expectedFiles.filter((f) => !agentFiles.includes(f));
227
+ expect(missing).toHaveLength(0);
228
+ });
229
+ it('Beth orchestrator has an .agent.md file', () => {
230
+ // Beth is special — she's the orchestrator, not a hooked agent
231
+ const bethFile = agentFiles.find((f) => f.toLowerCase().includes('beth'));
232
+ expect(bethFile).toBeDefined();
233
+ });
234
+ it('every .agent.md file is non-empty', () => {
235
+ const empty = [];
236
+ for (const file of agentFiles) {
237
+ const content = readFileSync(join(AGENTS_DIR, file), 'utf8');
238
+ if (content.trim().length < 50) {
239
+ empty.push(file);
240
+ }
241
+ }
242
+ expect(empty).toHaveLength(0);
243
+ });
244
+ });
245
+ describe('SKILL.md content quality', () => {
246
+ const allSkillDirs = getAllSkillDirs();
247
+ it('every SKILL.md has at least 100 characters of content', () => {
248
+ const tooShort = [];
249
+ for (const dir of allSkillDirs) {
250
+ const path = join(SKILLS_DIR, dir, 'SKILL.md');
251
+ if (existsSync(path)) {
252
+ const content = readFileSync(path, 'utf8');
253
+ if (content.trim().length < 100) {
254
+ tooShort.push(`${dir}: ${content.trim().length} chars`);
255
+ }
256
+ }
257
+ }
258
+ expect(tooShort).toHaveLength(0);
259
+ });
260
+ it('every SKILL.md starts with YAML frontmatter, a markdown heading, or a code fence', () => {
261
+ const badStart = [];
262
+ for (const dir of allSkillDirs) {
263
+ const path = join(SKILLS_DIR, dir, 'SKILL.md');
264
+ if (existsSync(path)) {
265
+ const content = readFileSync(path, 'utf8').trimStart();
266
+ // SKILL.md files can start with:
267
+ // - YAML frontmatter (---)
268
+ // - Markdown heading (#)
269
+ // - Code fence with skill type (```skill, ```yaml, etc.)
270
+ const validStart = content.startsWith('#') ||
271
+ content.startsWith('---') ||
272
+ content.startsWith('```');
273
+ if (!validStart) {
274
+ badStart.push(dir);
275
+ }
276
+ }
277
+ }
278
+ expect(badStart).toHaveLength(0);
279
+ });
280
+ });
281
+ //# sourceMappingURL=mapping-completeness.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping-completeness.test.js","sourceRoot":"","sources":["../../../src/__tests__/skills/mapping-completeness.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Pipeline Integration Tests — Full Hook Round-Trip
3
+ *
4
+ * Tests the complete enforcement pipeline:
5
+ * inject-skills.mjs (SubagentStart) → subagent works → verify-skills.mjs (SubagentStop)
6
+ *
7
+ * Unlike unit tests that verify each script in isolation, these tests verify
8
+ * that the two hooks work together correctly as an enforcement system:
9
+ * - inject-skills.mjs produces context that verify-skills.mjs can challenge on
10
+ * - The first stop attempt always blocks (compliance gate)
11
+ * - The retry always passes (no infinite loop)
12
+ * - Unknown agent types pass through both hooks cleanly
13
+ * - Malformed input doesn't crash either hook
14
+ *
15
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — "Test Infrastructure Needed" §1
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=pipeline-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/skills/pipeline-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Pipeline Integration Tests — Full Hook Round-Trip
3
+ *
4
+ * Tests the complete enforcement pipeline:
5
+ * inject-skills.mjs (SubagentStart) → subagent works → verify-skills.mjs (SubagentStop)
6
+ *
7
+ * Unlike unit tests that verify each script in isolation, these tests verify
8
+ * that the two hooks work together correctly as an enforcement system:
9
+ * - inject-skills.mjs produces context that verify-skills.mjs can challenge on
10
+ * - The first stop attempt always blocks (compliance gate)
11
+ * - The retry always passes (no infinite loop)
12
+ * - Unknown agent types pass through both hooks cleanly
13
+ * - Malformed input doesn't crash either hook
14
+ *
15
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — "Test Infrastructure Needed" §1
16
+ */
17
+ import { describe, it, expect } from 'vitest';
18
+ import { execFileSync } from 'node:child_process';
19
+ import { join } from 'node:path';
20
+ const INJECT_SCRIPT = join(process.cwd(), '.github/hooks/scripts/inject-skills.mjs');
21
+ const VERIFY_SCRIPT = join(process.cwd(), '.github/hooks/scripts/verify-skills.mjs');
22
+ const PROJECT_ROOT = process.cwd();
23
+ /** Run a hook script with JSON input, return parsed output */
24
+ function runScript(scriptPath, input) {
25
+ const result = execFileSync('node', [scriptPath], {
26
+ input: JSON.stringify(input),
27
+ encoding: 'utf8',
28
+ cwd: PROJECT_ROOT,
29
+ timeout: 10000,
30
+ });
31
+ return JSON.parse(result);
32
+ }
33
+ /** Simulate the full pipeline: inject → (subagent work) → verify first stop → verify retry */
34
+ function runPipeline(agentType) {
35
+ // Step 1: SubagentStart — inject skills
36
+ const injectOutput = runScript(INJECT_SCRIPT, {
37
+ agent_type: agentType,
38
+ cwd: PROJECT_ROOT,
39
+ });
40
+ // Step 2: SubagentStop (first attempt) — should block
41
+ const firstStop = runScript(VERIFY_SCRIPT, {
42
+ agent_type: agentType,
43
+ });
44
+ // Step 3: SubagentStop (retry with stop_hook_active) — should pass
45
+ const retryStop = runScript(VERIFY_SCRIPT, {
46
+ agent_type: agentType,
47
+ stop_hook_active: true,
48
+ });
49
+ return { injectOutput, firstStop, retryStop };
50
+ }
51
+ // ─── Known agents ──────────────────────────────────────────────────────────
52
+ const KNOWN_AGENTS = [
53
+ 'developer',
54
+ 'ux-designer',
55
+ 'product-manager',
56
+ 'security-reviewer',
57
+ 'tester',
58
+ 'researcher',
59
+ ];
60
+ // ─── Full pipeline tests ───────────────────────────────────────────────────
61
+ describe('Full Pipeline: inject → verify round-trip', () => {
62
+ describe.each(KNOWN_AGENTS)('Agent: %s', (agentType) => {
63
+ it('inject produces context, first stop blocks, retry passes', () => {
64
+ const { injectOutput, firstStop, retryStop } = runPipeline(agentType);
65
+ // Inject should produce context with skills
66
+ expect(injectOutput.continue).toBe(true);
67
+ expect(injectOutput.hookSpecificOutput).toBeDefined();
68
+ expect(injectOutput.hookSpecificOutput.additionalContext).toBeTruthy();
69
+ expect(injectOutput.hookSpecificOutput.additionalContext).toContain('SKILL ENFORCEMENT');
70
+ // First stop should block
71
+ expect(firstStop.hookSpecificOutput).toBeDefined();
72
+ expect(firstStop.hookSpecificOutput.decision).toBe('block');
73
+ expect(firstStop.hookSpecificOutput.reason).toContain('Skills compliance');
74
+ expect(firstStop.hookSpecificOutput.reason).toContain('Task tracking');
75
+ // Retry should pass through
76
+ expect(retryStop.continue).toBe(true);
77
+ });
78
+ it('inject context references the correct agent type', () => {
79
+ const { injectOutput } = runPipeline(agentType);
80
+ const ctx = injectOutput.hookSpecificOutput.additionalContext;
81
+ expect(ctx).toContain(`You are \`${agentType}\``);
82
+ });
83
+ it('verify challenge mentions both skill compliance and task tracking', () => {
84
+ const { firstStop } = runPipeline(agentType);
85
+ const reason = firstStop.hookSpecificOutput.reason;
86
+ // Must challenge on BOTH dimensions — this is the whole point of the unified hook
87
+ expect(reason).toContain('Skills compliance');
88
+ expect(reason).toContain('Task tracking');
89
+ expect(reason).toContain('backlog task edit');
90
+ });
91
+ });
92
+ });
93
+ // ─── Unknown agent passthrough ─────────────────────────────────────────────
94
+ describe('Unknown agent types pass through cleanly', () => {
95
+ const UNKNOWN_AGENTS = ['orchestrator', 'cto', 'intern', '', 'DEVELOPER'];
96
+ it.each(UNKNOWN_AGENTS)('agent type "%s" does not crash inject', (agentType) => {
97
+ const output = runScript(INJECT_SCRIPT, {
98
+ agent_type: agentType,
99
+ cwd: PROJECT_ROOT,
100
+ });
101
+ expect(output.continue).toBe(true);
102
+ // Unknown agents should NOT get additionalContext
103
+ expect(output.hookSpecificOutput).toBeUndefined();
104
+ });
105
+ it.each(UNKNOWN_AGENTS)('agent type "%s" still gets blocked by verify (first stop)', (agentType) => {
106
+ const output = runScript(VERIFY_SCRIPT, {
107
+ agent_type: agentType,
108
+ });
109
+ // Verify blocks ALL first stops regardless of agent type
110
+ expect(output.hookSpecificOutput.decision).toBe('block');
111
+ });
112
+ });
113
+ // ─── Malformed input resilience ────────────────────────────────────────────
114
+ describe('Malformed input handling', () => {
115
+ it('inject handles missing agent_type gracefully', () => {
116
+ const output = runScript(INJECT_SCRIPT, { cwd: PROJECT_ROOT });
117
+ expect(output.continue).toBe(true);
118
+ });
119
+ it('inject handles empty object gracefully', () => {
120
+ const output = runScript(INJECT_SCRIPT, {});
121
+ expect(output.continue).toBe(true);
122
+ });
123
+ it('verify handles empty object gracefully (blocks on first attempt)', () => {
124
+ const output = runScript(VERIFY_SCRIPT, {});
125
+ expect(output.hookSpecificOutput.decision).toBe('block');
126
+ });
127
+ it('inject handles non-string agent_type gracefully', () => {
128
+ const output = runScript(INJECT_SCRIPT, { agent_type: 42 });
129
+ expect(output.continue).toBe(true);
130
+ });
131
+ it('inject handles null agent_type gracefully', () => {
132
+ const output = runScript(INJECT_SCRIPT, { agent_type: null });
133
+ expect(output.continue).toBe(true);
134
+ });
135
+ it('both scripts handle garbage stdin without crashing', () => {
136
+ // inject-skills.mjs
137
+ const injectResult = execFileSync('node', [INJECT_SCRIPT], {
138
+ input: 'this is not json {{{',
139
+ encoding: 'utf8',
140
+ cwd: PROJECT_ROOT,
141
+ timeout: 10000,
142
+ });
143
+ const injectOutput = JSON.parse(injectResult);
144
+ expect(injectOutput.continue).toBe(true);
145
+ // verify-skills.mjs
146
+ const verifyResult = execFileSync('node', [VERIFY_SCRIPT], {
147
+ input: 'garbage input!!!',
148
+ encoding: 'utf8',
149
+ cwd: PROJECT_ROOT,
150
+ timeout: 10000,
151
+ });
152
+ const verifyOutput = JSON.parse(verifyResult);
153
+ expect(verifyOutput.continue).toBe(true);
154
+ });
155
+ });
156
+ // ─── Skill content injection verification ──────────────────────────────────
157
+ describe('Injected skill content is real, not placeholders', () => {
158
+ it('developer context contains actual vercel-react-best-practices content', () => {
159
+ const output = runScript(INJECT_SCRIPT, {
160
+ agent_type: 'developer',
161
+ cwd: PROJECT_ROOT,
162
+ });
163
+ const ctx = output.hookSpecificOutput.additionalContext;
164
+ // The inject layer loads the actual SKILL.md file content
165
+ // Verify it contains real content, not just the path
166
+ expect(ctx).toContain('React');
167
+ expect(ctx.length).toBeGreaterThan(500); // Real content, not a stub
168
+ });
169
+ it('ux-designer context contains actual web-design-guidelines content', () => {
170
+ const output = runScript(INJECT_SCRIPT, {
171
+ agent_type: 'ux-designer',
172
+ cwd: PROJECT_ROOT,
173
+ });
174
+ const ctx = output.hookSpecificOutput.additionalContext;
175
+ expect(ctx.length).toBeGreaterThan(500);
176
+ });
177
+ it('tester context contains actual web-design-guidelines content', () => {
178
+ const output = runScript(INJECT_SCRIPT, {
179
+ agent_type: 'tester',
180
+ cwd: PROJECT_ROOT,
181
+ });
182
+ const ctx = output.hookSpecificOutput.additionalContext;
183
+ expect(ctx.length).toBeGreaterThan(500);
184
+ });
185
+ it('researcher context contains actual web-search content', () => {
186
+ const output = runScript(INJECT_SCRIPT, {
187
+ agent_type: 'researcher',
188
+ cwd: PROJECT_ROOT,
189
+ });
190
+ const ctx = output.hookSpecificOutput.additionalContext;
191
+ expect(ctx.length).toBeGreaterThan(200);
192
+ });
193
+ });
194
+ // ─── Cross-hook consistency ────────────────────────────────────────────────
195
+ describe('Cross-hook consistency', () => {
196
+ it('verify challenge text mentions skills that inject actually loaded', () => {
197
+ // The verify hook should challenge about skills — and inject should have provided them
198
+ const injectOutput = runScript(INJECT_SCRIPT, {
199
+ agent_type: 'developer',
200
+ cwd: PROJECT_ROOT,
201
+ });
202
+ const verifyOutput = runScript(VERIFY_SCRIPT, {
203
+ agent_type: 'developer',
204
+ });
205
+ // Inject loaded skills
206
+ const ctx = injectOutput.hookSpecificOutput.additionalContext;
207
+ expect(ctx).toContain('MANDATORY');
208
+ // Verify challenges about those skills
209
+ const reason = verifyOutput.hookSpecificOutput.reason;
210
+ expect(reason).toContain('MANDATORY skills');
211
+ });
212
+ it('all 6 agents produce different inject contexts', () => {
213
+ const contexts = KNOWN_AGENTS.map((agent) => {
214
+ const output = runScript(INJECT_SCRIPT, {
215
+ agent_type: agent,
216
+ cwd: PROJECT_ROOT,
217
+ });
218
+ return output.hookSpecificOutput.additionalContext;
219
+ });
220
+ // Every agent should get a unique context
221
+ const uniqueContexts = new Set(contexts);
222
+ expect(uniqueContexts.size).toBe(KNOWN_AGENTS.length);
223
+ });
224
+ it('verify produces identical challenge for all agent types', () => {
225
+ // The compliance gate is agent-agnostic — same challenge for everyone
226
+ const challenges = KNOWN_AGENTS.map((agent) => {
227
+ const output = runScript(VERIFY_SCRIPT, { agent_type: agent });
228
+ return output.hookSpecificOutput.reason;
229
+ });
230
+ const uniqueChallenges = new Set(challenges);
231
+ expect(uniqueChallenges.size).toBe(1);
232
+ });
233
+ });
234
+ //# sourceMappingURL=pipeline-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/skills/pipeline-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Skill Routing Tests — Categories 2–10
3
+ *
4
+ * Verifies every skill in the test matrix:
5
+ * 1. Has a valid SKILL.md file on disk (exists and is non-empty)
6
+ * 2. Is mapped to a valid agent from the Beth team
7
+ *
8
+ * These tests validate the structural integrity of the skill system.
9
+ * They do NOT test LLM prompt inference or enforcement mechanisms
10
+ * (hook injection is tested in hook-injection.test.ts).
11
+ *
12
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — Categories 2–10 (tests 10–72)
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=skill-routing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-routing.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/skills/skill-routing.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}