@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
|
@@ -1,35 +1,61 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
/**
|
|
3
3
|
* 既存プロジェクトにMichiワークフローを追加するスクリプト
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
5
|
* 使い方:
|
|
6
6
|
* cd /path/to/existing-repo
|
|
7
7
|
* npx tsx /path/to/michi/scripts/setup-existing-project.ts \
|
|
8
8
|
* --michi-path /path/to/michi \
|
|
9
9
|
* --project-name "既存プロジェクト" \
|
|
10
|
-
* --jira-key "EXIST"
|
|
10
|
+
* --jira-key "EXIST" \
|
|
11
|
+
* --environment cursor \
|
|
12
|
+
* --lang ja
|
|
11
13
|
*/
|
|
12
14
|
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
+
import {
|
|
16
|
+
cpSync,
|
|
17
|
+
existsSync,
|
|
18
|
+
mkdirSync,
|
|
19
|
+
writeFileSync,
|
|
20
|
+
readFileSync,
|
|
21
|
+
readdirSync,
|
|
22
|
+
} from 'fs';
|
|
23
|
+
import { resolve, join, basename, dirname } from 'path';
|
|
24
|
+
import { fileURLToPath } from 'url';
|
|
15
25
|
import { execSync } from 'child_process';
|
|
16
26
|
import { findRepositoryRoot } from './utils/project-finder.js';
|
|
27
|
+
import {
|
|
28
|
+
type Environment,
|
|
29
|
+
getEnvironmentConfig,
|
|
30
|
+
isSupportedEnvironment,
|
|
31
|
+
} from './constants/environments.js';
|
|
32
|
+
import {
|
|
33
|
+
type SupportedLanguage,
|
|
34
|
+
isSupportedLanguage,
|
|
35
|
+
} from './constants/languages.js';
|
|
36
|
+
import { createTemplateContext, renderTemplate } from './template/renderer.js';
|
|
37
|
+
|
|
38
|
+
// ES module で __dirname を取得
|
|
39
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
40
|
+
const __dirname = dirname(__filename);
|
|
17
41
|
|
|
18
42
|
interface SetupConfig {
|
|
19
|
-
michiPath: string;
|
|
20
|
-
projectName: string;
|
|
21
|
-
jiraKey: string;
|
|
22
|
-
labels?: string[];
|
|
43
|
+
michiPath: string; // Michiリポジトリのパス
|
|
44
|
+
projectName: string; // プロジェクト表示名
|
|
45
|
+
jiraKey: string; // JIRAプロジェクトキー
|
|
46
|
+
labels?: string[]; // Confluenceラベル(オプション)
|
|
47
|
+
environment: Environment; // cc-sdd環境: 'claude' | 'claude-agent' | 'cursor'
|
|
48
|
+
langCode: SupportedLanguage; // 言語コード: 'ja'
|
|
23
49
|
}
|
|
24
50
|
|
|
25
51
|
function parseArgs(): SetupConfig {
|
|
26
52
|
const args = process.argv.slice(2);
|
|
27
53
|
const config: Partial<SetupConfig> = {};
|
|
28
|
-
|
|
54
|
+
|
|
29
55
|
for (let i = 0; i < args.length; i += 2) {
|
|
30
56
|
const key = args[i].replace(/^--/, '');
|
|
31
57
|
const value = args[i + 1];
|
|
32
|
-
|
|
58
|
+
|
|
33
59
|
switch (key) {
|
|
34
60
|
case 'michi-path':
|
|
35
61
|
config.michiPath = value;
|
|
@@ -40,45 +66,108 @@ function parseArgs(): SetupConfig {
|
|
|
40
66
|
case 'jira-key':
|
|
41
67
|
config.jiraKey = value;
|
|
42
68
|
break;
|
|
69
|
+
case 'environment':
|
|
70
|
+
config.environment = value as Environment;
|
|
71
|
+
break;
|
|
72
|
+
case 'lang':
|
|
73
|
+
config.langCode = value as SupportedLanguage;
|
|
74
|
+
break;
|
|
43
75
|
}
|
|
44
76
|
}
|
|
45
|
-
|
|
77
|
+
|
|
46
78
|
// デフォルト値
|
|
47
79
|
if (!config.michiPath) {
|
|
48
80
|
config.michiPath = resolve(__dirname, '..');
|
|
49
81
|
}
|
|
50
|
-
|
|
82
|
+
if (!config.environment) {
|
|
83
|
+
config.environment = 'claude';
|
|
84
|
+
}
|
|
85
|
+
if (!config.langCode) {
|
|
86
|
+
config.langCode = 'ja';
|
|
87
|
+
}
|
|
88
|
+
|
|
51
89
|
// 必須フィールドチェック
|
|
52
90
|
if (!config.projectName || !config.jiraKey) {
|
|
53
91
|
console.error('Missing required parameters');
|
|
54
|
-
console.error(
|
|
92
|
+
console.error(
|
|
93
|
+
'Usage: tsx setup-existing-project.ts --project-name <name> --jira-key <key> [--michi-path <path>] [--environment <env>] [--lang <code>]',
|
|
94
|
+
);
|
|
55
95
|
process.exit(1);
|
|
56
96
|
}
|
|
57
|
-
|
|
97
|
+
|
|
98
|
+
// 環境バリデーション
|
|
99
|
+
if (!isSupportedEnvironment(config.environment)) {
|
|
100
|
+
console.error(`Unsupported environment: ${config.environment}`);
|
|
101
|
+
console.error('Supported environments: claude, claude-agent, cursor');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// 言語バリデーション
|
|
106
|
+
if (!isSupportedLanguage(config.langCode)) {
|
|
107
|
+
console.error(`Unsupported language: ${config.langCode}`);
|
|
108
|
+
console.error(
|
|
109
|
+
'Supported languages: ja, en, zh-TW, zh, es, pt, de, fr, ru, it, ko, ar',
|
|
110
|
+
);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
|
|
58
114
|
return config as SetupConfig;
|
|
59
115
|
}
|
|
60
116
|
|
|
117
|
+
/**
|
|
118
|
+
* Copy and render templates recursively
|
|
119
|
+
*
|
|
120
|
+
* @param sourceDir - Source directory containing templates
|
|
121
|
+
* @param destDir - Destination directory for rendered files
|
|
122
|
+
* @param context - Template context for rendering
|
|
123
|
+
*/
|
|
124
|
+
function copyAndRenderTemplates(
|
|
125
|
+
sourceDir: string,
|
|
126
|
+
destDir: string,
|
|
127
|
+
context: ReturnType<typeof createTemplateContext>,
|
|
128
|
+
): void {
|
|
129
|
+
const entries = readdirSync(sourceDir, { withFileTypes: true });
|
|
130
|
+
|
|
131
|
+
for (const entry of entries) {
|
|
132
|
+
const sourcePath = join(sourceDir, entry.name);
|
|
133
|
+
const destPath = join(destDir, entry.name);
|
|
134
|
+
|
|
135
|
+
if (entry.isDirectory()) {
|
|
136
|
+
// ディレクトリは再帰的にコピー
|
|
137
|
+
mkdirSync(destPath, { recursive: true });
|
|
138
|
+
copyAndRenderTemplates(sourcePath, destPath, context);
|
|
139
|
+
} else if (entry.isFile()) {
|
|
140
|
+
// ファイルはレンダリングしてコピー
|
|
141
|
+
const content = readFileSync(sourcePath, 'utf-8');
|
|
142
|
+
const rendered = renderTemplate(content, context);
|
|
143
|
+
writeFileSync(destPath, rendered, 'utf-8');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
61
148
|
async function setupExistingProject(config: SetupConfig): Promise<void> {
|
|
62
149
|
const currentDir = process.cwd();
|
|
63
150
|
const projectId = basename(currentDir);
|
|
64
|
-
|
|
151
|
+
|
|
65
152
|
console.log('🚀 既存プロジェクトにMichiワークフローを追加');
|
|
66
153
|
console.log(` プロジェクト: ${config.projectName}`);
|
|
67
154
|
console.log(` ディレクトリ: ${currentDir}`);
|
|
68
155
|
console.log(` Michiパス: ${config.michiPath}`);
|
|
156
|
+
console.log(` 環境: ${config.environment}`);
|
|
157
|
+
console.log(` 言語: ${config.langCode}`);
|
|
69
158
|
console.log('');
|
|
70
|
-
|
|
159
|
+
|
|
71
160
|
// リポジトリルートを検出
|
|
72
161
|
const repoRoot = findRepositoryRoot(currentDir);
|
|
73
|
-
|
|
162
|
+
|
|
74
163
|
// projects/{project-id}/配下にプロジェクトを作成
|
|
75
164
|
const projectsDir = join(repoRoot, 'projects');
|
|
76
165
|
const projectDir = join(projectsDir, projectId);
|
|
77
|
-
|
|
166
|
+
|
|
78
167
|
console.log(`📁 リポジトリルート: ${repoRoot}`);
|
|
79
168
|
console.log(`📁 プロジェクトディレクトリ: ${projectDir}`);
|
|
80
169
|
console.log('');
|
|
81
|
-
|
|
170
|
+
|
|
82
171
|
// projects/ディレクトリとプロジェクトディレクトリを作成
|
|
83
172
|
if (!existsSync(projectsDir)) {
|
|
84
173
|
mkdirSync(projectsDir, { recursive: true });
|
|
@@ -88,24 +177,26 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
|
|
|
88
177
|
mkdirSync(projectDir, { recursive: true });
|
|
89
178
|
console.log(` ✅ Created: ${projectDir}`);
|
|
90
179
|
}
|
|
91
|
-
|
|
180
|
+
|
|
92
181
|
// 元の作業ディレクトリを保存
|
|
93
182
|
const originalCwd = process.cwd();
|
|
94
|
-
|
|
183
|
+
|
|
95
184
|
try {
|
|
96
185
|
// プロジェクトディレクトリに移動
|
|
97
186
|
process.chdir(projectDir);
|
|
98
|
-
|
|
187
|
+
|
|
99
188
|
// Step 1: cc-sdd導入確認
|
|
100
189
|
console.log('\n📦 Step 1: Checking cc-sdd installation...');
|
|
101
190
|
if (!existsSync('.cursor/commands/kiro')) {
|
|
102
191
|
console.log(' Installing cc-sdd...');
|
|
103
|
-
execSync('npx cc-sdd@latest --cursor --lang ja --yes', {
|
|
192
|
+
execSync('npx cc-sdd@latest --cursor --lang ja --yes', {
|
|
193
|
+
stdio: 'inherit',
|
|
194
|
+
});
|
|
104
195
|
console.log(' ✅ cc-sdd installed');
|
|
105
196
|
} else {
|
|
106
197
|
console.log(' ✅ cc-sdd already installed');
|
|
107
198
|
}
|
|
108
|
-
|
|
199
|
+
|
|
109
200
|
// Step 2: .kiro ディレクトリ作成
|
|
110
201
|
console.log('\n📁 Step 2: Creating .kiro directory structure...');
|
|
111
202
|
mkdirSync('.kiro/settings/templates', { recursive: true });
|
|
@@ -115,134 +206,193 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
|
|
|
115
206
|
|
|
116
207
|
// Step 3: プロジェクトメタデータ作成
|
|
117
208
|
console.log('\n📝 Step 3: Creating project metadata...');
|
|
118
|
-
|
|
209
|
+
|
|
119
210
|
// GitHub URLを取得(既存リポジトリから)
|
|
120
211
|
let repoUrl = '';
|
|
121
212
|
try {
|
|
122
|
-
repoUrl = execSync('git config --get remote.origin.url', {
|
|
213
|
+
repoUrl = execSync('git config --get remote.origin.url', {
|
|
214
|
+
encoding: 'utf-8',
|
|
215
|
+
cwd: repoRoot,
|
|
216
|
+
}).trim();
|
|
123
217
|
// SSH形式をHTTPS形式に変換
|
|
124
218
|
if (repoUrl.startsWith('git@github.com:')) {
|
|
125
|
-
repoUrl = repoUrl
|
|
219
|
+
repoUrl = repoUrl
|
|
220
|
+
.replace('git@github.com:', 'https://github.com/')
|
|
221
|
+
.replace('.git', '');
|
|
126
222
|
}
|
|
127
223
|
} catch {
|
|
128
224
|
repoUrl = `https://github.com/org/${projectId}`;
|
|
129
225
|
}
|
|
130
|
-
|
|
131
|
-
const labels =
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
226
|
+
|
|
227
|
+
const labels =
|
|
228
|
+
config.labels ||
|
|
229
|
+
(() => {
|
|
230
|
+
// プロジェクトIDからプロジェクトラベル生成
|
|
231
|
+
const projectLabel = projectId.toLowerCase().replace(/[^a-z0-9-]/g, '');
|
|
232
|
+
const labelSet = new Set([`project:${projectLabel}`]);
|
|
233
|
+
|
|
234
|
+
// ハイフンが存在する場合のみサービスラベルを生成
|
|
235
|
+
if (projectId.includes('-')) {
|
|
236
|
+
const parts = projectId.split('-');
|
|
237
|
+
const servicePart = parts[parts.length - 1];
|
|
238
|
+
const serviceLabel = servicePart
|
|
239
|
+
.toLowerCase()
|
|
240
|
+
.replace(/[^a-z0-9-]/g, '');
|
|
241
|
+
|
|
242
|
+
// サービスラベルがプロジェクトラベルと異なる場合のみ追加
|
|
243
|
+
if (serviceLabel !== projectLabel) {
|
|
244
|
+
labelSet.add(`service:${serviceLabel}`);
|
|
245
|
+
}
|
|
145
246
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
247
|
+
|
|
248
|
+
return Array.from(labelSet);
|
|
249
|
+
})();
|
|
250
|
+
|
|
151
251
|
const projectJson = {
|
|
152
252
|
projectId,
|
|
153
253
|
projectName: config.projectName,
|
|
254
|
+
language: config.langCode,
|
|
154
255
|
jiraProjectKey: config.jiraKey,
|
|
155
256
|
confluenceLabels: labels,
|
|
156
257
|
status: 'active',
|
|
157
258
|
team: [],
|
|
158
259
|
stakeholders: ['@企画', '@部長'],
|
|
159
260
|
repository: repoUrl,
|
|
160
|
-
description: `${config.projectName}
|
|
261
|
+
description: `${config.projectName}の開発`,
|
|
161
262
|
};
|
|
162
|
-
|
|
263
|
+
|
|
163
264
|
writeFileSync('.kiro/project.json', JSON.stringify(projectJson, null, 2));
|
|
164
265
|
console.log(' ✅ project.json created');
|
|
165
|
-
|
|
166
|
-
// Step 4:
|
|
167
|
-
console.log('\n📋 Step 4: Copying
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
266
|
+
|
|
267
|
+
// Step 4: 環境別テンプレートのコピーとレンダリング
|
|
268
|
+
console.log('\n📋 Step 4: Copying and rendering templates from Michi...');
|
|
269
|
+
|
|
270
|
+
const envConfig = getEnvironmentConfig(config.environment);
|
|
271
|
+
const templateContext = createTemplateContext(
|
|
272
|
+
config.langCode,
|
|
273
|
+
'.kiro',
|
|
274
|
+
envConfig.rulesDir.startsWith('.')
|
|
275
|
+
? envConfig.rulesDir.substring(1, envConfig.rulesDir.indexOf('/', 1))
|
|
276
|
+
: envConfig.rulesDir.split('/')[0],
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
// テンプレートソースディレクトリ
|
|
280
|
+
const templateSourceDir = join(
|
|
281
|
+
config.michiPath,
|
|
282
|
+
'templates',
|
|
283
|
+
envConfig.templateSource,
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
if (!existsSync(templateSourceDir)) {
|
|
287
|
+
console.log(` ⚠️ Template source not found: ${templateSourceDir}`);
|
|
288
|
+
console.log(' Skipping template copy');
|
|
289
|
+
} else {
|
|
290
|
+
// rulesディレクトリのコピーとレンダリング(環境別にテンプレートディレクトリ名が異なる)
|
|
291
|
+
// cursor/claude: 'rules', claude-agent: 'agents'
|
|
292
|
+
const templateDirName =
|
|
293
|
+
config.environment === 'claude-agent' ? 'agents' : 'rules';
|
|
294
|
+
const rulesTemplateDir = join(templateSourceDir, templateDirName);
|
|
295
|
+
const rulesDestDir = join(projectDir, envConfig.rulesDir);
|
|
296
|
+
|
|
297
|
+
if (existsSync(rulesTemplateDir)) {
|
|
298
|
+
mkdirSync(rulesDestDir, { recursive: true });
|
|
299
|
+
copyAndRenderTemplates(rulesTemplateDir, rulesDestDir, templateContext);
|
|
300
|
+
console.log(` ✅ Rules copied and rendered to ${envConfig.rulesDir}`);
|
|
187
301
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
console.log(` ✅ ${cmd}`);
|
|
302
|
+
|
|
303
|
+
// commandsディレクトリのコピーとレンダリング
|
|
304
|
+
const commandsTemplateDir = join(templateSourceDir, 'commands');
|
|
305
|
+
const commandsDestDir = join(projectDir, envConfig.commandsDir);
|
|
306
|
+
|
|
307
|
+
if (existsSync(commandsTemplateDir)) {
|
|
308
|
+
mkdirSync(commandsDestDir, { recursive: true });
|
|
309
|
+
copyAndRenderTemplates(
|
|
310
|
+
commandsTemplateDir,
|
|
311
|
+
commandsDestDir,
|
|
312
|
+
templateContext,
|
|
313
|
+
);
|
|
314
|
+
console.log(
|
|
315
|
+
` ✅ Commands copied and rendered to ${envConfig.commandsDir}`,
|
|
316
|
+
);
|
|
204
317
|
}
|
|
205
318
|
}
|
|
206
|
-
|
|
207
|
-
// Step
|
|
208
|
-
console.log('\n📚 Step
|
|
209
|
-
|
|
319
|
+
|
|
320
|
+
// Step 5: Steeringテンプレートをコピー
|
|
321
|
+
console.log('\n📚 Step 5: Copying steering templates...');
|
|
322
|
+
|
|
210
323
|
const steeringDir = join(config.michiPath, '.kiro/steering');
|
|
211
324
|
if (existsSync(steeringDir)) {
|
|
212
|
-
cpSync(steeringDir, join(projectDir, '.kiro/steering'), {
|
|
325
|
+
cpSync(steeringDir, join(projectDir, '.kiro/steering'), {
|
|
326
|
+
recursive: true,
|
|
327
|
+
});
|
|
213
328
|
console.log(' ✅ product.md, tech.md, structure.md');
|
|
214
329
|
}
|
|
215
|
-
|
|
216
|
-
// Step
|
|
217
|
-
console.log('\n📄 Step
|
|
218
|
-
|
|
330
|
+
|
|
331
|
+
// Step 6: テンプレートをコピー
|
|
332
|
+
console.log('\n📄 Step 6: Copying spec templates...');
|
|
333
|
+
|
|
219
334
|
const templatesDir = join(config.michiPath, '.kiro/settings/templates');
|
|
220
335
|
if (existsSync(templatesDir)) {
|
|
221
|
-
cpSync(templatesDir, join(projectDir, '.kiro/settings/templates'), {
|
|
336
|
+
cpSync(templatesDir, join(projectDir, '.kiro/settings/templates'), {
|
|
337
|
+
recursive: true,
|
|
338
|
+
});
|
|
222
339
|
console.log(' ✅ requirements.md, design.md, tasks.md');
|
|
223
340
|
}
|
|
224
|
-
|
|
225
|
-
// Step
|
|
226
|
-
console.log('\n
|
|
341
|
+
|
|
342
|
+
// Step 6.1: kiro-spec-tasksテンプレートを上書き(cc-sddのAI-DLC形式をMichiワークフロー形式に置換)
|
|
343
|
+
console.log('\n📋 Step 6.1: Overriding kiro-spec-tasks template...');
|
|
344
|
+
const kiroSpecTasksSource = join(
|
|
345
|
+
config.michiPath,
|
|
346
|
+
'templates',
|
|
347
|
+
envConfig.templateSource,
|
|
348
|
+
'commands',
|
|
349
|
+
'kiro',
|
|
350
|
+
'kiro-spec-tasks.md',
|
|
351
|
+
);
|
|
352
|
+
const kiroSpecTasksDest = join(projectDir, '.kiro', 'commands', 'kiro');
|
|
353
|
+
|
|
354
|
+
if (existsSync(kiroSpecTasksSource)) {
|
|
355
|
+
mkdirSync(kiroSpecTasksDest, { recursive: true });
|
|
356
|
+
cpSync(
|
|
357
|
+
kiroSpecTasksSource,
|
|
358
|
+
join(kiroSpecTasksDest, 'kiro-spec-tasks.md'),
|
|
359
|
+
);
|
|
360
|
+
console.log(
|
|
361
|
+
' ✅ kiro-spec-tasks.md overridden with Michi workflow format',
|
|
362
|
+
);
|
|
363
|
+
console.log(
|
|
364
|
+
' (This ensures /kiro:spec-tasks generates Phase-based tasks.md)',
|
|
365
|
+
);
|
|
366
|
+
} else {
|
|
367
|
+
console.log(
|
|
368
|
+
` ⚠️ kiro-spec-tasks template not found: ${kiroSpecTasksSource}`,
|
|
369
|
+
);
|
|
370
|
+
console.log(' (cc-sdd default template will be used)');
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Step 7: CLIツールのセットアップ案内
|
|
374
|
+
console.log('\n⚙️ Step 7: Setting up Michi CLI...');
|
|
227
375
|
console.log(' ✅ Michi CLI setup complete!');
|
|
228
376
|
console.log('');
|
|
229
377
|
console.log(' 📋 使用方法:');
|
|
230
378
|
console.log(' npx @sk8metal/michi-cli jira:sync <feature>');
|
|
231
|
-
console.log(
|
|
379
|
+
console.log(
|
|
380
|
+
' npx @sk8metal/michi-cli confluence:sync <feature> requirements',
|
|
381
|
+
);
|
|
232
382
|
console.log(' npx @sk8metal/michi-cli phase:run <feature> tasks');
|
|
233
383
|
console.log('');
|
|
234
384
|
console.log(' または、グローバルインストール:');
|
|
235
385
|
console.log(' npm install -g @sk8metal/michi-cli');
|
|
236
386
|
console.log(' michi jira:sync <feature>');
|
|
237
|
-
|
|
238
|
-
// Step
|
|
239
|
-
console.log('\n📦 Step
|
|
240
|
-
|
|
387
|
+
|
|
388
|
+
// Step 8: package.json と tsconfig.json をリポジトリルートにコピー
|
|
389
|
+
console.log('\n📦 Step 8: Setting up package.json and TypeScript...');
|
|
390
|
+
|
|
241
391
|
// 既存の package.json があるかチェック(リポジトリルート)
|
|
242
392
|
const hasPackageJson = existsSync(join(repoRoot, 'package.json'));
|
|
243
|
-
|
|
393
|
+
|
|
244
394
|
if (!hasPackageJson) {
|
|
245
|
-
|
|
395
|
+
// package.json がない場合はリポジトリルートにコピー
|
|
246
396
|
const src = join(config.michiPath, 'package.json');
|
|
247
397
|
const dest = join(repoRoot, 'package.json');
|
|
248
398
|
if (existsSync(src)) {
|
|
@@ -250,23 +400,33 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
|
|
|
250
400
|
console.log(' ✅ package.json created (in repository root)');
|
|
251
401
|
}
|
|
252
402
|
} else {
|
|
253
|
-
|
|
403
|
+
// 既存の package.json にスクリプトを追加
|
|
254
404
|
console.log(' ℹ️ Existing package.json found');
|
|
255
405
|
console.log(' 📝 手動で以下のスクリプトを追加してください:');
|
|
256
406
|
console.log('');
|
|
257
407
|
console.log(' "scripts": {');
|
|
258
408
|
console.log(' "jira:sync": "npx @sk8metal/michi-cli jira:sync",');
|
|
259
|
-
console.log(
|
|
409
|
+
console.log(
|
|
410
|
+
' "confluence:sync": "npx @sk8metal/michi-cli confluence:sync",',
|
|
411
|
+
);
|
|
260
412
|
console.log(' "phase:run": "npx @sk8metal/michi-cli phase:run",');
|
|
261
|
-
console.log(
|
|
413
|
+
console.log(
|
|
414
|
+
' "validate:phase": "npx @sk8metal/michi-cli validate:phase",',
|
|
415
|
+
);
|
|
262
416
|
console.log(' "preflight": "npx @sk8metal/michi-cli preflight",');
|
|
263
|
-
console.log(
|
|
264
|
-
|
|
265
|
-
|
|
417
|
+
console.log(
|
|
418
|
+
' "project:list": "npx @sk8metal/michi-cli project:list",',
|
|
419
|
+
);
|
|
420
|
+
console.log(
|
|
421
|
+
' "project:dashboard": "npx @sk8metal/michi-cli project:dashboard",',
|
|
422
|
+
);
|
|
423
|
+
console.log(
|
|
424
|
+
' "workflow:run": "npx @sk8metal/michi-cli workflow:run"',
|
|
425
|
+
);
|
|
266
426
|
console.log(' }');
|
|
267
427
|
console.log('');
|
|
268
428
|
}
|
|
269
|
-
|
|
429
|
+
|
|
270
430
|
// tsconfig.json をリポジトリルートにコピー
|
|
271
431
|
if (!existsSync(join(repoRoot, 'tsconfig.json'))) {
|
|
272
432
|
const src = join(config.michiPath, 'tsconfig.json');
|
|
@@ -278,10 +438,10 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
|
|
|
278
438
|
} else {
|
|
279
439
|
console.log(' ℹ️ Existing tsconfig.json found (kept)');
|
|
280
440
|
}
|
|
281
|
-
|
|
282
|
-
// Step
|
|
283
|
-
console.log('\n🔐 Step
|
|
284
|
-
|
|
441
|
+
|
|
442
|
+
// Step 9: .env テンプレート作成(プロジェクトディレクトリに)
|
|
443
|
+
console.log('\n🔐 Step 9: Creating .env template...');
|
|
444
|
+
|
|
285
445
|
const envTemplate = `# Atlassian設定(MCP + REST API共通)
|
|
286
446
|
ATLASSIAN_URL=https://your-domain.atlassian.net
|
|
287
447
|
ATLASSIAN_EMAIL=your-email@company.com
|
|
@@ -300,21 +460,21 @@ CONFLUENCE_RELEASE_SPACE=RELEASE
|
|
|
300
460
|
# JIRAプロジェクトキー
|
|
301
461
|
JIRA_PROJECT_KEYS=${config.jiraKey}
|
|
302
462
|
`;
|
|
303
|
-
|
|
463
|
+
|
|
304
464
|
if (!existsSync(join(projectDir, '.env'))) {
|
|
305
465
|
writeFileSync(join(projectDir, '.env'), envTemplate);
|
|
306
466
|
console.log(' ✅ .env template created');
|
|
307
467
|
} else {
|
|
308
468
|
console.log(' ℹ️ .env already exists (kept)');
|
|
309
469
|
}
|
|
310
|
-
|
|
311
|
-
// Step
|
|
312
|
-
console.log('\n📖 Step
|
|
313
|
-
|
|
470
|
+
|
|
471
|
+
// Step 10: README.md を更新(オプション、プロジェクトディレクトリに)
|
|
472
|
+
console.log('\n📖 Step 10: Updating documentation...');
|
|
473
|
+
|
|
314
474
|
const readmePath = join(projectDir, 'README.md');
|
|
315
475
|
if (existsSync(readmePath)) {
|
|
316
476
|
const currentReadme = readFileSync(readmePath, 'utf-8');
|
|
317
|
-
|
|
477
|
+
|
|
318
478
|
// Michiワークフロー情報を追加
|
|
319
479
|
const workflowSection = `
|
|
320
480
|
|
|
@@ -342,7 +502,7 @@ npm run github:create-pr <branch> # PR作成
|
|
|
342
502
|
|
|
343
503
|
詳細: [Michi Documentation](https://github.com/sk8metalme/michi)
|
|
344
504
|
`;
|
|
345
|
-
|
|
505
|
+
|
|
346
506
|
if (!currentReadme.includes('AI開発ワークフロー')) {
|
|
347
507
|
writeFileSync(readmePath, currentReadme + workflowSection);
|
|
348
508
|
console.log(' ✅ README.md updated');
|
|
@@ -350,25 +510,25 @@ npm run github:create-pr <branch> # PR作成
|
|
|
350
510
|
console.log(' ℹ️ README.md already has workflow section');
|
|
351
511
|
}
|
|
352
512
|
}
|
|
353
|
-
|
|
354
|
-
// Step
|
|
355
|
-
console.log('\n🚫 Step
|
|
356
|
-
|
|
513
|
+
|
|
514
|
+
// Step 11: .gitignore 更新(リポジトリルートに)
|
|
515
|
+
console.log('\n🚫 Step 11: Updating .gitignore...');
|
|
516
|
+
|
|
357
517
|
const gitignoreEntries = [
|
|
358
518
|
'# AI Development Workflow',
|
|
359
519
|
'node_modules/',
|
|
360
520
|
'.env',
|
|
361
521
|
'.env.local',
|
|
362
522
|
'dist/',
|
|
363
|
-
'*.log'
|
|
523
|
+
'*.log',
|
|
364
524
|
];
|
|
365
|
-
|
|
525
|
+
|
|
366
526
|
const gitignorePath = join(repoRoot, '.gitignore');
|
|
367
527
|
let gitignore = '';
|
|
368
528
|
if (existsSync(gitignorePath)) {
|
|
369
529
|
gitignore = readFileSync(gitignorePath, 'utf-8');
|
|
370
530
|
}
|
|
371
|
-
|
|
531
|
+
|
|
372
532
|
let updated = false;
|
|
373
533
|
for (const entry of gitignoreEntries) {
|
|
374
534
|
if (!gitignore.includes(entry)) {
|
|
@@ -376,14 +536,14 @@ npm run github:create-pr <branch> # PR作成
|
|
|
376
536
|
updated = true;
|
|
377
537
|
}
|
|
378
538
|
}
|
|
379
|
-
|
|
539
|
+
|
|
380
540
|
if (updated) {
|
|
381
541
|
writeFileSync(gitignorePath, gitignore);
|
|
382
542
|
console.log(' ✅ .gitignore updated (in repository root)');
|
|
383
543
|
} else {
|
|
384
544
|
console.log(' ℹ️ .gitignore already up to date');
|
|
385
545
|
}
|
|
386
|
-
|
|
546
|
+
|
|
387
547
|
// 完了メッセージ
|
|
388
548
|
console.log('\n');
|
|
389
549
|
console.log('🎉 セットアップ完了!');
|
|
@@ -392,21 +552,25 @@ npm run github:create-pr <branch> # PR作成
|
|
|
392
552
|
console.log(` 1. cd ${projectDir}`);
|
|
393
553
|
console.log(' 2. .env ファイルを編集して認証情報を設定');
|
|
394
554
|
console.log(' 3. package.json が既存の場合、スクリプトを手動追加');
|
|
395
|
-
console.log(
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
console.log(
|
|
555
|
+
console.log(
|
|
556
|
+
' 4. npm install で依存関係をインストール(リポジトリルートで実行)',
|
|
557
|
+
);
|
|
558
|
+
console.log(
|
|
559
|
+
` 5. cc-sddを導入: npx cc-sdd@latest --lang ${config.langCode} --${config.environment}`,
|
|
560
|
+
);
|
|
561
|
+
console.log(' 6. jj commit でセットアップをコミット');
|
|
562
|
+
console.log(' 7. Cursor で開く: cursor .');
|
|
563
|
+
console.log(' 8. /kiro:spec-init <機能説明> で開発開始');
|
|
399
564
|
console.log('');
|
|
400
565
|
console.log('作成されたファイル:');
|
|
401
566
|
console.log(` - ${projectDir}/.kiro/project.json`);
|
|
402
|
-
console.log(` - ${projectDir}
|
|
403
|
-
console.log(` - ${projectDir}
|
|
567
|
+
console.log(` - ${projectDir}/${envConfig.rulesDir}/`);
|
|
568
|
+
console.log(` - ${projectDir}/${envConfig.commandsDir}/`);
|
|
404
569
|
console.log(` - ${projectDir}/.kiro/steering/ (3ファイル)`);
|
|
405
570
|
console.log(` - ${projectDir}/.kiro/settings/templates/ (3ファイル)`);
|
|
406
571
|
console.log(` - ${repoRoot}/package.json (新規の場合)`);
|
|
407
572
|
console.log(` - ${repoRoot}/tsconfig.json (新規の場合)`);
|
|
408
573
|
console.log(` - ${projectDir}/.env (テンプレート)`);
|
|
409
|
-
|
|
410
574
|
} finally {
|
|
411
575
|
// 元の作業ディレクトリに戻る
|
|
412
576
|
process.chdir(originalCwd);
|
|
@@ -415,8 +579,7 @@ npm run github:create-pr <branch> # PR作成
|
|
|
415
579
|
|
|
416
580
|
// 実行
|
|
417
581
|
const config = parseArgs();
|
|
418
|
-
setupExistingProject(config).catch(error => {
|
|
582
|
+
setupExistingProject(config).catch((error) => {
|
|
419
583
|
console.error('❌ Error:', error.message);
|
|
420
584
|
process.exit(1);
|
|
421
585
|
});
|
|
422
|
-
|