@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,574 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* テスト仕様書生成エンジン
|
|
3
|
+
* requirements.mdとdesign.mdからテスト仕様書を自動生成
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import {
|
|
9
|
+
extractComponents,
|
|
10
|
+
extractFlows,
|
|
11
|
+
extractRequirements,
|
|
12
|
+
type Component,
|
|
13
|
+
type Flow,
|
|
14
|
+
type Requirement
|
|
15
|
+
} from './utils/markdown-parser.js';
|
|
16
|
+
import {
|
|
17
|
+
loadTestSpecTemplate,
|
|
18
|
+
applyTemplate,
|
|
19
|
+
type TestCase,
|
|
20
|
+
type TemplateData
|
|
21
|
+
} from './utils/template-applier.js';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 単体テスト仕様書を生成
|
|
25
|
+
*/
|
|
26
|
+
export async function generateUnitTestSpec(feature: string, projectRoot: string = process.cwd()): Promise<string> {
|
|
27
|
+
const requirementsPath = join(projectRoot, '.kiro', 'specs', feature, 'requirements.md');
|
|
28
|
+
const designPath = join(projectRoot, '.kiro', 'specs', feature, 'design.md');
|
|
29
|
+
|
|
30
|
+
if (!existsSync(designPath)) {
|
|
31
|
+
throw new Error(`design.mdが見つかりません: ${designPath}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const designMd = readFileSync(designPath, 'utf-8');
|
|
35
|
+
const components = extractComponents(designMd);
|
|
36
|
+
|
|
37
|
+
// 各コンポーネントのメソッドから単体テストケースを生成
|
|
38
|
+
const testCases: TestCase[] = [];
|
|
39
|
+
let tcCounter = 1;
|
|
40
|
+
|
|
41
|
+
for (const component of components) {
|
|
42
|
+
for (const method of component.methods) {
|
|
43
|
+
// 正常系テストケース
|
|
44
|
+
testCases.push({
|
|
45
|
+
id: `UT-${String(tcCounter++).padStart(3, '0')}`,
|
|
46
|
+
name: `${component.name}.${method.name} - 正常系`,
|
|
47
|
+
description: `${component.name}の${method.name}メソッドが正常に動作することを確認`,
|
|
48
|
+
preconditions: [
|
|
49
|
+
`${component.name}が初期化されている`,
|
|
50
|
+
'有効な入力パラメータが準備されている'
|
|
51
|
+
],
|
|
52
|
+
steps: [
|
|
53
|
+
`有効なパラメータで${method.name}()を呼び出す`,
|
|
54
|
+
'戻り値を確認する',
|
|
55
|
+
'エラーが発生しないことを確認する'
|
|
56
|
+
],
|
|
57
|
+
expectedResults: [
|
|
58
|
+
`期待される${method.returnType}型の値が返される`,
|
|
59
|
+
'例外が発生しない'
|
|
60
|
+
],
|
|
61
|
+
type: 'normal'
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// 異常系テストケース: null/undefined
|
|
65
|
+
if (method.parameters.length > 0) {
|
|
66
|
+
testCases.push({
|
|
67
|
+
id: `UT-${String(tcCounter++).padStart(3, '0')}`,
|
|
68
|
+
name: `${component.name}.${method.name} - 異常系(null入力)`,
|
|
69
|
+
description: 'null入力時に適切なエラーハンドリングが行われることを確認',
|
|
70
|
+
preconditions: [
|
|
71
|
+
`${component.name}が初期化されている`
|
|
72
|
+
],
|
|
73
|
+
steps: [
|
|
74
|
+
`${method.parameters[0].name}にnullを渡して${method.name}()を呼び出す`,
|
|
75
|
+
'エラーが発生することを確認する'
|
|
76
|
+
],
|
|
77
|
+
expectedResults: [
|
|
78
|
+
'適切なエラーメッセージが表示される',
|
|
79
|
+
'システムがクラッシュしない'
|
|
80
|
+
],
|
|
81
|
+
type: 'error'
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// エッジケーステストケース
|
|
86
|
+
if (method.parameters.some(p => p.type.includes('string'))) {
|
|
87
|
+
testCases.push({
|
|
88
|
+
id: `UT-${String(tcCounter++).padStart(3, '0')}`,
|
|
89
|
+
name: `${component.name}.${method.name} - エッジケース(空文字列)`,
|
|
90
|
+
description: '空文字列入力時の動作を確認',
|
|
91
|
+
preconditions: [
|
|
92
|
+
`${component.name}が初期化されている`
|
|
93
|
+
],
|
|
94
|
+
steps: [
|
|
95
|
+
'空文字列を渡して${method.name}()を呼び出す',
|
|
96
|
+
'戻り値またはエラーを確認する'
|
|
97
|
+
],
|
|
98
|
+
expectedResults: [
|
|
99
|
+
'バリデーションエラーが発生する、または適切なデフォルト値が返される'
|
|
100
|
+
],
|
|
101
|
+
type: 'edge'
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const templateData: TemplateData = {
|
|
108
|
+
feature,
|
|
109
|
+
testType: 'unit',
|
|
110
|
+
date: new Date().toISOString().split('T')[0],
|
|
111
|
+
purpose: `${feature}の各コンポーネントが独立して正常に動作することを確認する`,
|
|
112
|
+
scope: `${feature}の全コンポーネント(${components.map(c => c.name).join(', ')})`,
|
|
113
|
+
testCases,
|
|
114
|
+
components
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const template = loadTestSpecTemplate('unit', projectRoot);
|
|
118
|
+
return applyTemplate(template, templateData);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 統合テスト仕様書を生成
|
|
123
|
+
*/
|
|
124
|
+
export async function generateIntegrationTestSpec(feature: string, projectRoot: string = process.cwd()): Promise<string> {
|
|
125
|
+
const designPath = join(projectRoot, '.kiro', 'specs', feature, 'design.md');
|
|
126
|
+
|
|
127
|
+
if (!existsSync(designPath)) {
|
|
128
|
+
throw new Error(`design.mdが見つかりません: ${designPath}`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const designMd = readFileSync(designPath, 'utf-8');
|
|
132
|
+
const flows = extractFlows(designMd);
|
|
133
|
+
const components = extractComponents(designMd);
|
|
134
|
+
|
|
135
|
+
// システムフローから統合テストケースを生成
|
|
136
|
+
const testCases: TestCase[] = [];
|
|
137
|
+
let tcCounter = 1;
|
|
138
|
+
|
|
139
|
+
for (const flow of flows) {
|
|
140
|
+
// 成功フローテストケース
|
|
141
|
+
testCases.push({
|
|
142
|
+
id: `IT-${String(tcCounter++).padStart(3, '0')}`,
|
|
143
|
+
name: `${flow.name} - 成功フロー`,
|
|
144
|
+
description: `${flow.name}が正常に完了することを確認`,
|
|
145
|
+
preconditions: [
|
|
146
|
+
'すべての依存コンポーネントが起動している',
|
|
147
|
+
'テストデータが準備されている'
|
|
148
|
+
],
|
|
149
|
+
steps: [
|
|
150
|
+
'フローを開始する',
|
|
151
|
+
'各ステップが順番に実行されることを確認する',
|
|
152
|
+
'最終結果が正しく返されることを確認する'
|
|
153
|
+
],
|
|
154
|
+
expectedResults: [
|
|
155
|
+
'フローが正常に完了する',
|
|
156
|
+
'中間データが各コンポーネント間で正しく渡される',
|
|
157
|
+
'最終的な状態が期待通りになる'
|
|
158
|
+
],
|
|
159
|
+
type: 'normal'
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// 失敗フローテストケース
|
|
163
|
+
testCases.push({
|
|
164
|
+
id: `IT-${String(tcCounter++).padStart(3, '0')}`,
|
|
165
|
+
name: `${flow.name} - 失敗フロー`,
|
|
166
|
+
description: 'エラー発生時に適切にハンドリングされることを確認',
|
|
167
|
+
preconditions: [
|
|
168
|
+
'すべての依存コンポーネントが起動している'
|
|
169
|
+
],
|
|
170
|
+
steps: [
|
|
171
|
+
'エラーを発生させる条件でフローを開始する',
|
|
172
|
+
'エラーハンドリングが実行されることを確認する',
|
|
173
|
+
'システムが安全な状態に戻ることを確認する'
|
|
174
|
+
],
|
|
175
|
+
expectedResults: [
|
|
176
|
+
'適切なエラーメッセージが表示される',
|
|
177
|
+
'データの整合性が保たれる',
|
|
178
|
+
'リソースがクリーンアップされる'
|
|
179
|
+
],
|
|
180
|
+
type: 'error'
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const templateData: TemplateData = {
|
|
185
|
+
feature,
|
|
186
|
+
testType: 'integration',
|
|
187
|
+
date: new Date().toISOString().split('T')[0],
|
|
188
|
+
purpose: `${feature}の複数コンポーネント間の連携が正常に動作することを確認する`,
|
|
189
|
+
scope: `${feature}のシステムフロー(${flows.map(f => f.name).join(', ')})`,
|
|
190
|
+
testCases,
|
|
191
|
+
flows,
|
|
192
|
+
components
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
const template = loadTestSpecTemplate('integration', projectRoot);
|
|
196
|
+
return applyTemplate(template, templateData);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* E2Eテスト仕様書を生成
|
|
201
|
+
*/
|
|
202
|
+
export async function generateE2ETestSpec(feature: string, projectRoot: string = process.cwd()): Promise<string> {
|
|
203
|
+
const requirementsPath = join(projectRoot, '.kiro', 'specs', feature, 'requirements.md');
|
|
204
|
+
|
|
205
|
+
if (!existsSync(requirementsPath)) {
|
|
206
|
+
throw new Error(`requirements.mdが見つかりません: ${requirementsPath}`);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const requirementsMd = readFileSync(requirementsPath, 'utf-8');
|
|
210
|
+
const requirements = extractRequirements(requirementsMd);
|
|
211
|
+
|
|
212
|
+
// 要件からE2Eテストケースを生成
|
|
213
|
+
const testCases: TestCase[] = [];
|
|
214
|
+
let tcCounter = 1;
|
|
215
|
+
|
|
216
|
+
for (const req of requirements) {
|
|
217
|
+
// 機能要件のみを対象(NFRはスキップ)
|
|
218
|
+
if (req.id.startsWith('NFR')) {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// ハッピーパステストケース
|
|
223
|
+
testCases.push({
|
|
224
|
+
id: `E2E-${String(tcCounter++).padStart(3, '0')}`,
|
|
225
|
+
name: `${req.title} - ハッピーパス`,
|
|
226
|
+
description: `${req.objective}が達成できることをエンドツーエンドで確認`,
|
|
227
|
+
preconditions: [
|
|
228
|
+
'アプリケーションが起動している',
|
|
229
|
+
'テストユーザーが作成されている',
|
|
230
|
+
'テストデータが準備されている'
|
|
231
|
+
],
|
|
232
|
+
steps: req.acceptanceCriteria.slice(0, 3).map((ac, idx) =>
|
|
233
|
+
`${ac.substring(0, 100)}...を実行`
|
|
234
|
+
),
|
|
235
|
+
expectedResults: req.acceptanceCriteria.map(ac =>
|
|
236
|
+
ac.replace(/^(When|If|While|Where|The)\s+/, '').substring(0, 100)
|
|
237
|
+
).slice(0, 3),
|
|
238
|
+
type: 'normal'
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
// エラーフローテストケース
|
|
242
|
+
if (req.acceptanceCriteria.some(ac => ac.includes('If') || ac.includes('error'))) {
|
|
243
|
+
testCases.push({
|
|
244
|
+
id: `E2E-${String(tcCounter++).padStart(3, '0')}`,
|
|
245
|
+
name: `${req.title} - エラーフロー`,
|
|
246
|
+
description: 'エラー発生時に適切にハンドリングされることを確認',
|
|
247
|
+
preconditions: [
|
|
248
|
+
'アプリケーションが起動している'
|
|
249
|
+
],
|
|
250
|
+
steps: [
|
|
251
|
+
'無効な入力でフローを開始する',
|
|
252
|
+
'エラーメッセージが表示されることを確認する',
|
|
253
|
+
'ユーザーが回復できることを確認する'
|
|
254
|
+
],
|
|
255
|
+
expectedResults: [
|
|
256
|
+
'適切なエラーメッセージが表示される',
|
|
257
|
+
'ユーザーが操作を継続できる',
|
|
258
|
+
'データの整合性が保たれる'
|
|
259
|
+
],
|
|
260
|
+
type: 'error'
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const templateData: TemplateData = {
|
|
266
|
+
feature,
|
|
267
|
+
testType: 'e2e',
|
|
268
|
+
date: new Date().toISOString().split('T')[0],
|
|
269
|
+
purpose: `${feature}のエンドユーザーシナリオが完全に動作することを確認する`,
|
|
270
|
+
scope: `${feature}の全ユーザーフロー`,
|
|
271
|
+
testCases,
|
|
272
|
+
requirements
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
const template = loadTestSpecTemplate('e2e', projectRoot);
|
|
276
|
+
return applyTemplate(template, templateData);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* パフォーマンステスト仕様書を生成
|
|
281
|
+
*/
|
|
282
|
+
export async function generatePerformanceTestSpec(feature: string, projectRoot: string = process.cwd()): Promise<string> {
|
|
283
|
+
const requirementsPath = join(projectRoot, '.kiro', 'specs', feature, 'requirements.md');
|
|
284
|
+
|
|
285
|
+
if (!existsSync(requirementsPath)) {
|
|
286
|
+
throw new Error(`requirements.mdが見つかりません: ${requirementsPath}`);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const requirementsMd = readFileSync(requirementsPath, 'utf-8');
|
|
290
|
+
const requirements = extractRequirements(requirementsMd);
|
|
291
|
+
|
|
292
|
+
// NFR-1(パフォーマンス要件)からテストケースを生成
|
|
293
|
+
const testCases: TestCase[] = [];
|
|
294
|
+
let tcCounter = 1;
|
|
295
|
+
|
|
296
|
+
const perfReq = requirements.find(r => r.title.includes('パフォーマンス') || r.id === 'NFR-1');
|
|
297
|
+
|
|
298
|
+
if (perfReq) {
|
|
299
|
+
// 応答時間テスト
|
|
300
|
+
testCases.push({
|
|
301
|
+
id: `PERF-${String(tcCounter++).padStart(3, '0')}`,
|
|
302
|
+
name: '応答時間テスト - 通常負荷',
|
|
303
|
+
description: '通常負荷時の応答時間が要件を満たすことを確認',
|
|
304
|
+
preconditions: [
|
|
305
|
+
'テスト環境が起動している',
|
|
306
|
+
'通常のデータ量が準備されている'
|
|
307
|
+
],
|
|
308
|
+
steps: [
|
|
309
|
+
'主要な操作を実行する',
|
|
310
|
+
'応答時間を測定する',
|
|
311
|
+
'要件と比較する'
|
|
312
|
+
],
|
|
313
|
+
expectedResults: perfReq.acceptanceCriteria.filter(ac =>
|
|
314
|
+
ac.includes('秒以内') || ac.includes('以内に')
|
|
315
|
+
).slice(0, 2),
|
|
316
|
+
type: 'normal'
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
// スループットテスト
|
|
320
|
+
testCases.push({
|
|
321
|
+
id: `PERF-${String(tcCounter++).padStart(3, '0')}`,
|
|
322
|
+
name: 'スループットテスト - ピーク負荷',
|
|
323
|
+
description: 'ピーク負荷時のスループットが要件を満たすことを確認',
|
|
324
|
+
preconditions: [
|
|
325
|
+
'テスト環境が起動している',
|
|
326
|
+
'負荷生成ツールが準備されている'
|
|
327
|
+
],
|
|
328
|
+
steps: [
|
|
329
|
+
'ピーク負荷(想定の150%)を生成する',
|
|
330
|
+
'スループットを測定する',
|
|
331
|
+
'エラー率を確認する'
|
|
332
|
+
],
|
|
333
|
+
expectedResults: [
|
|
334
|
+
'システムがクラッシュしない',
|
|
335
|
+
'エラー率が5%以下',
|
|
336
|
+
'応答時間の劣化が許容範囲内'
|
|
337
|
+
],
|
|
338
|
+
type: 'edge'
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
// 大量データテスト
|
|
342
|
+
if (perfReq.acceptanceCriteria.some(ac => ac.includes('件') || ac.includes('以上'))) {
|
|
343
|
+
testCases.push({
|
|
344
|
+
id: `PERF-${String(tcCounter++).padStart(3, '0')}`,
|
|
345
|
+
name: '大量データ処理テスト',
|
|
346
|
+
description: '大量データ処理時のパフォーマンスを確認',
|
|
347
|
+
preconditions: [
|
|
348
|
+
'テスト環境が起動している',
|
|
349
|
+
'大量のテストデータ(1000件以上)が準備されている'
|
|
350
|
+
],
|
|
351
|
+
steps: [
|
|
352
|
+
'大量データの読み込みを実行する',
|
|
353
|
+
'処理時間を測定する',
|
|
354
|
+
'メモリ使用量を確認する'
|
|
355
|
+
],
|
|
356
|
+
expectedResults: perfReq.acceptanceCriteria.filter(ac =>
|
|
357
|
+
ac.includes('件') || ac.includes('以上')
|
|
358
|
+
),
|
|
359
|
+
type: 'edge'
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
} else {
|
|
363
|
+
// パフォーマンス要件がない場合のデフォルトテストケース
|
|
364
|
+
testCases.push({
|
|
365
|
+
id: `PERF-${String(tcCounter++).padStart(3, '0')}`,
|
|
366
|
+
name: '基本的な応答時間テスト',
|
|
367
|
+
description: '主要な操作の応答時間を測定',
|
|
368
|
+
preconditions: ['テスト環境が起動している'],
|
|
369
|
+
steps: [
|
|
370
|
+
'主要な操作を実行する',
|
|
371
|
+
'応答時間を測定する'
|
|
372
|
+
],
|
|
373
|
+
expectedResults: [
|
|
374
|
+
'応答時間が3秒以内(一般的な基準)'
|
|
375
|
+
],
|
|
376
|
+
type: 'normal'
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const templateData: TemplateData = {
|
|
381
|
+
feature,
|
|
382
|
+
testType: 'performance',
|
|
383
|
+
date: new Date().toISOString().split('T')[0],
|
|
384
|
+
purpose: `${feature}のパフォーマンスが要件を満たすことを確認する`,
|
|
385
|
+
scope: `${feature}の主要な処理のパフォーマンス`,
|
|
386
|
+
testCases,
|
|
387
|
+
requirements
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
const template = loadTestSpecTemplate('performance', projectRoot);
|
|
391
|
+
return applyTemplate(template, templateData);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* セキュリティテスト仕様書を生成
|
|
396
|
+
*/
|
|
397
|
+
export async function generateSecurityTestSpec(feature: string, projectRoot: string = process.cwd()): Promise<string> {
|
|
398
|
+
const requirementsPath = join(projectRoot, '.kiro', 'specs', feature, 'requirements.md');
|
|
399
|
+
|
|
400
|
+
if (!existsSync(requirementsPath)) {
|
|
401
|
+
throw new Error(`requirements.mdが見つかりません: ${requirementsPath}`);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const requirementsMd = readFileSync(requirementsPath, 'utf-8');
|
|
405
|
+
const requirements = extractRequirements(requirementsMd);
|
|
406
|
+
|
|
407
|
+
// NFR-3(セキュリティ要件)からテストケースを生成
|
|
408
|
+
const testCases: TestCase[] = [];
|
|
409
|
+
let tcCounter = 1;
|
|
410
|
+
|
|
411
|
+
const secReq = requirements.find(r => r.title.includes('セキュリティ') || r.id === 'NFR-3');
|
|
412
|
+
|
|
413
|
+
if (secReq) {
|
|
414
|
+
// 権限チェックテスト
|
|
415
|
+
if (secReq.acceptanceCriteria.some(ac => ac.includes('権限') || ac.includes('アクセス'))) {
|
|
416
|
+
testCases.push({
|
|
417
|
+
id: `SEC-${String(tcCounter++).padStart(3, '0')}`,
|
|
418
|
+
name: '権限チェックテスト',
|
|
419
|
+
description: '適切な権限チェックが実施されることを確認',
|
|
420
|
+
preconditions: [
|
|
421
|
+
'テストユーザーが作成されている(権限あり/なし)'
|
|
422
|
+
],
|
|
423
|
+
steps: [
|
|
424
|
+
'権限のないユーザーでアクセスを試行する',
|
|
425
|
+
'アクセスが拒否されることを確認する',
|
|
426
|
+
'権限のあるユーザーでアクセスを試行する',
|
|
427
|
+
'アクセスが許可されることを確認する'
|
|
428
|
+
],
|
|
429
|
+
expectedResults: secReq.acceptanceCriteria.filter(ac =>
|
|
430
|
+
ac.includes('権限') || ac.includes('アクセス')
|
|
431
|
+
),
|
|
432
|
+
type: 'normal'
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// データ暗号化テスト
|
|
437
|
+
if (secReq.acceptanceCriteria.some(ac => ac.includes('暗号化'))) {
|
|
438
|
+
testCases.push({
|
|
439
|
+
id: `SEC-${String(tcCounter++).padStart(3, '0')}`,
|
|
440
|
+
name: 'データ暗号化テスト',
|
|
441
|
+
description: 'データが適切に暗号化されることを確認',
|
|
442
|
+
preconditions: [
|
|
443
|
+
'テスト環境が起動している',
|
|
444
|
+
'暗号化対象のデータが準備されている'
|
|
445
|
+
],
|
|
446
|
+
steps: [
|
|
447
|
+
'データを保存する',
|
|
448
|
+
'保存されたデータを直接確認する',
|
|
449
|
+
'暗号化されていることを確認する',
|
|
450
|
+
'データを読み込む',
|
|
451
|
+
'復号化されたデータが正しいことを確認する'
|
|
452
|
+
],
|
|
453
|
+
expectedResults: secReq.acceptanceCriteria.filter(ac =>
|
|
454
|
+
ac.includes('暗号化')
|
|
455
|
+
),
|
|
456
|
+
type: 'normal'
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// 改ざん検出テスト
|
|
461
|
+
if (secReq.acceptanceCriteria.some(ac => ac.includes('改ざん'))) {
|
|
462
|
+
testCases.push({
|
|
463
|
+
id: `SEC-${String(tcCounter++).padStart(3, '0')}`,
|
|
464
|
+
name: 'データ改ざん検出テスト',
|
|
465
|
+
description: 'データの改ざんが検出されることを確認',
|
|
466
|
+
preconditions: [
|
|
467
|
+
'テスト環境が起動している',
|
|
468
|
+
'データが保存されている'
|
|
469
|
+
],
|
|
470
|
+
steps: [
|
|
471
|
+
'データを保存する',
|
|
472
|
+
'データファイルを直接編集して改ざんする',
|
|
473
|
+
'データを読み込む',
|
|
474
|
+
'改ざん検出エラーが発生することを確認する'
|
|
475
|
+
],
|
|
476
|
+
expectedResults: secReq.acceptanceCriteria.filter(ac =>
|
|
477
|
+
ac.includes('改ざん')
|
|
478
|
+
),
|
|
479
|
+
type: 'error'
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// 不正アクセステスト
|
|
484
|
+
testCases.push({
|
|
485
|
+
id: `SEC-${String(tcCounter++).padStart(3, '0')}`,
|
|
486
|
+
name: '不正アクセステスト',
|
|
487
|
+
description: '不正なアクセスが拒否されることを確認',
|
|
488
|
+
preconditions: [
|
|
489
|
+
'テスト環境が起動している'
|
|
490
|
+
],
|
|
491
|
+
steps: [
|
|
492
|
+
'無効な認証情報でアクセスを試行する',
|
|
493
|
+
'アクセスが拒否されることを確認する',
|
|
494
|
+
'エラーログが記録されることを確認する'
|
|
495
|
+
],
|
|
496
|
+
expectedResults: [
|
|
497
|
+
'アクセスが拒否される',
|
|
498
|
+
'適切なエラーメッセージが表示される',
|
|
499
|
+
'セキュリティログに記録される'
|
|
500
|
+
],
|
|
501
|
+
type: 'error'
|
|
502
|
+
});
|
|
503
|
+
} else {
|
|
504
|
+
// セキュリティ要件がない場合のデフォルトテストケース
|
|
505
|
+
testCases.push({
|
|
506
|
+
id: `SEC-${String(tcCounter++).padStart(3, '0')}`,
|
|
507
|
+
name: '基本的な入力検証テスト',
|
|
508
|
+
description: 'ユーザー入力が適切に検証されることを確認',
|
|
509
|
+
preconditions: ['テスト環境が起動している'],
|
|
510
|
+
steps: [
|
|
511
|
+
'SQLインジェクションパターンを入力する',
|
|
512
|
+
'XSSパターンを入力する',
|
|
513
|
+
'入力が拒否またはエスケープされることを確認する'
|
|
514
|
+
],
|
|
515
|
+
expectedResults: [
|
|
516
|
+
'危険な入力が適切に処理される',
|
|
517
|
+
'セキュリティエラーが発生しない'
|
|
518
|
+
],
|
|
519
|
+
type: 'error'
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
const templateData: TemplateData = {
|
|
524
|
+
feature,
|
|
525
|
+
testType: 'security',
|
|
526
|
+
date: new Date().toISOString().split('T')[0],
|
|
527
|
+
purpose: `${feature}のセキュリティが要件を満たすことを確認する`,
|
|
528
|
+
scope: `${feature}の認証・認可・データ保護`,
|
|
529
|
+
testCases,
|
|
530
|
+
requirements
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
const template = loadTestSpecTemplate('security', projectRoot);
|
|
534
|
+
return applyTemplate(template, templateData);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* メイン生成関数
|
|
539
|
+
*/
|
|
540
|
+
export async function generateTestSpec(
|
|
541
|
+
feature: string,
|
|
542
|
+
testType: string,
|
|
543
|
+
projectRoot: string = process.cwd()
|
|
544
|
+
): Promise<void> {
|
|
545
|
+
let specContent: string;
|
|
546
|
+
|
|
547
|
+
switch (testType) {
|
|
548
|
+
case 'unit':
|
|
549
|
+
specContent = await generateUnitTestSpec(feature, projectRoot);
|
|
550
|
+
break;
|
|
551
|
+
case 'integration':
|
|
552
|
+
specContent = await generateIntegrationTestSpec(feature, projectRoot);
|
|
553
|
+
break;
|
|
554
|
+
case 'e2e':
|
|
555
|
+
specContent = await generateE2ETestSpec(feature, projectRoot);
|
|
556
|
+
break;
|
|
557
|
+
case 'performance':
|
|
558
|
+
specContent = await generatePerformanceTestSpec(feature, projectRoot);
|
|
559
|
+
break;
|
|
560
|
+
case 'security':
|
|
561
|
+
specContent = await generateSecurityTestSpec(feature, projectRoot);
|
|
562
|
+
break;
|
|
563
|
+
default:
|
|
564
|
+
throw new Error(`未対応のテストタイプ: ${testType}`);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// ファイルに保存
|
|
568
|
+
const specDir = join(projectRoot, '.kiro', 'specs', feature, 'test-specs');
|
|
569
|
+
mkdirSync(specDir, { recursive: true });
|
|
570
|
+
|
|
571
|
+
const outputPath = join(specDir, `${testType}-test-spec.md`);
|
|
572
|
+
writeFileSync(outputPath, specContent, 'utf-8');
|
|
573
|
+
}
|
|
574
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ワークフロー新規ステージのテスト
|
|
3
|
+
* testとreleaseステージのみを実行
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { config } from 'dotenv';
|
|
7
|
+
import { WorkflowOrchestrator, WorkflowConfig } from './workflow-orchestrator.js';
|
|
8
|
+
|
|
9
|
+
config();
|
|
10
|
+
|
|
11
|
+
async function main() {
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
|
|
14
|
+
if (args.length === 0) {
|
|
15
|
+
console.error('Usage: npm run test:workflow -- --feature <feature_name>');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const featureIndex = args.indexOf('--feature');
|
|
20
|
+
const feature = featureIndex >= 0 ? args[featureIndex + 1] : undefined;
|
|
21
|
+
|
|
22
|
+
if (featureIndex === -1 || !feature) {
|
|
23
|
+
console.error('Usage: npm run test:workflow -- --feature <feature_name>');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// testとreleaseステージのみを実行
|
|
28
|
+
const workflowConfig: WorkflowConfig = {
|
|
29
|
+
feature,
|
|
30
|
+
stages: ['test', 'release'],
|
|
31
|
+
// 承認ゲートなし
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
console.log('🧪 新規実装ステージのテスト');
|
|
35
|
+
console.log(`Feature: ${feature}`);
|
|
36
|
+
console.log(`Stages: ${workflowConfig.stages.join(' → ')}\n`);
|
|
37
|
+
|
|
38
|
+
const orchestrator = new WorkflowOrchestrator(workflowConfig);
|
|
39
|
+
|
|
40
|
+
await orchestrator.run();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
main()
|
|
44
|
+
.then(() => {
|
|
45
|
+
console.log('\n✅ テスト完了');
|
|
46
|
+
process.exit(0);
|
|
47
|
+
})
|
|
48
|
+
.catch((error) => {
|
|
49
|
+
console.error('\n❌ テスト失敗:', error.message);
|
|
50
|
+
console.error('\nスタックトレース:');
|
|
51
|
+
console.error(error.stack);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
});
|