kiro-kit 0.1.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/dist/index.d.ts +1 -0
- package/dist/index.js +2067 -0
- package/dist/index.js.map +1 -0
- package/dist/presets/_template/.env.example +15 -0
- package/dist/presets/_template/.mcp.json.example +30 -0
- package/dist/presets/_template/README.md +71 -0
- package/dist/presets/_template/agents/.gitkeep +1 -0
- package/dist/presets/_template/agents/brainstormer.md +47 -0
- package/dist/presets/_template/agents/code-reviewer.md +56 -0
- package/dist/presets/_template/agents/copywriter.md +47 -0
- package/dist/presets/_template/agents/database-admin.md +48 -0
- package/dist/presets/_template/agents/debugger.md +47 -0
- package/dist/presets/_template/agents/docs-manager.md +46 -0
- package/dist/presets/_template/agents/git-manager.md +49 -0
- package/dist/presets/_template/agents/journal-writer.md +58 -0
- package/dist/presets/_template/agents/mcp-manager.md +46 -0
- package/dist/presets/_template/agents/planner.md +44 -0
- package/dist/presets/_template/agents/project-manager.md +54 -0
- package/dist/presets/_template/agents/researcher.md +47 -0
- package/dist/presets/_template/agents/scout-external.md +50 -0
- package/dist/presets/_template/agents/scout.md +51 -0
- package/dist/presets/_template/agents/tester.md +55 -0
- package/dist/presets/_template/agents/ui-ux-designer.md +47 -0
- package/dist/presets/_template/commands/bootstrap.md +15 -0
- package/dist/presets/_template/commands/clean.md +14 -0
- package/dist/presets/_template/commands/design/figma.md +14 -0
- package/dist/presets/_template/commands/design/system.md +14 -0
- package/dist/presets/_template/commands/design/wireframe.md +14 -0
- package/dist/presets/_template/commands/docs/architecture.md +14 -0
- package/dist/presets/_template/commands/docs/summarize.md +14 -0
- package/dist/presets/_template/commands/docs/update.md +14 -0
- package/dist/presets/_template/commands/fix/build.md +14 -0
- package/dist/presets/_template/commands/fix/lint.md +13 -0
- package/dist/presets/_template/commands/fix/tests.md +14 -0
- package/dist/presets/_template/commands/git/branch.md +15 -0
- package/dist/presets/_template/commands/git/commit.md +15 -0
- package/dist/presets/_template/commands/git/pr.md +14 -0
- package/dist/presets/_template/commands/lint.md +14 -0
- package/dist/presets/_template/commands/plan/feature.md +15 -0
- package/dist/presets/_template/commands/plan/refactor.md +15 -0
- package/dist/presets/_template/commands/release.md +16 -0
- package/dist/presets/_template/commands/review/code.md +14 -0
- package/dist/presets/_template/commands/review/security.md +14 -0
- package/dist/presets/_template/commands/scout/ext.md +15 -0
- package/dist/presets/_template/commands/scout.md +15 -0
- package/dist/presets/_template/commands/skill/add.md +15 -0
- package/dist/presets/_template/commands/skill/create.md +15 -0
- package/dist/presets/_template/commands/skill/optimize.md +14 -0
- package/dist/presets/_template/commands/test.md +15 -0
- package/dist/presets/_template/docs/.gitkeep +1 -0
- package/dist/presets/_template/hooks/.env.example +9 -0
- package/dist/presets/_template/hooks/README.md +28 -0
- package/dist/presets/_template/hooks/discord-notify.js +31 -0
- package/dist/presets/_template/hooks/discord-notify.ps1 +19 -0
- package/dist/presets/_template/hooks/discord-notify.sh +15 -0
- package/dist/presets/_template/hooks/git-status-tracker.js +26 -0
- package/dist/presets/_template/hooks/modularization-hook.js +36 -0
- package/dist/presets/_template/hooks/pre-commit-lint.js +15 -0
- package/dist/presets/_template/hooks/scout-block.js +30 -0
- package/dist/presets/_template/hooks/scout-block.ps1 +26 -0
- package/dist/presets/_template/hooks/scout-block.sh +31 -0
- package/dist/presets/_template/hooks/telegram-notify.js +30 -0
- package/dist/presets/_template/hooks/telegram-notify.ps1 +22 -0
- package/dist/presets/_template/hooks/telegram-notify.sh +16 -0
- package/dist/presets/_template/manifest.json +17 -0
- package/dist/presets/_template/settings.json +31 -0
- package/dist/presets/_template/skills/.env.example +12 -0
- package/dist/presets/_template/skills/INSTALLATION.md +37 -0
- package/dist/presets/_template/skills/README.md +34 -0
- package/dist/presets/_template/skills/THIRD_PARTY_NOTICES.md +24 -0
- package/dist/presets/_template/skills/agent_skills_spec.md +41 -0
- package/dist/presets/_template/skills/template-skill/SKILL.md +20 -0
- package/dist/presets/_template/skills/template-skill/assets/.gitkeep +1 -0
- package/dist/presets/_template/skills/template-skill/references/.gitkeep +1 -0
- package/dist/presets/_template/skills/template-skill/scripts/.gitkeep +1 -0
- package/dist/presets/_template/specs/_templates/_template/.gitkeep +1 -0
- package/dist/presets/_template/statusline.js +22 -0
- package/dist/presets/_template/statusline.ps1 +16 -0
- package/dist/presets/_template/statusline.sh +17 -0
- package/dist/presets/_template/steering/.gitkeep +1 -0
- package/dist/presets/_template/workflows/development-rules.md +33 -0
- package/dist/presets/_template/workflows/documentation-management.md +29 -0
- package/dist/presets/_template/workflows/orchestration-protocol.md +25 -0
- package/dist/presets/_template/workflows/primary-workflow.md +33 -0
- package/dist/presets/backend/.env.example +24 -0
- package/dist/presets/backend/.mcp.json.example +34 -0
- package/dist/presets/backend/README.md +58 -0
- package/dist/presets/backend/agents/api-developer.md +45 -0
- package/dist/presets/backend/agents/brainstormer.md +42 -0
- package/dist/presets/backend/agents/code-reviewer.md +56 -0
- package/dist/presets/backend/agents/copywriter.md +40 -0
- package/dist/presets/backend/agents/database-admin.md +41 -0
- package/dist/presets/backend/agents/database-architect.md +58 -0
- package/dist/presets/backend/agents/debugger.md +40 -0
- package/dist/presets/backend/agents/devops-engineer.md +58 -0
- package/dist/presets/backend/agents/docs-manager.md +39 -0
- package/dist/presets/backend/agents/git-manager.md +47 -0
- package/dist/presets/backend/agents/journal-writer.md +58 -0
- package/dist/presets/backend/agents/mcp-manager.md +39 -0
- package/dist/presets/backend/agents/planner.md +39 -0
- package/dist/presets/backend/agents/project-manager.md +54 -0
- package/dist/presets/backend/agents/researcher.md +41 -0
- package/dist/presets/backend/agents/scout-external.md +43 -0
- package/dist/presets/backend/agents/scout.md +46 -0
- package/dist/presets/backend/agents/security-auditor.md +59 -0
- package/dist/presets/backend/agents/tester.md +55 -0
- package/dist/presets/backend/commands/backend/middleware.md +29 -0
- package/dist/presets/backend/commands/backend/migration.md +27 -0
- package/dist/presets/backend/commands/backend/route.md +27 -0
- package/dist/presets/backend/commands/bootstrap.md +16 -0
- package/dist/presets/backend/commands/clean.md +12 -0
- package/dist/presets/backend/commands/design/figma.md +15 -0
- package/dist/presets/backend/commands/design/system.md +17 -0
- package/dist/presets/backend/commands/design/wireframe.md +15 -0
- package/dist/presets/backend/commands/docs/architecture.md +13 -0
- package/dist/presets/backend/commands/docs/summarize.md +15 -0
- package/dist/presets/backend/commands/docs/update.md +12 -0
- package/dist/presets/backend/commands/fix/build.md +11 -0
- package/dist/presets/backend/commands/fix/lint.md +10 -0
- package/dist/presets/backend/commands/fix/tests.md +16 -0
- package/dist/presets/backend/commands/git/branch.md +16 -0
- package/dist/presets/backend/commands/git/commit.md +17 -0
- package/dist/presets/backend/commands/git/pr.md +16 -0
- package/dist/presets/backend/commands/lint.md +11 -0
- package/dist/presets/backend/commands/plan/feature.md +16 -0
- package/dist/presets/backend/commands/plan/refactor.md +16 -0
- package/dist/presets/backend/commands/release.md +17 -0
- package/dist/presets/backend/commands/review/code.md +16 -0
- package/dist/presets/backend/commands/review/security.md +17 -0
- package/dist/presets/backend/commands/scout/ext.md +17 -0
- package/dist/presets/backend/commands/scout.md +16 -0
- package/dist/presets/backend/commands/skill/add.md +16 -0
- package/dist/presets/backend/commands/skill/create.md +17 -0
- package/dist/presets/backend/commands/skill/optimize.md +16 -0
- package/dist/presets/backend/commands/test.md +15 -0
- package/dist/presets/backend/docs/code-standards.md +84 -0
- package/dist/presets/backend/docs/project-roadmap.md +60 -0
- package/dist/presets/backend/docs/system-architecture.md +81 -0
- package/dist/presets/backend/hooks/.env.example +9 -0
- package/dist/presets/backend/hooks/README.md +28 -0
- package/dist/presets/backend/hooks/discord-notify.js +31 -0
- package/dist/presets/backend/hooks/discord-notify.ps1 +19 -0
- package/dist/presets/backend/hooks/discord-notify.sh +15 -0
- package/dist/presets/backend/hooks/git-status-tracker.js +26 -0
- package/dist/presets/backend/hooks/modularization-hook.js +36 -0
- package/dist/presets/backend/hooks/pre-commit-lint.js +15 -0
- package/dist/presets/backend/hooks/scout-block.js +30 -0
- package/dist/presets/backend/hooks/scout-block.ps1 +26 -0
- package/dist/presets/backend/hooks/scout-block.sh +31 -0
- package/dist/presets/backend/hooks/telegram-notify.js +30 -0
- package/dist/presets/backend/hooks/telegram-notify.ps1 +22 -0
- package/dist/presets/backend/hooks/telegram-notify.sh +16 -0
- package/dist/presets/backend/manifest.json +152 -0
- package/dist/presets/backend/settings.json +31 -0
- package/dist/presets/backend/skills/.env.example +9 -0
- package/dist/presets/backend/skills/INSTALLATION.md +47 -0
- package/dist/presets/backend/skills/README.md +43 -0
- package/dist/presets/backend/skills/THIRD_PARTY_NOTICES.md +16 -0
- package/dist/presets/backend/skills/agent_skills_spec.md +40 -0
- package/dist/presets/backend/skills/ai-multimodal/SKILL.md +32 -0
- package/dist/presets/backend/skills/backend-development/SKILL.md +50 -0
- package/dist/presets/backend/skills/better-auth/SKILL.md +57 -0
- package/dist/presets/backend/skills/chrome-devtools/SKILL.md +43 -0
- package/dist/presets/backend/skills/code-review/SKILL.md +45 -0
- package/dist/presets/backend/skills/databases/SKILL.md +50 -0
- package/dist/presets/backend/skills/debugging/SKILL.md +34 -0
- package/dist/presets/backend/skills/devops/SKILL.md +53 -0
- package/dist/presets/backend/skills/docs-seeker/SKILL.md +40 -0
- package/dist/presets/backend/skills/frontend-design/SKILL.md +39 -0
- package/dist/presets/backend/skills/mcp-builder/SKILL.md +53 -0
- package/dist/presets/backend/skills/mcp-management/SKILL.md +40 -0
- package/dist/presets/backend/skills/media-processing/SKILL.md +55 -0
- package/dist/presets/backend/skills/planning/SKILL.md +39 -0
- package/dist/presets/backend/skills/problem-solving/SKILL.md +41 -0
- package/dist/presets/backend/skills/repomix/SKILL.md +42 -0
- package/dist/presets/backend/skills/research/SKILL.md +34 -0
- package/dist/presets/backend/skills/sequential-thinking/SKILL.md +33 -0
- package/dist/presets/backend/skills/skill-creator/SKILL.md +56 -0
- package/dist/presets/backend/skills/template-skill/SKILL.md +25 -0
- package/dist/presets/backend/specs/_templates/backend/design.md +87 -0
- package/dist/presets/backend/specs/_templates/backend/requirements.md +55 -0
- package/dist/presets/backend/specs/_templates/backend/tasks.md +46 -0
- package/dist/presets/backend/statusline.js +22 -0
- package/dist/presets/backend/statusline.ps1 +16 -0
- package/dist/presets/backend/statusline.sh +17 -0
- package/dist/presets/backend/steering/api-design-conventions.md +105 -0
- package/dist/presets/backend/steering/security-best-practices.md +85 -0
- package/dist/presets/backend/workflows/development-rules.md +33 -0
- package/dist/presets/backend/workflows/documentation-management.md +29 -0
- package/dist/presets/backend/workflows/orchestration-protocol.md +25 -0
- package/dist/presets/backend/workflows/primary-workflow.md +33 -0
- package/dist/presets/data-ai/.env.example +35 -0
- package/dist/presets/data-ai/.mcp.json.example +31 -0
- package/dist/presets/data-ai/README.md +58 -0
- package/dist/presets/data-ai/agents/brainstormer.md +46 -0
- package/dist/presets/data-ai/agents/code-reviewer.md +59 -0
- package/dist/presets/data-ai/agents/copywriter.md +46 -0
- package/dist/presets/data-ai/agents/data-pipeline-architect.md +45 -0
- package/dist/presets/data-ai/agents/data-scientist.md +45 -0
- package/dist/presets/data-ai/agents/database-admin.md +43 -0
- package/dist/presets/data-ai/agents/debugger.md +44 -0
- package/dist/presets/data-ai/agents/docs-manager.md +41 -0
- package/dist/presets/data-ai/agents/git-manager.md +49 -0
- package/dist/presets/data-ai/agents/journal-writer.md +58 -0
- package/dist/presets/data-ai/agents/mcp-manager.md +40 -0
- package/dist/presets/data-ai/agents/ml-engineer.md +45 -0
- package/dist/presets/data-ai/agents/model-evaluator.md +45 -0
- package/dist/presets/data-ai/agents/planner.md +42 -0
- package/dist/presets/data-ai/agents/project-manager.md +54 -0
- package/dist/presets/data-ai/agents/researcher.md +46 -0
- package/dist/presets/data-ai/agents/scout-external.md +45 -0
- package/dist/presets/data-ai/agents/scout.md +48 -0
- package/dist/presets/data-ai/agents/tester.md +56 -0
- package/dist/presets/data-ai/agents/ui-ux-designer.md +45 -0
- package/dist/presets/data-ai/commands/bootstrap.md +17 -0
- package/dist/presets/data-ai/commands/clean.md +17 -0
- package/dist/presets/data-ai/commands/data/clean.md +20 -0
- package/dist/presets/data-ai/commands/data/explore.md +18 -0
- package/dist/presets/data-ai/commands/data/profile.md +18 -0
- package/dist/presets/data-ai/commands/data/validate.md +18 -0
- package/dist/presets/data-ai/commands/docs/architecture.md +17 -0
- package/dist/presets/data-ai/commands/docs/summarize.md +17 -0
- package/dist/presets/data-ai/commands/docs/update.md +17 -0
- package/dist/presets/data-ai/commands/fix/build.md +17 -0
- package/dist/presets/data-ai/commands/fix/lint.md +16 -0
- package/dist/presets/data-ai/commands/fix/tests.md +17 -0
- package/dist/presets/data-ai/commands/git/branch.md +16 -0
- package/dist/presets/data-ai/commands/git/commit.md +17 -0
- package/dist/presets/data-ai/commands/git/pr.md +17 -0
- package/dist/presets/data-ai/commands/lint.md +16 -0
- package/dist/presets/data-ai/commands/ml/compare.md +17 -0
- package/dist/presets/data-ai/commands/ml/deploy.md +18 -0
- package/dist/presets/data-ai/commands/ml/evaluate.md +19 -0
- package/dist/presets/data-ai/commands/ml/train.md +20 -0
- package/dist/presets/data-ai/commands/ml/tune.md +18 -0
- package/dist/presets/data-ai/commands/pipeline/build.md +18 -0
- package/dist/presets/data-ai/commands/pipeline/run.md +18 -0
- package/dist/presets/data-ai/commands/pipeline/validate.md +17 -0
- package/dist/presets/data-ai/commands/plan/feature.md +18 -0
- package/dist/presets/data-ai/commands/plan/refactor.md +18 -0
- package/dist/presets/data-ai/commands/release.md +17 -0
- package/dist/presets/data-ai/commands/review/code.md +17 -0
- package/dist/presets/data-ai/commands/review/security.md +18 -0
- package/dist/presets/data-ai/commands/scout/ext.md +17 -0
- package/dist/presets/data-ai/commands/scout.md +17 -0
- package/dist/presets/data-ai/commands/skill/add.md +17 -0
- package/dist/presets/data-ai/commands/skill/create.md +19 -0
- package/dist/presets/data-ai/commands/skill/optimize.md +18 -0
- package/dist/presets/data-ai/commands/test.md +17 -0
- package/dist/presets/data-ai/docs/code-standards.md +89 -0
- package/dist/presets/data-ai/docs/project-roadmap.md +79 -0
- package/dist/presets/data-ai/docs/system-architecture.md +97 -0
- package/dist/presets/data-ai/hooks/.env.example +9 -0
- package/dist/presets/data-ai/hooks/README.md +28 -0
- package/dist/presets/data-ai/hooks/discord-notify.js +31 -0
- package/dist/presets/data-ai/hooks/discord-notify.ps1 +19 -0
- package/dist/presets/data-ai/hooks/discord-notify.sh +15 -0
- package/dist/presets/data-ai/hooks/git-status-tracker.js +26 -0
- package/dist/presets/data-ai/hooks/modularization-hook.js +36 -0
- package/dist/presets/data-ai/hooks/pre-commit-lint.js +15 -0
- package/dist/presets/data-ai/hooks/scout-block.js +30 -0
- package/dist/presets/data-ai/hooks/scout-block.ps1 +26 -0
- package/dist/presets/data-ai/hooks/scout-block.sh +31 -0
- package/dist/presets/data-ai/hooks/telegram-notify.js +30 -0
- package/dist/presets/data-ai/hooks/telegram-notify.ps1 +22 -0
- package/dist/presets/data-ai/hooks/telegram-notify.sh +16 -0
- package/dist/presets/data-ai/manifest.json +167 -0
- package/dist/presets/data-ai/settings.json +31 -0
- package/dist/presets/data-ai/skills/.env.example +16 -0
- package/dist/presets/data-ai/skills/INSTALLATION.md +35 -0
- package/dist/presets/data-ai/skills/README.md +35 -0
- package/dist/presets/data-ai/skills/THIRD_PARTY_NOTICES.md +32 -0
- package/dist/presets/data-ai/skills/agent_skills_spec.md +46 -0
- package/dist/presets/data-ai/skills/ai-multimodal/SKILL.md +41 -0
- package/dist/presets/data-ai/skills/code-review/SKILL.md +49 -0
- package/dist/presets/data-ai/skills/data-engineering/SKILL.md +47 -0
- package/dist/presets/data-ai/skills/data-visualization/SKILL.md +46 -0
- package/dist/presets/data-ai/skills/debugging/SKILL.md +42 -0
- package/dist/presets/data-ai/skills/docs-seeker/SKILL.md +41 -0
- package/dist/presets/data-ai/skills/document-skills/docx/SKILL.md +49 -0
- package/dist/presets/data-ai/skills/document-skills/pdf/SKILL.md +51 -0
- package/dist/presets/data-ai/skills/document-skills/pptx/SKILL.md +51 -0
- package/dist/presets/data-ai/skills/document-skills/xlsx/SKILL.md +54 -0
- package/dist/presets/data-ai/skills/experiment-tracking/SKILL.md +52 -0
- package/dist/presets/data-ai/skills/feature-store/SKILL.md +56 -0
- package/dist/presets/data-ai/skills/google-adk-python/SKILL.md +56 -0
- package/dist/presets/data-ai/skills/jupyter-notebooks/SKILL.md +60 -0
- package/dist/presets/data-ai/skills/mcp-builder/SKILL.md +40 -0
- package/dist/presets/data-ai/skills/mcp-management/SKILL.md +41 -0
- package/dist/presets/data-ai/skills/ml-ops/SKILL.md +45 -0
- package/dist/presets/data-ai/skills/nlp-text-processing/SKILL.md +48 -0
- package/dist/presets/data-ai/skills/pandas-analysis/SKILL.md +49 -0
- package/dist/presets/data-ai/skills/planning/SKILL.md +44 -0
- package/dist/presets/data-ai/skills/problem-solving/SKILL.md +42 -0
- package/dist/presets/data-ai/skills/pytorch-training/SKILL.md +55 -0
- package/dist/presets/data-ai/skills/repomix/SKILL.md +40 -0
- package/dist/presets/data-ai/skills/research/SKILL.md +35 -0
- package/dist/presets/data-ai/skills/scikit-learn/SKILL.md +47 -0
- package/dist/presets/data-ai/skills/sequential-thinking/SKILL.md +34 -0
- package/dist/presets/data-ai/skills/skill-creator/SKILL.md +56 -0
- package/dist/presets/data-ai/skills/template-skill/SKILL.md +23 -0
- package/dist/presets/data-ai/skills/template-skill/assets/.gitkeep +1 -0
- package/dist/presets/data-ai/skills/template-skill/references/.gitkeep +1 -0
- package/dist/presets/data-ai/skills/template-skill/scripts/.gitkeep +1 -0
- package/dist/presets/data-ai/skills/tensorflow-keras/SKILL.md +54 -0
- package/dist/presets/data-ai/specs/_templates/data-ai/design.md +81 -0
- package/dist/presets/data-ai/specs/_templates/data-ai/requirements.md +49 -0
- package/dist/presets/data-ai/specs/_templates/data-ai/tasks.md +50 -0
- package/dist/presets/data-ai/statusline.js +22 -0
- package/dist/presets/data-ai/statusline.ps1 +16 -0
- package/dist/presets/data-ai/statusline.sh +17 -0
- package/dist/presets/data-ai/steering/ml-patterns.md +75 -0
- package/dist/presets/data-ai/steering/python-conventions.md +78 -0
- package/dist/presets/data-ai/workflows/development-rules.md +34 -0
- package/dist/presets/data-ai/workflows/documentation-management.md +24 -0
- package/dist/presets/data-ai/workflows/orchestration-protocol.md +18 -0
- package/dist/presets/data-ai/workflows/primary-workflow.md +33 -0
- package/dist/presets/devops/.env.example +36 -0
- package/dist/presets/devops/.mcp.json.example +30 -0
- package/dist/presets/devops/README.md +57 -0
- package/dist/presets/devops/agents/brainstormer.md +46 -0
- package/dist/presets/devops/agents/ci-cd-specialist.md +54 -0
- package/dist/presets/devops/agents/code-reviewer.md +59 -0
- package/dist/presets/devops/agents/copywriter.md +46 -0
- package/dist/presets/devops/agents/database-admin.md +43 -0
- package/dist/presets/devops/agents/debugger.md +44 -0
- package/dist/presets/devops/agents/docs-manager.md +41 -0
- package/dist/presets/devops/agents/git-manager.md +49 -0
- package/dist/presets/devops/agents/infrastructure-engineer.md +53 -0
- package/dist/presets/devops/agents/journal-writer.md +58 -0
- package/dist/presets/devops/agents/mcp-manager.md +40 -0
- package/dist/presets/devops/agents/monitoring-engineer.md +54 -0
- package/dist/presets/devops/agents/planner.md +42 -0
- package/dist/presets/devops/agents/project-manager.md +54 -0
- package/dist/presets/devops/agents/researcher.md +46 -0
- package/dist/presets/devops/agents/scout-external.md +45 -0
- package/dist/presets/devops/agents/scout.md +48 -0
- package/dist/presets/devops/agents/security-auditor.md +60 -0
- package/dist/presets/devops/agents/tester.md +56 -0
- package/dist/presets/devops/agents/ui-ux-designer.md +45 -0
- package/dist/presets/devops/commands/bootstrap.md +16 -0
- package/dist/presets/devops/commands/clean.md +13 -0
- package/dist/presets/devops/commands/design/figma.md +15 -0
- package/dist/presets/devops/commands/design/system.md +11 -0
- package/dist/presets/devops/commands/design/wireframe.md +15 -0
- package/dist/presets/devops/commands/devops/container.md +16 -0
- package/dist/presets/devops/commands/devops/deploy.md +17 -0
- package/dist/presets/devops/commands/devops/infra.md +17 -0
- package/dist/presets/devops/commands/devops/monitor.md +16 -0
- package/dist/presets/devops/commands/docs/architecture.md +11 -0
- package/dist/presets/devops/commands/docs/summarize.md +15 -0
- package/dist/presets/devops/commands/docs/update.md +11 -0
- package/dist/presets/devops/commands/fix/build.md +11 -0
- package/dist/presets/devops/commands/fix/lint.md +10 -0
- package/dist/presets/devops/commands/fix/tests.md +16 -0
- package/dist/presets/devops/commands/git/branch.md +16 -0
- package/dist/presets/devops/commands/git/commit.md +15 -0
- package/dist/presets/devops/commands/git/pr.md +16 -0
- package/dist/presets/devops/commands/lint.md +13 -0
- package/dist/presets/devops/commands/plan/feature.md +15 -0
- package/dist/presets/devops/commands/plan/refactor.md +16 -0
- package/dist/presets/devops/commands/release.md +17 -0
- package/dist/presets/devops/commands/review/code.md +15 -0
- package/dist/presets/devops/commands/review/security.md +16 -0
- package/dist/presets/devops/commands/scout/ext.md +16 -0
- package/dist/presets/devops/commands/scout.md +16 -0
- package/dist/presets/devops/commands/skill/add.md +16 -0
- package/dist/presets/devops/commands/skill/create.md +16 -0
- package/dist/presets/devops/commands/skill/optimize.md +16 -0
- package/dist/presets/devops/commands/test.md +15 -0
- package/dist/presets/devops/docs/code-standards.md +82 -0
- package/dist/presets/devops/docs/project-roadmap.md +58 -0
- package/dist/presets/devops/docs/system-architecture.md +85 -0
- package/dist/presets/devops/hooks/.env.example +9 -0
- package/dist/presets/devops/hooks/README.md +30 -0
- package/dist/presets/devops/hooks/build-verify.js +44 -0
- package/dist/presets/devops/hooks/discord-notify.js +31 -0
- package/dist/presets/devops/hooks/discord-notify.ps1 +19 -0
- package/dist/presets/devops/hooks/discord-notify.sh +15 -0
- package/dist/presets/devops/hooks/git-status-tracker.js +26 -0
- package/dist/presets/devops/hooks/image-scan.js +27 -0
- package/dist/presets/devops/hooks/modularization-hook.js +36 -0
- package/dist/presets/devops/hooks/pre-commit-lint.js +15 -0
- package/dist/presets/devops/hooks/scout-block.js +30 -0
- package/dist/presets/devops/hooks/scout-block.ps1 +26 -0
- package/dist/presets/devops/hooks/scout-block.sh +31 -0
- package/dist/presets/devops/hooks/telegram-notify.js +30 -0
- package/dist/presets/devops/hooks/telegram-notify.ps1 +22 -0
- package/dist/presets/devops/hooks/telegram-notify.sh +16 -0
- package/dist/presets/devops/manifest.json +156 -0
- package/dist/presets/devops/settings.json +39 -0
- package/dist/presets/devops/skills/.env.example +14 -0
- package/dist/presets/devops/skills/INSTALLATION.md +29 -0
- package/dist/presets/devops/skills/README.md +48 -0
- package/dist/presets/devops/skills/THIRD_PARTY_NOTICES.md +19 -0
- package/dist/presets/devops/skills/agent_skills_spec.md +28 -0
- package/dist/presets/devops/skills/ai-multimodal/SKILL.md +32 -0
- package/dist/presets/devops/skills/backend-development/SKILL.md +36 -0
- package/dist/presets/devops/skills/chrome-devtools/SKILL.md +35 -0
- package/dist/presets/devops/skills/ci-cd-patterns/SKILL.md +45 -0
- package/dist/presets/devops/skills/code-review/SKILL.md +30 -0
- package/dist/presets/devops/skills/container-security/SKILL.md +44 -0
- package/dist/presets/devops/skills/databases/SKILL.md +34 -0
- package/dist/presets/devops/skills/debugging/SKILL.md +35 -0
- package/dist/presets/devops/skills/devops/SKILL.md +53 -0
- package/dist/presets/devops/skills/docs-seeker/SKILL.md +32 -0
- package/dist/presets/devops/skills/frontend-design/SKILL.md +32 -0
- package/dist/presets/devops/skills/kubernetes-ops/SKILL.md +54 -0
- package/dist/presets/devops/skills/mcp-builder/SKILL.md +33 -0
- package/dist/presets/devops/skills/mcp-management/SKILL.md +33 -0
- package/dist/presets/devops/skills/media-processing/SKILL.md +30 -0
- package/dist/presets/devops/skills/planning/SKILL.md +39 -0
- package/dist/presets/devops/skills/problem-solving/SKILL.md +32 -0
- package/dist/presets/devops/skills/repomix/SKILL.md +39 -0
- package/dist/presets/devops/skills/research/SKILL.md +34 -0
- package/dist/presets/devops/skills/sequential-thinking/SKILL.md +33 -0
- package/dist/presets/devops/skills/skill-creator/SKILL.md +35 -0
- package/dist/presets/devops/skills/template-skill/SKILL.md +24 -0
- package/dist/presets/devops/skills/terraform-modules/SKILL.md +47 -0
- package/dist/presets/devops/skills/web-frameworks/SKILL.md +31 -0
- package/dist/presets/devops/specs/_templates/devops/design.md +87 -0
- package/dist/presets/devops/specs/_templates/devops/requirements.md +42 -0
- package/dist/presets/devops/specs/_templates/devops/tasks.md +46 -0
- package/dist/presets/devops/statusline.js +22 -0
- package/dist/presets/devops/statusline.ps1 +16 -0
- package/dist/presets/devops/statusline.sh +17 -0
- package/dist/presets/devops/steering/docker-conventions.md +45 -0
- package/dist/presets/devops/steering/infrastructure-patterns.md +58 -0
- package/dist/presets/devops/workflows/development-rules.md +34 -0
- package/dist/presets/devops/workflows/documentation-management.md +24 -0
- package/dist/presets/devops/workflows/orchestration-protocol.md +18 -0
- package/dist/presets/devops/workflows/primary-workflow.md +33 -0
- package/dist/presets/frontend/.env.example +19 -0
- package/dist/presets/frontend/.mcp.json.example +30 -0
- package/dist/presets/frontend/README.md +55 -0
- package/dist/presets/frontend/agents/accessibility-auditor.md +56 -0
- package/dist/presets/frontend/agents/brainstormer.md +46 -0
- package/dist/presets/frontend/agents/code-reviewer.md +59 -0
- package/dist/presets/frontend/agents/component-architect.md +59 -0
- package/dist/presets/frontend/agents/copywriter.md +46 -0
- package/dist/presets/frontend/agents/database-admin.md +43 -0
- package/dist/presets/frontend/agents/debugger.md +44 -0
- package/dist/presets/frontend/agents/docs-manager.md +41 -0
- package/dist/presets/frontend/agents/frontend-developer.md +47 -0
- package/dist/presets/frontend/agents/git-manager.md +49 -0
- package/dist/presets/frontend/agents/journal-writer.md +58 -0
- package/dist/presets/frontend/agents/mcp-manager.md +40 -0
- package/dist/presets/frontend/agents/performance-optimizer.md +57 -0
- package/dist/presets/frontend/agents/planner.md +42 -0
- package/dist/presets/frontend/agents/project-manager.md +54 -0
- package/dist/presets/frontend/agents/researcher.md +46 -0
- package/dist/presets/frontend/agents/scout-external.md +45 -0
- package/dist/presets/frontend/agents/scout.md +48 -0
- package/dist/presets/frontend/agents/tester.md +56 -0
- package/dist/presets/frontend/agents/ui-ux-designer.md +45 -0
- package/dist/presets/frontend/commands/bootstrap.md +15 -0
- package/dist/presets/frontend/commands/clean.md +12 -0
- package/dist/presets/frontend/commands/design/figma.md +15 -0
- package/dist/presets/frontend/commands/design/system.md +11 -0
- package/dist/presets/frontend/commands/design/wireframe.md +15 -0
- package/dist/presets/frontend/commands/docs/architecture.md +11 -0
- package/dist/presets/frontend/commands/docs/summarize.md +15 -0
- package/dist/presets/frontend/commands/docs/update.md +11 -0
- package/dist/presets/frontend/commands/fix/build.md +11 -0
- package/dist/presets/frontend/commands/fix/lint.md +10 -0
- package/dist/presets/frontend/commands/fix/tests.md +15 -0
- package/dist/presets/frontend/commands/frontend/component.md +31 -0
- package/dist/presets/frontend/commands/frontend/hook.md +29 -0
- package/dist/presets/frontend/commands/frontend/layout.md +29 -0
- package/dist/presets/frontend/commands/frontend/page.md +31 -0
- package/dist/presets/frontend/commands/git/branch.md +14 -0
- package/dist/presets/frontend/commands/git/commit.md +15 -0
- package/dist/presets/frontend/commands/git/pr.md +16 -0
- package/dist/presets/frontend/commands/lint.md +11 -0
- package/dist/presets/frontend/commands/plan/feature.md +15 -0
- package/dist/presets/frontend/commands/plan/refactor.md +15 -0
- package/dist/presets/frontend/commands/release.md +17 -0
- package/dist/presets/frontend/commands/review/code.md +15 -0
- package/dist/presets/frontend/commands/review/security.md +12 -0
- package/dist/presets/frontend/commands/scout/ext.md +17 -0
- package/dist/presets/frontend/commands/scout.md +16 -0
- package/dist/presets/frontend/commands/skill/add.md +16 -0
- package/dist/presets/frontend/commands/skill/create.md +16 -0
- package/dist/presets/frontend/commands/skill/optimize.md +16 -0
- package/dist/presets/frontend/commands/test.md +15 -0
- package/dist/presets/frontend/docs/code-standards.md +79 -0
- package/dist/presets/frontend/docs/project-roadmap.md +78 -0
- package/dist/presets/frontend/docs/system-architecture.md +90 -0
- package/dist/presets/frontend/hooks/.env.example +9 -0
- package/dist/presets/frontend/hooks/README.md +28 -0
- package/dist/presets/frontend/hooks/discord-notify.js +31 -0
- package/dist/presets/frontend/hooks/discord-notify.ps1 +19 -0
- package/dist/presets/frontend/hooks/discord-notify.sh +15 -0
- package/dist/presets/frontend/hooks/git-status-tracker.js +26 -0
- package/dist/presets/frontend/hooks/modularization-hook.js +36 -0
- package/dist/presets/frontend/hooks/pre-commit-lint.js +15 -0
- package/dist/presets/frontend/hooks/scout-block.js +30 -0
- package/dist/presets/frontend/hooks/scout-block.ps1 +26 -0
- package/dist/presets/frontend/hooks/scout-block.sh +31 -0
- package/dist/presets/frontend/hooks/telegram-notify.js +30 -0
- package/dist/presets/frontend/hooks/telegram-notify.ps1 +22 -0
- package/dist/presets/frontend/hooks/telegram-notify.sh +16 -0
- package/dist/presets/frontend/manifest.json +151 -0
- package/dist/presets/frontend/settings.json +31 -0
- package/dist/presets/frontend/skills/.env.example +8 -0
- package/dist/presets/frontend/skills/INSTALLATION.md +34 -0
- package/dist/presets/frontend/skills/README.md +32 -0
- package/dist/presets/frontend/skills/THIRD_PARTY_NOTICES.md +18 -0
- package/dist/presets/frontend/skills/aesthetic/SKILL.md +60 -0
- package/dist/presets/frontend/skills/agent_skills_spec.md +37 -0
- package/dist/presets/frontend/skills/ai-multimodal/SKILL.md +32 -0
- package/dist/presets/frontend/skills/chrome-devtools/SKILL.md +51 -0
- package/dist/presets/frontend/skills/code-review/SKILL.md +42 -0
- package/dist/presets/frontend/skills/debugging/SKILL.md +34 -0
- package/dist/presets/frontend/skills/docs-seeker/SKILL.md +38 -0
- package/dist/presets/frontend/skills/frontend-design/SKILL.md +43 -0
- package/dist/presets/frontend/skills/frontend-development/SKILL.md +50 -0
- package/dist/presets/frontend/skills/mcp-builder/SKILL.md +41 -0
- package/dist/presets/frontend/skills/mcp-management/SKILL.md +40 -0
- package/dist/presets/frontend/skills/media-processing/SKILL.md +41 -0
- package/dist/presets/frontend/skills/planning/SKILL.md +39 -0
- package/dist/presets/frontend/skills/problem-solving/SKILL.md +37 -0
- package/dist/presets/frontend/skills/repomix/SKILL.md +39 -0
- package/dist/presets/frontend/skills/research/SKILL.md +34 -0
- package/dist/presets/frontend/skills/sequential-thinking/SKILL.md +33 -0
- package/dist/presets/frontend/skills/skill-creator/SKILL.md +55 -0
- package/dist/presets/frontend/skills/template-skill/SKILL.md +20 -0
- package/dist/presets/frontend/skills/template-skill/assets/.gitkeep +0 -0
- package/dist/presets/frontend/skills/template-skill/references/.gitkeep +0 -0
- package/dist/presets/frontend/skills/template-skill/scripts/.gitkeep +0 -0
- package/dist/presets/frontend/skills/threejs/SKILL.md +65 -0
- package/dist/presets/frontend/skills/ui-styling/SKILL.md +49 -0
- package/dist/presets/frontend/skills/web-frameworks/SKILL.md +56 -0
- package/dist/presets/frontend/specs/_templates/frontend/design.md +66 -0
- package/dist/presets/frontend/specs/_templates/frontend/requirements.md +41 -0
- package/dist/presets/frontend/specs/_templates/frontend/tasks.md +44 -0
- package/dist/presets/frontend/statusline.js +22 -0
- package/dist/presets/frontend/statusline.ps1 +16 -0
- package/dist/presets/frontend/statusline.sh +17 -0
- package/dist/presets/frontend/steering/nextjs-patterns.md +77 -0
- package/dist/presets/frontend/steering/react-conventions.md +59 -0
- package/dist/presets/frontend/workflows/development-rules.md +34 -0
- package/dist/presets/frontend/workflows/documentation-management.md +24 -0
- package/dist/presets/frontend/workflows/orchestration-protocol.md +18 -0
- package/dist/presets/frontend/workflows/primary-workflow.md +33 -0
- package/dist/presets/fullstack/.env.example +37 -0
- package/dist/presets/fullstack/.mcp.json.example +37 -0
- package/dist/presets/fullstack/README.md +40 -0
- package/dist/presets/fullstack/agents/api-developer.md +45 -0
- package/dist/presets/fullstack/agents/brainstormer.md +33 -0
- package/dist/presets/fullstack/agents/code-reviewer.md +32 -0
- package/dist/presets/fullstack/agents/copywriter.md +34 -0
- package/dist/presets/fullstack/agents/database-admin.md +34 -0
- package/dist/presets/fullstack/agents/database-architect.md +45 -0
- package/dist/presets/fullstack/agents/debugger.md +33 -0
- package/dist/presets/fullstack/agents/docs-manager.md +30 -0
- package/dist/presets/fullstack/agents/fullstack-developer.md +45 -0
- package/dist/presets/fullstack/agents/git-manager.md +32 -0
- package/dist/presets/fullstack/agents/journal-writer.md +32 -0
- package/dist/presets/fullstack/agents/mcp-manager.md +30 -0
- package/dist/presets/fullstack/agents/performance-optimizer.md +52 -0
- package/dist/presets/fullstack/agents/planner.md +31 -0
- package/dist/presets/fullstack/agents/project-manager.md +31 -0
- package/dist/presets/fullstack/agents/researcher.md +30 -0
- package/dist/presets/fullstack/agents/scout-external.md +29 -0
- package/dist/presets/fullstack/agents/scout.md +29 -0
- package/dist/presets/fullstack/agents/tester.md +32 -0
- package/dist/presets/fullstack/agents/ui-ux-designer.md +33 -0
- package/dist/presets/fullstack/commands/bootstrap.md +16 -0
- package/dist/presets/fullstack/commands/clean.md +12 -0
- package/dist/presets/fullstack/commands/design/figma.md +15 -0
- package/dist/presets/fullstack/commands/design/system.md +11 -0
- package/dist/presets/fullstack/commands/design/wireframe.md +15 -0
- package/dist/presets/fullstack/commands/docs/architecture.md +11 -0
- package/dist/presets/fullstack/commands/docs/summarize.md +15 -0
- package/dist/presets/fullstack/commands/docs/update.md +15 -0
- package/dist/presets/fullstack/commands/fix/build.md +11 -0
- package/dist/presets/fullstack/commands/fix/lint.md +10 -0
- package/dist/presets/fullstack/commands/fix/tests.md +16 -0
- package/dist/presets/fullstack/commands/fullstack/api-route.md +17 -0
- package/dist/presets/fullstack/commands/fullstack/component.md +17 -0
- package/dist/presets/fullstack/commands/fullstack/deploy.md +17 -0
- package/dist/presets/fullstack/commands/fullstack/migration.md +16 -0
- package/dist/presets/fullstack/commands/git/branch.md +15 -0
- package/dist/presets/fullstack/commands/git/commit.md +16 -0
- package/dist/presets/fullstack/commands/git/pr.md +16 -0
- package/dist/presets/fullstack/commands/lint.md +11 -0
- package/dist/presets/fullstack/commands/plan/feature.md +15 -0
- package/dist/presets/fullstack/commands/plan/refactor.md +15 -0
- package/dist/presets/fullstack/commands/release.md +17 -0
- package/dist/presets/fullstack/commands/review/code.md +15 -0
- package/dist/presets/fullstack/commands/review/security.md +16 -0
- package/dist/presets/fullstack/commands/scout/ext.md +17 -0
- package/dist/presets/fullstack/commands/scout.md +16 -0
- package/dist/presets/fullstack/commands/skill/add.md +16 -0
- package/dist/presets/fullstack/commands/skill/create.md +16 -0
- package/dist/presets/fullstack/commands/skill/optimize.md +16 -0
- package/dist/presets/fullstack/commands/test.md +15 -0
- package/dist/presets/fullstack/docs/code-standards.md +74 -0
- package/dist/presets/fullstack/docs/project-roadmap.md +78 -0
- package/dist/presets/fullstack/docs/system-architecture.md +97 -0
- package/dist/presets/fullstack/hooks/.env.example +9 -0
- package/dist/presets/fullstack/hooks/README.md +28 -0
- package/dist/presets/fullstack/hooks/discord-notify.js +31 -0
- package/dist/presets/fullstack/hooks/discord-notify.ps1 +19 -0
- package/dist/presets/fullstack/hooks/discord-notify.sh +15 -0
- package/dist/presets/fullstack/hooks/git-status-tracker.js +26 -0
- package/dist/presets/fullstack/hooks/modularization-hook.js +36 -0
- package/dist/presets/fullstack/hooks/pre-commit-lint.js +15 -0
- package/dist/presets/fullstack/hooks/scout-block.js +30 -0
- package/dist/presets/fullstack/hooks/scout-block.ps1 +26 -0
- package/dist/presets/fullstack/hooks/scout-block.sh +31 -0
- package/dist/presets/fullstack/hooks/telegram-notify.js +30 -0
- package/dist/presets/fullstack/hooks/telegram-notify.ps1 +22 -0
- package/dist/presets/fullstack/hooks/telegram-notify.sh +16 -0
- package/dist/presets/fullstack/manifest.json +156 -0
- package/dist/presets/fullstack/settings.json +31 -0
- package/dist/presets/fullstack/skills/.env.example +10 -0
- package/dist/presets/fullstack/skills/INSTALLATION.md +28 -0
- package/dist/presets/fullstack/skills/README.md +38 -0
- package/dist/presets/fullstack/skills/THIRD_PARTY_NOTICES.md +22 -0
- package/dist/presets/fullstack/skills/agent_skills_spec.md +39 -0
- package/dist/presets/fullstack/skills/ai-multimodal/SKILL.md +32 -0
- package/dist/presets/fullstack/skills/backend-development/SKILL.md +40 -0
- package/dist/presets/fullstack/skills/better-auth/SKILL.md +45 -0
- package/dist/presets/fullstack/skills/code-review/SKILL.md +28 -0
- package/dist/presets/fullstack/skills/databases/SKILL.md +39 -0
- package/dist/presets/fullstack/skills/debugging/SKILL.md +46 -0
- package/dist/presets/fullstack/skills/devops/SKILL.md +42 -0
- package/dist/presets/fullstack/skills/docs-seeker/SKILL.md +30 -0
- package/dist/presets/fullstack/skills/frontend-design/SKILL.md +32 -0
- package/dist/presets/fullstack/skills/frontend-development/SKILL.md +33 -0
- package/dist/presets/fullstack/skills/mcp-builder/SKILL.md +37 -0
- package/dist/presets/fullstack/skills/payment-integration/SKILL.md +50 -0
- package/dist/presets/fullstack/skills/planning/SKILL.md +41 -0
- package/dist/presets/fullstack/skills/problem-solving/SKILL.md +32 -0
- package/dist/presets/fullstack/skills/repomix/SKILL.md +40 -0
- package/dist/presets/fullstack/skills/research/SKILL.md +32 -0
- package/dist/presets/fullstack/skills/sequential-thinking/SKILL.md +32 -0
- package/dist/presets/fullstack/skills/shopify/SKILL.md +44 -0
- package/dist/presets/fullstack/skills/skill-creator/SKILL.md +36 -0
- package/dist/presets/fullstack/skills/template-skill/SKILL.md +26 -0
- package/dist/presets/fullstack/skills/ui-styling/SKILL.md +39 -0
- package/dist/presets/fullstack/skills/web-frameworks/SKILL.md +39 -0
- package/dist/presets/fullstack/specs/_templates/fullstack/design.md +87 -0
- package/dist/presets/fullstack/specs/_templates/fullstack/requirements.md +54 -0
- package/dist/presets/fullstack/specs/_templates/fullstack/tasks.md +40 -0
- package/dist/presets/fullstack/statusline.js +15 -0
- package/dist/presets/fullstack/statusline.ps1 +5 -0
- package/dist/presets/fullstack/statusline.sh +5 -0
- package/dist/presets/fullstack/steering/fullstack-conventions.md +77 -0
- package/dist/presets/fullstack/steering/nextjs-app-router.md +92 -0
- package/dist/presets/fullstack/workflows/development-rules.md +34 -0
- package/dist/presets/fullstack/workflows/documentation-management.md +24 -0
- package/dist/presets/fullstack/workflows/orchestration-protocol.md +18 -0
- package/dist/presets/fullstack/workflows/primary-workflow.md +33 -0
- package/dist/presets/mobile/.env.example +28 -0
- package/dist/presets/mobile/.mcp.json.example +30 -0
- package/dist/presets/mobile/README.md +56 -0
- package/dist/presets/mobile/agents/accessibility-auditor.md +73 -0
- package/dist/presets/mobile/agents/brainstormer.md +45 -0
- package/dist/presets/mobile/agents/code-reviewer.md +53 -0
- package/dist/presets/mobile/agents/copywriter.md +34 -0
- package/dist/presets/mobile/agents/database-admin.md +36 -0
- package/dist/presets/mobile/agents/debugger.md +44 -0
- package/dist/presets/mobile/agents/docs-manager.md +41 -0
- package/dist/presets/mobile/agents/git-manager.md +47 -0
- package/dist/presets/mobile/agents/journal-writer.md +46 -0
- package/dist/presets/mobile/agents/mcp-manager.md +30 -0
- package/dist/presets/mobile/agents/mobile-developer.md +57 -0
- package/dist/presets/mobile/agents/navigation-architect.md +50 -0
- package/dist/presets/mobile/agents/performance-optimizer.md +75 -0
- package/dist/presets/mobile/agents/planner.md +40 -0
- package/dist/presets/mobile/agents/platform-specialist.md +55 -0
- package/dist/presets/mobile/agents/project-manager.md +41 -0
- package/dist/presets/mobile/agents/researcher.md +41 -0
- package/dist/presets/mobile/agents/scout-external.md +35 -0
- package/dist/presets/mobile/agents/scout.md +36 -0
- package/dist/presets/mobile/agents/state-manager.md +50 -0
- package/dist/presets/mobile/agents/tester.md +60 -0
- package/dist/presets/mobile/agents/ui-ux-designer.md +46 -0
- package/dist/presets/mobile/agents/widget-architect.md +52 -0
- package/dist/presets/mobile/commands/bootstrap.md +16 -0
- package/dist/presets/mobile/commands/clean.md +15 -0
- package/dist/presets/mobile/commands/design/figma.md +15 -0
- package/dist/presets/mobile/commands/design/system.md +15 -0
- package/dist/presets/mobile/commands/design/wireframe.md +16 -0
- package/dist/presets/mobile/commands/docs/architecture.md +16 -0
- package/dist/presets/mobile/commands/docs/summarize.md +15 -0
- package/dist/presets/mobile/commands/docs/update.md +15 -0
- package/dist/presets/mobile/commands/fix/build.md +15 -0
- package/dist/presets/mobile/commands/fix/lint.md +14 -0
- package/dist/presets/mobile/commands/fix/tests.md +16 -0
- package/dist/presets/mobile/commands/git/branch.md +16 -0
- package/dist/presets/mobile/commands/git/commit.md +16 -0
- package/dist/presets/mobile/commands/git/pr.md +16 -0
- package/dist/presets/mobile/commands/lint.md +15 -0
- package/dist/presets/mobile/commands/mobile/navigation.md +34 -0
- package/dist/presets/mobile/commands/mobile/platform.md +42 -0
- package/dist/presets/mobile/commands/mobile/screen.md +46 -0
- package/dist/presets/mobile/commands/mobile/widget.md +42 -0
- package/dist/presets/mobile/commands/plan/feature.md +16 -0
- package/dist/presets/mobile/commands/plan/refactor.md +17 -0
- package/dist/presets/mobile/commands/release.md +17 -0
- package/dist/presets/mobile/commands/review/code.md +16 -0
- package/dist/presets/mobile/commands/review/security.md +16 -0
- package/dist/presets/mobile/commands/scout/ext.md +16 -0
- package/dist/presets/mobile/commands/scout.md +16 -0
- package/dist/presets/mobile/commands/skill/add.md +16 -0
- package/dist/presets/mobile/commands/skill/create.md +16 -0
- package/dist/presets/mobile/commands/skill/optimize.md +16 -0
- package/dist/presets/mobile/commands/test.md +17 -0
- package/dist/presets/mobile/docs/code-standards.md +74 -0
- package/dist/presets/mobile/docs/project-roadmap.md +48 -0
- package/dist/presets/mobile/docs/system-architecture.md +70 -0
- package/dist/presets/mobile/hooks/.env.example +9 -0
- package/dist/presets/mobile/hooks/README.md +28 -0
- package/dist/presets/mobile/hooks/discord-notify.js +31 -0
- package/dist/presets/mobile/hooks/discord-notify.ps1 +19 -0
- package/dist/presets/mobile/hooks/discord-notify.sh +15 -0
- package/dist/presets/mobile/hooks/git-status-tracker.js +26 -0
- package/dist/presets/mobile/hooks/modularization-hook.js +36 -0
- package/dist/presets/mobile/hooks/pre-commit-lint.js +26 -0
- package/dist/presets/mobile/hooks/scout-block.js +30 -0
- package/dist/presets/mobile/hooks/scout-block.ps1 +26 -0
- package/dist/presets/mobile/hooks/scout-block.sh +31 -0
- package/dist/presets/mobile/hooks/telegram-notify.js +30 -0
- package/dist/presets/mobile/hooks/telegram-notify.ps1 +22 -0
- package/dist/presets/mobile/hooks/telegram-notify.sh +16 -0
- package/dist/presets/mobile/manifest.json +158 -0
- package/dist/presets/mobile/settings.json +31 -0
- package/dist/presets/mobile/skills/.env.example +12 -0
- package/dist/presets/mobile/skills/INSTALLATION.md +28 -0
- package/dist/presets/mobile/skills/README.md +46 -0
- package/dist/presets/mobile/skills/THIRD_PARTY_NOTICES.md +12 -0
- package/dist/presets/mobile/skills/agent_skills_spec.md +37 -0
- package/dist/presets/mobile/skills/ai-multimodal/SKILL.md +41 -0
- package/dist/presets/mobile/skills/app-deployment/SKILL.md +50 -0
- package/dist/presets/mobile/skills/chrome-devtools/SKILL.md +39 -0
- package/dist/presets/mobile/skills/code-review/SKILL.md +30 -0
- package/dist/presets/mobile/skills/debugging/SKILL.md +36 -0
- package/dist/presets/mobile/skills/docs-seeker/SKILL.md +39 -0
- package/dist/presets/mobile/skills/flutter-state/SKILL.md +42 -0
- package/dist/presets/mobile/skills/frontend-design/SKILL.md +42 -0
- package/dist/presets/mobile/skills/frontend-development/SKILL.md +42 -0
- package/dist/presets/mobile/skills/mcp-builder/SKILL.md +32 -0
- package/dist/presets/mobile/skills/mcp-management/SKILL.md +32 -0
- package/dist/presets/mobile/skills/media-processing/SKILL.md +38 -0
- package/dist/presets/mobile/skills/mobile-development/SKILL.md +48 -0
- package/dist/presets/mobile/skills/mobile-testing/SKILL.md +43 -0
- package/dist/presets/mobile/skills/native-integration/SKILL.md +41 -0
- package/dist/presets/mobile/skills/offline-first/SKILL.md +41 -0
- package/dist/presets/mobile/skills/planning/SKILL.md +39 -0
- package/dist/presets/mobile/skills/problem-solving/SKILL.md +32 -0
- package/dist/presets/mobile/skills/repomix/SKILL.md +36 -0
- package/dist/presets/mobile/skills/research/SKILL.md +34 -0
- package/dist/presets/mobile/skills/sequential-thinking/SKILL.md +33 -0
- package/dist/presets/mobile/skills/skill-creator/SKILL.md +40 -0
- package/dist/presets/mobile/skills/template-skill/SKILL.md +23 -0
- package/dist/presets/mobile/skills/ui-styling/SKILL.md +51 -0
- package/dist/presets/mobile/skills/web-frameworks/SKILL.md +37 -0
- package/dist/presets/mobile/specs/_templates/mobile/design.md +62 -0
- package/dist/presets/mobile/specs/_templates/mobile/requirements.md +47 -0
- package/dist/presets/mobile/specs/_templates/mobile/tasks.md +52 -0
- package/dist/presets/mobile/statusline.js +22 -0
- package/dist/presets/mobile/statusline.ps1 +16 -0
- package/dist/presets/mobile/statusline.sh +17 -0
- package/dist/presets/mobile/steering/flutter-conventions.md +60 -0
- package/dist/presets/mobile/steering/mobile-patterns.md +54 -0
- package/dist/presets/mobile/workflows/development-rules.md +36 -0
- package/dist/presets/mobile/workflows/documentation-management.md +25 -0
- package/dist/presets/mobile/workflows/orchestration-protocol.md +19 -0
- package/dist/presets/mobile/workflows/primary-workflow.md +36 -0
- package/package.json +65 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,2067 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import { createRequire } from "module";
|
|
5
|
+
import process13 from "process";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
|
|
8
|
+
// src/commands/init.ts
|
|
9
|
+
import fs10 from "fs";
|
|
10
|
+
import path9 from "path";
|
|
11
|
+
import process5 from "process";
|
|
12
|
+
import readline from "readline";
|
|
13
|
+
import crypto3 from "crypto";
|
|
14
|
+
|
|
15
|
+
// src/core/PresetLoader.ts
|
|
16
|
+
import fs2 from "fs";
|
|
17
|
+
import path2 from "path";
|
|
18
|
+
import { fileURLToPath } from "url";
|
|
19
|
+
|
|
20
|
+
// src/core/ManifestParser.ts
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
import fs from "fs";
|
|
23
|
+
import path from "path";
|
|
24
|
+
|
|
25
|
+
// src/core/errors.ts
|
|
26
|
+
var KKError = class _KKError extends Error {
|
|
27
|
+
code;
|
|
28
|
+
suggestion;
|
|
29
|
+
constructor(code, message, suggestion) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.name = "KKError";
|
|
32
|
+
this.code = code;
|
|
33
|
+
this.suggestion = suggestion;
|
|
34
|
+
Object.setPrototypeOf(this, _KKError.prototype);
|
|
35
|
+
}
|
|
36
|
+
format() {
|
|
37
|
+
let output = `[${this.code}] ${this.message}`;
|
|
38
|
+
if (this.suggestion) {
|
|
39
|
+
output += `
|
|
40
|
+
Suggestion: ${this.suggestion}`;
|
|
41
|
+
}
|
|
42
|
+
return output;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var ErrorCodes = {
|
|
46
|
+
NODE_VERSION: "KK001",
|
|
47
|
+
MANIFEST_INVALID: "KK010",
|
|
48
|
+
MANIFEST_MISSING_FIELD: "KK011",
|
|
49
|
+
MANIFEST_ORPHAN_FILE: "KK012",
|
|
50
|
+
MANIFEST_INCOMPLETE: "KK013",
|
|
51
|
+
PRESET_NOT_FOUND: "KK020",
|
|
52
|
+
PRESET_LOAD_FAILED: "KK021",
|
|
53
|
+
CONFLICT_UNRESOLVED: "KK030",
|
|
54
|
+
TRACKING_CORRUPT: "KK040",
|
|
55
|
+
TRACKING_WRITE_FAILED: "KK041",
|
|
56
|
+
BACKUP_NOT_FOUND: "KK050",
|
|
57
|
+
BACKUP_WRITE_FAILED: "KK051",
|
|
58
|
+
MCP_MERGE_CONFLICT: "KK060",
|
|
59
|
+
MCP_INVALID_JSON: "KK061",
|
|
60
|
+
SETTINGS_MERGE_WARN: "KK070",
|
|
61
|
+
FRONTMATTER_INVALID: "KK080",
|
|
62
|
+
FRONTMATTER_MISSING: "KK081",
|
|
63
|
+
DOCTOR_FAIL: "KK090",
|
|
64
|
+
DOCTOR_WARN: "KK091"
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// src/core/ManifestParser.ts
|
|
68
|
+
var ArtifactTypeSchema = z.enum([
|
|
69
|
+
"steering",
|
|
70
|
+
"hook",
|
|
71
|
+
"mcp",
|
|
72
|
+
"skill",
|
|
73
|
+
"agent",
|
|
74
|
+
"command",
|
|
75
|
+
"workflow",
|
|
76
|
+
"statusline",
|
|
77
|
+
"metadata",
|
|
78
|
+
"settings",
|
|
79
|
+
"env",
|
|
80
|
+
"spec",
|
|
81
|
+
"docs",
|
|
82
|
+
"doc",
|
|
83
|
+
"config",
|
|
84
|
+
"other"
|
|
85
|
+
]);
|
|
86
|
+
var PresetNameSchema = z.enum([
|
|
87
|
+
"frontend",
|
|
88
|
+
"backend",
|
|
89
|
+
"fullstack",
|
|
90
|
+
"mobile",
|
|
91
|
+
"devops",
|
|
92
|
+
"data-ai"
|
|
93
|
+
]);
|
|
94
|
+
var FileEntrySchema = z.object({
|
|
95
|
+
source: z.string().min(1),
|
|
96
|
+
target: z.string().min(1),
|
|
97
|
+
type: ArtifactTypeSchema,
|
|
98
|
+
executable: z.boolean().optional()
|
|
99
|
+
});
|
|
100
|
+
var MCPServerDefSchema = z.object({
|
|
101
|
+
command: z.string().min(1),
|
|
102
|
+
args: z.array(z.string()).optional(),
|
|
103
|
+
env: z.record(z.string()).optional()
|
|
104
|
+
});
|
|
105
|
+
var HookEntrySchema = z.union([
|
|
106
|
+
z.object({
|
|
107
|
+
matcher: z.string().optional(),
|
|
108
|
+
command: z.string().min(1)
|
|
109
|
+
}),
|
|
110
|
+
z.string().min(1)
|
|
111
|
+
]);
|
|
112
|
+
var ManifestSchema = z.object({
|
|
113
|
+
name: z.string().min(1),
|
|
114
|
+
version: z.string().min(1),
|
|
115
|
+
description: z.string().min(1),
|
|
116
|
+
category: PresetNameSchema,
|
|
117
|
+
files: z.array(FileEntrySchema).min(1),
|
|
118
|
+
dependencies: z.array(PresetNameSchema).optional(),
|
|
119
|
+
mcpServers: z.record(MCPServerDefSchema).optional(),
|
|
120
|
+
hooks: z.object({
|
|
121
|
+
PreToolUse: z.array(HookEntrySchema).optional(),
|
|
122
|
+
PostToolUse: z.array(HookEntrySchema).optional(),
|
|
123
|
+
agentStop: z.array(HookEntrySchema).optional(),
|
|
124
|
+
fileEdited: z.array(HookEntrySchema).optional()
|
|
125
|
+
}).optional(),
|
|
126
|
+
tags: z.array(z.string()).optional(),
|
|
127
|
+
minCounts: z.object({
|
|
128
|
+
agents: z.number().int().nonnegative().optional(),
|
|
129
|
+
skills: z.number().int().nonnegative().optional(),
|
|
130
|
+
commands: z.number().int().nonnegative().optional(),
|
|
131
|
+
hooks: z.number().int().nonnegative().optional(),
|
|
132
|
+
workflows: z.number().int().nonnegative().optional()
|
|
133
|
+
}).optional()
|
|
134
|
+
});
|
|
135
|
+
function parse(json) {
|
|
136
|
+
let raw;
|
|
137
|
+
try {
|
|
138
|
+
raw = JSON.parse(json);
|
|
139
|
+
} catch {
|
|
140
|
+
return {
|
|
141
|
+
ok: false,
|
|
142
|
+
error: {
|
|
143
|
+
code: ErrorCodes.MANIFEST_INVALID,
|
|
144
|
+
message: "Manifest is not valid JSON."
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const result = ManifestSchema.safeParse(raw);
|
|
149
|
+
if (!result.success) {
|
|
150
|
+
const issues = result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
|
|
151
|
+
return {
|
|
152
|
+
ok: false,
|
|
153
|
+
error: {
|
|
154
|
+
code: ErrorCodes.MANIFEST_MISSING_FIELD,
|
|
155
|
+
message: `Manifest schema validation failed: ${issues}`
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return { ok: true, value: result.data };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// src/core/PresetLoader.ts
|
|
163
|
+
var __dirname = path2.dirname(fileURLToPath(import.meta.url));
|
|
164
|
+
function getPresetsDir() {
|
|
165
|
+
const candidates = [
|
|
166
|
+
path2.resolve(__dirname, "presets"),
|
|
167
|
+
// dist/presets (current bundle)
|
|
168
|
+
path2.resolve(__dirname, "../presets"),
|
|
169
|
+
// legacy layout
|
|
170
|
+
path2.resolve(__dirname, "../../../../presets")
|
|
171
|
+
// dev/source checkout
|
|
172
|
+
];
|
|
173
|
+
for (const candidate of candidates) {
|
|
174
|
+
if (fs2.existsSync(candidate)) return candidate;
|
|
175
|
+
}
|
|
176
|
+
throw new KKError(
|
|
177
|
+
ErrorCodes.PRESET_NOT_FOUND,
|
|
178
|
+
"Cannot locate presets directory.",
|
|
179
|
+
"Ensure kiro-kit is installed correctly."
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
function load(name) {
|
|
183
|
+
const presetsDir = getPresetsDir();
|
|
184
|
+
const presetDir = path2.join(presetsDir, name);
|
|
185
|
+
if (!fs2.existsSync(presetDir)) {
|
|
186
|
+
throw new KKError(
|
|
187
|
+
ErrorCodes.PRESET_NOT_FOUND,
|
|
188
|
+
`Preset "${name}" not found.`,
|
|
189
|
+
`Available presets: ${listAvailable().join(", ")}`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
const manifestPath = path2.join(presetDir, "manifest.json");
|
|
193
|
+
if (!fs2.existsSync(manifestPath)) {
|
|
194
|
+
throw new KKError(
|
|
195
|
+
ErrorCodes.PRESET_LOAD_FAILED,
|
|
196
|
+
`Preset "${name}" is missing manifest.json.`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
const raw = fs2.readFileSync(manifestPath, "utf-8");
|
|
200
|
+
const result = parse(raw);
|
|
201
|
+
if (!result.ok) {
|
|
202
|
+
throw new KKError(
|
|
203
|
+
ErrorCodes.PRESET_LOAD_FAILED,
|
|
204
|
+
`Preset "${name}" manifest parse error: ${result.error.message}`
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
return { manifest: result.value, dir: presetDir };
|
|
208
|
+
}
|
|
209
|
+
function loadAll(names) {
|
|
210
|
+
return names.map((n) => load(n));
|
|
211
|
+
}
|
|
212
|
+
function listAvailable() {
|
|
213
|
+
const presetsDir = getPresetsDir();
|
|
214
|
+
try {
|
|
215
|
+
return fs2.readdirSync(presetsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).filter((d) => !d.name.startsWith("_")).filter(
|
|
216
|
+
(d) => fs2.existsSync(path2.join(presetsDir, d.name, "manifest.json"))
|
|
217
|
+
).map((d) => d.name);
|
|
218
|
+
} catch {
|
|
219
|
+
return [];
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// src/core/ConflictResolver.ts
|
|
224
|
+
import fs3 from "fs";
|
|
225
|
+
import crypto from "crypto";
|
|
226
|
+
function sha256(data) {
|
|
227
|
+
return crypto.createHash("sha256").update(data).digest("hex");
|
|
228
|
+
}
|
|
229
|
+
async function resolve(opts) {
|
|
230
|
+
const { target, sourceContent, mode, sessionState, prompt, showDiff: showDiff2 } = opts;
|
|
231
|
+
if (!fs3.existsSync(target)) {
|
|
232
|
+
return "WRITE_NEW";
|
|
233
|
+
}
|
|
234
|
+
const currentContent = fs3.readFileSync(target);
|
|
235
|
+
const currentHash = sha256(currentContent);
|
|
236
|
+
const newHash = sha256(sourceContent);
|
|
237
|
+
if (currentHash === newHash) {
|
|
238
|
+
return "NO_OP";
|
|
239
|
+
}
|
|
240
|
+
if (mode === "force") {
|
|
241
|
+
return "OVERWRITE_WITH_BACKUP";
|
|
242
|
+
}
|
|
243
|
+
if (mode === "skip-existing") {
|
|
244
|
+
return "SKIP";
|
|
245
|
+
}
|
|
246
|
+
if (sessionState.overwriteAll) {
|
|
247
|
+
return "OVERWRITE_WITH_BACKUP";
|
|
248
|
+
}
|
|
249
|
+
if (!prompt) {
|
|
250
|
+
return "SKIP";
|
|
251
|
+
}
|
|
252
|
+
while (true) {
|
|
253
|
+
const choice = await prompt(target);
|
|
254
|
+
switch (choice) {
|
|
255
|
+
case "view-diff":
|
|
256
|
+
if (showDiff2) {
|
|
257
|
+
showDiff2(target, sourceContent);
|
|
258
|
+
}
|
|
259
|
+
continue;
|
|
260
|
+
case "overwrite":
|
|
261
|
+
return "OVERWRITE_WITH_BACKUP";
|
|
262
|
+
case "skip":
|
|
263
|
+
return "SKIP";
|
|
264
|
+
case "overwrite-all":
|
|
265
|
+
sessionState.overwriteAll = true;
|
|
266
|
+
return "OVERWRITE_WITH_BACKUP";
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// src/core/BackupManager.ts
|
|
272
|
+
import fs4 from "fs";
|
|
273
|
+
import path3 from "path";
|
|
274
|
+
var BACKUP_DIR = ".kiro/.backup";
|
|
275
|
+
function generateTimestamp() {
|
|
276
|
+
const now = /* @__PURE__ */ new Date();
|
|
277
|
+
const y = now.getFullYear();
|
|
278
|
+
const mo = String(now.getMonth() + 1).padStart(2, "0");
|
|
279
|
+
const d = String(now.getDate()).padStart(2, "0");
|
|
280
|
+
const h = String(now.getHours()).padStart(2, "0");
|
|
281
|
+
const mi = String(now.getMinutes()).padStart(2, "0");
|
|
282
|
+
const s = String(now.getSeconds()).padStart(2, "0");
|
|
283
|
+
const ms = String(now.getMilliseconds()).padStart(3, "0");
|
|
284
|
+
return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;
|
|
285
|
+
}
|
|
286
|
+
function backup(workspaceRoot, target, timestamp) {
|
|
287
|
+
const ts = timestamp ?? generateTimestamp();
|
|
288
|
+
const relPath = path3.relative(workspaceRoot, target);
|
|
289
|
+
const backupPath = path3.join(workspaceRoot, BACKUP_DIR, ts, relPath);
|
|
290
|
+
const backupDir = path3.dirname(backupPath);
|
|
291
|
+
fs4.mkdirSync(backupDir, { recursive: true });
|
|
292
|
+
fs4.copyFileSync(target, backupPath);
|
|
293
|
+
return ts;
|
|
294
|
+
}
|
|
295
|
+
function restore(workspaceRoot, timestamp) {
|
|
296
|
+
const ts = timestamp ?? getLatestTimestamp(workspaceRoot);
|
|
297
|
+
if (!ts) {
|
|
298
|
+
throw new KKError(
|
|
299
|
+
ErrorCodes.BACKUP_NOT_FOUND,
|
|
300
|
+
"No backup found.",
|
|
301
|
+
"Run kiro-kit init or add first to create backups."
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
const backupRoot = path3.join(workspaceRoot, BACKUP_DIR, ts);
|
|
305
|
+
if (!fs4.existsSync(backupRoot)) {
|
|
306
|
+
throw new KKError(
|
|
307
|
+
ErrorCodes.BACKUP_NOT_FOUND,
|
|
308
|
+
`Backup timestamp "${ts}" not found.`,
|
|
309
|
+
`Available: ${listTimestamps(workspaceRoot).join(", ") || "none"}`
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
const restored = [];
|
|
313
|
+
const walkAndRestore = (dir, relPrefix) => {
|
|
314
|
+
const entries = fs4.readdirSync(dir, { withFileTypes: true });
|
|
315
|
+
for (const entry of entries) {
|
|
316
|
+
const fullPath = path3.join(dir, entry.name);
|
|
317
|
+
const rel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;
|
|
318
|
+
if (entry.isDirectory()) {
|
|
319
|
+
walkAndRestore(fullPath, rel);
|
|
320
|
+
} else if (entry.isFile()) {
|
|
321
|
+
const targetPath = path3.join(workspaceRoot, rel);
|
|
322
|
+
const targetDir = path3.dirname(targetPath);
|
|
323
|
+
fs4.mkdirSync(targetDir, { recursive: true });
|
|
324
|
+
fs4.copyFileSync(fullPath, targetPath);
|
|
325
|
+
restored.push(rel);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
walkAndRestore(backupRoot, "");
|
|
330
|
+
return restored;
|
|
331
|
+
}
|
|
332
|
+
function listTimestamps(workspaceRoot) {
|
|
333
|
+
const backupBase = path3.join(workspaceRoot, BACKUP_DIR);
|
|
334
|
+
if (!fs4.existsSync(backupBase)) return [];
|
|
335
|
+
try {
|
|
336
|
+
return fs4.readdirSync(backupBase, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name).sort().reverse();
|
|
337
|
+
} catch {
|
|
338
|
+
return [];
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
function getLatestTimestamp(workspaceRoot) {
|
|
342
|
+
const timestamps = listTimestamps(workspaceRoot);
|
|
343
|
+
return timestamps[0];
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// src/core/TrackingStore.ts
|
|
347
|
+
import fs5 from "fs";
|
|
348
|
+
import path4 from "path";
|
|
349
|
+
|
|
350
|
+
// src/utils/logger.ts
|
|
351
|
+
import process3 from "process";
|
|
352
|
+
|
|
353
|
+
// src/utils/color.ts
|
|
354
|
+
import pc from "picocolors";
|
|
355
|
+
import process2 from "process";
|
|
356
|
+
var isColorDisabled = !!process2.env["NO_COLOR"] || process2.argv.includes("--no-color") || !process2.stdout.isTTY;
|
|
357
|
+
function wrap(fn) {
|
|
358
|
+
return (s) => isColorDisabled ? s : fn(s);
|
|
359
|
+
}
|
|
360
|
+
var color = {
|
|
361
|
+
green: wrap(pc.green),
|
|
362
|
+
red: wrap(pc.red),
|
|
363
|
+
yellow: wrap(pc.yellow),
|
|
364
|
+
blue: wrap(pc.blue),
|
|
365
|
+
cyan: wrap(pc.cyan),
|
|
366
|
+
gray: wrap(pc.gray),
|
|
367
|
+
bold: wrap(pc.bold),
|
|
368
|
+
dim: wrap(pc.dim)
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
// src/utils/logger.ts
|
|
372
|
+
var verboseEnabled = false;
|
|
373
|
+
var quietEnabled = false;
|
|
374
|
+
function setVerbose(enabled) {
|
|
375
|
+
verboseEnabled = enabled;
|
|
376
|
+
}
|
|
377
|
+
function setQuiet(enabled) {
|
|
378
|
+
quietEnabled = enabled;
|
|
379
|
+
}
|
|
380
|
+
var logger = {
|
|
381
|
+
info(msg) {
|
|
382
|
+
if (!quietEnabled) {
|
|
383
|
+
process3.stdout.write(`${msg}
|
|
384
|
+
`);
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
success(msg) {
|
|
388
|
+
if (!quietEnabled) {
|
|
389
|
+
process3.stdout.write(`${color.green(msg)}
|
|
390
|
+
`);
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
warn(msg) {
|
|
394
|
+
process3.stderr.write(`${color.yellow("WARN")} ${msg}
|
|
395
|
+
`);
|
|
396
|
+
},
|
|
397
|
+
error(msg) {
|
|
398
|
+
process3.stderr.write(`${color.red("ERROR")} ${msg}
|
|
399
|
+
`);
|
|
400
|
+
},
|
|
401
|
+
debug(msg) {
|
|
402
|
+
if (verboseEnabled) {
|
|
403
|
+
process3.stderr.write(`${color.dim("[debug]")} ${msg}
|
|
404
|
+
`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
// src/core/TrackingStore.ts
|
|
410
|
+
var TRACKING_FILE = ".kiro/.kiro-kit.json";
|
|
411
|
+
function getTrackingPath(workspaceRoot) {
|
|
412
|
+
return path4.join(workspaceRoot, TRACKING_FILE);
|
|
413
|
+
}
|
|
414
|
+
function read(workspaceRoot) {
|
|
415
|
+
const filePath = getTrackingPath(workspaceRoot);
|
|
416
|
+
if (!fs5.existsSync(filePath)) {
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
const raw = fs5.readFileSync(filePath, "utf-8");
|
|
420
|
+
try {
|
|
421
|
+
return JSON.parse(raw);
|
|
422
|
+
} catch {
|
|
423
|
+
logger.warn(`Tracking file is corrupt: ${filePath}`);
|
|
424
|
+
throw new KKError(
|
|
425
|
+
ErrorCodes.TRACKING_CORRUPT,
|
|
426
|
+
"Tracking file .kiro/.kiro-kit.json is corrupt (invalid JSON).",
|
|
427
|
+
"Delete the file and re-run kiro-kit init to regenerate."
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function write(workspaceRoot, data) {
|
|
432
|
+
const filePath = getTrackingPath(workspaceRoot);
|
|
433
|
+
const dir = path4.dirname(filePath);
|
|
434
|
+
fs5.mkdirSync(dir, { recursive: true });
|
|
435
|
+
fs5.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf-8");
|
|
436
|
+
}
|
|
437
|
+
function upsertPreset(data, preset) {
|
|
438
|
+
const existing = data.presets.findIndex((p) => p.name === preset.name);
|
|
439
|
+
if (existing >= 0) {
|
|
440
|
+
data.presets[existing] = preset;
|
|
441
|
+
} else {
|
|
442
|
+
data.presets.push(preset);
|
|
443
|
+
}
|
|
444
|
+
data.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
445
|
+
return data;
|
|
446
|
+
}
|
|
447
|
+
function createInitial(kitVersion) {
|
|
448
|
+
return {
|
|
449
|
+
kitVersion,
|
|
450
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
451
|
+
presets: []
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// src/core/MetadataWriter.ts
|
|
456
|
+
import fs6 from "fs";
|
|
457
|
+
import path5 from "path";
|
|
458
|
+
var METADATA_FILE = ".kiro/metadata.json";
|
|
459
|
+
function compose(opts) {
|
|
460
|
+
return {
|
|
461
|
+
version: "1.0.0",
|
|
462
|
+
name: "kiro-kit",
|
|
463
|
+
description: "Kiro IDE workspace bootstrapped by kiro-kit.",
|
|
464
|
+
buildDate: (/* @__PURE__ */ new Date()).toISOString(),
|
|
465
|
+
repository: opts.repository,
|
|
466
|
+
presets: opts.presets,
|
|
467
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
468
|
+
kitVersion: opts.kitVersion
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
function write2(workspaceRoot, metadata) {
|
|
472
|
+
const filePath = path5.join(workspaceRoot, METADATA_FILE);
|
|
473
|
+
const dir = path5.dirname(filePath);
|
|
474
|
+
fs6.mkdirSync(dir, { recursive: true });
|
|
475
|
+
fs6.writeFileSync(filePath, JSON.stringify(metadata, null, 2) + "\n", "utf-8");
|
|
476
|
+
}
|
|
477
|
+
function read2(workspaceRoot) {
|
|
478
|
+
const filePath = path5.join(workspaceRoot, METADATA_FILE);
|
|
479
|
+
if (!fs6.existsSync(filePath)) return null;
|
|
480
|
+
try {
|
|
481
|
+
return JSON.parse(fs6.readFileSync(filePath, "utf-8"));
|
|
482
|
+
} catch {
|
|
483
|
+
return null;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
function mergePresets(existing, newPresets) {
|
|
487
|
+
const merged = [...existing.presets];
|
|
488
|
+
for (const p of newPresets) {
|
|
489
|
+
const idx = merged.findIndex((m) => m.name === p.name);
|
|
490
|
+
if (idx >= 0) {
|
|
491
|
+
merged[idx] = p;
|
|
492
|
+
} else {
|
|
493
|
+
merged.push(p);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return { ...existing, presets: merged, buildDate: (/* @__PURE__ */ new Date()).toISOString() };
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// src/core/StatuslineSelector.ts
|
|
500
|
+
import fs7 from "fs";
|
|
501
|
+
import path6 from "path";
|
|
502
|
+
import process4 from "process";
|
|
503
|
+
var STATUSLINE_FILES = ["statusline.js", "statusline.sh", "statusline.ps1"];
|
|
504
|
+
function getCommand() {
|
|
505
|
+
switch (process4.platform) {
|
|
506
|
+
case "win32":
|
|
507
|
+
return "powershell -ExecutionPolicy Bypass -File .kiro/statusline.ps1";
|
|
508
|
+
default:
|
|
509
|
+
return "node .kiro/statusline.js";
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
function install(presetDir, workspaceRoot) {
|
|
513
|
+
const installed = [];
|
|
514
|
+
const targetDir = path6.join(workspaceRoot, ".kiro");
|
|
515
|
+
fs7.mkdirSync(targetDir, { recursive: true });
|
|
516
|
+
for (const file of STATUSLINE_FILES) {
|
|
517
|
+
const source = path6.join(presetDir, file);
|
|
518
|
+
if (!fs7.existsSync(source)) continue;
|
|
519
|
+
const target = path6.join(targetDir, file);
|
|
520
|
+
fs7.copyFileSync(source, target);
|
|
521
|
+
installed.push(`.kiro/${file}`);
|
|
522
|
+
if (file.endsWith(".sh") && process4.platform !== "win32") {
|
|
523
|
+
try {
|
|
524
|
+
fs7.chmodSync(target, 493);
|
|
525
|
+
} catch {
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return installed;
|
|
530
|
+
}
|
|
531
|
+
function resolveSettingsCommand(settings) {
|
|
532
|
+
const statusLine = settings["statusLine"];
|
|
533
|
+
if (statusLine && statusLine["type"] === "command") {
|
|
534
|
+
statusLine["command"] = getCommand();
|
|
535
|
+
}
|
|
536
|
+
return settings;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// src/core/merge/mergeMCP.ts
|
|
540
|
+
function mergeMCP(existing, presetServers, presetName) {
|
|
541
|
+
const result = existing ? structuredClone(existing) : { mcpServers: {} };
|
|
542
|
+
if (!result.mcpServers) {
|
|
543
|
+
result.mcpServers = {};
|
|
544
|
+
}
|
|
545
|
+
for (const [serverName, def] of Object.entries(presetServers)) {
|
|
546
|
+
if (serverName in result.mcpServers) {
|
|
547
|
+
logger.warn(
|
|
548
|
+
`MCP server "${serverName}" already exists, keeping user definition.` + (presetName ? ` (from preset: ${presetName})` : "")
|
|
549
|
+
);
|
|
550
|
+
continue;
|
|
551
|
+
}
|
|
552
|
+
result.mcpServers[serverName] = structuredClone(def);
|
|
553
|
+
}
|
|
554
|
+
return result;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// src/core/merge/mergeSettings.ts
|
|
558
|
+
function mergeSettings(existing, preset) {
|
|
559
|
+
const result = existing ? structuredClone(existing) : {};
|
|
560
|
+
if (preset.hooks) {
|
|
561
|
+
if (!result.hooks) result.hooks = {};
|
|
562
|
+
for (const key of ["PreToolUse", "PostToolUse", "agentStop"]) {
|
|
563
|
+
const presetArr = preset.hooks[key];
|
|
564
|
+
if (!presetArr || presetArr.length === 0) continue;
|
|
565
|
+
const existingArr = result.hooks[key] ?? [];
|
|
566
|
+
const existingCommands = new Set(existingArr.map((h) => h.command));
|
|
567
|
+
for (const hook of presetArr) {
|
|
568
|
+
if (!existingCommands.has(hook.command)) {
|
|
569
|
+
existingArr.push(structuredClone(hook));
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
result.hooks[key] = existingArr;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
if (preset.statusLine !== void 0) {
|
|
576
|
+
if (result.statusLine !== void 0) {
|
|
577
|
+
logger.warn("statusLine already set in settings, overwriting with preset value.");
|
|
578
|
+
}
|
|
579
|
+
result.statusLine = structuredClone(preset.statusLine);
|
|
580
|
+
}
|
|
581
|
+
if (preset.includeCoAuthoredBy !== void 0) {
|
|
582
|
+
if (result.includeCoAuthoredBy !== void 0 && result.includeCoAuthoredBy !== preset.includeCoAuthoredBy) {
|
|
583
|
+
logger.warn("includeCoAuthoredBy already set, overwriting with preset value.");
|
|
584
|
+
}
|
|
585
|
+
result.includeCoAuthoredBy = preset.includeCoAuthoredBy;
|
|
586
|
+
}
|
|
587
|
+
return result;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// src/prompts/DiffViewer.ts
|
|
591
|
+
import fs8 from "fs";
|
|
592
|
+
import { createTwoFilesPatch } from "diff";
|
|
593
|
+
function showDiff(target, sourceContent) {
|
|
594
|
+
const existing = fs8.existsSync(target) ? fs8.readFileSync(target, "utf-8") : "";
|
|
595
|
+
const incoming = sourceContent.toString("utf-8");
|
|
596
|
+
const patch = createTwoFilesPatch(
|
|
597
|
+
`a/${target}`,
|
|
598
|
+
`b/${target}`,
|
|
599
|
+
existing,
|
|
600
|
+
incoming,
|
|
601
|
+
"current",
|
|
602
|
+
"incoming",
|
|
603
|
+
{ context: 3 }
|
|
604
|
+
);
|
|
605
|
+
const lines = patch.split("\n");
|
|
606
|
+
for (const line of lines) {
|
|
607
|
+
if (line.startsWith("+") && !line.startsWith("+++")) {
|
|
608
|
+
process.stdout.write(color.green(line) + "\n");
|
|
609
|
+
} else if (line.startsWith("-") && !line.startsWith("---")) {
|
|
610
|
+
process.stdout.write(color.red(line) + "\n");
|
|
611
|
+
} else if (line.startsWith("@@")) {
|
|
612
|
+
process.stdout.write(color.cyan(line) + "\n");
|
|
613
|
+
} else {
|
|
614
|
+
process.stdout.write(line + "\n");
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// src/utils/fs-safe.ts
|
|
620
|
+
import fs9 from "fs";
|
|
621
|
+
import path7 from "path";
|
|
622
|
+
import crypto2 from "crypto";
|
|
623
|
+
import os from "os";
|
|
624
|
+
var LF_EXTENSIONS = /* @__PURE__ */ new Set([".json", ".yaml", ".yml"]);
|
|
625
|
+
function getLineEnding(filePath) {
|
|
626
|
+
const ext = path7.extname(filePath).toLowerCase();
|
|
627
|
+
if (LF_EXTENSIONS.has(ext)) return "\n";
|
|
628
|
+
return os.EOL;
|
|
629
|
+
}
|
|
630
|
+
function normalizeLineEndings(content, filePath) {
|
|
631
|
+
const eol = getLineEnding(filePath);
|
|
632
|
+
const normalized = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
633
|
+
if (eol === "\n") return normalized;
|
|
634
|
+
return normalized.replace(/\n/g, eol);
|
|
635
|
+
}
|
|
636
|
+
function atomicWrite(target, content) {
|
|
637
|
+
const dir = path7.dirname(target);
|
|
638
|
+
fs9.mkdirSync(dir, { recursive: true });
|
|
639
|
+
const rand = crypto2.randomBytes(6).toString("hex");
|
|
640
|
+
const tmpPath = path7.join(dir, `.tmp.${rand}`);
|
|
641
|
+
let data;
|
|
642
|
+
if (typeof content === "string") {
|
|
643
|
+
const normalized = normalizeLineEndings(content, target);
|
|
644
|
+
data = Buffer.from(normalized, "utf-8");
|
|
645
|
+
} else {
|
|
646
|
+
data = content;
|
|
647
|
+
}
|
|
648
|
+
try {
|
|
649
|
+
fs9.writeFileSync(tmpPath, data);
|
|
650
|
+
fs9.renameSync(tmpPath, target);
|
|
651
|
+
} catch (err) {
|
|
652
|
+
try {
|
|
653
|
+
fs9.unlinkSync(tmpPath);
|
|
654
|
+
} catch {
|
|
655
|
+
}
|
|
656
|
+
throw err;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// src/utils/paths.ts
|
|
661
|
+
import path8 from "path";
|
|
662
|
+
function safePathInside(workspaceRoot, target) {
|
|
663
|
+
const resolved = path8.resolve(workspaceRoot, target);
|
|
664
|
+
const root = path8.resolve(workspaceRoot);
|
|
665
|
+
return resolved.startsWith(root + path8.sep) || resolved === root;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// src/commands/init.ts
|
|
669
|
+
function setupSigintHandler() {
|
|
670
|
+
process5.on("SIGINT", () => {
|
|
671
|
+
process5.exit(130);
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
async function multiPickPrompt(items) {
|
|
675
|
+
const selected = /* @__PURE__ */ new Set();
|
|
676
|
+
let cursor = 0;
|
|
677
|
+
const rl = readline.createInterface({
|
|
678
|
+
input: process5.stdin,
|
|
679
|
+
output: process5.stdout,
|
|
680
|
+
terminal: false
|
|
681
|
+
});
|
|
682
|
+
if (!process5.stdin.isTTY) {
|
|
683
|
+
rl.close();
|
|
684
|
+
return [];
|
|
685
|
+
}
|
|
686
|
+
return new Promise((resolve2, reject) => {
|
|
687
|
+
const render = () => {
|
|
688
|
+
if (cursor >= 0) {
|
|
689
|
+
process5.stdout.write(`\x1B[${items.length + 1}A`);
|
|
690
|
+
}
|
|
691
|
+
process5.stdout.write(
|
|
692
|
+
color.bold("? Select presets to install:") + color.dim(" (Space to select, <a> toggle all, Enter to confirm)") + "\n"
|
|
693
|
+
);
|
|
694
|
+
for (let i = 0; i < items.length; i++) {
|
|
695
|
+
const marker = cursor === i ? color.cyan(">") : " ";
|
|
696
|
+
const check = selected.has(i) ? color.green("[x]") : "[ ]";
|
|
697
|
+
const name = color.bold(items[i].name.padEnd(12));
|
|
698
|
+
const desc = color.dim(`- ${items[i].description}`);
|
|
699
|
+
process5.stdout.write(` ${marker} ${check} ${name} ${desc}
|
|
700
|
+
`);
|
|
701
|
+
}
|
|
702
|
+
};
|
|
703
|
+
process5.stdout.write("\n".repeat(items.length + 1));
|
|
704
|
+
render();
|
|
705
|
+
process5.stdin.setRawMode(true);
|
|
706
|
+
process5.stdin.resume();
|
|
707
|
+
process5.stdin.setEncoding("utf-8");
|
|
708
|
+
const onData = (key) => {
|
|
709
|
+
if (key === "") {
|
|
710
|
+
process5.stdin.setRawMode(false);
|
|
711
|
+
process5.stdin.removeListener("data", onData);
|
|
712
|
+
process5.stdin.pause();
|
|
713
|
+
rl.close();
|
|
714
|
+
reject(new Error("SIGINT"));
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
if (key === "\r" || key === "\n") {
|
|
718
|
+
process5.stdin.setRawMode(false);
|
|
719
|
+
process5.stdin.removeListener("data", onData);
|
|
720
|
+
process5.stdin.pause();
|
|
721
|
+
rl.close();
|
|
722
|
+
const result = [...selected].map((i) => items[i].name);
|
|
723
|
+
resolve2(result);
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
if (key === " ") {
|
|
727
|
+
if (selected.has(cursor)) {
|
|
728
|
+
selected.delete(cursor);
|
|
729
|
+
} else {
|
|
730
|
+
selected.add(cursor);
|
|
731
|
+
}
|
|
732
|
+
render();
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
if (key === "a" || key === "A") {
|
|
736
|
+
if (selected.size === items.length) {
|
|
737
|
+
selected.clear();
|
|
738
|
+
} else {
|
|
739
|
+
for (let i = 0; i < items.length; i++) selected.add(i);
|
|
740
|
+
}
|
|
741
|
+
render();
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
if (key === "\x1B[A" || key === "k") {
|
|
745
|
+
cursor = (cursor - 1 + items.length) % items.length;
|
|
746
|
+
render();
|
|
747
|
+
return;
|
|
748
|
+
}
|
|
749
|
+
if (key === "\x1B[B" || key === "j") {
|
|
750
|
+
cursor = (cursor + 1) % items.length;
|
|
751
|
+
render();
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
754
|
+
};
|
|
755
|
+
process5.stdin.on("data", onData);
|
|
756
|
+
});
|
|
757
|
+
}
|
|
758
|
+
async function confirmPrompt(message) {
|
|
759
|
+
if (!process5.stdin.isTTY) return true;
|
|
760
|
+
return new Promise((resolve2, reject) => {
|
|
761
|
+
const rl = readline.createInterface({
|
|
762
|
+
input: process5.stdin,
|
|
763
|
+
output: process5.stdout
|
|
764
|
+
});
|
|
765
|
+
rl.question(`${color.bold("?")} ${message} `, (answer) => {
|
|
766
|
+
rl.close();
|
|
767
|
+
const normalized = answer.trim().toLowerCase();
|
|
768
|
+
resolve2(normalized === "" || normalized === "y" || normalized === "yes");
|
|
769
|
+
});
|
|
770
|
+
rl.on("SIGINT", () => {
|
|
771
|
+
rl.close();
|
|
772
|
+
reject(new Error("SIGINT"));
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
async function conflictPrompt(target) {
|
|
777
|
+
if (!process5.stdin.isTTY) return "skip";
|
|
778
|
+
const relTarget = path9.relative(process5.cwd(), target);
|
|
779
|
+
process5.stdout.write(
|
|
780
|
+
`
|
|
781
|
+
${color.yellow("?")} File ${color.bold(relTarget)} already exists with different content.
|
|
782
|
+
${color.cyan(">")} overwrite - Replace existing file (backup will be saved)
|
|
783
|
+
skip - Keep existing file
|
|
784
|
+
view diff - Show unified diff and ask again
|
|
785
|
+
overwrite all - Replace this and all remaining conflicting files
|
|
786
|
+
`
|
|
787
|
+
);
|
|
788
|
+
return new Promise((resolve2, reject) => {
|
|
789
|
+
const rl = readline.createInterface({
|
|
790
|
+
input: process5.stdin,
|
|
791
|
+
output: process5.stdout
|
|
792
|
+
});
|
|
793
|
+
rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {
|
|
794
|
+
rl.close();
|
|
795
|
+
const a = answer.trim().toLowerCase();
|
|
796
|
+
if (a === "o" || a === "overwrite") resolve2("overwrite");
|
|
797
|
+
else if (a === "s" || a === "skip") resolve2("skip");
|
|
798
|
+
else if (a === "d" || a === "diff" || a === "view diff") resolve2("view-diff");
|
|
799
|
+
else if (a === "a" || a === "all" || a === "overwrite all") resolve2("overwrite-all");
|
|
800
|
+
else resolve2("skip");
|
|
801
|
+
});
|
|
802
|
+
rl.on("SIGINT", () => {
|
|
803
|
+
rl.close();
|
|
804
|
+
reject(new Error("SIGINT"));
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
function sha2562(data) {
|
|
809
|
+
return crypto3.createHash("sha256").update(data).digest("hex");
|
|
810
|
+
}
|
|
811
|
+
function registerInitCommand(program2) {
|
|
812
|
+
program2.command("init").description("Initialize workspace with selected presets").option("-y, --yes", "Skip confirmation, accept defaults").option("--preset <name>", "Specify preset (repeatable)", collectPreset, []).option("--force", "Overwrite all files (with backup)").option("--skip-existing", "Skip all existing files").option("--no-color", "Disable ANSI colors").action(async (opts) => {
|
|
813
|
+
setupSigintHandler();
|
|
814
|
+
try {
|
|
815
|
+
await runInit(opts);
|
|
816
|
+
} catch (err) {
|
|
817
|
+
if (err instanceof Error && err.message === "SIGINT") {
|
|
818
|
+
process5.exit(130);
|
|
819
|
+
}
|
|
820
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
821
|
+
process5.exit(1);
|
|
822
|
+
}
|
|
823
|
+
});
|
|
824
|
+
}
|
|
825
|
+
function collectPreset(value, previous) {
|
|
826
|
+
return [...previous, value];
|
|
827
|
+
}
|
|
828
|
+
async function runInit(opts) {
|
|
829
|
+
const workspaceRoot = process5.cwd();
|
|
830
|
+
const available = listAvailable();
|
|
831
|
+
let selectedNames;
|
|
832
|
+
if (opts.preset && opts.preset.length > 0) {
|
|
833
|
+
for (const name of opts.preset) {
|
|
834
|
+
if (!available.includes(name)) {
|
|
835
|
+
logger.error(
|
|
836
|
+
`Preset "${name}" not found. Available: ${available.join(", ")}`
|
|
837
|
+
);
|
|
838
|
+
process5.exit(1);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
selectedNames = opts.preset;
|
|
842
|
+
} else {
|
|
843
|
+
const items = available.map((name) => {
|
|
844
|
+
try {
|
|
845
|
+
const preset = load(name);
|
|
846
|
+
return { name, description: preset.manifest.description };
|
|
847
|
+
} catch {
|
|
848
|
+
return { name, description: "" };
|
|
849
|
+
}
|
|
850
|
+
});
|
|
851
|
+
selectedNames = await multiPickPrompt(items);
|
|
852
|
+
}
|
|
853
|
+
if (selectedNames.length === 0) {
|
|
854
|
+
logger.info("No presets selected. Exiting.");
|
|
855
|
+
process5.exit(0);
|
|
856
|
+
}
|
|
857
|
+
const presets = loadAll(selectedNames);
|
|
858
|
+
let totalFiles = 0;
|
|
859
|
+
for (const preset of presets) {
|
|
860
|
+
totalFiles += preset.manifest.files.length;
|
|
861
|
+
}
|
|
862
|
+
if (!opts.yes) {
|
|
863
|
+
const confirmed = await confirmPrompt(
|
|
864
|
+
`About to write ${totalFiles} files into .kiro/ and workspace. Continue? (Y/n)`
|
|
865
|
+
);
|
|
866
|
+
if (!confirmed) {
|
|
867
|
+
logger.info("Cancelled.");
|
|
868
|
+
process5.exit(0);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
let mode = "interactive";
|
|
872
|
+
if (opts.force) mode = "force";
|
|
873
|
+
else if (opts.skipExisting) mode = "skip-existing";
|
|
874
|
+
else if (opts.yes) mode = "skip-existing";
|
|
875
|
+
const sessionState = { overwriteAll: false };
|
|
876
|
+
const timestamp = generateTimestamp2();
|
|
877
|
+
const allTrackedFiles = [];
|
|
878
|
+
let filesWritten = 0;
|
|
879
|
+
let filesSkipped = 0;
|
|
880
|
+
for (const preset of presets) {
|
|
881
|
+
const { manifest, dir: presetDir } = preset;
|
|
882
|
+
const regularFiles = manifest.files.filter(
|
|
883
|
+
(f) => !["mcp", "settings", "statusline"].includes(f.type)
|
|
884
|
+
);
|
|
885
|
+
const mcpFiles = manifest.files.filter((f) => f.type === "mcp");
|
|
886
|
+
const settingsFiles = manifest.files.filter((f) => f.type === "settings");
|
|
887
|
+
const statuslineFiles = manifest.files.filter((f) => f.type === "statusline");
|
|
888
|
+
for (const fileEntry of regularFiles) {
|
|
889
|
+
const sourcePath = path9.join(presetDir, fileEntry.source);
|
|
890
|
+
const targetPath = path9.resolve(workspaceRoot, fileEntry.target);
|
|
891
|
+
if (!safePathInside(workspaceRoot, fileEntry.target)) {
|
|
892
|
+
logger.warn(`Skipping unsafe path: ${fileEntry.target}`);
|
|
893
|
+
filesSkipped++;
|
|
894
|
+
continue;
|
|
895
|
+
}
|
|
896
|
+
if (!fs10.existsSync(sourcePath)) {
|
|
897
|
+
logger.debug(`Source file missing: ${sourcePath}`);
|
|
898
|
+
continue;
|
|
899
|
+
}
|
|
900
|
+
const sourceContent = fs10.readFileSync(sourcePath);
|
|
901
|
+
const action = await resolve({
|
|
902
|
+
target: targetPath,
|
|
903
|
+
sourceContent,
|
|
904
|
+
mode,
|
|
905
|
+
sessionState,
|
|
906
|
+
prompt: conflictPrompt,
|
|
907
|
+
showDiff: (t, s) => showDiff(t, s)
|
|
908
|
+
});
|
|
909
|
+
switch (action) {
|
|
910
|
+
case "WRITE_NEW":
|
|
911
|
+
fs10.mkdirSync(path9.dirname(targetPath), { recursive: true });
|
|
912
|
+
atomicWrite(targetPath, sourceContent.toString("utf-8"));
|
|
913
|
+
if (fileEntry.executable && process5.platform !== "win32") {
|
|
914
|
+
try {
|
|
915
|
+
fs10.chmodSync(targetPath, 493);
|
|
916
|
+
} catch {
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
filesWritten++;
|
|
920
|
+
break;
|
|
921
|
+
case "OVERWRITE_WITH_BACKUP":
|
|
922
|
+
backup(workspaceRoot, targetPath, timestamp);
|
|
923
|
+
atomicWrite(targetPath, sourceContent.toString("utf-8"));
|
|
924
|
+
if (fileEntry.executable && process5.platform !== "win32") {
|
|
925
|
+
try {
|
|
926
|
+
fs10.chmodSync(targetPath, 493);
|
|
927
|
+
} catch {
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
filesWritten++;
|
|
931
|
+
break;
|
|
932
|
+
case "SKIP":
|
|
933
|
+
filesSkipped++;
|
|
934
|
+
break;
|
|
935
|
+
case "NO_OP":
|
|
936
|
+
break;
|
|
937
|
+
}
|
|
938
|
+
if (action !== "SKIP") {
|
|
939
|
+
allTrackedFiles.push({
|
|
940
|
+
target: fileEntry.target,
|
|
941
|
+
sourcePreset: manifest.name,
|
|
942
|
+
contentHash: sha2562(sourceContent),
|
|
943
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
944
|
+
});
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
if (statuslineFiles.length > 0) {
|
|
948
|
+
const installed = install(presetDir, workspaceRoot);
|
|
949
|
+
filesWritten += installed.length;
|
|
950
|
+
for (const f of installed) {
|
|
951
|
+
allTrackedFiles.push({
|
|
952
|
+
target: f,
|
|
953
|
+
sourcePreset: manifest.name,
|
|
954
|
+
contentHash: "",
|
|
955
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
if (mcpFiles.length > 0 && manifest.mcpServers) {
|
|
960
|
+
const mcpPath = path9.join(workspaceRoot, ".kiro/settings/mcp.json");
|
|
961
|
+
let existingMcp = null;
|
|
962
|
+
if (fs10.existsSync(mcpPath)) {
|
|
963
|
+
try {
|
|
964
|
+
existingMcp = JSON.parse(fs10.readFileSync(mcpPath, "utf-8"));
|
|
965
|
+
} catch {
|
|
966
|
+
existingMcp = null;
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);
|
|
970
|
+
fs10.mkdirSync(path9.dirname(mcpPath), { recursive: true });
|
|
971
|
+
atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + "\n");
|
|
972
|
+
filesWritten++;
|
|
973
|
+
}
|
|
974
|
+
if (settingsFiles.length > 0) {
|
|
975
|
+
const settingsPath = path9.join(workspaceRoot, ".kiro/settings.json");
|
|
976
|
+
let existingSettings = null;
|
|
977
|
+
if (fs10.existsSync(settingsPath)) {
|
|
978
|
+
try {
|
|
979
|
+
existingSettings = JSON.parse(
|
|
980
|
+
fs10.readFileSync(settingsPath, "utf-8")
|
|
981
|
+
);
|
|
982
|
+
} catch {
|
|
983
|
+
existingSettings = null;
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
const presetSettingsPath = path9.join(presetDir, "settings.json");
|
|
987
|
+
if (fs10.existsSync(presetSettingsPath)) {
|
|
988
|
+
const presetSettings = JSON.parse(
|
|
989
|
+
fs10.readFileSync(presetSettingsPath, "utf-8")
|
|
990
|
+
);
|
|
991
|
+
const resolvedSettings = resolveSettingsCommand(
|
|
992
|
+
presetSettings
|
|
993
|
+
);
|
|
994
|
+
const merged = mergeSettings(existingSettings, resolvedSettings);
|
|
995
|
+
fs10.mkdirSync(path9.dirname(settingsPath), { recursive: true });
|
|
996
|
+
atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + "\n");
|
|
997
|
+
filesWritten++;
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
const mcpExampleSource = path9.join(presetDir, ".mcp.json.example");
|
|
1001
|
+
if (fs10.existsSync(mcpExampleSource)) {
|
|
1002
|
+
const mcpExampleTarget = path9.join(workspaceRoot, ".kiro/.mcp.json.example");
|
|
1003
|
+
if (!fs10.existsSync(mcpExampleTarget)) {
|
|
1004
|
+
fs10.mkdirSync(path9.dirname(mcpExampleTarget), { recursive: true });
|
|
1005
|
+
fs10.copyFileSync(mcpExampleSource, mcpExampleTarget);
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
const kitVersion = getKitVersion();
|
|
1010
|
+
const presetMetas = presets.map((p) => ({
|
|
1011
|
+
name: p.manifest.name,
|
|
1012
|
+
version: p.manifest.version
|
|
1013
|
+
}));
|
|
1014
|
+
const existingMeta = read2(workspaceRoot);
|
|
1015
|
+
const metadata = existingMeta ? mergePresets(existingMeta, presetMetas) : compose({
|
|
1016
|
+
kitVersion,
|
|
1017
|
+
repository: "https://github.com/ihatesea69/kiro-kit.git",
|
|
1018
|
+
presets: presetMetas
|
|
1019
|
+
});
|
|
1020
|
+
write2(workspaceRoot, metadata);
|
|
1021
|
+
let trackingData = read(workspaceRoot) ?? createInitial(kitVersion);
|
|
1022
|
+
for (const preset of presets) {
|
|
1023
|
+
const presetFiles = allTrackedFiles.filter(
|
|
1024
|
+
(f) => f.sourcePreset === preset.manifest.name
|
|
1025
|
+
);
|
|
1026
|
+
const trackedPreset = {
|
|
1027
|
+
name: preset.manifest.name,
|
|
1028
|
+
version: preset.manifest.version,
|
|
1029
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1030
|
+
files: presetFiles
|
|
1031
|
+
};
|
|
1032
|
+
trackingData = upsertPreset(trackingData, trackedPreset);
|
|
1033
|
+
}
|
|
1034
|
+
trackingData.kitVersion = kitVersion;
|
|
1035
|
+
write(workspaceRoot, trackingData);
|
|
1036
|
+
logger.success(
|
|
1037
|
+
`Done! ${filesWritten} files written, ${filesSkipped} skipped.`
|
|
1038
|
+
);
|
|
1039
|
+
logger.info(
|
|
1040
|
+
`Presets installed: ${selectedNames.join(", ")}`
|
|
1041
|
+
);
|
|
1042
|
+
}
|
|
1043
|
+
function generateTimestamp2() {
|
|
1044
|
+
const now = /* @__PURE__ */ new Date();
|
|
1045
|
+
const y = now.getFullYear();
|
|
1046
|
+
const mo = String(now.getMonth() + 1).padStart(2, "0");
|
|
1047
|
+
const d = String(now.getDate()).padStart(2, "0");
|
|
1048
|
+
const h = String(now.getHours()).padStart(2, "0");
|
|
1049
|
+
const mi = String(now.getMinutes()).padStart(2, "0");
|
|
1050
|
+
const s = String(now.getSeconds()).padStart(2, "0");
|
|
1051
|
+
const ms = String(now.getMilliseconds()).padStart(3, "0");
|
|
1052
|
+
return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;
|
|
1053
|
+
}
|
|
1054
|
+
function getKitVersion() {
|
|
1055
|
+
try {
|
|
1056
|
+
const pkgPath = new URL("../package.json", import.meta.url);
|
|
1057
|
+
const pkg2 = JSON.parse(fs10.readFileSync(pkgPath, "utf-8"));
|
|
1058
|
+
return pkg2.version;
|
|
1059
|
+
} catch {
|
|
1060
|
+
return "0.1.0";
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
// src/commands/add.ts
|
|
1065
|
+
import fs11 from "fs";
|
|
1066
|
+
import path10 from "path";
|
|
1067
|
+
import process6 from "process";
|
|
1068
|
+
import crypto4 from "crypto";
|
|
1069
|
+
function sha2563(data) {
|
|
1070
|
+
return crypto4.createHash("sha256").update(data).digest("hex");
|
|
1071
|
+
}
|
|
1072
|
+
function generateTimestamp3() {
|
|
1073
|
+
const now = /* @__PURE__ */ new Date();
|
|
1074
|
+
const y = now.getFullYear();
|
|
1075
|
+
const mo = String(now.getMonth() + 1).padStart(2, "0");
|
|
1076
|
+
const d = String(now.getDate()).padStart(2, "0");
|
|
1077
|
+
const h = String(now.getHours()).padStart(2, "0");
|
|
1078
|
+
const mi = String(now.getMinutes()).padStart(2, "0");
|
|
1079
|
+
const s = String(now.getSeconds()).padStart(2, "0");
|
|
1080
|
+
const ms = String(now.getMilliseconds()).padStart(3, "0");
|
|
1081
|
+
return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;
|
|
1082
|
+
}
|
|
1083
|
+
function getKitVersion2() {
|
|
1084
|
+
try {
|
|
1085
|
+
const pkgPath = new URL("../../package.json", import.meta.url);
|
|
1086
|
+
const pkg2 = JSON.parse(fs11.readFileSync(pkgPath, "utf-8"));
|
|
1087
|
+
return pkg2.version;
|
|
1088
|
+
} catch {
|
|
1089
|
+
return "0.1.0";
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
async function conflictPrompt2(target) {
|
|
1093
|
+
if (!process6.stdin.isTTY) return "skip";
|
|
1094
|
+
const { default: readline2 } = await import("readline");
|
|
1095
|
+
const relTarget = path10.relative(process6.cwd(), target);
|
|
1096
|
+
process6.stdout.write(
|
|
1097
|
+
`
|
|
1098
|
+
${color.yellow("?")} File ${color.bold(relTarget)} already exists with different content.
|
|
1099
|
+
${color.cyan(">")} overwrite - Replace existing file (backup will be saved)
|
|
1100
|
+
skip - Keep existing file
|
|
1101
|
+
view diff - Show unified diff and ask again
|
|
1102
|
+
overwrite all - Replace this and all remaining conflicting files
|
|
1103
|
+
`
|
|
1104
|
+
);
|
|
1105
|
+
return new Promise((resolve2) => {
|
|
1106
|
+
const rl = readline2.createInterface({ input: process6.stdin, output: process6.stdout });
|
|
1107
|
+
rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {
|
|
1108
|
+
rl.close();
|
|
1109
|
+
const a = answer.trim().toLowerCase();
|
|
1110
|
+
if (a === "o" || a === "overwrite") resolve2("overwrite");
|
|
1111
|
+
else if (a === "s" || a === "skip") resolve2("skip");
|
|
1112
|
+
else if (a === "d" || a === "diff" || a === "view diff") resolve2("view-diff");
|
|
1113
|
+
else if (a === "a" || a === "all" || a === "overwrite all") resolve2("overwrite-all");
|
|
1114
|
+
else resolve2("skip");
|
|
1115
|
+
});
|
|
1116
|
+
});
|
|
1117
|
+
}
|
|
1118
|
+
function registerAddCommand(program2) {
|
|
1119
|
+
program2.command("add <preset>").description("Add a preset to existing workspace").option("-y, --yes", "Skip confirmation").option("--force", "Overwrite all files (with backup)").option("--skip-existing", "Skip all existing files").option("--no-color", "Disable ANSI colors").action(async (presetName, opts) => {
|
|
1120
|
+
try {
|
|
1121
|
+
await runAdd(presetName, opts);
|
|
1122
|
+
} catch (err) {
|
|
1123
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
1124
|
+
process6.exit(1);
|
|
1125
|
+
}
|
|
1126
|
+
});
|
|
1127
|
+
}
|
|
1128
|
+
async function runAdd(presetName, opts) {
|
|
1129
|
+
const workspaceRoot = process6.cwd();
|
|
1130
|
+
const available = listAvailable();
|
|
1131
|
+
if (!available.includes(presetName)) {
|
|
1132
|
+
logger.error(
|
|
1133
|
+
`Preset "${presetName}" not found. Available: ${available.join(", ")}`
|
|
1134
|
+
);
|
|
1135
|
+
process6.exit(1);
|
|
1136
|
+
}
|
|
1137
|
+
const kiroDir = path10.join(workspaceRoot, ".kiro");
|
|
1138
|
+
if (!fs11.existsSync(kiroDir)) {
|
|
1139
|
+
fs11.mkdirSync(kiroDir, { recursive: true });
|
|
1140
|
+
logger.info("Created .kiro/ directory.");
|
|
1141
|
+
}
|
|
1142
|
+
const preset = load(presetName);
|
|
1143
|
+
let mode = "interactive";
|
|
1144
|
+
if (opts.force) mode = "force";
|
|
1145
|
+
else if (opts.skipExisting) mode = "skip-existing";
|
|
1146
|
+
else if (opts.yes) mode = "skip-existing";
|
|
1147
|
+
const sessionState = { overwriteAll: false };
|
|
1148
|
+
const timestamp = generateTimestamp3();
|
|
1149
|
+
const allTrackedFiles = [];
|
|
1150
|
+
let filesWritten = 0;
|
|
1151
|
+
let filesSkipped = 0;
|
|
1152
|
+
const { manifest, dir: presetDir } = preset;
|
|
1153
|
+
const regularFiles = manifest.files.filter(
|
|
1154
|
+
(f) => !["mcp", "settings", "statusline"].includes(f.type)
|
|
1155
|
+
);
|
|
1156
|
+
const statuslineFiles = manifest.files.filter((f) => f.type === "statusline");
|
|
1157
|
+
for (const fileEntry of regularFiles) {
|
|
1158
|
+
const sourcePath = path10.join(presetDir, fileEntry.source);
|
|
1159
|
+
const targetPath = path10.resolve(workspaceRoot, fileEntry.target);
|
|
1160
|
+
if (!safePathInside(workspaceRoot, fileEntry.target)) {
|
|
1161
|
+
logger.warn(`Skipping unsafe path: ${fileEntry.target}`);
|
|
1162
|
+
filesSkipped++;
|
|
1163
|
+
continue;
|
|
1164
|
+
}
|
|
1165
|
+
if (!fs11.existsSync(sourcePath)) {
|
|
1166
|
+
logger.debug(`Source file missing: ${sourcePath}`);
|
|
1167
|
+
continue;
|
|
1168
|
+
}
|
|
1169
|
+
const sourceContent = fs11.readFileSync(sourcePath);
|
|
1170
|
+
const action = await resolve({
|
|
1171
|
+
target: targetPath,
|
|
1172
|
+
sourceContent,
|
|
1173
|
+
mode,
|
|
1174
|
+
sessionState,
|
|
1175
|
+
prompt: conflictPrompt2,
|
|
1176
|
+
showDiff: (t, s) => showDiff(t, s)
|
|
1177
|
+
});
|
|
1178
|
+
switch (action) {
|
|
1179
|
+
case "WRITE_NEW":
|
|
1180
|
+
fs11.mkdirSync(path10.dirname(targetPath), { recursive: true });
|
|
1181
|
+
atomicWrite(targetPath, sourceContent.toString("utf-8"));
|
|
1182
|
+
if (fileEntry.executable && process6.platform !== "win32") {
|
|
1183
|
+
try {
|
|
1184
|
+
fs11.chmodSync(targetPath, 493);
|
|
1185
|
+
} catch {
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
filesWritten++;
|
|
1189
|
+
break;
|
|
1190
|
+
case "OVERWRITE_WITH_BACKUP":
|
|
1191
|
+
backup(workspaceRoot, targetPath, timestamp);
|
|
1192
|
+
atomicWrite(targetPath, sourceContent.toString("utf-8"));
|
|
1193
|
+
if (fileEntry.executable && process6.platform !== "win32") {
|
|
1194
|
+
try {
|
|
1195
|
+
fs11.chmodSync(targetPath, 493);
|
|
1196
|
+
} catch {
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
filesWritten++;
|
|
1200
|
+
break;
|
|
1201
|
+
case "SKIP":
|
|
1202
|
+
filesSkipped++;
|
|
1203
|
+
break;
|
|
1204
|
+
case "NO_OP":
|
|
1205
|
+
break;
|
|
1206
|
+
}
|
|
1207
|
+
if (action !== "SKIP") {
|
|
1208
|
+
allTrackedFiles.push({
|
|
1209
|
+
target: fileEntry.target,
|
|
1210
|
+
sourcePreset: manifest.name,
|
|
1211
|
+
contentHash: sha2563(sourceContent),
|
|
1212
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1213
|
+
});
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
if (statuslineFiles.length > 0) {
|
|
1217
|
+
const installed = install(presetDir, workspaceRoot);
|
|
1218
|
+
filesWritten += installed.length;
|
|
1219
|
+
for (const f of installed) {
|
|
1220
|
+
allTrackedFiles.push({
|
|
1221
|
+
target: f,
|
|
1222
|
+
sourcePreset: manifest.name,
|
|
1223
|
+
contentHash: "",
|
|
1224
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1225
|
+
});
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
if (manifest.mcpServers) {
|
|
1229
|
+
const mcpPath = path10.join(workspaceRoot, ".kiro/settings/mcp.json");
|
|
1230
|
+
let existingMcp = null;
|
|
1231
|
+
if (fs11.existsSync(mcpPath)) {
|
|
1232
|
+
try {
|
|
1233
|
+
existingMcp = JSON.parse(fs11.readFileSync(mcpPath, "utf-8"));
|
|
1234
|
+
} catch {
|
|
1235
|
+
existingMcp = null;
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);
|
|
1239
|
+
fs11.mkdirSync(path10.dirname(mcpPath), { recursive: true });
|
|
1240
|
+
atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + "\n");
|
|
1241
|
+
filesWritten++;
|
|
1242
|
+
}
|
|
1243
|
+
const presetSettingsPath = path10.join(presetDir, "settings.json");
|
|
1244
|
+
if (fs11.existsSync(presetSettingsPath)) {
|
|
1245
|
+
const settingsPath = path10.join(workspaceRoot, ".kiro/settings.json");
|
|
1246
|
+
let existingSettings = null;
|
|
1247
|
+
if (fs11.existsSync(settingsPath)) {
|
|
1248
|
+
try {
|
|
1249
|
+
existingSettings = JSON.parse(fs11.readFileSync(settingsPath, "utf-8"));
|
|
1250
|
+
} catch {
|
|
1251
|
+
existingSettings = null;
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
const presetSettings = JSON.parse(fs11.readFileSync(presetSettingsPath, "utf-8"));
|
|
1255
|
+
const resolvedSettings = resolveSettingsCommand(
|
|
1256
|
+
presetSettings
|
|
1257
|
+
);
|
|
1258
|
+
const merged = mergeSettings(existingSettings, resolvedSettings);
|
|
1259
|
+
fs11.mkdirSync(path10.dirname(settingsPath), { recursive: true });
|
|
1260
|
+
atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + "\n");
|
|
1261
|
+
filesWritten++;
|
|
1262
|
+
}
|
|
1263
|
+
const kitVersion = getKitVersion2();
|
|
1264
|
+
const presetMeta = { name: manifest.name, version: manifest.version };
|
|
1265
|
+
const existingMeta = read2(workspaceRoot);
|
|
1266
|
+
const metadata = existingMeta ? mergePresets(existingMeta, [presetMeta]) : compose({ kitVersion, repository: "https://github.com/ihatesea69/kiro-kit.git", presets: [presetMeta] });
|
|
1267
|
+
write2(workspaceRoot, metadata);
|
|
1268
|
+
let trackingData = read(workspaceRoot) ?? createInitial(kitVersion);
|
|
1269
|
+
const trackedPreset = {
|
|
1270
|
+
name: manifest.name,
|
|
1271
|
+
version: manifest.version,
|
|
1272
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1273
|
+
files: allTrackedFiles
|
|
1274
|
+
};
|
|
1275
|
+
trackingData = upsertPreset(trackingData, trackedPreset);
|
|
1276
|
+
trackingData.kitVersion = kitVersion;
|
|
1277
|
+
write(workspaceRoot, trackingData);
|
|
1278
|
+
logger.success(`Done! ${filesWritten} files written, ${filesSkipped} skipped.`);
|
|
1279
|
+
logger.info(`Preset added: ${presetName}`);
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
// src/commands/list.ts
|
|
1283
|
+
import process7 from "process";
|
|
1284
|
+
function countArtifacts(files) {
|
|
1285
|
+
const counts = {
|
|
1286
|
+
agent: 0,
|
|
1287
|
+
skill: 0,
|
|
1288
|
+
command: 0,
|
|
1289
|
+
hook: 0,
|
|
1290
|
+
workflow: 0,
|
|
1291
|
+
mcp: 0
|
|
1292
|
+
};
|
|
1293
|
+
for (const f of files) {
|
|
1294
|
+
if (f.type in counts) {
|
|
1295
|
+
counts[f.type]++;
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
return counts;
|
|
1299
|
+
}
|
|
1300
|
+
function registerListCommand(program2) {
|
|
1301
|
+
program2.command("list").description("List available presets").option("--json", "Output as JSON").action((opts) => {
|
|
1302
|
+
try {
|
|
1303
|
+
runList(opts);
|
|
1304
|
+
} catch (err) {
|
|
1305
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
1306
|
+
process7.exit(1);
|
|
1307
|
+
}
|
|
1308
|
+
});
|
|
1309
|
+
}
|
|
1310
|
+
function runList(opts) {
|
|
1311
|
+
const available = listAvailable();
|
|
1312
|
+
const summaries = [];
|
|
1313
|
+
for (const name of available) {
|
|
1314
|
+
try {
|
|
1315
|
+
const preset = load(name);
|
|
1316
|
+
const counts = countArtifacts(preset.manifest.files);
|
|
1317
|
+
summaries.push({
|
|
1318
|
+
name,
|
|
1319
|
+
description: preset.manifest.description,
|
|
1320
|
+
agents: counts["agent"],
|
|
1321
|
+
skills: counts["skill"],
|
|
1322
|
+
commands: counts["command"],
|
|
1323
|
+
hooks: counts["hook"],
|
|
1324
|
+
workflows: counts["workflow"],
|
|
1325
|
+
mcp: Object.keys(preset.manifest.mcpServers ?? {}).length
|
|
1326
|
+
});
|
|
1327
|
+
} catch {
|
|
1328
|
+
summaries.push({
|
|
1329
|
+
name,
|
|
1330
|
+
description: "(failed to load)",
|
|
1331
|
+
agents: 0,
|
|
1332
|
+
skills: 0,
|
|
1333
|
+
commands: 0,
|
|
1334
|
+
hooks: 0,
|
|
1335
|
+
workflows: 0,
|
|
1336
|
+
mcp: 0
|
|
1337
|
+
});
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
if (opts.json) {
|
|
1341
|
+
process7.stdout.write(JSON.stringify(summaries, null, 2) + "\n");
|
|
1342
|
+
return;
|
|
1343
|
+
}
|
|
1344
|
+
for (const s of summaries) {
|
|
1345
|
+
const nameStr = color.bold(s.name.padEnd(12));
|
|
1346
|
+
const descStr = color.dim(`- ${s.description}`);
|
|
1347
|
+
process7.stdout.write(` ${nameStr} ${descStr}
|
|
1348
|
+
`);
|
|
1349
|
+
const counts = `${s.agents} agents, ${s.skills} skills, ${s.commands} commands, ${s.hooks} hooks, ${s.workflows} workflows, ${s.mcp} MCP servers`;
|
|
1350
|
+
process7.stdout.write(`${"".padEnd(14)} ${color.gray(counts)}
|
|
1351
|
+
`);
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
// src/commands/info.ts
|
|
1356
|
+
import process8 from "process";
|
|
1357
|
+
function registerInfoCommand(program2) {
|
|
1358
|
+
program2.command("info <preset>").description("Show detailed preset information").option("--json", "Output as JSON").action((presetName, opts) => {
|
|
1359
|
+
try {
|
|
1360
|
+
runInfo(presetName, opts);
|
|
1361
|
+
} catch (err) {
|
|
1362
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
1363
|
+
process8.exit(1);
|
|
1364
|
+
}
|
|
1365
|
+
});
|
|
1366
|
+
}
|
|
1367
|
+
function runInfo(presetName, opts) {
|
|
1368
|
+
const available = listAvailable();
|
|
1369
|
+
if (!available.includes(presetName)) {
|
|
1370
|
+
logger.error(
|
|
1371
|
+
`Preset "${presetName}" not found. Available: ${available.join(", ")}`
|
|
1372
|
+
);
|
|
1373
|
+
process8.exit(1);
|
|
1374
|
+
}
|
|
1375
|
+
const preset = load(presetName);
|
|
1376
|
+
const { manifest } = preset;
|
|
1377
|
+
const agents = manifest.files.filter((f) => f.type === "agent").map((f) => f.source);
|
|
1378
|
+
const skills = manifest.files.filter((f) => f.type === "skill").map((f) => f.source);
|
|
1379
|
+
const commands = manifest.files.filter((f) => f.type === "command").map((f) => f.source);
|
|
1380
|
+
const workflows = manifest.files.filter((f) => f.type === "workflow").map((f) => f.source);
|
|
1381
|
+
const hooks = manifest.files.filter((f) => f.type === "hook").map((f) => f.source);
|
|
1382
|
+
const mcpServers = Object.keys(manifest.mcpServers ?? {});
|
|
1383
|
+
const info = {
|
|
1384
|
+
name: manifest.name,
|
|
1385
|
+
version: manifest.version,
|
|
1386
|
+
description: manifest.description,
|
|
1387
|
+
category: manifest.category,
|
|
1388
|
+
files: manifest.files.map((f) => ({ source: f.source, target: f.target, type: f.type })),
|
|
1389
|
+
mcpServers,
|
|
1390
|
+
hooks,
|
|
1391
|
+
agents,
|
|
1392
|
+
skills,
|
|
1393
|
+
commands,
|
|
1394
|
+
workflows
|
|
1395
|
+
};
|
|
1396
|
+
if (opts.json) {
|
|
1397
|
+
process8.stdout.write(JSON.stringify(info, null, 2) + "\n");
|
|
1398
|
+
return;
|
|
1399
|
+
}
|
|
1400
|
+
process8.stdout.write(`
|
|
1401
|
+
${color.bold(manifest.name)} v${manifest.version}
|
|
1402
|
+
`);
|
|
1403
|
+
process8.stdout.write(`${manifest.description}
|
|
1404
|
+
|
|
1405
|
+
`);
|
|
1406
|
+
process8.stdout.write(`${color.dim("Category:")} ${manifest.category}
|
|
1407
|
+
`);
|
|
1408
|
+
process8.stdout.write(`${color.dim("Total files:")} ${manifest.files.length}
|
|
1409
|
+
|
|
1410
|
+
`);
|
|
1411
|
+
if (mcpServers.length > 0) {
|
|
1412
|
+
process8.stdout.write(`${color.bold("MCP Servers")} (${mcpServers.length}):
|
|
1413
|
+
`);
|
|
1414
|
+
for (const s of mcpServers) {
|
|
1415
|
+
process8.stdout.write(` - ${s}
|
|
1416
|
+
`);
|
|
1417
|
+
}
|
|
1418
|
+
process8.stdout.write("\n");
|
|
1419
|
+
}
|
|
1420
|
+
if (agents.length > 0) {
|
|
1421
|
+
process8.stdout.write(`${color.bold("Agents")} (${agents.length}):
|
|
1422
|
+
`);
|
|
1423
|
+
for (const a of agents) {
|
|
1424
|
+
process8.stdout.write(` - ${a}
|
|
1425
|
+
`);
|
|
1426
|
+
}
|
|
1427
|
+
process8.stdout.write("\n");
|
|
1428
|
+
}
|
|
1429
|
+
if (skills.length > 0) {
|
|
1430
|
+
process8.stdout.write(`${color.bold("Skills")} (${skills.length}):
|
|
1431
|
+
`);
|
|
1432
|
+
for (const s of skills) {
|
|
1433
|
+
process8.stdout.write(` - ${s}
|
|
1434
|
+
`);
|
|
1435
|
+
}
|
|
1436
|
+
process8.stdout.write("\n");
|
|
1437
|
+
}
|
|
1438
|
+
if (commands.length > 0) {
|
|
1439
|
+
process8.stdout.write(`${color.bold("Commands")} (${commands.length}):
|
|
1440
|
+
`);
|
|
1441
|
+
for (const c of commands) {
|
|
1442
|
+
process8.stdout.write(` - ${c}
|
|
1443
|
+
`);
|
|
1444
|
+
}
|
|
1445
|
+
process8.stdout.write("\n");
|
|
1446
|
+
}
|
|
1447
|
+
if (workflows.length > 0) {
|
|
1448
|
+
process8.stdout.write(`${color.bold("Workflows")} (${workflows.length}):
|
|
1449
|
+
`);
|
|
1450
|
+
for (const w of workflows) {
|
|
1451
|
+
process8.stdout.write(` - ${w}
|
|
1452
|
+
`);
|
|
1453
|
+
}
|
|
1454
|
+
process8.stdout.write("\n");
|
|
1455
|
+
}
|
|
1456
|
+
if (hooks.length > 0) {
|
|
1457
|
+
process8.stdout.write(`${color.bold("Hooks")} (${hooks.length}):
|
|
1458
|
+
`);
|
|
1459
|
+
for (const h of hooks) {
|
|
1460
|
+
process8.stdout.write(` - ${h}
|
|
1461
|
+
`);
|
|
1462
|
+
}
|
|
1463
|
+
process8.stdout.write("\n");
|
|
1464
|
+
}
|
|
1465
|
+
process8.stdout.write(`${color.bold("File Targets")}:
|
|
1466
|
+
`);
|
|
1467
|
+
for (const f of manifest.files) {
|
|
1468
|
+
process8.stdout.write(` ${color.dim(f.type.padEnd(12))} ${f.target}
|
|
1469
|
+
`);
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
// src/commands/update.ts
|
|
1474
|
+
import fs12 from "fs";
|
|
1475
|
+
import path11 from "path";
|
|
1476
|
+
import process9 from "process";
|
|
1477
|
+
import crypto5 from "crypto";
|
|
1478
|
+
function sha2564(data) {
|
|
1479
|
+
return crypto5.createHash("sha256").update(data).digest("hex");
|
|
1480
|
+
}
|
|
1481
|
+
function generateTimestamp4() {
|
|
1482
|
+
const now = /* @__PURE__ */ new Date();
|
|
1483
|
+
const y = now.getFullYear();
|
|
1484
|
+
const mo = String(now.getMonth() + 1).padStart(2, "0");
|
|
1485
|
+
const d = String(now.getDate()).padStart(2, "0");
|
|
1486
|
+
const h = String(now.getHours()).padStart(2, "0");
|
|
1487
|
+
const mi = String(now.getMinutes()).padStart(2, "0");
|
|
1488
|
+
const s = String(now.getSeconds()).padStart(2, "0");
|
|
1489
|
+
const ms = String(now.getMilliseconds()).padStart(3, "0");
|
|
1490
|
+
return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;
|
|
1491
|
+
}
|
|
1492
|
+
function getKitVersion3() {
|
|
1493
|
+
try {
|
|
1494
|
+
const pkgPath = new URL("../../package.json", import.meta.url);
|
|
1495
|
+
const pkg2 = JSON.parse(fs12.readFileSync(pkgPath, "utf-8"));
|
|
1496
|
+
return pkg2.version;
|
|
1497
|
+
} catch {
|
|
1498
|
+
return "0.1.0";
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
async function conflictPrompt3(target) {
|
|
1502
|
+
if (!process9.stdin.isTTY) return "skip";
|
|
1503
|
+
const { default: readline2 } = await import("readline");
|
|
1504
|
+
const relTarget = path11.relative(process9.cwd(), target);
|
|
1505
|
+
process9.stdout.write(
|
|
1506
|
+
`
|
|
1507
|
+
${color.yellow("?")} File ${color.bold(relTarget)} has changed in the new version.
|
|
1508
|
+
${color.cyan(">")} overwrite - Replace with new version (backup saved)
|
|
1509
|
+
skip - Keep current file
|
|
1510
|
+
view diff - Show unified diff and ask again
|
|
1511
|
+
overwrite all - Replace all remaining changed files
|
|
1512
|
+
`
|
|
1513
|
+
);
|
|
1514
|
+
return new Promise((resolve2) => {
|
|
1515
|
+
const rl = readline2.createInterface({ input: process9.stdin, output: process9.stdout });
|
|
1516
|
+
rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {
|
|
1517
|
+
rl.close();
|
|
1518
|
+
const a = answer.trim().toLowerCase();
|
|
1519
|
+
if (a === "o" || a === "overwrite") resolve2("overwrite");
|
|
1520
|
+
else if (a === "s" || a === "skip") resolve2("skip");
|
|
1521
|
+
else if (a === "d" || a === "diff" || a === "view diff") resolve2("view-diff");
|
|
1522
|
+
else if (a === "a" || a === "all" || a === "overwrite all") resolve2("overwrite-all");
|
|
1523
|
+
else resolve2("skip");
|
|
1524
|
+
});
|
|
1525
|
+
});
|
|
1526
|
+
}
|
|
1527
|
+
function registerUpdateCommand(program2) {
|
|
1528
|
+
program2.command("update").description("Update installed presets to latest bundled version").option("-y, --yes", "Skip confirmation, auto-skip conflicts").option("--force", "Overwrite all changed files (with backup)").option("--skip-existing", "Skip all changed files").action(async (opts) => {
|
|
1529
|
+
try {
|
|
1530
|
+
await runUpdate(opts);
|
|
1531
|
+
} catch (err) {
|
|
1532
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
1533
|
+
process9.exit(1);
|
|
1534
|
+
}
|
|
1535
|
+
});
|
|
1536
|
+
}
|
|
1537
|
+
async function runUpdate(opts) {
|
|
1538
|
+
const workspaceRoot = process9.cwd();
|
|
1539
|
+
const tracking = read(workspaceRoot);
|
|
1540
|
+
if (!tracking || tracking.presets.length === 0) {
|
|
1541
|
+
logger.info("No presets installed. Nothing to update.");
|
|
1542
|
+
process9.exit(0);
|
|
1543
|
+
}
|
|
1544
|
+
let mode = "interactive";
|
|
1545
|
+
if (opts.force) mode = "force";
|
|
1546
|
+
else if (opts.skipExisting) mode = "skip-existing";
|
|
1547
|
+
else if (opts.yes) mode = "skip-existing";
|
|
1548
|
+
const sessionState = { overwriteAll: false };
|
|
1549
|
+
const timestamp = generateTimestamp4();
|
|
1550
|
+
let totalUpdated = 0;
|
|
1551
|
+
let totalSkipped = 0;
|
|
1552
|
+
for (const trackedPreset of tracking.presets) {
|
|
1553
|
+
let bundled;
|
|
1554
|
+
try {
|
|
1555
|
+
bundled = load(trackedPreset.name);
|
|
1556
|
+
} catch {
|
|
1557
|
+
logger.warn(`Preset "${trackedPreset.name}" not found in bundled presets. Skipping.`);
|
|
1558
|
+
continue;
|
|
1559
|
+
}
|
|
1560
|
+
const bundledVersion = bundled.manifest.version;
|
|
1561
|
+
if (bundledVersion === trackedPreset.version) {
|
|
1562
|
+
logger.debug(`Preset "${trackedPreset.name}" is up to date (v${bundledVersion}).`);
|
|
1563
|
+
continue;
|
|
1564
|
+
}
|
|
1565
|
+
logger.info(
|
|
1566
|
+
`Updating ${color.bold(trackedPreset.name)}: v${trackedPreset.version} -> v${bundledVersion}`
|
|
1567
|
+
);
|
|
1568
|
+
const presetDir = bundled.dir;
|
|
1569
|
+
const updatedFiles = [];
|
|
1570
|
+
for (const fileEntry of bundled.manifest.files) {
|
|
1571
|
+
if (["mcp", "settings", "statusline"].includes(fileEntry.type)) continue;
|
|
1572
|
+
const sourcePath = path11.join(presetDir, fileEntry.source);
|
|
1573
|
+
const targetPath = path11.resolve(workspaceRoot, fileEntry.target);
|
|
1574
|
+
if (!safePathInside(workspaceRoot, fileEntry.target)) continue;
|
|
1575
|
+
if (!fs12.existsSync(sourcePath)) continue;
|
|
1576
|
+
const sourceContent = fs12.readFileSync(sourcePath);
|
|
1577
|
+
const newHash = sha2564(sourceContent);
|
|
1578
|
+
const trackedFile = trackedPreset.files.find((f) => f.target === fileEntry.target);
|
|
1579
|
+
if (trackedFile && trackedFile.contentHash === newHash) {
|
|
1580
|
+
continue;
|
|
1581
|
+
}
|
|
1582
|
+
const action = await resolve({
|
|
1583
|
+
target: targetPath,
|
|
1584
|
+
sourceContent,
|
|
1585
|
+
mode,
|
|
1586
|
+
sessionState,
|
|
1587
|
+
prompt: conflictPrompt3,
|
|
1588
|
+
showDiff: (t, s) => showDiff(t, s)
|
|
1589
|
+
});
|
|
1590
|
+
switch (action) {
|
|
1591
|
+
case "WRITE_NEW":
|
|
1592
|
+
fs12.mkdirSync(path11.dirname(targetPath), { recursive: true });
|
|
1593
|
+
atomicWrite(targetPath, sourceContent.toString("utf-8"));
|
|
1594
|
+
if (fileEntry.executable && process9.platform !== "win32") {
|
|
1595
|
+
try {
|
|
1596
|
+
fs12.chmodSync(targetPath, 493);
|
|
1597
|
+
} catch {
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
totalUpdated++;
|
|
1601
|
+
break;
|
|
1602
|
+
case "OVERWRITE_WITH_BACKUP":
|
|
1603
|
+
backup(workspaceRoot, targetPath, timestamp);
|
|
1604
|
+
atomicWrite(targetPath, sourceContent.toString("utf-8"));
|
|
1605
|
+
if (fileEntry.executable && process9.platform !== "win32") {
|
|
1606
|
+
try {
|
|
1607
|
+
fs12.chmodSync(targetPath, 493);
|
|
1608
|
+
} catch {
|
|
1609
|
+
}
|
|
1610
|
+
}
|
|
1611
|
+
totalUpdated++;
|
|
1612
|
+
break;
|
|
1613
|
+
case "SKIP":
|
|
1614
|
+
totalSkipped++;
|
|
1615
|
+
break;
|
|
1616
|
+
case "NO_OP":
|
|
1617
|
+
break;
|
|
1618
|
+
}
|
|
1619
|
+
updatedFiles.push({
|
|
1620
|
+
target: fileEntry.target,
|
|
1621
|
+
sourcePreset: bundled.manifest.name,
|
|
1622
|
+
contentHash: newHash,
|
|
1623
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1624
|
+
});
|
|
1625
|
+
}
|
|
1626
|
+
trackedPreset.version = bundledVersion;
|
|
1627
|
+
trackedPreset.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1628
|
+
for (const uf of updatedFiles) {
|
|
1629
|
+
const idx = trackedPreset.files.findIndex((f) => f.target === uf.target);
|
|
1630
|
+
if (idx >= 0) {
|
|
1631
|
+
trackedPreset.files[idx] = uf;
|
|
1632
|
+
} else {
|
|
1633
|
+
trackedPreset.files.push(uf);
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
tracking.kitVersion = getKitVersion3();
|
|
1638
|
+
tracking.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1639
|
+
write(workspaceRoot, tracking);
|
|
1640
|
+
if (totalUpdated === 0 && totalSkipped === 0) {
|
|
1641
|
+
logger.success("All presets are up to date.");
|
|
1642
|
+
} else {
|
|
1643
|
+
logger.success(`Update complete: ${totalUpdated} files updated, ${totalSkipped} skipped.`);
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
// src/commands/restore.ts
|
|
1648
|
+
import process10 from "process";
|
|
1649
|
+
function registerRestoreCommand(program2) {
|
|
1650
|
+
program2.command("restore").description("Restore files from backup").option("--timestamp <ts>", "Restore from specific backup timestamp").option("--list", "List available backup timestamps").action((opts) => {
|
|
1651
|
+
try {
|
|
1652
|
+
runRestore(opts);
|
|
1653
|
+
} catch (err) {
|
|
1654
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
1655
|
+
process10.exit(1);
|
|
1656
|
+
}
|
|
1657
|
+
});
|
|
1658
|
+
}
|
|
1659
|
+
function runRestore(opts) {
|
|
1660
|
+
const workspaceRoot = process10.cwd();
|
|
1661
|
+
if (opts.list) {
|
|
1662
|
+
const timestamps2 = listTimestamps(workspaceRoot);
|
|
1663
|
+
if (timestamps2.length === 0) {
|
|
1664
|
+
logger.info("No backups available.");
|
|
1665
|
+
process10.exit(0);
|
|
1666
|
+
}
|
|
1667
|
+
process10.stdout.write(`${color.bold("Available backups")}:
|
|
1668
|
+
`);
|
|
1669
|
+
for (const ts of timestamps2) {
|
|
1670
|
+
process10.stdout.write(` ${ts}
|
|
1671
|
+
`);
|
|
1672
|
+
}
|
|
1673
|
+
process10.exit(0);
|
|
1674
|
+
}
|
|
1675
|
+
const timestamps = listTimestamps(workspaceRoot);
|
|
1676
|
+
if (timestamps.length === 0) {
|
|
1677
|
+
logger.error("No backups found. Nothing to restore.");
|
|
1678
|
+
process10.exit(1);
|
|
1679
|
+
}
|
|
1680
|
+
const restored = restore(workspaceRoot, opts.timestamp);
|
|
1681
|
+
if (restored.length === 0) {
|
|
1682
|
+
logger.info("No files to restore from backup.");
|
|
1683
|
+
process10.exit(0);
|
|
1684
|
+
}
|
|
1685
|
+
process10.stdout.write(`${color.bold("Restored files")}:
|
|
1686
|
+
`);
|
|
1687
|
+
for (const file of restored) {
|
|
1688
|
+
process10.stdout.write(` ${color.green("+")} ${file}
|
|
1689
|
+
`);
|
|
1690
|
+
}
|
|
1691
|
+
logger.success(`Restored ${restored.length} files.`);
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1694
|
+
// src/commands/doctor.ts
|
|
1695
|
+
import fs13 from "fs";
|
|
1696
|
+
import path12 from "path";
|
|
1697
|
+
import process11 from "process";
|
|
1698
|
+
function registerDoctorCommand(program2) {
|
|
1699
|
+
program2.command("doctor").description("Run workspace health checks").option("--fix", "Auto-fix fixable issues").action((opts) => {
|
|
1700
|
+
try {
|
|
1701
|
+
runDoctor(opts);
|
|
1702
|
+
} catch (err) {
|
|
1703
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
1704
|
+
process11.exit(1);
|
|
1705
|
+
}
|
|
1706
|
+
});
|
|
1707
|
+
}
|
|
1708
|
+
function runDoctor(opts) {
|
|
1709
|
+
const workspaceRoot = process11.cwd();
|
|
1710
|
+
const checks = [];
|
|
1711
|
+
checks.push(checkNodeVersion());
|
|
1712
|
+
checks.push(checkKiroDir(workspaceRoot));
|
|
1713
|
+
checks.push(checkMcpJson(workspaceRoot));
|
|
1714
|
+
checks.push(checkTracking(workspaceRoot));
|
|
1715
|
+
checks.push(checkTrackedFiles(workspaceRoot));
|
|
1716
|
+
checks.push(checkSteeringFrontMatter(workspaceRoot));
|
|
1717
|
+
checks.push(checkMetadataJson(workspaceRoot));
|
|
1718
|
+
checks.push(checkStatuslineExecBit(workspaceRoot));
|
|
1719
|
+
let hasFail = false;
|
|
1720
|
+
for (const check of checks) {
|
|
1721
|
+
const tag = formatTag(check.result);
|
|
1722
|
+
process11.stdout.write(`${tag} ${check.message}
|
|
1723
|
+
`);
|
|
1724
|
+
if (check.result === "FAIL") hasFail = true;
|
|
1725
|
+
if (opts.fix && check.fixable && check.fixAction) {
|
|
1726
|
+
check.fixAction();
|
|
1727
|
+
process11.stdout.write(` ${color.green("Fixed!")}
|
|
1728
|
+
`);
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
process11.exit(hasFail ? 1 : 0);
|
|
1732
|
+
}
|
|
1733
|
+
function formatTag(result) {
|
|
1734
|
+
switch (result) {
|
|
1735
|
+
case "PASS":
|
|
1736
|
+
return color.green("[PASS]");
|
|
1737
|
+
case "FAIL":
|
|
1738
|
+
return color.red("[FAIL]");
|
|
1739
|
+
case "WARN":
|
|
1740
|
+
return color.yellow("[WARN]");
|
|
1741
|
+
}
|
|
1742
|
+
}
|
|
1743
|
+
function checkNodeVersion() {
|
|
1744
|
+
const major2 = parseInt(process11.versions.node.split(".")[0], 10);
|
|
1745
|
+
if (major2 >= 18) {
|
|
1746
|
+
return {
|
|
1747
|
+
name: "node-version",
|
|
1748
|
+
result: "PASS",
|
|
1749
|
+
message: `Node.js version >= 18 (${process11.version})`
|
|
1750
|
+
};
|
|
1751
|
+
}
|
|
1752
|
+
return {
|
|
1753
|
+
name: "node-version",
|
|
1754
|
+
result: "FAIL",
|
|
1755
|
+
message: `Node.js version >= 18 required (current: ${process11.version})`
|
|
1756
|
+
};
|
|
1757
|
+
}
|
|
1758
|
+
function checkKiroDir(workspaceRoot) {
|
|
1759
|
+
const kiroDir = path12.join(workspaceRoot, ".kiro");
|
|
1760
|
+
if (fs13.existsSync(kiroDir) && fs13.statSync(kiroDir).isDirectory()) {
|
|
1761
|
+
return { name: "kiro-dir", result: "PASS", message: ".kiro/ directory exists" };
|
|
1762
|
+
}
|
|
1763
|
+
return {
|
|
1764
|
+
name: "kiro-dir",
|
|
1765
|
+
result: "FAIL",
|
|
1766
|
+
message: ".kiro/ directory not found. Run `kiro-kit init` to create it."
|
|
1767
|
+
};
|
|
1768
|
+
}
|
|
1769
|
+
function checkMcpJson(workspaceRoot) {
|
|
1770
|
+
const mcpPath = path12.join(workspaceRoot, ".kiro/settings/mcp.json");
|
|
1771
|
+
if (!fs13.existsSync(mcpPath)) {
|
|
1772
|
+
return { name: "mcp-json", result: "WARN", message: ".kiro/settings/mcp.json not found (optional)" };
|
|
1773
|
+
}
|
|
1774
|
+
try {
|
|
1775
|
+
const content = fs13.readFileSync(mcpPath, "utf-8");
|
|
1776
|
+
JSON.parse(content);
|
|
1777
|
+
return { name: "mcp-json", result: "PASS", message: ".kiro/settings/mcp.json is valid JSON" };
|
|
1778
|
+
} catch {
|
|
1779
|
+
return {
|
|
1780
|
+
name: "mcp-json",
|
|
1781
|
+
result: "FAIL",
|
|
1782
|
+
message: ".kiro/settings/mcp.json is not valid JSON",
|
|
1783
|
+
fixable: true,
|
|
1784
|
+
fixAction: () => {
|
|
1785
|
+
const mcpPath2 = path12.join(workspaceRoot, ".kiro/settings/mcp.json");
|
|
1786
|
+
fs13.writeFileSync(mcpPath2, '{\n "mcpServers": {}\n}\n', "utf-8");
|
|
1787
|
+
}
|
|
1788
|
+
};
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
function checkTracking(workspaceRoot) {
|
|
1792
|
+
const trackingPath = path12.join(workspaceRoot, ".kiro/.kiro-kit.json");
|
|
1793
|
+
if (!fs13.existsSync(trackingPath)) {
|
|
1794
|
+
return { name: "tracking", result: "WARN", message: ".kiro/.kiro-kit.json not found (no presets installed)" };
|
|
1795
|
+
}
|
|
1796
|
+
try {
|
|
1797
|
+
const content = fs13.readFileSync(trackingPath, "utf-8");
|
|
1798
|
+
JSON.parse(content);
|
|
1799
|
+
return { name: "tracking", result: "PASS", message: ".kiro/.kiro-kit.json is valid" };
|
|
1800
|
+
} catch {
|
|
1801
|
+
return {
|
|
1802
|
+
name: "tracking",
|
|
1803
|
+
result: "FAIL",
|
|
1804
|
+
message: ".kiro/.kiro-kit.json is corrupt (invalid JSON)"
|
|
1805
|
+
};
|
|
1806
|
+
}
|
|
1807
|
+
}
|
|
1808
|
+
function checkTrackedFiles(workspaceRoot) {
|
|
1809
|
+
let tracking;
|
|
1810
|
+
try {
|
|
1811
|
+
tracking = read(workspaceRoot);
|
|
1812
|
+
} catch {
|
|
1813
|
+
return { name: "tracked-files", result: "WARN", message: "Cannot read tracking file, skipping file check" };
|
|
1814
|
+
}
|
|
1815
|
+
if (!tracking || tracking.presets.length === 0) {
|
|
1816
|
+
return { name: "tracked-files", result: "PASS", message: "No tracked files to verify" };
|
|
1817
|
+
}
|
|
1818
|
+
const missing = [];
|
|
1819
|
+
for (const preset of tracking.presets) {
|
|
1820
|
+
for (const file of preset.files) {
|
|
1821
|
+
const fullPath = path12.resolve(workspaceRoot, file.target);
|
|
1822
|
+
if (!fs13.existsSync(fullPath)) {
|
|
1823
|
+
missing.push(file.target);
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1826
|
+
}
|
|
1827
|
+
if (missing.length === 0) {
|
|
1828
|
+
return { name: "tracked-files", result: "PASS", message: "All tracked files exist on disk" };
|
|
1829
|
+
}
|
|
1830
|
+
return {
|
|
1831
|
+
name: "tracked-files",
|
|
1832
|
+
result: "FAIL",
|
|
1833
|
+
message: `${missing.length} tracked file(s) missing: ${missing.slice(0, 3).join(", ")}${missing.length > 3 ? "..." : ""}`
|
|
1834
|
+
};
|
|
1835
|
+
}
|
|
1836
|
+
function checkSteeringFrontMatter(workspaceRoot) {
|
|
1837
|
+
const steeringDir = path12.join(workspaceRoot, ".kiro/steering");
|
|
1838
|
+
if (!fs13.existsSync(steeringDir)) {
|
|
1839
|
+
return { name: "steering-fm", result: "PASS", message: "No steering files to check" };
|
|
1840
|
+
}
|
|
1841
|
+
const issues = [];
|
|
1842
|
+
const walkDir = (dir) => {
|
|
1843
|
+
let entries;
|
|
1844
|
+
try {
|
|
1845
|
+
entries = fs13.readdirSync(dir, { withFileTypes: true });
|
|
1846
|
+
} catch {
|
|
1847
|
+
return;
|
|
1848
|
+
}
|
|
1849
|
+
for (const entry of entries) {
|
|
1850
|
+
const fullPath = path12.join(dir, entry.name);
|
|
1851
|
+
if (entry.isDirectory()) {
|
|
1852
|
+
walkDir(fullPath);
|
|
1853
|
+
} else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
1854
|
+
checkSingleSteering(fullPath, issues);
|
|
1855
|
+
}
|
|
1856
|
+
}
|
|
1857
|
+
};
|
|
1858
|
+
walkDir(steeringDir);
|
|
1859
|
+
if (issues.length === 0) {
|
|
1860
|
+
return { name: "steering-fm", result: "PASS", message: "Steering front-matter has no trailing whitespace" };
|
|
1861
|
+
}
|
|
1862
|
+
return {
|
|
1863
|
+
name: "steering-fm",
|
|
1864
|
+
result: "WARN",
|
|
1865
|
+
message: `${issues.length} steering file(s) have trailing whitespace in front-matter`,
|
|
1866
|
+
fixable: true,
|
|
1867
|
+
fixAction: () => {
|
|
1868
|
+
fixSteeringWhitespace(steeringDir);
|
|
1869
|
+
}
|
|
1870
|
+
};
|
|
1871
|
+
}
|
|
1872
|
+
function checkSingleSteering(filePath, issues) {
|
|
1873
|
+
try {
|
|
1874
|
+
const content = fs13.readFileSync(filePath, "utf-8");
|
|
1875
|
+
const lines = content.split("\n");
|
|
1876
|
+
if (lines[0]?.trim() !== "---") return;
|
|
1877
|
+
let endIdx = -1;
|
|
1878
|
+
for (let i = 1; i < lines.length; i++) {
|
|
1879
|
+
if (lines[i]?.trim() === "---") {
|
|
1880
|
+
endIdx = i;
|
|
1881
|
+
break;
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
if (endIdx === -1) return;
|
|
1885
|
+
for (let i = 1; i < endIdx; i++) {
|
|
1886
|
+
if (lines[i] !== lines[i].trimEnd()) {
|
|
1887
|
+
issues.push(filePath);
|
|
1888
|
+
return;
|
|
1889
|
+
}
|
|
1890
|
+
}
|
|
1891
|
+
} catch {
|
|
1892
|
+
}
|
|
1893
|
+
}
|
|
1894
|
+
function fixSteeringWhitespace(steeringDir) {
|
|
1895
|
+
const walkAndFix = (dir) => {
|
|
1896
|
+
let entries;
|
|
1897
|
+
try {
|
|
1898
|
+
entries = fs13.readdirSync(dir, { withFileTypes: true });
|
|
1899
|
+
} catch {
|
|
1900
|
+
return;
|
|
1901
|
+
}
|
|
1902
|
+
for (const entry of entries) {
|
|
1903
|
+
const fullPath = path12.join(dir, entry.name);
|
|
1904
|
+
if (entry.isDirectory()) {
|
|
1905
|
+
walkAndFix(fullPath);
|
|
1906
|
+
} else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
1907
|
+
const content = fs13.readFileSync(fullPath, "utf-8");
|
|
1908
|
+
const lines = content.split("\n");
|
|
1909
|
+
if (lines[0]?.trim() !== "---") continue;
|
|
1910
|
+
let endIdx = -1;
|
|
1911
|
+
for (let i = 1; i < lines.length; i++) {
|
|
1912
|
+
if (lines[i]?.trim() === "---") {
|
|
1913
|
+
endIdx = i;
|
|
1914
|
+
break;
|
|
1915
|
+
}
|
|
1916
|
+
}
|
|
1917
|
+
if (endIdx === -1) continue;
|
|
1918
|
+
let changed = false;
|
|
1919
|
+
for (let i = 1; i < endIdx; i++) {
|
|
1920
|
+
const trimmed = lines[i].trimEnd();
|
|
1921
|
+
if (lines[i] !== trimmed) {
|
|
1922
|
+
lines[i] = trimmed;
|
|
1923
|
+
changed = true;
|
|
1924
|
+
}
|
|
1925
|
+
}
|
|
1926
|
+
if (changed) {
|
|
1927
|
+
fs13.writeFileSync(fullPath, lines.join("\n"), "utf-8");
|
|
1928
|
+
}
|
|
1929
|
+
}
|
|
1930
|
+
}
|
|
1931
|
+
};
|
|
1932
|
+
walkAndFix(steeringDir);
|
|
1933
|
+
}
|
|
1934
|
+
function checkMetadataJson(workspaceRoot) {
|
|
1935
|
+
const metaPath = path12.join(workspaceRoot, ".kiro/metadata.json");
|
|
1936
|
+
if (!fs13.existsSync(metaPath)) {
|
|
1937
|
+
return { name: "metadata-json", result: "WARN", message: ".kiro/metadata.json not found (optional)" };
|
|
1938
|
+
}
|
|
1939
|
+
try {
|
|
1940
|
+
const content = fs13.readFileSync(metaPath, "utf-8");
|
|
1941
|
+
const parsed = JSON.parse(content);
|
|
1942
|
+
if (!parsed.version || !parsed.name) {
|
|
1943
|
+
return { name: "metadata-json", result: "FAIL", message: ".kiro/metadata.json missing required fields (version, name)" };
|
|
1944
|
+
}
|
|
1945
|
+
return { name: "metadata-json", result: "PASS", message: ".kiro/metadata.json is valid" };
|
|
1946
|
+
} catch {
|
|
1947
|
+
return { name: "metadata-json", result: "FAIL", message: ".kiro/metadata.json is not valid JSON" };
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
function checkStatuslineExecBit(workspaceRoot) {
|
|
1951
|
+
if (process11.platform === "win32") {
|
|
1952
|
+
return { name: "statusline-exec", result: "PASS", message: "Statusline exec bit check (skipped on Windows)" };
|
|
1953
|
+
}
|
|
1954
|
+
const shPath = path12.join(workspaceRoot, ".kiro/statusline.sh");
|
|
1955
|
+
if (!fs13.existsSync(shPath)) {
|
|
1956
|
+
return { name: "statusline-exec", result: "PASS", message: "No statusline.sh to check" };
|
|
1957
|
+
}
|
|
1958
|
+
try {
|
|
1959
|
+
const stat = fs13.statSync(shPath);
|
|
1960
|
+
const isExecutable = (stat.mode & 73) !== 0;
|
|
1961
|
+
if (isExecutable) {
|
|
1962
|
+
return { name: "statusline-exec", result: "PASS", message: "statusline.sh is executable" };
|
|
1963
|
+
}
|
|
1964
|
+
return {
|
|
1965
|
+
name: "statusline-exec",
|
|
1966
|
+
result: "WARN",
|
|
1967
|
+
message: "statusline.sh is not executable",
|
|
1968
|
+
fixable: true,
|
|
1969
|
+
fixAction: () => {
|
|
1970
|
+
fs13.chmodSync(shPath, 493);
|
|
1971
|
+
}
|
|
1972
|
+
};
|
|
1973
|
+
} catch {
|
|
1974
|
+
return { name: "statusline-exec", result: "WARN", message: "Cannot check statusline.sh permissions" };
|
|
1975
|
+
}
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
// src/commands/telemetry.ts
|
|
1979
|
+
import fs14 from "fs";
|
|
1980
|
+
import path13 from "path";
|
|
1981
|
+
import os2 from "os";
|
|
1982
|
+
import process12 from "process";
|
|
1983
|
+
var CONFIG_DIR = path13.join(os2.homedir(), ".kiro-kit");
|
|
1984
|
+
var CONFIG_FILE = path13.join(CONFIG_DIR, "config.json");
|
|
1985
|
+
function readConfig() {
|
|
1986
|
+
try {
|
|
1987
|
+
if (fs14.existsSync(CONFIG_FILE)) {
|
|
1988
|
+
return JSON.parse(fs14.readFileSync(CONFIG_FILE, "utf-8"));
|
|
1989
|
+
}
|
|
1990
|
+
} catch {
|
|
1991
|
+
}
|
|
1992
|
+
return { telemetry: false };
|
|
1993
|
+
}
|
|
1994
|
+
function writeConfig(config) {
|
|
1995
|
+
fs14.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
1996
|
+
fs14.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
1997
|
+
}
|
|
1998
|
+
function registerTelemetryCommand(program2) {
|
|
1999
|
+
const telemetry = program2.command("telemetry").description("Manage anonymous usage telemetry");
|
|
2000
|
+
telemetry.command("enable").description("Opt in to anonymous telemetry").action(() => {
|
|
2001
|
+
try {
|
|
2002
|
+
const config = readConfig();
|
|
2003
|
+
config.telemetry = true;
|
|
2004
|
+
writeConfig(config);
|
|
2005
|
+
logger.success("Telemetry enabled. Anonymous usage data will be collected.");
|
|
2006
|
+
} catch (err) {
|
|
2007
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
2008
|
+
process12.exit(1);
|
|
2009
|
+
}
|
|
2010
|
+
});
|
|
2011
|
+
telemetry.command("disable").description("Opt out of telemetry").action(() => {
|
|
2012
|
+
try {
|
|
2013
|
+
const config = readConfig();
|
|
2014
|
+
config.telemetry = false;
|
|
2015
|
+
writeConfig(config);
|
|
2016
|
+
logger.success("Telemetry disabled. No data will be collected.");
|
|
2017
|
+
} catch (err) {
|
|
2018
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
2019
|
+
process12.exit(1);
|
|
2020
|
+
}
|
|
2021
|
+
});
|
|
2022
|
+
telemetry.command("status").description("Show current telemetry status").action(() => {
|
|
2023
|
+
try {
|
|
2024
|
+
const config = readConfig();
|
|
2025
|
+
const status = config.telemetry ? color.green("enabled") : color.yellow("disabled");
|
|
2026
|
+
process12.stdout.write(`Telemetry: ${status}
|
|
2027
|
+
`);
|
|
2028
|
+
process12.stdout.write(`Config: ${CONFIG_FILE}
|
|
2029
|
+
`);
|
|
2030
|
+
} catch (err) {
|
|
2031
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
2032
|
+
process12.exit(1);
|
|
2033
|
+
}
|
|
2034
|
+
});
|
|
2035
|
+
}
|
|
2036
|
+
|
|
2037
|
+
// src/index.ts
|
|
2038
|
+
var major = parseInt(process13.versions.node.split(".")[0], 10);
|
|
2039
|
+
if (major < 18) {
|
|
2040
|
+
process13.stderr.write(
|
|
2041
|
+
`[KK001] kiro-kit requires Node.js >= 18. Current version: ${process13.version}. Please upgrade Node.js.
|
|
2042
|
+
`
|
|
2043
|
+
);
|
|
2044
|
+
process13.exit(1);
|
|
2045
|
+
}
|
|
2046
|
+
var require2 = createRequire(import.meta.url);
|
|
2047
|
+
var pkg = require2("../package.json");
|
|
2048
|
+
var program = new Command();
|
|
2049
|
+
program.name("kiro-kit").description("CLI tool for bootstrapping engineer-grade Kiro IDE workspaces.").version(pkg.version, "-v, --version");
|
|
2050
|
+
program.option("--verbose", "Enable verbose output");
|
|
2051
|
+
program.option("--quiet", "Suppress non-essential output");
|
|
2052
|
+
program.option("--no-color", "Disable colored output");
|
|
2053
|
+
registerInitCommand(program);
|
|
2054
|
+
registerAddCommand(program);
|
|
2055
|
+
registerListCommand(program);
|
|
2056
|
+
registerInfoCommand(program);
|
|
2057
|
+
registerUpdateCommand(program);
|
|
2058
|
+
registerRestoreCommand(program);
|
|
2059
|
+
registerDoctorCommand(program);
|
|
2060
|
+
registerTelemetryCommand(program);
|
|
2061
|
+
program.hook("preAction", (thisCommand) => {
|
|
2062
|
+
const opts = thisCommand.opts();
|
|
2063
|
+
if (opts["verbose"]) setVerbose(true);
|
|
2064
|
+
if (opts["quiet"]) setQuiet(true);
|
|
2065
|
+
});
|
|
2066
|
+
program.parse(process13.argv);
|
|
2067
|
+
//# sourceMappingURL=index.js.map
|