@sk8metal/michi-cli 0.0.8 → 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/CHANGELOG.md +60 -0
- package/README.md +420 -49
- 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 +146 -5
- 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 +26 -22
- package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
- package/dist/scripts/config/config-schema.d.ts +17 -0
- package/dist/scripts/config/config-schema.d.ts.map +1 -1
- package/dist/scripts/config/config-schema.js +55 -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.d.ts +2 -0
- package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
- package/dist/scripts/constants/__tests__/environments.test.js +125 -0
- package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
- package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
- package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
- package/dist/scripts/constants/__tests__/languages.test.js +82 -0
- package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
- package/dist/scripts/constants/environments.d.ts +33 -0
- package/dist/scripts/constants/environments.d.ts.map +1 -0
- package/dist/scripts/constants/environments.js +64 -0
- package/dist/scripts/constants/environments.js.map +1 -0
- package/dist/scripts/constants/languages.d.ts +23 -0
- package/dist/scripts/constants/languages.d.ts.map +1 -0
- package/dist/scripts/constants/languages.js +53 -0
- package/dist/scripts/constants/languages.js.map +1 -0
- 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/create-project.d.ts +4 -0
- package/dist/scripts/create-project.d.ts.map +1 -1
- package/dist/scripts/create-project.js +51 -22
- package/dist/scripts/create-project.js.map +1 -1
- 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.d.ts +3 -1
- package/dist/scripts/setup-existing-project.d.ts.map +1 -1
- package/dist/scripts/setup-existing-project.js +165 -78
- 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.d.ts +2 -0
- package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
- package/dist/scripts/template/__tests__/renderer.test.js +165 -0
- package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
- package/dist/scripts/template/renderer.d.ts +70 -0
- package/dist/scripts/template/renderer.d.ts.map +1 -0
- package/dist/scripts/template/renderer.js +99 -0
- package/dist/scripts/template/renderer.js.map +1 -0
- 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/template-finder.d.ts +37 -0
- package/dist/scripts/utils/template-finder.d.ts.map +1 -0
- package/dist/scripts/utils/template-finder.js +63 -0
- package/dist/scripts/utils/template-finder.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 +153 -5
- 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 +5 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.js +122 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
- package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/cursor.test.js +166 -0
- package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
- package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/validation.test.js +301 -0
- package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +228 -18
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/setup-existing.d.ts +25 -0
- package/dist/src/commands/setup-existing.d.ts.map +1 -0
- package/dist/src/commands/setup-existing.js +695 -0
- package/dist/src/commands/setup-existing.js.map +1 -0
- package/dist/vitest.config.d.ts.map +1 -1
- package/dist/vitest.config.js +4 -3
- package/dist/vitest.config.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}/new-repository-setup.md +108 -28
- package/docs/{getting-started → user-guide/getting-started}/quick-start.md +73 -6
- package/docs/{getting-started → user-guide/getting-started}/setup.md +278 -3
- package/docs/{guides → user-guide/guides}/customization.md +3 -3
- package/docs/user-guide/guides/internationalization.md +540 -0
- package/docs/{guides → user-guide/guides}/multi-project.md +2 -2
- package/docs/{guides → user-guide/guides}/phase-automation.md +67 -9
- package/docs/user-guide/guides/workflow.md +582 -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 +75 -53
- 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/user-guide/testing/integration-tests.md +312 -0
- 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 +13 -3
- 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 +171 -6
- 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 +78 -54
- package/scripts/config/config-schema.ts +89 -50
- package/scripts/config-interactive.ts +191 -136
- package/scripts/confluence-sync.ts +0 -12
- package/scripts/constants/__tests__/environments.test.ts +146 -0
- package/scripts/constants/__tests__/languages.test.ts +100 -0
- package/scripts/constants/environments.ts +81 -0
- package/scripts/constants/languages.ts +70 -0
- package/scripts/constants/test-commands.ts +96 -0
- package/scripts/create-project.ts +52 -22
- 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 +306 -143
- package/scripts/setup-interactive.ts +4 -4
- package/scripts/spec-impl-workflow.ts +505 -0
- package/scripts/template/__tests__/renderer.test.ts +206 -0
- package/scripts/template/renderer.ts +133 -0
- 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/template-finder.ts +75 -0
- package/scripts/utils/test-config-generator.ts +210 -0
- package/scripts/utils/test-runner.ts +133 -0
- package/scripts/validate-phase.ts +186 -9
- 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/commands/kiro/kiro-spec-impl.md +244 -0
- package/templates/claude/commands/kiro/kiro-spec-tasks.md +354 -0
- package/templates/claude/commands/michi/confluence-sync.md +38 -0
- package/templates/claude/commands/michi/project-switch.md +36 -0
- package/templates/claude/rules/atlassian-integration.md +35 -0
- package/templates/claude/rules/michi-core.md +54 -0
- package/templates/claude-agent/README.md +31 -0
- 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/cursor/commands/michi/confluence-sync.md +76 -0
- package/templates/cursor/commands/michi/project-switch.md +69 -0
- package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
- package/templates/cursor/rules/github-ssot.mdc +151 -0
- package/templates/cursor/rules/multi-project.mdc +81 -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-env.sh +0 -52
- package/scripts/setup-existing.sh +0 -152
- /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/{reference → user-guide/reference}/tasks-template.md +0 -0
|
@@ -3,11 +3,17 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { existsSync, readFileSync } from 'fs';
|
|
6
|
-
import { resolve } from 'path';
|
|
7
6
|
import { AppConfigSchema } from '../config/config-schema.js';
|
|
8
7
|
import type { ZodIssue } from 'zod';
|
|
9
|
-
import type { AppConfig } from '../config/config-schema.js';
|
|
10
8
|
import { getConfig, getConfigPath } from './config-loader.js';
|
|
9
|
+
import { loadProjectMeta } from './project-meta.js';
|
|
10
|
+
import {
|
|
11
|
+
getProjectIssueTypes,
|
|
12
|
+
hasJiraCredentials,
|
|
13
|
+
hasIssueTypeId,
|
|
14
|
+
filterStoryTypes,
|
|
15
|
+
filterSubtaskTypes,
|
|
16
|
+
} from './jira-issue-type-fetcher.js';
|
|
11
17
|
|
|
12
18
|
/**
|
|
13
19
|
* バリデーション結果
|
|
@@ -22,13 +28,15 @@ export interface ValidationResult {
|
|
|
22
28
|
/**
|
|
23
29
|
* プロジェクト設定ファイルをバリデーション
|
|
24
30
|
*/
|
|
25
|
-
export function validateProjectConfig(
|
|
31
|
+
export function validateProjectConfig(
|
|
32
|
+
projectRoot: string = process.cwd(),
|
|
33
|
+
): ValidationResult {
|
|
26
34
|
const errors: string[] = [];
|
|
27
35
|
const warnings: string[] = [];
|
|
28
36
|
const info: string[] = [];
|
|
29
|
-
|
|
37
|
+
|
|
30
38
|
const configPath = getConfigPath(projectRoot);
|
|
31
|
-
|
|
39
|
+
|
|
32
40
|
if (!existsSync(configPath)) {
|
|
33
41
|
// 設定ファイルが存在しない場合は情報メッセージ(デフォルト設定を使用)
|
|
34
42
|
info.push('Project config file not found. Using default configuration.');
|
|
@@ -36,100 +44,153 @@ export function validateProjectConfig(projectRoot: string = process.cwd()): Vali
|
|
|
36
44
|
valid: true,
|
|
37
45
|
errors: [],
|
|
38
46
|
warnings: [],
|
|
39
|
-
info
|
|
47
|
+
info,
|
|
40
48
|
};
|
|
41
49
|
}
|
|
42
|
-
|
|
50
|
+
|
|
43
51
|
try {
|
|
44
52
|
const content = readFileSync(configPath, 'utf-8');
|
|
45
53
|
const parsed = JSON.parse(content);
|
|
46
|
-
|
|
54
|
+
|
|
47
55
|
// スキーマでバリデーション
|
|
48
56
|
const result = AppConfigSchema.safeParse(parsed);
|
|
49
|
-
|
|
57
|
+
|
|
50
58
|
if (!result.success) {
|
|
51
59
|
result.error.issues.forEach((error: ZodIssue) => {
|
|
52
60
|
const path = error.path.map(String).join('.');
|
|
53
61
|
errors.push(`${path}: ${error.message}`);
|
|
54
62
|
});
|
|
55
|
-
|
|
63
|
+
|
|
56
64
|
return {
|
|
57
65
|
valid: false,
|
|
58
66
|
errors,
|
|
59
67
|
warnings: [],
|
|
60
|
-
info: []
|
|
68
|
+
info: [],
|
|
61
69
|
};
|
|
62
70
|
}
|
|
63
|
-
|
|
71
|
+
|
|
64
72
|
// 追加のバリデーション
|
|
65
73
|
const config = result.data;
|
|
66
|
-
|
|
74
|
+
|
|
67
75
|
// Confluence設定のバリデーション
|
|
68
76
|
if (config.confluence) {
|
|
69
77
|
const confluence = config.confluence;
|
|
70
|
-
|
|
78
|
+
|
|
71
79
|
// hierarchy設定の整合性チェック
|
|
72
|
-
if (
|
|
80
|
+
if (
|
|
81
|
+
confluence.pageCreationGranularity === 'by-hierarchy' ||
|
|
82
|
+
confluence.pageCreationGranularity === 'manual'
|
|
83
|
+
) {
|
|
73
84
|
if (!confluence.hierarchy) {
|
|
74
|
-
errors.push(
|
|
85
|
+
errors.push(
|
|
86
|
+
'confluence.hierarchy is required when pageCreationGranularity is "by-hierarchy" or "manual"',
|
|
87
|
+
);
|
|
75
88
|
} else {
|
|
76
|
-
if (
|
|
77
|
-
|
|
89
|
+
if (
|
|
90
|
+
confluence.pageCreationGranularity === 'by-hierarchy' &&
|
|
91
|
+
!confluence.hierarchy.parentPageTitle
|
|
92
|
+
) {
|
|
93
|
+
warnings.push(
|
|
94
|
+
'confluence.hierarchy.parentPageTitle is recommended for "by-hierarchy" mode',
|
|
95
|
+
);
|
|
78
96
|
}
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
|
|
97
|
+
|
|
98
|
+
if (
|
|
99
|
+
confluence.pageCreationGranularity === 'manual' &&
|
|
100
|
+
!confluence.hierarchy.structure
|
|
101
|
+
) {
|
|
102
|
+
errors.push(
|
|
103
|
+
'confluence.hierarchy.structure is required when pageCreationGranularity is "manual"',
|
|
104
|
+
);
|
|
82
105
|
}
|
|
83
106
|
}
|
|
84
107
|
}
|
|
85
108
|
}
|
|
86
|
-
|
|
109
|
+
|
|
87
110
|
// JIRA設定のバリデーション
|
|
88
111
|
if (config.jira) {
|
|
89
112
|
const jira = config.jira;
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
|
|
113
|
+
|
|
114
|
+
if (
|
|
115
|
+
jira.storyCreationGranularity === 'selected-phases' &&
|
|
116
|
+
!jira.selectedPhases
|
|
117
|
+
) {
|
|
118
|
+
errors.push(
|
|
119
|
+
'jira.selectedPhases is required when storyCreationGranularity is "selected-phases"',
|
|
120
|
+
);
|
|
93
121
|
}
|
|
94
|
-
|
|
122
|
+
|
|
95
123
|
if (jira.selectedPhases && jira.selectedPhases.length === 0) {
|
|
96
|
-
warnings.push(
|
|
124
|
+
warnings.push(
|
|
125
|
+
'jira.selectedPhases is empty. No stories will be created.',
|
|
126
|
+
);
|
|
97
127
|
}
|
|
98
128
|
}
|
|
99
|
-
|
|
129
|
+
|
|
100
130
|
// ワークフロー設定のバリデーション
|
|
101
131
|
if (config.workflow) {
|
|
102
132
|
const workflow = config.workflow;
|
|
103
|
-
|
|
133
|
+
|
|
104
134
|
if (workflow.enabledPhases && workflow.enabledPhases.length === 0) {
|
|
105
|
-
warnings.push(
|
|
135
|
+
warnings.push(
|
|
136
|
+
'workflow.enabledPhases is empty. No phases will be executed.',
|
|
137
|
+
);
|
|
106
138
|
}
|
|
107
|
-
|
|
108
|
-
const validPhases = [
|
|
109
|
-
|
|
139
|
+
|
|
140
|
+
const validPhases = [
|
|
141
|
+
// 新ワークフロー構造
|
|
142
|
+
'spec-init', // Phase 0.0: プロジェクト初期化
|
|
143
|
+
'requirements', // Phase 0.1: 要件定義
|
|
144
|
+
'design', // Phase 0.2: 設計
|
|
145
|
+
'test-type-selection', // Phase 0.3: テストタイプ選択
|
|
146
|
+
'test-spec', // Phase 0.4: テスト仕様書作成
|
|
147
|
+
'tasks', // Phase 0.5: タスク分割
|
|
148
|
+
'spec-tasks', // Phase 0.5: タスク分割(別名)
|
|
149
|
+
'jira-sync', // Phase 0.6: JIRA同期
|
|
150
|
+
'environment-setup', // Phase 1: 環境構築
|
|
151
|
+
'implementation', // Phase 2: TDD実装
|
|
152
|
+
'tdd-implementation', // Phase 2: TDD実装(別名)
|
|
153
|
+
'phase-a', // Phase A: PR前自動テスト
|
|
154
|
+
'pr-tests', // Phase A: PR前自動テスト(別名)
|
|
155
|
+
'additional-qa', // Phase 3: 追加QA
|
|
156
|
+
'testing', // Phase 3: 追加QA(別名)
|
|
157
|
+
'phase-b', // Phase B: リリース準備テスト
|
|
158
|
+
'release-tests', // Phase B: リリース準備テスト(別名)
|
|
159
|
+
'release-prep', // Phase 4: リリース準備
|
|
160
|
+
'release-preparation', // Phase 4: リリース準備(別名)
|
|
161
|
+
'release', // Phase 5: リリース
|
|
162
|
+
];
|
|
163
|
+
const invalidPhases = workflow.enabledPhases?.filter(
|
|
164
|
+
(phase) => !validPhases.includes(phase),
|
|
165
|
+
);
|
|
110
166
|
if (invalidPhases && invalidPhases.length > 0) {
|
|
111
|
-
warnings.push(
|
|
167
|
+
warnings.push(
|
|
168
|
+
`Unknown phases in workflow.enabledPhases: ${invalidPhases.join(', ')}\n` +
|
|
169
|
+
'See: docs/user-guide/guides/workflow.md for valid phase names',
|
|
170
|
+
);
|
|
112
171
|
}
|
|
113
172
|
}
|
|
114
|
-
|
|
173
|
+
|
|
115
174
|
return {
|
|
116
175
|
valid: errors.length === 0,
|
|
117
176
|
errors,
|
|
118
177
|
warnings,
|
|
119
|
-
info: []
|
|
178
|
+
info: [],
|
|
120
179
|
};
|
|
121
180
|
} catch (error) {
|
|
122
181
|
if (error instanceof SyntaxError) {
|
|
123
182
|
errors.push(`Invalid JSON: ${error.message}`);
|
|
124
183
|
} else {
|
|
125
|
-
errors.push(
|
|
184
|
+
errors.push(
|
|
185
|
+
`Error reading config file: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
186
|
+
);
|
|
126
187
|
}
|
|
127
|
-
|
|
188
|
+
|
|
128
189
|
return {
|
|
129
190
|
valid: false,
|
|
130
191
|
errors,
|
|
131
192
|
warnings: [],
|
|
132
|
-
info: []
|
|
193
|
+
info: [],
|
|
133
194
|
};
|
|
134
195
|
}
|
|
135
196
|
}
|
|
@@ -137,35 +198,37 @@ export function validateProjectConfig(projectRoot: string = process.cwd()): Vali
|
|
|
137
198
|
/**
|
|
138
199
|
* 設定ファイルのバリデーションを実行して結果を表示
|
|
139
200
|
*/
|
|
140
|
-
export function validateAndReport(
|
|
201
|
+
export function validateAndReport(
|
|
202
|
+
projectRoot: string = process.cwd(),
|
|
203
|
+
): boolean {
|
|
141
204
|
const result = validateProjectConfig(projectRoot);
|
|
142
|
-
|
|
205
|
+
|
|
143
206
|
if (result.info.length > 0) {
|
|
144
207
|
console.log('ℹ️ Info:');
|
|
145
|
-
result.info.forEach(message => {
|
|
208
|
+
result.info.forEach((message) => {
|
|
146
209
|
console.log(` - ${message}`);
|
|
147
210
|
});
|
|
148
211
|
}
|
|
149
|
-
|
|
212
|
+
|
|
150
213
|
if (result.warnings.length > 0) {
|
|
151
214
|
console.log('⚠️ Warnings:');
|
|
152
|
-
result.warnings.forEach(warning => {
|
|
215
|
+
result.warnings.forEach((warning) => {
|
|
153
216
|
console.log(` - ${warning}`);
|
|
154
217
|
});
|
|
155
218
|
}
|
|
156
|
-
|
|
219
|
+
|
|
157
220
|
if (result.errors.length > 0) {
|
|
158
221
|
console.error('❌ Validation errors:');
|
|
159
|
-
result.errors.forEach(error => {
|
|
222
|
+
result.errors.forEach((error) => {
|
|
160
223
|
console.error(` - ${error}`);
|
|
161
224
|
});
|
|
162
225
|
return false;
|
|
163
226
|
}
|
|
164
|
-
|
|
227
|
+
|
|
165
228
|
if (result.valid) {
|
|
166
229
|
console.log('✅ Configuration is valid');
|
|
167
230
|
}
|
|
168
|
-
|
|
231
|
+
|
|
169
232
|
return result.valid;
|
|
170
233
|
}
|
|
171
234
|
|
|
@@ -177,172 +240,296 @@ export function validateAndReport(projectRoot: string = process.cwd()): boolean
|
|
|
177
240
|
*/
|
|
178
241
|
export function validateForConfluenceSync(
|
|
179
242
|
docType: 'requirements' | 'design' | 'tasks',
|
|
180
|
-
projectRoot: string = process.cwd()
|
|
243
|
+
projectRoot: string = process.cwd(),
|
|
181
244
|
): ValidationResult {
|
|
182
245
|
const errors: string[] = [];
|
|
183
246
|
const warnings: string[] = [];
|
|
184
247
|
const info: string[] = [];
|
|
185
|
-
|
|
248
|
+
|
|
186
249
|
const config = getConfig(projectRoot);
|
|
187
|
-
|
|
188
|
-
|
|
250
|
+
|
|
189
251
|
// Confluence設定のチェック
|
|
190
252
|
if (!config.confluence) {
|
|
191
253
|
warnings.push('confluence設定がありません。デフォルト設定を使用します。');
|
|
192
254
|
} else {
|
|
193
255
|
const confluence = config.confluence;
|
|
194
|
-
|
|
256
|
+
|
|
195
257
|
// spaces設定のチェック
|
|
196
258
|
if (!confluence.spaces || !confluence.spaces[docType]) {
|
|
197
259
|
if (!process.env.CONFLUENCE_PRD_SPACE) {
|
|
198
260
|
warnings.push(
|
|
199
261
|
`confluence.spaces.${docType}が設定されていません。` +
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
262
|
+
'環境変数CONFLUENCE_PRD_SPACEも設定されていないため、デフォルト値(PRD)を使用します。' +
|
|
263
|
+
'\n 推奨: .michi/config.jsonに以下を追加してください:\n' +
|
|
264
|
+
' {\n' +
|
|
265
|
+
' "confluence": {\n' +
|
|
266
|
+
' "spaces": {\n' +
|
|
267
|
+
` "${docType}": "YOUR_SPACE_KEY"\n` +
|
|
268
|
+
' }\n' +
|
|
269
|
+
' }\n' +
|
|
270
|
+
' }',
|
|
209
271
|
);
|
|
210
272
|
} else {
|
|
211
|
-
info.push(
|
|
273
|
+
info.push(
|
|
274
|
+
`confluence.spaces.${docType}が設定されていませんが、環境変数CONFLUENCE_PRD_SPACE(${process.env.CONFLUENCE_PRD_SPACE})を使用します。`,
|
|
275
|
+
);
|
|
212
276
|
}
|
|
213
277
|
}
|
|
214
|
-
|
|
278
|
+
|
|
215
279
|
// hierarchy設定のチェック(by-hierarchyモードの場合)
|
|
216
|
-
if (
|
|
280
|
+
if (
|
|
281
|
+
confluence.pageCreationGranularity === 'by-hierarchy' ||
|
|
282
|
+
confluence.pageCreationGranularity === 'manual'
|
|
283
|
+
) {
|
|
217
284
|
if (!confluence.hierarchy) {
|
|
218
285
|
errors.push(
|
|
219
286
|
'confluence.hierarchyが設定されていません。' +
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
287
|
+
`pageCreationGranularityが"${confluence.pageCreationGranularity}"の場合、hierarchy設定が必須です。` +
|
|
288
|
+
'\n 解決方法: .michi/config.jsonに以下を追加してください:\n' +
|
|
289
|
+
' {\n' +
|
|
290
|
+
' "confluence": {\n' +
|
|
291
|
+
' "hierarchy": {\n' +
|
|
292
|
+
' "mode": "simple",\n' +
|
|
293
|
+
' "parentPageTitle": "[{projectName}] {featureName}"\n' +
|
|
294
|
+
' }\n' +
|
|
295
|
+
' }\n' +
|
|
296
|
+
' }',
|
|
230
297
|
);
|
|
231
|
-
} else if (
|
|
298
|
+
} else if (
|
|
299
|
+
confluence.pageCreationGranularity === 'by-hierarchy' &&
|
|
300
|
+
confluence.hierarchy &&
|
|
301
|
+
!confluence.hierarchy.parentPageTitle
|
|
302
|
+
) {
|
|
232
303
|
warnings.push(
|
|
233
304
|
'confluence.hierarchy.parentPageTitleが設定されていません。' +
|
|
234
|
-
|
|
305
|
+
'by-hierarchyモードでは推奨されます。',
|
|
235
306
|
);
|
|
236
307
|
}
|
|
237
|
-
|
|
238
|
-
if (
|
|
308
|
+
|
|
309
|
+
if (
|
|
310
|
+
confluence.pageCreationGranularity === 'manual' &&
|
|
311
|
+
confluence.hierarchy &&
|
|
312
|
+
!confluence.hierarchy.structure
|
|
313
|
+
) {
|
|
239
314
|
errors.push(
|
|
240
315
|
'confluence.hierarchy.structureが設定されていません。' +
|
|
241
|
-
|
|
316
|
+
'pageCreationGranularityが"manual"の場合、structure設定が必須です。',
|
|
242
317
|
);
|
|
243
318
|
}
|
|
244
319
|
}
|
|
245
320
|
}
|
|
246
|
-
|
|
321
|
+
|
|
247
322
|
return {
|
|
248
323
|
valid: errors.length === 0,
|
|
249
324
|
errors,
|
|
250
325
|
warnings,
|
|
251
|
-
info
|
|
326
|
+
info,
|
|
252
327
|
};
|
|
253
328
|
}
|
|
254
329
|
|
|
255
330
|
/**
|
|
256
|
-
* JIRA
|
|
331
|
+
* JIRA同期実行前の必須設定値チェック(同期版)
|
|
257
332
|
* @param projectRoot プロジェクトルート(デフォルト: process.cwd())
|
|
258
333
|
* @returns バリデーション結果
|
|
259
334
|
*/
|
|
260
|
-
export function validateForJiraSync(
|
|
335
|
+
export function validateForJiraSync(
|
|
336
|
+
projectRoot: string = process.cwd(),
|
|
337
|
+
): ValidationResult {
|
|
261
338
|
const errors: string[] = [];
|
|
262
339
|
const warnings: string[] = [];
|
|
263
340
|
const info: string[] = [];
|
|
264
|
-
|
|
341
|
+
|
|
265
342
|
const config = getConfig(projectRoot);
|
|
266
|
-
|
|
267
|
-
|
|
343
|
+
|
|
268
344
|
// JIRA設定のチェック
|
|
269
345
|
if (!config.jira) {
|
|
270
346
|
warnings.push('jira設定がありません。デフォルト設定を使用します。');
|
|
271
347
|
} else {
|
|
272
348
|
const jira = config.jira;
|
|
273
|
-
|
|
349
|
+
|
|
274
350
|
// issueTypes設定のチェック
|
|
275
351
|
if (!jira.issueTypes) {
|
|
276
352
|
if (!process.env.JIRA_ISSUE_TYPE_STORY) {
|
|
277
353
|
errors.push(
|
|
278
354
|
'jira.issueTypes.storyが設定されていません。' +
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
355
|
+
'環境変数JIRA_ISSUE_TYPE_STORYも設定されていないため、JIRA同期を実行できません。' +
|
|
356
|
+
'\n 解決方法1: 環境変数を設定:\n' +
|
|
357
|
+
' export JIRA_ISSUE_TYPE_STORY=10036 # JIRAインスタンス固有のID\n' +
|
|
358
|
+
'\n 解決方法2: .michi/config.jsonに以下を追加:\n' +
|
|
359
|
+
' {\n' +
|
|
360
|
+
' "jira": {\n' +
|
|
361
|
+
' "issueTypes": {\n' +
|
|
362
|
+
' "story": "10036",\n' +
|
|
363
|
+
' "subtask": "10037"\n' +
|
|
364
|
+
' }\n' +
|
|
365
|
+
' }\n' +
|
|
366
|
+
' }' +
|
|
367
|
+
'\n 確認方法: JIRA管理画面(Settings > Issues > Issue types)またはREST API: GET /rest/api/3/issuetype',
|
|
292
368
|
);
|
|
293
369
|
} else {
|
|
294
|
-
info.push(
|
|
370
|
+
info.push(
|
|
371
|
+
`jira.issueTypes.storyが設定されていませんが、環境変数JIRA_ISSUE_TYPE_STORY(${process.env.JIRA_ISSUE_TYPE_STORY})を使用します。`,
|
|
372
|
+
);
|
|
295
373
|
}
|
|
296
374
|
} else {
|
|
297
375
|
if (!jira.issueTypes.story) {
|
|
298
376
|
if (!process.env.JIRA_ISSUE_TYPE_STORY) {
|
|
299
377
|
errors.push(
|
|
300
378
|
'jira.issueTypes.storyが設定されていません。' +
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
379
|
+
'環境変数JIRA_ISSUE_TYPE_STORYも設定されていないため、JIRA同期を実行できません。' +
|
|
380
|
+
'\n 解決方法: .michi/config.jsonのjira.issueTypes.storyに値を設定するか、' +
|
|
381
|
+
'環境変数JIRA_ISSUE_TYPE_STORYを設定してください。',
|
|
304
382
|
);
|
|
305
383
|
} else {
|
|
306
|
-
info.push(
|
|
384
|
+
info.push(
|
|
385
|
+
`jira.issueTypes.storyが設定されていませんが、環境変数JIRA_ISSUE_TYPE_STORY(${process.env.JIRA_ISSUE_TYPE_STORY})を使用します。`,
|
|
386
|
+
);
|
|
307
387
|
}
|
|
308
388
|
}
|
|
309
|
-
|
|
389
|
+
|
|
310
390
|
if (!jira.issueTypes.subtask) {
|
|
311
391
|
if (!process.env.JIRA_ISSUE_TYPE_SUBTASK) {
|
|
312
392
|
warnings.push(
|
|
313
393
|
'jira.issueTypes.subtaskが設定されていません。' +
|
|
314
|
-
|
|
394
|
+
'環境変数JIRA_ISSUE_TYPE_SUBTASKも設定されていないため、サブタスクは作成されません。',
|
|
315
395
|
);
|
|
316
396
|
} else {
|
|
317
|
-
info.push(
|
|
397
|
+
info.push(
|
|
398
|
+
`jira.issueTypes.subtaskが設定されていませんが、環境変数JIRA_ISSUE_TYPE_SUBTASK(${process.env.JIRA_ISSUE_TYPE_SUBTASK})を使用します。`,
|
|
399
|
+
);
|
|
318
400
|
}
|
|
319
401
|
}
|
|
320
402
|
}
|
|
321
|
-
|
|
403
|
+
|
|
322
404
|
// selectedPhases設定のチェック
|
|
323
|
-
if (
|
|
405
|
+
if (
|
|
406
|
+
jira.storyCreationGranularity === 'selected-phases' &&
|
|
407
|
+
!jira.selectedPhases
|
|
408
|
+
) {
|
|
324
409
|
errors.push(
|
|
325
410
|
'jira.selectedPhasesが設定されていません。' +
|
|
326
|
-
|
|
411
|
+
'storyCreationGranularityが"selected-phases"の場合、selectedPhases設定が必須です。',
|
|
327
412
|
);
|
|
328
413
|
}
|
|
329
|
-
|
|
414
|
+
|
|
330
415
|
if (jira.selectedPhases && jira.selectedPhases.length === 0) {
|
|
331
|
-
warnings.push(
|
|
416
|
+
warnings.push(
|
|
417
|
+
'jira.selectedPhasesが空です。ストーリーは作成されません。',
|
|
418
|
+
);
|
|
332
419
|
}
|
|
333
420
|
}
|
|
334
|
-
|
|
421
|
+
|
|
335
422
|
return {
|
|
336
423
|
valid: errors.length === 0,
|
|
337
424
|
errors,
|
|
338
425
|
warnings,
|
|
339
|
-
info
|
|
426
|
+
info,
|
|
340
427
|
};
|
|
341
428
|
}
|
|
342
429
|
|
|
430
|
+
/**
|
|
431
|
+
* JIRA同期実行前の必須設定値チェック(非同期版・Issue Type IDの存在チェック付き)
|
|
432
|
+
* @param projectRoot プロジェクトルート(デフォルト: process.cwd())
|
|
433
|
+
* @returns バリデーション結果
|
|
434
|
+
*/
|
|
435
|
+
export async function validateForJiraSyncAsync(
|
|
436
|
+
projectRoot: string = process.cwd(),
|
|
437
|
+
): Promise<ValidationResult> {
|
|
438
|
+
// まず同期版のバリデーションを実行
|
|
439
|
+
const result = validateForJiraSync(projectRoot);
|
|
440
|
+
|
|
441
|
+
// JIRA認証情報とプロジェクトキーが設定されている場合、Issue Type IDの存在チェックを実行
|
|
442
|
+
if (hasJiraCredentials()) {
|
|
443
|
+
try {
|
|
444
|
+
const projectMeta = loadProjectMeta(projectRoot);
|
|
445
|
+
const projectKey = projectMeta.jiraProjectKey;
|
|
446
|
+
|
|
447
|
+
if (projectKey) {
|
|
448
|
+
const config = getConfig(projectRoot);
|
|
449
|
+
const storyId =
|
|
450
|
+
config.jira?.issueTypes?.story || process.env.JIRA_ISSUE_TYPE_STORY;
|
|
451
|
+
const subtaskId =
|
|
452
|
+
config.jira?.issueTypes?.subtask ||
|
|
453
|
+
process.env.JIRA_ISSUE_TYPE_SUBTASK;
|
|
454
|
+
|
|
455
|
+
// Issue Typesを取得
|
|
456
|
+
const issueTypes = await getProjectIssueTypes(projectKey);
|
|
457
|
+
|
|
458
|
+
if (issueTypes && issueTypes.length > 0) {
|
|
459
|
+
// Story Issue Type IDの存在チェック
|
|
460
|
+
if (storyId) {
|
|
461
|
+
if (!hasIssueTypeId(issueTypes, storyId)) {
|
|
462
|
+
const storyTypes = filterStoryTypes(issueTypes);
|
|
463
|
+
const suggestions =
|
|
464
|
+
storyTypes.length > 0
|
|
465
|
+
? storyTypes
|
|
466
|
+
.map((it) => ` - ${it.name} (ID: ${it.id})`)
|
|
467
|
+
.join('\n')
|
|
468
|
+
: ' (Storyタイプが見つかりませんでした)';
|
|
469
|
+
|
|
470
|
+
result.errors.push(
|
|
471
|
+
`設定されたStory Issue Type ID (${storyId}) がプロジェクト '${projectKey}' に存在しません。\n` +
|
|
472
|
+
'\n利用可能なStoryタイプ:\n' +
|
|
473
|
+
suggestions +
|
|
474
|
+
'\n\n修正方法:\n' +
|
|
475
|
+
' 1. .envファイルを編集:\n' +
|
|
476
|
+
' JIRA_ISSUE_TYPE_STORY=<正しいID>\n' +
|
|
477
|
+
'\n' +
|
|
478
|
+
' 2. または、対話的設定を再実行:\n' +
|
|
479
|
+
' npm run setup:interactive',
|
|
480
|
+
);
|
|
481
|
+
result.valid = false;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Subtask Issue Type IDの存在チェック
|
|
486
|
+
if (subtaskId) {
|
|
487
|
+
if (!hasIssueTypeId(issueTypes, subtaskId)) {
|
|
488
|
+
const subtaskTypes = filterSubtaskTypes(issueTypes);
|
|
489
|
+
const suggestions =
|
|
490
|
+
subtaskTypes.length > 0
|
|
491
|
+
? subtaskTypes
|
|
492
|
+
.map((it) => ` - ${it.name} (ID: ${it.id})`)
|
|
493
|
+
.join('\n')
|
|
494
|
+
: ' (Subtaskタイプが見つかりませんでした)';
|
|
495
|
+
|
|
496
|
+
result.warnings.push(
|
|
497
|
+
`設定されたSubtask Issue Type ID (${subtaskId}) がプロジェクト '${projectKey}' に存在しません。\n` +
|
|
498
|
+
'\n利用可能なSubtaskタイプ:\n' +
|
|
499
|
+
suggestions +
|
|
500
|
+
'\n\n修正方法:\n' +
|
|
501
|
+
' 1. .envファイルを編集:\n' +
|
|
502
|
+
' JIRA_ISSUE_TYPE_SUBTASK=<正しいID>\n' +
|
|
503
|
+
'\n' +
|
|
504
|
+
' 2. または、対話的設定を再実行:\n' +
|
|
505
|
+
' npm run setup:interactive',
|
|
506
|
+
);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
} else {
|
|
510
|
+
// Issue Types取得に失敗した場合(認証エラー、ネットワークエラーなど)
|
|
511
|
+
// エラーにはしないが、警告として記録
|
|
512
|
+
result.warnings.push(
|
|
513
|
+
`JIRAプロジェクト '${projectKey}' のIssue Typesを取得できませんでした。` +
|
|
514
|
+
'設定されたIssue Type IDの存在確認をスキップします。',
|
|
515
|
+
);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
} catch (error) {
|
|
519
|
+
// プロジェクトメタデータの読み込みに失敗した場合など
|
|
520
|
+
// エラーにはしないが、警告として記録
|
|
521
|
+
result.warnings.push(
|
|
522
|
+
`プロジェクトメタデータの読み込みに失敗しました: ${error instanceof Error ? error.message : error}` +
|
|
523
|
+
'設定されたIssue Type IDの存在確認をスキップします。',
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
return result;
|
|
529
|
+
}
|
|
530
|
+
|
|
343
531
|
// CLI実行
|
|
344
532
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
345
533
|
const valid = validateAndReport();
|
|
346
534
|
process.exit(valid ? 0 : 1);
|
|
347
535
|
}
|
|
348
|
-
|