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,746 @@
1
+ /**
2
+ * Skill Trigger Coverage Tests
3
+ *
4
+ * For each of the 72 test cases in docs/E2E-SKILL-TESTS.md, this test verifies
5
+ * that the expected skill's description/triggers actually CONTAIN keywords from
6
+ * the test prompt. This is the closest we can get to testing "given this prompt,
7
+ * will VS Code's skill matching engine pick the right skill?" without actually
8
+ * calling the LLM.
9
+ *
10
+ * Why this matters: The existing structural tests verify that SKILL.md files
11
+ * exist and are non-empty. But they don't verify that the skill's triggers
12
+ * would actually MATCH the prompt that should invoke them. A skill could exist
13
+ * but have triggers that don't overlap with how users would describe the task.
14
+ *
15
+ * Test approach:
16
+ * - Extract keywords from each test prompt (nouns and domain terms)
17
+ * - Read the skill's SKILL.md description/triggers section
18
+ * - Verify at least N keywords from the prompt appear in the skill content
19
+ * - This catches: missing triggers, wrong skill descriptions, keyword drift
20
+ *
21
+ * Test plan reference: docs/E2E-SKILL-TESTS.md — All categories
22
+ */
23
+ import { describe, it, expect } from 'vitest';
24
+ import { join } from 'node:path';
25
+ import { readFileSync, existsSync } from 'node:fs';
26
+ const PROJECT_ROOT = process.cwd();
27
+ const EXTERNAL_SKILLS_DIR = join(process.env.HOME || '~', '.agents/skills');
28
+ // ─── Helpers ───────────────────────────────────────────────────────────────
29
+ function readSkillContent(test) {
30
+ const fullPath = test.external ? test.skillPath : join(PROJECT_ROOT, test.skillPath);
31
+ return readFileSync(fullPath, 'utf8').toLowerCase();
32
+ }
33
+ function skillFileExists(test) {
34
+ const fullPath = test.external ? test.skillPath : join(PROJECT_ROOT, test.skillPath);
35
+ return existsSync(fullPath);
36
+ }
37
+ /** Count how many keywords from the list appear in the content */
38
+ function countKeywordHits(content, keywords) {
39
+ const hits = [];
40
+ const misses = [];
41
+ for (const kw of keywords) {
42
+ if (content.includes(kw.toLowerCase())) {
43
+ hits.push(kw);
44
+ }
45
+ else {
46
+ misses.push(kw);
47
+ }
48
+ }
49
+ return { hits, misses };
50
+ }
51
+ // ─── Category 1: Hook-Enforced (9 tests) ──────────────────────────────────
52
+ // These skills are loaded by hook, not by prompt matching — but the skill
53
+ // content should STILL contain relevant keywords (defense in depth).
54
+ const HOOK_ENFORCED = [
55
+ {
56
+ id: 1, skill: 'web-design-guidelines',
57
+ skillPath: '.github/skills/web-design-guidelines/SKILL.md',
58
+ agent: 'ux-designer',
59
+ testPrompt: 'Review the login page for accessibility compliance',
60
+ requiredKeywords: ['accessibility', 'review'],
61
+ },
62
+ {
63
+ id: 2, skill: 'framer-components',
64
+ skillPath: '.github/skills/framer-components/SKILL.md',
65
+ agent: 'ux-designer',
66
+ testPrompt: 'Create a Framer component with property controls for a card',
67
+ requiredKeywords: ['framer', 'component', 'property controls'],
68
+ },
69
+ {
70
+ id: 3, skill: 'ui-ux-pro-max',
71
+ skillPath: '.github/prompts/ui-ux-pro-max/PROMPT.md',
72
+ agent: 'ux-designer',
73
+ testPrompt: 'Design a color palette and style guide for the dashboard',
74
+ requiredKeywords: ['color', 'style'],
75
+ },
76
+ {
77
+ id: 4, skill: 'vercel-react-best-practices',
78
+ skillPath: '.github/skills/vercel-react-best-practices/SKILL.md',
79
+ agent: 'developer',
80
+ testPrompt: 'Optimize the data fetching in our Next.js product page',
81
+ requiredKeywords: ['react', 'next.js'],
82
+ },
83
+ {
84
+ id: 5, skill: 'shadcn-ui',
85
+ skillPath: '.github/skills/shadcn-ui/SKILL.md',
86
+ agent: 'developer',
87
+ testPrompt: 'Add a shadcn dialog component for the settings modal',
88
+ requiredKeywords: ['shadcn', 'component'],
89
+ },
90
+ {
91
+ id: 6, skill: 'vercel-react-best-practices',
92
+ skillPath: '.github/skills/vercel-react-best-practices/AGENTS.md',
93
+ agent: 'developer',
94
+ testPrompt: 'Refactor the server components to eliminate waterfalls',
95
+ requiredKeywords: ['server component', 'waterfall'],
96
+ },
97
+ {
98
+ id: 7, skill: 'prd',
99
+ skillPath: '.github/skills/prd/SKILL.md',
100
+ agent: 'product-manager',
101
+ testPrompt: 'Create a PRD for the user notifications feature',
102
+ requiredKeywords: ['prd', 'product requirements'],
103
+ },
104
+ {
105
+ id: 8, skill: 'security-analysis',
106
+ skillPath: '.github/skills/security-analysis/SKILL.md',
107
+ agent: 'security-reviewer',
108
+ testPrompt: 'Run an OWASP security review on the auth module',
109
+ requiredKeywords: ['owasp', 'security'],
110
+ },
111
+ {
112
+ id: 9, skill: 'web-design-guidelines',
113
+ skillPath: '.github/skills/web-design-guidelines/SKILL.md',
114
+ agent: 'tester',
115
+ testPrompt: 'Audit the checkout flow for WCAG 2.1 AA compliance',
116
+ requiredKeywords: ['accessibility', 'review'],
117
+ },
118
+ ];
119
+ // ─── Category 2: Azure Skills (22 tests) ──────────────────────────────────
120
+ const AZURE_SKILLS = [
121
+ {
122
+ id: 10, skill: 'azure-prepare',
123
+ skillPath: '.github/skills/azure-prepare/SKILL.md',
124
+ agent: 'developer',
125
+ testPrompt: 'Create a new containerized Node.js app and deploy it to Azure Container Apps',
126
+ requiredKeywords: ['container', 'deploy', 'azure'],
127
+ },
128
+ {
129
+ id: 11, skill: 'azure-validate',
130
+ skillPath: '.github/skills/azure-validate/SKILL.md',
131
+ agent: 'developer',
132
+ testPrompt: "Validate my app's deployment readiness and check the Bicep configuration",
133
+ requiredKeywords: ['validate', 'bicep', 'deployment'],
134
+ },
135
+ {
136
+ id: 12, skill: 'azure-deploy',
137
+ skillPath: '.github/skills/azure-deploy/SKILL.md',
138
+ agent: 'developer',
139
+ testPrompt: 'Run azd up to push the app to production',
140
+ requiredKeywords: ['azd', 'deploy', 'production'],
141
+ },
142
+ {
143
+ id: 13, skill: 'azure-compute',
144
+ skillPath: '.github/skills/azure-compute/SKILL.md',
145
+ agent: 'developer',
146
+ testPrompt: 'Recommend the best VM size for our ML training workload on Azure',
147
+ requiredKeywords: ['vm', 'compute'],
148
+ },
149
+ {
150
+ id: 14, skill: 'azure-storage',
151
+ skillPath: '.github/skills/azure-storage/SKILL.md',
152
+ agent: 'developer',
153
+ testPrompt: 'Set up blob storage with lifecycle management for our file upload service',
154
+ requiredKeywords: ['blob', 'storage', 'lifecycle'],
155
+ },
156
+ {
157
+ id: 15, skill: 'azure-ai',
158
+ skillPath: '.github/skills/azure-ai/SKILL.md',
159
+ agent: 'developer',
160
+ testPrompt: 'Configure Azure AI Search with vector search for our product catalog',
161
+ requiredKeywords: ['ai search', 'vector'],
162
+ },
163
+ {
164
+ id: 16, skill: 'azure-aigateway',
165
+ skillPath: '.github/skills/azure-aigateway/SKILL.md',
166
+ agent: 'developer',
167
+ testPrompt: 'Set up semantic caching and token limits for our Azure OpenAI gateway',
168
+ requiredKeywords: ['semantic caching', 'token'],
169
+ },
170
+ {
171
+ id: 17, skill: 'azure-kusto',
172
+ skillPath: '.github/skills/azure-kusto/SKILL.md',
173
+ agent: 'developer',
174
+ testPrompt: 'Write KQL queries to analyze the IoT telemetry in Azure Data Explorer',
175
+ requiredKeywords: ['kql', 'data explorer'],
176
+ },
177
+ {
178
+ id: 18, skill: 'azure-messaging',
179
+ skillPath: '.github/skills/azure-messaging/SKILL.md',
180
+ agent: 'developer',
181
+ testPrompt: 'Troubleshoot this AMQP connection error with our Event Hub consumer',
182
+ requiredKeywords: ['amqp', 'event hub'],
183
+ },
184
+ {
185
+ id: 19, skill: 'azure-hosted-copilot-sdk',
186
+ skillPath: '.github/skills/azure-hosted-copilot-sdk/SKILL.md',
187
+ agent: 'developer',
188
+ testPrompt: 'Build a copilot app using @github/copilot-sdk and deploy to Azure',
189
+ requiredKeywords: ['copilot', 'sdk'],
190
+ },
191
+ {
192
+ id: 20, skill: 'appinsights-instrumentation',
193
+ skillPath: '.github/skills/appinsights-instrumentation/SKILL.md',
194
+ agent: 'developer',
195
+ testPrompt: 'Instrument our web app with Application Insights telemetry',
196
+ requiredKeywords: ['application insights', 'telemetry'],
197
+ },
198
+ {
199
+ id: 21, skill: 'microsoft-foundry',
200
+ skillPath: '.github/skills/microsoft-foundry/SKILL.md',
201
+ agent: 'developer',
202
+ testPrompt: 'Deploy our agent to Microsoft Foundry and run batch evaluation',
203
+ requiredKeywords: ['foundry', 'agent'],
204
+ },
205
+ {
206
+ id: 22, skill: 'azure-rbac',
207
+ skillPath: '.github/skills/azure-rbac/SKILL.md',
208
+ agent: 'security-reviewer',
209
+ testPrompt: 'Find the least privilege RBAC role for our managed identity to read blobs',
210
+ requiredKeywords: ['rbac', 'role', 'privilege'],
211
+ },
212
+ {
213
+ id: 23, skill: 'azure-compliance',
214
+ skillPath: '.github/skills/azure-compliance/SKILL.md',
215
+ agent: 'security-reviewer',
216
+ testPrompt: 'Run a compliance scan and security audit on our Azure subscription',
217
+ requiredKeywords: ['compliance', 'audit'],
218
+ },
219
+ {
220
+ id: 24, skill: 'entra-app-registration',
221
+ skillPath: '.github/skills/entra-app-registration/SKILL.md',
222
+ agent: 'security-reviewer',
223
+ testPrompt: 'Create an Entra ID app registration with OAuth and MSAL configuration',
224
+ requiredKeywords: ['entra', 'oauth', 'msal'],
225
+ },
226
+ {
227
+ id: 25, skill: 'azure-cost-optimization',
228
+ skillPath: '.github/skills/azure-cost-optimization/SKILL.md',
229
+ agent: 'product-manager',
230
+ testPrompt: 'Analyze our Azure spending and find cost optimization opportunities',
231
+ requiredKeywords: ['cost', 'optimization'],
232
+ },
233
+ {
234
+ id: 26, skill: 'azure-cloud-migrate',
235
+ skillPath: '.github/skills/azure-cloud-migrate/SKILL.md',
236
+ agent: 'product-manager',
237
+ testPrompt: 'Assess migrating our Lambda functions to Azure Functions',
238
+ requiredKeywords: ['migrate', 'lambda'],
239
+ },
240
+ {
241
+ id: 27, skill: 'azure-diagnostics',
242
+ skillPath: '.github/skills/azure-diagnostics/SKILL.md',
243
+ agent: 'tester',
244
+ testPrompt: 'Troubleshoot why our Container App is failing health probes in production',
245
+ requiredKeywords: ['troubleshoot', 'container', 'health'],
246
+ },
247
+ {
248
+ id: 28, skill: 'azure-resource-lookup',
249
+ skillPath: '.github/skills/azure-resource-lookup/SKILL.md',
250
+ agent: 'Beth',
251
+ testPrompt: 'List all VMs and storage accounts across our Azure subscriptions',
252
+ requiredKeywords: ['list', 'vm', 'storage'],
253
+ },
254
+ {
255
+ id: 29, skill: 'azure-resource-visualizer',
256
+ skillPath: '.github/skills/azure-resource-visualizer/SKILL.md',
257
+ agent: 'Beth',
258
+ testPrompt: 'Generate a Mermaid architecture diagram of our Azure resource group',
259
+ requiredKeywords: ['mermaid', 'diagram', 'resource'],
260
+ },
261
+ {
262
+ id: 30, skill: 'azure-postgres',
263
+ skillPath: join(EXTERNAL_SKILLS_DIR, 'azure-postgres/SKILL.md'),
264
+ agent: 'developer',
265
+ testPrompt: 'Configure passwordless Entra ID authentication for our Postgres server',
266
+ requiredKeywords: ['postgres', 'passwordless'],
267
+ external: true,
268
+ },
269
+ {
270
+ id: 31, skill: 'azure-quotas',
271
+ skillPath: join(EXTERNAL_SKILLS_DIR, 'azure-quotas/SKILL.md'),
272
+ agent: 'developer',
273
+ testPrompt: 'Check our Azure subscription quotas and vCPU limits',
274
+ requiredKeywords: ['quota', 'vcpu'],
275
+ external: true,
276
+ },
277
+ ];
278
+ // ─── Category 3: Design & Frontend (4 tests) ──────────────────────────────
279
+ const DESIGN_SKILLS = [
280
+ {
281
+ id: 32, skill: 'frontend-design',
282
+ skillPath: '.github/skills/frontend-design/SKILL.md',
283
+ agent: 'developer',
284
+ testPrompt: 'Build a distinctive, production-grade landing page with creative animations',
285
+ requiredKeywords: ['frontend', 'design', 'production'],
286
+ },
287
+ {
288
+ id: 33, skill: 'brainstorming',
289
+ skillPath: '.github/skills/brainstorming/SKILL.md',
290
+ agent: 'ux-designer',
291
+ testPrompt: 'Let\'s brainstorm approaches for the new onboarding flow',
292
+ requiredKeywords: ['brainstorm', 'explore'],
293
+ },
294
+ {
295
+ id: 34, skill: 'document-review',
296
+ skillPath: '.github/skills/document-review/SKILL.md',
297
+ agent: 'ux-designer',
298
+ testPrompt: 'Review and refine this brainstorm document before we proceed to planning',
299
+ requiredKeywords: ['review', 'refine', 'document'],
300
+ },
301
+ {
302
+ id: 35, skill: 'every-style-editor',
303
+ skillPath: '.github/skills/every-style-editor/SKILL.md',
304
+ agent: 'product-manager',
305
+ testPrompt: 'Edit this blog post for grammar and style guide compliance',
306
+ requiredKeywords: ['style', 'grammar'],
307
+ },
308
+ ];
309
+ // ─── Category 4: Product & Research (4 tests) ─────────────────────────────
310
+ const PRODUCT_SKILLS = [
311
+ {
312
+ id: 36, skill: 'prd',
313
+ skillPath: '.github/skills/prd/SKILL.md',
314
+ agent: 'product-manager',
315
+ testPrompt: 'Write a product requirements document for the billing dashboard feature',
316
+ requiredKeywords: ['product requirements', 'prd'],
317
+ },
318
+ {
319
+ id: 37, skill: 'web-search',
320
+ skillPath: '.github/skills/web-search/SKILL.md',
321
+ agent: 'researcher',
322
+ testPrompt: 'Research the competitive landscape for AI code assistants',
323
+ requiredKeywords: ['research', 'search'],
324
+ },
325
+ {
326
+ id: 38, skill: 'proof',
327
+ skillPath: '.github/skills/proof/SKILL.md',
328
+ agent: 'product-manager',
329
+ testPrompt: 'Create a proof document and share it for team review',
330
+ requiredKeywords: ['proof', 'document'],
331
+ },
332
+ {
333
+ id: 39, skill: 'changelog',
334
+ skillPath: '.github/skills/changelog/SKILL.md',
335
+ agent: 'developer',
336
+ testPrompt: 'Generate a changelog from recent commits',
337
+ requiredKeywords: ['changelog', 'change log'],
338
+ },
339
+ ];
340
+ // ─── Category 5: Developer Workflow (14 tests) ────────────────────────────
341
+ const WORKFLOW_SKILLS = [
342
+ {
343
+ id: 40, skill: 'create-agent-skills',
344
+ skillPath: '.github/skills/create-agent-skills/SKILL.md',
345
+ agent: 'developer',
346
+ testPrompt: 'Create a new Claude Code skill for database migration workflows',
347
+ requiredKeywords: ['skill', 'create'],
348
+ },
349
+ {
350
+ id: 41, skill: 'git-worktree',
351
+ skillPath: '.github/skills/git-worktree/SKILL.md',
352
+ agent: 'developer',
353
+ testPrompt: 'Create a git worktree for isolated parallel development on the feature branch',
354
+ requiredKeywords: ['worktree', 'git'],
355
+ },
356
+ {
357
+ id: 42, skill: 'feature-video',
358
+ skillPath: '.github/skills/feature-video/SKILL.md',
359
+ agent: 'developer',
360
+ testPrompt: 'Record a video walkthrough of the new settings feature for the PR',
361
+ requiredKeywords: ['video', 'feature'],
362
+ },
363
+ {
364
+ id: 43, skill: 'resolve_parallel',
365
+ skillPath: '.github/skills/resolve_parallel/SKILL.md',
366
+ agent: 'developer',
367
+ testPrompt: 'Resolve all code TODOs in the codebase using parallel processing',
368
+ requiredKeywords: ['resolve', 'todo'],
369
+ },
370
+ {
371
+ id: 44, skill: 'resolve_todo_parallel',
372
+ skillPath: '.github/skills/resolve_todo_parallel/SKILL.md',
373
+ agent: 'developer',
374
+ testPrompt: 'Resolve all pending CLI todos in my todo list',
375
+ requiredKeywords: ['resolve', 'todo'],
376
+ },
377
+ {
378
+ id: 45, skill: 'resolve-pr-parallel',
379
+ skillPath: '.github/skills/resolve-pr-parallel/SKILL.md',
380
+ agent: 'developer',
381
+ testPrompt: 'Address all PR review comments using parallel processing',
382
+ requiredKeywords: ['pr', 'review'],
383
+ },
384
+ {
385
+ id: 46, skill: 'lfg',
386
+ skillPath: '.github/skills/lfg/SKILL.md',
387
+ agent: 'developer',
388
+ testPrompt: "Execute the work plan sequentially — let's go",
389
+ requiredKeywords: ['execute', 'plan'],
390
+ },
391
+ {
392
+ id: 47, skill: 'slfg',
393
+ skillPath: '.github/skills/slfg/SKILL.md',
394
+ agent: 'developer',
395
+ testPrompt: 'Execute the work plan using swarm parallel processing',
396
+ requiredKeywords: ['swarm', 'parallel'],
397
+ },
398
+ {
399
+ id: 48, skill: 'deepen-plan',
400
+ skillPath: '.github/skills/deepen-plan/SKILL.md',
401
+ agent: 'developer',
402
+ testPrompt: 'Enhance this plan with parallel research agents to add depth and best practices',
403
+ requiredKeywords: ['enhance', 'plan', 'research'],
404
+ },
405
+ {
406
+ id: 49, skill: 'agent-browser',
407
+ skillPath: '.github/skills/agent-browser/SKILL.md',
408
+ agent: 'developer',
409
+ testPrompt: 'Browse the staging site and fill out the signup form to test it',
410
+ requiredKeywords: ['browse', 'form'],
411
+ },
412
+ {
413
+ id: 50, skill: 'agent-native-architecture',
414
+ skillPath: '.github/skills/agent-native-architecture/SKILL.md',
415
+ agent: 'developer',
416
+ testPrompt: 'Design an application where agents are first-class citizens with MCP tools',
417
+ requiredKeywords: ['agent', 'mcp'],
418
+ },
419
+ {
420
+ id: 51, skill: 'rclone',
421
+ skillPath: '.github/skills/rclone/SKILL.md',
422
+ agent: 'developer',
423
+ testPrompt: 'Upload the generated video files to our S3 bucket',
424
+ requiredKeywords: ['upload', 's3'],
425
+ },
426
+ {
427
+ id: 52, skill: 'gemini-imagegen',
428
+ skillPath: '.github/skills/gemini-imagegen/SKILL.md',
429
+ agent: 'developer',
430
+ testPrompt: 'Generate a product mockup image using Gemini for the landing page',
431
+ requiredKeywords: ['gemini', 'image'],
432
+ },
433
+ {
434
+ id: 53, skill: 'generate_command',
435
+ skillPath: '.github/skills/generate_command/SKILL.md',
436
+ agent: 'developer',
437
+ testPrompt: 'Generate a shell command to find all TypeScript files with TODO comments',
438
+ requiredKeywords: ['generate', 'command'],
439
+ },
440
+ ];
441
+ // ─── Category 6: Testing & QA (5 tests) ───────────────────────────────────
442
+ const TESTING_SKILLS = [
443
+ {
444
+ id: 54, skill: 'test-browser',
445
+ skillPath: '.github/skills/test-browser/SKILL.md',
446
+ agent: 'tester',
447
+ testPrompt: 'Run browser tests on pages affected by the current PR',
448
+ requiredKeywords: ['browser', 'test'],
449
+ },
450
+ {
451
+ id: 55, skill: 'test-xcode',
452
+ skillPath: '.github/skills/test-xcode/SKILL.md',
453
+ agent: 'tester',
454
+ testPrompt: 'Run Xcode tests for the iOS module',
455
+ requiredKeywords: ['xcode', 'test'],
456
+ },
457
+ {
458
+ id: 56, skill: 'report-bug',
459
+ skillPath: '.github/skills/report-bug/SKILL.md',
460
+ agent: 'tester',
461
+ testPrompt: 'File a bug report for the broken pagination on the search results page',
462
+ requiredKeywords: ['bug', 'report'],
463
+ },
464
+ {
465
+ id: 57, skill: 'reproduce-bug',
466
+ skillPath: '.github/skills/reproduce-bug/SKILL.md',
467
+ agent: 'tester',
468
+ testPrompt: 'Reproduce the intermittent crash reported in issue #42',
469
+ requiredKeywords: ['reproduce', 'bug'],
470
+ },
471
+ {
472
+ id: 58, skill: 'triage',
473
+ skillPath: '.github/skills/triage/SKILL.md',
474
+ agent: 'tester',
475
+ testPrompt: 'Triage the incoming bug reports and prioritize by severity',
476
+ requiredKeywords: ['triage', 'severity'],
477
+ },
478
+ ];
479
+ // ─── Category 7: Orchestration & Swarm (4 tests) ──────────────────────────
480
+ const ORCHESTRATION_SKILLS = [
481
+ {
482
+ id: 59, skill: 'orchestrating-swarms',
483
+ skillPath: '.github/skills/orchestrating-swarms/SKILL.md',
484
+ agent: 'Beth',
485
+ testPrompt: 'Orchestrate a swarm of agents to parallelize the migration work',
486
+ requiredKeywords: ['swarm', 'orchestrat'],
487
+ },
488
+ {
489
+ id: 60, skill: 'setup',
490
+ skillPath: '.github/skills/setup/SKILL.md',
491
+ agent: 'Beth',
492
+ testPrompt: 'Set up the project structure and initialize the development environment',
493
+ requiredKeywords: ['setup', 'project'],
494
+ },
495
+ {
496
+ id: 61, skill: 'heal-skill',
497
+ skillPath: '.github/skills/heal-skill/SKILL.md',
498
+ agent: 'Beth',
499
+ testPrompt: "Fix this broken skill that isn't loading correctly",
500
+ requiredKeywords: ['skill', 'fix'],
501
+ },
502
+ {
503
+ id: 62, skill: 'file-todos',
504
+ skillPath: '.github/skills/file-todos/SKILL.md',
505
+ agent: 'developer',
506
+ testPrompt: 'Scan the codebase and create tasks for all TODO/FIXME comments',
507
+ requiredKeywords: ['todo', 'task'],
508
+ },
509
+ ];
510
+ // ─── Category 8: CE Workflow Pipeline (5 tests) ───────────────────────────
511
+ const CE_SKILLS = [
512
+ {
513
+ id: 63, skill: 'ce:brainstorm',
514
+ skillPath: '.github/skills/ce:brainstorm/SKILL.md',
515
+ agent: 'ux-designer',
516
+ testPrompt: '/ce:brainstorm — explore requirements for the new dashboard',
517
+ requiredKeywords: ['brainstorm', 'explore', 'requirement'],
518
+ },
519
+ {
520
+ id: 64, skill: 'ce:plan',
521
+ skillPath: '.github/skills/ce:plan/SKILL.md',
522
+ agent: 'developer',
523
+ testPrompt: '/ce:plan — transform the feature description into a structured project plan',
524
+ requiredKeywords: ['plan', 'transform'],
525
+ },
526
+ {
527
+ id: 65, skill: 'ce:work',
528
+ skillPath: '.github/skills/ce:work/SKILL.md',
529
+ agent: 'developer',
530
+ testPrompt: '/ce:work — execute the work plan and finish the feature',
531
+ requiredKeywords: ['work', 'execute'],
532
+ },
533
+ {
534
+ id: 66, skill: 'ce:review',
535
+ skillPath: '.github/skills/ce:review/SKILL.md',
536
+ agent: 'developer',
537
+ testPrompt: '/ce:review — perform exhaustive multi-agent code review',
538
+ requiredKeywords: ['review', 'code'],
539
+ },
540
+ {
541
+ id: 67, skill: 'ce:compound',
542
+ skillPath: '.github/skills/ce:compound/SKILL.md',
543
+ agent: 'developer',
544
+ testPrompt: '/ce:compound — document what we solved to compound team knowledge',
545
+ requiredKeywords: ['compound', 'document'],
546
+ },
547
+ ];
548
+ // ─── Category 9: Language-Specific (3 tests) ──────────────────────────────
549
+ const LANGUAGE_SKILLS = [
550
+ {
551
+ id: 68, skill: 'dhh-rails-style',
552
+ skillPath: '.github/skills/dhh-rails-style/SKILL.md',
553
+ agent: 'developer',
554
+ testPrompt: "Write a Rails controller for user management in DHH's 37signals style",
555
+ requiredKeywords: ['rails', 'dhh', '37signals'],
556
+ },
557
+ {
558
+ id: 69, skill: 'andrew-kane-gem-writer',
559
+ skillPath: '.github/skills/andrew-kane-gem-writer/SKILL.md',
560
+ agent: 'developer',
561
+ testPrompt: "Create a Ruby gem for CSV parsing following Andrew Kane's patterns",
562
+ requiredKeywords: ['gem', 'andrew kane'],
563
+ },
564
+ {
565
+ id: 70, skill: 'dspy-ruby',
566
+ skillPath: '.github/skills/dspy-ruby/SKILL.md',
567
+ agent: 'developer',
568
+ testPrompt: 'Build an LLM module using DSPy.rb signatures for intent classification',
569
+ requiredKeywords: ['dspy', 'signature'],
570
+ },
571
+ ];
572
+ // ─── Category 10: Remaining (2 tests) ─────────────────────────────────────
573
+ const REMAINING_SKILLS = [
574
+ {
575
+ id: 71, skill: 'compound-docs',
576
+ skillPath: '.github/skills/compound-docs/SKILL.md',
577
+ agent: 'developer',
578
+ testPrompt: 'That worked! Document this solution for the team',
579
+ requiredKeywords: ['document', 'solution'],
580
+ },
581
+ {
582
+ id: 72, skill: 'agent-native-audit',
583
+ skillPath: '.github/skills/agent-native-audit/SKILL.md',
584
+ agent: 'security-reviewer',
585
+ testPrompt: 'Audit the agent-native architecture for security and reliability',
586
+ requiredKeywords: ['audit', 'agent', 'review'],
587
+ },
588
+ ];
589
+ // ─── All tests combined ────────────────────────────────────────────────────
590
+ const ALL_TESTS = [
591
+ ...HOOK_ENFORCED,
592
+ ...AZURE_SKILLS,
593
+ ...DESIGN_SKILLS,
594
+ ...PRODUCT_SKILLS,
595
+ ...WORKFLOW_SKILLS,
596
+ ...TESTING_SKILLS,
597
+ ...ORCHESTRATION_SKILLS,
598
+ ...CE_SKILLS,
599
+ ...LANGUAGE_SKILLS,
600
+ ...REMAINING_SKILLS,
601
+ ];
602
+ // ─── Parameterized tests ───────────────────────────────────────────────────
603
+ describe('Skill Trigger Coverage — Keyword Matching', () => {
604
+ describe('Category 1: Hook-Enforced Skills', () => {
605
+ describe.each(HOOK_ENFORCED)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
606
+ it('skill file exists', () => {
607
+ expect(skillFileExists(test)).toBe(true);
608
+ });
609
+ it('skill content contains ALL required keywords', () => {
610
+ const content = readSkillContent(test);
611
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
612
+ expect(misses).toHaveLength(0);
613
+ });
614
+ });
615
+ });
616
+ describe('Category 2: Azure Skills', () => {
617
+ describe.each(AZURE_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
618
+ const shouldSkip = test.external && !skillFileExists(test);
619
+ it.skipIf(shouldSkip)('skill file exists', () => {
620
+ expect(skillFileExists(test)).toBe(true);
621
+ });
622
+ it.skipIf(shouldSkip)('skill content contains ALL required keywords', () => {
623
+ const content = readSkillContent(test);
624
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
625
+ expect(misses).toHaveLength(0);
626
+ });
627
+ });
628
+ });
629
+ describe('Category 3: Design & Frontend', () => {
630
+ describe.each(DESIGN_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
631
+ it('skill file exists', () => {
632
+ expect(skillFileExists(test)).toBe(true);
633
+ });
634
+ it('skill content contains ALL required keywords', () => {
635
+ const content = readSkillContent(test);
636
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
637
+ expect(misses).toHaveLength(0);
638
+ });
639
+ });
640
+ });
641
+ describe('Category 4: Product & Research', () => {
642
+ describe.each(PRODUCT_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
643
+ it('skill file exists', () => {
644
+ expect(skillFileExists(test)).toBe(true);
645
+ });
646
+ it('skill content contains ALL required keywords', () => {
647
+ const content = readSkillContent(test);
648
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
649
+ expect(misses).toHaveLength(0);
650
+ });
651
+ });
652
+ });
653
+ describe('Category 5: Developer Workflow', () => {
654
+ describe.each(WORKFLOW_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
655
+ it('skill file exists', () => {
656
+ expect(skillFileExists(test)).toBe(true);
657
+ });
658
+ it('skill content contains ALL required keywords', () => {
659
+ const content = readSkillContent(test);
660
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
661
+ expect(misses).toHaveLength(0);
662
+ });
663
+ });
664
+ });
665
+ describe('Category 6: Testing & QA', () => {
666
+ describe.each(TESTING_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
667
+ it('skill file exists', () => {
668
+ expect(skillFileExists(test)).toBe(true);
669
+ });
670
+ it('skill content contains ALL required keywords', () => {
671
+ const content = readSkillContent(test);
672
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
673
+ expect(misses).toHaveLength(0);
674
+ });
675
+ });
676
+ });
677
+ describe('Category 7: Orchestration & Swarm', () => {
678
+ describe.each(ORCHESTRATION_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
679
+ it('skill file exists', () => {
680
+ expect(skillFileExists(test)).toBe(true);
681
+ });
682
+ it('skill content contains ALL required keywords', () => {
683
+ const content = readSkillContent(test);
684
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
685
+ expect(misses).toHaveLength(0);
686
+ });
687
+ });
688
+ });
689
+ describe('Category 8: CE Workflow Pipeline', () => {
690
+ describe.each(CE_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
691
+ it('skill file exists', () => {
692
+ expect(skillFileExists(test)).toBe(true);
693
+ });
694
+ it('skill content contains ALL required keywords', () => {
695
+ const content = readSkillContent(test);
696
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
697
+ expect(misses).toHaveLength(0);
698
+ });
699
+ });
700
+ });
701
+ describe('Category 9: Language-Specific', () => {
702
+ describe.each(LANGUAGE_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
703
+ it('skill file exists', () => {
704
+ expect(skillFileExists(test)).toBe(true);
705
+ });
706
+ it('skill content contains ALL required keywords', () => {
707
+ const content = readSkillContent(test);
708
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
709
+ expect(misses).toHaveLength(0);
710
+ });
711
+ });
712
+ });
713
+ describe('Category 10: Remaining', () => {
714
+ describe.each(REMAINING_SKILLS)('Test #$id: "$skill" triggers on "$testPrompt"', (test) => {
715
+ it('skill file exists', () => {
716
+ expect(skillFileExists(test)).toBe(true);
717
+ });
718
+ it('skill content contains ALL required keywords', () => {
719
+ const content = readSkillContent(test);
720
+ const { misses } = countKeywordHits(content, test.requiredKeywords);
721
+ expect(misses).toHaveLength(0);
722
+ });
723
+ });
724
+ });
725
+ });
726
+ // ─── Cross-cutting: keyword coverage statistics ────────────────────────────
727
+ describe('Cross-cutting: Trigger coverage statistics', () => {
728
+ it('all 72 test cases have at least 2 required keywords', () => {
729
+ for (const test of ALL_TESTS) {
730
+ expect(test.requiredKeywords.length).toBeGreaterThanOrEqual(2);
731
+ }
732
+ });
733
+ it('test IDs span 1–72 with no gaps', () => {
734
+ const ids = ALL_TESTS.map((t) => t.id).sort((a, b) => a - b);
735
+ expect(ids).toHaveLength(72);
736
+ for (let i = 0; i < 72; i++) {
737
+ expect(ids[i]).toBe(i + 1);
738
+ }
739
+ });
740
+ it('no two tests reference the same skill+prompt pair', () => {
741
+ const pairs = ALL_TESTS.map((t) => `${t.skill}::${t.testPrompt}`);
742
+ const uniquePairs = new Set(pairs);
743
+ expect(uniquePairs.size).toBe(pairs.length);
744
+ });
745
+ });
746
+ //# sourceMappingURL=trigger-coverage.test.js.map