@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,146 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
ENV_CONFIG,
|
|
4
|
+
getEnvironmentConfig,
|
|
5
|
+
isSupportedEnvironment,
|
|
6
|
+
getSupportedEnvironments,
|
|
7
|
+
type Environment,
|
|
8
|
+
type EnvironmentConfig,
|
|
9
|
+
} from '../environments.js';
|
|
10
|
+
|
|
11
|
+
describe('environments', () => {
|
|
12
|
+
describe('ENV_CONFIG', () => {
|
|
13
|
+
it('should have entries for all environments', () => {
|
|
14
|
+
expect(ENV_CONFIG.claude).toBeDefined();
|
|
15
|
+
expect(ENV_CONFIG['claude-agent']).toBeDefined();
|
|
16
|
+
expect(ENV_CONFIG.cursor).toBeDefined();
|
|
17
|
+
expect(ENV_CONFIG.gemini).toBeDefined();
|
|
18
|
+
expect(ENV_CONFIG.codex).toBeDefined();
|
|
19
|
+
expect(ENV_CONFIG.cline).toBeDefined();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('should have correct structure for claude', () => {
|
|
23
|
+
const config = ENV_CONFIG.claude;
|
|
24
|
+
expect(config.rulesDir).toBe('.claude/rules');
|
|
25
|
+
expect(config.commandsDir).toBe('.claude/commands/kiro');
|
|
26
|
+
expect(config.templateSource).toBe('claude');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should have correct structure for claude-agent', () => {
|
|
30
|
+
const config = ENV_CONFIG['claude-agent'];
|
|
31
|
+
expect(config.rulesDir).toBe('.claude/agents');
|
|
32
|
+
expect(config.commandsDir).toBe('.claude/commands/kiro');
|
|
33
|
+
expect(config.templateSource).toBe('claude-agent');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should have correct structure for cursor', () => {
|
|
37
|
+
const config = ENV_CONFIG.cursor;
|
|
38
|
+
expect(config.rulesDir).toBe('.cursor/rules');
|
|
39
|
+
expect(config.commandsDir).toBe('.cursor/commands/kiro');
|
|
40
|
+
expect(config.templateSource).toBe('cursor');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should have correct structure for gemini', () => {
|
|
44
|
+
const config = ENV_CONFIG.gemini;
|
|
45
|
+
expect(config.rulesDir).toBe('.gemini');
|
|
46
|
+
expect(config.commandsDir).toBe('.gemini/extensions');
|
|
47
|
+
expect(config.templateSource).toBe('gemini');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should have correct structure for codex', () => {
|
|
51
|
+
const config = ENV_CONFIG.codex;
|
|
52
|
+
expect(config.rulesDir).toBe('.codex/docs');
|
|
53
|
+
expect(config.commandsDir).toBe('.codex/docs');
|
|
54
|
+
expect(config.templateSource).toBe('codex');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should have correct structure for cline', () => {
|
|
58
|
+
const config = ENV_CONFIG.cline;
|
|
59
|
+
expect(config.rulesDir).toBe('.clinerules/rules');
|
|
60
|
+
expect(config.commandsDir).toBe('.clinerules/commands');
|
|
61
|
+
expect(config.templateSource).toBe('cline');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should have all required properties for each environment', () => {
|
|
65
|
+
for (const env of Object.keys(ENV_CONFIG) as Environment[]) {
|
|
66
|
+
const config = ENV_CONFIG[env];
|
|
67
|
+
expect(config).toHaveProperty('rulesDir');
|
|
68
|
+
expect(config).toHaveProperty('commandsDir');
|
|
69
|
+
expect(config).toHaveProperty('templateSource');
|
|
70
|
+
expect(typeof config.rulesDir).toBe('string');
|
|
71
|
+
expect(typeof config.commandsDir).toBe('string');
|
|
72
|
+
expect(typeof config.templateSource).toBe('string');
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('getEnvironmentConfig', () => {
|
|
78
|
+
it('should return config for valid environment', () => {
|
|
79
|
+
const config = getEnvironmentConfig('claude');
|
|
80
|
+
expect(config).toBe(ENV_CONFIG.claude);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should return config for all supported environments', () => {
|
|
84
|
+
const environments: Environment[] = [
|
|
85
|
+
'claude',
|
|
86
|
+
'claude-agent',
|
|
87
|
+
'cursor',
|
|
88
|
+
'gemini',
|
|
89
|
+
'codex',
|
|
90
|
+
'cline',
|
|
91
|
+
];
|
|
92
|
+
for (const env of environments) {
|
|
93
|
+
const config = getEnvironmentConfig(env);
|
|
94
|
+
expect(config).toBeDefined();
|
|
95
|
+
expect(config).toBe(ENV_CONFIG[env]);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe('isSupportedEnvironment', () => {
|
|
101
|
+
it('should return true for supported environments', () => {
|
|
102
|
+
expect(isSupportedEnvironment('claude')).toBe(true);
|
|
103
|
+
expect(isSupportedEnvironment('claude-agent')).toBe(true);
|
|
104
|
+
expect(isSupportedEnvironment('cursor')).toBe(true);
|
|
105
|
+
expect(isSupportedEnvironment('gemini')).toBe(true);
|
|
106
|
+
expect(isSupportedEnvironment('codex')).toBe(true);
|
|
107
|
+
expect(isSupportedEnvironment('cline')).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('should return false for unsupported environments', () => {
|
|
111
|
+
expect(isSupportedEnvironment('invalid')).toBe(false);
|
|
112
|
+
expect(isSupportedEnvironment('vscode')).toBe(false);
|
|
113
|
+
expect(isSupportedEnvironment('')).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should work as type guard', () => {
|
|
117
|
+
const env: string = 'cursor';
|
|
118
|
+
if (isSupportedEnvironment(env)) {
|
|
119
|
+
// TypeScript should recognize env as Environment here
|
|
120
|
+
const config: EnvironmentConfig = ENV_CONFIG[env];
|
|
121
|
+
expect(config).toBeDefined();
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
describe('getSupportedEnvironments', () => {
|
|
127
|
+
it('should return all supported environments', () => {
|
|
128
|
+
const environments = getSupportedEnvironments();
|
|
129
|
+
expect(environments).toHaveLength(6);
|
|
130
|
+
expect(environments).toContain('claude');
|
|
131
|
+
expect(environments).toContain('claude-agent');
|
|
132
|
+
expect(environments).toContain('cursor');
|
|
133
|
+
expect(environments).toContain('gemini');
|
|
134
|
+
expect(environments).toContain('codex');
|
|
135
|
+
expect(environments).toContain('cline');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('should return array with correct type', () => {
|
|
139
|
+
const environments = getSupportedEnvironments();
|
|
140
|
+
expect(Array.isArray(environments)).toBe(true);
|
|
141
|
+
environments.forEach((env) => {
|
|
142
|
+
expect(isSupportedEnvironment(env)).toBe(true);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
supportedLanguages,
|
|
4
|
+
DEV_GUIDELINES_MAP,
|
|
5
|
+
getDevGuidelines,
|
|
6
|
+
isSupportedLanguage,
|
|
7
|
+
type SupportedLanguage
|
|
8
|
+
} from '../languages.js';
|
|
9
|
+
|
|
10
|
+
describe('languages', () => {
|
|
11
|
+
describe('supportedLanguages', () => {
|
|
12
|
+
it('should contain 12 languages', () => {
|
|
13
|
+
expect(supportedLanguages).toHaveLength(12);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should include expected languages', () => {
|
|
17
|
+
expect(supportedLanguages).toContain('ja');
|
|
18
|
+
expect(supportedLanguages).toContain('en');
|
|
19
|
+
expect(supportedLanguages).toContain('zh-TW');
|
|
20
|
+
expect(supportedLanguages).toContain('zh');
|
|
21
|
+
expect(supportedLanguages).toContain('es');
|
|
22
|
+
expect(supportedLanguages).toContain('pt');
|
|
23
|
+
expect(supportedLanguages).toContain('de');
|
|
24
|
+
expect(supportedLanguages).toContain('fr');
|
|
25
|
+
expect(supportedLanguages).toContain('ru');
|
|
26
|
+
expect(supportedLanguages).toContain('it');
|
|
27
|
+
expect(supportedLanguages).toContain('ko');
|
|
28
|
+
expect(supportedLanguages).toContain('ar');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('DEV_GUIDELINES_MAP', () => {
|
|
33
|
+
it('should have entries for all supported languages', () => {
|
|
34
|
+
for (const lang of supportedLanguages) {
|
|
35
|
+
expect(DEV_GUIDELINES_MAP[lang]).toBeDefined();
|
|
36
|
+
expect(DEV_GUIDELINES_MAP[lang]).not.toBe('');
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('should have English guideline', () => {
|
|
41
|
+
expect(DEV_GUIDELINES_MAP.en).toBe('- Think in English, generate responses in English');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should have Japanese guideline with bilingual instruction', () => {
|
|
45
|
+
expect(DEV_GUIDELINES_MAP.ja).toContain('Think in English');
|
|
46
|
+
expect(DEV_GUIDELINES_MAP.ja).toContain('日本語');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should contain bilingual instructions', () => {
|
|
50
|
+
// Most languages should mention "Think in English" in some form
|
|
51
|
+
const languagesWithEnglishInstruction = ['ja', 'en', 'es', 'pt', 'de', 'fr', 'ru', 'it', 'ko', 'ar'];
|
|
52
|
+
for (const lang of languagesWithEnglishInstruction) {
|
|
53
|
+
expect(DEV_GUIDELINES_MAP[lang as SupportedLanguage]).toContain('Think in English');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Chinese languages have their own format
|
|
57
|
+
expect(DEV_GUIDELINES_MAP['zh-TW']).toContain('以英文思考');
|
|
58
|
+
expect(DEV_GUIDELINES_MAP.zh).toContain('以英文思考');
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe('getDevGuidelines', () => {
|
|
63
|
+
it('should return guidelines for valid language', () => {
|
|
64
|
+
const guidelines = getDevGuidelines('ja');
|
|
65
|
+
expect(guidelines).toBe(DEV_GUIDELINES_MAP.ja);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should return guidelines for all supported languages', () => {
|
|
69
|
+
for (const lang of supportedLanguages) {
|
|
70
|
+
const guidelines = getDevGuidelines(lang);
|
|
71
|
+
expect(guidelines).toBeDefined();
|
|
72
|
+
expect(guidelines).toBe(DEV_GUIDELINES_MAP[lang]);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('isSupportedLanguage', () => {
|
|
78
|
+
it('should return true for supported languages', () => {
|
|
79
|
+
expect(isSupportedLanguage('ja')).toBe(true);
|
|
80
|
+
expect(isSupportedLanguage('en')).toBe(true);
|
|
81
|
+
expect(isSupportedLanguage('zh-TW')).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should return false for unsupported languages', () => {
|
|
85
|
+
expect(isSupportedLanguage('xx')).toBe(false);
|
|
86
|
+
expect(isSupportedLanguage('invalid')).toBe(false);
|
|
87
|
+
expect(isSupportedLanguage('')).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should work as type guard', () => {
|
|
91
|
+
const lang: string = 'ja';
|
|
92
|
+
if (isSupportedLanguage(lang)) {
|
|
93
|
+
// TypeScript should recognize lang as SupportedLanguage here
|
|
94
|
+
const guidelines: string = DEV_GUIDELINES_MAP[lang];
|
|
95
|
+
expect(guidelines).toBeDefined();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment configuration mapping for cc-sdd environments
|
|
3
|
+
*
|
|
4
|
+
* Issue #37: 環境別コピー実装
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export interface EnvironmentConfig {
|
|
8
|
+
rulesDir: string;
|
|
9
|
+
commandsDir: string;
|
|
10
|
+
templateSource: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type Environment =
|
|
14
|
+
| 'claude'
|
|
15
|
+
| 'claude-agent'
|
|
16
|
+
| 'cursor'
|
|
17
|
+
| 'gemini'
|
|
18
|
+
| 'codex'
|
|
19
|
+
| 'cline';
|
|
20
|
+
|
|
21
|
+
export const ENV_CONFIG: Record<Environment, EnvironmentConfig> = {
|
|
22
|
+
claude: {
|
|
23
|
+
rulesDir: '.claude/rules',
|
|
24
|
+
commandsDir: '.claude/commands/kiro',
|
|
25
|
+
templateSource: 'claude',
|
|
26
|
+
},
|
|
27
|
+
'claude-agent': {
|
|
28
|
+
rulesDir: '.claude/agents',
|
|
29
|
+
commandsDir: '.claude/commands/kiro',
|
|
30
|
+
templateSource: 'claude-agent',
|
|
31
|
+
},
|
|
32
|
+
cursor: {
|
|
33
|
+
rulesDir: '.cursor/rules',
|
|
34
|
+
commandsDir: '.cursor/commands/kiro',
|
|
35
|
+
templateSource: 'cursor',
|
|
36
|
+
},
|
|
37
|
+
gemini: {
|
|
38
|
+
rulesDir: '.gemini',
|
|
39
|
+
commandsDir: '.gemini/extensions',
|
|
40
|
+
templateSource: 'gemini',
|
|
41
|
+
},
|
|
42
|
+
codex: {
|
|
43
|
+
rulesDir: '.codex/docs',
|
|
44
|
+
commandsDir: '.codex/docs',
|
|
45
|
+
templateSource: 'codex',
|
|
46
|
+
},
|
|
47
|
+
cline: {
|
|
48
|
+
rulesDir: '.clinerules/rules',
|
|
49
|
+
commandsDir: '.clinerules/commands',
|
|
50
|
+
templateSource: 'cline',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get environment configuration
|
|
56
|
+
*
|
|
57
|
+
* @param env - Environment name
|
|
58
|
+
* @returns Environment configuration
|
|
59
|
+
*/
|
|
60
|
+
export const getEnvironmentConfig = (env: Environment): EnvironmentConfig => {
|
|
61
|
+
return ENV_CONFIG[env];
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Validate if an environment is supported
|
|
66
|
+
*
|
|
67
|
+
* @param env - Environment name to validate
|
|
68
|
+
* @returns True if supported, false otherwise
|
|
69
|
+
*/
|
|
70
|
+
export const isSupportedEnvironment = (env: string): env is Environment => {
|
|
71
|
+
return env in ENV_CONFIG;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get all supported environments
|
|
76
|
+
*
|
|
77
|
+
* @returns Array of supported environment names
|
|
78
|
+
*/
|
|
79
|
+
export const getSupportedEnvironments = (): Environment[] => {
|
|
80
|
+
return Object.keys(ENV_CONFIG) as Environment[];
|
|
81
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supported languages and development guidelines map
|
|
3
|
+
*
|
|
4
|
+
* Issue #37: 環境別コピー実装
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const supportedLanguages = [
|
|
8
|
+
'ja', 'en', 'zh-TW', 'zh', 'es', 'pt',
|
|
9
|
+
'de', 'fr', 'ru', 'it', 'ko', 'ar'
|
|
10
|
+
] as const;
|
|
11
|
+
|
|
12
|
+
export type SupportedLanguage = typeof supportedLanguages[number];
|
|
13
|
+
|
|
14
|
+
export const DEV_GUIDELINES_MAP: Record<SupportedLanguage, string> = {
|
|
15
|
+
en: '- Think in English, generate responses in English',
|
|
16
|
+
|
|
17
|
+
ja: '- Think in English, but generate responses in Japanese ' +
|
|
18
|
+
'(思考は英語、回答の生成は日本語で行うように)',
|
|
19
|
+
|
|
20
|
+
'zh-TW': '- 以英文思考,但以繁體中文生成回應' +
|
|
21
|
+
'(Think in English, generate in Traditional Chinese)',
|
|
22
|
+
|
|
23
|
+
zh: '- 以英文思考,但以简体中文生成回复' +
|
|
24
|
+
'(Think in English, generate in Simplified Chinese)',
|
|
25
|
+
|
|
26
|
+
es: '- Think in English, generate responses in Spanish ' +
|
|
27
|
+
'(Piensa en inglés, genera respuestas en español)',
|
|
28
|
+
|
|
29
|
+
pt: '- Think in English, generate responses in Portuguese ' +
|
|
30
|
+
'(Pense em inglês, gere respostas em português)',
|
|
31
|
+
|
|
32
|
+
de: '- Think in English, generate responses in German ' +
|
|
33
|
+
'(Denke auf Englisch, formuliere Antworten auf Deutsch)',
|
|
34
|
+
|
|
35
|
+
fr: '- Think in English, generate responses in French ' +
|
|
36
|
+
'(Pensez en anglais, générez des réponses en français)',
|
|
37
|
+
|
|
38
|
+
ru: '- Think in English, generate responses in Russian ' +
|
|
39
|
+
'(Думай по-английски, отвечай по-русски)',
|
|
40
|
+
|
|
41
|
+
it: '- Think in English, generate responses in Italian ' +
|
|
42
|
+
'(Pensa in inglese, genera risposte in italiano)',
|
|
43
|
+
|
|
44
|
+
ko: '- Think in English, generate responses in Korean ' +
|
|
45
|
+
'(영어로 사고하고, 한국어로 응답을 생성하세요)',
|
|
46
|
+
|
|
47
|
+
ar: '- Think in English, generate responses in Arabic ' +
|
|
48
|
+
'(فكر بالإنجليزية وأجب بالعربية)',
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get development guidelines for a specific language
|
|
53
|
+
*
|
|
54
|
+
* @param lang - Language code
|
|
55
|
+
* @returns Development guidelines string
|
|
56
|
+
*/
|
|
57
|
+
export const getDevGuidelines = (lang: SupportedLanguage): string => {
|
|
58
|
+
return DEV_GUIDELINES_MAP[lang];
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Validate if a language code is supported
|
|
63
|
+
*
|
|
64
|
+
* @param lang - Language code to validate
|
|
65
|
+
* @returns True if supported, false otherwise
|
|
66
|
+
*/
|
|
67
|
+
export const isSupportedLanguage = (lang: string): lang is SupportedLanguage => {
|
|
68
|
+
return (supportedLanguages as readonly string[]).includes(lang);
|
|
69
|
+
};
|
|
70
|
+
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* テストコマンド定数定義
|
|
3
|
+
*
|
|
4
|
+
* 各言語のテストコマンドをCI/CDテンプレートから取得
|
|
5
|
+
* Reference: templates/ci/github-actions/*.yml
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* プロジェクト言語の型定義
|
|
10
|
+
*/
|
|
11
|
+
export type ProjectLanguage =
|
|
12
|
+
| 'Node.js/TypeScript'
|
|
13
|
+
| 'Java'
|
|
14
|
+
| 'PHP'
|
|
15
|
+
| 'Python'
|
|
16
|
+
| 'Go'
|
|
17
|
+
| 'Rust';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* テストコマンドの型定義
|
|
21
|
+
*/
|
|
22
|
+
export interface TestCommands {
|
|
23
|
+
test: string;
|
|
24
|
+
lint: string;
|
|
25
|
+
build: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 言語別テストコマンドマッピング
|
|
30
|
+
* CI/CDテンプレート(templates/ci/github-actions/*.yml)から取得
|
|
31
|
+
*/
|
|
32
|
+
export const TEST_COMMANDS_MAP: Record<ProjectLanguage, TestCommands> = {
|
|
33
|
+
'Node.js/TypeScript': {
|
|
34
|
+
test: 'npm test',
|
|
35
|
+
lint: 'npm run lint',
|
|
36
|
+
build: 'npm run build'
|
|
37
|
+
},
|
|
38
|
+
'Java': {
|
|
39
|
+
test: './gradlew test',
|
|
40
|
+
lint: './gradlew checkstyleMain checkstyleTest',
|
|
41
|
+
build: './gradlew build'
|
|
42
|
+
},
|
|
43
|
+
'PHP': {
|
|
44
|
+
test: 'composer test',
|
|
45
|
+
lint: 'composer phpstan',
|
|
46
|
+
build: 'composer install --no-dev --optimize-autoloader'
|
|
47
|
+
},
|
|
48
|
+
'Python': {
|
|
49
|
+
test: 'pytest',
|
|
50
|
+
lint: 'flake8 src tests',
|
|
51
|
+
build: 'python -m build'
|
|
52
|
+
},
|
|
53
|
+
'Go': {
|
|
54
|
+
test: 'go test ./...',
|
|
55
|
+
lint: 'golangci-lint run',
|
|
56
|
+
build: 'go build ./...'
|
|
57
|
+
},
|
|
58
|
+
'Rust': {
|
|
59
|
+
test: 'cargo test',
|
|
60
|
+
lint: 'cargo clippy -- -D warnings',
|
|
61
|
+
build: 'cargo build --release'
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 言語に対応するテストコマンドを取得
|
|
67
|
+
*
|
|
68
|
+
* @param language - プロジェクト言語
|
|
69
|
+
* @returns テストコマンド一式
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* getTestCommands('Java') // => { test: './gradlew test', ... }
|
|
73
|
+
* getTestCommands('Node.js') // => { test: 'npm test', ... } (部分一致)
|
|
74
|
+
* getTestCommands('Unknown') // => Node.js/TypeScript のコマンド (デフォルト)
|
|
75
|
+
*/
|
|
76
|
+
export function getTestCommands(language: string): TestCommands {
|
|
77
|
+
// 完全一致
|
|
78
|
+
if (language in TEST_COMMANDS_MAP) {
|
|
79
|
+
return TEST_COMMANDS_MAP[language as ProjectLanguage];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 部分一致フォールバック("Node.js" → "Node.js/TypeScript")
|
|
83
|
+
const partialMatch = Object.keys(TEST_COMMANDS_MAP).find(key =>
|
|
84
|
+
key.toLowerCase().includes(language.toLowerCase()) ||
|
|
85
|
+
language.toLowerCase().includes(key.toLowerCase())
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
if (partialMatch) {
|
|
89
|
+
console.warn(`⚠️ 言語 "${language}" は部分一致で "${partialMatch}" として扱います`);
|
|
90
|
+
return TEST_COMMANDS_MAP[partialMatch as ProjectLanguage];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// デフォルト: Node.js/TypeScript
|
|
94
|
+
console.warn(`⚠️ 未知の言語 "${language}"。デフォルト(Node.js/TypeScript)を使用します`);
|
|
95
|
+
return TEST_COMMANDS_MAP['Node.js/TypeScript'];
|
|
96
|
+
}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* 新規プロジェクト自動セットアップスクリプト
|
|
4
4
|
*
|
|
5
|
+
* Issue #35: cc-sdd準拠の多環境対応基盤
|
|
6
|
+
* - templates/ディレクトリから読み込み
|
|
7
|
+
* - プレースホルダーはそのまま(実行時にAIが解釈)
|
|
8
|
+
*
|
|
5
9
|
* 使い方:
|
|
6
10
|
* npm run create-project -- \
|
|
7
11
|
* --name "20240115-payment-api" \
|
|
@@ -11,9 +15,10 @@
|
|
|
11
15
|
|
|
12
16
|
import { execSync } from 'child_process';
|
|
13
17
|
import { writeFileSync, mkdirSync, cpSync, existsSync } from 'fs';
|
|
14
|
-
import { resolve, join, dirname } from 'path';
|
|
18
|
+
import { resolve, join, dirname, basename } from 'path';
|
|
15
19
|
import { fileURLToPath } from 'url';
|
|
16
20
|
import { config as loadDotenv } from 'dotenv';
|
|
21
|
+
import { findTemplateFile, validateRequiredTemplates } from './utils/template-finder.js';
|
|
17
22
|
|
|
18
23
|
// ESモジュール対応: __dirnameの代替
|
|
19
24
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -203,46 +208,71 @@ async function createProject(config: ProjectConfig): Promise<void> {
|
|
|
203
208
|
writeFileSync('.kiro/project.json', JSON.stringify(projectJson, null, 2));
|
|
204
209
|
console.log(' ✅ project.json created');
|
|
205
210
|
|
|
206
|
-
// Step 8: Michi
|
|
207
|
-
console.log('\n📋 Step 8: Copying common files from Michi...');
|
|
211
|
+
// Step 8: Michiから共通ファイルをコピー(templates/から)
|
|
212
|
+
console.log('\n📋 Step 8: Copying common files from Michi templates...');
|
|
213
|
+
console.log(' ℹ️ Issue #35: cc-sdd compliant approach (placeholders preserved)');
|
|
208
214
|
const michiPath = resolve(__dirname, '..');
|
|
209
215
|
|
|
216
|
+
// 必須テンプレートのバリデーション
|
|
217
|
+
const requiredTemplates = [
|
|
218
|
+
'rules/github-ssot.mdc',
|
|
219
|
+
'rules/multi-project.mdc',
|
|
220
|
+
'commands/michi/confluence-sync.md',
|
|
221
|
+
'commands/michi/project-switch.md'
|
|
222
|
+
];
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
validateRequiredTemplates(michiPath, requiredTemplates);
|
|
226
|
+
} catch (error) {
|
|
227
|
+
console.error('\n❌ Template validation failed:');
|
|
228
|
+
console.error(` ${error instanceof Error ? error.message : String(error)}`);
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
|
|
210
232
|
// コピー先ディレクトリを事前に作成(actualProjectDir 配下に作成)
|
|
211
233
|
console.log(` 📂 Copying to: ${actualProjectDir}`);
|
|
212
234
|
mkdirSync(join(actualProjectDir, '.cursor/rules'), { recursive: true });
|
|
213
|
-
mkdirSync(join(actualProjectDir, '.cursor/commands/
|
|
235
|
+
mkdirSync(join(actualProjectDir, '.cursor/commands/michi'), { recursive: true });
|
|
214
236
|
mkdirSync(join(actualProjectDir, '.kiro/steering'), { recursive: true });
|
|
215
237
|
mkdirSync(join(actualProjectDir, '.kiro/settings/templates'), { recursive: true });
|
|
216
238
|
mkdirSync(join(actualProjectDir, 'scripts/utils'), { recursive: true });
|
|
217
239
|
|
|
218
|
-
//
|
|
240
|
+
// ルールファイル(templates/から)
|
|
219
241
|
const rulesToCopy = [
|
|
220
|
-
'multi-project.mdc',
|
|
221
|
-
'github-ssot.mdc',
|
|
222
|
-
'atlassian-mcp.mdc'
|
|
242
|
+
'rules/multi-project.mdc',
|
|
243
|
+
'rules/github-ssot.mdc',
|
|
244
|
+
'rules/atlassian-mcp.mdc'
|
|
223
245
|
];
|
|
224
246
|
|
|
225
|
-
for (const
|
|
226
|
-
const src =
|
|
227
|
-
const
|
|
228
|
-
|
|
247
|
+
for (const rulePath of rulesToCopy) {
|
|
248
|
+
const src = findTemplateFile(michiPath, rulePath);
|
|
249
|
+
const fileName = basename(rulePath);
|
|
250
|
+
const dest = join(actualProjectDir, '.cursor/rules', fileName);
|
|
251
|
+
|
|
252
|
+
if (src) {
|
|
229
253
|
cpSync(src, dest);
|
|
230
|
-
console.log(` ✅ Copied: .cursor/rules/${
|
|
254
|
+
console.log(` ✅ Copied: .cursor/rules/${fileName} (from templates/)`);
|
|
255
|
+
} else {
|
|
256
|
+
console.log(` ⚠️ ${fileName} not found in templates/`);
|
|
231
257
|
}
|
|
232
258
|
}
|
|
233
259
|
|
|
234
|
-
//
|
|
260
|
+
// カスタムコマンド(templates/から)
|
|
235
261
|
const commandsToCopy = [
|
|
236
|
-
'confluence-sync.md',
|
|
237
|
-
'project-switch.md'
|
|
262
|
+
'commands/michi/confluence-sync.md',
|
|
263
|
+
'commands/michi/project-switch.md'
|
|
238
264
|
];
|
|
239
265
|
|
|
240
|
-
for (const
|
|
241
|
-
const src =
|
|
242
|
-
const
|
|
243
|
-
|
|
266
|
+
for (const cmdPath of commandsToCopy) {
|
|
267
|
+
const src = findTemplateFile(michiPath, cmdPath);
|
|
268
|
+
const fileName = basename(cmdPath);
|
|
269
|
+
const dest = join(actualProjectDir, '.cursor/commands/michi', fileName);
|
|
270
|
+
|
|
271
|
+
if (src) {
|
|
244
272
|
cpSync(src, dest);
|
|
245
|
-
console.log(` ✅ Copied: .cursor/commands/
|
|
273
|
+
console.log(` ✅ Copied: .cursor/commands/michi/${fileName} (from templates/)`);
|
|
274
|
+
} else {
|
|
275
|
+
console.log(` ⚠️ ${fileName} not found in templates/`);
|
|
246
276
|
}
|
|
247
277
|
}
|
|
248
278
|
|
|
@@ -339,7 +369,7 @@ async function createProject(config: ProjectConfig): Promise<void> {
|
|
|
339
369
|
console.log(' 4. Cursor で開く: cursor .');
|
|
340
370
|
console.log(' 5. /kiro:spec-init <機能説明> で開発開始');
|
|
341
371
|
console.log('');
|
|
342
|
-
console.log('詳細: docs/new-repository-setup.md');
|
|
372
|
+
console.log('詳細: docs/getting-started/new-repository-setup.md');
|
|
343
373
|
|
|
344
374
|
} finally {
|
|
345
375
|
// 元の作業ディレクトリに戻る
|