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,567 @@
1
+ /**
2
+ * Land Command Tests
3
+ *
4
+ * Tests the partial session completion automation ("landing the plane").
5
+ * This command handles the git-mechanical steps only — see land.ts header
6
+ * for what remains manual.
7
+ *
8
+ * Covers:
9
+ * - Argument parsing (--skip-tests, --message, --force, --dry-run)
10
+ * - Branch detection and epic ID extraction
11
+ * - Protected branch blocking
12
+ * - Git state checks (uncommitted, staged, unpushed)
13
+ * - Test execution pass/fail handling
14
+ * - Git operations (add, commit, pull rebase, push)
15
+ * - Full landing sequence orchestration
16
+ * - Dry-run mode
17
+ */
18
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
19
+ import * as child_process from 'child_process';
20
+ // Mock child_process before importing the module under test
21
+ vi.mock('child_process', () => ({
22
+ execFileSync: vi.fn(),
23
+ }));
24
+ // Import after mocking
25
+ import { parseLandArgs, getCurrentBranch, extractEpicId, isProtectedBranch, hasUncommittedChanges, hasStagedChanges, hasUnpushedCommits, runTests, gitAddAll, gitCommit, remoteBranchExists, gitRebaseAbort, gitPullRebase, gitPush, isUpToDateWithOrigin, executeLanding, } from './land.js';
26
+ const mockedExecFileSync = vi.mocked(child_process.execFileSync);
27
+ beforeEach(() => {
28
+ vi.clearAllMocks();
29
+ // Suppress console output in tests
30
+ vi.spyOn(console, 'log').mockImplementation(() => { });
31
+ vi.spyOn(console, 'error').mockImplementation(() => { });
32
+ });
33
+ // ─── parseLandArgs ──────────────────────────────────────────────────────────
34
+ describe('parseLandArgs', () => {
35
+ it('returns empty options for no args', () => {
36
+ expect(parseLandArgs([])).toEqual({});
37
+ });
38
+ it('parses --skip-tests', () => {
39
+ const opts = parseLandArgs(['--skip-tests']);
40
+ expect(opts.skipTests).toBe(true);
41
+ });
42
+ it('parses --force and -f', () => {
43
+ expect(parseLandArgs(['--force']).force).toBe(true);
44
+ expect(parseLandArgs(['-f']).force).toBe(true);
45
+ });
46
+ it('parses --dry-run', () => {
47
+ expect(parseLandArgs(['--dry-run']).dryRun).toBe(true);
48
+ });
49
+ it('parses --message with separate value', () => {
50
+ const opts = parseLandArgs(['--message', 'my commit msg']);
51
+ expect(opts.message).toBe('my commit msg');
52
+ });
53
+ it('parses -m with separate value', () => {
54
+ const opts = parseLandArgs(['-m', 'short msg']);
55
+ expect(opts.message).toBe('short msg');
56
+ });
57
+ it('parses --message=value', () => {
58
+ const opts = parseLandArgs(['--message=inline msg']);
59
+ expect(opts.message).toBe('inline msg');
60
+ });
61
+ it('combines multiple flags', () => {
62
+ const opts = parseLandArgs(['--skip-tests', '--force', '-m', 'combo']);
63
+ expect(opts.skipTests).toBe(true);
64
+ expect(opts.force).toBe(true);
65
+ expect(opts.message).toBe('combo');
66
+ });
67
+ });
68
+ // ─── extractEpicId ──────────────────────────────────────────────────────────
69
+ describe('extractEpicId', () => {
70
+ it('extracts epic ID from epic branch', () => {
71
+ expect(extractEpicId('epic/beth-z9n')).toBe('beth-z9n');
72
+ expect(extractEpicId('epic/beth-abc123')).toBe('beth-abc123');
73
+ expect(extractEpicId('epic/hq-xyz')).toBe('hq-xyz');
74
+ });
75
+ it('returns null for non-epic branches', () => {
76
+ expect(extractEpicId('main')).toBeNull();
77
+ expect(extractEpicId('master')).toBeNull();
78
+ expect(extractEpicId('feature/something')).toBeNull();
79
+ expect(extractEpicId('release/v1.0.0')).toBeNull();
80
+ });
81
+ it('returns null for malformed epic branches', () => {
82
+ expect(extractEpicId('epic/')).toBeNull();
83
+ expect(extractEpicId('epic/BETH-Z9N')).toBeNull();
84
+ expect(extractEpicId('epic/beth-z9n.1')).toBeNull(); // dotted IDs are children, not epics
85
+ });
86
+ });
87
+ // ─── isProtectedBranch ──────────────────────────────────────────────────────
88
+ describe('isProtectedBranch', () => {
89
+ it('identifies main as protected', () => {
90
+ expect(isProtectedBranch('main')).toBe(true);
91
+ });
92
+ it('identifies master as protected', () => {
93
+ expect(isProtectedBranch('master')).toBe(true);
94
+ });
95
+ it('allows epic branches', () => {
96
+ expect(isProtectedBranch('epic/beth-z9n')).toBe(false);
97
+ });
98
+ it('allows feature branches', () => {
99
+ expect(isProtectedBranch('feature/something')).toBe(false);
100
+ });
101
+ });
102
+ // ─── getCurrentBranch ───────────────────────────────────────────────────────
103
+ describe('getCurrentBranch', () => {
104
+ it('returns branch name from git output', () => {
105
+ mockedExecFileSync.mockReturnValue('epic/beth-z9n\n');
106
+ expect(getCurrentBranch()).toBe('epic/beth-z9n');
107
+ });
108
+ it('returns null for empty output (detached HEAD)', () => {
109
+ mockedExecFileSync.mockReturnValue('\n');
110
+ expect(getCurrentBranch()).toBeNull();
111
+ });
112
+ it('returns null when git fails', () => {
113
+ mockedExecFileSync.mockImplementation(() => {
114
+ throw new Error('not a git repo');
115
+ });
116
+ expect(getCurrentBranch()).toBeNull();
117
+ });
118
+ });
119
+ // ─── hasUncommittedChanges ──────────────────────────────────────────────────
120
+ describe('hasUncommittedChanges', () => {
121
+ it('returns true when there are uncommitted changes', () => {
122
+ mockedExecFileSync.mockReturnValue(' M src/foo.ts\n');
123
+ expect(hasUncommittedChanges()).toBe(true);
124
+ });
125
+ it('returns false when working tree is clean', () => {
126
+ mockedExecFileSync.mockReturnValue('');
127
+ expect(hasUncommittedChanges()).toBe(false);
128
+ });
129
+ it('returns false on git error', () => {
130
+ mockedExecFileSync.mockImplementation(() => {
131
+ throw new Error('fail');
132
+ });
133
+ expect(hasUncommittedChanges()).toBe(false);
134
+ });
135
+ });
136
+ // ─── hasStagedChanges ───────────────────────────────────────────────────────
137
+ describe('hasStagedChanges', () => {
138
+ it('returns false when no staged changes (exit 0)', () => {
139
+ mockedExecFileSync.mockReturnValue('');
140
+ expect(hasStagedChanges()).toBe(false);
141
+ });
142
+ it('returns true when there are staged changes (exit 1)', () => {
143
+ mockedExecFileSync.mockImplementation(() => {
144
+ const err = new Error('diff found');
145
+ err.status = 1;
146
+ throw err;
147
+ });
148
+ expect(hasStagedChanges()).toBe(true);
149
+ });
150
+ it('returns false on unexpected git errors (not exit 1)', () => {
151
+ mockedExecFileSync.mockImplementation(() => {
152
+ const err = new Error('not a git repo');
153
+ err.status = 128;
154
+ throw err;
155
+ });
156
+ expect(hasStagedChanges()).toBe(false);
157
+ });
158
+ });
159
+ // ─── hasUnpushedCommits ─────────────────────────────────────────────────────
160
+ describe('hasUnpushedCommits', () => {
161
+ it('returns true when there are unpushed commits', () => {
162
+ // First call: show-ref succeeds (remote exists)
163
+ // Second call: git log returns commits
164
+ mockedExecFileSync
165
+ .mockReturnValueOnce('') // show-ref
166
+ .mockReturnValueOnce('abc1234 some commit\ndef5678 another\n'); // git log
167
+ expect(hasUnpushedCommits('epic/beth-z9n')).toBe(true);
168
+ });
169
+ it('returns false when all commits are pushed', () => {
170
+ mockedExecFileSync
171
+ .mockReturnValueOnce('') // show-ref
172
+ .mockReturnValueOnce(''); // git log (no unpushed)
173
+ expect(hasUnpushedCommits('epic/beth-z9n')).toBe(false);
174
+ });
175
+ it('returns true when remote branch does not exist', () => {
176
+ mockedExecFileSync.mockImplementation(() => {
177
+ throw new Error('not found');
178
+ });
179
+ expect(hasUnpushedCommits('epic/beth-new')).toBe(true);
180
+ });
181
+ });
182
+ // ─── runTests ───────────────────────────────────────────────────────────────
183
+ describe('runTests', () => {
184
+ it('returns passed=true on success', () => {
185
+ mockedExecFileSync.mockReturnValue('Tests: 361 passed, 1 skipped\n');
186
+ const result = runTests();
187
+ expect(result.passed).toBe(true);
188
+ expect(result.output).toContain('361 passed');
189
+ });
190
+ it('returns passed=false on test failure', () => {
191
+ const error = new Error('test failure');
192
+ error.stdout = 'FAIL src/foo.test.ts';
193
+ error.stderr = 'AssertionError: expected true to be false';
194
+ mockedExecFileSync.mockImplementation(() => {
195
+ throw error;
196
+ });
197
+ const result = runTests();
198
+ expect(result.passed).toBe(false);
199
+ expect(result.output).toContain('FAIL');
200
+ });
201
+ it('calls npm test with correct args', () => {
202
+ mockedExecFileSync.mockReturnValue('ok');
203
+ runTests();
204
+ expect(mockedExecFileSync).toHaveBeenCalledWith('npm', ['test'], expect.objectContaining({ encoding: 'utf-8' }));
205
+ });
206
+ });
207
+ // ─── gitAddAll ──────────────────────────────────────────────────────────────
208
+ describe('gitAddAll', () => {
209
+ it('returns true on success', () => {
210
+ mockedExecFileSync.mockReturnValue('');
211
+ expect(gitAddAll()).toBe(true);
212
+ });
213
+ it('returns false on failure', () => {
214
+ mockedExecFileSync.mockImplementation(() => {
215
+ throw new Error('fail');
216
+ });
217
+ expect(gitAddAll()).toBe(false);
218
+ });
219
+ });
220
+ // ─── gitCommit ──────────────────────────────────────────────────────────────
221
+ describe('gitCommit', () => {
222
+ it('returns true on success', () => {
223
+ mockedExecFileSync.mockReturnValue('');
224
+ expect(gitCommit('test msg')).toBe(true);
225
+ expect(mockedExecFileSync).toHaveBeenCalledWith('git', ['commit', '-m', 'test msg'], expect.any(Object));
226
+ });
227
+ it('returns false on failure', () => {
228
+ mockedExecFileSync.mockImplementation(() => {
229
+ throw new Error('nothing to commit');
230
+ });
231
+ expect(gitCommit('test msg')).toBe(false);
232
+ });
233
+ });
234
+ // ─── remoteBranchExists ─────────────────────────────────────────────────────
235
+ describe('remoteBranchExists', () => {
236
+ it('returns true when remote branch exists', () => {
237
+ mockedExecFileSync.mockReturnValue('');
238
+ expect(remoteBranchExists('epic/beth-z9n')).toBe(true);
239
+ expect(mockedExecFileSync).toHaveBeenCalledWith('git', ['show-ref', '--verify', '--quiet', 'refs/remotes/origin/epic/beth-z9n'], expect.any(Object));
240
+ });
241
+ it('returns false when remote branch does not exist', () => {
242
+ mockedExecFileSync.mockImplementation(() => {
243
+ throw new Error('not found');
244
+ });
245
+ expect(remoteBranchExists('epic/beth-z9n')).toBe(false);
246
+ });
247
+ });
248
+ // ─── gitRebaseAbort ─────────────────────────────────────────────────────────
249
+ describe('gitRebaseAbort', () => {
250
+ it('calls git rebase --abort', () => {
251
+ mockedExecFileSync.mockReturnValue('');
252
+ gitRebaseAbort();
253
+ expect(mockedExecFileSync).toHaveBeenCalledWith('git', ['rebase', '--abort'], expect.any(Object));
254
+ });
255
+ it('does not throw when no rebase in progress', () => {
256
+ mockedExecFileSync.mockImplementation(() => {
257
+ throw new Error('No rebase in progress');
258
+ });
259
+ expect(() => gitRebaseAbort()).not.toThrow();
260
+ });
261
+ });
262
+ // ─── gitPullRebase ──────────────────────────────────────────────────────────
263
+ describe('gitPullRebase', () => {
264
+ it('returns success=true when rebase works', () => {
265
+ mockedExecFileSync.mockReturnValue('Already up to date.\n');
266
+ const result = gitPullRebase('epic/beth-z9n');
267
+ expect(result.success).toBe(true);
268
+ expect(mockedExecFileSync).toHaveBeenCalledWith('git', ['pull', 'origin', 'epic/beth-z9n', '--rebase'], expect.any(Object));
269
+ });
270
+ it('returns success=false on conflict', () => {
271
+ const error = new Error('conflict');
272
+ error.stderr = 'CONFLICT (content): Merge conflict in foo.ts';
273
+ mockedExecFileSync.mockImplementation(() => {
274
+ throw error;
275
+ });
276
+ const result = gitPullRebase('epic/beth-z9n');
277
+ expect(result.success).toBe(false);
278
+ });
279
+ });
280
+ // ─── gitPush ────────────────────────────────────────────────────────────────
281
+ describe('gitPush', () => {
282
+ it('returns success=true on push success', () => {
283
+ mockedExecFileSync.mockReturnValue('');
284
+ const result = gitPush('epic/beth-z9n');
285
+ expect(result.success).toBe(true);
286
+ expect(mockedExecFileSync).toHaveBeenCalledWith('git', ['push', 'origin', 'epic/beth-z9n'], expect.any(Object));
287
+ });
288
+ it('returns success=false on push failure', () => {
289
+ const error = new Error('rejected');
290
+ error.stderr = 'rejected (non-fast-forward)';
291
+ mockedExecFileSync.mockImplementation(() => {
292
+ throw error;
293
+ });
294
+ const result = gitPush('epic/beth-z9n');
295
+ expect(result.success).toBe(false);
296
+ });
297
+ });
298
+ // ─── isUpToDateWithOrigin ───────────────────────────────────────────────────
299
+ describe('isUpToDateWithOrigin', () => {
300
+ it('returns true when branch is in sync', () => {
301
+ mockedExecFileSync
302
+ .mockReturnValueOnce('') // fetch
303
+ .mockReturnValueOnce('abc123\n') // rev-parse HEAD
304
+ .mockReturnValueOnce('abc123\n'); // rev-parse origin/branch
305
+ expect(isUpToDateWithOrigin('epic/beth-z9n')).toBe(true);
306
+ });
307
+ it('returns false when local is ahead', () => {
308
+ mockedExecFileSync
309
+ .mockReturnValueOnce('') // fetch
310
+ .mockReturnValueOnce('abc123\n') // rev-parse HEAD
311
+ .mockReturnValueOnce('def456\n'); // rev-parse origin/branch
312
+ expect(isUpToDateWithOrigin('epic/beth-z9n')).toBe(false);
313
+ });
314
+ it('returns false when remote ref does not exist', () => {
315
+ mockedExecFileSync
316
+ .mockReturnValueOnce('') // fetch
317
+ .mockReturnValueOnce('abc123\n') // rev-parse HEAD
318
+ .mockImplementationOnce(() => { throw new Error('unknown revision'); }); // rev-parse origin/branch fails
319
+ expect(isUpToDateWithOrigin('epic/beth-z9n')).toBe(false);
320
+ });
321
+ it('returns false on fetch error', () => {
322
+ mockedExecFileSync.mockImplementation(() => {
323
+ throw new Error('network error');
324
+ });
325
+ expect(isUpToDateWithOrigin('epic/beth-z9n')).toBe(false);
326
+ });
327
+ });
328
+ // ─── executeLanding ─────────────────────────────────────────────────────────
329
+ describe('executeLanding', () => {
330
+ it('fails when not in git repo', () => {
331
+ // getCurrentBranch returns null
332
+ mockedExecFileSync.mockImplementation(() => {
333
+ throw new Error('not a git repo');
334
+ });
335
+ const result = executeLanding();
336
+ expect(result.success).toBe(false);
337
+ expect(result.steps[0].status).toBe('fail');
338
+ expect(result.steps[0].message).toContain('Not in a git repository');
339
+ });
340
+ it('fails on protected branch (main)', () => {
341
+ mockedExecFileSync.mockReturnValueOnce('main\n');
342
+ const result = executeLanding();
343
+ expect(result.success).toBe(false);
344
+ expect(result.steps[0].status).toBe('fail');
345
+ expect(result.steps[0].message).toContain('protected branch');
346
+ });
347
+ it('fails on protected branch (master)', () => {
348
+ mockedExecFileSync.mockReturnValueOnce('master\n');
349
+ const result = executeLanding();
350
+ expect(result.success).toBe(false);
351
+ expect(result.steps[0].status).toBe('fail');
352
+ expect(result.steps[0].message).toContain('protected branch');
353
+ });
354
+ it('warns on non-epic branch but continues', () => {
355
+ // Setup: on feature branch, no changes, no unpushed
356
+ mockedExecFileSync
357
+ .mockReturnValueOnce('feature/something\n') // getCurrentBranch
358
+ .mockReturnValueOnce('Tests passed\n') // npm test
359
+ .mockReturnValueOnce('') // hasUncommittedChanges (git status --porcelain)
360
+ .mockImplementation(() => { throw new Error('no remote'); }); // hasUnpushedCommits
361
+ const result = executeLanding();
362
+ expect(result.steps[0].status).toBe('warn');
363
+ expect(result.steps[0].message).toContain("doesn't follow epic");
364
+ });
365
+ it('extracts epic ID from branch', () => {
366
+ // Setup: on epic branch, no changes, no unpushed
367
+ mockedExecFileSync
368
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
369
+ .mockReturnValueOnce('Tests: 361 passed\n') // npm test
370
+ .mockReturnValueOnce('') // hasUncommittedChanges
371
+ .mockImplementation(() => {
372
+ throw new Error('no remote');
373
+ });
374
+ const result = executeLanding();
375
+ expect(result.epicId).toBe('beth-z9n');
376
+ expect(result.branch).toBe('epic/beth-z9n');
377
+ });
378
+ it('stops on test failure without --force', () => {
379
+ const testError = new Error('test fail');
380
+ testError.stdout = 'FAIL src/foo.test.ts';
381
+ testError.stderr = '';
382
+ mockedExecFileSync
383
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
384
+ .mockImplementationOnce(() => { throw testError; }); // npm test fails
385
+ const result = executeLanding();
386
+ expect(result.success).toBe(false);
387
+ const testStep = result.steps.find((s) => s.step === 'Tests');
388
+ expect(testStep?.status).toBe('fail');
389
+ });
390
+ it('continues on test failure with --force', () => {
391
+ const testError = new Error('test fail');
392
+ testError.stdout = 'FAIL src/foo.test.ts';
393
+ testError.stderr = '';
394
+ mockedExecFileSync
395
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
396
+ .mockImplementationOnce(() => { throw testError; }) // npm test fails
397
+ .mockReturnValueOnce('') // hasUncommittedChanges (clean)
398
+ .mockImplementation(() => { throw new Error('no remote'); }); // hasUnpushedCommits
399
+ const landResult = executeLanding({ force: true });
400
+ // Should continue past test failure
401
+ const testStep = landResult.steps.find((s) => s.step === 'Tests');
402
+ expect(testStep?.status).toBe('fail');
403
+ // But should still have executed further steps
404
+ expect(landResult.steps.length).toBeGreaterThan(2);
405
+ });
406
+ it('skips tests with --skip-tests', () => {
407
+ mockedExecFileSync
408
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
409
+ .mockReturnValueOnce('') // hasUncommittedChanges
410
+ .mockImplementation(() => { throw new Error('no remote'); }); // hasUnpushedCommits
411
+ const result = executeLanding({ skipTests: true });
412
+ const testStep = result.steps.find((s) => s.step === 'Tests');
413
+ expect(testStep?.status).toBe('skip');
414
+ });
415
+ it('reports clean tree as success', () => {
416
+ mockedExecFileSync
417
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
418
+ .mockReturnValueOnce('Tests passed\n') // npm test
419
+ .mockReturnValueOnce('') // hasUncommittedChanges (clean)
420
+ .mockReturnValueOnce('') // hasUnpushedCommits: show-ref
421
+ .mockReturnValueOnce(''); // hasUnpushedCommits: git log (nothing)
422
+ const result = executeLanding();
423
+ expect(result.success).toBe(true);
424
+ const gitStatus = result.steps.find((s) => s.step === 'Git status');
425
+ expect(gitStatus?.status).toBe('pass');
426
+ });
427
+ it('dry run does not execute git operations', () => {
428
+ mockedExecFileSync
429
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch (always runs)
430
+ .mockReturnValueOnce(' M foo.ts\n') // hasUncommittedChanges
431
+ .mockImplementation(() => { throw new Error('no remote'); }); // hasUnpushedCommits
432
+ executeLanding({ dryRun: true, skipTests: true });
433
+ // Should not have called git add, commit, push
434
+ const addCall = mockedExecFileSync.mock.calls.find((c) => c[0] === 'git' && c[1][0] === 'add');
435
+ expect(addCall).toBeUndefined();
436
+ const pushCall = mockedExecFileSync.mock.calls.find((c) => c[0] === 'git' && c[1][0] === 'push');
437
+ expect(pushCall).toBeUndefined();
438
+ });
439
+ it('uses custom commit message', () => {
440
+ mockedExecFileSync
441
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
442
+ .mockReturnValueOnce('Tests passed\n') // npm test
443
+ .mockReturnValueOnce(' M foo.ts\n') // hasUncommittedChanges
444
+ .mockImplementationOnce(() => { throw new Error('no remote'); }) // hasUnpushedCommits: show-ref fails
445
+ .mockReturnValueOnce('') // git add -A
446
+ .mockReturnValueOnce('') // git commit
447
+ .mockImplementationOnce(() => { throw new Error('no remote'); }) // remoteBranchExists: show-ref fails (new branch)
448
+ .mockReturnValueOnce('') // git push
449
+ .mockReturnValueOnce('') // isUpToDateWithOrigin: fetch
450
+ .mockReturnValueOnce('abc123\n') // isUpToDateWithOrigin: rev-parse HEAD
451
+ .mockReturnValueOnce('abc123\n'); // isUpToDateWithOrigin: rev-parse origin/branch
452
+ executeLanding({ message: 'custom: my changes' });
453
+ const commitCall = mockedExecFileSync.mock.calls.find((c) => c[0] === 'git' && c[1][0] === 'commit');
454
+ expect(commitCall).toBeDefined();
455
+ expect(commitCall[1][2]).toBe('custom: my changes');
456
+ });
457
+ it('defaults commit message to epic ID prefix', () => {
458
+ mockedExecFileSync
459
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
460
+ .mockReturnValueOnce('Tests passed\n') // npm test
461
+ .mockReturnValueOnce(' M foo.ts\n') // hasUncommittedChanges
462
+ .mockImplementationOnce(() => { throw new Error('no remote'); }) // hasUnpushedCommits
463
+ .mockReturnValueOnce('') // git add -A
464
+ .mockReturnValueOnce('') // git commit
465
+ .mockImplementationOnce(() => { throw new Error('no remote'); }) // remoteBranchExists: no remote
466
+ .mockReturnValueOnce('') // git push
467
+ .mockReturnValueOnce('') // fetch
468
+ .mockReturnValueOnce('## epic/beth-z9n...origin/epic/beth-z9n\n'); // status
469
+ executeLanding();
470
+ const commitCall = mockedExecFileSync.mock.calls.find((c) => c[0] === 'git' && c[1][0] === 'commit');
471
+ expect(commitCall).toBeDefined();
472
+ expect(commitCall[1][2]).toBe('beth-z9n: session work');
473
+ });
474
+ it('full successful landing sequence (new branch, no remote)', () => {
475
+ mockedExecFileSync
476
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
477
+ .mockReturnValueOnce('Tests: 361 passed, 1 skipped\n') // npm test
478
+ .mockReturnValueOnce(' M src/land.ts\n') // hasUncommittedChanges
479
+ .mockImplementationOnce(() => { throw new Error('no remote'); }) // hasUnpushedCommits
480
+ .mockReturnValueOnce('') // git add -A
481
+ .mockReturnValueOnce('') // git commit
482
+ .mockImplementationOnce(() => { throw new Error('no remote'); }) // remoteBranchExists: no remote
483
+ .mockReturnValueOnce('') // git push
484
+ .mockReturnValueOnce('') // fetch
485
+ .mockReturnValueOnce('## epic/beth-z9n...origin/epic/beth-z9n\n'); // status
486
+ const result = executeLanding({ message: 'beth-z9n: land command' });
487
+ expect(result.success).toBe(true);
488
+ expect(result.branch).toBe('epic/beth-z9n');
489
+ expect(result.epicId).toBe('beth-z9n');
490
+ // Verify step sequence
491
+ const stepNames = result.steps.map((s) => s.step);
492
+ expect(stepNames).toContain('Branch check');
493
+ expect(stepNames).toContain('Tests');
494
+ expect(stepNames).toContain('Stage changes');
495
+ expect(stepNames).toContain('Commit');
496
+ expect(stepNames).toContain('Pull rebase');
497
+ expect(stepNames).toContain('Push');
498
+ expect(stepNames).toContain('Verify');
499
+ // All steps should pass (or warn for non-critical)
500
+ const failures = result.steps.filter((s) => s.status === 'fail');
501
+ expect(failures).toHaveLength(0);
502
+ });
503
+ it('push failure marks landing as failed', () => {
504
+ const pushError = new Error('rejected');
505
+ pushError.stderr = 'rejected (non-fast-forward)';
506
+ mockedExecFileSync
507
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
508
+ .mockReturnValueOnce('Tests passed\n') // npm test
509
+ .mockReturnValueOnce(' M foo.ts\n') // hasUncommittedChanges
510
+ .mockImplementationOnce(() => { throw new Error('no remote'); }) // hasUnpushedCommits
511
+ .mockReturnValueOnce('') // git add
512
+ .mockReturnValueOnce('') // git commit
513
+ .mockImplementationOnce(() => { throw new Error('no remote'); }) // remoteBranchExists: no remote
514
+ .mockImplementationOnce(() => { throw pushError; }); // git push fails
515
+ const result = executeLanding({ message: 'test' });
516
+ expect(result.success).toBe(false);
517
+ const pushStep = result.steps.find((s) => s.step === 'Push');
518
+ expect(pushStep?.status).toBe('fail');
519
+ });
520
+ it('full successful landing with existing remote branch', () => {
521
+ mockedExecFileSync
522
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
523
+ .mockReturnValueOnce('Tests passed\n') // npm test
524
+ .mockReturnValueOnce(' M foo.ts\n') // hasUncommittedChanges
525
+ .mockReturnValueOnce('') // hasUnpushedCommits: show-ref succeeds (remote exists)
526
+ .mockReturnValueOnce('abc123 commit msg\n') // hasUnpushedCommits: git log (has unpushed)
527
+ .mockReturnValueOnce('') // git add -A
528
+ .mockReturnValueOnce('') // git commit
529
+ .mockReturnValueOnce('') // remoteBranchExists: show-ref succeeds
530
+ .mockReturnValueOnce('Already up to date.\n') // gitPullRebase succeeds
531
+ .mockReturnValueOnce('') // git push
532
+ .mockReturnValueOnce('') // isUpToDateWithOrigin: fetch
533
+ .mockReturnValueOnce('abc123\n') // isUpToDateWithOrigin: rev-parse HEAD
534
+ .mockReturnValueOnce('abc123\n'); // isUpToDateWithOrigin: rev-parse origin/branch
535
+ const result = executeLanding({ message: 'beth-z9n: new work' });
536
+ expect(result.success).toBe(true);
537
+ const pullStep = result.steps.find((s) => s.step === 'Pull rebase');
538
+ expect(pullStep?.status).toBe('pass');
539
+ });
540
+ it('rebase conflict aborts landing and cleans up', () => {
541
+ const rebaseError = new Error('conflict');
542
+ rebaseError.stderr = 'CONFLICT (content): Merge conflict in src/foo.ts\nAutomatic merge failed; fix conflicts and then commit.';
543
+ mockedExecFileSync
544
+ .mockReturnValueOnce('epic/beth-z9n\n') // getCurrentBranch
545
+ .mockReturnValueOnce('Tests passed\n') // npm test
546
+ .mockReturnValueOnce(' M foo.ts\n') // hasUncommittedChanges
547
+ .mockReturnValueOnce('') // hasUnpushedCommits: show-ref succeeds (remote exists)
548
+ .mockReturnValueOnce('abc123 commit msg\n') // hasUnpushedCommits: git log (has unpushed)
549
+ .mockReturnValueOnce('') // git add -A
550
+ .mockReturnValueOnce('') // git commit
551
+ .mockReturnValueOnce('') // remoteBranchExists: show-ref succeeds (remote exists)
552
+ .mockImplementationOnce(() => { throw rebaseError; }) // gitPullRebase fails (conflict)
553
+ .mockReturnValueOnce(''); // gitRebaseAbort
554
+ const result = executeLanding({ message: 'test' });
555
+ expect(result.success).toBe(false);
556
+ const pullStep = result.steps.find((s) => s.step === 'Pull rebase');
557
+ expect(pullStep?.status).toBe('fail');
558
+ expect(pullStep?.message).toContain('Rebase conflict');
559
+ // Verify git rebase --abort was called
560
+ const abortCall = mockedExecFileSync.mock.calls.find((c) => c[0] === 'git' && c[1][0] === 'rebase' && c[1][1] === '--abort');
561
+ expect(abortCall).toBeDefined();
562
+ // Verify push was NOT attempted
563
+ const pushCall = mockedExecFileSync.mock.calls.find((c) => c[0] === 'git' && c[1][0] === 'push');
564
+ expect(pushCall).toBeUndefined();
565
+ });
566
+ });
567
+ //# sourceMappingURL=land.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"land.test.js","sourceRoot":"","sources":["../../../src/cli/commands/land.test.ts"],"names":[],"mappings":"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"}