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.
- package/CHANGELOG.md +79 -28
- package/README.md +127 -298
- package/assets/beth-questioning.png +0 -0
- package/assets/yellowstone-beth.png +0 -0
- package/bin/cli.js +124 -715
- package/dist/__tests__/inject-skills.test.d.ts +9 -0
- package/dist/__tests__/inject-skills.test.d.ts.map +1 -0
- package/dist/__tests__/inject-skills.test.js +143 -0
- package/dist/__tests__/inject-skills.test.js.map +1 -0
- package/dist/__tests__/skills/disambiguation.test.d.ts +10 -0
- package/dist/__tests__/skills/disambiguation.test.d.ts.map +1 -0
- package/dist/__tests__/skills/disambiguation.test.js +192 -0
- package/dist/__tests__/skills/disambiguation.test.js.map +1 -0
- package/dist/__tests__/skills/hook-injection.test.d.ts +11 -0
- package/dist/__tests__/skills/hook-injection.test.d.ts.map +1 -0
- package/dist/__tests__/skills/hook-injection.test.js +173 -0
- package/dist/__tests__/skills/hook-injection.test.js.map +1 -0
- package/dist/__tests__/skills/mapping-completeness.test.d.ts +17 -0
- package/dist/__tests__/skills/mapping-completeness.test.d.ts.map +1 -0
- package/dist/__tests__/skills/mapping-completeness.test.js +281 -0
- package/dist/__tests__/skills/mapping-completeness.test.js.map +1 -0
- package/dist/__tests__/skills/pipeline-integration.test.d.ts +18 -0
- package/dist/__tests__/skills/pipeline-integration.test.d.ts.map +1 -0
- package/dist/__tests__/skills/pipeline-integration.test.js +234 -0
- package/dist/__tests__/skills/pipeline-integration.test.js.map +1 -0
- package/dist/__tests__/skills/skill-routing.test.d.ts +15 -0
- package/dist/__tests__/skills/skill-routing.test.d.ts.map +1 -0
- package/dist/__tests__/skills/skill-routing.test.js +723 -0
- package/dist/__tests__/skills/skill-routing.test.js.map +1 -0
- package/dist/__tests__/skills/trigger-coverage.test.d.ts +24 -0
- package/dist/__tests__/skills/trigger-coverage.test.d.ts.map +1 -0
- package/dist/__tests__/skills/trigger-coverage.test.js +746 -0
- package/dist/__tests__/skills/trigger-coverage.test.js.map +1 -0
- package/dist/__tests__/smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +62 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/__tests__/verify-skills.test.d.ts +9 -0
- package/dist/__tests__/verify-skills.test.d.ts.map +1 -0
- package/dist/__tests__/verify-skills.test.js +78 -0
- package/dist/__tests__/verify-skills.test.js.map +1 -0
- package/dist/cli/commands/beads.e2e.test.d.ts +15 -0
- package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/beads.e2e.test.js +585 -0
- package/dist/cli/commands/beads.e2e.test.js.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.d.ts +54 -0
- package/dist/cli/commands/close.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.d.ts +11 -0
- package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.js +71 -0
- package/dist/cli/commands/close.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.js +95 -0
- package/dist/cli/commands/close.js.map +1 -0
- package/dist/cli/commands/close.test.d.ts +13 -0
- package/dist/cli/commands/close.test.d.ts.map +1 -0
- package/dist/cli/commands/close.test.js +254 -0
- package/dist/cli/commands/close.test.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +7 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.e2e.test.js +3 -59
- package/dist/cli/commands/doctor.e2e.test.js.map +1 -1
- package/dist/cli/commands/doctor.js +38 -18
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/doctor.test.js +32 -25
- package/dist/cli/commands/doctor.test.js.map +1 -1
- package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
- package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
- package/dist/cli/commands/framework-isolation.test.js +118 -0
- package/dist/cli/commands/framework-isolation.test.js.map +1 -0
- package/dist/cli/commands/help.e2e.test.js +5 -9
- package/dist/cli/commands/help.e2e.test.js.map +1 -1
- package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
- package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/init-logic.e2e.test.js +315 -0
- package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
- package/dist/cli/commands/init.test.js +4 -21
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/land.d.ts +130 -0
- package/dist/cli/commands/land.d.ts.map +1 -0
- package/dist/cli/commands/land.js +592 -0
- package/dist/cli/commands/land.js.map +1 -0
- package/dist/cli/commands/land.test.d.ts +19 -0
- package/dist/cli/commands/land.test.d.ts.map +1 -0
- package/dist/cli/commands/land.test.js +567 -0
- package/dist/cli/commands/land.test.js.map +1 -0
- package/dist/cli/commands/mcp.e2e.test.js +24 -31
- package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
- package/dist/cli/commands/pipeline.e2e.test.js +28 -31
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.d.ts +74 -0
- package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.js +212 -0
- package/dist/cli/commands/pre-push-guard.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts +14 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.js +314 -0
- package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js +152 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
- package/dist/cli/commands/quickstart.d.ts +0 -1
- package/dist/cli/commands/quickstart.d.ts.map +1 -1
- package/dist/cli/commands/quickstart.js +9 -83
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/quickstart.test.js +8 -129
- package/dist/cli/commands/quickstart.test.js.map +1 -1
- package/dist/cli/commands/update.d.ts +35 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.e2e.test.d.ts +24 -0
- package/dist/cli/commands/update.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/update.e2e.test.js +240 -0
- package/dist/cli/commands/update.e2e.test.js.map +1 -0
- package/dist/cli/commands/update.js +255 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/core/agents/frontmatter.test.js +1 -1
- package/dist/core/agents/frontmatter.test.js.map +1 -1
- package/dist/core/agents/handoffs.test.js +1 -1
- package/dist/core/agents/handoffs.test.js.map +1 -1
- package/dist/core/agents/loader.d.ts +4 -2
- package/dist/core/agents/loader.d.ts.map +1 -1
- package/dist/core/agents/loader.js +5 -3
- package/dist/core/agents/loader.js.map +1 -1
- package/dist/core/agents/loader.test.js +42 -4
- package/dist/core/agents/loader.test.js.map +1 -1
- package/dist/core/agents/suite.test.js +12 -9
- package/dist/core/agents/suite.test.js.map +1 -1
- package/dist/core/agents/tools.test.js +15 -9
- package/dist/core/agents/tools.test.js.map +1 -1
- package/dist/core/agents/types.test.js +1 -1
- package/dist/core/agents/types.test.js.map +1 -1
- package/dist/core/skills/loader.test.js +1 -1
- package/dist/core/skills/loader.test.js.map +1 -1
- package/dist/index.d.ts +3 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/pathValidation.d.ts +0 -5
- package/dist/lib/pathValidation.d.ts.map +1 -1
- package/dist/lib/pathValidation.js +0 -11
- package/dist/lib/pathValidation.js.map +1 -1
- package/dist/lib/pathValidation.test.js +2 -14
- package/dist/lib/pathValidation.test.js.map +1 -1
- package/package.json +13 -10
- package/sbom.json +1927 -847
- package/templates/.github/agents/beth.agent.md +331 -105
- package/templates/.github/agents/developer.agent.md +73 -102
- package/templates/.github/agents/product-manager.agent.md +24 -68
- package/templates/.github/agents/researcher.agent.md +21 -69
- package/templates/.github/agents/security-reviewer.agent.md +39 -82
- package/templates/.github/agents/tester.agent.md +44 -65
- package/templates/.github/agents/ux-designer.agent.md +25 -76
- package/templates/.github/copilot-instructions.md +246 -225
- package/templates/.github/copilot-mcp-config.json +12 -0
- package/templates/.github/dependabot.yml +68 -0
- package/templates/.github/hooks/scripts/inject-skills.mjs +139 -0
- package/templates/.github/hooks/scripts/verify-skills.mjs +47 -0
- package/templates/.github/hooks/skill-enforcement.json +18 -0
- package/templates/.github/pull_request_template.md +48 -0
- package/templates/.github/skills/framer-components/SKILL.md +0 -0
- package/templates/.github/skills/prd/SKILL.md +0 -0
- package/templates/.github/skills/security-analysis/SKILL.md +798 -798
- package/templates/.github/skills/shadcn-ui/SKILL.md +561 -561
- package/templates/.github/skills/vercel-react-best-practices/AGENTS.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/SKILL.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-parallel.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-serialization.md +0 -0
- package/templates/.github/skills/web-design-guidelines/SKILL.md +0 -0
- package/templates/.vscode/settings.json +16 -16
- package/templates/AGENTS.md +103 -54
- package/templates/Backlog.md +80 -80
- package/templates/mcp.json.example +0 -3
- package/assets/beth-portrait-small.txt +0 -13
- package/assets/beth-portrait.txt +0 -60
- package/bin/beth-animation.sh +0 -155
- package/bin/lib/animation.js +0 -189
- package/bin/lib/pathValidation.js +0 -233
- package/bin/lib/pathValidation.test.js +0 -280
- package/dist/cli/commands/client-config.d.ts +0 -31
- package/dist/cli/commands/client-config.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
- package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.js +0 -556
- package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
- package/dist/cli/commands/client-config.js +0 -73
- package/dist/cli/commands/client-config.js.map +0 -1
- package/dist/cli/commands/client-config.test.d.ts +0 -6
- package/dist/cli/commands/client-config.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.test.js +0 -133
- package/dist/cli/commands/client-config.test.js.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
- package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
- package/dist/core/context.d.ts +0 -171
- package/dist/core/context.d.ts.map +0 -1
- package/dist/core/context.js +0 -353
- package/dist/core/context.js.map +0 -1
- package/dist/core/context.test.d.ts +0 -8
- package/dist/core/context.test.d.ts.map +0 -1
- package/dist/core/context.test.js +0 -253
- package/dist/core/context.test.js.map +0 -1
- package/dist/core/handoffs.d.ts +0 -151
- package/dist/core/handoffs.d.ts.map +0 -1
- package/dist/core/handoffs.js +0 -220
- package/dist/core/handoffs.js.map +0 -1
- package/dist/core/handoffs.test.d.ts +0 -8
- package/dist/core/handoffs.test.d.ts.map +0 -1
- package/dist/core/handoffs.test.js +0 -231
- package/dist/core/handoffs.test.js.map +0 -1
- package/dist/core/orchestrator.d.ts +0 -246
- package/dist/core/orchestrator.d.ts.map +0 -1
- package/dist/core/orchestrator.js +0 -514
- package/dist/core/orchestrator.js.map +0 -1
- package/dist/core/orchestrator.test.d.ts +0 -8
- package/dist/core/orchestrator.test.d.ts.map +0 -1
- package/dist/core/orchestrator.test.js +0 -517
- package/dist/core/orchestrator.test.js.map +0 -1
- package/dist/core/router.d.ts +0 -102
- package/dist/core/router.d.ts.map +0 -1
- package/dist/core/router.js +0 -178
- package/dist/core/router.js.map +0 -1
- package/dist/core/router.test.d.ts +0 -8
- package/dist/core/router.test.d.ts.map +0 -1
- package/dist/core/router.test.js +0 -215
- package/dist/core/router.test.js.map +0 -1
- package/dist/init.test.js +0 -288
- package/dist/providers/azure.d.ts +0 -147
- package/dist/providers/azure.d.ts.map +0 -1
- package/dist/providers/azure.js +0 -491
- package/dist/providers/azure.js.map +0 -1
- package/dist/providers/azure.test.d.ts +0 -11
- package/dist/providers/azure.test.d.ts.map +0 -1
- package/dist/providers/azure.test.js +0 -330
- package/dist/providers/azure.test.js.map +0 -1
- package/dist/providers/config.d.ts +0 -87
- package/dist/providers/config.d.ts.map +0 -1
- package/dist/providers/config.js +0 -193
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/config.test.d.ts +0 -7
- package/dist/providers/config.test.d.ts.map +0 -1
- package/dist/providers/config.test.js +0 -370
- package/dist/providers/config.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -18
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -14
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/interface.d.ts +0 -191
- package/dist/providers/interface.d.ts.map +0 -1
- package/dist/providers/interface.js +0 -94
- package/dist/providers/interface.js.map +0 -1
- package/dist/providers/retry.d.ts +0 -128
- package/dist/providers/retry.d.ts.map +0 -1
- package/dist/providers/retry.js +0 -205
- package/dist/providers/retry.js.map +0 -1
- package/dist/providers/retry.test.d.ts +0 -7
- package/dist/providers/retry.test.d.ts.map +0 -1
- package/dist/providers/retry.test.js +0 -439
- package/dist/providers/retry.test.js.map +0 -1
- package/dist/providers/streaming.d.ts +0 -157
- package/dist/providers/streaming.d.ts.map +0 -1
- package/dist/providers/streaming.js +0 -233
- package/dist/providers/streaming.js.map +0 -1
- package/dist/providers/streaming.test.d.ts +0 -7
- package/dist/providers/streaming.test.d.ts.map +0 -1
- package/dist/providers/streaming.test.js +0 -372
- package/dist/providers/streaming.test.js.map +0 -1
- package/dist/providers/types.d.ts +0 -209
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -53
- package/dist/providers/types.js.map +0 -1
- package/dist/providers/types.test.d.ts +0 -7
- package/dist/providers/types.test.d.ts.map +0 -1
- package/dist/providers/types.test.js +0 -141
- package/dist/providers/types.test.js.map +0 -1
- package/dist/tools/cli/beads.d.ts +0 -27
- package/dist/tools/cli/beads.d.ts.map +0 -1
- package/dist/tools/cli/beads.js +0 -172
- package/dist/tools/cli/beads.js.map +0 -1
- package/dist/tools/cli/beads.test.d.ts +0 -8
- package/dist/tools/cli/beads.test.d.ts.map +0 -1
- package/dist/tools/cli/beads.test.js +0 -264
- package/dist/tools/cli/beads.test.js.map +0 -1
- package/dist/tools/cli/editFile.d.ts +0 -17
- package/dist/tools/cli/editFile.d.ts.map +0 -1
- package/dist/tools/cli/editFile.js +0 -125
- package/dist/tools/cli/editFile.js.map +0 -1
- package/dist/tools/cli/editFile.test.d.ts +0 -8
- package/dist/tools/cli/editFile.test.d.ts.map +0 -1
- package/dist/tools/cli/editFile.test.js +0 -177
- package/dist/tools/cli/editFile.test.js.map +0 -1
- package/dist/tools/cli/readFile.d.ts +0 -25
- package/dist/tools/cli/readFile.d.ts.map +0 -1
- package/dist/tools/cli/readFile.js +0 -118
- package/dist/tools/cli/readFile.js.map +0 -1
- package/dist/tools/cli/readFile.test.d.ts +0 -8
- package/dist/tools/cli/readFile.test.d.ts.map +0 -1
- package/dist/tools/cli/readFile.test.js +0 -194
- package/dist/tools/cli/readFile.test.js.map +0 -1
- package/dist/tools/cli/search.d.ts +0 -16
- package/dist/tools/cli/search.d.ts.map +0 -1
- package/dist/tools/cli/search.js +0 -261
- package/dist/tools/cli/search.js.map +0 -1
- package/dist/tools/cli/search.test.d.ts +0 -8
- package/dist/tools/cli/search.test.d.ts.map +0 -1
- package/dist/tools/cli/search.test.js +0 -172
- package/dist/tools/cli/search.test.js.map +0 -1
- package/dist/tools/cli/subagent.d.ts +0 -43
- package/dist/tools/cli/subagent.d.ts.map +0 -1
- package/dist/tools/cli/subagent.js +0 -99
- package/dist/tools/cli/subagent.js.map +0 -1
- package/dist/tools/cli/subagent.test.d.ts +0 -8
- package/dist/tools/cli/subagent.test.d.ts.map +0 -1
- package/dist/tools/cli/subagent.test.js +0 -190
- package/dist/tools/cli/subagent.test.js.map +0 -1
- package/dist/tools/cli/terminal.d.ts +0 -19
- package/dist/tools/cli/terminal.d.ts.map +0 -1
- package/dist/tools/cli/terminal.js +0 -164
- package/dist/tools/cli/terminal.js.map +0 -1
- package/dist/tools/cli/terminal.test.d.ts +0 -8
- package/dist/tools/cli/terminal.test.d.ts.map +0 -1
- package/dist/tools/cli/terminal.test.js +0 -161
- package/dist/tools/cli/terminal.test.js.map +0 -1
- package/dist/tools/index.d.ts +0 -25
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -41
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/interface.d.ts +0 -64
- package/dist/tools/interface.d.ts.map +0 -1
- package/dist/tools/interface.js +0 -37
- package/dist/tools/interface.js.map +0 -1
- package/dist/tools/interface.test.d.ts +0 -7
- package/dist/tools/interface.test.d.ts.map +0 -1
- package/dist/tools/interface.test.js +0 -179
- package/dist/tools/interface.test.js.map +0 -1
- package/dist/tools/mcp/bridge.d.ts +0 -48
- package/dist/tools/mcp/bridge.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.js +0 -128
- package/dist/tools/mcp/bridge.js.map +0 -1
- package/dist/tools/mcp/bridge.test.d.ts +0 -8
- package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.test.js +0 -300
- package/dist/tools/mcp/bridge.test.js.map +0 -1
- package/dist/tools/mcp/client.d.ts +0 -135
- package/dist/tools/mcp/client.d.ts.map +0 -1
- package/dist/tools/mcp/client.js +0 -263
- package/dist/tools/mcp/client.js.map +0 -1
- package/dist/tools/mcp/client.test.d.ts +0 -8
- package/dist/tools/mcp/client.test.d.ts.map +0 -1
- package/dist/tools/mcp/client.test.js +0 -390
- package/dist/tools/mcp/client.test.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -82
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -99
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/registry.test.d.ts +0 -7
- package/dist/tools/registry.test.d.ts.map +0 -1
- package/dist/tools/registry.test.js +0 -199
- package/dist/tools/registry.test.js.map +0 -1
- package/dist/tools/suite.test.d.ts +0 -11
- package/dist/tools/suite.test.d.ts.map +0 -1
- package/dist/tools/suite.test.js +0 -119
- package/dist/tools/suite.test.js.map +0 -1
- package/dist/tools/types.d.ts +0 -75
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -30
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/types.test.d.ts +0 -7
- package/dist/tools/types.test.d.ts.map +0 -1
- package/dist/tools/types.test.js +0 -178
- package/dist/tools/types.test.js.map +0 -1
- package/templates/.vscode/mcp.json +0 -20
- package/templates/CLAUDE.md +0 -129
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E tests for unknown command + version flag handling.
|
|
3
|
+
*
|
|
4
|
+
* beth-ywg.4: The default: case in bin/cli.js switch (unknown command → exit 1)
|
|
5
|
+
* was untested. This covers it.
|
|
6
|
+
*
|
|
7
|
+
* beth-ywg.5: No --version test existed. This verifies the behavior.
|
|
8
|
+
*
|
|
9
|
+
* Repro steps:
|
|
10
|
+
* 1. Run: npx vitest run src/cli/commands/cli-edge-cases.e2e.test.ts
|
|
11
|
+
*
|
|
12
|
+
* Test cases:
|
|
13
|
+
* Unknown commands:
|
|
14
|
+
* - 'banana' → exit 1, "Unknown command: banana"
|
|
15
|
+
* - 'Init' (wrong case) → exit 1 (commands are lowercase)
|
|
16
|
+
* - '' with unknown flag → handled gracefully
|
|
17
|
+
* - Very long unknown command → truncated in error (MAX_ARG_LENGTH = 50)
|
|
18
|
+
* - Multiple unknown commands → first one triggers error
|
|
19
|
+
*
|
|
20
|
+
* Version:
|
|
21
|
+
* - '--version' → either shows version or triggers unknown command
|
|
22
|
+
* - 'version' → either shows version or triggers unknown command
|
|
23
|
+
* - Version matches package.json if feature exists
|
|
24
|
+
*
|
|
25
|
+
* Flag validation:
|
|
26
|
+
* - Unknown flag --banana → exit 1 with error
|
|
27
|
+
* - Known flag on wrong command → accepted (flags are global)
|
|
28
|
+
*
|
|
29
|
+
* Expected outcomes documented inline per test case.
|
|
30
|
+
*/
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=cli-edge-cases.e2e.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-edge-cases.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cli-edge-cases.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E tests for unknown command + version flag handling.
|
|
3
|
+
*
|
|
4
|
+
* beth-ywg.4: The default: case in bin/cli.js switch (unknown command → exit 1)
|
|
5
|
+
* was untested. This covers it.
|
|
6
|
+
*
|
|
7
|
+
* beth-ywg.5: No --version test existed. This verifies the behavior.
|
|
8
|
+
*
|
|
9
|
+
* Repro steps:
|
|
10
|
+
* 1. Run: npx vitest run src/cli/commands/cli-edge-cases.e2e.test.ts
|
|
11
|
+
*
|
|
12
|
+
* Test cases:
|
|
13
|
+
* Unknown commands:
|
|
14
|
+
* - 'banana' → exit 1, "Unknown command: banana"
|
|
15
|
+
* - 'Init' (wrong case) → exit 1 (commands are lowercase)
|
|
16
|
+
* - '' with unknown flag → handled gracefully
|
|
17
|
+
* - Very long unknown command → truncated in error (MAX_ARG_LENGTH = 50)
|
|
18
|
+
* - Multiple unknown commands → first one triggers error
|
|
19
|
+
*
|
|
20
|
+
* Version:
|
|
21
|
+
* - '--version' → either shows version or triggers unknown command
|
|
22
|
+
* - 'version' → either shows version or triggers unknown command
|
|
23
|
+
* - Version matches package.json if feature exists
|
|
24
|
+
*
|
|
25
|
+
* Flag validation:
|
|
26
|
+
* - Unknown flag --banana → exit 1 with error
|
|
27
|
+
* - Known flag on wrong command → accepted (flags are global)
|
|
28
|
+
*
|
|
29
|
+
* Expected outcomes documented inline per test case.
|
|
30
|
+
*/
|
|
31
|
+
import { describe, it } from 'vitest';
|
|
32
|
+
import assert from 'node:assert';
|
|
33
|
+
import { execSync } from 'child_process';
|
|
34
|
+
import { resolve, join } from 'path';
|
|
35
|
+
import { readFileSync } from 'fs';
|
|
36
|
+
const CLI_PATH = resolve(join(import.meta.dirname, '..', '..', '..', 'bin', 'cli.js'));
|
|
37
|
+
const PKG_PATH = resolve(join(import.meta.dirname, '..', '..', '..', 'package.json'));
|
|
38
|
+
function runCli(args) {
|
|
39
|
+
try {
|
|
40
|
+
const stdout = execSync(`node "${CLI_PATH}" ${args}`, {
|
|
41
|
+
encoding: 'utf-8',
|
|
42
|
+
env: { ...process.env, NO_COLOR: '1' },
|
|
43
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
44
|
+
timeout: 15000,
|
|
45
|
+
});
|
|
46
|
+
return { stdout, stderr: '', code: 0 };
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const e = error;
|
|
50
|
+
return { stdout: e.stdout || '', stderr: e.stderr || '', code: e.status || 1 };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
describe('unknown command handling E2E', () => {
|
|
54
|
+
// Expected: exit 1, error message includes the bad command name
|
|
55
|
+
it('should exit 1 for an unknown command like "banana"', () => {
|
|
56
|
+
const result = runCli('banana');
|
|
57
|
+
assert.strictEqual(result.code, 1, 'Unknown command should exit 1');
|
|
58
|
+
const combined = result.stdout + result.stderr;
|
|
59
|
+
assert.ok(combined.includes('Unknown command') || combined.includes('banana'), 'Should mention the unknown command');
|
|
60
|
+
});
|
|
61
|
+
it('should exit 1 for "Init" (wrong case)', () => {
|
|
62
|
+
const result = runCli('Init');
|
|
63
|
+
// Commands are validated lowercase — "Init" should be recognized since
|
|
64
|
+
// bin/cli.js does command?.toLowerCase(). Check what actually happens:
|
|
65
|
+
// If the switch is case-sensitive, "Init" will hit default.
|
|
66
|
+
// Actually it does .toLowerCase() before the switch, so "Init" → "init" → works.
|
|
67
|
+
// This tests that case normalization works correctly.
|
|
68
|
+
// If it exits 0 (init ran), that's also correct — it means case normalization works.
|
|
69
|
+
assert.ok(typeof result.code === 'number', 'Should handle case variation gracefully');
|
|
70
|
+
});
|
|
71
|
+
it('should suggest running help for unknown commands', () => {
|
|
72
|
+
const result = runCli('banana');
|
|
73
|
+
const combined = result.stdout + result.stderr;
|
|
74
|
+
assert.ok(combined.includes('help') || combined.includes('usage'), 'Should suggest running help');
|
|
75
|
+
});
|
|
76
|
+
it('should truncate very long command names in error output', () => {
|
|
77
|
+
const longCmd = 'a'.repeat(100);
|
|
78
|
+
const result = runCli(longCmd);
|
|
79
|
+
assert.strictEqual(result.code, 1, 'Should exit 1 for oversized command');
|
|
80
|
+
// The MAX_ARG_LENGTH is 50, so the error should truncate
|
|
81
|
+
const combined = result.stderr + result.stdout;
|
|
82
|
+
// Should not contain the full 100-char string
|
|
83
|
+
assert.ok(!combined.includes(longCmd), 'Should truncate oversized command in output');
|
|
84
|
+
});
|
|
85
|
+
it('should handle empty string with unknown flag', () => {
|
|
86
|
+
// No command + unknown flag
|
|
87
|
+
const result = runCli('--banana');
|
|
88
|
+
assert.strictEqual(result.code, 1, 'Unknown flag should exit 1');
|
|
89
|
+
const combined = result.stdout + result.stderr;
|
|
90
|
+
assert.ok(combined.includes('Unknown flag') || combined.includes('unexpected characters') || combined.includes('Invalid'), 'Should indicate unknown or invalid flag');
|
|
91
|
+
});
|
|
92
|
+
it('should reject --banana as unknown flag on help command', () => {
|
|
93
|
+
// help with unknown flag
|
|
94
|
+
const result = runCli('help --banana');
|
|
95
|
+
// This depends on whether flag validation runs before or after command dispatch
|
|
96
|
+
// But the result should not crash
|
|
97
|
+
assert.ok(typeof result.code === 'number', 'Should not crash with unknown flag on help');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('version flag E2E', () => {
|
|
101
|
+
const pkg = JSON.parse(readFileSync(PKG_PATH, 'utf-8'));
|
|
102
|
+
const expectedVersion = pkg.version;
|
|
103
|
+
it('should have a version defined in package.json', () => {
|
|
104
|
+
assert.ok(expectedVersion, 'package.json should have a version field');
|
|
105
|
+
assert.match(expectedVersion, /^\d+\.\d+\.\d+/, 'Version should be semver');
|
|
106
|
+
});
|
|
107
|
+
// --version is NOT in the ALLOWED_COMMANDS list, so it should hit unknown flag or command handling
|
|
108
|
+
it('should handle --version flag (may not be implemented)', () => {
|
|
109
|
+
const result = runCli('--version');
|
|
110
|
+
// Two valid behaviors:
|
|
111
|
+
// 1. Shows version and exits 0 (if implemented)
|
|
112
|
+
// 2. Exits 1 with "Unknown flag" (if not implemented)
|
|
113
|
+
if (result.code === 0) {
|
|
114
|
+
// If it works, the output should contain the version
|
|
115
|
+
assert.ok(result.stdout.includes(expectedVersion), 'If --version works, should show package version');
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// If not implemented, should at least not crash
|
|
119
|
+
assert.strictEqual(result.code, 1, 'Should exit 1 if --version not supported');
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
it('should handle "version" as a command (may not be implemented)', () => {
|
|
123
|
+
const result = runCli('version');
|
|
124
|
+
if (result.code === 0) {
|
|
125
|
+
assert.ok(result.stdout.includes(expectedVersion), 'If version command works, should show package version');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
assert.strictEqual(result.code, 1, 'Should exit 1 if version command not supported');
|
|
129
|
+
const combined = result.stdout + result.stderr;
|
|
130
|
+
assert.ok(combined.includes('Unknown command') || combined.includes('version'), 'Should indicate version is unknown command');
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
it('should note: version is NOT in help output (only in init banner)', () => {
|
|
134
|
+
const result = runCli('help');
|
|
135
|
+
// The version is shown in showBethBannerStatic (init command),
|
|
136
|
+
// NOT in showHelp. This documents the current behavior.
|
|
137
|
+
const combined = result.stdout + result.stderr;
|
|
138
|
+
// Version is intentionally absent from help — it's in the init banner
|
|
139
|
+
assert.ok(!combined.includes(`v${expectedVersion}`) || combined.includes(expectedVersion), 'Documenting: version may or may not appear in help output');
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe('flag validation E2E', () => {
|
|
143
|
+
it('should reject unknown flags before command execution', () => {
|
|
144
|
+
const result = runCli('doctor --nonexistent-flag');
|
|
145
|
+
assert.strictEqual(result.code, 1, 'Unknown flag should exit 1');
|
|
146
|
+
// logError uses console.log (stdout), not console.error (stderr)
|
|
147
|
+
const combined = result.stdout + result.stderr;
|
|
148
|
+
assert.ok(combined.includes('Unknown flag'), 'Should identify the unknown flag');
|
|
149
|
+
});
|
|
150
|
+
it('should accept known global flags', () => {
|
|
151
|
+
const result = runCli('doctor --verbose');
|
|
152
|
+
// --verbose is a known flag — should not be rejected
|
|
153
|
+
assert.ok(!result.stderr.includes('Unknown flag'), '--verbose should be accepted');
|
|
154
|
+
});
|
|
155
|
+
it('should handle multiple unknown flags - report the first one', () => {
|
|
156
|
+
const result = runCli('doctor --fake1 --fake2');
|
|
157
|
+
assert.strictEqual(result.code, 1);
|
|
158
|
+
const combined = result.stdout + result.stderr;
|
|
159
|
+
assert.ok(combined.includes('Unknown flag'), 'Should report unknown flag');
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=cli-edge-cases.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-edge-cases.e2e.test.js","sourceRoot":"","sources":["../../../src/cli/commands/cli-edge-cases.e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Close Command — DEPRECATED
|
|
3
|
+
*
|
|
4
|
+
* Previously wrapped `bd close` with dependency enforcement.
|
|
5
|
+
* Beads has been removed — use Backlog.md for task tracking.
|
|
6
|
+
*
|
|
7
|
+
* This command is retained as a no-op with a helpful message
|
|
8
|
+
* to guide users who have muscle memory from the old workflow.
|
|
9
|
+
*/
|
|
10
|
+
export interface CloseOptions {
|
|
11
|
+
force?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface BeadsChild {
|
|
14
|
+
id: string;
|
|
15
|
+
title: string;
|
|
16
|
+
status: string;
|
|
17
|
+
}
|
|
18
|
+
export interface BeadsDep {
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
status: string;
|
|
22
|
+
dependency_type: string;
|
|
23
|
+
}
|
|
24
|
+
export interface BeadsIssue {
|
|
25
|
+
id: string;
|
|
26
|
+
title: string;
|
|
27
|
+
status: string;
|
|
28
|
+
issue_type: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function validateIssueId(id: string): boolean;
|
|
31
|
+
export declare function getIssueInfo(_issueId: string): BeadsIssue | null;
|
|
32
|
+
export declare function getOpenChildren(_issueId: string): BeadsChild[];
|
|
33
|
+
export declare function getAllChildren(_issueId: string): BeadsChild[];
|
|
34
|
+
export declare function getOpenBlockers(_issueId: string): BeadsDep[];
|
|
35
|
+
export declare function getMissingTestSubtasks(children: BeadsChild[]): string[];
|
|
36
|
+
export declare function parseCloseArgs(rawArgs: string[]): {
|
|
37
|
+
issueIds: string[];
|
|
38
|
+
reason: string | undefined;
|
|
39
|
+
force: boolean;
|
|
40
|
+
};
|
|
41
|
+
export declare function closeIssue(_issueId: string, _options: {
|
|
42
|
+
reason?: string;
|
|
43
|
+
force?: boolean;
|
|
44
|
+
}): {
|
|
45
|
+
success: boolean;
|
|
46
|
+
blocked?: BeadsChild[];
|
|
47
|
+
blockers?: BeadsDep[];
|
|
48
|
+
missingTests?: string[];
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Main close command entry point.
|
|
52
|
+
*/
|
|
53
|
+
export declare function close(rawArgs: string[]): Promise<void>;
|
|
54
|
+
//# sourceMappingURL=close.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/close.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEnD;AAGD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAiB;AAClF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAAe;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAAe;AAC7E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAe;AAE5E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAYvE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;IACjD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB,CAmBA;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7C;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAW9F;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB5D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E tests for close command (DEPRECATED).
|
|
3
|
+
*
|
|
4
|
+
* The close command was deprecated when beads was removed.
|
|
5
|
+
* It now prints a deprecation message and exits 1 for all inputs.
|
|
6
|
+
*
|
|
7
|
+
* Repro steps:
|
|
8
|
+
* 1. Run: npx vitest run src/cli/commands/close.e2e.test.ts
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=close.e2e.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/close.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E tests for close command (DEPRECATED).
|
|
3
|
+
*
|
|
4
|
+
* The close command was deprecated when beads was removed.
|
|
5
|
+
* It now prints a deprecation message and exits 1 for all inputs.
|
|
6
|
+
*
|
|
7
|
+
* Repro steps:
|
|
8
|
+
* 1. Run: npx vitest run src/cli/commands/close.e2e.test.ts
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it } from 'node:test';
|
|
11
|
+
import assert from 'node:assert';
|
|
12
|
+
import { execSync } from 'child_process';
|
|
13
|
+
import { resolve, join } from 'path';
|
|
14
|
+
const CLI_PATH = resolve(join(import.meta.dirname, '..', '..', '..', 'bin', 'cli.js'));
|
|
15
|
+
/**
|
|
16
|
+
* Run the close command via the CLI binary.
|
|
17
|
+
*/
|
|
18
|
+
function runClose(args) {
|
|
19
|
+
try {
|
|
20
|
+
const stdout = execSync(`node "${CLI_PATH}" close ${args}`, {
|
|
21
|
+
encoding: 'utf-8',
|
|
22
|
+
env: { ...process.env, NO_COLOR: '1' },
|
|
23
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
24
|
+
timeout: 15000,
|
|
25
|
+
});
|
|
26
|
+
return { stdout, stderr: '', code: 0 };
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const e = error;
|
|
30
|
+
return { stdout: e.stdout || '', stderr: e.stderr || '', code: e.status || 1 };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
describe('close command E2E (deprecated)', () => {
|
|
34
|
+
describe('deprecation behavior', () => {
|
|
35
|
+
it('should exit 1 with deprecation message when no ID given', () => {
|
|
36
|
+
const result = runClose('');
|
|
37
|
+
assert.strictEqual(result.code, 1, 'Deprecated close should exit 1');
|
|
38
|
+
assert.ok(result.stdout.includes('deprecated') || result.stdout.includes('Backlog.md'), 'Should show deprecation message');
|
|
39
|
+
});
|
|
40
|
+
it('should exit 1 with deprecation message when ID given', () => {
|
|
41
|
+
const result = runClose('beth-abc123');
|
|
42
|
+
assert.strictEqual(result.code, 1, 'Deprecated close should exit 1 with ID');
|
|
43
|
+
assert.ok(result.stdout.includes('deprecated') || result.stdout.includes('Backlog.md'), 'Should show deprecation message');
|
|
44
|
+
});
|
|
45
|
+
it('should mention Backlog.md as replacement', () => {
|
|
46
|
+
const result = runClose('');
|
|
47
|
+
assert.ok(result.stdout.includes('Backlog.md'), 'Should mention Backlog.md as the replacement');
|
|
48
|
+
});
|
|
49
|
+
it('should accept --reason flag without error', () => {
|
|
50
|
+
const result = runClose('beth-zzz999 --reason "Testing close"');
|
|
51
|
+
assert.strictEqual(result.code, 1, 'Should accept --reason');
|
|
52
|
+
assert.ok(!result.stderr.includes('Unknown flag'), 'Should not reject --reason as unknown flag');
|
|
53
|
+
});
|
|
54
|
+
it('should accept -r shorthand for --reason', () => {
|
|
55
|
+
const result = runClose('beth-zzz999 -r "Short reason"');
|
|
56
|
+
assert.strictEqual(result.code, 1, 'Should accept -r');
|
|
57
|
+
assert.ok(!result.stderr.includes('Unknown flag'), '-r should be accepted as reason shorthand');
|
|
58
|
+
});
|
|
59
|
+
it('should accept --force flag without error', () => {
|
|
60
|
+
const result = runClose('beth-zzz999 --force');
|
|
61
|
+
assert.strictEqual(result.code, 1, 'Should accept --force');
|
|
62
|
+
assert.ok(!result.stderr.includes('Unknown flag'), '--force should be accepted');
|
|
63
|
+
});
|
|
64
|
+
it('should accept -f shorthand for --force', () => {
|
|
65
|
+
const result = runClose('beth-zzz999 -f');
|
|
66
|
+
assert.strictEqual(result.code, 1, 'Should accept -f');
|
|
67
|
+
assert.ok(!result.stderr.includes('Unknown flag'), '-f should be accepted as force shorthand');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=close.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.e2e.test.js","sourceRoot":"","sources":["../../../src/cli/commands/close.e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Close Command — DEPRECATED
|
|
3
|
+
*
|
|
4
|
+
* Previously wrapped `bd close` with dependency enforcement.
|
|
5
|
+
* Beads has been removed — use Backlog.md for task tracking.
|
|
6
|
+
*
|
|
7
|
+
* This command is retained as a no-op with a helpful message
|
|
8
|
+
* to guide users who have muscle memory from the old workflow.
|
|
9
|
+
*/
|
|
10
|
+
const COLORS = {
|
|
11
|
+
reset: '\x1b[0m',
|
|
12
|
+
bright: '\x1b[1m',
|
|
13
|
+
red: '\x1b[31m',
|
|
14
|
+
green: '\x1b[32m',
|
|
15
|
+
yellow: '\x1b[33m',
|
|
16
|
+
cyan: '\x1b[36m',
|
|
17
|
+
};
|
|
18
|
+
// Kept for test compatibility
|
|
19
|
+
const ISSUE_ID_PATTERN = /^[a-z]+-[a-z0-9]{2,10}(\.\d+)?$/;
|
|
20
|
+
const TEST_PATTERNS = {
|
|
21
|
+
unit: /\bunit\s+test/i,
|
|
22
|
+
e2e: /\b(e2e|end.to.end|integration)\s+test/i,
|
|
23
|
+
security: /\bsecurity\s+test/i,
|
|
24
|
+
};
|
|
25
|
+
export function validateIssueId(id) {
|
|
26
|
+
return ISSUE_ID_PATTERN.test(id);
|
|
27
|
+
}
|
|
28
|
+
// Stubs — beads removed
|
|
29
|
+
export function getIssueInfo(_issueId) { return null; }
|
|
30
|
+
export function getOpenChildren(_issueId) { return []; }
|
|
31
|
+
export function getAllChildren(_issueId) { return []; }
|
|
32
|
+
export function getOpenBlockers(_issueId) { return []; }
|
|
33
|
+
export function getMissingTestSubtasks(children) {
|
|
34
|
+
const found = { unit: false, e2e: false, security: false };
|
|
35
|
+
for (const child of children) {
|
|
36
|
+
if (TEST_PATTERNS.unit.test(child.title))
|
|
37
|
+
found.unit = true;
|
|
38
|
+
if (TEST_PATTERNS.e2e.test(child.title))
|
|
39
|
+
found.e2e = true;
|
|
40
|
+
if (TEST_PATTERNS.security.test(child.title))
|
|
41
|
+
found.security = true;
|
|
42
|
+
}
|
|
43
|
+
const missing = [];
|
|
44
|
+
if (!found.unit)
|
|
45
|
+
missing.push('Unit tests');
|
|
46
|
+
if (!found.e2e)
|
|
47
|
+
missing.push('E2E/Integration tests');
|
|
48
|
+
if (!found.security)
|
|
49
|
+
missing.push('Security tests');
|
|
50
|
+
return missing;
|
|
51
|
+
}
|
|
52
|
+
export function parseCloseArgs(rawArgs) {
|
|
53
|
+
const issueIds = [];
|
|
54
|
+
let reason;
|
|
55
|
+
let force = false;
|
|
56
|
+
for (let i = 0; i < rawArgs.length; i++) {
|
|
57
|
+
const arg = rawArgs[i];
|
|
58
|
+
if (arg === '--force' || arg === '-f') {
|
|
59
|
+
force = true;
|
|
60
|
+
}
|
|
61
|
+
else if (arg === '--reason' || arg === '-r') {
|
|
62
|
+
reason = rawArgs[++i];
|
|
63
|
+
}
|
|
64
|
+
else if (arg.startsWith('--reason=')) {
|
|
65
|
+
reason = arg.slice('--reason='.length);
|
|
66
|
+
}
|
|
67
|
+
else if (!arg.startsWith('-')) {
|
|
68
|
+
issueIds.push(arg);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { issueIds, reason, force };
|
|
72
|
+
}
|
|
73
|
+
export function closeIssue(_issueId, _options) {
|
|
74
|
+
console.log(`${COLORS.yellow}⚠ The 'close' command has been deprecated.${COLORS.reset}`);
|
|
75
|
+
console.log(` Beads has been removed. Use Backlog.md for task tracking.`);
|
|
76
|
+
console.log(` Example: backlog task edit <task-id> -s "Done"`);
|
|
77
|
+
return { success: false };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Main close command entry point.
|
|
81
|
+
*/
|
|
82
|
+
export async function close(rawArgs) {
|
|
83
|
+
const { issueIds } = parseCloseArgs(rawArgs);
|
|
84
|
+
if (issueIds.length === 0) {
|
|
85
|
+
console.log(`${COLORS.yellow}⚠ The 'close' command has been deprecated.${COLORS.reset}`);
|
|
86
|
+
console.log(` Beads has been removed. Use Backlog.md for task tracking.`);
|
|
87
|
+
process.exitCode = 1;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
for (const _id of issueIds) {
|
|
91
|
+
closeIssue(_id, {});
|
|
92
|
+
}
|
|
93
|
+
process.exitCode = 1;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=close.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.js","sourceRoot":"","sources":["../../../src/cli/commands/close.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Close Command Tests
|
|
3
|
+
*
|
|
4
|
+
* The close command is deprecated — beads has been removed.
|
|
5
|
+
* Tests verify:
|
|
6
|
+
* - Issue ID validation (still has real logic)
|
|
7
|
+
* - Stub functions return expected values (null / empty arrays)
|
|
8
|
+
* - getMissingTestSubtasks (still has real logic)
|
|
9
|
+
* - Arg parsing (still has real logic)
|
|
10
|
+
* - closeIssue prints deprecation and returns success: false
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=close.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/close.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|