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,9 @@
1
+ /**
2
+ * Unit tests for .github/hooks/scripts/inject-skills.mjs
3
+ *
4
+ * Tests the SubagentStart hook that deterministically injects skill context
5
+ * for each agent type. Verifies correct skill mapping, output format,
6
+ * and graceful handling of edge cases.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=inject-skills.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-skills.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/inject-skills.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Unit tests for .github/hooks/scripts/inject-skills.mjs
3
+ *
4
+ * Tests the SubagentStart hook that deterministically injects skill context
5
+ * for each agent type. Verifies correct skill mapping, output format,
6
+ * and graceful handling of edge cases.
7
+ */
8
+ import { describe, it, expect } from 'vitest';
9
+ import { execFileSync } from 'node:child_process';
10
+ import { join } from 'node:path';
11
+ const SCRIPT_PATH = join(process.cwd(), '.github/hooks/scripts/inject-skills.mjs');
12
+ const PROJECT_ROOT = process.cwd();
13
+ /** Helper: pipe JSON input to inject-skills.mjs and parse the JSON output */
14
+ function runHook(input) {
15
+ const result = execFileSync('node', [SCRIPT_PATH], {
16
+ input: JSON.stringify(input),
17
+ encoding: 'utf8',
18
+ cwd: PROJECT_ROOT,
19
+ timeout: 10000,
20
+ });
21
+ return JSON.parse(result);
22
+ }
23
+ /** Helper: extract additionalContext string from hook output */
24
+ function getContext(input) {
25
+ const output = runHook(input);
26
+ return output.hookSpecificOutput?.additionalContext ?? '';
27
+ }
28
+ // ─── Core behavior ─────────────────────────────────────────────────────────
29
+ describe('inject-skills.mjs: output structure', () => {
30
+ it('should always set continue: true', () => {
31
+ const output = runHook({ agent_type: 'developer', cwd: PROJECT_ROOT });
32
+ expect(output.continue).toBe(true);
33
+ });
34
+ it('should include hookSpecificOutput with SubagentStart event name', () => {
35
+ const output = runHook({ agent_type: 'developer', cwd: PROJECT_ROOT });
36
+ expect(output.hookSpecificOutput).toBeDefined();
37
+ expect(output.hookSpecificOutput.hookEventName).toBe('SubagentStart');
38
+ });
39
+ });
40
+ // ─── UX Designer (includes ui-ux-pro-max) ──────────────────────────────────
41
+ describe('inject-skills.mjs: ux-designer', () => {
42
+ const ctx = () => getContext({ agent_type: 'ux-designer', cwd: PROJECT_ROOT });
43
+ it('should inject web-design-guidelines into context', () => {
44
+ expect(ctx()).toContain('.github/skills/web-design-guidelines/SKILL.md');
45
+ expect(ctx()).toContain('Skills loaded into context');
46
+ });
47
+ it('should mandate readFile for framer-components', () => {
48
+ expect(ctx()).toContain('.github/skills/framer-components/SKILL.md');
49
+ expect(ctx()).toContain('Skills to load via readFile');
50
+ });
51
+ it('should mandate readFile for ui-ux-pro-max', () => {
52
+ expect(ctx()).toContain('.github/prompts/ui-ux-pro-max/PROMPT.md');
53
+ });
54
+ it('should include the NON-NEGOTIABLE header', () => {
55
+ expect(ctx()).toContain('SKILL ENFORCEMENT');
56
+ expect(ctx()).toContain('NON-NEGOTIABLE');
57
+ });
58
+ it('should identify the agent type in the context', () => {
59
+ expect(ctx()).toContain('You are `ux-designer`');
60
+ });
61
+ });
62
+ // ─── Developer ─────────────────────────────────────────────────────────────
63
+ describe('inject-skills.mjs: developer', () => {
64
+ const ctx = () => getContext({ agent_type: 'developer', cwd: PROJECT_ROOT });
65
+ it('should inject vercel-react-best-practices SKILL.md into context', () => {
66
+ expect(ctx()).toContain('.github/skills/vercel-react-best-practices/SKILL.md');
67
+ expect(ctx()).toContain('Skills loaded into context');
68
+ });
69
+ it('should mandate readFile for shadcn-ui', () => {
70
+ expect(ctx()).toContain('.github/skills/shadcn-ui/SKILL.md');
71
+ });
72
+ it('should mandate readFile for vercel-react-best-practices AGENTS.md', () => {
73
+ expect(ctx()).toContain('.github/skills/vercel-react-best-practices/AGENTS.md');
74
+ });
75
+ });
76
+ // ─── Product Manager ───────────────────────────────────────────────────────
77
+ describe('inject-skills.mjs: product-manager', () => {
78
+ const ctx = () => getContext({ agent_type: 'product-manager', cwd: PROJECT_ROOT });
79
+ it('should mandate readFile for prd skill', () => {
80
+ expect(ctx()).toContain('.github/skills/prd/SKILL.md');
81
+ });
82
+ it('should NOT have "Skills loaded into context" (no inject files)', () => {
83
+ expect(ctx()).not.toContain('Skills loaded into context');
84
+ });
85
+ });
86
+ // ─── Security Reviewer ─────────────────────────────────────────────────────
87
+ describe('inject-skills.mjs: security-reviewer', () => {
88
+ const ctx = () => getContext({ agent_type: 'security-reviewer', cwd: PROJECT_ROOT });
89
+ it('should mandate readFile for security-analysis', () => {
90
+ expect(ctx()).toContain('.github/skills/security-analysis/SKILL.md');
91
+ });
92
+ });
93
+ // ─── Tester ────────────────────────────────────────────────────────────────
94
+ describe('inject-skills.mjs: tester', () => {
95
+ const ctx = () => getContext({ agent_type: 'tester', cwd: PROJECT_ROOT });
96
+ it('should inject web-design-guidelines into context', () => {
97
+ expect(ctx()).toContain('.github/skills/web-design-guidelines/SKILL.md');
98
+ expect(ctx()).toContain('Skills loaded into context');
99
+ });
100
+ it('should NOT have readFile mandate (no readFile files)', () => {
101
+ expect(ctx()).not.toContain('Skills to load via readFile');
102
+ });
103
+ });
104
+ // ─── Researcher ────────────────────────────────────────────────────────────
105
+ describe('inject-skills.mjs: researcher', () => {
106
+ const ctx = () => getContext({ agent_type: 'researcher', cwd: PROJECT_ROOT });
107
+ it('should inject web-search skill into context', () => {
108
+ expect(ctx()).toContain('.github/skills/web-search/SKILL.md');
109
+ });
110
+ });
111
+ // ─── Edge cases ────────────────────────────────────────────────────────────
112
+ describe('inject-skills.mjs: edge cases', () => {
113
+ it('should pass through unknown agent types with continue: true', () => {
114
+ const output = runHook({ agent_type: 'unknown-agent', cwd: PROJECT_ROOT });
115
+ expect(output.continue).toBe(true);
116
+ expect(output).not.toHaveProperty('hookSpecificOutput');
117
+ });
118
+ it('should handle missing agent_type gracefully', () => {
119
+ const output = runHook({ cwd: PROJECT_ROOT });
120
+ expect(output.continue).toBe(true);
121
+ });
122
+ it('should handle malformed JSON input gracefully', () => {
123
+ const result = execFileSync('node', [SCRIPT_PATH], {
124
+ input: 'not json at all',
125
+ encoding: 'utf8',
126
+ cwd: PROJECT_ROOT,
127
+ timeout: 10000,
128
+ });
129
+ const output = JSON.parse(result);
130
+ expect(output.continue).toBe(true);
131
+ });
132
+ it('should handle empty input gracefully', () => {
133
+ const result = execFileSync('node', [SCRIPT_PATH], {
134
+ input: '',
135
+ encoding: 'utf8',
136
+ cwd: PROJECT_ROOT,
137
+ timeout: 10000,
138
+ });
139
+ const output = JSON.parse(result);
140
+ expect(output.continue).toBe(true);
141
+ });
142
+ });
143
+ //# sourceMappingURL=inject-skills.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-skills.test.js","sourceRoot":"","sources":["../../src/__tests__/inject-skills.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Disambiguation Tests — Known Challenge Pairs
3
+ *
4
+ * These skill pairs share semantic space and can be confused by LLM inference.
5
+ * Tests verify structural differences that SHOULD enable correct disambiguation.
6
+ *
7
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — Known Disambiguation Challenges
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=disambiguation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disambiguation.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/skills/disambiguation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Disambiguation Tests — Known Challenge Pairs
3
+ *
4
+ * These skill pairs share semantic space and can be confused by LLM inference.
5
+ * Tests verify structural differences that SHOULD enable correct disambiguation.
6
+ *
7
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — Known Disambiguation Challenges
8
+ */
9
+ import { describe, it, expect } from 'vitest';
10
+ import { join } from 'node:path';
11
+ import { readFileSync, existsSync } from 'node:fs';
12
+ const PROJECT_ROOT = process.cwd();
13
+ const SKILLS_DIR = join(PROJECT_ROOT, '.github/skills');
14
+ /** Read a skill's SKILL.md content */
15
+ function readSkill(skillName) {
16
+ const path = join(SKILLS_DIR, skillName, 'SKILL.md');
17
+ return readFileSync(path, 'utf8');
18
+ }
19
+ /** Check if a skill directory exists */
20
+ function skillDirExists(skillName) {
21
+ return existsSync(join(SKILLS_DIR, skillName));
22
+ }
23
+ // ─── Pair 1: brainstorming vs ce:brainstorm ────────────────────────────────
24
+ describe('Disambiguation: brainstorming vs ce:brainstorm', () => {
25
+ it('both skills exist', () => {
26
+ expect(skillDirExists('brainstorming')).toBe(true);
27
+ expect(skillDirExists('ce:brainstorm')).toBe(true);
28
+ });
29
+ it('brainstorming is freeform — triggers on natural language', () => {
30
+ const content = readSkill('brainstorming');
31
+ // Should trigger on conversational phrases, not slash commands
32
+ expect(content).toMatch(/brainstorm|think through|explore/i);
33
+ });
34
+ it('ce:brainstorm is a slash command workflow', () => {
35
+ const content = readSkill('ce:brainstorm');
36
+ // Should reference the /ce: prefix or pipeline structure
37
+ expect(content).toMatch(/ce:brainstorm|slash|workflow|pipeline/i);
38
+ });
39
+ it('they are distinct files with different content', () => {
40
+ const freeform = readSkill('brainstorming');
41
+ const slashCmd = readSkill('ce:brainstorm');
42
+ expect(freeform).not.toBe(slashCmd);
43
+ });
44
+ });
45
+ // ─── Pair 2: compound-docs vs ce:compound ──────────────────────────────────
46
+ describe('Disambiguation: compound-docs vs ce:compound', () => {
47
+ it('both skills exist', () => {
48
+ expect(skillDirExists('compound-docs')).toBe(true);
49
+ expect(skillDirExists('ce:compound')).toBe(true);
50
+ });
51
+ it('compound-docs auto-detects from success phrases', () => {
52
+ const content = readSkill('compound-docs');
53
+ // Should trigger on natural completion phrases
54
+ expect(content).toMatch(/document|solution|worked|knowledge/i);
55
+ });
56
+ it('ce:compound is a slash command workflow', () => {
57
+ const content = readSkill('ce:compound');
58
+ expect(content).toMatch(/ce:compound|slash|workflow|compound/i);
59
+ });
60
+ it('they are distinct files with different content', () => {
61
+ const autoDocs = readSkill('compound-docs');
62
+ const slashCmd = readSkill('ce:compound');
63
+ expect(autoDocs).not.toBe(slashCmd);
64
+ });
65
+ });
66
+ // ─── Pair 3: ce:plan vs deepen-plan ────────────────────────────────────────
67
+ describe('Disambiguation: ce:plan vs deepen-plan', () => {
68
+ it('both skills exist', () => {
69
+ expect(skillDirExists('ce:plan')).toBe(true);
70
+ expect(skillDirExists('deepen-plan')).toBe(true);
71
+ });
72
+ it('ce:plan creates plans from scratch', () => {
73
+ const content = readSkill('ce:plan');
74
+ // Should focus on creation/transformation
75
+ expect(content).toMatch(/plan|transform|create|structure/i);
76
+ });
77
+ it('deepen-plan enriches existing plans', () => {
78
+ const content = readSkill('deepen-plan');
79
+ // Should focus on enhancement/enrichment
80
+ expect(content).toMatch(/enhance|deepen|research|depth|enrich/i);
81
+ });
82
+ it('they are distinct files with different content', () => {
83
+ const create = readSkill('ce:plan');
84
+ const deepen = readSkill('deepen-plan');
85
+ expect(create).not.toBe(deepen);
86
+ });
87
+ });
88
+ // ─── Pair 4: ce:review vs document-review ──────────────────────────────────
89
+ describe('Disambiguation: ce:review vs document-review', () => {
90
+ it('both skills exist', () => {
91
+ expect(skillDirExists('ce:review')).toBe(true);
92
+ expect(skillDirExists('document-review')).toBe(true);
93
+ });
94
+ it('ce:review focuses on code review', () => {
95
+ const content = readSkill('ce:review');
96
+ expect(content).toMatch(/code|review|multi-agent|analysis/i);
97
+ });
98
+ it('document-review focuses on markdown/document review', () => {
99
+ const content = readSkill('document-review');
100
+ expect(content).toMatch(/document|brainstorm|plan|refine/i);
101
+ });
102
+ it('they are distinct files with different content', () => {
103
+ const codeReview = readSkill('ce:review');
104
+ const docReview = readSkill('document-review');
105
+ expect(codeReview).not.toBe(docReview);
106
+ });
107
+ });
108
+ // ─── Pair 5: resolve_parallel vs resolve_todo_parallel vs resolve-pr-parallel
109
+ describe('Disambiguation: resolve_parallel vs resolve_todo_parallel vs resolve-pr-parallel', () => {
110
+ it('all three skills exist', () => {
111
+ expect(skillDirExists('resolve_parallel')).toBe(true);
112
+ expect(skillDirExists('resolve_todo_parallel')).toBe(true);
113
+ expect(skillDirExists('resolve-pr-parallel')).toBe(true);
114
+ });
115
+ it('resolve_parallel targets code TODOs', () => {
116
+ const content = readSkill('resolve_parallel');
117
+ expect(content).toMatch(/TODO|FIXME|code|codebase/i);
118
+ });
119
+ it('resolve_todo_parallel targets CLI todos', () => {
120
+ const content = readSkill('resolve_todo_parallel');
121
+ expect(content).toMatch(/todo|pending|CLI|list/i);
122
+ });
123
+ it('resolve-pr-parallel targets PR review comments', () => {
124
+ const content = readSkill('resolve-pr-parallel');
125
+ expect(content).toMatch(/PR|pull request|review|comment/i);
126
+ });
127
+ it('all three are distinct files', () => {
128
+ const code = readSkill('resolve_parallel');
129
+ const todo = readSkill('resolve_todo_parallel');
130
+ const pr = readSkill('resolve-pr-parallel');
131
+ expect(code).not.toBe(todo);
132
+ expect(code).not.toBe(pr);
133
+ expect(todo).not.toBe(pr);
134
+ });
135
+ });
136
+ // ─── Pair 6: lfg vs slfg ──────────────────────────────────────────────────
137
+ describe('Disambiguation: lfg vs slfg', () => {
138
+ it('both skills exist', () => {
139
+ expect(skillDirExists('lfg')).toBe(true);
140
+ expect(skillDirExists('slfg')).toBe(true);
141
+ });
142
+ it('lfg is sequential execution', () => {
143
+ const content = readSkill('lfg');
144
+ expect(content).toMatch(/sequential|execute|work plan|step/i);
145
+ });
146
+ it('slfg is swarm/parallel execution', () => {
147
+ const content = readSkill('slfg');
148
+ expect(content).toMatch(/swarm|parallel|concurrent/i);
149
+ });
150
+ it('they are distinct files with different content', () => {
151
+ const sequential = readSkill('lfg');
152
+ const parallel = readSkill('slfg');
153
+ expect(sequential).not.toBe(parallel);
154
+ });
155
+ });
156
+ // ─── Cross-pair integrity ──────────────────────────────────────────────────
157
+ describe('Disambiguation: cross-pair structural integrity', () => {
158
+ const ALL_DISAMBIGUATION_SKILLS = [
159
+ 'brainstorming', 'ce:brainstorm',
160
+ 'compound-docs', 'ce:compound',
161
+ 'ce:plan', 'deepen-plan',
162
+ 'ce:review', 'document-review',
163
+ 'resolve_parallel', 'resolve_todo_parallel', 'resolve-pr-parallel',
164
+ 'lfg', 'slfg',
165
+ ];
166
+ it('none of the disambiguation skills are missing', () => {
167
+ for (const skill of ALL_DISAMBIGUATION_SKILLS) {
168
+ expect(skillDirExists(skill)).toBe(true);
169
+ }
170
+ });
171
+ it('all disambiguation skill files are non-empty', () => {
172
+ for (const skill of ALL_DISAMBIGUATION_SKILLS) {
173
+ const content = readSkill(skill);
174
+ expect(content.length).toBeGreaterThan(0);
175
+ }
176
+ });
177
+ it('no two skills in any pair have identical content', () => {
178
+ const pairs = [
179
+ ['brainstorming', 'ce:brainstorm'],
180
+ ['compound-docs', 'ce:compound'],
181
+ ['ce:plan', 'deepen-plan'],
182
+ ['ce:review', 'document-review'],
183
+ ['lfg', 'slfg'],
184
+ ];
185
+ for (const [a, b] of pairs) {
186
+ const contentA = readSkill(a);
187
+ const contentB = readSkill(b);
188
+ expect(contentA).not.toBe(contentB);
189
+ }
190
+ });
191
+ });
192
+ //# sourceMappingURL=disambiguation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disambiguation.test.js","sourceRoot":"","sources":["../../../src/__tests__/skills/disambiguation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Category 1: Hook-Enforced Mandatory Skills (deterministic injection tests)
3
+ *
4
+ * These skills are deterministically injected by inject-skills.mjs.
5
+ * No prompt inference needed — the hook fires on agent_type alone.
6
+ * Tests verify hook output, not LLM behavior.
7
+ *
8
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — Category 1 (tests 1–9)
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=hook-injection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-injection.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/skills/hook-injection.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Category 1: Hook-Enforced Mandatory Skills (deterministic injection tests)
3
+ *
4
+ * These skills are deterministically injected by inject-skills.mjs.
5
+ * No prompt inference needed — the hook fires on agent_type alone.
6
+ * Tests verify hook output, not LLM behavior.
7
+ *
8
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — Category 1 (tests 1–9)
9
+ */
10
+ import { describe, it, expect } from 'vitest';
11
+ import { execFileSync } from 'node:child_process';
12
+ import { join } from 'node:path';
13
+ import { existsSync } from 'node:fs';
14
+ const SCRIPT_PATH = join(process.cwd(), '.github/hooks/scripts/inject-skills.mjs');
15
+ const PROJECT_ROOT = process.cwd();
16
+ /** Helper: pipe JSON input to inject-skills.mjs and parse the JSON output */
17
+ function runHook(input) {
18
+ const result = execFileSync('node', [SCRIPT_PATH], {
19
+ input: JSON.stringify(input),
20
+ encoding: 'utf8',
21
+ cwd: PROJECT_ROOT,
22
+ timeout: 10000,
23
+ });
24
+ return JSON.parse(result);
25
+ }
26
+ /** Helper: extract additionalContext string from hook output */
27
+ function getContext(agentType) {
28
+ const output = runHook({ agent_type: agentType, cwd: PROJECT_ROOT });
29
+ return output.hookSpecificOutput?.additionalContext ?? '';
30
+ }
31
+ const HOOK_TEST_MATRIX = [
32
+ {
33
+ id: 1,
34
+ skill: 'web-design-guidelines',
35
+ skillPath: '.github/skills/web-design-guidelines/SKILL.md',
36
+ agent: 'ux-designer',
37
+ enforcement: 'inject',
38
+ testPrompt: 'Review the login page for accessibility compliance',
39
+ },
40
+ {
41
+ id: 2,
42
+ skill: 'framer-components',
43
+ skillPath: '.github/skills/framer-components/SKILL.md',
44
+ agent: 'ux-designer',
45
+ enforcement: 'readFile',
46
+ testPrompt: 'Create a Framer component with property controls for a card',
47
+ },
48
+ {
49
+ id: 3,
50
+ skill: 'ui-ux-pro-max',
51
+ skillPath: '.github/prompts/ui-ux-pro-max/PROMPT.md',
52
+ agent: 'ux-designer',
53
+ enforcement: 'readFile',
54
+ testPrompt: 'Design a color palette and style guide for the dashboard',
55
+ },
56
+ {
57
+ id: 4,
58
+ skill: 'vercel-react-best-practices',
59
+ skillPath: '.github/skills/vercel-react-best-practices/SKILL.md',
60
+ agent: 'developer',
61
+ enforcement: 'inject',
62
+ testPrompt: 'Optimize the data fetching in our Next.js product page',
63
+ },
64
+ {
65
+ id: 5,
66
+ skill: 'shadcn-ui',
67
+ skillPath: '.github/skills/shadcn-ui/SKILL.md',
68
+ agent: 'developer',
69
+ enforcement: 'readFile',
70
+ testPrompt: 'Add a shadcn dialog component for the settings modal',
71
+ },
72
+ {
73
+ id: 6,
74
+ skill: 'vercel-react-best-practices/AGENTS.md',
75
+ skillPath: '.github/skills/vercel-react-best-practices/AGENTS.md',
76
+ agent: 'developer',
77
+ enforcement: 'readFile',
78
+ testPrompt: 'Refactor the server components to eliminate waterfalls',
79
+ },
80
+ {
81
+ id: 7,
82
+ skill: 'prd',
83
+ skillPath: '.github/skills/prd/SKILL.md',
84
+ agent: 'product-manager',
85
+ enforcement: 'readFile',
86
+ testPrompt: 'Create a PRD for the user notifications feature',
87
+ },
88
+ {
89
+ id: 8,
90
+ skill: 'security-analysis',
91
+ skillPath: '.github/skills/security-analysis/SKILL.md',
92
+ agent: 'security-reviewer',
93
+ enforcement: 'readFile',
94
+ testPrompt: 'Run an OWASP security review on the auth module',
95
+ },
96
+ {
97
+ id: 9,
98
+ skill: 'web-design-guidelines',
99
+ skillPath: '.github/skills/web-design-guidelines/SKILL.md',
100
+ agent: 'tester',
101
+ enforcement: 'inject',
102
+ testPrompt: 'Audit the checkout flow for WCAG 2.1 AA compliance',
103
+ },
104
+ ];
105
+ // ─── Parameterized tests ───────────────────────────────────────────────────
106
+ describe('Category 1: Hook-Enforced Mandatory Skills', () => {
107
+ describe.each(HOOK_TEST_MATRIX)('Test #$id: $skill → $agent ($enforcement)', ({ skillPath, agent, enforcement }) => {
108
+ it('skill file exists on disk', () => {
109
+ const fullPath = join(PROJECT_ROOT, skillPath);
110
+ expect(existsSync(fullPath)).toBe(true);
111
+ });
112
+ it('hook includes skill path in context', () => {
113
+ const ctx = getContext(agent);
114
+ expect(ctx).toContain(skillPath);
115
+ });
116
+ if (enforcement === 'inject') {
117
+ it('skill content is injected directly (not just referenced)', () => {
118
+ const ctx = getContext(agent);
119
+ expect(ctx).toContain('Skills loaded into context');
120
+ expect(ctx).toContain(skillPath);
121
+ });
122
+ }
123
+ if (enforcement === 'readFile') {
124
+ it('skill is listed under readFile mandate', () => {
125
+ const ctx = getContext(agent);
126
+ expect(ctx).toContain('Skills to load via readFile');
127
+ expect(ctx).toContain(skillPath);
128
+ });
129
+ }
130
+ it('context includes NON-NEGOTIABLE enforcement header', () => {
131
+ const ctx = getContext(agent);
132
+ expect(ctx).toContain('SKILL ENFORCEMENT');
133
+ expect(ctx).toContain('NON-NEGOTIABLE');
134
+ });
135
+ it('context identifies the correct agent type', () => {
136
+ const ctx = getContext(agent);
137
+ expect(ctx).toContain(`You are \`${agent}\``);
138
+ });
139
+ });
140
+ // ─── Researcher (special case — capability, not domain knowledge) ──────
141
+ describe('Researcher: web-search injection', () => {
142
+ it('injects web-search skill into researcher context', () => {
143
+ const ctx = getContext('researcher');
144
+ expect(ctx).toContain('.github/skills/web-search/SKILL.md');
145
+ });
146
+ it('researcher has no readFile mandates', () => {
147
+ const ctx = getContext('researcher');
148
+ expect(ctx).not.toContain('Skills to load via readFile');
149
+ });
150
+ });
151
+ // ─── Cross-agent verification ──────────────────────────────────────────
152
+ describe('Cross-agent isolation', () => {
153
+ it('developer does NOT get ux-designer skills', () => {
154
+ const ctx = getContext('developer');
155
+ expect(ctx).not.toContain('framer-components');
156
+ expect(ctx).not.toContain('ui-ux-pro-max');
157
+ });
158
+ it('ux-designer does NOT get developer skills', () => {
159
+ const ctx = getContext('ux-designer');
160
+ expect(ctx).not.toContain('shadcn-ui');
161
+ expect(ctx).not.toContain('vercel-react-best-practices/AGENTS.md');
162
+ });
163
+ it('tester does NOT get readFile mandates', () => {
164
+ const ctx = getContext('tester');
165
+ expect(ctx).not.toContain('Skills to load via readFile');
166
+ });
167
+ it('product-manager does NOT get inject skills', () => {
168
+ const ctx = getContext('product-manager');
169
+ expect(ctx).not.toContain('Skills loaded into context');
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=hook-injection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-injection.test.js","sourceRoot":"","sources":["../../../src/__tests__/skills/hook-injection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
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
+ export {};
17
+ //# sourceMappingURL=mapping-completeness.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping-completeness.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/skills/mapping-completeness.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}