@sk8metal/michi-cli 0.0.9 → 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 +27 -0
- package/README.md +235 -57
- package/dist/scripts/__tests__/create-project.test.js +24 -28
- package/dist/scripts/__tests__/create-project.test.js.map +1 -1
- package/dist/scripts/__tests__/jira-transitions.test.d.ts +5 -0
- package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/jira-transitions.test.js +172 -0
- package/dist/scripts/__tests__/jira-transitions.test.js.map +1 -0
- package/dist/scripts/__tests__/multi-project-estimate.test.js +14 -15
- package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -1
- package/dist/scripts/__tests__/setup-existing-project.test.js +79 -0
- package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
- package/dist/scripts/__tests__/setup-interactive.test.js +23 -17
- package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -1
- package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +5 -0
- package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/spec-impl-workflow.test.js +321 -0
- package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +1 -0
- package/dist/scripts/__tests__/spec-loader.test.d.ts +5 -0
- package/dist/scripts/__tests__/spec-loader.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/spec-loader.test.js +153 -0
- package/dist/scripts/__tests__/spec-loader.test.js.map +1 -0
- package/dist/scripts/__tests__/validate-phase.test.js +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.js +39 -5
- package/dist/scripts/constants/__tests__/environments.test.js.map +1 -1
- package/dist/scripts/constants/environments.d.ts +1 -1
- package/dist/scripts/constants/environments.d.ts.map +1 -1
- package/dist/scripts/constants/environments.js +22 -7
- package/dist/scripts/constants/environments.js.map +1 -1
- package/dist/scripts/constants/test-commands.d.ts +36 -0
- package/dist/scripts/constants/test-commands.d.ts.map +1 -0
- package/dist/scripts/constants/test-commands.js +70 -0
- package/dist/scripts/constants/test-commands.js.map +1 -0
- package/dist/scripts/jira-sync.d.ts +89 -3
- package/dist/scripts/jira-sync.d.ts.map +1 -1
- package/dist/scripts/jira-sync.js +366 -96
- package/dist/scripts/jira-sync.js.map +1 -1
- package/dist/scripts/markdown-to-confluence.js +1 -1
- package/dist/scripts/markdown-to-confluence.js.map +1 -1
- package/dist/scripts/phase-runner.d.ts +1 -1
- package/dist/scripts/phase-runner.d.ts.map +1 -1
- package/dist/scripts/phase-runner.js +809 -13
- package/dist/scripts/phase-runner.js.map +1 -1
- package/dist/scripts/pr-automation.d.ts.map +1 -1
- package/dist/scripts/pr-automation.js.map +1 -1
- package/dist/scripts/pre-flight-check.js +1 -1
- package/dist/scripts/pre-flight-check.js.map +1 -1
- package/dist/scripts/setup-existing-project.js +61 -29
- package/dist/scripts/setup-existing-project.js.map +1 -1
- package/dist/scripts/setup-interactive.js +3 -3
- package/dist/scripts/setup-interactive.js.map +1 -1
- package/dist/scripts/spec-impl-workflow.d.ts +94 -0
- package/dist/scripts/spec-impl-workflow.d.ts.map +1 -0
- package/dist/scripts/spec-impl-workflow.js +354 -0
- package/dist/scripts/spec-impl-workflow.js.map +1 -0
- package/dist/scripts/template/__tests__/renderer.test.js.map +1 -1
- package/dist/scripts/test-execution-generator.d.ts +52 -0
- package/dist/scripts/test-execution-generator.d.ts.map +1 -0
- package/dist/scripts/test-execution-generator.js +576 -0
- package/dist/scripts/test-execution-generator.js.map +1 -0
- package/dist/scripts/test-interactive.d.ts +10 -0
- package/dist/scripts/test-interactive.d.ts.map +1 -0
- package/dist/scripts/test-interactive.js +627 -0
- package/dist/scripts/test-interactive.js.map +1 -0
- package/dist/scripts/test-new-features.d.ts +5 -0
- package/dist/scripts/test-new-features.d.ts.map +1 -0
- package/dist/scripts/test-new-features.js +145 -0
- package/dist/scripts/test-new-features.js.map +1 -0
- package/dist/scripts/test-spec-generator.d.ts +29 -0
- package/dist/scripts/test-spec-generator.d.ts.map +1 -0
- package/dist/scripts/test-spec-generator.js +494 -0
- package/dist/scripts/test-spec-generator.js.map +1 -0
- package/dist/scripts/test-workflow-stages.d.ts +6 -0
- package/dist/scripts/test-workflow-stages.d.ts.map +1 -0
- package/dist/scripts/test-workflow-stages.js +43 -0
- package/dist/scripts/test-workflow-stages.js.map +1 -0
- package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/aidlc-parser.test.js +315 -0
- package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/business-days.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/business-days.test.js +171 -0
- package/dist/scripts/utils/__tests__/business-days.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/config-loader.test.js +1 -1
- package/dist/scripts/utils/__tests__/config-loader.test.js.map +1 -1
- package/dist/scripts/utils/__tests__/config-validator.test.js +164 -35
- package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
- package/dist/scripts/utils/__tests__/env-config.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/env-config.test.js +218 -0
- package/dist/scripts/utils/__tests__/env-config.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +202 -0
- package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/tasks-converter.test.js +500 -0
- package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +314 -0
- package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +1 -0
- package/dist/scripts/utils/__tests__/test-runner.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/test-runner.test.js +64 -0
- package/dist/scripts/utils/__tests__/test-runner.test.js.map +1 -0
- package/dist/scripts/utils/aidlc-parser.d.ts +86 -0
- package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -0
- package/dist/scripts/utils/aidlc-parser.js +208 -0
- package/dist/scripts/utils/aidlc-parser.js.map +1 -0
- package/dist/scripts/utils/business-days.d.ts +52 -0
- package/dist/scripts/utils/business-days.d.ts.map +1 -0
- package/dist/scripts/utils/business-days.js +98 -0
- package/dist/scripts/utils/business-days.js.map +1 -0
- package/dist/scripts/utils/ci-generator.d.ts +14 -0
- package/dist/scripts/utils/ci-generator.d.ts.map +1 -0
- package/dist/scripts/utils/ci-generator.js +61 -0
- package/dist/scripts/utils/ci-generator.js.map +1 -0
- package/dist/scripts/utils/config-loader.js +2 -2
- package/dist/scripts/utils/config-loader.js.map +1 -1
- package/dist/scripts/utils/config-validator.d.ts +7 -1
- package/dist/scripts/utils/config-validator.d.ts.map +1 -1
- package/dist/scripts/utils/config-validator.js +136 -23
- package/dist/scripts/utils/config-validator.js.map +1 -1
- package/dist/scripts/utils/confluence-approval.d.ts +46 -0
- package/dist/scripts/utils/confluence-approval.d.ts.map +1 -0
- package/dist/scripts/utils/confluence-approval.js +118 -0
- package/dist/scripts/utils/confluence-approval.js.map +1 -0
- package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
- package/dist/scripts/utils/confluence-hierarchy.js +1 -1
- package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
- package/dist/scripts/utils/docker-generator.d.ts +9 -0
- package/dist/scripts/utils/docker-generator.d.ts.map +1 -0
- package/dist/scripts/utils/docker-generator.js +132 -0
- package/dist/scripts/utils/docker-generator.js.map +1 -0
- package/dist/scripts/utils/docker-requirement-detector.d.ts +15 -0
- package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -0
- package/dist/scripts/utils/docker-requirement-detector.js +124 -0
- package/dist/scripts/utils/docker-requirement-detector.js.map +1 -0
- package/dist/scripts/utils/env-config.d.ts +54 -0
- package/dist/scripts/utils/env-config.d.ts.map +1 -0
- package/dist/scripts/utils/env-config.js +414 -0
- package/dist/scripts/utils/env-config.js.map +1 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.d.ts +70 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.js +147 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -0
- package/dist/scripts/utils/language-detector.d.ts +14 -0
- package/dist/scripts/utils/language-detector.d.ts.map +1 -0
- package/dist/scripts/utils/language-detector.js +119 -0
- package/dist/scripts/utils/language-detector.js.map +1 -0
- package/dist/scripts/utils/markdown-parser.d.ts +55 -0
- package/dist/scripts/utils/markdown-parser.d.ts.map +1 -0
- package/dist/scripts/utils/markdown-parser.js +289 -0
- package/dist/scripts/utils/markdown-parser.js.map +1 -0
- package/dist/scripts/utils/project-detector.d.ts +17 -0
- package/dist/scripts/utils/project-detector.d.ts.map +1 -0
- package/dist/scripts/utils/project-detector.js +166 -0
- package/dist/scripts/utils/project-detector.js.map +1 -0
- package/dist/scripts/utils/project-finder.js +2 -2
- package/dist/scripts/utils/project-finder.js.map +1 -1
- package/dist/scripts/utils/release-notes-generator.d.ts +56 -0
- package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -0
- package/dist/scripts/utils/release-notes-generator.js +162 -0
- package/dist/scripts/utils/release-notes-generator.js.map +1 -0
- package/dist/scripts/utils/spec-loader.d.ts +79 -0
- package/dist/scripts/utils/spec-loader.d.ts.map +1 -0
- package/dist/scripts/utils/spec-loader.js +80 -0
- package/dist/scripts/utils/spec-loader.js.map +1 -0
- package/dist/scripts/utils/spec-updater.d.ts +7 -0
- package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
- package/dist/scripts/utils/spec-updater.js.map +1 -1
- package/dist/scripts/utils/tasks-converter.d.ts +57 -0
- package/dist/scripts/utils/tasks-converter.d.ts.map +1 -0
- package/dist/scripts/utils/tasks-converter.js +322 -0
- package/dist/scripts/utils/tasks-converter.js.map +1 -0
- package/dist/scripts/utils/tasks-format-validator.d.ts +36 -0
- package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -0
- package/dist/scripts/utils/tasks-format-validator.js +158 -0
- package/dist/scripts/utils/tasks-format-validator.js.map +1 -0
- package/dist/scripts/utils/template-applier.d.ts +37 -0
- package/dist/scripts/utils/template-applier.d.ts.map +1 -0
- package/dist/scripts/utils/template-applier.js +129 -0
- package/dist/scripts/utils/template-applier.js.map +1 -0
- package/dist/scripts/utils/test-config-generator.d.ts +12 -0
- package/dist/scripts/utils/test-config-generator.d.ts.map +1 -0
- package/dist/scripts/utils/test-config-generator.js +185 -0
- package/dist/scripts/utils/test-config-generator.js.map +1 -0
- package/dist/scripts/utils/test-runner.d.ts +31 -0
- package/dist/scripts/utils/test-runner.d.ts.map +1 -0
- package/dist/scripts/utils/test-runner.js +103 -0
- package/dist/scripts/utils/test-runner.js.map +1 -0
- package/dist/scripts/validate-phase.d.ts +1 -1
- package/dist/scripts/validate-phase.d.ts.map +1 -1
- package/dist/scripts/validate-phase.js +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 +1 -1
- package/dist/src/__tests__/integration/setup/claude-agent.test.js +17 -20
- package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -1
- package/dist/src/__tests__/integration/setup/cursor.test.js +23 -19
- package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -1
- package/dist/src/__tests__/integration/setup/validation.test.js +41 -58
- package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +208 -18
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/setup-existing.d.ts +3 -0
- package/dist/src/commands/setup-existing.d.ts.map +1 -1
- package/dist/src/commands/setup-existing.js +334 -47
- package/dist/src/commands/setup-existing.js.map +1 -1
- package/docs/README.md +3 -1
- package/docs/context.md +59 -0
- package/docs/design-issue-55.md +240 -0
- package/docs/design-issue-56.md +181 -0
- package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
- package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
- package/docs/plan.md +275 -0
- package/docs/user-guide/getting-started/github-token-setup.md +509 -0
- package/docs/{getting-started → user-guide/getting-started}/quick-start.md +16 -0
- package/docs/{getting-started → user-guide/getting-started}/setup.md +28 -1
- package/docs/user-guide/guides/internationalization.md +540 -0
- package/docs/{guides → user-guide/guides}/multi-project.md +1 -1
- 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 +53 -40
- package/docs/user-guide/release/ci-setup.md +541 -0
- package/docs/user-guide/release/release-flow.md +476 -0
- package/docs/user-guide/templates/test-specs/README.md +173 -0
- package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
- package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
- package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
- package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
- package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
- package/docs/{testing → user-guide/testing}/integration-tests.md +24 -9
- package/docs/user-guide/testing/tdd-cycle.md +349 -0
- package/docs/user-guide/testing/test-execution-flow.md +396 -0
- package/docs/user-guide/testing/test-failure-handling.md +521 -0
- package/docs/user-guide/testing/test-planning-flow.md +181 -0
- package/docs/user-guide/testing-strategy.md +185 -0
- package/docs/verification-guide.md +518 -0
- package/package.json +7 -2
- package/scripts/__tests__/create-project.test.ts +67 -49
- package/scripts/__tests__/jira-transitions.test.ts +225 -0
- package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
- package/scripts/__tests__/setup-existing-project.test.ts +98 -1
- package/scripts/__tests__/setup-interactive.test.ts +52 -46
- package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
- package/scripts/__tests__/spec-loader.test.ts +199 -0
- package/scripts/__tests__/validate-phase.test.ts +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 +42 -6
- package/scripts/constants/environments.ts +33 -13
- package/scripts/constants/test-commands.ts +96 -0
- package/scripts/jira-sync.ts +767 -232
- package/scripts/markdown-to-confluence.ts +1 -1
- package/scripts/phase-runner.ts +1056 -63
- package/scripts/pr-automation.ts +0 -1
- package/scripts/pre-flight-check.ts +1 -1
- package/scripts/pre-publish-check.sh +311 -0
- package/scripts/quick-verify.sh +115 -0
- package/scripts/setup-existing-project.ts +201 -117
- package/scripts/setup-interactive.ts +4 -4
- package/scripts/spec-impl-workflow.ts +505 -0
- package/scripts/template/__tests__/renderer.test.ts +1 -2
- package/scripts/test-execution-generator.ts +695 -0
- package/scripts/test-interactive.ts +779 -0
- package/scripts/test-new-features.ts +168 -0
- package/scripts/test-npm-package.sh +345 -0
- package/scripts/test-spec-generator.ts +574 -0
- package/scripts/test-workflow-stages.ts +53 -0
- package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
- package/scripts/utils/__tests__/business-days.test.ts +214 -0
- package/scripts/utils/__tests__/config-loader.test.ts +1 -1
- package/scripts/utils/__tests__/config-validator.test.ts +309 -88
- package/scripts/utils/__tests__/env-config.test.ts +259 -0
- package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
- package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
- package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
- package/scripts/utils/__tests__/test-runner.test.ts +77 -0
- package/scripts/utils/aidlc-parser.ts +289 -0
- package/scripts/utils/business-days.ts +115 -0
- package/scripts/utils/ci-generator.ts +84 -0
- package/scripts/utils/config-loader.ts +2 -2
- package/scripts/utils/config-validator.ts +304 -117
- package/scripts/utils/confluence-approval.ts +167 -0
- package/scripts/utils/confluence-hierarchy.ts +2 -4
- package/scripts/utils/docker-generator.ts +151 -0
- package/scripts/utils/docker-requirement-detector.ts +153 -0
- package/scripts/utils/env-config.ts +526 -0
- package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
- package/scripts/utils/language-detector.ts +139 -0
- package/scripts/utils/markdown-parser.ts +376 -0
- package/scripts/utils/project-detector.ts +192 -0
- package/scripts/utils/project-finder.ts +2 -2
- package/scripts/utils/release-notes-generator.ts +210 -0
- package/scripts/utils/spec-loader.ts +125 -0
- package/scripts/utils/spec-updater.ts +8 -1
- package/scripts/utils/tasks-converter.ts +601 -0
- package/scripts/utils/tasks-format-validator.ts +193 -0
- package/scripts/utils/template-applier.ts +202 -0
- package/scripts/utils/test-config-generator.ts +210 -0
- package/scripts/utils/test-runner.ts +133 -0
- package/scripts/validate-phase.ts +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-agent/README.md +7 -1
- package/templates/claude-agent/agents/.gitkeep +0 -0
- package/templates/claude-agent/agents/designer.md +79 -0
- package/templates/claude-agent/agents/developer.md +68 -0
- package/templates/claude-agent/agents/manager-agent.md +59 -0
- package/templates/claude-agent/agents/tester.md +101 -0
- package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
- package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
- package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
- package/templates/cline/rules/atlassian-integration.md +36 -0
- package/templates/cline/rules/michi-core.md +56 -0
- package/templates/codex/AGENTS.override.md +277 -0
- package/templates/codex/prompts/confluence-sync.md +177 -0
- package/templates/codex/rules/README.md +210 -0
- package/templates/common/.kiro/project.json.template +21 -0
- package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
- package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
- package/templates/gemini/commands/README.md +41 -0
- package/templates/gemini/rules/GEMINI.md +80 -0
- package/docs/guides/workflow.md +0 -342
- package/docs/reference/config.md +0 -545
- package/scripts/setup-existing.sh +0 -279
- /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
- /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
- /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
- /package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +0 -0
- /package/docs/{guides → user-guide/guides}/customization.md +0 -0
- /package/docs/{reference → user-guide/reference}/tasks-template.md +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tasks.mdフォーマットバリデーター
|
|
3
|
+
*
|
|
4
|
+
* Michi Workflow構造に準拠しているかを検証
|
|
5
|
+
* - 新ワークフロー構造(Phase 0.1-0.2, 1, 2, A, 3, B, 4-5)を推奨
|
|
6
|
+
* - 旧6-Phase構造(Phase 0-5)も互換性のためサポート
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFileSync } from 'fs';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* tasks.mdのフォーマットを検証
|
|
13
|
+
*
|
|
14
|
+
* @param tasksPath - tasks.mdファイルのパス
|
|
15
|
+
* @throws {Error} フォーマットが不正な場合
|
|
16
|
+
*/
|
|
17
|
+
export function validateTasksFormat(tasksPath: string): void {
|
|
18
|
+
let content: string;
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
content = readFileSync(tasksPath, 'utf-8');
|
|
22
|
+
} catch (error) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
`Failed to read tasks.md: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 1. AI-DLCフォーマット検出(誤ったフォーマット)を最初にチェック
|
|
29
|
+
// より具体的なエラーメッセージを優先的に表示
|
|
30
|
+
// AI-DLCは "- [ ] 1." のようなフォーマットで、Phase構造がない
|
|
31
|
+
const hasCheckboxPattern = /^- \[ \] \d+\./m.test(content);
|
|
32
|
+
const hasPhaseStructure = content.includes('Phase 0:') || content.includes('Phase 0.1:');
|
|
33
|
+
|
|
34
|
+
if (hasCheckboxPattern && !hasPhaseStructure) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
'tasks.md appears to be in AI-DLC format instead of Michi workflow format.\n' +
|
|
37
|
+
'Detected "- [ ] 1." pattern without Phase structure.\n' +
|
|
38
|
+
'Please regenerate tasks.md using /kiro:spec-tasks command with correct template.',
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 2. フェーズ構造の検証(新旧両方をサポート)
|
|
43
|
+
|
|
44
|
+
// 新ワークフロー構造(推奨)
|
|
45
|
+
const newWorkflowPhases = [
|
|
46
|
+
'Phase 0.1:', // 要件定義
|
|
47
|
+
'Phase 0.2:', // 設計
|
|
48
|
+
'Phase 1:', // 環境構築(任意)
|
|
49
|
+
'Phase 2:', // TDD実装
|
|
50
|
+
'Phase A:', // PR前自動テスト(任意)
|
|
51
|
+
'Phase 3:', // 追加QA(任意)
|
|
52
|
+
'Phase B:', // リリース準備テスト(任意)
|
|
53
|
+
'Phase 4:', // リリース準備
|
|
54
|
+
'Phase 5:', // リリース
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
// 旧6-Phase構造(互換性のためサポート)
|
|
58
|
+
const legacyPhases = [
|
|
59
|
+
'Phase 0: 要件定義(Requirements)',
|
|
60
|
+
'Phase 1: 設計(Design)',
|
|
61
|
+
'Phase 2: 実装(Implementation)',
|
|
62
|
+
'Phase 3: 試験(Testing)',
|
|
63
|
+
'Phase 4: リリース準備(Release Preparation)',
|
|
64
|
+
'Phase 5: リリース(Release)',
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
// 新ワークフロー構造の必須フェーズ
|
|
68
|
+
const newRequiredPhases = ['Phase 0.1:', 'Phase 0.2:', 'Phase 2:', 'Phase 4:', 'Phase 5:'];
|
|
69
|
+
|
|
70
|
+
// 旧構造の検証
|
|
71
|
+
const hasLegacyStructure = legacyPhases.every((phase) => content.includes(phase));
|
|
72
|
+
|
|
73
|
+
// 新構造の検証(必須フェーズのみ)
|
|
74
|
+
const hasNewStructure = newRequiredPhases.every((phase) => content.includes(phase));
|
|
75
|
+
|
|
76
|
+
if (!hasLegacyStructure && !hasNewStructure) {
|
|
77
|
+
const missingNewPhases = newRequiredPhases.filter(
|
|
78
|
+
(phase) => !content.includes(phase),
|
|
79
|
+
);
|
|
80
|
+
const missingLegacyPhases = legacyPhases.filter(
|
|
81
|
+
(phase) => !content.includes(phase),
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
throw new Error(
|
|
85
|
+
'tasks.md does not match either workflow structure.\n\n' +
|
|
86
|
+
`Missing required phases (new workflow):\n${missingNewPhases.map((p) => ` - ${p}`).join('\n')}\n\n` +
|
|
87
|
+
`Missing phases (legacy workflow):\n${missingLegacyPhases.map((p) => ` - ${p}`).join('\n')}\n\n` +
|
|
88
|
+
'Please regenerate tasks.md using /kiro:spec-tasks command with the latest template.',
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 旧構造の場合は警告
|
|
93
|
+
if (hasLegacyStructure && !hasNewStructure) {
|
|
94
|
+
console.warn(
|
|
95
|
+
'⚠️ Warning: tasks.md uses legacy 6-phase structure (Phase 0-5).\n' +
|
|
96
|
+
' Consider migrating to the new workflow structure:\n' +
|
|
97
|
+
' - Phase 0.1: 要件定義\n' +
|
|
98
|
+
' - Phase 0.2: 設計\n' +
|
|
99
|
+
' - Phase 1: 環境構築(任意)\n' +
|
|
100
|
+
' - Phase 2: TDD実装\n' +
|
|
101
|
+
' - Phase A: PR前自動テスト(任意)\n' +
|
|
102
|
+
' - Phase 3: 追加QA(任意)\n' +
|
|
103
|
+
' - Phase B: リリース準備テスト(任意)\n' +
|
|
104
|
+
' - Phase 4: リリース準備\n' +
|
|
105
|
+
' - Phase 5: リリース\n' +
|
|
106
|
+
' See: docs/user-guide/guides/workflow.md',
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 3. Storyヘッダーのフォーマットチェック
|
|
111
|
+
const storyPattern = /### Story \d+\.\d+:/;
|
|
112
|
+
if (!storyPattern.test(content)) {
|
|
113
|
+
throw new Error(
|
|
114
|
+
'tasks.md does not contain valid Story headers.\n' +
|
|
115
|
+
'Expected format: "### Story X.Y: Title"\n' +
|
|
116
|
+
'Please regenerate tasks.md using /kiro:spec-tasks command.',
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 4. 営業日スケジュールのチェック(警告のみ)
|
|
121
|
+
const hasBusinessDayMention =
|
|
122
|
+
content.includes('営業日') ||
|
|
123
|
+
content.includes('business day') ||
|
|
124
|
+
content.includes('Day 1') ||
|
|
125
|
+
content.includes('Day 2');
|
|
126
|
+
|
|
127
|
+
if (!hasBusinessDayMention) {
|
|
128
|
+
console.warn(
|
|
129
|
+
'⚠️ Warning: tasks.md does not mention business days or day numbering.\n' +
|
|
130
|
+
' Michi expects tasks to include business day schedule (Day 1, Day 2, etc.).\n' +
|
|
131
|
+
' This may cause validation warnings during JIRA sync.',
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// 5. フェーズヘッダーのフォーマットチェック(ラベル括弧付き)
|
|
136
|
+
const phaseHeaderPattern = /## Phase \d+: .+(.+)/;
|
|
137
|
+
if (!phaseHeaderPattern.test(content)) {
|
|
138
|
+
console.warn(
|
|
139
|
+
'⚠️ Warning: Phase headers may not have correct format.\n' +
|
|
140
|
+
' Expected format: "## Phase X: Name(Label)"\n' +
|
|
141
|
+
' Labels in parentheses are required for JIRA label detection.',
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* tasks.mdが存在し、かつ有効なフォーマットかをチェック
|
|
148
|
+
*
|
|
149
|
+
* @param tasksPath - tasks.mdファイルのパス
|
|
150
|
+
* @returns {boolean} 有効な場合true
|
|
151
|
+
*/
|
|
152
|
+
export function isValidTasksFormat(tasksPath: string): boolean {
|
|
153
|
+
try {
|
|
154
|
+
validateTasksFormat(tasksPath);
|
|
155
|
+
return true;
|
|
156
|
+
} catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* tasks.mdに含まれるフェーズ数を取得
|
|
163
|
+
*
|
|
164
|
+
* @param tasksPath - tasks.mdファイルのパス
|
|
165
|
+
* @returns {number} 検出されたフェーズ数
|
|
166
|
+
*/
|
|
167
|
+
export function countPhases(tasksPath: string): number {
|
|
168
|
+
try {
|
|
169
|
+
const content = readFileSync(tasksPath, 'utf-8');
|
|
170
|
+
const phasePattern = /## Phase \d+:/g;
|
|
171
|
+
const matches = content.match(phasePattern);
|
|
172
|
+
return matches ? matches.length : 0;
|
|
173
|
+
} catch {
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* tasks.mdに含まれるStory数を取得
|
|
180
|
+
*
|
|
181
|
+
* @param tasksPath - tasks.mdファイルのパス
|
|
182
|
+
* @returns {number} 検出されたStory数
|
|
183
|
+
*/
|
|
184
|
+
export function countStories(tasksPath: string): number {
|
|
185
|
+
try {
|
|
186
|
+
const content = readFileSync(tasksPath, 'utf-8');
|
|
187
|
+
const storyPattern = /### Story \d+\.\d+:/g;
|
|
188
|
+
const matches = content.match(storyPattern);
|
|
189
|
+
return matches ? matches.length : 0;
|
|
190
|
+
} catch {
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* テンプレート適用エンジン
|
|
3
|
+
* テスト仕様書テンプレートにデータを適用
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import type { Component, Flow, Requirement } from './markdown-parser.js';
|
|
10
|
+
|
|
11
|
+
// ES module で __dirname を取得
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
|
|
15
|
+
export interface TestCase {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
preconditions: string[];
|
|
20
|
+
steps: string[];
|
|
21
|
+
expectedResults: string[];
|
|
22
|
+
type: 'normal' | 'error' | 'edge';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface TemplateData {
|
|
26
|
+
feature: string;
|
|
27
|
+
testType: string;
|
|
28
|
+
author?: string;
|
|
29
|
+
date: string;
|
|
30
|
+
purpose?: string;
|
|
31
|
+
scope?: string;
|
|
32
|
+
tool?: string;
|
|
33
|
+
version?: string;
|
|
34
|
+
testCases: TestCase[];
|
|
35
|
+
components?: Component[];
|
|
36
|
+
flows?: Flow[];
|
|
37
|
+
requirements?: Requirement[];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* テスト仕様書テンプレートを読み込む
|
|
42
|
+
*/
|
|
43
|
+
export function loadTestSpecTemplate(testType: string, projectRoot: string = process.cwd()): string {
|
|
44
|
+
const templatePath = join(
|
|
45
|
+
projectRoot,
|
|
46
|
+
'.kiro',
|
|
47
|
+
'settings',
|
|
48
|
+
'templates',
|
|
49
|
+
'test-specs',
|
|
50
|
+
`${testType}-test-spec-template.md`
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
// プロジェクトのテンプレートが存在しない場合、Michiのテンプレートを使用
|
|
54
|
+
if (!existsSync(templatePath)) {
|
|
55
|
+
const michiTemplatePath = join(
|
|
56
|
+
__dirname,
|
|
57
|
+
'..',
|
|
58
|
+
'..',
|
|
59
|
+
'docs',
|
|
60
|
+
'user-guide',
|
|
61
|
+
'templates',
|
|
62
|
+
'test-specs',
|
|
63
|
+
`${testType}-test-spec-template.md`
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
if (existsSync(michiTemplatePath)) {
|
|
67
|
+
return readFileSync(michiTemplatePath, 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
throw new Error(`テンプレートが見つかりません: ${testType}-test-spec-template.md`);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return readFileSync(templatePath, 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* テンプレートにデータを適用
|
|
78
|
+
*/
|
|
79
|
+
export function applyTemplate(template: string, data: TemplateData): string {
|
|
80
|
+
let result = template;
|
|
81
|
+
|
|
82
|
+
// 基本情報の置換
|
|
83
|
+
result = result.replace(/\{\{TEST_NAME\}\}/g, `${data.feature} ${data.testType}テスト`);
|
|
84
|
+
result = result.replace(/\{\{AUTHOR\}\}/g, data.author || 'Auto-generated');
|
|
85
|
+
result = result.replace(/\{\{DATE\}\}/g, data.date);
|
|
86
|
+
result = result.replace(/\{\{PURPOSE\}\}/g, data.purpose || `${data.feature}の${data.testType}テストを実施する`);
|
|
87
|
+
result = result.replace(/\{\{SCOPE\}\}/g, data.scope || `${data.feature}の全コンポーネント`);
|
|
88
|
+
result = result.replace(/\{\{TOOL_NAME\}\}/g, data.tool || 'Vitest');
|
|
89
|
+
result = result.replace(/\{\{VERSION\}\}/g, data.version || '1.0.0');
|
|
90
|
+
|
|
91
|
+
// 言語・フレームワーク情報
|
|
92
|
+
result = result.replace(/\{\{LANGUAGE\}\}/g, 'TypeScript');
|
|
93
|
+
result = result.replace(/\{\{LANGUAGE_VERSION\}\}/g, '5.x');
|
|
94
|
+
result = result.replace(/\{\{FRAMEWORK\}\}/g, 'Vitest');
|
|
95
|
+
result = result.replace(/\{\{FRAMEWORK_VERSION\}\}/g, '1.0.0');
|
|
96
|
+
result = result.replace(/\{\{MOCKING_LIBRARY\}\}/g, 'Vitest (built-in)');
|
|
97
|
+
result = result.replace(/\{\{DEPENDENCIES\}\}/g, 'Node.js 20+');
|
|
98
|
+
|
|
99
|
+
// テストデータパス
|
|
100
|
+
result = result.replace(/\{\{MOCK_DATA_PATH\}\}/g, `tests/__mocks__/${data.feature}`);
|
|
101
|
+
result = result.replace(/\{\{FIXTURES_PATH\}\}/g, `tests/__fixtures__/${data.feature}`);
|
|
102
|
+
result = result.replace(/\{\{DATA_SETUP_DESCRIPTION\}\}/g, 'モックデータはJSONファイルで管理');
|
|
103
|
+
|
|
104
|
+
// カバレッジ目標
|
|
105
|
+
result = result.replace(/\{\{TARGET_COVERAGE\}\}/g, '95');
|
|
106
|
+
result = result.replace(/\{\{MIN_COVERAGE\}\}/g, '80');
|
|
107
|
+
result = result.replace(/\{\{COVERAGE_REPORT_PATH\}\}/g, 'coverage/lcov.info');
|
|
108
|
+
result = result.replace(/\{\{HTML_REPORT_PATH\}\}/g, 'coverage/index.html');
|
|
109
|
+
|
|
110
|
+
// コンポーネント一覧テーブルの生成
|
|
111
|
+
if (data.components && data.components.length > 0) {
|
|
112
|
+
const componentTable = generateComponentTable(data.components);
|
|
113
|
+
result = result.replace(/\|\s*\{\{COMPONENT_1\}\}\s*\|.*?\n/, componentTable);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// テストケースセクションの生成
|
|
117
|
+
if (data.testCases && data.testCases.length > 0) {
|
|
118
|
+
const testCasesSection = generateTestCasesSection(data.testCases);
|
|
119
|
+
result = replaceTestCasesSection(result, testCasesSection);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// 残りのプレースホルダーをクリーンアップ
|
|
123
|
+
result = cleanupPlaceholders(result);
|
|
124
|
+
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* コンポーネント一覧テーブルを生成
|
|
130
|
+
*/
|
|
131
|
+
function generateComponentTable(components: Component[]): string {
|
|
132
|
+
let table = '';
|
|
133
|
+
|
|
134
|
+
for (const component of components) {
|
|
135
|
+
const priority = component.requirements.length > 3 ? 'High' : 'Medium';
|
|
136
|
+
table += `| ${component.name} | Class | ${component.intent} | ${priority} |\n`;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return table;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* テストケースセクションを生成
|
|
144
|
+
*/
|
|
145
|
+
function generateTestCasesSection(testCases: TestCase[]): string {
|
|
146
|
+
let section = '';
|
|
147
|
+
|
|
148
|
+
for (const tc of testCases) {
|
|
149
|
+
section += `\n### Test Case ${tc.id}: ${tc.name}\n\n`;
|
|
150
|
+
section += `**Description**: ${tc.description}\n\n`;
|
|
151
|
+
|
|
152
|
+
if (tc.preconditions.length > 0) {
|
|
153
|
+
section += '**Preconditions**:\n';
|
|
154
|
+
tc.preconditions.forEach(p => section += `- ${p}\n`);
|
|
155
|
+
section += '\n';
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
section += '**Test Steps**:\n';
|
|
159
|
+
tc.steps.forEach((step, idx) => section += `${idx + 1}. ${step}\n`);
|
|
160
|
+
section += '\n';
|
|
161
|
+
|
|
162
|
+
section += '**Expected Results**:\n';
|
|
163
|
+
tc.expectedResults.forEach(r => section += `- ${r}\n`);
|
|
164
|
+
section += '\n';
|
|
165
|
+
|
|
166
|
+
section += '**Actual Results**:\n';
|
|
167
|
+
section += '[To be filled during test execution]\n\n';
|
|
168
|
+
|
|
169
|
+
section += '**Status**: [ ] Pass / [ ] Fail / [ ] Blocked\n\n';
|
|
170
|
+
section += '**Notes**:\n\n';
|
|
171
|
+
section += '---\n\n';
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return section;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* テストケースセクションを置換
|
|
179
|
+
*/
|
|
180
|
+
function replaceTestCasesSection(template: string, testCasesSection: string): string {
|
|
181
|
+
// "## 4. Test Cases"セクションを検索して置換
|
|
182
|
+
const sectionMatch = template.match(/##\s+4\.\s+Test Cases[\s\S]*?(?=##\s+\d+\.|$)/);
|
|
183
|
+
|
|
184
|
+
if (sectionMatch) {
|
|
185
|
+
return template.replace(sectionMatch[0], `## 4. Test Cases\n${testCasesSection}`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// セクションが見つからない場合は末尾に追加
|
|
189
|
+
return template + `\n\n## 4. Test Cases\n${testCasesSection}`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* プレースホルダーをクリーンアップ
|
|
194
|
+
*/
|
|
195
|
+
function cleanupPlaceholders(content: string): string {
|
|
196
|
+
// 残っているプレースホルダーを削除または空文字に置換
|
|
197
|
+
return content
|
|
198
|
+
.replace(/\{\{[A-Z_0-9]+\}\}/g, '')
|
|
199
|
+
.replace(/\|\s*\|\s*\|\s*\|/g, '') // 空のテーブル行を削除
|
|
200
|
+
.replace(/\n{3,}/g, '\n\n'); // 連続する空行を2行に制限
|
|
201
|
+
}
|
|
202
|
+
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* テスト設定生成ユーティリティ
|
|
3
|
+
* プロジェクトの言語に応じてテストフレームワーク設定を生成
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { writeFileSync, existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
|
|
9
|
+
export interface TestConfig {
|
|
10
|
+
language: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* テストフレームワーク設定ファイルを生成
|
|
15
|
+
*/
|
|
16
|
+
export async function generateTestConfig(
|
|
17
|
+
feature: string,
|
|
18
|
+
config: TestConfig,
|
|
19
|
+
projectRoot: string = process.cwd()
|
|
20
|
+
): Promise<void> {
|
|
21
|
+
const { language } = config;
|
|
22
|
+
|
|
23
|
+
switch (language) {
|
|
24
|
+
case 'Node.js/TypeScript':
|
|
25
|
+
await generateVitestConfig(projectRoot);
|
|
26
|
+
break;
|
|
27
|
+
case 'Java':
|
|
28
|
+
await generateJUnitConfig(projectRoot);
|
|
29
|
+
break;
|
|
30
|
+
case 'PHP':
|
|
31
|
+
await generatePHPUnitConfig(projectRoot);
|
|
32
|
+
break;
|
|
33
|
+
case 'Python':
|
|
34
|
+
await generatePytestConfig(projectRoot);
|
|
35
|
+
break;
|
|
36
|
+
case 'Go':
|
|
37
|
+
console.log(' ℹ️ Goは標準のtestingパッケージを使用(設定不要)');
|
|
38
|
+
break;
|
|
39
|
+
case 'Rust':
|
|
40
|
+
console.log(' ℹ️ Rustは標準のcargo testを使用(設定不要)');
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
console.log(' ⏭️ テスト設定: スキップ(言語不明)');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Vitest設定を生成(Node.js/TypeScript)
|
|
49
|
+
*/
|
|
50
|
+
async function generateVitestConfig(projectRoot: string): Promise<void> {
|
|
51
|
+
const outputPath = join(projectRoot, 'vitest.config.ts');
|
|
52
|
+
|
|
53
|
+
// 既存の設定ファイルがある場合はスキップ
|
|
54
|
+
if (existsSync(outputPath)) {
|
|
55
|
+
console.log(' ℹ️ vitest.config.ts: 既存(スキップ)');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const config = `import { defineConfig } from 'vitest/config';
|
|
60
|
+
|
|
61
|
+
export default defineConfig({
|
|
62
|
+
test: {
|
|
63
|
+
globals: true,
|
|
64
|
+
environment: 'node',
|
|
65
|
+
coverage: {
|
|
66
|
+
provider: 'v8',
|
|
67
|
+
reporter: ['text', 'json', 'html', 'lcov'],
|
|
68
|
+
exclude: [
|
|
69
|
+
'node_modules/',
|
|
70
|
+
'dist/',
|
|
71
|
+
'**/*.d.ts',
|
|
72
|
+
'**/*.config.*',
|
|
73
|
+
'**/mockData',
|
|
74
|
+
'tests/fixtures'
|
|
75
|
+
],
|
|
76
|
+
thresholds: {
|
|
77
|
+
lines: 80,
|
|
78
|
+
functions: 80,
|
|
79
|
+
branches: 80,
|
|
80
|
+
statements: 80
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
`;
|
|
86
|
+
|
|
87
|
+
writeFileSync(outputPath, config, 'utf-8');
|
|
88
|
+
console.log(' ✅ テスト設定: vitest.config.ts');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* JUnit設定を生成(Java)
|
|
93
|
+
*/
|
|
94
|
+
async function generateJUnitConfig(projectRoot: string): Promise<void> {
|
|
95
|
+
const outputPath = join(projectRoot, 'build.gradle');
|
|
96
|
+
|
|
97
|
+
// 既存のbuild.gradleがある場合はスキップ
|
|
98
|
+
if (!existsSync(outputPath)) {
|
|
99
|
+
const config = `plugins {
|
|
100
|
+
id 'java'
|
|
101
|
+
id 'jacoco'
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
group = 'com.example'
|
|
105
|
+
version = '1.0.0'
|
|
106
|
+
sourceCompatibility = '17'
|
|
107
|
+
|
|
108
|
+
repositories {
|
|
109
|
+
mavenCentral()
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
dependencies {
|
|
113
|
+
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
|
|
114
|
+
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
test {
|
|
118
|
+
useJUnitPlatform()
|
|
119
|
+
finalizedBy jacocoTestReport
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
jacoco {
|
|
123
|
+
toolVersion = "0.8.11"
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
jacocoTestReport {
|
|
127
|
+
dependsOn test
|
|
128
|
+
reports {
|
|
129
|
+
xml.required = true
|
|
130
|
+
html.required = true
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
`;
|
|
134
|
+
|
|
135
|
+
writeFileSync(outputPath, config, 'utf-8');
|
|
136
|
+
console.log(' ✅ テスト設定: build.gradle');
|
|
137
|
+
} else {
|
|
138
|
+
console.log(' ℹ️ build.gradle: 既存(スキップ)');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* PHPUnit設定を生成(PHP)
|
|
144
|
+
*/
|
|
145
|
+
async function generatePHPUnitConfig(projectRoot: string): Promise<void> {
|
|
146
|
+
const outputPath = join(projectRoot, 'phpunit.xml');
|
|
147
|
+
|
|
148
|
+
// 既存の設定ファイルがある場合はスキップ
|
|
149
|
+
if (existsSync(outputPath)) {
|
|
150
|
+
console.log(' ℹ️ phpunit.xml: 既存(スキップ)');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const config = `<?xml version="1.0" encoding="UTF-8"?>
|
|
155
|
+
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
156
|
+
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
|
157
|
+
bootstrap="vendor/autoload.php"
|
|
158
|
+
colors="true">
|
|
159
|
+
<testsuites>
|
|
160
|
+
<testsuite name="Unit">
|
|
161
|
+
<directory suffix="Test.php">./tests/Unit</directory>
|
|
162
|
+
</testsuite>
|
|
163
|
+
<testsuite name="Feature">
|
|
164
|
+
<directory suffix="Test.php">./tests/Feature</directory>
|
|
165
|
+
</testsuite>
|
|
166
|
+
</testsuites>
|
|
167
|
+
<coverage>
|
|
168
|
+
<report>
|
|
169
|
+
<html outputDirectory="coverage/html"/>
|
|
170
|
+
<clover outputFile="coverage/clover.xml"/>
|
|
171
|
+
</report>
|
|
172
|
+
</coverage>
|
|
173
|
+
</phpunit>
|
|
174
|
+
`;
|
|
175
|
+
|
|
176
|
+
writeFileSync(outputPath, config, 'utf-8');
|
|
177
|
+
console.log(' ✅ テスト設定: phpunit.xml');
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Pytest設定を生成(Python)
|
|
182
|
+
*/
|
|
183
|
+
async function generatePytestConfig(projectRoot: string): Promise<void> {
|
|
184
|
+
const outputPath = join(projectRoot, 'pytest.ini');
|
|
185
|
+
|
|
186
|
+
// 既存の設定ファイルがある場合はスキップ
|
|
187
|
+
if (existsSync(outputPath)) {
|
|
188
|
+
console.log(' ℹ️ pytest.ini: 既存(スキップ)');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const config = `[pytest]
|
|
193
|
+
testpaths = tests
|
|
194
|
+
python_files = test_*.py
|
|
195
|
+
python_classes = Test*
|
|
196
|
+
python_functions = test_*
|
|
197
|
+
|
|
198
|
+
# Coverage settings
|
|
199
|
+
addopts =
|
|
200
|
+
--cov=src
|
|
201
|
+
--cov-report=html
|
|
202
|
+
--cov-report=xml
|
|
203
|
+
--cov-report=term-missing
|
|
204
|
+
--cov-fail-under=80
|
|
205
|
+
`;
|
|
206
|
+
|
|
207
|
+
writeFileSync(outputPath, config, 'utf-8');
|
|
208
|
+
console.log(' ✅ テスト設定: pytest.ini');
|
|
209
|
+
}
|
|
210
|
+
|