@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
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* setup-existing command
|
|
3
|
+
* 既存プロジェクトにMichiワークフローを追加するコマンド
|
|
4
|
+
*
|
|
5
|
+
* 使い方:
|
|
6
|
+
* npx @sk8metal/michi-cli setup-existing --cursor --lang ja
|
|
7
|
+
* npm run michi:setup:cursor
|
|
8
|
+
*/
|
|
9
|
+
import { cpSync, existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, chmodSync, } from 'fs';
|
|
10
|
+
import { join, basename, dirname } from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
import { execSync } from 'child_process';
|
|
13
|
+
import { findRepositoryRoot } from '../../scripts/utils/project-finder.js';
|
|
14
|
+
import { getEnvironmentConfig, } from '../../scripts/constants/environments.js';
|
|
15
|
+
import { isSupportedLanguage, } from '../../scripts/constants/languages.js';
|
|
16
|
+
import { createTemplateContext, renderTemplate, } from '../../scripts/template/renderer.js';
|
|
17
|
+
import * as readline from 'readline';
|
|
18
|
+
// ES module で __dirname を取得
|
|
19
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
+
const __dirname = dirname(__filename);
|
|
21
|
+
/**
|
|
22
|
+
* プロジェクト名のバリデーション
|
|
23
|
+
*/
|
|
24
|
+
function validateProjectName(name) {
|
|
25
|
+
const trimmed = name.trim();
|
|
26
|
+
// 長さチェック
|
|
27
|
+
if (!trimmed || trimmed.length === 0) {
|
|
28
|
+
throw new Error('プロジェクト名が空です');
|
|
29
|
+
}
|
|
30
|
+
if (trimmed.length > 100) {
|
|
31
|
+
throw new Error('プロジェクト名が長すぎます(最大100文字)');
|
|
32
|
+
}
|
|
33
|
+
// パストラバーサル対策
|
|
34
|
+
if (/[/\\]/.test(trimmed)) {
|
|
35
|
+
throw new Error('プロジェクト名にパス区切り文字(/ または \\)は使用できません');
|
|
36
|
+
}
|
|
37
|
+
// 相対パス攻撃対策
|
|
38
|
+
if (/^\.\.?$|^\.\.?\//.test(trimmed)) {
|
|
39
|
+
throw new Error('プロジェクト名に相対パス(. または ..)は使用できません');
|
|
40
|
+
}
|
|
41
|
+
// 制御文字対策
|
|
42
|
+
// eslint-disable-next-line no-control-regex
|
|
43
|
+
if (/[\x00-\x1F\x7F]/.test(trimmed)) {
|
|
44
|
+
throw new Error('プロジェクト名に制御文字は使用できません');
|
|
45
|
+
}
|
|
46
|
+
return trimmed;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* JIRAキーのバリデーション
|
|
50
|
+
*/
|
|
51
|
+
function validateJiraKey(key) {
|
|
52
|
+
const trimmed = key.trim().toUpperCase();
|
|
53
|
+
// JIRAキー形式: 2-10文字の大文字英字
|
|
54
|
+
if (!/^[A-Z]{2,10}$/.test(trimmed)) {
|
|
55
|
+
throw new Error('JIRAキーの形式が不正です(2-10文字の大文字英字のみ、例: PRJA)');
|
|
56
|
+
}
|
|
57
|
+
return trimmed;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 対話的にユーザー入力を取得
|
|
61
|
+
*/
|
|
62
|
+
async function prompt(question) {
|
|
63
|
+
const rl = readline.createInterface({
|
|
64
|
+
input: process.stdin,
|
|
65
|
+
output: process.stdout,
|
|
66
|
+
});
|
|
67
|
+
try {
|
|
68
|
+
return await new Promise((resolve) => {
|
|
69
|
+
rl.question(question, (answer) => {
|
|
70
|
+
resolve(answer.trim());
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
rl.close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 環境を決定(オプションまたは対話的)
|
|
80
|
+
*/
|
|
81
|
+
async function determineEnvironment(options) {
|
|
82
|
+
if (options.cursor)
|
|
83
|
+
return 'cursor';
|
|
84
|
+
if (options.claude)
|
|
85
|
+
return 'claude';
|
|
86
|
+
if (options.claudeAgent)
|
|
87
|
+
return 'claude-agent';
|
|
88
|
+
if (options.gemini)
|
|
89
|
+
return 'gemini';
|
|
90
|
+
if (options.codex)
|
|
91
|
+
return 'codex';
|
|
92
|
+
if (options.cline)
|
|
93
|
+
return 'cline';
|
|
94
|
+
console.log('');
|
|
95
|
+
console.log('環境を選択してください:');
|
|
96
|
+
console.log(' 1) Cursor IDE (推奨)');
|
|
97
|
+
console.log(' 2) Claude Code');
|
|
98
|
+
console.log(' 3) Claude Code Subagents');
|
|
99
|
+
console.log(' 4) Gemini CLI');
|
|
100
|
+
console.log(' 5) Codex CLI');
|
|
101
|
+
console.log(' 6) Cline');
|
|
102
|
+
console.log('');
|
|
103
|
+
const choice = await prompt('選択 [1-6] (デフォルト: 1): ');
|
|
104
|
+
switch (choice || '1') {
|
|
105
|
+
case '1':
|
|
106
|
+
return 'cursor';
|
|
107
|
+
case '2':
|
|
108
|
+
return 'claude';
|
|
109
|
+
case '3':
|
|
110
|
+
return 'claude-agent';
|
|
111
|
+
case '4':
|
|
112
|
+
return 'gemini';
|
|
113
|
+
case '5':
|
|
114
|
+
return 'codex';
|
|
115
|
+
case '6':
|
|
116
|
+
return 'cline';
|
|
117
|
+
default:
|
|
118
|
+
console.log('無効な選択です。Cursor IDEを使用します。');
|
|
119
|
+
return 'cursor';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* オプションから設定を構築(対話的プロンプトを含む)
|
|
124
|
+
*/
|
|
125
|
+
async function buildConfig(options) {
|
|
126
|
+
// 環境を決定
|
|
127
|
+
const environment = await determineEnvironment(options);
|
|
128
|
+
// 言語コード
|
|
129
|
+
const langCode = (options.lang || 'ja');
|
|
130
|
+
if (!isSupportedLanguage(langCode)) {
|
|
131
|
+
throw new Error(`Unsupported language: ${langCode}`);
|
|
132
|
+
}
|
|
133
|
+
// プロジェクト名(対話的プロンプト)
|
|
134
|
+
let projectName = options.projectName;
|
|
135
|
+
if (projectName === undefined) {
|
|
136
|
+
console.log('');
|
|
137
|
+
projectName = await prompt('プロジェクト名(例: プロジェクトA): ');
|
|
138
|
+
}
|
|
139
|
+
// バリデーション
|
|
140
|
+
projectName = validateProjectName(projectName || '');
|
|
141
|
+
// JIRAキー(対話的プロンプト)
|
|
142
|
+
let jiraKey = options.jiraKey;
|
|
143
|
+
if (jiraKey === undefined) {
|
|
144
|
+
jiraKey = await prompt('JIRAプロジェクトキー(例: PRJA): ');
|
|
145
|
+
}
|
|
146
|
+
// バリデーション
|
|
147
|
+
jiraKey = validateJiraKey(jiraKey || '');
|
|
148
|
+
// 確認
|
|
149
|
+
console.log('');
|
|
150
|
+
console.log('✅ 設定:');
|
|
151
|
+
console.log(` プロジェクト名: ${projectName}`);
|
|
152
|
+
console.log(` JIRA: ${jiraKey}`);
|
|
153
|
+
console.log(` 環境: ${environment}`);
|
|
154
|
+
console.log(` 言語: ${langCode}`);
|
|
155
|
+
console.log('');
|
|
156
|
+
const confirm = await prompt('この設定で続行しますか? [Y/n]: ');
|
|
157
|
+
if (confirm.toLowerCase() === 'n') {
|
|
158
|
+
throw new Error('ユーザーによりキャンセルされました');
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
projectName,
|
|
162
|
+
jiraKey,
|
|
163
|
+
environment,
|
|
164
|
+
langCode,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* テンプレートディレクトリのパスを解決
|
|
169
|
+
*/
|
|
170
|
+
function resolveTemplatesDir() {
|
|
171
|
+
const candidates = [
|
|
172
|
+
{
|
|
173
|
+
path: join(__dirname, '..', '..', '..', 'templates'),
|
|
174
|
+
description: 'Production (compiled)',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
path: join(__dirname, '..', '..', 'templates'),
|
|
178
|
+
description: 'Development (source)',
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
for (const candidate of candidates) {
|
|
182
|
+
if (existsSync(candidate.path)) {
|
|
183
|
+
if (process.env.DEBUG) {
|
|
184
|
+
console.log(`📋 Template path resolved: ${candidate.path} (${candidate.description})`);
|
|
185
|
+
}
|
|
186
|
+
return candidate.path;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// エラー時は試行したパスを表示
|
|
190
|
+
const triedPaths = candidates
|
|
191
|
+
.map((c) => ` - ${c.path} (${c.description})`)
|
|
192
|
+
.join('\n');
|
|
193
|
+
throw new Error(`Templates directory not found. Tried:\n${triedPaths}`);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* テンプレートをコピーしてレンダリング
|
|
197
|
+
*/
|
|
198
|
+
function copyAndRenderTemplates(sourceDir, destDir, context) {
|
|
199
|
+
const entries = readdirSync(sourceDir, { withFileTypes: true });
|
|
200
|
+
for (const entry of entries) {
|
|
201
|
+
const sourcePath = join(sourceDir, entry.name);
|
|
202
|
+
const destPath = join(destDir, entry.name);
|
|
203
|
+
if (entry.isDirectory()) {
|
|
204
|
+
mkdirSync(destPath, { recursive: true });
|
|
205
|
+
copyAndRenderTemplates(sourcePath, destPath, context);
|
|
206
|
+
}
|
|
207
|
+
else if (entry.isFile()) {
|
|
208
|
+
const content = readFileSync(sourcePath, 'utf-8');
|
|
209
|
+
const rendered = renderTemplate(content, context);
|
|
210
|
+
writeFileSync(destPath, rendered, 'utf-8');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* setup-existing コマンドのメイン処理
|
|
216
|
+
*/
|
|
217
|
+
export async function setupExisting(options) {
|
|
218
|
+
console.log('🚀 既存プロジェクトにMichiワークフローを追加');
|
|
219
|
+
console.log('');
|
|
220
|
+
// 設定を構築(対話的プロンプトを含む)
|
|
221
|
+
const config = await buildConfig(options);
|
|
222
|
+
const currentDir = process.cwd();
|
|
223
|
+
const projectId = basename(currentDir);
|
|
224
|
+
console.log(`📁 現在のディレクトリ: ${currentDir}`);
|
|
225
|
+
console.log(`📦 プロジェクトID: ${projectId}`);
|
|
226
|
+
console.log('');
|
|
227
|
+
// リポジトリルートを検出
|
|
228
|
+
const repoRoot = findRepositoryRoot(currentDir);
|
|
229
|
+
console.log(`📁 リポジトリルート: ${repoRoot}`);
|
|
230
|
+
// repoRootの安全性を検証
|
|
231
|
+
if (!repoRoot || !existsSync(repoRoot)) {
|
|
232
|
+
throw new Error('リポジトリルートが見つかりません');
|
|
233
|
+
}
|
|
234
|
+
const gitDir = join(repoRoot, '.git');
|
|
235
|
+
if (!existsSync(gitDir)) {
|
|
236
|
+
console.warn('⚠️ Warning: Not a Git repository');
|
|
237
|
+
console.warn(` Directory: ${repoRoot}`);
|
|
238
|
+
console.warn(' Recommendation: Run "git init" to initialize a repository');
|
|
239
|
+
console.warn(' Continuing without Git...');
|
|
240
|
+
console.log('');
|
|
241
|
+
}
|
|
242
|
+
// テンプレートディレクトリを解決
|
|
243
|
+
const templatesDir = resolveTemplatesDir();
|
|
244
|
+
console.log(`📋 テンプレート: ${templatesDir}`);
|
|
245
|
+
console.log('');
|
|
246
|
+
// .kiro ディレクトリ作成
|
|
247
|
+
console.log('📁 Step 1: Creating .kiro directory structure...');
|
|
248
|
+
mkdirSync('.kiro/settings/templates', { recursive: true });
|
|
249
|
+
mkdirSync('.kiro/steering', { recursive: true });
|
|
250
|
+
mkdirSync('.kiro/specs', { recursive: true });
|
|
251
|
+
console.log(' ✅ Directory structure created');
|
|
252
|
+
// プロジェクトメタデータ作成
|
|
253
|
+
console.log('\n📝 Step 2: Creating project metadata...');
|
|
254
|
+
// GitHub URLを取得
|
|
255
|
+
let repoUrl = '';
|
|
256
|
+
try {
|
|
257
|
+
repoUrl = execSync('git config --get remote.origin.url', {
|
|
258
|
+
encoding: 'utf-8',
|
|
259
|
+
cwd: repoRoot,
|
|
260
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
261
|
+
}).trim();
|
|
262
|
+
if (repoUrl.startsWith('git@github.com:')) {
|
|
263
|
+
repoUrl = repoUrl
|
|
264
|
+
.replace('git@github.com:', 'https://github.com/')
|
|
265
|
+
.replace('.git', '');
|
|
266
|
+
}
|
|
267
|
+
else if (repoUrl.endsWith('.git')) {
|
|
268
|
+
repoUrl = repoUrl.replace('.git', '');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
console.warn('⚠️ Warning: Could not retrieve Git remote URL');
|
|
273
|
+
console.warn(` Using placeholder: https://github.com/org/${projectId}`);
|
|
274
|
+
if (error instanceof Error && error.message) {
|
|
275
|
+
console.warn(` Reason: ${error.message}`);
|
|
276
|
+
}
|
|
277
|
+
repoUrl = `https://github.com/org/${projectId}`;
|
|
278
|
+
}
|
|
279
|
+
// Confluenceラベル生成
|
|
280
|
+
const labels = (() => {
|
|
281
|
+
const projectLabel = projectId.toLowerCase().replace(/[^a-z0-9-]/g, '');
|
|
282
|
+
const labelSet = new Set([`project:${projectLabel}`]);
|
|
283
|
+
if (projectId.includes('-')) {
|
|
284
|
+
const parts = projectId.split('-');
|
|
285
|
+
const servicePart = parts[parts.length - 1];
|
|
286
|
+
const serviceLabel = servicePart.toLowerCase().replace(/[^a-z0-9-]/g, '');
|
|
287
|
+
if (serviceLabel !== projectLabel) {
|
|
288
|
+
labelSet.add(`service:${serviceLabel}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return Array.from(labelSet);
|
|
292
|
+
})();
|
|
293
|
+
const projectJson = {
|
|
294
|
+
projectId,
|
|
295
|
+
projectName: config.projectName,
|
|
296
|
+
language: config.langCode,
|
|
297
|
+
jiraProjectKey: config.jiraKey,
|
|
298
|
+
confluenceLabels: labels,
|
|
299
|
+
status: 'active',
|
|
300
|
+
team: [],
|
|
301
|
+
stakeholders: ['@企画', '@部長'],
|
|
302
|
+
repository: repoUrl,
|
|
303
|
+
description: `${config.projectName}の開発`,
|
|
304
|
+
};
|
|
305
|
+
try {
|
|
306
|
+
writeFileSync('.kiro/project.json', JSON.stringify(projectJson, null, 2), 'utf-8');
|
|
307
|
+
console.log(' ✅ project.json created');
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
throw new Error(`Failed to write project.json: ${error instanceof Error ? error.message : error}`);
|
|
311
|
+
}
|
|
312
|
+
// Codex環境の場合: cc-sddのインストールを促す
|
|
313
|
+
if (config.environment === 'codex') {
|
|
314
|
+
console.log('\n📦 Step 3: Setting up Codex CLI integration...');
|
|
315
|
+
console.log('');
|
|
316
|
+
console.log('⚠️ Codex CLIではcc-sddのインストールが必要です:');
|
|
317
|
+
console.log('');
|
|
318
|
+
console.log(' npx cc-sdd@latest --codex --lang ja');
|
|
319
|
+
console.log('');
|
|
320
|
+
console.log('このコマンドにより以下がインストールされます:');
|
|
321
|
+
console.log(' - 11個の /kiro:* コマンド (.codex/commands/)');
|
|
322
|
+
console.log(' - AGENTS.md (.codex/docs/)');
|
|
323
|
+
console.log(' - .kiro/ ディレクトリ構造');
|
|
324
|
+
console.log('');
|
|
325
|
+
const shouldInstall = await prompt('今すぐcc-sddをインストールしますか? [Y/n]: ');
|
|
326
|
+
if (shouldInstall.toLowerCase() !== 'n') {
|
|
327
|
+
console.log('\n🚀 Installing cc-sdd...');
|
|
328
|
+
try {
|
|
329
|
+
execSync('npx cc-sdd@latest --codex --lang ja', {
|
|
330
|
+
stdio: 'inherit',
|
|
331
|
+
cwd: currentDir,
|
|
332
|
+
});
|
|
333
|
+
console.log('✅ cc-sdd installed successfully');
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
console.error('❌ cc-sdd installation failed');
|
|
337
|
+
console.error(' Please run manually: npx cc-sdd@latest --codex --lang ja');
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
console.log('⚠️ cc-sddをスキップしました');
|
|
343
|
+
console.log(' 後で手動で実行してください: npx cc-sdd@latest --codex --lang ja');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// 環境別テンプレートのコピーとレンダリング
|
|
347
|
+
console.log('\n📋 Step 3: Copying and rendering templates...');
|
|
348
|
+
const envConfig = getEnvironmentConfig(config.environment);
|
|
349
|
+
const templateContext = createTemplateContext(config.langCode, '.kiro', envConfig.rulesDir.startsWith('.')
|
|
350
|
+
? envConfig.rulesDir.substring(1, envConfig.rulesDir.indexOf('/', 1))
|
|
351
|
+
: envConfig.rulesDir.split('/')[0]);
|
|
352
|
+
const templateSourceDir = join(templatesDir, envConfig.templateSource);
|
|
353
|
+
if (!existsSync(templateSourceDir)) {
|
|
354
|
+
console.log(` ⚠️ Template source not found: ${templateSourceDir}`);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
// rulesディレクトリ(環境別にテンプレートディレクトリ名が異なる)
|
|
358
|
+
// cursor/claude: 'rules', claude-agent: 'agents'
|
|
359
|
+
const templateDirName = config.environment === 'claude-agent' ? 'agents' : 'rules';
|
|
360
|
+
const rulesTemplateDir = join(templateSourceDir, templateDirName);
|
|
361
|
+
const rulesDestDir = join(currentDir, envConfig.rulesDir);
|
|
362
|
+
if (existsSync(rulesTemplateDir)) {
|
|
363
|
+
mkdirSync(rulesDestDir, { recursive: true });
|
|
364
|
+
copyAndRenderTemplates(rulesTemplateDir, rulesDestDir, templateContext);
|
|
365
|
+
console.log(` ✅ Rules copied to ${envConfig.rulesDir}`);
|
|
366
|
+
}
|
|
367
|
+
// commandsディレクトリ
|
|
368
|
+
const commandsTemplateDir = join(templateSourceDir, 'commands');
|
|
369
|
+
const commandsDestDir = join(currentDir, envConfig.commandsDir);
|
|
370
|
+
if (existsSync(commandsTemplateDir)) {
|
|
371
|
+
mkdirSync(commandsDestDir, { recursive: true });
|
|
372
|
+
copyAndRenderTemplates(commandsTemplateDir, commandsDestDir, templateContext);
|
|
373
|
+
console.log(` ✅ Commands copied to ${envConfig.commandsDir}`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// Steeringテンプレートをコピー(Michiリポジトリから)
|
|
377
|
+
console.log('\n📚 Step 4: Copying steering templates...');
|
|
378
|
+
const michiSteeringDir = join(templatesDir, '..', '.kiro', 'steering');
|
|
379
|
+
if (existsSync(michiSteeringDir)) {
|
|
380
|
+
try {
|
|
381
|
+
cpSync(michiSteeringDir, join(currentDir, '.kiro/steering'), {
|
|
382
|
+
recursive: true,
|
|
383
|
+
});
|
|
384
|
+
console.log(' ✅ Steering templates copied');
|
|
385
|
+
}
|
|
386
|
+
catch (error) {
|
|
387
|
+
throw new Error(`Failed to copy steering templates: ${error instanceof Error ? error.message : error}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
console.log(' ⚠️ Steering templates not found (skipped)');
|
|
392
|
+
}
|
|
393
|
+
// Codex環境の場合: Michi独自の拡張ファイルをコピー
|
|
394
|
+
if (config.environment === 'codex') {
|
|
395
|
+
console.log('\n🎯 Step 4.1: Installing Michi extensions for Codex...');
|
|
396
|
+
// 1. Confluence同期プロンプトをコピー
|
|
397
|
+
const confluenceSyncSource = join(templatesDir, 'codex/prompts/confluence-sync.md');
|
|
398
|
+
const codexPromptsDir = join(currentDir, '.codex/prompts');
|
|
399
|
+
if (existsSync(confluenceSyncSource)) {
|
|
400
|
+
try {
|
|
401
|
+
mkdirSync(codexPromptsDir, { recursive: true });
|
|
402
|
+
cpSync(confluenceSyncSource, join(codexPromptsDir, 'confluence-sync.md'));
|
|
403
|
+
console.log(' ✅ Confluence sync command installed');
|
|
404
|
+
console.log(' Usage: /prompts:confluence-sync FEATURE=<機能名>');
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
console.warn(' ⚠️ Failed to copy confluence-sync.md');
|
|
408
|
+
if (error instanceof Error && error.message) {
|
|
409
|
+
console.warn(` Reason: ${error.message}`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
console.log(` ⚠️ Confluence sync template not found: ${confluenceSyncSource}`);
|
|
415
|
+
}
|
|
416
|
+
// 2. AGENTS.override.mdをプロジェクトルートにコピー
|
|
417
|
+
const agentsOverrideSource = join(templatesDir, 'codex/AGENTS.override.md');
|
|
418
|
+
const agentsOverrideDest = join(currentDir, 'AGENTS.override.md');
|
|
419
|
+
if (existsSync(agentsOverrideSource)) {
|
|
420
|
+
try {
|
|
421
|
+
cpSync(agentsOverrideSource, agentsOverrideDest);
|
|
422
|
+
console.log(' ✅ AGENTS.override.md installed');
|
|
423
|
+
console.log(' (Michi-specific rules added to Codex AGENTS.md)');
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
console.warn(' ⚠️ Failed to copy AGENTS.override.md');
|
|
427
|
+
if (error instanceof Error && error.message) {
|
|
428
|
+
console.warn(` Reason: ${error.message}`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
console.log(` ⚠️ AGENTS.override.md template not found: ${agentsOverrideSource}`);
|
|
434
|
+
}
|
|
435
|
+
console.log('');
|
|
436
|
+
console.log('📝 Codex extensions summary:');
|
|
437
|
+
console.log(' ✓ cc-sdd provides: /kiro:* commands (11 total)');
|
|
438
|
+
console.log(' ✓ Michi adds: /prompts:confluence-sync command');
|
|
439
|
+
console.log(' ✓ Michi adds: AGENTS.override.md (project-specific rules)');
|
|
440
|
+
}
|
|
441
|
+
// Specテンプレートをコピー
|
|
442
|
+
console.log('\n📄 Step 5: Copying spec templates...');
|
|
443
|
+
const michiSpecTemplatesDir = join(templatesDir, '..', '.kiro', 'settings', 'templates');
|
|
444
|
+
if (existsSync(michiSpecTemplatesDir)) {
|
|
445
|
+
try {
|
|
446
|
+
cpSync(michiSpecTemplatesDir, join(currentDir, '.kiro/settings/templates'), { recursive: true });
|
|
447
|
+
console.log(' ✅ Spec templates copied');
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
throw new Error(`Failed to copy spec templates: ${error instanceof Error ? error.message : error}`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
console.log(' ⚠️ Spec templates not found (skipped)');
|
|
455
|
+
}
|
|
456
|
+
// Specルールをコピー
|
|
457
|
+
const michiSpecRulesDir = join(templatesDir, '..', '.kiro', 'settings', 'rules');
|
|
458
|
+
if (existsSync(michiSpecRulesDir)) {
|
|
459
|
+
try {
|
|
460
|
+
cpSync(michiSpecRulesDir, join(currentDir, '.kiro/settings/rules'), {
|
|
461
|
+
recursive: true,
|
|
462
|
+
});
|
|
463
|
+
console.log(' ✅ Spec rules copied');
|
|
464
|
+
}
|
|
465
|
+
catch (error) {
|
|
466
|
+
throw new Error(`Failed to copy spec rules: ${error instanceof Error ? error.message : error}`);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
console.log(' ⚠️ Spec rules not found (skipped)');
|
|
471
|
+
}
|
|
472
|
+
// kiro-spec-tasksテンプレートを上書き(cc-sddのAI-DLC形式をMichiワークフロー形式に置換)
|
|
473
|
+
console.log('\n📋 Step 5.1: Overriding kiro-spec-tasks template...');
|
|
474
|
+
const kiroSpecTasksSource = join(templatesDir, envConfig.templateSource, 'commands', 'kiro', 'kiro-spec-tasks.md');
|
|
475
|
+
const kiroSpecTasksDest = join(currentDir, '.kiro', 'commands', 'kiro');
|
|
476
|
+
if (existsSync(kiroSpecTasksSource)) {
|
|
477
|
+
try {
|
|
478
|
+
mkdirSync(kiroSpecTasksDest, { recursive: true });
|
|
479
|
+
cpSync(kiroSpecTasksSource, join(kiroSpecTasksDest, 'kiro-spec-tasks.md'));
|
|
480
|
+
console.log(' ✅ kiro-spec-tasks.md overridden with Michi workflow format');
|
|
481
|
+
console.log(' (This ensures /kiro:spec-tasks generates Phase-based tasks.md)');
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
throw new Error(`Failed to copy kiro-spec-tasks template: ${error instanceof Error ? error.message : error}`);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
console.log(` ⚠️ kiro-spec-tasks template not found: ${kiroSpecTasksSource}`);
|
|
489
|
+
console.log(' (cc-sdd default template will be used)');
|
|
490
|
+
}
|
|
491
|
+
// .env 対話的設定
|
|
492
|
+
console.log('\n🔐 Step 6: Configuring environment variables...');
|
|
493
|
+
const envConfigPath = '.env';
|
|
494
|
+
// 動的インポート(env-config.tsが新規作成されたため)
|
|
495
|
+
const { parseEnvFile, configureEnvInteractive, generateEnvContent } = await import('../../scripts/utils/env-config.js');
|
|
496
|
+
let existingEnvValues;
|
|
497
|
+
if (existsSync(envConfigPath)) {
|
|
498
|
+
console.log(' ℹ️ 既存の .env ファイルを検出しました');
|
|
499
|
+
existingEnvValues = parseEnvFile(envConfigPath);
|
|
500
|
+
const overwrite = await prompt('既存値を表示して上書き確認しますか? [Y/n]: ');
|
|
501
|
+
if (overwrite.toLowerCase() !== 'n') {
|
|
502
|
+
// 対話的設定を実行
|
|
503
|
+
const newEnvValues = await configureEnvInteractive(existingEnvValues, config.jiraKey, repoUrl);
|
|
504
|
+
const envContent = generateEnvContent(newEnvValues);
|
|
505
|
+
try {
|
|
506
|
+
writeFileSync(envConfigPath, envContent, 'utf-8');
|
|
507
|
+
chmodSync(envConfigPath, 0o600);
|
|
508
|
+
console.log(' ✅ .env updated (permissions: 600)');
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
throw new Error(`Failed to update .env: ${error instanceof Error ? error.message : error}`);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
console.log(' ℹ️ .env file kept unchanged');
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
// 新規作成の場合
|
|
520
|
+
// テスト環境かどうかを判定(process.env.NODE_ENVまたはプロセスが対話的かどうか)
|
|
521
|
+
const isInteractive = process.stdin.isTTY && process.env.NODE_ENV !== 'test';
|
|
522
|
+
if (isInteractive) {
|
|
523
|
+
// 対話的環境では、ユーザーに確認
|
|
524
|
+
const shouldConfigure = await prompt('.env を対話的に設定しますか? [Y/n]: ');
|
|
525
|
+
if (shouldConfigure.toLowerCase() !== 'n') {
|
|
526
|
+
const newEnvValues = await configureEnvInteractive(undefined, config.jiraKey, repoUrl);
|
|
527
|
+
const envContent = generateEnvContent(newEnvValues);
|
|
528
|
+
try {
|
|
529
|
+
writeFileSync(envConfigPath, envContent, 'utf-8');
|
|
530
|
+
chmodSync(envConfigPath, 0o600);
|
|
531
|
+
console.log(' ✅ .env created (permissions: 600)');
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
throw new Error(`Failed to create .env: ${error instanceof Error ? error.message : error}`);
|
|
535
|
+
}
|
|
536
|
+
return; // 早期リターン
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
// 非対話的環境、またはユーザーが'n'と答えた場合: テンプレート作成
|
|
540
|
+
const envTemplate = `# Atlassian設定(MCP + REST API共通)
|
|
541
|
+
ATLASSIAN_URL=https://your-domain.atlassian.net
|
|
542
|
+
ATLASSIAN_EMAIL=your-email@company.com
|
|
543
|
+
ATLASSIAN_API_TOKEN=your-token-here
|
|
544
|
+
|
|
545
|
+
# GitHub設定
|
|
546
|
+
GITHUB_ORG=your-org
|
|
547
|
+
GITHUB_TOKEN=ghp_xxx
|
|
548
|
+
GITHUB_REPO=${repoUrl.replace('https://github.com/', '')}
|
|
549
|
+
|
|
550
|
+
# Confluence共有スペース
|
|
551
|
+
CONFLUENCE_PRD_SPACE=PRD
|
|
552
|
+
CONFLUENCE_QA_SPACE=QA
|
|
553
|
+
CONFLUENCE_RELEASE_SPACE=RELEASE
|
|
554
|
+
|
|
555
|
+
# JIRAプロジェクトキー
|
|
556
|
+
JIRA_PROJECT_KEYS=${config.jiraKey}
|
|
557
|
+
|
|
558
|
+
# JIRA Issue Type IDs(JIRAインスタンス固有 - 必須)
|
|
559
|
+
JIRA_ISSUE_TYPE_STORY=10036
|
|
560
|
+
JIRA_ISSUE_TYPE_SUBTASK=10037
|
|
561
|
+
`;
|
|
562
|
+
try {
|
|
563
|
+
writeFileSync(envConfigPath, envTemplate, 'utf-8');
|
|
564
|
+
chmodSync(envConfigPath, 0o600);
|
|
565
|
+
console.log(' ✅ .env template created (permissions: 600)');
|
|
566
|
+
}
|
|
567
|
+
catch (error) {
|
|
568
|
+
throw new Error(`Failed to write .env template: ${error instanceof Error ? error.message : error}`);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
// .gitignore 更新
|
|
572
|
+
console.log('\n📝 Step 7: Updating .gitignore...');
|
|
573
|
+
const gitignorePath = join(repoRoot, '.gitignore');
|
|
574
|
+
let gitignoreContent = '';
|
|
575
|
+
if (existsSync(gitignorePath)) {
|
|
576
|
+
try {
|
|
577
|
+
gitignoreContent = readFileSync(gitignorePath, 'utf-8');
|
|
578
|
+
}
|
|
579
|
+
catch (error) {
|
|
580
|
+
console.warn(' ⚠️ Warning: Failed to read .gitignore');
|
|
581
|
+
if (error instanceof Error && error.message) {
|
|
582
|
+
console.warn(` Reason: ${error.message}`);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
const entriesToAdd = [
|
|
587
|
+
'# Environment variables',
|
|
588
|
+
'.env',
|
|
589
|
+
'.env.local',
|
|
590
|
+
'.env.*.local',
|
|
591
|
+
];
|
|
592
|
+
let modified = false;
|
|
593
|
+
const lines = gitignoreContent.split('\n').map((l) => l.trim());
|
|
594
|
+
for (const entry of entriesToAdd) {
|
|
595
|
+
if (!lines.includes(entry.trim())) {
|
|
596
|
+
if (!modified) {
|
|
597
|
+
gitignoreContent += '\n\n# Added by michi setup\n';
|
|
598
|
+
modified = true;
|
|
599
|
+
}
|
|
600
|
+
gitignoreContent += entry + '\n';
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
if (modified) {
|
|
604
|
+
try {
|
|
605
|
+
writeFileSync(gitignorePath, gitignoreContent, 'utf-8');
|
|
606
|
+
console.log(' ✅ .gitignore updated');
|
|
607
|
+
}
|
|
608
|
+
catch (error) {
|
|
609
|
+
console.warn(' ⚠️ Warning: Failed to update .gitignore');
|
|
610
|
+
if (error instanceof Error && error.message) {
|
|
611
|
+
console.warn(` Reason: ${error.message}`);
|
|
612
|
+
}
|
|
613
|
+
console.warn(' Please manually add .env to .gitignore');
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
console.log(' ℹ️ .gitignore already contains .env entries');
|
|
618
|
+
}
|
|
619
|
+
// セットアップバリデーション
|
|
620
|
+
console.log('\n🔍 Step 8: Validating setup...');
|
|
621
|
+
const expectedFiles = [
|
|
622
|
+
'.kiro/settings/templates/specs/tasks.md',
|
|
623
|
+
'.kiro/settings/templates/specs/requirements.md',
|
|
624
|
+
'.kiro/settings/templates/specs/design.md',
|
|
625
|
+
'.kiro/settings/rules/tasks-generation.md',
|
|
626
|
+
];
|
|
627
|
+
const missingFiles = expectedFiles.filter((f) => !existsSync(join(currentDir, f)));
|
|
628
|
+
if (missingFiles.length > 0) {
|
|
629
|
+
console.log(' ⚠️ Some template files not found (will be created by cc-sdd):');
|
|
630
|
+
missingFiles.forEach((f) => console.log(` - ${f}`));
|
|
631
|
+
}
|
|
632
|
+
else {
|
|
633
|
+
console.log(' ✅ All template files present');
|
|
634
|
+
}
|
|
635
|
+
// 完了メッセージ(環境別)
|
|
636
|
+
console.log('\n');
|
|
637
|
+
console.log('🎉 セットアップ完了!');
|
|
638
|
+
console.log('');
|
|
639
|
+
console.log('次のステップ:');
|
|
640
|
+
console.log(' 1. .env ファイルの内容を確認(必要に応じて追加編集)');
|
|
641
|
+
console.log(' 2. npm install で依存関係をインストール(リポジトリルートで実行)');
|
|
642
|
+
// 環境別のメッセージ
|
|
643
|
+
switch (config.environment) {
|
|
644
|
+
case 'cursor':
|
|
645
|
+
console.log(' 3. Cursor で開く: cursor .');
|
|
646
|
+
console.log(' 4. Cursorを起動したら ~/.cursor/mcp.json の設定を確認');
|
|
647
|
+
console.log(' MCP設定の詳細: https://github.com/sk8metalme/michi/issues');
|
|
648
|
+
console.log(' (環境別MCP設定の対話的セットアップ機能は開発中)');
|
|
649
|
+
console.log(' 5. /kiro:spec-init <機能説明> で開発開始');
|
|
650
|
+
break;
|
|
651
|
+
case 'claude':
|
|
652
|
+
console.log(' 3. Claude Code で開く');
|
|
653
|
+
console.log(' 4. .claude/rules/ のルールファイルを確認');
|
|
654
|
+
console.log(' 5. Claude Code コマンドで開発開始');
|
|
655
|
+
break;
|
|
656
|
+
case 'claude-agent':
|
|
657
|
+
console.log(' 3. Claude Code で開く');
|
|
658
|
+
console.log(' 4. .claude/agents/ のサブエージェントを確認');
|
|
659
|
+
console.log(' 5. サブエージェントを活用して開発開始');
|
|
660
|
+
break;
|
|
661
|
+
case 'gemini':
|
|
662
|
+
console.log(' 3. Gemini CLI で開く');
|
|
663
|
+
console.log(' 4. .gemini/GEMINI.md のプロジェクトコンテキストを確認');
|
|
664
|
+
console.log(' 5. Gemini CLI コマンドで開発開始');
|
|
665
|
+
console.log(' (階層的コンテキストロード機能を活用)');
|
|
666
|
+
break;
|
|
667
|
+
case 'codex':
|
|
668
|
+
console.log(' 3. cc-sddとMichi拡張の統合を確認');
|
|
669
|
+
console.log(' - cc-sdd: /kiro:* コマンド(11個)');
|
|
670
|
+
console.log(' - Michi: /prompts:confluence-sync コマンド');
|
|
671
|
+
console.log(' - Michi: AGENTS.override.md(Michi固有ルール)');
|
|
672
|
+
console.log(' 4. 開発開始:');
|
|
673
|
+
console.log(' /kiro:spec-init FEATURE=<機能名>');
|
|
674
|
+
console.log(' /kiro:spec-requirements FEATURE=<機能名>');
|
|
675
|
+
console.log(' /kiro:spec-design FEATURE=<機能名>');
|
|
676
|
+
console.log(' /prompts:confluence-sync FEATURE=<機能名>');
|
|
677
|
+
console.log(' 5. 環境変数の設定(Confluence連携用):');
|
|
678
|
+
console.log(' ATLASSIAN_URL, ATLASSIAN_EMAIL, ATLASSIAN_API_TOKEN');
|
|
679
|
+
break;
|
|
680
|
+
case 'cline':
|
|
681
|
+
console.log(' 3. VSCode + Cline 拡張で開く');
|
|
682
|
+
console.log(' 4. .clinerules/rules/ のルールファイルを確認');
|
|
683
|
+
console.log(' 5. Clineのルールトグル機能(v3.13+)を活用');
|
|
684
|
+
console.log(' (各ルールファイルを個別に有効/無効化可能)');
|
|
685
|
+
break;
|
|
686
|
+
default:
|
|
687
|
+
console.log(' 3. AI開発環境で開く');
|
|
688
|
+
console.log(' 4. 生成されたルールファイルを確認');
|
|
689
|
+
console.log(' 5. 開発開始');
|
|
690
|
+
}
|
|
691
|
+
console.log('');
|
|
692
|
+
console.log('詳細: https://github.com/sk8metalme/michi');
|
|
693
|
+
console.log('');
|
|
694
|
+
}
|
|
695
|
+
//# sourceMappingURL=setup-existing.js.map
|