@glxmart/boss-cli 1.0.0-beta.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/LICENSE +21 -0
- package/README.md +134 -0
- package/assets/claude-folder/agents/.gitkeep +0 -0
- package/assets/claude-folder/commands/boss-commands.md +138 -0
- package/assets/claude-folder/rules/boss-workflow.md +33 -0
- package/assets/claude-folder/rules/code-style.md +23 -0
- package/assets/claude-folder/rules/security.md +22 -0
- package/assets/claude-folder/rules/testing.md +32 -0
- package/assets/claude-folder/settings.local.json +88 -0
- package/assets/claude-folder/skills/.gitkeep +0 -0
- package/assets/claude-md/docs/container-use.md +140 -0
- package/assets/claude-md/docs/github-operations.md +238 -0
- package/assets/claude-md/docs/initialization.md +186 -0
- package/assets/claude-md/docs/quality-standards.md +15 -0
- package/assets/claude-md/docs/spec-kit.md +46 -0
- package/assets/claude-md/docs/workers.md +174 -0
- package/assets/claude-md/docs/workflow.md +140 -0
- package/assets/claude-md/template.md +812 -0
- package/assets/docker-compose/docker-compose.yml +52 -0
- package/assets/git-hooks/commit-msg.sh +102 -0
- package/assets/git-hooks/pre-commit-check.sh +21 -0
- package/assets/git-hooks/pre-commit.sh +6 -0
- package/assets/git-hooks/pre-push.sh +154 -0
- package/assets/git-hooks/security-check.sh +40 -0
- package/assets/git-hooks/test-changed.sh +84 -0
- package/assets/github-workflows/CODEOWNERS +3 -0
- package/assets/github-workflows/boss-ci.yml +40 -0
- package/assets/github-workflows/boss-gates.yml +28 -0
- package/assets/start-boss-sh/start-boss.sh +471 -0
- package/assets/template-docs/api-service-fastify.md +98 -0
- package/assets/template-docs/blank.md +91 -0
- package/assets/template-docs/nextjs-app-turbo.md +102 -0
- package/assets/template-docs/t3-app.md +106 -0
- package/assets/template-loader/README.md +28 -0
- package/assets/template-loader/eslint.config.node.js +28 -0
- package/assets/template-loader/eslint.config.react.js +47 -0
- package/assets/template-loader/gitignore +42 -0
- package/assets/template-loader/index.test.ts +10 -0
- package/assets/template-loader/index.ts +13 -0
- package/assets/template-loader/prettierignore +8 -0
- package/assets/template-loader/vitest.config.ts +19 -0
- package/assets/worker-configs/architect/.claude/commands/.gitkeep +0 -0
- package/assets/worker-configs/architect/.claude/skills/.gitkeep +0 -0
- package/assets/worker-configs/architect/CLAUDE.md +106 -0
- package/assets/worker-configs/clarifier/.claude/commands/.gitkeep +1 -0
- package/assets/worker-configs/clarifier/.claude/skills/.gitkeep +1 -0
- package/assets/worker-configs/clarifier/CLAUDE.md +112 -0
- package/assets/worker-configs/code-reviewer/CLAUDE.md +113 -0
- package/assets/worker-configs/consolidator/.claude/commands/.gitkeep +1 -0
- package/assets/worker-configs/consolidator/.claude/skills/.gitkeep +1 -0
- package/assets/worker-configs/consolidator/CLAUDE.md +114 -0
- package/assets/worker-configs/developer-backend/.claude/commands/.gitkeep +1 -0
- package/assets/worker-configs/developer-backend/.claude/skills/.gitkeep +1 -0
- package/assets/worker-configs/developer-backend/CLAUDE.md +116 -0
- package/assets/worker-configs/developer-frontend/.claude/commands/.gitkeep +1 -0
- package/assets/worker-configs/developer-frontend/.claude/skills/.gitkeep +1 -0
- package/assets/worker-configs/developer-frontend/CLAUDE.md +116 -0
- package/assets/worker-configs/developer-fullstack/.claude/commands/.gitkeep +1 -0
- package/assets/worker-configs/developer-fullstack/.claude/skills/.gitkeep +1 -0
- package/assets/worker-configs/developer-fullstack/CLAUDE.md +116 -0
- package/assets/worker-configs/devops-engineer/CLAUDE.md +111 -0
- package/assets/worker-configs/planner/.claude/commands/.gitkeep +1 -0
- package/assets/worker-configs/planner/.claude/skills/.gitkeep +1 -0
- package/assets/worker-configs/planner/CLAUDE.md +111 -0
- package/assets/worker-configs/product-owner/CLAUDE.md +108 -0
- package/assets/worker-configs/reviewer/.claude/commands/.gitkeep +1 -0
- package/assets/worker-configs/reviewer/.claude/skills/.gitkeep +1 -0
- package/assets/worker-configs/reviewer/CLAUDE.md +110 -0
- package/assets/worker-configs/security-engineer/CLAUDE.md +109 -0
- package/assets/worker-configs/spec-writer/.claude/commands/.gitkeep +1 -0
- package/assets/worker-configs/spec-writer/.claude/skills/.gitkeep +1 -0
- package/assets/worker-configs/spec-writer/CLAUDE.md +110 -0
- package/assets/worker-configs/technical-writer/CLAUDE.md +107 -0
- package/assets/worker-configs/tester/CLAUDE.md +110 -0
- package/dist/assets/claude-folder/agents/.gitkeep +0 -0
- package/dist/assets/claude-folder/commands/boss-commands.md +138 -0
- package/dist/assets/claude-folder/rules/boss-workflow.md +33 -0
- package/dist/assets/claude-folder/rules/code-style.md +23 -0
- package/dist/assets/claude-folder/rules/security.md +22 -0
- package/dist/assets/claude-folder/rules/testing.md +32 -0
- package/dist/assets/claude-folder/settings.local.json +88 -0
- package/dist/assets/claude-folder/skills/.gitkeep +0 -0
- package/dist/assets/claude-md/docs/container-use.md +140 -0
- package/dist/assets/claude-md/docs/github-operations.md +238 -0
- package/dist/assets/claude-md/docs/initialization.md +186 -0
- package/dist/assets/claude-md/docs/quality-standards.md +15 -0
- package/dist/assets/claude-md/docs/spec-kit.md +46 -0
- package/dist/assets/claude-md/docs/workers.md +174 -0
- package/dist/assets/claude-md/docs/workflow.md +140 -0
- package/dist/assets/claude-md/template.md +812 -0
- package/dist/assets/docker-compose/docker-compose.yml +52 -0
- package/dist/assets/git-hooks/commit-msg.sh +102 -0
- package/dist/assets/git-hooks/pre-commit-check.sh +21 -0
- package/dist/assets/git-hooks/pre-commit.sh +6 -0
- package/dist/assets/git-hooks/pre-push.sh +154 -0
- package/dist/assets/git-hooks/security-check.sh +40 -0
- package/dist/assets/git-hooks/test-changed.sh +84 -0
- package/dist/assets/github-workflows/CODEOWNERS +3 -0
- package/dist/assets/github-workflows/boss-ci.yml +40 -0
- package/dist/assets/github-workflows/boss-gates.yml +28 -0
- package/dist/assets/start-boss-sh/start-boss.sh +471 -0
- package/dist/assets/template-docs/api-service-fastify.md +98 -0
- package/dist/assets/template-docs/blank.md +91 -0
- package/dist/assets/template-docs/nextjs-app-turbo.md +102 -0
- package/dist/assets/template-docs/t3-app.md +106 -0
- package/dist/assets/template-loader/README.md +28 -0
- package/dist/assets/template-loader/eslint.config.node.js +28 -0
- package/dist/assets/template-loader/eslint.config.react.js +47 -0
- package/dist/assets/template-loader/gitignore +42 -0
- package/dist/assets/template-loader/index.test.ts +10 -0
- package/dist/assets/template-loader/index.ts +13 -0
- package/dist/assets/template-loader/prettierignore +8 -0
- package/dist/assets/template-loader/vitest.config.ts +19 -0
- package/dist/assets/worker-configs/architect/.claude/commands/.gitkeep +0 -0
- package/dist/assets/worker-configs/architect/.claude/skills/.gitkeep +0 -0
- package/dist/assets/worker-configs/architect/CLAUDE.md +106 -0
- package/dist/assets/worker-configs/clarifier/.claude/commands/.gitkeep +1 -0
- package/dist/assets/worker-configs/clarifier/.claude/skills/.gitkeep +1 -0
- package/dist/assets/worker-configs/clarifier/CLAUDE.md +112 -0
- package/dist/assets/worker-configs/code-reviewer/CLAUDE.md +113 -0
- package/dist/assets/worker-configs/consolidator/.claude/commands/.gitkeep +1 -0
- package/dist/assets/worker-configs/consolidator/.claude/skills/.gitkeep +1 -0
- package/dist/assets/worker-configs/consolidator/CLAUDE.md +114 -0
- package/dist/assets/worker-configs/developer-backend/.claude/commands/.gitkeep +1 -0
- package/dist/assets/worker-configs/developer-backend/.claude/skills/.gitkeep +1 -0
- package/dist/assets/worker-configs/developer-backend/CLAUDE.md +116 -0
- package/dist/assets/worker-configs/developer-frontend/.claude/commands/.gitkeep +1 -0
- package/dist/assets/worker-configs/developer-frontend/.claude/skills/.gitkeep +1 -0
- package/dist/assets/worker-configs/developer-frontend/CLAUDE.md +116 -0
- package/dist/assets/worker-configs/developer-fullstack/.claude/commands/.gitkeep +1 -0
- package/dist/assets/worker-configs/developer-fullstack/.claude/skills/.gitkeep +1 -0
- package/dist/assets/worker-configs/developer-fullstack/CLAUDE.md +116 -0
- package/dist/assets/worker-configs/devops-engineer/CLAUDE.md +111 -0
- package/dist/assets/worker-configs/planner/.claude/commands/.gitkeep +1 -0
- package/dist/assets/worker-configs/planner/.claude/skills/.gitkeep +1 -0
- package/dist/assets/worker-configs/planner/CLAUDE.md +111 -0
- package/dist/assets/worker-configs/product-owner/CLAUDE.md +108 -0
- package/dist/assets/worker-configs/reviewer/.claude/commands/.gitkeep +1 -0
- package/dist/assets/worker-configs/reviewer/.claude/skills/.gitkeep +1 -0
- package/dist/assets/worker-configs/reviewer/CLAUDE.md +110 -0
- package/dist/assets/worker-configs/security-engineer/CLAUDE.md +109 -0
- package/dist/assets/worker-configs/spec-writer/.claude/commands/.gitkeep +1 -0
- package/dist/assets/worker-configs/spec-writer/.claude/skills/.gitkeep +1 -0
- package/dist/assets/worker-configs/spec-writer/CLAUDE.md +110 -0
- package/dist/assets/worker-configs/technical-writer/CLAUDE.md +107 -0
- package/dist/assets/worker-configs/tester/CLAUDE.md +110 -0
- package/dist/commands/__tests__/bootstrap.test.d.ts +2 -0
- package/dist/commands/__tests__/bootstrap.test.d.ts.map +1 -0
- package/dist/commands/__tests__/bootstrap.test.js +379 -0
- package/dist/commands/__tests__/bootstrap.test.js.map +1 -0
- package/dist/commands/__tests__/doctor.test.d.ts +2 -0
- package/dist/commands/__tests__/doctor.test.d.ts.map +1 -0
- package/dist/commands/__tests__/doctor.test.js +13 -0
- package/dist/commands/__tests__/doctor.test.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +3 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +390 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +171 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/templates.d.ts +2 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +12 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/constants.d.ts +23 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +23 -0
- package/dist/constants.js.map +1 -0
- package/dist/generators/__tests__/boss-config.test.d.ts +2 -0
- package/dist/generators/__tests__/boss-config.test.d.ts.map +1 -0
- package/dist/generators/__tests__/boss-config.test.js +61 -0
- package/dist/generators/__tests__/boss-config.test.js.map +1 -0
- package/dist/generators/__tests__/claude-folder.test.d.ts +2 -0
- package/dist/generators/__tests__/claude-folder.test.d.ts.map +1 -0
- package/dist/generators/__tests__/claude-folder.test.js +128 -0
- package/dist/generators/__tests__/claude-folder.test.js.map +1 -0
- package/dist/generators/__tests__/claude-md.test.d.ts +2 -0
- package/dist/generators/__tests__/claude-md.test.d.ts.map +1 -0
- package/dist/generators/__tests__/claude-md.test.js +55 -0
- package/dist/generators/__tests__/claude-md.test.js.map +1 -0
- package/dist/generators/__tests__/container-use-config.test.d.ts +2 -0
- package/dist/generators/__tests__/container-use-config.test.d.ts.map +1 -0
- package/dist/generators/__tests__/container-use-config.test.js +80 -0
- package/dist/generators/__tests__/container-use-config.test.js.map +1 -0
- package/dist/generators/__tests__/docker-compose.test.d.ts +2 -0
- package/dist/generators/__tests__/docker-compose.test.d.ts.map +1 -0
- package/dist/generators/__tests__/docker-compose.test.js +39 -0
- package/dist/generators/__tests__/docker-compose.test.js.map +1 -0
- package/dist/generators/__tests__/git-hooks.test.d.ts +2 -0
- package/dist/generators/__tests__/git-hooks.test.d.ts.map +1 -0
- package/dist/generators/__tests__/git-hooks.test.js +118 -0
- package/dist/generators/__tests__/git-hooks.test.js.map +1 -0
- package/dist/generators/__tests__/github-workflows.test.d.ts +2 -0
- package/dist/generators/__tests__/github-workflows.test.d.ts.map +1 -0
- package/dist/generators/__tests__/github-workflows.test.js +86 -0
- package/dist/generators/__tests__/github-workflows.test.js.map +1 -0
- package/dist/generators/__tests__/mcp-config.test.d.ts +2 -0
- package/dist/generators/__tests__/mcp-config.test.d.ts.map +1 -0
- package/dist/generators/__tests__/mcp-config.test.js +131 -0
- package/dist/generators/__tests__/mcp-config.test.js.map +1 -0
- package/dist/generators/__tests__/project-structure.test.d.ts +2 -0
- package/dist/generators/__tests__/project-structure.test.d.ts.map +1 -0
- package/dist/generators/__tests__/project-structure.test.js +40 -0
- package/dist/generators/__tests__/project-structure.test.js.map +1 -0
- package/dist/generators/__tests__/quality-gates.test.d.ts +2 -0
- package/dist/generators/__tests__/quality-gates.test.d.ts.map +1 -0
- package/dist/generators/__tests__/quality-gates.test.js +71 -0
- package/dist/generators/__tests__/quality-gates.test.js.map +1 -0
- package/dist/generators/__tests__/specify-structure.test.d.ts +2 -0
- package/dist/generators/__tests__/specify-structure.test.d.ts.map +1 -0
- package/dist/generators/__tests__/specify-structure.test.js +63 -0
- package/dist/generators/__tests__/specify-structure.test.js.map +1 -0
- package/dist/generators/__tests__/start-boss-sh.test.d.ts +2 -0
- package/dist/generators/__tests__/start-boss-sh.test.d.ts.map +1 -0
- package/dist/generators/__tests__/start-boss-sh.test.js +36 -0
- package/dist/generators/__tests__/start-boss-sh.test.js.map +1 -0
- package/dist/generators/__tests__/template-docs.test.d.ts +2 -0
- package/dist/generators/__tests__/template-docs.test.d.ts.map +1 -0
- package/dist/generators/__tests__/template-docs.test.js +92 -0
- package/dist/generators/__tests__/template-docs.test.js.map +1 -0
- package/dist/generators/__tests__/template-loader.test.d.ts +2 -0
- package/dist/generators/__tests__/template-loader.test.d.ts.map +1 -0
- package/dist/generators/__tests__/template-loader.test.js +215 -0
- package/dist/generators/__tests__/template-loader.test.js.map +1 -0
- package/dist/generators/__tests__/worker-configs.test.d.ts +2 -0
- package/dist/generators/__tests__/worker-configs.test.d.ts.map +1 -0
- package/dist/generators/__tests__/worker-configs.test.js +122 -0
- package/dist/generators/__tests__/worker-configs.test.js.map +1 -0
- package/dist/generators/boss-config.d.ts +3 -0
- package/dist/generators/boss-config.d.ts.map +1 -0
- package/dist/generators/boss-config.js +242 -0
- package/dist/generators/boss-config.js.map +1 -0
- package/dist/generators/claude-folder.d.ts +3 -0
- package/dist/generators/claude-folder.d.ts.map +1 -0
- package/dist/generators/claude-folder.js +94 -0
- package/dist/generators/claude-folder.js.map +1 -0
- package/dist/generators/claude-md.d.ts +3 -0
- package/dist/generators/claude-md.d.ts.map +1 -0
- package/dist/generators/claude-md.js +64 -0
- package/dist/generators/claude-md.js.map +1 -0
- package/dist/generators/container-use-config.d.ts +13 -0
- package/dist/generators/container-use-config.d.ts.map +1 -0
- package/dist/generators/container-use-config.js +60 -0
- package/dist/generators/container-use-config.js.map +1 -0
- package/dist/generators/docker-compose.d.ts +2 -0
- package/dist/generators/docker-compose.d.ts.map +1 -0
- package/dist/generators/docker-compose.js +8 -0
- package/dist/generators/docker-compose.js.map +1 -0
- package/dist/generators/git-hooks.d.ts +3 -0
- package/dist/generators/git-hooks.d.ts.map +1 -0
- package/dist/generators/git-hooks.js +58 -0
- package/dist/generators/git-hooks.js.map +1 -0
- package/dist/generators/github-workflows.d.ts +3 -0
- package/dist/generators/github-workflows.d.ts.map +1 -0
- package/dist/generators/github-workflows.js +27 -0
- package/dist/generators/github-workflows.js.map +1 -0
- package/dist/generators/mcp-config.d.ts +3 -0
- package/dist/generators/mcp-config.d.ts.map +1 -0
- package/dist/generators/mcp-config.js +183 -0
- package/dist/generators/mcp-config.js.map +1 -0
- package/dist/generators/project-structure.d.ts +3 -0
- package/dist/generators/project-structure.d.ts.map +1 -0
- package/dist/generators/project-structure.js +24 -0
- package/dist/generators/project-structure.js.map +1 -0
- package/dist/generators/quality-gates.d.ts +3 -0
- package/dist/generators/quality-gates.d.ts.map +1 -0
- package/dist/generators/quality-gates.js +32 -0
- package/dist/generators/quality-gates.js.map +1 -0
- package/dist/generators/specify-structure.d.ts +2 -0
- package/dist/generators/specify-structure.d.ts.map +1 -0
- package/dist/generators/specify-structure.js +43 -0
- package/dist/generators/specify-structure.js.map +1 -0
- package/dist/generators/start-boss-sh.d.ts +2 -0
- package/dist/generators/start-boss-sh.d.ts.map +1 -0
- package/dist/generators/start-boss-sh.js +10 -0
- package/dist/generators/start-boss-sh.js.map +1 -0
- package/dist/generators/template-docs.d.ts +3 -0
- package/dist/generators/template-docs.d.ts.map +1 -0
- package/dist/generators/template-docs.js +19 -0
- package/dist/generators/template-docs.js.map +1 -0
- package/dist/generators/template-loader.d.ts +3 -0
- package/dist/generators/template-loader.d.ts.map +1 -0
- package/dist/generators/template-loader.js +308 -0
- package/dist/generators/template-loader.js.map +1 -0
- package/dist/generators/worker-configs.d.ts +3 -0
- package/dist/generators/worker-configs.d.ts.map +1 -0
- package/dist/generators/worker-configs.js +119 -0
- package/dist/generators/worker-configs.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/presets/__tests__/quality-presets.test.d.ts +2 -0
- package/dist/presets/__tests__/quality-presets.test.d.ts.map +1 -0
- package/dist/presets/__tests__/quality-presets.test.js +152 -0
- package/dist/presets/__tests__/quality-presets.test.js.map +1 -0
- package/dist/presets/quality-presets.d.ts +3 -0
- package/dist/presets/quality-presets.d.ts.map +1 -0
- package/dist/presets/quality-presets.js +65 -0
- package/dist/presets/quality-presets.js.map +1 -0
- package/dist/types/index.d.ts +42 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/__tests__/file-system.test.d.ts +2 -0
- package/dist/utils/__tests__/file-system.test.d.ts.map +1 -0
- package/dist/utils/__tests__/file-system.test.js +83 -0
- package/dist/utils/__tests__/file-system.test.js.map +1 -0
- package/dist/utils/__tests__/git.test.d.ts +2 -0
- package/dist/utils/__tests__/git.test.d.ts.map +1 -0
- package/dist/utils/__tests__/git.test.js +79 -0
- package/dist/utils/__tests__/git.test.js.map +1 -0
- package/dist/utils/__tests__/template-loader.test.d.ts +2 -0
- package/dist/utils/__tests__/template-loader.test.d.ts.map +1 -0
- package/dist/utils/__tests__/template-loader.test.js +109 -0
- package/dist/utils/__tests__/template-loader.test.js.map +1 -0
- package/dist/utils/__tests__/validators.test.d.ts +2 -0
- package/dist/utils/__tests__/validators.test.d.ts.map +1 -0
- package/dist/utils/__tests__/validators.test.js +118 -0
- package/dist/utils/__tests__/validators.test.js.map +1 -0
- package/dist/utils/file-system.d.ts +8 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +54 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/git.d.ts +7 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +98 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +42 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prompts.d.ts +18 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +197 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/template-loader.d.ts +18 -0
- package/dist/utils/template-loader.d.ts.map +1 -0
- package/dist/utils/template-loader.js +92 -0
- package/dist/utils/template-loader.js.map +1 -0
- package/dist/utils/validators.d.ts +21 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +50 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +79 -0
- package/templates/spec-kit/README.md +17 -0
- package/templates/spec-kit/memory/constitution.md +50 -0
- package/templates/spec-kit/scripts/bash/check-prerequisites.sh +166 -0
- package/templates/spec-kit/scripts/bash/common.sh +156 -0
- package/templates/spec-kit/scripts/bash/create-new-feature.sh +297 -0
- package/templates/spec-kit/scripts/bash/setup-plan.sh +61 -0
- package/templates/spec-kit/scripts/bash/update-agent-context.sh +799 -0
- package/templates/spec-kit/scripts/powershell/check-prerequisites.ps1 +148 -0
- package/templates/spec-kit/scripts/powershell/common.ps1 +137 -0
- package/templates/spec-kit/scripts/powershell/create-new-feature.ps1 +283 -0
- package/templates/spec-kit/scripts/powershell/setup-plan.ps1 +61 -0
- package/templates/spec-kit/scripts/powershell/update-agent-context.ps1 +448 -0
- package/templates/spec-kit/src/specify_cli/__init__.py +1369 -0
- package/templates/spec-kit/templates/agent-file-template.md +28 -0
- package/templates/spec-kit/templates/checklist-template.md +40 -0
- package/templates/spec-kit/templates/commands/analyze.md +187 -0
- package/templates/spec-kit/templates/commands/checklist.md +297 -0
- package/templates/spec-kit/templates/commands/clarify.md +184 -0
- package/templates/spec-kit/templates/commands/constitution.md +82 -0
- package/templates/spec-kit/templates/commands/implement.md +138 -0
- package/templates/spec-kit/templates/commands/plan.md +95 -0
- package/templates/spec-kit/templates/commands/specify.md +261 -0
- package/templates/spec-kit/templates/commands/tasks.md +140 -0
- package/templates/spec-kit/templates/commands/taskstoissues.md +33 -0
- package/templates/spec-kit/templates/plan-template.md +104 -0
- package/templates/spec-kit/templates/spec-template.md +115 -0
- package/templates/spec-kit/templates/tasks-template.md +251 -0
- package/templates/spec-kit/templates/vscode-settings.json +14 -0
- package/templates/t3-app/README.md +41 -0
- package/templates/t3-app/base/README.md +29 -0
- package/templates/t3-app/base/_gitignore +47 -0
- package/templates/t3-app/base/next-env.d.ts +5 -0
- package/templates/t3-app/base/next.config.js +22 -0
- package/templates/t3-app/base/package.json +26 -0
- package/templates/t3-app/base/public/favicon.ico +0 -0
- package/templates/t3-app/base/src/env.js +40 -0
- package/templates/t3-app/base/src/styles/globals.css +16 -0
- package/templates/t3-app/base/tsconfig.json +42 -0
- package/templates/t3-app/extras/config/_eslint.base.js +45 -0
- package/templates/t3-app/extras/config/_eslint.drizzle.js +58 -0
- package/templates/t3-app/extras/config/_prettier.config.js +2 -0
- package/templates/t3-app/extras/config/_tailwind.prettier.config.js +4 -0
- package/templates/t3-app/extras/config/biome.jsonc +69 -0
- package/templates/t3-app/extras/config/drizzle-config-mysql.ts +12 -0
- package/templates/t3-app/extras/config/drizzle-config-postgres.ts +12 -0
- package/templates/t3-app/extras/config/drizzle-config-sqlite.ts +12 -0
- package/templates/t3-app/extras/config/next-config-appdir.js +10 -0
- package/templates/t3-app/extras/config/postcss.config.js +5 -0
- package/templates/t3-app/extras/pnpm/_npmrc +2 -0
- package/templates/t3-app/extras/prisma/schema/base-planetscale.prisma +25 -0
- package/templates/t3-app/extras/prisma/schema/base.prisma +21 -0
- package/templates/t3-app/extras/prisma/schema/with-auth-planetscale.prisma +79 -0
- package/templates/t3-app/extras/prisma/schema/with-auth.prisma +75 -0
- package/templates/t3-app/extras/prisma/schema/with-better-auth-planetscale.prisma +90 -0
- package/templates/t3-app/extras/prisma/schema/with-better-auth.prisma +89 -0
- package/templates/t3-app/extras/src/app/_components/post-tw.tsx +50 -0
- package/templates/t3-app/extras/src/app/_components/post.tsx +54 -0
- package/templates/t3-app/extras/src/app/api/auth/[...all]/route.ts +5 -0
- package/templates/t3-app/extras/src/app/api/auth/[...nextauth]/route.ts +3 -0
- package/templates/t3-app/extras/src/app/api/trpc/[trpc]/route.ts +34 -0
- package/templates/t3-app/extras/src/app/layout/base.tsx +24 -0
- package/templates/t3-app/extras/src/app/layout/with-trpc-tw.tsx +29 -0
- package/templates/t3-app/extras/src/app/layout/with-trpc.tsx +28 -0
- package/templates/t3-app/extras/src/app/layout/with-tw.tsx +25 -0
- package/templates/t3-app/extras/src/app/page/base.tsx +39 -0
- package/templates/t3-app/extras/src/app/page/with-auth-trpc-tw.tsx +69 -0
- package/templates/t3-app/extras/src/app/page/with-auth-trpc.tsx +70 -0
- package/templates/t3-app/extras/src/app/page/with-better-auth-trpc-tw.tsx +105 -0
- package/templates/t3-app/extras/src/app/page/with-better-auth-trpc.tsx +103 -0
- package/templates/t3-app/extras/src/app/page/with-better-auth-tw.tsx +90 -0
- package/templates/t3-app/extras/src/app/page/with-better-auth.tsx +88 -0
- package/templates/t3-app/extras/src/app/page/with-trpc-tw.tsx +53 -0
- package/templates/t3-app/extras/src/app/page/with-trpc.tsx +54 -0
- package/templates/t3-app/extras/src/app/page/with-tw.tsx +37 -0
- package/templates/t3-app/extras/src/env/with-auth-db-planetscale.js +58 -0
- package/templates/t3-app/extras/src/env/with-auth-db.js +52 -0
- package/templates/t3-app/extras/src/env/with-auth.js +51 -0
- package/templates/t3-app/extras/src/env/with-better-auth-db-planetscale.js +58 -0
- package/templates/t3-app/extras/src/env/with-better-auth-db.js +50 -0
- package/templates/t3-app/extras/src/env/with-better-auth.js +49 -0
- package/templates/t3-app/extras/src/env/with-db-planetscale.js +50 -0
- package/templates/t3-app/extras/src/env/with-db.js +44 -0
- package/templates/t3-app/extras/src/index.module.css +177 -0
- package/templates/t3-app/extras/src/pages/_app/base.tsx +18 -0
- package/templates/t3-app/extras/src/pages/_app/with-auth-trpc-tw.tsx +27 -0
- package/templates/t3-app/extras/src/pages/_app/with-auth-trpc.tsx +27 -0
- package/templates/t3-app/extras/src/pages/_app/with-auth-tw.tsx +25 -0
- package/templates/t3-app/extras/src/pages/_app/with-auth.tsx +25 -0
- package/templates/t3-app/extras/src/pages/_app/with-better-auth-trpc-tw.tsx +20 -0
- package/templates/t3-app/extras/src/pages/_app/with-better-auth-trpc.tsx +20 -0
- package/templates/t3-app/extras/src/pages/_app/with-trpc-tw.tsx +20 -0
- package/templates/t3-app/extras/src/pages/_app/with-trpc.tsx +20 -0
- package/templates/t3-app/extras/src/pages/_app/with-tw.tsx +18 -0
- package/templates/t3-app/extras/src/pages/api/auth/[...all].ts +8 -0
- package/templates/t3-app/extras/src/pages/api/trpc/[trpc].ts +19 -0
- package/templates/t3-app/extras/src/pages/index/base.tsx +47 -0
- package/templates/t3-app/extras/src/pages/index/with-auth-trpc-tw.tsx +81 -0
- package/templates/t3-app/extras/src/pages/index/with-auth-trpc.tsx +82 -0
- package/templates/t3-app/extras/src/pages/index/with-better-auth-trpc-tw.tsx +99 -0
- package/templates/t3-app/extras/src/pages/index/with-better-auth-trpc.tsx +100 -0
- package/templates/t3-app/extras/src/pages/index/with-better-auth-tw.tsx +87 -0
- package/templates/t3-app/extras/src/pages/index/with-better-auth.tsx +88 -0
- package/templates/t3-app/extras/src/pages/index/with-trpc-tw.tsx +52 -0
- package/templates/t3-app/extras/src/pages/index/with-trpc.tsx +53 -0
- package/templates/t3-app/extras/src/pages/index/with-tw.tsx +45 -0
- package/templates/t3-app/extras/src/server/api/root.ts +23 -0
- package/templates/t3-app/extras/src/server/api/routers/post/base.ts +40 -0
- package/templates/t3-app/extras/src/server/api/routers/post/with-auth-drizzle.ts +39 -0
- package/templates/t3-app/extras/src/server/api/routers/post/with-auth-prisma.ts +41 -0
- package/templates/t3-app/extras/src/server/api/routers/post/with-auth.ts +37 -0
- package/templates/t3-app/extras/src/server/api/routers/post/with-drizzle.ts +30 -0
- package/templates/t3-app/extras/src/server/api/routers/post/with-prisma.ts +31 -0
- package/templates/t3-app/extras/src/server/api/trpc-app/base.ts +103 -0
- package/templates/t3-app/extras/src/server/api/trpc-app/with-auth-db.ts +133 -0
- package/templates/t3-app/extras/src/server/api/trpc-app/with-auth.ts +130 -0
- package/templates/t3-app/extras/src/server/api/trpc-app/with-better-auth-db.ts +134 -0
- package/templates/t3-app/extras/src/server/api/trpc-app/with-better-auth.ts +131 -0
- package/templates/t3-app/extras/src/server/api/trpc-app/with-db.ts +106 -0
- package/templates/t3-app/extras/src/server/api/trpc-pages/base.ts +122 -0
- package/templates/t3-app/extras/src/server/api/trpc-pages/with-auth-db.ts +160 -0
- package/templates/t3-app/extras/src/server/api/trpc-pages/with-auth.ts +158 -0
- package/templates/t3-app/extras/src/server/api/trpc-pages/with-better-auth-db.ts +168 -0
- package/templates/t3-app/extras/src/server/api/trpc-pages/with-better-auth.ts +166 -0
- package/templates/t3-app/extras/src/server/api/trpc-pages/with-db.ts +125 -0
- package/templates/t3-app/extras/src/server/auth/config/base.ts +52 -0
- package/templates/t3-app/extras/src/server/auth/config/with-drizzle.ts +67 -0
- package/templates/t3-app/extras/src/server/auth/config/with-prisma.ts +56 -0
- package/templates/t3-app/extras/src/server/auth/index.ts +10 -0
- package/templates/t3-app/extras/src/server/better-auth/client.ts +5 -0
- package/templates/t3-app/extras/src/server/better-auth/config/base.ts +12 -0
- package/templates/t3-app/extras/src/server/better-auth/config/with-drizzle.ts +26 -0
- package/templates/t3-app/extras/src/server/better-auth/config/with-prisma.ts +26 -0
- package/templates/t3-app/extras/src/server/better-auth/index.ts +1 -0
- package/templates/t3-app/extras/src/server/better-auth/server.ts +7 -0
- package/templates/t3-app/extras/src/server/db/db-prisma-planetscale.ts +19 -0
- package/templates/t3-app/extras/src/server/db/db-prisma.ts +16 -0
- package/templates/t3-app/extras/src/server/db/index-drizzle/with-mysql.ts +18 -0
- package/templates/t3-app/extras/src/server/db/index-drizzle/with-planetscale.ts +7 -0
- package/templates/t3-app/extras/src/server/db/index-drizzle/with-postgres.ts +18 -0
- package/templates/t3-app/extras/src/server/db/index-drizzle/with-sqlite.ts +19 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/base-mysql.ts +26 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/base-planetscale.ts +26 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/base-postgres.ts +26 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/base-sqlite.ts +27 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/with-auth-mysql.ts +111 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/with-auth-planetscale.ts +100 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/with-auth-postgres.ts +108 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/with-auth-sqlite.ts +105 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/with-better-auth-mysql.ts +106 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/with-better-auth-planetscale.ts +106 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/with-better-auth-postgres.ts +105 -0
- package/templates/t3-app/extras/src/server/db/schema-drizzle/with-better-auth-sqlite.ts +134 -0
- package/templates/t3-app/extras/src/styles/globals.css +6 -0
- package/templates/t3-app/extras/src/trpc/query-client.ts +25 -0
- package/templates/t3-app/extras/src/trpc/react.tsx +78 -0
- package/templates/t3-app/extras/src/trpc/server.ts +30 -0
- package/templates/t3-app/extras/src/utils/api.ts +68 -0
- package/templates/t3-app/extras/start-database/mysql.sh +86 -0
- package/templates/t3-app/extras/start-database/postgres.sh +88 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
|
|
3
|
+
# Consolidated prerequisite checking script (PowerShell)
|
|
4
|
+
#
|
|
5
|
+
# This script provides unified prerequisite checking for Spec-Driven Development workflow.
|
|
6
|
+
# It replaces the functionality previously spread across multiple scripts.
|
|
7
|
+
#
|
|
8
|
+
# Usage: ./check-prerequisites.ps1 [OPTIONS]
|
|
9
|
+
#
|
|
10
|
+
# OPTIONS:
|
|
11
|
+
# -Json Output in JSON format
|
|
12
|
+
# -RequireTasks Require tasks.md to exist (for implementation phase)
|
|
13
|
+
# -IncludeTasks Include tasks.md in AVAILABLE_DOCS list
|
|
14
|
+
# -PathsOnly Only output path variables (no validation)
|
|
15
|
+
# -Help, -h Show help message
|
|
16
|
+
|
|
17
|
+
[CmdletBinding()]
|
|
18
|
+
param(
|
|
19
|
+
[switch]$Json,
|
|
20
|
+
[switch]$RequireTasks,
|
|
21
|
+
[switch]$IncludeTasks,
|
|
22
|
+
[switch]$PathsOnly,
|
|
23
|
+
[switch]$Help
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
$ErrorActionPreference = 'Stop'
|
|
27
|
+
|
|
28
|
+
# Show help if requested
|
|
29
|
+
if ($Help) {
|
|
30
|
+
Write-Output @"
|
|
31
|
+
Usage: check-prerequisites.ps1 [OPTIONS]
|
|
32
|
+
|
|
33
|
+
Consolidated prerequisite checking for Spec-Driven Development workflow.
|
|
34
|
+
|
|
35
|
+
OPTIONS:
|
|
36
|
+
-Json Output in JSON format
|
|
37
|
+
-RequireTasks Require tasks.md to exist (for implementation phase)
|
|
38
|
+
-IncludeTasks Include tasks.md in AVAILABLE_DOCS list
|
|
39
|
+
-PathsOnly Only output path variables (no prerequisite validation)
|
|
40
|
+
-Help, -h Show this help message
|
|
41
|
+
|
|
42
|
+
EXAMPLES:
|
|
43
|
+
# Check task prerequisites (plan.md required)
|
|
44
|
+
.\check-prerequisites.ps1 -Json
|
|
45
|
+
|
|
46
|
+
# Check implementation prerequisites (plan.md + tasks.md required)
|
|
47
|
+
.\check-prerequisites.ps1 -Json -RequireTasks -IncludeTasks
|
|
48
|
+
|
|
49
|
+
# Get feature paths only (no validation)
|
|
50
|
+
.\check-prerequisites.ps1 -PathsOnly
|
|
51
|
+
|
|
52
|
+
"@
|
|
53
|
+
exit 0
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Source common functions
|
|
57
|
+
. "$PSScriptRoot/common.ps1"
|
|
58
|
+
|
|
59
|
+
# Get feature paths and validate branch
|
|
60
|
+
$paths = Get-FeaturePathsEnv
|
|
61
|
+
|
|
62
|
+
if (-not (Test-FeatureBranch -Branch $paths.CURRENT_BRANCH -HasGit:$paths.HAS_GIT)) {
|
|
63
|
+
exit 1
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# If paths-only mode, output paths and exit (support combined -Json -PathsOnly)
|
|
67
|
+
if ($PathsOnly) {
|
|
68
|
+
if ($Json) {
|
|
69
|
+
[PSCustomObject]@{
|
|
70
|
+
REPO_ROOT = $paths.REPO_ROOT
|
|
71
|
+
BRANCH = $paths.CURRENT_BRANCH
|
|
72
|
+
FEATURE_DIR = $paths.FEATURE_DIR
|
|
73
|
+
FEATURE_SPEC = $paths.FEATURE_SPEC
|
|
74
|
+
IMPL_PLAN = $paths.IMPL_PLAN
|
|
75
|
+
TASKS = $paths.TASKS
|
|
76
|
+
} | ConvertTo-Json -Compress
|
|
77
|
+
} else {
|
|
78
|
+
Write-Output "REPO_ROOT: $($paths.REPO_ROOT)"
|
|
79
|
+
Write-Output "BRANCH: $($paths.CURRENT_BRANCH)"
|
|
80
|
+
Write-Output "FEATURE_DIR: $($paths.FEATURE_DIR)"
|
|
81
|
+
Write-Output "FEATURE_SPEC: $($paths.FEATURE_SPEC)"
|
|
82
|
+
Write-Output "IMPL_PLAN: $($paths.IMPL_PLAN)"
|
|
83
|
+
Write-Output "TASKS: $($paths.TASKS)"
|
|
84
|
+
}
|
|
85
|
+
exit 0
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# Validate required directories and files
|
|
89
|
+
if (-not (Test-Path $paths.FEATURE_DIR -PathType Container)) {
|
|
90
|
+
Write-Output "ERROR: Feature directory not found: $($paths.FEATURE_DIR)"
|
|
91
|
+
Write-Output "Run /speckit.specify first to create the feature structure."
|
|
92
|
+
exit 1
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (-not (Test-Path $paths.IMPL_PLAN -PathType Leaf)) {
|
|
96
|
+
Write-Output "ERROR: plan.md not found in $($paths.FEATURE_DIR)"
|
|
97
|
+
Write-Output "Run /speckit.plan first to create the implementation plan."
|
|
98
|
+
exit 1
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
# Check for tasks.md if required
|
|
102
|
+
if ($RequireTasks -and -not (Test-Path $paths.TASKS -PathType Leaf)) {
|
|
103
|
+
Write-Output "ERROR: tasks.md not found in $($paths.FEATURE_DIR)"
|
|
104
|
+
Write-Output "Run /speckit.tasks first to create the task list."
|
|
105
|
+
exit 1
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
# Build list of available documents
|
|
109
|
+
$docs = @()
|
|
110
|
+
|
|
111
|
+
# Always check these optional docs
|
|
112
|
+
if (Test-Path $paths.RESEARCH) { $docs += 'research.md' }
|
|
113
|
+
if (Test-Path $paths.DATA_MODEL) { $docs += 'data-model.md' }
|
|
114
|
+
|
|
115
|
+
# Check contracts directory (only if it exists and has files)
|
|
116
|
+
if ((Test-Path $paths.CONTRACTS_DIR) -and (Get-ChildItem -Path $paths.CONTRACTS_DIR -ErrorAction SilentlyContinue | Select-Object -First 1)) {
|
|
117
|
+
$docs += 'contracts/'
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (Test-Path $paths.QUICKSTART) { $docs += 'quickstart.md' }
|
|
121
|
+
|
|
122
|
+
# Include tasks.md if requested and it exists
|
|
123
|
+
if ($IncludeTasks -and (Test-Path $paths.TASKS)) {
|
|
124
|
+
$docs += 'tasks.md'
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# Output results
|
|
128
|
+
if ($Json) {
|
|
129
|
+
# JSON output
|
|
130
|
+
[PSCustomObject]@{
|
|
131
|
+
FEATURE_DIR = $paths.FEATURE_DIR
|
|
132
|
+
AVAILABLE_DOCS = $docs
|
|
133
|
+
} | ConvertTo-Json -Compress
|
|
134
|
+
} else {
|
|
135
|
+
# Text output
|
|
136
|
+
Write-Output "FEATURE_DIR:$($paths.FEATURE_DIR)"
|
|
137
|
+
Write-Output "AVAILABLE_DOCS:"
|
|
138
|
+
|
|
139
|
+
# Show status of each potential document
|
|
140
|
+
Test-FileExists -Path $paths.RESEARCH -Description 'research.md' | Out-Null
|
|
141
|
+
Test-FileExists -Path $paths.DATA_MODEL -Description 'data-model.md' | Out-Null
|
|
142
|
+
Test-DirHasFiles -Path $paths.CONTRACTS_DIR -Description 'contracts/' | Out-Null
|
|
143
|
+
Test-FileExists -Path $paths.QUICKSTART -Description 'quickstart.md' | Out-Null
|
|
144
|
+
|
|
145
|
+
if ($IncludeTasks) {
|
|
146
|
+
Test-FileExists -Path $paths.TASKS -Description 'tasks.md' | Out-Null
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
# Common PowerShell functions analogous to common.sh
|
|
3
|
+
|
|
4
|
+
function Get-RepoRoot {
|
|
5
|
+
try {
|
|
6
|
+
$result = git rev-parse --show-toplevel 2>$null
|
|
7
|
+
if ($LASTEXITCODE -eq 0) {
|
|
8
|
+
return $result
|
|
9
|
+
}
|
|
10
|
+
} catch {
|
|
11
|
+
# Git command failed
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
# Fall back to script location for non-git repos
|
|
15
|
+
return (Resolve-Path (Join-Path $PSScriptRoot "../../..")).Path
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function Get-CurrentBranch {
|
|
19
|
+
# First check if SPECIFY_FEATURE environment variable is set
|
|
20
|
+
if ($env:SPECIFY_FEATURE) {
|
|
21
|
+
return $env:SPECIFY_FEATURE
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# Then check git if available
|
|
25
|
+
try {
|
|
26
|
+
$result = git rev-parse --abbrev-ref HEAD 2>$null
|
|
27
|
+
if ($LASTEXITCODE -eq 0) {
|
|
28
|
+
return $result
|
|
29
|
+
}
|
|
30
|
+
} catch {
|
|
31
|
+
# Git command failed
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
# For non-git repos, try to find the latest feature directory
|
|
35
|
+
$repoRoot = Get-RepoRoot
|
|
36
|
+
$specsDir = Join-Path $repoRoot "specs"
|
|
37
|
+
|
|
38
|
+
if (Test-Path $specsDir) {
|
|
39
|
+
$latestFeature = ""
|
|
40
|
+
$highest = 0
|
|
41
|
+
|
|
42
|
+
Get-ChildItem -Path $specsDir -Directory | ForEach-Object {
|
|
43
|
+
if ($_.Name -match '^(\d{3})-') {
|
|
44
|
+
$num = [int]$matches[1]
|
|
45
|
+
if ($num -gt $highest) {
|
|
46
|
+
$highest = $num
|
|
47
|
+
$latestFeature = $_.Name
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if ($latestFeature) {
|
|
53
|
+
return $latestFeature
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# Final fallback
|
|
58
|
+
return "main"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function Test-HasGit {
|
|
62
|
+
try {
|
|
63
|
+
git rev-parse --show-toplevel 2>$null | Out-Null
|
|
64
|
+
return ($LASTEXITCODE -eq 0)
|
|
65
|
+
} catch {
|
|
66
|
+
return $false
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function Test-FeatureBranch {
|
|
71
|
+
param(
|
|
72
|
+
[string]$Branch,
|
|
73
|
+
[bool]$HasGit = $true
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# For non-git repos, we can't enforce branch naming but still provide output
|
|
77
|
+
if (-not $HasGit) {
|
|
78
|
+
Write-Warning "[specify] Warning: Git repository not detected; skipped branch validation"
|
|
79
|
+
return $true
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if ($Branch -notmatch '^[0-9]{3}-') {
|
|
83
|
+
Write-Output "ERROR: Not on a feature branch. Current branch: $Branch"
|
|
84
|
+
Write-Output "Feature branches should be named like: 001-feature-name"
|
|
85
|
+
return $false
|
|
86
|
+
}
|
|
87
|
+
return $true
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function Get-FeatureDir {
|
|
91
|
+
param([string]$RepoRoot, [string]$Branch)
|
|
92
|
+
Join-Path $RepoRoot "specs/$Branch"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function Get-FeaturePathsEnv {
|
|
96
|
+
$repoRoot = Get-RepoRoot
|
|
97
|
+
$currentBranch = Get-CurrentBranch
|
|
98
|
+
$hasGit = Test-HasGit
|
|
99
|
+
$featureDir = Get-FeatureDir -RepoRoot $repoRoot -Branch $currentBranch
|
|
100
|
+
|
|
101
|
+
[PSCustomObject]@{
|
|
102
|
+
REPO_ROOT = $repoRoot
|
|
103
|
+
CURRENT_BRANCH = $currentBranch
|
|
104
|
+
HAS_GIT = $hasGit
|
|
105
|
+
FEATURE_DIR = $featureDir
|
|
106
|
+
FEATURE_SPEC = Join-Path $featureDir 'spec.md'
|
|
107
|
+
IMPL_PLAN = Join-Path $featureDir 'plan.md'
|
|
108
|
+
TASKS = Join-Path $featureDir 'tasks.md'
|
|
109
|
+
RESEARCH = Join-Path $featureDir 'research.md'
|
|
110
|
+
DATA_MODEL = Join-Path $featureDir 'data-model.md'
|
|
111
|
+
QUICKSTART = Join-Path $featureDir 'quickstart.md'
|
|
112
|
+
CONTRACTS_DIR = Join-Path $featureDir 'contracts'
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function Test-FileExists {
|
|
117
|
+
param([string]$Path, [string]$Description)
|
|
118
|
+
if (Test-Path -Path $Path -PathType Leaf) {
|
|
119
|
+
Write-Output " ✓ $Description"
|
|
120
|
+
return $true
|
|
121
|
+
} else {
|
|
122
|
+
Write-Output " ✗ $Description"
|
|
123
|
+
return $false
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function Test-DirHasFiles {
|
|
128
|
+
param([string]$Path, [string]$Description)
|
|
129
|
+
if ((Test-Path -Path $Path -PathType Container) -and (Get-ChildItem -Path $Path -ErrorAction SilentlyContinue | Where-Object { -not $_.PSIsContainer } | Select-Object -First 1)) {
|
|
130
|
+
Write-Output " ✓ $Description"
|
|
131
|
+
return $true
|
|
132
|
+
} else {
|
|
133
|
+
Write-Output " ✗ $Description"
|
|
134
|
+
return $false
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
# Create a new feature
|
|
3
|
+
[CmdletBinding()]
|
|
4
|
+
param(
|
|
5
|
+
[switch]$Json,
|
|
6
|
+
[string]$ShortName,
|
|
7
|
+
[int]$Number = 0,
|
|
8
|
+
[switch]$Help,
|
|
9
|
+
[Parameter(ValueFromRemainingArguments = $true)]
|
|
10
|
+
[string[]]$FeatureDescription
|
|
11
|
+
)
|
|
12
|
+
$ErrorActionPreference = 'Stop'
|
|
13
|
+
|
|
14
|
+
# Show help if requested
|
|
15
|
+
if ($Help) {
|
|
16
|
+
Write-Host "Usage: ./create-new-feature.ps1 [-Json] [-ShortName <name>] [-Number N] <feature description>"
|
|
17
|
+
Write-Host ""
|
|
18
|
+
Write-Host "Options:"
|
|
19
|
+
Write-Host " -Json Output in JSON format"
|
|
20
|
+
Write-Host " -ShortName <name> Provide a custom short name (2-4 words) for the branch"
|
|
21
|
+
Write-Host " -Number N Specify branch number manually (overrides auto-detection)"
|
|
22
|
+
Write-Host " -Help Show this help message"
|
|
23
|
+
Write-Host ""
|
|
24
|
+
Write-Host "Examples:"
|
|
25
|
+
Write-Host " ./create-new-feature.ps1 'Add user authentication system' -ShortName 'user-auth'"
|
|
26
|
+
Write-Host " ./create-new-feature.ps1 'Implement OAuth2 integration for API'"
|
|
27
|
+
exit 0
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# Check if feature description provided
|
|
31
|
+
if (-not $FeatureDescription -or $FeatureDescription.Count -eq 0) {
|
|
32
|
+
Write-Error "Usage: ./create-new-feature.ps1 [-Json] [-ShortName <name>] <feature description>"
|
|
33
|
+
exit 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
$featureDesc = ($FeatureDescription -join ' ').Trim()
|
|
37
|
+
|
|
38
|
+
# Resolve repository root. Prefer git information when available, but fall back
|
|
39
|
+
# to searching for repository markers so the workflow still functions in repositories that
|
|
40
|
+
# were initialized with --no-git.
|
|
41
|
+
function Find-RepositoryRoot {
|
|
42
|
+
param(
|
|
43
|
+
[string]$StartDir,
|
|
44
|
+
[string[]]$Markers = @('.git', '.specify')
|
|
45
|
+
)
|
|
46
|
+
$current = Resolve-Path $StartDir
|
|
47
|
+
while ($true) {
|
|
48
|
+
foreach ($marker in $Markers) {
|
|
49
|
+
if (Test-Path (Join-Path $current $marker)) {
|
|
50
|
+
return $current
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
$parent = Split-Path $current -Parent
|
|
54
|
+
if ($parent -eq $current) {
|
|
55
|
+
# Reached filesystem root without finding markers
|
|
56
|
+
return $null
|
|
57
|
+
}
|
|
58
|
+
$current = $parent
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function Get-HighestNumberFromSpecs {
|
|
63
|
+
param([string]$SpecsDir)
|
|
64
|
+
|
|
65
|
+
$highest = 0
|
|
66
|
+
if (Test-Path $SpecsDir) {
|
|
67
|
+
Get-ChildItem -Path $SpecsDir -Directory | ForEach-Object {
|
|
68
|
+
if ($_.Name -match '^(\d+)') {
|
|
69
|
+
$num = [int]$matches[1]
|
|
70
|
+
if ($num -gt $highest) { $highest = $num }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return $highest
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function Get-HighestNumberFromBranches {
|
|
78
|
+
param()
|
|
79
|
+
|
|
80
|
+
$highest = 0
|
|
81
|
+
try {
|
|
82
|
+
$branches = git branch -a 2>$null
|
|
83
|
+
if ($LASTEXITCODE -eq 0) {
|
|
84
|
+
foreach ($branch in $branches) {
|
|
85
|
+
# Clean branch name: remove leading markers and remote prefixes
|
|
86
|
+
$cleanBranch = $branch.Trim() -replace '^\*?\s+', '' -replace '^remotes/[^/]+/', ''
|
|
87
|
+
|
|
88
|
+
# Extract feature number if branch matches pattern ###-*
|
|
89
|
+
if ($cleanBranch -match '^(\d+)-') {
|
|
90
|
+
$num = [int]$matches[1]
|
|
91
|
+
if ($num -gt $highest) { $highest = $num }
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
} catch {
|
|
96
|
+
# If git command fails, return 0
|
|
97
|
+
Write-Verbose "Could not check Git branches: $_"
|
|
98
|
+
}
|
|
99
|
+
return $highest
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function Get-NextBranchNumber {
|
|
103
|
+
param(
|
|
104
|
+
[string]$SpecsDir
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Fetch all remotes to get latest branch info (suppress errors if no remotes)
|
|
108
|
+
try {
|
|
109
|
+
git fetch --all --prune 2>$null | Out-Null
|
|
110
|
+
} catch {
|
|
111
|
+
# Ignore fetch errors
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# Get highest number from ALL branches (not just matching short name)
|
|
115
|
+
$highestBranch = Get-HighestNumberFromBranches
|
|
116
|
+
|
|
117
|
+
# Get highest number from ALL specs (not just matching short name)
|
|
118
|
+
$highestSpec = Get-HighestNumberFromSpecs -SpecsDir $SpecsDir
|
|
119
|
+
|
|
120
|
+
# Take the maximum of both
|
|
121
|
+
$maxNum = [Math]::Max($highestBranch, $highestSpec)
|
|
122
|
+
|
|
123
|
+
# Return next number
|
|
124
|
+
return $maxNum + 1
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function ConvertTo-CleanBranchName {
|
|
128
|
+
param([string]$Name)
|
|
129
|
+
|
|
130
|
+
return $Name.ToLower() -replace '[^a-z0-9]', '-' -replace '-{2,}', '-' -replace '^-', '' -replace '-$', ''
|
|
131
|
+
}
|
|
132
|
+
$fallbackRoot = (Find-RepositoryRoot -StartDir $PSScriptRoot)
|
|
133
|
+
if (-not $fallbackRoot) {
|
|
134
|
+
Write-Error "Error: Could not determine repository root. Please run this script from within the repository."
|
|
135
|
+
exit 1
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
$repoRoot = git rev-parse --show-toplevel 2>$null
|
|
140
|
+
if ($LASTEXITCODE -eq 0) {
|
|
141
|
+
$hasGit = $true
|
|
142
|
+
} else {
|
|
143
|
+
throw "Git not available"
|
|
144
|
+
}
|
|
145
|
+
} catch {
|
|
146
|
+
$repoRoot = $fallbackRoot
|
|
147
|
+
$hasGit = $false
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
Set-Location $repoRoot
|
|
151
|
+
|
|
152
|
+
$specsDir = Join-Path $repoRoot 'specs'
|
|
153
|
+
New-Item -ItemType Directory -Path $specsDir -Force | Out-Null
|
|
154
|
+
|
|
155
|
+
# Function to generate branch name with stop word filtering and length filtering
|
|
156
|
+
function Get-BranchName {
|
|
157
|
+
param([string]$Description)
|
|
158
|
+
|
|
159
|
+
# Common stop words to filter out
|
|
160
|
+
$stopWords = @(
|
|
161
|
+
'i', 'a', 'an', 'the', 'to', 'for', 'of', 'in', 'on', 'at', 'by', 'with', 'from',
|
|
162
|
+
'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had',
|
|
163
|
+
'do', 'does', 'did', 'will', 'would', 'should', 'could', 'can', 'may', 'might', 'must', 'shall',
|
|
164
|
+
'this', 'that', 'these', 'those', 'my', 'your', 'our', 'their',
|
|
165
|
+
'want', 'need', 'add', 'get', 'set'
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Convert to lowercase and extract words (alphanumeric only)
|
|
169
|
+
$cleanName = $Description.ToLower() -replace '[^a-z0-9\s]', ' '
|
|
170
|
+
$words = $cleanName -split '\s+' | Where-Object { $_ }
|
|
171
|
+
|
|
172
|
+
# Filter words: remove stop words and words shorter than 3 chars (unless they're uppercase acronyms in original)
|
|
173
|
+
$meaningfulWords = @()
|
|
174
|
+
foreach ($word in $words) {
|
|
175
|
+
# Skip stop words
|
|
176
|
+
if ($stopWords -contains $word) { continue }
|
|
177
|
+
|
|
178
|
+
# Keep words that are length >= 3 OR appear as uppercase in original (likely acronyms)
|
|
179
|
+
if ($word.Length -ge 3) {
|
|
180
|
+
$meaningfulWords += $word
|
|
181
|
+
} elseif ($Description -match "\b$($word.ToUpper())\b") {
|
|
182
|
+
# Keep short words if they appear as uppercase in original (likely acronyms)
|
|
183
|
+
$meaningfulWords += $word
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
# If we have meaningful words, use first 3-4 of them
|
|
188
|
+
if ($meaningfulWords.Count -gt 0) {
|
|
189
|
+
$maxWords = if ($meaningfulWords.Count -eq 4) { 4 } else { 3 }
|
|
190
|
+
$result = ($meaningfulWords | Select-Object -First $maxWords) -join '-'
|
|
191
|
+
return $result
|
|
192
|
+
} else {
|
|
193
|
+
# Fallback to original logic if no meaningful words found
|
|
194
|
+
$result = ConvertTo-CleanBranchName -Name $Description
|
|
195
|
+
$fallbackWords = ($result -split '-') | Where-Object { $_ } | Select-Object -First 3
|
|
196
|
+
return [string]::Join('-', $fallbackWords)
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
# Generate branch name
|
|
201
|
+
if ($ShortName) {
|
|
202
|
+
# Use provided short name, just clean it up
|
|
203
|
+
$branchSuffix = ConvertTo-CleanBranchName -Name $ShortName
|
|
204
|
+
} else {
|
|
205
|
+
# Generate from description with smart filtering
|
|
206
|
+
$branchSuffix = Get-BranchName -Description $featureDesc
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
# Determine branch number
|
|
210
|
+
if ($Number -eq 0) {
|
|
211
|
+
if ($hasGit) {
|
|
212
|
+
# Check existing branches on remotes
|
|
213
|
+
$Number = Get-NextBranchNumber -SpecsDir $specsDir
|
|
214
|
+
} else {
|
|
215
|
+
# Fall back to local directory check
|
|
216
|
+
$Number = (Get-HighestNumberFromSpecs -SpecsDir $specsDir) + 1
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
$featureNum = ('{0:000}' -f $Number)
|
|
221
|
+
$branchName = "$featureNum-$branchSuffix"
|
|
222
|
+
|
|
223
|
+
# GitHub enforces a 244-byte limit on branch names
|
|
224
|
+
# Validate and truncate if necessary
|
|
225
|
+
$maxBranchLength = 244
|
|
226
|
+
if ($branchName.Length -gt $maxBranchLength) {
|
|
227
|
+
# Calculate how much we need to trim from suffix
|
|
228
|
+
# Account for: feature number (3) + hyphen (1) = 4 chars
|
|
229
|
+
$maxSuffixLength = $maxBranchLength - 4
|
|
230
|
+
|
|
231
|
+
# Truncate suffix
|
|
232
|
+
$truncatedSuffix = $branchSuffix.Substring(0, [Math]::Min($branchSuffix.Length, $maxSuffixLength))
|
|
233
|
+
# Remove trailing hyphen if truncation created one
|
|
234
|
+
$truncatedSuffix = $truncatedSuffix -replace '-$', ''
|
|
235
|
+
|
|
236
|
+
$originalBranchName = $branchName
|
|
237
|
+
$branchName = "$featureNum-$truncatedSuffix"
|
|
238
|
+
|
|
239
|
+
Write-Warning "[specify] Branch name exceeded GitHub's 244-byte limit"
|
|
240
|
+
Write-Warning "[specify] Original: $originalBranchName ($($originalBranchName.Length) bytes)"
|
|
241
|
+
Write-Warning "[specify] Truncated to: $branchName ($($branchName.Length) bytes)"
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if ($hasGit) {
|
|
245
|
+
try {
|
|
246
|
+
git checkout -b $branchName | Out-Null
|
|
247
|
+
} catch {
|
|
248
|
+
Write-Warning "Failed to create git branch: $branchName"
|
|
249
|
+
}
|
|
250
|
+
} else {
|
|
251
|
+
Write-Warning "[specify] Warning: Git repository not detected; skipped branch creation for $branchName"
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
$featureDir = Join-Path $specsDir $branchName
|
|
255
|
+
New-Item -ItemType Directory -Path $featureDir -Force | Out-Null
|
|
256
|
+
|
|
257
|
+
$template = Join-Path $repoRoot '.specify/templates/spec-template.md'
|
|
258
|
+
$specFile = Join-Path $featureDir 'spec.md'
|
|
259
|
+
if (Test-Path $template) {
|
|
260
|
+
Copy-Item $template $specFile -Force
|
|
261
|
+
} else {
|
|
262
|
+
New-Item -ItemType File -Path $specFile | Out-Null
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
# Set the SPECIFY_FEATURE environment variable for the current session
|
|
266
|
+
$env:SPECIFY_FEATURE = $branchName
|
|
267
|
+
|
|
268
|
+
if ($Json) {
|
|
269
|
+
$obj = [PSCustomObject]@{
|
|
270
|
+
BRANCH_NAME = $branchName
|
|
271
|
+
SPEC_FILE = $specFile
|
|
272
|
+
FEATURE_NUM = $featureNum
|
|
273
|
+
HAS_GIT = $hasGit
|
|
274
|
+
}
|
|
275
|
+
$obj | ConvertTo-Json -Compress
|
|
276
|
+
} else {
|
|
277
|
+
Write-Output "BRANCH_NAME: $branchName"
|
|
278
|
+
Write-Output "SPEC_FILE: $specFile"
|
|
279
|
+
Write-Output "FEATURE_NUM: $featureNum"
|
|
280
|
+
Write-Output "HAS_GIT: $hasGit"
|
|
281
|
+
Write-Output "SPECIFY_FEATURE environment variable set to: $branchName"
|
|
282
|
+
}
|
|
283
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
# Setup implementation plan for a feature
|
|
3
|
+
|
|
4
|
+
[CmdletBinding()]
|
|
5
|
+
param(
|
|
6
|
+
[switch]$Json,
|
|
7
|
+
[switch]$Help
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
$ErrorActionPreference = 'Stop'
|
|
11
|
+
|
|
12
|
+
# Show help if requested
|
|
13
|
+
if ($Help) {
|
|
14
|
+
Write-Output "Usage: ./setup-plan.ps1 [-Json] [-Help]"
|
|
15
|
+
Write-Output " -Json Output results in JSON format"
|
|
16
|
+
Write-Output " -Help Show this help message"
|
|
17
|
+
exit 0
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
# Load common functions
|
|
21
|
+
. "$PSScriptRoot/common.ps1"
|
|
22
|
+
|
|
23
|
+
# Get all paths and variables from common functions
|
|
24
|
+
$paths = Get-FeaturePathsEnv
|
|
25
|
+
|
|
26
|
+
# Check if we're on a proper feature branch (only for git repos)
|
|
27
|
+
if (-not (Test-FeatureBranch -Branch $paths.CURRENT_BRANCH -HasGit $paths.HAS_GIT)) {
|
|
28
|
+
exit 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Ensure the feature directory exists
|
|
32
|
+
New-Item -ItemType Directory -Path $paths.FEATURE_DIR -Force | Out-Null
|
|
33
|
+
|
|
34
|
+
# Copy plan template if it exists, otherwise note it or create empty file
|
|
35
|
+
$template = Join-Path $paths.REPO_ROOT '.specify/templates/plan-template.md'
|
|
36
|
+
if (Test-Path $template) {
|
|
37
|
+
Copy-Item $template $paths.IMPL_PLAN -Force
|
|
38
|
+
Write-Output "Copied plan template to $($paths.IMPL_PLAN)"
|
|
39
|
+
} else {
|
|
40
|
+
Write-Warning "Plan template not found at $template"
|
|
41
|
+
# Create a basic plan file if template doesn't exist
|
|
42
|
+
New-Item -ItemType File -Path $paths.IMPL_PLAN -Force | Out-Null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# Output results
|
|
46
|
+
if ($Json) {
|
|
47
|
+
$result = [PSCustomObject]@{
|
|
48
|
+
FEATURE_SPEC = $paths.FEATURE_SPEC
|
|
49
|
+
IMPL_PLAN = $paths.IMPL_PLAN
|
|
50
|
+
SPECS_DIR = $paths.FEATURE_DIR
|
|
51
|
+
BRANCH = $paths.CURRENT_BRANCH
|
|
52
|
+
HAS_GIT = $paths.HAS_GIT
|
|
53
|
+
}
|
|
54
|
+
$result | ConvertTo-Json -Compress
|
|
55
|
+
} else {
|
|
56
|
+
Write-Output "FEATURE_SPEC: $($paths.FEATURE_SPEC)"
|
|
57
|
+
Write-Output "IMPL_PLAN: $($paths.IMPL_PLAN)"
|
|
58
|
+
Write-Output "SPECS_DIR: $($paths.FEATURE_DIR)"
|
|
59
|
+
Write-Output "BRANCH: $($paths.CURRENT_BRANCH)"
|
|
60
|
+
Write-Output "HAS_GIT: $($paths.HAS_GIT)"
|
|
61
|
+
}
|