@sk8metal/michi-cli 0.0.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +236 -57
- package/dist/scripts/__tests__/create-project.test.js +24 -28
- package/dist/scripts/__tests__/create-project.test.js.map +1 -1
- package/dist/scripts/__tests__/jira-transitions.test.d.ts +5 -0
- package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/jira-transitions.test.js +172 -0
- package/dist/scripts/__tests__/jira-transitions.test.js.map +1 -0
- package/dist/scripts/__tests__/multi-project-estimate.test.js +14 -15
- package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -1
- package/dist/scripts/__tests__/setup-existing-project.test.js +79 -0
- package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
- package/dist/scripts/__tests__/setup-interactive.test.js +23 -17
- package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -1
- package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +5 -0
- package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/spec-impl-workflow.test.js +321 -0
- package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +1 -0
- package/dist/scripts/__tests__/spec-loader.test.d.ts +5 -0
- package/dist/scripts/__tests__/spec-loader.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/spec-loader.test.js +153 -0
- package/dist/scripts/__tests__/spec-loader.test.js.map +1 -0
- package/dist/scripts/__tests__/validate-phase.test.js +109 -22
- package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
- package/dist/scripts/config/config-schema.d.ts +31 -0
- package/dist/scripts/config/config-schema.d.ts.map +1 -1
- package/dist/scripts/config/config-schema.js +64 -26
- package/dist/scripts/config/config-schema.js.map +1 -1
- package/dist/scripts/config-interactive.d.ts.map +1 -1
- package/dist/scripts/config-interactive.js +53 -38
- package/dist/scripts/config-interactive.js.map +1 -1
- package/dist/scripts/confluence-sync.d.ts.map +1 -1
- package/dist/scripts/confluence-sync.js +0 -11
- package/dist/scripts/confluence-sync.js.map +1 -1
- package/dist/scripts/constants/__tests__/environments.test.js +39 -5
- package/dist/scripts/constants/__tests__/environments.test.js.map +1 -1
- package/dist/scripts/constants/environments.d.ts +1 -1
- package/dist/scripts/constants/environments.d.ts.map +1 -1
- package/dist/scripts/constants/environments.js +22 -7
- package/dist/scripts/constants/environments.js.map +1 -1
- package/dist/scripts/constants/test-commands.d.ts +36 -0
- package/dist/scripts/constants/test-commands.d.ts.map +1 -0
- package/dist/scripts/constants/test-commands.js +70 -0
- package/dist/scripts/constants/test-commands.js.map +1 -0
- package/dist/scripts/jira-sync.d.ts +89 -3
- package/dist/scripts/jira-sync.d.ts.map +1 -1
- package/dist/scripts/jira-sync.js +366 -96
- package/dist/scripts/jira-sync.js.map +1 -1
- package/dist/scripts/markdown-to-confluence.js +1 -1
- package/dist/scripts/markdown-to-confluence.js.map +1 -1
- package/dist/scripts/phase-runner.d.ts +1 -1
- package/dist/scripts/phase-runner.d.ts.map +1 -1
- package/dist/scripts/phase-runner.js +809 -13
- package/dist/scripts/phase-runner.js.map +1 -1
- package/dist/scripts/pr-automation.d.ts.map +1 -1
- package/dist/scripts/pr-automation.js.map +1 -1
- package/dist/scripts/pre-flight-check.js +1 -1
- package/dist/scripts/pre-flight-check.js.map +1 -1
- package/dist/scripts/setup-existing-project.js +61 -29
- package/dist/scripts/setup-existing-project.js.map +1 -1
- package/dist/scripts/setup-interactive.js +3 -3
- package/dist/scripts/setup-interactive.js.map +1 -1
- package/dist/scripts/spec-impl-workflow.d.ts +94 -0
- package/dist/scripts/spec-impl-workflow.d.ts.map +1 -0
- package/dist/scripts/spec-impl-workflow.js +354 -0
- package/dist/scripts/spec-impl-workflow.js.map +1 -0
- package/dist/scripts/template/__tests__/renderer.test.js.map +1 -1
- package/dist/scripts/test-execution-generator.d.ts +52 -0
- package/dist/scripts/test-execution-generator.d.ts.map +1 -0
- package/dist/scripts/test-execution-generator.js +576 -0
- package/dist/scripts/test-execution-generator.js.map +1 -0
- package/dist/scripts/test-interactive.d.ts +10 -0
- package/dist/scripts/test-interactive.d.ts.map +1 -0
- package/dist/scripts/test-interactive.js +627 -0
- package/dist/scripts/test-interactive.js.map +1 -0
- package/dist/scripts/test-new-features.d.ts +5 -0
- package/dist/scripts/test-new-features.d.ts.map +1 -0
- package/dist/scripts/test-new-features.js +145 -0
- package/dist/scripts/test-new-features.js.map +1 -0
- package/dist/scripts/test-spec-generator.d.ts +29 -0
- package/dist/scripts/test-spec-generator.d.ts.map +1 -0
- package/dist/scripts/test-spec-generator.js +494 -0
- package/dist/scripts/test-spec-generator.js.map +1 -0
- package/dist/scripts/test-workflow-stages.d.ts +6 -0
- package/dist/scripts/test-workflow-stages.d.ts.map +1 -0
- package/dist/scripts/test-workflow-stages.js +43 -0
- package/dist/scripts/test-workflow-stages.js.map +1 -0
- package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/aidlc-parser.test.js +315 -0
- package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/business-days.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/business-days.test.js +171 -0
- package/dist/scripts/utils/__tests__/business-days.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/config-loader.test.js +1 -1
- package/dist/scripts/utils/__tests__/config-loader.test.js.map +1 -1
- package/dist/scripts/utils/__tests__/config-validator.test.js +164 -35
- package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
- package/dist/scripts/utils/__tests__/env-config.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/env-config.test.js +218 -0
- package/dist/scripts/utils/__tests__/env-config.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +202 -0
- package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/tasks-converter.test.js +500 -0
- package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +314 -0
- package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/test-runner.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/test-runner.test.js +64 -0
- package/dist/scripts/utils/__tests__/test-runner.test.js.map +1 -0
- package/dist/scripts/utils/aidlc-parser.d.ts +86 -0
- package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -0
- package/dist/scripts/utils/aidlc-parser.js +208 -0
- package/dist/scripts/utils/aidlc-parser.js.map +1 -0
- package/dist/scripts/utils/business-days.d.ts +52 -0
- package/dist/scripts/utils/business-days.d.ts.map +1 -0
- package/dist/scripts/utils/business-days.js +98 -0
- package/dist/scripts/utils/business-days.js.map +1 -0
- package/dist/scripts/utils/ci-generator.d.ts +14 -0
- package/dist/scripts/utils/ci-generator.d.ts.map +1 -0
- package/dist/scripts/utils/ci-generator.js +61 -0
- package/dist/scripts/utils/ci-generator.js.map +1 -0
- package/dist/scripts/utils/config-loader.js +2 -2
- package/dist/scripts/utils/config-loader.js.map +1 -1
- package/dist/scripts/utils/config-validator.d.ts +7 -1
- package/dist/scripts/utils/config-validator.d.ts.map +1 -1
- package/dist/scripts/utils/config-validator.js +136 -23
- package/dist/scripts/utils/config-validator.js.map +1 -1
- package/dist/scripts/utils/confluence-approval.d.ts +46 -0
- package/dist/scripts/utils/confluence-approval.d.ts.map +1 -0
- package/dist/scripts/utils/confluence-approval.js +118 -0
- package/dist/scripts/utils/confluence-approval.js.map +1 -0
- package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
- package/dist/scripts/utils/confluence-hierarchy.js +1 -1
- package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
- package/dist/scripts/utils/docker-generator.d.ts +9 -0
- package/dist/scripts/utils/docker-generator.d.ts.map +1 -0
- package/dist/scripts/utils/docker-generator.js +132 -0
- package/dist/scripts/utils/docker-generator.js.map +1 -0
- package/dist/scripts/utils/docker-requirement-detector.d.ts +15 -0
- package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -0
- package/dist/scripts/utils/docker-requirement-detector.js +124 -0
- package/dist/scripts/utils/docker-requirement-detector.js.map +1 -0
- package/dist/scripts/utils/env-config.d.ts +54 -0
- package/dist/scripts/utils/env-config.d.ts.map +1 -0
- package/dist/scripts/utils/env-config.js +414 -0
- package/dist/scripts/utils/env-config.js.map +1 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.d.ts +70 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.js +147 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -0
- package/dist/scripts/utils/language-detector.d.ts +14 -0
- package/dist/scripts/utils/language-detector.d.ts.map +1 -0
- package/dist/scripts/utils/language-detector.js +119 -0
- package/dist/scripts/utils/language-detector.js.map +1 -0
- package/dist/scripts/utils/markdown-parser.d.ts +55 -0
- package/dist/scripts/utils/markdown-parser.d.ts.map +1 -0
- package/dist/scripts/utils/markdown-parser.js +289 -0
- package/dist/scripts/utils/markdown-parser.js.map +1 -0
- package/dist/scripts/utils/project-detector.d.ts +17 -0
- package/dist/scripts/utils/project-detector.d.ts.map +1 -0
- package/dist/scripts/utils/project-detector.js +166 -0
- package/dist/scripts/utils/project-detector.js.map +1 -0
- package/dist/scripts/utils/project-finder.js +2 -2
- package/dist/scripts/utils/project-finder.js.map +1 -1
- package/dist/scripts/utils/release-notes-generator.d.ts +56 -0
- package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -0
- package/dist/scripts/utils/release-notes-generator.js +162 -0
- package/dist/scripts/utils/release-notes-generator.js.map +1 -0
- package/dist/scripts/utils/spec-loader.d.ts +79 -0
- package/dist/scripts/utils/spec-loader.d.ts.map +1 -0
- package/dist/scripts/utils/spec-loader.js +80 -0
- package/dist/scripts/utils/spec-loader.js.map +1 -0
- package/dist/scripts/utils/spec-updater.d.ts +7 -0
- package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
- package/dist/scripts/utils/spec-updater.js.map +1 -1
- package/dist/scripts/utils/tasks-converter.d.ts +57 -0
- package/dist/scripts/utils/tasks-converter.d.ts.map +1 -0
- package/dist/scripts/utils/tasks-converter.js +322 -0
- package/dist/scripts/utils/tasks-converter.js.map +1 -0
- package/dist/scripts/utils/tasks-format-validator.d.ts +36 -0
- package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -0
- package/dist/scripts/utils/tasks-format-validator.js +158 -0
- package/dist/scripts/utils/tasks-format-validator.js.map +1 -0
- package/dist/scripts/utils/template-applier.d.ts +37 -0
- package/dist/scripts/utils/template-applier.d.ts.map +1 -0
- package/dist/scripts/utils/template-applier.js +129 -0
- package/dist/scripts/utils/template-applier.js.map +1 -0
- package/dist/scripts/utils/test-config-generator.d.ts +12 -0
- package/dist/scripts/utils/test-config-generator.d.ts.map +1 -0
- package/dist/scripts/utils/test-config-generator.js +185 -0
- package/dist/scripts/utils/test-config-generator.js.map +1 -0
- package/dist/scripts/utils/test-runner.d.ts +31 -0
- package/dist/scripts/utils/test-runner.d.ts.map +1 -0
- package/dist/scripts/utils/test-runner.js +103 -0
- package/dist/scripts/utils/test-runner.js.map +1 -0
- package/dist/scripts/validate-phase.d.ts +1 -1
- package/dist/scripts/validate-phase.d.ts.map +1 -1
- package/dist/scripts/validate-phase.js +171 -8
- package/dist/scripts/validate-phase.js.map +1 -1
- package/dist/scripts/workflow-orchestrator.d.ts +8 -0
- package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
- package/dist/scripts/workflow-orchestrator.js +108 -7
- package/dist/scripts/workflow-orchestrator.js.map +1 -1
- package/dist/src/__tests__/integration/internationalization.test.d.ts +8 -0
- package/dist/src/__tests__/integration/internationalization.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/internationalization.test.js +333 -0
- package/dist/src/__tests__/integration/internationalization.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +1 -1
- package/dist/src/__tests__/integration/setup/claude-agent.test.js +17 -20
- package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -1
- package/dist/src/__tests__/integration/setup/claude.test.js +82 -0
- package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -1
- package/dist/src/__tests__/integration/setup/cursor.test.js +23 -19
- package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -1
- package/dist/src/__tests__/integration/setup/validation.test.js +41 -58
- package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +209 -18
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/setup-existing.d.ts +4 -0
- package/dist/src/commands/setup-existing.d.ts.map +1 -1
- package/dist/src/commands/setup-existing.js +367 -47
- package/dist/src/commands/setup-existing.js.map +1 -1
- package/docs/README.md +3 -1
- package/docs/context.md +59 -0
- package/docs/design-issue-55.md +240 -0
- package/docs/design-issue-56.md +181 -0
- package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
- package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
- package/docs/plan.md +275 -0
- package/docs/user-guide/getting-started/github-token-setup.md +509 -0
- package/docs/{getting-started → user-guide/getting-started}/quick-start.md +16 -0
- package/docs/{getting-started → user-guide/getting-started}/setup.md +28 -1
- package/docs/user-guide/guides/agent-skills-integration.md +217 -0
- package/docs/{guides → user-guide/guides}/customization.md +2 -2
- package/docs/user-guide/guides/internationalization.md +540 -0
- package/docs/{guides → user-guide/guides}/multi-project.md +3 -3
- package/docs/{guides → user-guide/guides}/phase-automation.md +92 -34
- package/docs/user-guide/guides/workflow.md +570 -0
- package/docs/user-guide/hands-on/README.md +142 -0
- package/docs/user-guide/hands-on/claude-agent-setup.md +455 -0
- package/docs/user-guide/hands-on/claude-setup.md +398 -0
- package/docs/user-guide/hands-on/cursor-setup.md +352 -0
- package/docs/user-guide/hands-on/troubleshooting.md +964 -0
- package/docs/user-guide/hands-on/verification-checklist.md +438 -0
- package/docs/user-guide/hands-on/workflow-walkthrough.md +906 -0
- package/docs/user-guide/reference/config.md +564 -0
- package/docs/{reference → user-guide/reference}/quick-reference.md +53 -40
- package/docs/{reference → user-guide/reference}/tasks-template.md +2 -2
- package/docs/user-guide/release/ci-setup.md +541 -0
- package/docs/user-guide/release/release-flow.md +476 -0
- package/docs/user-guide/templates/test-specs/README.md +173 -0
- package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
- package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
- package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
- package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
- package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
- package/docs/{testing → user-guide/testing}/integration-tests.md +24 -9
- package/docs/user-guide/testing/tdd-cycle.md +349 -0
- package/docs/user-guide/testing/test-execution-flow.md +396 -0
- package/docs/user-guide/testing/test-failure-handling.md +521 -0
- package/docs/user-guide/testing/test-planning-flow.md +181 -0
- package/docs/user-guide/testing-strategy.md +185 -0
- package/docs/verification-guide.md +518 -0
- package/package.json +7 -2
- package/scripts/__tests__/create-project.test.ts +67 -49
- package/scripts/__tests__/jira-transitions.test.ts +225 -0
- package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
- package/scripts/__tests__/setup-existing-project.test.ts +98 -1
- package/scripts/__tests__/setup-interactive.test.ts +52 -46
- package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
- package/scripts/__tests__/spec-loader.test.ts +199 -0
- package/scripts/__tests__/validate-phase.test.ts +178 -54
- package/scripts/config/config-schema.ts +100 -50
- package/scripts/config-interactive.ts +191 -136
- package/scripts/confluence-sync.ts +0 -12
- package/scripts/constants/__tests__/environments.test.ts +42 -6
- package/scripts/constants/environments.ts +33 -13
- package/scripts/constants/test-commands.ts +96 -0
- package/scripts/jira-sync.ts +767 -232
- package/scripts/markdown-to-confluence.ts +1 -1
- package/scripts/phase-runner.ts +1056 -63
- package/scripts/pr-automation.ts +0 -1
- package/scripts/pre-flight-check.ts +1 -1
- package/scripts/pre-publish-check.sh +311 -0
- package/scripts/quick-verify.sh +115 -0
- package/scripts/setup-existing-project.ts +201 -117
- package/scripts/setup-interactive.ts +4 -4
- package/scripts/spec-impl-workflow.ts +505 -0
- package/scripts/template/__tests__/renderer.test.ts +1 -2
- package/scripts/test-execution-generator.ts +695 -0
- package/scripts/test-interactive.ts +779 -0
- package/scripts/test-new-features.ts +168 -0
- package/scripts/test-npm-package.sh +345 -0
- package/scripts/test-spec-generator.ts +574 -0
- package/scripts/test-workflow-stages.ts +53 -0
- package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
- package/scripts/utils/__tests__/business-days.test.ts +214 -0
- package/scripts/utils/__tests__/config-loader.test.ts +1 -1
- package/scripts/utils/__tests__/config-validator.test.ts +309 -88
- package/scripts/utils/__tests__/env-config.test.ts +259 -0
- package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
- package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
- package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
- package/scripts/utils/__tests__/test-runner.test.ts +77 -0
- package/scripts/utils/aidlc-parser.ts +289 -0
- package/scripts/utils/business-days.ts +115 -0
- package/scripts/utils/ci-generator.ts +84 -0
- package/scripts/utils/config-loader.ts +2 -2
- package/scripts/utils/config-validator.ts +304 -117
- package/scripts/utils/confluence-approval.ts +167 -0
- package/scripts/utils/confluence-hierarchy.ts +2 -4
- package/scripts/utils/docker-generator.ts +151 -0
- package/scripts/utils/docker-requirement-detector.ts +153 -0
- package/scripts/utils/env-config.ts +526 -0
- package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
- package/scripts/utils/language-detector.ts +139 -0
- package/scripts/utils/markdown-parser.ts +376 -0
- package/scripts/utils/project-detector.ts +192 -0
- package/scripts/utils/project-finder.ts +2 -2
- package/scripts/utils/release-notes-generator.ts +210 -0
- package/scripts/utils/spec-loader.ts +125 -0
- package/scripts/utils/spec-updater.ts +8 -1
- package/scripts/utils/tasks-converter.ts +601 -0
- package/scripts/utils/tasks-format-validator.ts +193 -0
- package/scripts/utils/template-applier.ts +202 -0
- package/scripts/utils/test-config-generator.ts +210 -0
- package/scripts/utils/test-runner.ts +133 -0
- package/scripts/validate-phase.ts +207 -12
- package/scripts/workflow-orchestrator.ts +130 -12
- package/templates/ci/github-actions/java.yml +54 -0
- package/templates/ci/github-actions/nodejs.yml +46 -0
- package/templates/ci/github-actions/php.yml +52 -0
- package/templates/ci/screwdriver/java.yaml +17 -0
- package/templates/ci/screwdriver/nodejs.yaml +17 -0
- package/templates/ci/screwdriver/php.yaml +20 -0
- package/templates/claude/agents/design-reviewer/AGENT.md +497 -0
- package/templates/claude/agents/e2e-first-planner/AGENT.md +410 -0
- package/templates/claude/agents/oss-license-checker/AGENT.md +265 -0
- package/templates/claude/agents/pr-resolver/AGENT.md +196 -0
- package/templates/claude/agents/stable-version-auditor/AGENT.md +279 -0
- package/templates/claude/commands/kiro/kiro-spec-impl.md +253 -0
- package/templates/claude/commands/kiro/kiro-spec-tasks.md +368 -0
- package/templates/claude/commands/michi/design-review.md +66 -0
- package/templates/claude/commands/michi/e2e-plan.md +113 -0
- package/templates/claude/commands/michi/license-check.md +80 -0
- package/templates/claude/commands/michi/pr-resolve.md +153 -0
- package/templates/claude/commands/michi/version-audit.md +91 -0
- package/templates/claude/skills/design-review/SKILL.md +648 -0
- package/templates/claude/skills/e2e-first-planning/SKILL.md +360 -0
- package/templates/claude/skills/oss-license/SKILL.md +232 -0
- package/templates/claude/skills/stable-version/SKILL.md +252 -0
- package/templates/claude-agent/README.md +7 -1
- package/templates/claude-agent/agents/.gitkeep +0 -0
- package/templates/claude-agent/agents/designer.md +79 -0
- package/templates/claude-agent/agents/developer.md +68 -0
- package/templates/claude-agent/agents/manager-agent.md +59 -0
- package/templates/claude-agent/agents/tester.md +101 -0
- package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
- package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
- package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
- package/templates/cline/rules/atlassian-integration.md +36 -0
- package/templates/cline/rules/michi-core.md +56 -0
- package/templates/codex/AGENTS.override.md +277 -0
- package/templates/codex/prompts/confluence-sync.md +177 -0
- package/templates/codex/rules/README.md +210 -0
- package/templates/common/.kiro/project.json.template +21 -0
- package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
- package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
- package/templates/gemini/commands/README.md +41 -0
- package/templates/gemini/rules/GEMINI.md +80 -0
- package/docs/guides/workflow.md +0 -342
- package/docs/reference/config.md +0 -545
- package/scripts/setup-existing.sh +0 -279
- /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
- /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
- /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
- /package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +0 -0
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
7
|
-
import { resolve } from 'path';
|
|
8
7
|
import * as readline from 'readline';
|
|
9
8
|
import { loadProjectMeta } from './utils/project-meta.js';
|
|
10
9
|
import { validateProjectConfig } from './utils/config-validator.js';
|
|
@@ -15,7 +14,7 @@ import { validateProjectConfig } from './utils/config-validator.js';
|
|
|
15
14
|
function createInterface(): readline.Interface {
|
|
16
15
|
return readline.createInterface({
|
|
17
16
|
input: process.stdin,
|
|
18
|
-
output: process.stdout
|
|
17
|
+
output: process.stdout,
|
|
19
18
|
});
|
|
20
19
|
}
|
|
21
20
|
|
|
@@ -23,8 +22,8 @@ function createInterface(): readline.Interface {
|
|
|
23
22
|
* 質問を表示して回答を取得
|
|
24
23
|
*/
|
|
25
24
|
function question(rl: readline.Interface, query: string): Promise<string> {
|
|
26
|
-
return new Promise(resolve => {
|
|
27
|
-
rl.question(query, answer => {
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
rl.question(query, (answer) => {
|
|
28
27
|
resolve(answer.trim());
|
|
29
28
|
});
|
|
30
29
|
});
|
|
@@ -38,7 +37,7 @@ async function select(
|
|
|
38
37
|
prompt: string,
|
|
39
38
|
choices: Array<{ value: string; label: string; description?: string }>,
|
|
40
39
|
defaultValue?: string,
|
|
41
|
-
maxRetries: number = 3
|
|
40
|
+
maxRetries: number = 3,
|
|
42
41
|
): Promise<string> {
|
|
43
42
|
console.log(`\n${prompt}`);
|
|
44
43
|
choices.forEach((choice, index) => {
|
|
@@ -46,44 +45,55 @@ async function select(
|
|
|
46
45
|
const desc = choice.description ? ` - ${choice.description}` : '';
|
|
47
46
|
console.log(` ${index + 1}. ${choice.label}${desc}${defaultMark}`);
|
|
48
47
|
});
|
|
49
|
-
|
|
50
|
-
const answer = await question(
|
|
51
|
-
|
|
48
|
+
|
|
49
|
+
const answer = await question(
|
|
50
|
+
rl,
|
|
51
|
+
`\n選択してください [1-${choices.length}]: `,
|
|
52
|
+
);
|
|
53
|
+
|
|
52
54
|
if (!answer && defaultValue) {
|
|
53
55
|
return defaultValue;
|
|
54
56
|
}
|
|
55
|
-
|
|
57
|
+
|
|
56
58
|
const index = parseInt(answer, 10) - 1;
|
|
57
59
|
if (index >= 0 && index < choices.length) {
|
|
58
60
|
return choices[index].value;
|
|
59
61
|
}
|
|
60
|
-
|
|
62
|
+
|
|
61
63
|
if (defaultValue) {
|
|
62
64
|
return defaultValue;
|
|
63
65
|
}
|
|
64
|
-
|
|
66
|
+
|
|
65
67
|
// 無効な入力の場合は再試行(最大試行回数まで)
|
|
66
68
|
if (maxRetries > 0) {
|
|
67
|
-
console.log(
|
|
69
|
+
console.log(
|
|
70
|
+
`⚠️ 無効な選択です。もう一度入力してください(残り試行回数: ${maxRetries})。`,
|
|
71
|
+
);
|
|
68
72
|
return select(rl, prompt, choices, defaultValue, maxRetries - 1);
|
|
69
73
|
}
|
|
70
|
-
|
|
74
|
+
|
|
71
75
|
// 最大試行回数に達した場合はデフォルト値または最初の選択肢を返す
|
|
72
|
-
console.log(
|
|
76
|
+
console.log(
|
|
77
|
+
`⚠️ 最大試行回数に達しました。デフォルト値を使用します: ${defaultValue || choices[0].value}`,
|
|
78
|
+
);
|
|
73
79
|
return defaultValue || choices[0].value;
|
|
74
80
|
}
|
|
75
81
|
|
|
76
82
|
/**
|
|
77
83
|
* Yes/No質問
|
|
78
84
|
*/
|
|
79
|
-
async function confirm(
|
|
85
|
+
async function confirm(
|
|
86
|
+
rl: readline.Interface,
|
|
87
|
+
prompt: string,
|
|
88
|
+
defaultValue: boolean = true,
|
|
89
|
+
): Promise<boolean> {
|
|
80
90
|
const defaultText = defaultValue ? '[Y/n]' : '[y/N]';
|
|
81
91
|
const answer = await question(rl, `${prompt} ${defaultText}: `);
|
|
82
|
-
|
|
92
|
+
|
|
83
93
|
if (!answer) {
|
|
84
94
|
return defaultValue;
|
|
85
95
|
}
|
|
86
|
-
|
|
96
|
+
|
|
87
97
|
return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
|
|
88
98
|
}
|
|
89
99
|
|
|
@@ -94,131 +104,145 @@ async function multiSelect(
|
|
|
94
104
|
rl: readline.Interface,
|
|
95
105
|
prompt: string,
|
|
96
106
|
choices: Array<{ value: string; label: string }>,
|
|
97
|
-
defaults: string[] = []
|
|
107
|
+
defaults: string[] = [],
|
|
98
108
|
): Promise<string[]> {
|
|
99
109
|
console.log(`\n${prompt}`);
|
|
100
110
|
choices.forEach((choice, index) => {
|
|
101
111
|
const checked = defaults.includes(choice.value) ? '[x]' : '[ ]';
|
|
102
112
|
console.log(` ${checked} ${index + 1}. ${choice.label}`);
|
|
103
113
|
});
|
|
104
|
-
|
|
105
|
-
const answer = await question(
|
|
106
|
-
|
|
114
|
+
|
|
115
|
+
const answer = await question(
|
|
116
|
+
rl,
|
|
117
|
+
'\n選択してください(カンマ区切り、例: 1,2,3): ',
|
|
118
|
+
);
|
|
119
|
+
|
|
107
120
|
if (!answer && defaults.length > 0) {
|
|
108
121
|
return defaults;
|
|
109
122
|
}
|
|
110
|
-
|
|
123
|
+
|
|
111
124
|
if (!answer) {
|
|
112
125
|
return [];
|
|
113
126
|
}
|
|
114
|
-
|
|
115
|
-
const indices = answer
|
|
116
|
-
|
|
127
|
+
|
|
128
|
+
const indices = answer
|
|
129
|
+
.split(',')
|
|
130
|
+
.map((s) => parseInt(s.trim(), 10) - 1)
|
|
131
|
+
.filter((i) => i >= 0 && i < choices.length);
|
|
132
|
+
return indices.map((i) => choices[i].value);
|
|
117
133
|
}
|
|
118
134
|
|
|
119
135
|
/**
|
|
120
136
|
* Confluence設定を対話的に取得
|
|
121
137
|
*/
|
|
122
|
-
async function getConfluenceConfig(
|
|
138
|
+
async function getConfluenceConfig(
|
|
139
|
+
rl: readline.Interface,
|
|
140
|
+
_projectMeta: any,
|
|
141
|
+
): Promise<any> {
|
|
123
142
|
console.log('\n📄 Confluence設定');
|
|
124
143
|
console.log('='.repeat(60));
|
|
125
|
-
|
|
144
|
+
|
|
126
145
|
const granularityChoices = [
|
|
127
146
|
{
|
|
128
147
|
value: 'single',
|
|
129
148
|
label: 'single(1ドキュメント = 1ページ)',
|
|
130
|
-
description: 'デフォルト・現在の動作'
|
|
149
|
+
description: 'デフォルト・現在の動作',
|
|
131
150
|
},
|
|
132
151
|
{
|
|
133
152
|
value: 'by-section',
|
|
134
153
|
label: 'by-section(セクションごとにページ分割)',
|
|
135
|
-
description: '## セクションごとにページを作成'
|
|
154
|
+
description: '## セクションごとにページを作成',
|
|
136
155
|
},
|
|
137
156
|
{
|
|
138
157
|
value: 'by-hierarchy',
|
|
139
158
|
label: 'by-hierarchy(階層構造)',
|
|
140
|
-
description: '親ページ + 子ページの階層構造'
|
|
159
|
+
description: '親ページ + 子ページの階層構造',
|
|
141
160
|
},
|
|
142
161
|
{
|
|
143
162
|
value: 'manual',
|
|
144
163
|
label: 'manual(手動指定)',
|
|
145
|
-
description: '設定ファイルで明示的に指定'
|
|
146
|
-
}
|
|
164
|
+
description: '設定ファイルで明示的に指定',
|
|
165
|
+
},
|
|
147
166
|
];
|
|
148
|
-
|
|
167
|
+
|
|
149
168
|
const granularity = await select(
|
|
150
169
|
rl,
|
|
151
170
|
'ページ作成粒度を選択してください:',
|
|
152
171
|
granularityChoices,
|
|
153
|
-
'single'
|
|
172
|
+
'single',
|
|
154
173
|
);
|
|
155
|
-
|
|
174
|
+
|
|
156
175
|
const config: any = {
|
|
157
|
-
pageCreationGranularity: granularity
|
|
176
|
+
pageCreationGranularity: granularity,
|
|
158
177
|
};
|
|
159
|
-
|
|
178
|
+
|
|
160
179
|
// タイトル形式のカスタマイズ
|
|
161
180
|
const customTitle = await confirm(
|
|
162
181
|
rl,
|
|
163
182
|
'ページタイトル形式をカスタマイズしますか?',
|
|
164
|
-
false
|
|
183
|
+
false,
|
|
165
184
|
);
|
|
166
|
-
|
|
185
|
+
|
|
167
186
|
if (customTitle) {
|
|
168
187
|
const titleFormat = await question(
|
|
169
188
|
rl,
|
|
170
|
-
'タイトル形式を入力してください(例: {projectName} - {featureName}): '
|
|
189
|
+
'タイトル形式を入力してください(例: {projectName} - {featureName}): ',
|
|
171
190
|
);
|
|
172
191
|
if (titleFormat) {
|
|
173
192
|
config.pageTitleFormat = titleFormat;
|
|
174
193
|
}
|
|
175
194
|
}
|
|
176
|
-
|
|
195
|
+
|
|
177
196
|
// 階層構造設定
|
|
178
197
|
if (granularity === 'by-hierarchy' || granularity === 'manual') {
|
|
179
198
|
config.hierarchy = {};
|
|
180
|
-
|
|
199
|
+
|
|
181
200
|
if (granularity === 'by-hierarchy') {
|
|
182
201
|
const modeChoices = [
|
|
183
202
|
{
|
|
184
203
|
value: 'simple',
|
|
185
204
|
label: 'simple(親ページ + ドキュメントタイプ子ページ)',
|
|
186
|
-
description: '2階層構造'
|
|
205
|
+
description: '2階層構造',
|
|
187
206
|
},
|
|
188
207
|
{
|
|
189
208
|
value: 'nested',
|
|
190
|
-
label:
|
|
191
|
-
|
|
192
|
-
|
|
209
|
+
label:
|
|
210
|
+
'nested(親ページ → ドキュメントタイプ親 → セクション子ページ)',
|
|
211
|
+
description: '3階層構造',
|
|
212
|
+
},
|
|
193
213
|
];
|
|
194
|
-
|
|
214
|
+
|
|
195
215
|
const mode = await select(
|
|
196
216
|
rl,
|
|
197
217
|
'階層構造のモードを選択してください:',
|
|
198
218
|
modeChoices,
|
|
199
|
-
'simple'
|
|
219
|
+
'simple',
|
|
200
220
|
);
|
|
201
|
-
|
|
221
|
+
|
|
202
222
|
config.hierarchy.mode = mode;
|
|
203
223
|
}
|
|
204
|
-
|
|
224
|
+
|
|
205
225
|
const parentTitle = await question(
|
|
206
226
|
rl,
|
|
207
|
-
'親ページのタイトル形式を入力してください(例: [{projectName}] {featureName}): '
|
|
227
|
+
'親ページのタイトル形式を入力してください(例: [{projectName}] {featureName}): ',
|
|
208
228
|
);
|
|
209
|
-
|
|
229
|
+
|
|
210
230
|
if (parentTitle) {
|
|
211
231
|
config.hierarchy.parentPageTitle = parentTitle;
|
|
212
232
|
} else {
|
|
213
233
|
config.hierarchy.parentPageTitle = '[{projectName}] {featureName}';
|
|
214
234
|
}
|
|
215
|
-
|
|
235
|
+
|
|
216
236
|
if (granularity === 'manual') {
|
|
217
|
-
console.log(
|
|
218
|
-
|
|
237
|
+
console.log(
|
|
238
|
+
'\n⚠️ manualモードでは、設定ファイルを手動で編集する必要があります。',
|
|
239
|
+
);
|
|
240
|
+
console.log(
|
|
241
|
+
' hierarchy.structure に各ドキュメントタイプのページ構造を定義してください。',
|
|
242
|
+
);
|
|
219
243
|
}
|
|
220
244
|
}
|
|
221
|
-
|
|
245
|
+
|
|
222
246
|
return config;
|
|
223
247
|
}
|
|
224
248
|
|
|
@@ -228,74 +252,82 @@ async function getConfluenceConfig(rl: readline.Interface, projectMeta: any): Pr
|
|
|
228
252
|
async function getJiraConfig(rl: readline.Interface): Promise<any> {
|
|
229
253
|
console.log('\n📋 JIRA設定');
|
|
230
254
|
console.log('='.repeat(60));
|
|
231
|
-
|
|
255
|
+
|
|
232
256
|
const createEpic = await confirm(rl, 'Epicを作成しますか?', true);
|
|
233
|
-
|
|
257
|
+
|
|
234
258
|
const granularityChoices = [
|
|
235
259
|
{
|
|
236
260
|
value: 'all',
|
|
237
261
|
label: 'all(全Storyを作成)',
|
|
238
|
-
description: 'デフォルト'
|
|
262
|
+
description: 'デフォルト',
|
|
239
263
|
},
|
|
240
264
|
{
|
|
241
265
|
value: 'by-phase',
|
|
242
266
|
label: 'by-phase(フェーズごとに作成)',
|
|
243
|
-
description: '
|
|
267
|
+
description: 'フェーズごとに個別に作成',
|
|
244
268
|
},
|
|
245
269
|
{
|
|
246
270
|
value: 'selected-phases',
|
|
247
271
|
label: 'selected-phases(指定フェーズのみ)',
|
|
248
|
-
description: '選択したフェーズのみ作成'
|
|
249
|
-
}
|
|
272
|
+
description: '選択したフェーズのみ作成',
|
|
273
|
+
},
|
|
250
274
|
];
|
|
251
|
-
|
|
275
|
+
|
|
252
276
|
const granularity = await select(
|
|
253
277
|
rl,
|
|
254
278
|
'Story作成粒度を選択してください:',
|
|
255
279
|
granularityChoices,
|
|
256
|
-
'all'
|
|
280
|
+
'all',
|
|
257
281
|
);
|
|
258
|
-
|
|
282
|
+
|
|
259
283
|
const config: any = {
|
|
260
284
|
createEpic,
|
|
261
|
-
storyCreationGranularity: granularity
|
|
285
|
+
storyCreationGranularity: granularity,
|
|
262
286
|
};
|
|
263
|
-
|
|
287
|
+
|
|
264
288
|
if (granularity === 'selected-phases') {
|
|
265
289
|
const phaseChoices = [
|
|
266
|
-
|
|
267
|
-
{ value: '
|
|
268
|
-
{ value: '
|
|
269
|
-
{ value: '
|
|
270
|
-
{ value: '
|
|
271
|
-
{ value: '
|
|
290
|
+
// 新ワークフロー構造
|
|
291
|
+
{ value: 'spec-init', label: 'Phase 0.0: プロジェクト初期化' },
|
|
292
|
+
{ value: 'requirements', label: 'Phase 0.1: 要件定義(Requirements)' },
|
|
293
|
+
{ value: 'design', label: 'Phase 0.2: 設計(Design)' },
|
|
294
|
+
{ value: 'test-type-selection', label: 'Phase 0.3: テストタイプ選択' },
|
|
295
|
+
{ value: 'test-spec', label: 'Phase 0.4: テスト仕様書作成' },
|
|
296
|
+
{ value: 'spec-tasks', label: 'Phase 0.5: タスク分割' },
|
|
297
|
+
{ value: 'environment-setup', label: 'Phase 1: 環境構築' },
|
|
298
|
+
{ value: 'implementation', label: 'Phase 2: TDD実装(Implementation)' },
|
|
299
|
+
{ value: 'phase-a', label: 'Phase A: PR前自動テスト' },
|
|
300
|
+
{ value: 'testing', label: 'Phase 3: 追加QA(Testing)' },
|
|
301
|
+
{ value: 'phase-b', label: 'Phase B: リリース準備テスト' },
|
|
302
|
+
{ value: 'release-prep', label: 'Phase 4: リリース準備(Release Preparation)' },
|
|
303
|
+
{ value: 'release', label: 'Phase 5: リリース(Release)' },
|
|
272
304
|
];
|
|
273
|
-
|
|
305
|
+
|
|
274
306
|
const selectedPhases = await multiSelect(
|
|
275
307
|
rl,
|
|
276
308
|
'作成するフェーズを選択してください:',
|
|
277
309
|
phaseChoices,
|
|
278
|
-
['implementation', 'testing']
|
|
310
|
+
['implementation', 'testing'],
|
|
279
311
|
);
|
|
280
|
-
|
|
312
|
+
|
|
281
313
|
config.selectedPhases = selectedPhases;
|
|
282
314
|
}
|
|
283
|
-
|
|
315
|
+
|
|
284
316
|
const storyPointsChoices = [
|
|
285
317
|
{ value: 'auto', label: 'auto(自動抽出)', description: 'デフォルト' },
|
|
286
318
|
{ value: 'manual', label: 'manual(手動設定)' },
|
|
287
|
-
{ value: 'disabled', label: 'disabled(設定しない)' }
|
|
319
|
+
{ value: 'disabled', label: 'disabled(設定しない)' },
|
|
288
320
|
];
|
|
289
|
-
|
|
321
|
+
|
|
290
322
|
const storyPoints = await select(
|
|
291
323
|
rl,
|
|
292
324
|
'Story Points設定を選択してください:',
|
|
293
325
|
storyPointsChoices,
|
|
294
|
-
'auto'
|
|
326
|
+
'auto',
|
|
295
327
|
);
|
|
296
|
-
|
|
328
|
+
|
|
297
329
|
config.storyPoints = storyPoints;
|
|
298
|
-
|
|
330
|
+
|
|
299
331
|
return config;
|
|
300
332
|
}
|
|
301
333
|
|
|
@@ -305,62 +337,66 @@ async function getJiraConfig(rl: readline.Interface): Promise<any> {
|
|
|
305
337
|
async function getWorkflowConfig(rl: readline.Interface): Promise<any> {
|
|
306
338
|
console.log('\n⚙️ ワークフロー設定');
|
|
307
339
|
console.log('='.repeat(60));
|
|
308
|
-
|
|
340
|
+
|
|
309
341
|
const phaseChoices = [
|
|
310
342
|
{ value: 'requirements', label: '要件定義(Requirements)' },
|
|
311
343
|
{ value: 'design', label: '設計(Design)' },
|
|
312
|
-
{ value: 'tasks', label: 'タスク分割(Tasks)' }
|
|
344
|
+
{ value: 'tasks', label: 'タスク分割(Tasks)' },
|
|
313
345
|
];
|
|
314
|
-
|
|
346
|
+
|
|
315
347
|
const enabledPhases = await multiSelect(
|
|
316
348
|
rl,
|
|
317
349
|
'有効化するフェーズを選択してください:',
|
|
318
350
|
phaseChoices,
|
|
319
|
-
['requirements', 'design', 'tasks']
|
|
351
|
+
['requirements', 'design', 'tasks'],
|
|
320
352
|
);
|
|
321
|
-
|
|
353
|
+
|
|
322
354
|
const config: any = {
|
|
323
|
-
enabledPhases
|
|
355
|
+
enabledPhases,
|
|
324
356
|
};
|
|
325
|
-
|
|
357
|
+
|
|
326
358
|
const customApprovalGates = await confirm(
|
|
327
359
|
rl,
|
|
328
360
|
'承認ゲートをカスタマイズしますか?',
|
|
329
|
-
false
|
|
361
|
+
false,
|
|
330
362
|
);
|
|
331
|
-
|
|
363
|
+
|
|
332
364
|
if (customApprovalGates) {
|
|
333
365
|
config.approvalGates = {};
|
|
334
|
-
|
|
366
|
+
|
|
335
367
|
if (enabledPhases.includes('requirements')) {
|
|
336
368
|
const approvers = await question(
|
|
337
369
|
rl,
|
|
338
|
-
'要件定義フェーズの承認者(カンマ区切り、例: pm,director): '
|
|
370
|
+
'要件定義フェーズの承認者(カンマ区切り、例: pm,director): ',
|
|
339
371
|
);
|
|
340
372
|
if (approvers) {
|
|
341
|
-
config.approvalGates.requirements = approvers
|
|
373
|
+
config.approvalGates.requirements = approvers
|
|
374
|
+
.split(',')
|
|
375
|
+
.map((s) => s.trim());
|
|
342
376
|
}
|
|
343
377
|
}
|
|
344
|
-
|
|
378
|
+
|
|
345
379
|
if (enabledPhases.includes('design')) {
|
|
346
380
|
const approvers = await question(
|
|
347
381
|
rl,
|
|
348
|
-
'設計フェーズの承認者(カンマ区切り、例: architect,director): '
|
|
382
|
+
'設計フェーズの承認者(カンマ区切り、例: architect,director): ',
|
|
349
383
|
);
|
|
350
384
|
if (approvers) {
|
|
351
|
-
config.approvalGates.design = approvers.split(',').map(s => s.trim());
|
|
385
|
+
config.approvalGates.design = approvers.split(',').map((s) => s.trim());
|
|
352
386
|
}
|
|
353
387
|
}
|
|
354
|
-
|
|
388
|
+
|
|
355
389
|
const releaseApprovers = await question(
|
|
356
390
|
rl,
|
|
357
|
-
'リリースフェーズの承認者(カンマ区切り、例: sm,director): '
|
|
391
|
+
'リリースフェーズの承認者(カンマ区切り、例: sm,director): ',
|
|
358
392
|
);
|
|
359
393
|
if (releaseApprovers) {
|
|
360
|
-
config.approvalGates.release = releaseApprovers
|
|
394
|
+
config.approvalGates.release = releaseApprovers
|
|
395
|
+
.split(',')
|
|
396
|
+
.map((s) => s.trim());
|
|
361
397
|
}
|
|
362
398
|
}
|
|
363
|
-
|
|
399
|
+
|
|
364
400
|
return config;
|
|
365
401
|
}
|
|
366
402
|
|
|
@@ -369,114 +405,134 @@ async function getWorkflowConfig(rl: readline.Interface): Promise<any> {
|
|
|
369
405
|
*/
|
|
370
406
|
async function main(): Promise<void> {
|
|
371
407
|
const rl = createInterface();
|
|
372
|
-
|
|
408
|
+
|
|
373
409
|
try {
|
|
374
410
|
console.log('🎨 Michi カスタマイズ設定ツール');
|
|
375
411
|
console.log('='.repeat(60));
|
|
376
412
|
console.log('このツールで .michi/config.json を作成・更新できます。\n');
|
|
377
|
-
|
|
413
|
+
|
|
378
414
|
// プロジェクトメタデータを読み込み
|
|
379
415
|
let projectMeta;
|
|
380
416
|
try {
|
|
381
417
|
projectMeta = loadProjectMeta();
|
|
382
|
-
console.log(
|
|
383
|
-
|
|
418
|
+
console.log(
|
|
419
|
+
`📦 プロジェクト: ${projectMeta.projectName} (${projectMeta.projectId})\n`,
|
|
420
|
+
);
|
|
421
|
+
} catch {
|
|
384
422
|
console.error('❌ プロジェクトメタデータが見つかりません。');
|
|
385
423
|
console.error(' .kiro/project.json が存在するか確認してください。');
|
|
386
424
|
process.exit(1);
|
|
387
425
|
}
|
|
388
|
-
|
|
426
|
+
|
|
389
427
|
// 既存の設定ファイルを確認
|
|
390
428
|
const { getConfigPath } = await import('./utils/config-loader.js');
|
|
391
429
|
const configPath = getConfigPath();
|
|
392
430
|
let existingConfig: any = null;
|
|
393
|
-
|
|
431
|
+
|
|
394
432
|
if (existsSync(configPath)) {
|
|
395
433
|
console.log('⚠️ 既存の設定ファイルが見つかりました。');
|
|
396
434
|
const overwrite = await confirm(rl, '上書きしますか?', false);
|
|
397
|
-
|
|
435
|
+
|
|
398
436
|
if (!overwrite) {
|
|
399
437
|
console.log('中止しました。');
|
|
400
438
|
process.exit(0);
|
|
401
439
|
}
|
|
402
|
-
|
|
440
|
+
|
|
403
441
|
try {
|
|
404
442
|
const content = readFileSync(configPath, 'utf-8');
|
|
405
443
|
existingConfig = JSON.parse(content);
|
|
406
444
|
console.log('既存の設定を読み込みました。\n');
|
|
407
|
-
} catch
|
|
408
|
-
console.log(
|
|
445
|
+
} catch {
|
|
446
|
+
console.log(
|
|
447
|
+
'既存の設定ファイルの読み込みに失敗しました。新規作成します。\n',
|
|
448
|
+
);
|
|
409
449
|
}
|
|
410
450
|
}
|
|
411
|
-
|
|
451
|
+
|
|
412
452
|
// 設定を対話的に取得
|
|
413
453
|
const config: any = existingConfig || {};
|
|
414
|
-
|
|
454
|
+
|
|
415
455
|
// Confluence設定
|
|
416
|
-
const configureConfluence = await confirm(
|
|
456
|
+
const configureConfluence = await confirm(
|
|
457
|
+
rl,
|
|
458
|
+
'Confluence設定をカスタマイズしますか?',
|
|
459
|
+
false,
|
|
460
|
+
);
|
|
417
461
|
if (configureConfluence) {
|
|
418
462
|
config.confluence = await getConfluenceConfig(rl, projectMeta);
|
|
419
463
|
}
|
|
420
|
-
|
|
464
|
+
|
|
421
465
|
// JIRA設定
|
|
422
|
-
const configureJira = await confirm(
|
|
466
|
+
const configureJira = await confirm(
|
|
467
|
+
rl,
|
|
468
|
+
'JIRA設定をカスタマイズしますか?',
|
|
469
|
+
false,
|
|
470
|
+
);
|
|
423
471
|
if (configureJira) {
|
|
424
472
|
config.jira = await getJiraConfig(rl);
|
|
425
473
|
}
|
|
426
|
-
|
|
474
|
+
|
|
427
475
|
// ワークフロー設定
|
|
428
|
-
const configureWorkflow = await confirm(
|
|
476
|
+
const configureWorkflow = await confirm(
|
|
477
|
+
rl,
|
|
478
|
+
'ワークフロー設定をカスタマイズしますか?',
|
|
479
|
+
false,
|
|
480
|
+
);
|
|
429
481
|
if (configureWorkflow) {
|
|
430
482
|
config.workflow = await getWorkflowConfig(rl);
|
|
431
483
|
}
|
|
432
|
-
|
|
484
|
+
|
|
433
485
|
// 設定の確認
|
|
434
486
|
console.log('\n📋 設定内容の確認');
|
|
435
487
|
console.log('='.repeat(60));
|
|
436
488
|
console.log(JSON.stringify(config, null, 2));
|
|
437
489
|
console.log('');
|
|
438
|
-
|
|
490
|
+
|
|
439
491
|
const confirmSave = await confirm(rl, 'この設定を保存しますか?', true);
|
|
440
|
-
|
|
492
|
+
|
|
441
493
|
if (!confirmSave) {
|
|
442
494
|
console.log('保存をキャンセルしました。');
|
|
443
495
|
process.exit(0);
|
|
444
496
|
}
|
|
445
|
-
|
|
497
|
+
|
|
446
498
|
// 設定ファイルを保存
|
|
447
499
|
writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
448
500
|
console.log(`\n✅ 設定ファイルを保存しました: ${configPath}`);
|
|
449
|
-
|
|
501
|
+
|
|
450
502
|
// バリデーション
|
|
451
503
|
console.log('\n🔍 設定ファイルのバリデーション...');
|
|
452
504
|
const validation = validateProjectConfig();
|
|
453
|
-
|
|
505
|
+
|
|
454
506
|
if (validation.info.length > 0) {
|
|
455
507
|
console.log('ℹ️ Info:');
|
|
456
|
-
validation.info.forEach(msg => console.log(` - ${msg}`));
|
|
508
|
+
validation.info.forEach((msg) => console.log(` - ${msg}`));
|
|
457
509
|
}
|
|
458
|
-
|
|
510
|
+
|
|
459
511
|
if (validation.warnings.length > 0) {
|
|
460
512
|
console.log('⚠️ Warnings:');
|
|
461
|
-
validation.warnings.forEach(warning => console.log(` - ${warning}`));
|
|
513
|
+
validation.warnings.forEach((warning) => console.log(` - ${warning}`));
|
|
462
514
|
}
|
|
463
|
-
|
|
515
|
+
|
|
464
516
|
if (validation.errors.length > 0) {
|
|
465
517
|
console.error('❌ Validation errors:');
|
|
466
|
-
validation.errors.forEach(error => console.error(` - ${error}`));
|
|
467
|
-
console.error(
|
|
518
|
+
validation.errors.forEach((error) => console.error(` - ${error}`));
|
|
519
|
+
console.error(
|
|
520
|
+
'\n設定ファイルにエラーがあります。手動で修正してください。',
|
|
521
|
+
);
|
|
468
522
|
process.exit(1);
|
|
469
523
|
}
|
|
470
|
-
|
|
524
|
+
|
|
471
525
|
if (validation.valid) {
|
|
472
526
|
console.log('✅ 設定ファイルは有効です。');
|
|
473
527
|
}
|
|
474
|
-
|
|
528
|
+
|
|
475
529
|
console.log('\n🎉 設定が完了しました!');
|
|
476
530
|
console.log(' 次回のConfluence/JIRA同期時に、この設定が適用されます。');
|
|
477
|
-
|
|
478
531
|
} catch (error) {
|
|
479
|
-
console.error(
|
|
532
|
+
console.error(
|
|
533
|
+
'❌ エラーが発生しました:',
|
|
534
|
+
error instanceof Error ? error.message : error,
|
|
535
|
+
);
|
|
480
536
|
process.exit(1);
|
|
481
537
|
} finally {
|
|
482
538
|
rl.close();
|
|
@@ -485,11 +541,10 @@ async function main(): Promise<void> {
|
|
|
485
541
|
|
|
486
542
|
// CLI実行
|
|
487
543
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
488
|
-
main().catch(error => {
|
|
544
|
+
main().catch((error) => {
|
|
489
545
|
console.error('❌ 予期しないエラー:', error);
|
|
490
546
|
process.exit(1);
|
|
491
547
|
});
|
|
492
548
|
}
|
|
493
549
|
|
|
494
550
|
export { main as configInteractive };
|
|
495
|
-
|
|
@@ -443,18 +443,6 @@ async function syncToConfluence(
|
|
|
443
443
|
return firstPageUrl;
|
|
444
444
|
}
|
|
445
445
|
|
|
446
|
-
/**
|
|
447
|
-
* ドキュメントタイプのラベルを取得
|
|
448
|
-
*/
|
|
449
|
-
function getDocTypeLabel(docType: string): string {
|
|
450
|
-
const labels: Record<string, string> = {
|
|
451
|
-
requirements: '要件定義',
|
|
452
|
-
design: '設計',
|
|
453
|
-
tasks: 'タスク分割'
|
|
454
|
-
};
|
|
455
|
-
return labels[docType] || docType;
|
|
456
|
-
}
|
|
457
|
-
|
|
458
446
|
// CLI実行
|
|
459
447
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
460
448
|
const args = process.argv.slice(2);
|