@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,390 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
import { promptProjectName, promptTemplate, promptQualityPreset, promptGitHubConfig, promptMCPScope, confirmBootstrap } from '../utils/prompts.js';
|
|
4
|
+
import { validateProjectName, validateTemplate, validateQualityPreset, validateMCPScope } from '../utils/validators.js';
|
|
5
|
+
import { validateProjectDirectory } from '../utils/validators.js';
|
|
6
|
+
import { initGitRepository } from '../utils/git.js';
|
|
7
|
+
import { generateProjectStructure } from '../generators/project-structure.js';
|
|
8
|
+
import { generateBossConfig } from '../generators/boss-config.js';
|
|
9
|
+
import { copySpecKitStructure } from '../generators/specify-structure.js';
|
|
10
|
+
import { generateContainerUseConfig } from '../generators/container-use-config.js';
|
|
11
|
+
import { generateWorkerConfigs } from '../generators/worker-configs.js';
|
|
12
|
+
import { generateQualityGates } from '../generators/quality-gates.js';
|
|
13
|
+
import { generateMCPConfig } from '../generators/mcp-config.js';
|
|
14
|
+
import { generateGitHubWorkflows } from '../generators/github-workflows.js';
|
|
15
|
+
import { generateGitHooks } from '../generators/git-hooks.js';
|
|
16
|
+
import { generateDockerCompose } from '../generators/docker-compose.js';
|
|
17
|
+
import { generateClaudeMD } from '../generators/claude-md.js';
|
|
18
|
+
import { generateClaudeFolder } from '../generators/claude-folder.js';
|
|
19
|
+
import { generateStartBossScript } from '../generators/start-boss-sh.js';
|
|
20
|
+
import { loadTemplate } from '../generators/template-loader.js';
|
|
21
|
+
import { generateTemplateDocs } from '../generators/template-docs.js';
|
|
22
|
+
import { applyQualityPreset } from '../presets/quality-presets.js';
|
|
23
|
+
import { addFiles, commit, createBranch } from '../utils/git.js';
|
|
24
|
+
import { execa } from 'execa';
|
|
25
|
+
export async function bootstrapCommand(options) {
|
|
26
|
+
logger.section('🤖 BOSS Bootstrap');
|
|
27
|
+
// Collect configuration
|
|
28
|
+
const config = await collectConfiguration(options);
|
|
29
|
+
// Validate project directory
|
|
30
|
+
const projectPath = options.projectPath || path.resolve(process.cwd(), config.name);
|
|
31
|
+
const dirValidation = await validateProjectDirectory(projectPath);
|
|
32
|
+
if (!dirValidation.valid) {
|
|
33
|
+
logger.error(dirValidation.error || 'Invalid project directory');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
// Confirm before proceeding
|
|
37
|
+
const confirmed = await confirmBootstrap(config, options.nonInteractive || false);
|
|
38
|
+
if (!confirmed) {
|
|
39
|
+
logger.info('Bootstrap cancelled');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Create project directory
|
|
43
|
+
logger.startSpinner('Creating project directory...');
|
|
44
|
+
const { ensureDirectory } = await import('../utils/file-system.js');
|
|
45
|
+
await ensureDirectory(projectPath);
|
|
46
|
+
logger.stopSpinner(true, 'Project directory created');
|
|
47
|
+
try {
|
|
48
|
+
// Initialize git repository
|
|
49
|
+
await initGitRepository(projectPath);
|
|
50
|
+
// Copy Spec-Kit from CLI bundle
|
|
51
|
+
logger.startSpinner('Copying Spec-Kit structure...');
|
|
52
|
+
await copySpecKitStructure(projectPath);
|
|
53
|
+
logger.stopSpinner(true, 'Spec-Kit structure copied');
|
|
54
|
+
// Generate project structure
|
|
55
|
+
logger.startSpinner('Generating project structure...');
|
|
56
|
+
await generateProjectStructure(projectPath, config);
|
|
57
|
+
logger.stopSpinner(true, 'Project structure generated');
|
|
58
|
+
// Generate BOSS config
|
|
59
|
+
logger.startSpinner('Generating BOSS configuration...');
|
|
60
|
+
await generateBossConfig(projectPath, config);
|
|
61
|
+
logger.stopSpinner(true, 'BOSS configuration generated');
|
|
62
|
+
// Generate container-use config
|
|
63
|
+
logger.startSpinner('Generating container-use configuration...');
|
|
64
|
+
await generateContainerUseConfig(projectPath);
|
|
65
|
+
logger.stopSpinner(true, 'Container-use configuration generated');
|
|
66
|
+
// Generate worker configs
|
|
67
|
+
logger.startSpinner('Generating worker configurations...');
|
|
68
|
+
await generateWorkerConfigs(projectPath, config);
|
|
69
|
+
logger.stopSpinner(true, 'Worker configurations generated');
|
|
70
|
+
// Apply quality preset
|
|
71
|
+
logger.startSpinner('Applying quality preset...');
|
|
72
|
+
await applyQualityPreset(projectPath, config.quality);
|
|
73
|
+
logger.stopSpinner(true, 'Quality preset applied');
|
|
74
|
+
// Generate quality gates
|
|
75
|
+
logger.startSpinner('Generating quality gates...');
|
|
76
|
+
await generateQualityGates(projectPath, config.quality);
|
|
77
|
+
logger.stopSpinner(true, 'Quality gates generated');
|
|
78
|
+
// Generate MCP config
|
|
79
|
+
logger.startSpinner('Generating MCP configuration...');
|
|
80
|
+
let mcpScope = 'both';
|
|
81
|
+
if (options.mcpScope) {
|
|
82
|
+
const validation = validateMCPScope(options.mcpScope);
|
|
83
|
+
if (!validation.valid) {
|
|
84
|
+
logger.error(validation.error || 'Invalid MCP scope');
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
mcpScope = options.mcpScope;
|
|
88
|
+
}
|
|
89
|
+
else if (!options.nonInteractive) {
|
|
90
|
+
mcpScope = await promptMCPScope();
|
|
91
|
+
}
|
|
92
|
+
await generateMCPConfig(projectPath, mcpScope);
|
|
93
|
+
logger.stopSpinner(true, 'MCP configuration generated');
|
|
94
|
+
// Generate GitHub workflows
|
|
95
|
+
logger.startSpinner('Generating GitHub workflows...');
|
|
96
|
+
await generateGitHubWorkflows(projectPath, config);
|
|
97
|
+
logger.stopSpinner(true, 'GitHub workflows generated');
|
|
98
|
+
// Generate git hooks (creates .husky/ directory and hook files)
|
|
99
|
+
logger.startSpinner('Generating git hooks...');
|
|
100
|
+
await generateGitHooks(projectPath, config.quality);
|
|
101
|
+
logger.stopSpinner(true, 'Git hooks generated');
|
|
102
|
+
// Generate Docker Compose
|
|
103
|
+
logger.startSpinner('Generating Docker Compose...');
|
|
104
|
+
await generateDockerCompose(projectPath);
|
|
105
|
+
logger.stopSpinner(true, 'Docker Compose generated');
|
|
106
|
+
// Generate critical files
|
|
107
|
+
logger.startSpinner('Generating critical files...');
|
|
108
|
+
await generateClaudeMD(projectPath, config);
|
|
109
|
+
await generateClaudeFolder(projectPath, config);
|
|
110
|
+
await generateStartBossScript(projectPath);
|
|
111
|
+
logger.stopSpinner(true, 'Critical files generated');
|
|
112
|
+
// Load and apply template (includes package.json with husky dependency and prepare script)
|
|
113
|
+
logger.startSpinner(`Loading template: ${config.template}...`);
|
|
114
|
+
await loadTemplate(projectPath, config.template, config);
|
|
115
|
+
logger.stopSpinner(true, 'Template applied');
|
|
116
|
+
// Initialize Husky after package.json exists (package.json has husky and prepare script)
|
|
117
|
+
logger.startSpinner('Initializing Husky git hooks...');
|
|
118
|
+
await initializeHuskyAfterPackageJson(projectPath);
|
|
119
|
+
logger.stopSpinner(true, 'Husky initialized');
|
|
120
|
+
// Generate template documentation
|
|
121
|
+
logger.startSpinner('Generating template documentation...');
|
|
122
|
+
await generateTemplateDocs(projectPath, config);
|
|
123
|
+
logger.stopSpinner(true, 'Template documentation generated');
|
|
124
|
+
// CRITICAL: Commit empty main branch FIRST (before any files)
|
|
125
|
+
// Main branch must be pushed empty first, then all files go via feature branch/PR
|
|
126
|
+
logger.startSpinner('Creating empty initial commit on main branch...');
|
|
127
|
+
const gitEnv = {
|
|
128
|
+
...process.env,
|
|
129
|
+
GIT_AUTHOR_NAME: 'The BOSS',
|
|
130
|
+
GIT_AUTHOR_EMAIL: 'boss@glxmart.com',
|
|
131
|
+
GIT_COMMITTER_NAME: 'The BOSS',
|
|
132
|
+
GIT_COMMITTER_EMAIL: 'boss@glxmart.com'
|
|
133
|
+
};
|
|
134
|
+
// Use --no-verify to skip hooks (dependencies aren't installed yet)
|
|
135
|
+
await execa('git', ['commit', '--allow-empty', '-m', 'chore: initial empty commit', '--no-verify'], {
|
|
136
|
+
cwd: projectPath,
|
|
137
|
+
env: gitEnv
|
|
138
|
+
});
|
|
139
|
+
logger.stopSpinner(true, 'Empty main branch committed');
|
|
140
|
+
// CRITICAL: Create feature/boss-initial-setup branch BEFORE committing files
|
|
141
|
+
// All bootstrap files will be committed to feature branch, not main
|
|
142
|
+
logger.startSpinner('Creating feature/boss-initial-setup branch...');
|
|
143
|
+
await createInitialSetupBranch(projectPath);
|
|
144
|
+
logger.stopSpinner(true, 'Feature branch created');
|
|
145
|
+
// CRITICAL: Ensure test file exists (required for pre-push hook on feature branch)
|
|
146
|
+
logger.startSpinner('Ensuring test file exists...');
|
|
147
|
+
await ensureTestFileExists(projectPath, config);
|
|
148
|
+
logger.stopSpinner(true, 'Test file ensured');
|
|
149
|
+
// CRITICAL: Commit ALL bootstrap files to feature branch (NOT main)
|
|
150
|
+
// Main branch stays empty - all files go via feature branch/PR
|
|
151
|
+
logger.startSpinner('Committing all bootstrap files to feature branch...');
|
|
152
|
+
await addFiles(projectPath, ['.']);
|
|
153
|
+
// Verify test file is included before committing
|
|
154
|
+
const { stdout: testFileCheck } = await execa('git', ['ls-files'], { cwd: projectPath });
|
|
155
|
+
const hasTestFile = /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(testFileCheck);
|
|
156
|
+
if (!hasTestFile) {
|
|
157
|
+
logger.warning('No test files found in staged files. Re-checking...');
|
|
158
|
+
// Re-ensure test file exists
|
|
159
|
+
await ensureTestFileExists(projectPath, config);
|
|
160
|
+
await addFiles(projectPath, ['tests/']);
|
|
161
|
+
}
|
|
162
|
+
await commit(projectPath, 'chore: BOSS bootstrap - initial project structure');
|
|
163
|
+
logger.stopSpinner(true, 'All bootstrap files committed to feature branch');
|
|
164
|
+
// Success message
|
|
165
|
+
logger.section('✅ Bootstrap Complete!');
|
|
166
|
+
logger.success(`Project "${config.name}" has been bootstrapped successfully!`);
|
|
167
|
+
logger.info(`\nNext steps:`);
|
|
168
|
+
logger.info(` 1. cd ${config.name}`);
|
|
169
|
+
logger.info(` 2. pnpm install (installs dependencies and initializes Husky via prepare script)`);
|
|
170
|
+
logger.info(` 3. docker-compose up -d`);
|
|
171
|
+
logger.info(` 4. Open project in Claude Code/Cursor`);
|
|
172
|
+
logger.info(` 5. Run: ./start-boss.sh`);
|
|
173
|
+
logger.info(` 6. BOSS will complete initial setup (GitHub repo, remote, branch protection, etc.)`);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
logger.error(`Bootstrap failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function initializeHuskyAfterPackageJson(projectPath) {
|
|
181
|
+
try {
|
|
182
|
+
// Run husky to set up git hooks in .git/hooks directory (husky v9+ uses 'husky' instead of 'husky install')
|
|
183
|
+
// This works even if husky isn't installed yet (npx downloads it temporarily)
|
|
184
|
+
// After pnpm install, the prepare script will ensure husky is properly installed
|
|
185
|
+
await execa('npx', ['husky'], {
|
|
186
|
+
cwd: projectPath,
|
|
187
|
+
stdio: 'pipe'
|
|
188
|
+
});
|
|
189
|
+
// Husky initialized successfully (silent success)
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
// If husky is not available, log warning but continue
|
|
193
|
+
// The hooks are in .husky/ directory and prepare script will install them when dependencies are installed
|
|
194
|
+
logger.warning('Husky initialization skipped (husky not available via npx).');
|
|
195
|
+
logger.warning('Hooks are in .husky/ directory. Run "pnpm install" to activate hooks (prepare script will run husky).');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async function ensureTestFileExists(projectPath, config) {
|
|
199
|
+
// NOTE: Dynamic import of fs-extra requires accessing .default
|
|
200
|
+
// See: docs/common-issues.md for details
|
|
201
|
+
const fsModule = await import('fs-extra');
|
|
202
|
+
const fs = fsModule.default;
|
|
203
|
+
const { writeFile } = await import('../utils/file-system.js');
|
|
204
|
+
const { loadTemplate: loadAssetTemplate } = await import('../utils/template-loader.js');
|
|
205
|
+
// Check if any test files exist
|
|
206
|
+
const testsDir = path.join(projectPath, 'tests');
|
|
207
|
+
let hasTestFile = false;
|
|
208
|
+
if (await fs.pathExists(testsDir)) {
|
|
209
|
+
const files = await fs.readdir(testsDir, { recursive: true });
|
|
210
|
+
hasTestFile = files.some((f) => {
|
|
211
|
+
return /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(f);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
// Also check root and src directories
|
|
215
|
+
if (!hasTestFile) {
|
|
216
|
+
try {
|
|
217
|
+
const rootFiles = await fs.readdir(projectPath);
|
|
218
|
+
hasTestFile = rootFiles.some((f) => {
|
|
219
|
+
return /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(f);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Ignore errors
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (!hasTestFile) {
|
|
227
|
+
const srcDir = path.join(projectPath, 'src');
|
|
228
|
+
if (await fs.pathExists(srcDir)) {
|
|
229
|
+
try {
|
|
230
|
+
const srcFiles = await fs.readdir(srcDir, { recursive: true });
|
|
231
|
+
hasTestFile = srcFiles.some((f) => {
|
|
232
|
+
return /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(f);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// Ignore errors
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// If no test file exists, create a minimal one
|
|
241
|
+
if (!hasTestFile) {
|
|
242
|
+
await fs.ensureDir(testsDir);
|
|
243
|
+
try {
|
|
244
|
+
// Try to load the template test file
|
|
245
|
+
const testFile = await loadAssetTemplate('template-loader/index.test.ts', { config });
|
|
246
|
+
await writeFile(path.join(testsDir, 'index.test.ts'), testFile);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// If template doesn't exist, create a minimal test file
|
|
250
|
+
const minimalTest = `import { describe, it, expect } from 'vitest';
|
|
251
|
+
|
|
252
|
+
describe('Bootstrap Test', () => {
|
|
253
|
+
it('should pass initial test', () => {
|
|
254
|
+
expect(true).toBe(true);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
`;
|
|
258
|
+
await writeFile(path.join(testsDir, 'index.test.ts'), minimalTest);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
async function createInitialSetupBranch(projectPath) {
|
|
263
|
+
// NOTE: Dynamic import of fs-extra requires accessing .default
|
|
264
|
+
// See: docs/common-issues.md for details
|
|
265
|
+
const fsModule = await import('fs-extra');
|
|
266
|
+
const fs = fsModule.default;
|
|
267
|
+
const { readFile, writeFile } = await import('../utils/file-system.js');
|
|
268
|
+
const projectConfigPath = path.join(projectPath, '.boss', 'project-config.json');
|
|
269
|
+
// CRITICAL: Verify we're on main branch before creating feature branch
|
|
270
|
+
const { execa } = await import('execa');
|
|
271
|
+
const { stdout: currentBranch } = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: projectPath });
|
|
272
|
+
if (currentBranch.trim() !== 'main' && currentBranch.trim() !== 'master') {
|
|
273
|
+
logger.warning(`Expected to be on main branch, but on ${currentBranch.trim()}. Switching to main...`);
|
|
274
|
+
await execa('git', ['checkout', 'main'], { cwd: projectPath });
|
|
275
|
+
}
|
|
276
|
+
// Create and switch to feature/boss-initial-setup branch
|
|
277
|
+
// This happens BEFORE committing bootstrap files - all files will go to feature branch
|
|
278
|
+
await createBranch(projectPath, 'feature/boss-initial-setup');
|
|
279
|
+
// Early return if project-config.json doesn't exist
|
|
280
|
+
const configExists = await fs.pathExists(projectConfigPath);
|
|
281
|
+
if (!configExists) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const projectConfigContent = await readFile(projectConfigPath);
|
|
285
|
+
const projectConfig = JSON.parse(projectConfigContent);
|
|
286
|
+
const now = new Date().toISOString();
|
|
287
|
+
// Update branch information
|
|
288
|
+
projectConfig.currentBranch = 'feature/boss-initial-setup';
|
|
289
|
+
if (projectConfig.repository?.branches) {
|
|
290
|
+
projectConfig.repository.branches['feature/boss-initial-setup'] = {
|
|
291
|
+
exists: true,
|
|
292
|
+
lastCommit: null
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
// Update initialization status
|
|
296
|
+
projectConfig.initialization.stage = 'remote-setup';
|
|
297
|
+
projectConfig.initialization.status = 'in-progress';
|
|
298
|
+
// Mark branch creation operation as completed
|
|
299
|
+
const branchOp = projectConfig.initialization.operationsRequired?.find((op) => op.operation === 'create-initial-setup-branch');
|
|
300
|
+
if (branchOp) {
|
|
301
|
+
branchOp.status = 'completed';
|
|
302
|
+
branchOp.completedAt = now;
|
|
303
|
+
}
|
|
304
|
+
// Update current workflow
|
|
305
|
+
projectConfig.currentWorkflow = {
|
|
306
|
+
stage: 'initialization',
|
|
307
|
+
phase: 'remote-setup',
|
|
308
|
+
status: 'awaiting-remote-creation'
|
|
309
|
+
};
|
|
310
|
+
// Update metadata
|
|
311
|
+
if (projectConfig.metadata) {
|
|
312
|
+
projectConfig.metadata.lastUpdated = now;
|
|
313
|
+
projectConfig.metadata.notes = 'Initial setup branch created. All bootstrap files will be committed to feature branch. Ready for remote repository setup.';
|
|
314
|
+
}
|
|
315
|
+
await writeFile(projectConfigPath, JSON.stringify(projectConfig, null, 2));
|
|
316
|
+
// Note: project-config.json will be committed with all other bootstrap files
|
|
317
|
+
// No need to commit separately - it will be included in the main bootstrap commit
|
|
318
|
+
}
|
|
319
|
+
async function collectConfiguration(options) {
|
|
320
|
+
let name = options.name;
|
|
321
|
+
let template = options.template;
|
|
322
|
+
let quality = options.quality;
|
|
323
|
+
let githubRepo = options.githubRepo;
|
|
324
|
+
let githubOrg = options.githubOrg;
|
|
325
|
+
// Interactive mode if flags omitted
|
|
326
|
+
if (!name || !template || !quality) {
|
|
327
|
+
logger.info('Running in interactive mode...\n');
|
|
328
|
+
if (!name) {
|
|
329
|
+
name = await promptProjectName();
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
const validation = validateProjectName(name);
|
|
333
|
+
if (!validation.valid) {
|
|
334
|
+
logger.error(validation.error || 'Invalid project name');
|
|
335
|
+
process.exit(1);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (!template) {
|
|
339
|
+
template = await promptTemplate();
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
const validation = validateTemplate(template);
|
|
343
|
+
if (!validation.valid) {
|
|
344
|
+
logger.error(validation.error || 'Invalid template');
|
|
345
|
+
process.exit(1);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (!quality) {
|
|
349
|
+
quality = await promptQualityPreset();
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
const validation = validateQualityPreset(quality);
|
|
353
|
+
if (!validation.valid) {
|
|
354
|
+
logger.error(validation.error || 'Invalid quality preset');
|
|
355
|
+
process.exit(1);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (!githubRepo || !githubOrg) {
|
|
359
|
+
const githubConfig = await promptGitHubConfig();
|
|
360
|
+
githubRepo = githubConfig.repo || githubRepo;
|
|
361
|
+
githubOrg = githubConfig.org || githubOrg;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
// Validate provided options
|
|
366
|
+
const nameValidation = validateProjectName(name);
|
|
367
|
+
if (!nameValidation.valid) {
|
|
368
|
+
logger.error(nameValidation.error || 'Invalid project name');
|
|
369
|
+
process.exit(1);
|
|
370
|
+
}
|
|
371
|
+
const templateValidation = validateTemplate(template);
|
|
372
|
+
if (!templateValidation.valid) {
|
|
373
|
+
logger.error(templateValidation.error || 'Invalid template');
|
|
374
|
+
process.exit(1);
|
|
375
|
+
}
|
|
376
|
+
const qualityValidation = validateQualityPreset(quality);
|
|
377
|
+
if (!qualityValidation.valid) {
|
|
378
|
+
logger.error(qualityValidation.error || 'Invalid quality preset');
|
|
379
|
+
process.exit(1);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return {
|
|
383
|
+
name: name,
|
|
384
|
+
template: template,
|
|
385
|
+
quality: quality,
|
|
386
|
+
githubRepo,
|
|
387
|
+
githubOrg
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AASA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwDnD"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
export async function doctorCommand() {
|
|
4
|
+
logger.section('🏥 BOSS Doctor - System Health Check');
|
|
5
|
+
const checks = [];
|
|
6
|
+
// Check Docker
|
|
7
|
+
checks.push(await checkDocker());
|
|
8
|
+
// Check Node.js
|
|
9
|
+
checks.push(await checkNode());
|
|
10
|
+
// Check pnpm
|
|
11
|
+
checks.push(await checkPnpm());
|
|
12
|
+
// Check 1Password CLI
|
|
13
|
+
checks.push(await check1Password());
|
|
14
|
+
// Check Container-Use CLI
|
|
15
|
+
checks.push(await checkContainerUse());
|
|
16
|
+
// Check Claude Code/Cursor
|
|
17
|
+
checks.push(await checkClaudeCode());
|
|
18
|
+
// Check Git
|
|
19
|
+
checks.push(await checkGit());
|
|
20
|
+
// Check ports
|
|
21
|
+
checks.push(await checkPort(5432, 'PostgreSQL'));
|
|
22
|
+
checks.push(await checkPort(6333, 'Qdrant'));
|
|
23
|
+
checks.push(await checkPort(8080, 'Embeddings Service'));
|
|
24
|
+
// Check MCP configs
|
|
25
|
+
checks.push(await checkMCPConfig());
|
|
26
|
+
// Display results
|
|
27
|
+
console.log('\n');
|
|
28
|
+
for (const check of checks) {
|
|
29
|
+
const icon = check.status === 'pass' ? '✓' : check.status === 'fail' ? '✗' : '⚠';
|
|
30
|
+
const color = check.status === 'pass' ? 'green' : check.status === 'fail' ? 'red' : 'yellow';
|
|
31
|
+
logger[check.status === 'pass' ? 'success' : check.status === 'fail' ? 'error' : 'warning'](`${icon} ${check.name}: ${check.message}`);
|
|
32
|
+
}
|
|
33
|
+
const failed = checks.filter(c => c.status === 'fail').length;
|
|
34
|
+
const warnings = checks.filter(c => c.status === 'warning').length;
|
|
35
|
+
console.log('\n');
|
|
36
|
+
if (failed === 0 && warnings === 0) {
|
|
37
|
+
logger.success('All checks passed! ✅');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
logger.warning(`${failed} failed, ${warnings} warnings`);
|
|
41
|
+
if (failed > 0) {
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function checkDocker() {
|
|
47
|
+
try {
|
|
48
|
+
await execa('docker', ['--version']);
|
|
49
|
+
try {
|
|
50
|
+
await execa('docker', ['ps']);
|
|
51
|
+
return { name: 'Docker', status: 'pass', message: 'Running' };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { name: 'Docker', status: 'warning', message: 'Installed but not running' };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return { name: 'Docker', status: 'fail', message: 'Not installed or not in PATH' };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function checkNode() {
|
|
62
|
+
try {
|
|
63
|
+
const { stdout } = await execa('node', ['--version']);
|
|
64
|
+
const version = stdout.replace('v', '');
|
|
65
|
+
const major = parseInt(version.split('.')[0], 10);
|
|
66
|
+
if (major >= 22) {
|
|
67
|
+
return { name: 'Node.js', status: 'pass', message: `v${version} (>= 22 required)` };
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return { name: 'Node.js', status: 'fail', message: `v${version} (>= 22 required)` };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { name: 'Node.js', status: 'fail', message: 'Not installed or not in PATH' };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function checkPnpm() {
|
|
78
|
+
try {
|
|
79
|
+
const { stdout } = await execa('pnpm', ['--version']);
|
|
80
|
+
return { name: 'pnpm', status: 'pass', message: `v${stdout}` };
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return { name: 'pnpm', status: 'fail', message: 'Not installed or not in PATH' };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function check1Password() {
|
|
87
|
+
try {
|
|
88
|
+
await execa('op', ['--version']);
|
|
89
|
+
try {
|
|
90
|
+
await execa('op', ['account', 'list']);
|
|
91
|
+
return { name: '1Password CLI', status: 'pass', message: 'Installed and authenticated' };
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return { name: '1Password CLI', status: 'warning', message: 'Installed but not authenticated (run: op signin)' };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return { name: '1Password CLI', status: 'fail', message: 'Not installed or not in PATH' };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function checkContainerUse() {
|
|
102
|
+
try {
|
|
103
|
+
const { stdout } = await execa('container-use', ['--version']);
|
|
104
|
+
return { name: 'Container-Use CLI', status: 'pass', message: `v${stdout.trim()}` };
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return { name: 'Container-Use CLI', status: 'fail', message: 'Not installed (run: npm install -g container-use)' };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function checkClaudeCode() {
|
|
111
|
+
try {
|
|
112
|
+
await execa('claude', ['--version']);
|
|
113
|
+
return { name: 'Claude Code', status: 'pass', message: 'Installed' };
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
try {
|
|
117
|
+
await execa('cursor', ['--version']);
|
|
118
|
+
return { name: 'Cursor', status: 'pass', message: 'Installed' };
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return { name: 'Claude Code/Cursor', status: 'warning', message: 'Not found in PATH (may be installed but not in PATH)' };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function checkGit() {
|
|
126
|
+
try {
|
|
127
|
+
const { stdout } = await execa('git', ['--version']);
|
|
128
|
+
return { name: 'Git', status: 'pass', message: stdout.trim() };
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return { name: 'Git', status: 'fail', message: 'Not installed or not in PATH' };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function checkPort(port, service) {
|
|
135
|
+
try {
|
|
136
|
+
const { execa } = await import('execa');
|
|
137
|
+
// Try to check if port is in use (platform-specific)
|
|
138
|
+
if (process.platform === 'darwin' || process.platform === 'linux') {
|
|
139
|
+
try {
|
|
140
|
+
await execa('lsof', ['-i', `:${port}`]);
|
|
141
|
+
return { name: `Port ${port} (${service})`, status: 'warning', message: 'Port is in use' };
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return { name: `Port ${port} (${service})`, status: 'pass', message: 'Available' };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
return { name: `Port ${port} (${service})`, status: 'warning', message: 'Port check not available on this platform' };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return { name: `Port ${port} (${service})`, status: 'warning', message: 'Unable to check port' };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function checkMCPConfig() {
|
|
156
|
+
const os = await import('os');
|
|
157
|
+
const path = await import('path');
|
|
158
|
+
const fs = await import('fs-extra');
|
|
159
|
+
// Check Claude Code first (default/preferred)
|
|
160
|
+
const claudeCodePath = path.join(os.homedir(), '.config', 'claude-code', 'mcp-servers.json');
|
|
161
|
+
if (await fs.pathExists(claudeCodePath)) {
|
|
162
|
+
return { name: 'MCP Config', status: 'pass', message: `Found: ${claudeCodePath}` };
|
|
163
|
+
}
|
|
164
|
+
// Fall back to Cursor
|
|
165
|
+
const cursorPath = path.join(os.homedir(), '.cursor', 'mcp-servers.json');
|
|
166
|
+
if (await fs.pathExists(cursorPath)) {
|
|
167
|
+
return { name: 'MCP Config', status: 'pass', message: `Found: ${cursorPath}` };
|
|
168
|
+
}
|
|
169
|
+
return { name: 'MCP Config', status: 'warning', message: 'Not found (will be created during bootstrap - defaults to Claude Code)' };
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUtD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
import { TEMPLATES } from '../utils/prompts.js';
|
|
3
|
+
export async function templatesCommand() {
|
|
4
|
+
logger.section('📋 Available Templates');
|
|
5
|
+
for (const [key, template] of Object.entries(TEMPLATES)) {
|
|
6
|
+
console.log(`\n${template.name} (${key})`);
|
|
7
|
+
console.log(` ${template.description}`);
|
|
8
|
+
console.log(` Stack: ${template.stack.join(', ')}`);
|
|
9
|
+
}
|
|
10
|
+
console.log('\n');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEzC,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
|