@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,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* テスト実行ユーティリティ
|
|
3
|
+
* プロジェクトの言語に応じてテストを実行し、レポートを生成
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { exec } from 'child_process';
|
|
7
|
+
import { promisify } from 'util';
|
|
8
|
+
|
|
9
|
+
const execAsync = promisify(exec);
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* テスト実行結果
|
|
13
|
+
*/
|
|
14
|
+
export interface TestResult {
|
|
15
|
+
success: boolean;
|
|
16
|
+
language: string;
|
|
17
|
+
command: string;
|
|
18
|
+
output: string;
|
|
19
|
+
error?: string;
|
|
20
|
+
duration: number;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* テストを実行
|
|
26
|
+
* @param language プロジェクトの言語
|
|
27
|
+
* @param projectRoot プロジェクトルートディレクトリ
|
|
28
|
+
* @returns テスト実行結果
|
|
29
|
+
*/
|
|
30
|
+
export async function executeTests(
|
|
31
|
+
language: string,
|
|
32
|
+
projectRoot: string = process.cwd()
|
|
33
|
+
): Promise<TestResult> {
|
|
34
|
+
const startTime = Date.now();
|
|
35
|
+
const timestamp = new Date().toISOString();
|
|
36
|
+
|
|
37
|
+
// 言語に応じてテストコマンドを決定
|
|
38
|
+
const command = getTestCommand(language);
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
42
|
+
cwd: projectRoot,
|
|
43
|
+
env: { ...process.env, CI: 'true' }
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const duration = (Date.now() - startTime) / 1000;
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
success: true,
|
|
50
|
+
language,
|
|
51
|
+
command,
|
|
52
|
+
output: stdout + stderr,
|
|
53
|
+
duration,
|
|
54
|
+
timestamp
|
|
55
|
+
};
|
|
56
|
+
} catch (error: any) {
|
|
57
|
+
const duration = (Date.now() - startTime) / 1000;
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
language,
|
|
62
|
+
command,
|
|
63
|
+
output: error.stdout || '',
|
|
64
|
+
error: error.message || String(error),
|
|
65
|
+
duration,
|
|
66
|
+
timestamp
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* 言語に応じたテストコマンドを取得
|
|
73
|
+
*/
|
|
74
|
+
function getTestCommand(language: string): string {
|
|
75
|
+
switch (language) {
|
|
76
|
+
case 'Node.js/TypeScript':
|
|
77
|
+
return 'npm test';
|
|
78
|
+
case 'Java':
|
|
79
|
+
return 'gradle test';
|
|
80
|
+
case 'PHP':
|
|
81
|
+
return 'composer test';
|
|
82
|
+
case 'Python':
|
|
83
|
+
return 'pytest';
|
|
84
|
+
case 'Go':
|
|
85
|
+
return 'go test ./...';
|
|
86
|
+
case 'Rust':
|
|
87
|
+
return 'cargo test';
|
|
88
|
+
default:
|
|
89
|
+
throw new Error(`Unsupported language: ${language}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* テスト結果からMarkdownレポートを生成
|
|
95
|
+
* @param result テスト実行結果
|
|
96
|
+
* @param featureName 機能名
|
|
97
|
+
* @returns Markdownレポート
|
|
98
|
+
*/
|
|
99
|
+
export function generateTestReport(
|
|
100
|
+
result: TestResult,
|
|
101
|
+
featureName: string
|
|
102
|
+
): string {
|
|
103
|
+
const status = result.success ? '✅ 成功' : '❌ 失敗';
|
|
104
|
+
|
|
105
|
+
let report = `# テスト実行レポート: ${featureName}\n\n`;
|
|
106
|
+
report += '## 実行結果\n\n';
|
|
107
|
+
report += `- **ステータス**: ${status}\n`;
|
|
108
|
+
report += `- **言語**: ${result.language}\n`;
|
|
109
|
+
report += `- **コマンド**: \`${result.command}\`\n`;
|
|
110
|
+
report += `- **実行時間**: ${result.duration.toFixed(2)}秒\n`;
|
|
111
|
+
report += `- **タイムスタンプ**: ${result.timestamp}\n\n`;
|
|
112
|
+
|
|
113
|
+
if (result.success) {
|
|
114
|
+
report += '## テスト出力\n\n';
|
|
115
|
+
report += '```\n';
|
|
116
|
+
report += result.output;
|
|
117
|
+
report += '\n```\n\n';
|
|
118
|
+
} else {
|
|
119
|
+
report += '## エラー情報\n\n';
|
|
120
|
+
report += '```\n';
|
|
121
|
+
report += result.error || 'Unknown error';
|
|
122
|
+
report += '\n```\n\n';
|
|
123
|
+
|
|
124
|
+
if (result.output) {
|
|
125
|
+
report += '## テスト出力\n\n';
|
|
126
|
+
report += '```\n';
|
|
127
|
+
report += result.output;
|
|
128
|
+
report += '\n```\n\n';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return report;
|
|
133
|
+
}
|
|
@@ -5,10 +5,17 @@
|
|
|
5
5
|
|
|
6
6
|
import { existsSync, readFileSync } from 'fs';
|
|
7
7
|
import { join } from 'path';
|
|
8
|
-
import { loadProjectMeta } from './utils/project-meta.js';
|
|
9
8
|
import { validateFeatureName } from './utils/feature-name-validator.js';
|
|
10
9
|
|
|
11
|
-
type Phase =
|
|
10
|
+
type Phase =
|
|
11
|
+
| 'requirements'
|
|
12
|
+
| 'design'
|
|
13
|
+
| 'test-type-selection'
|
|
14
|
+
| 'test-spec'
|
|
15
|
+
| 'tasks'
|
|
16
|
+
| 'environment-setup'
|
|
17
|
+
| 'phase-a'
|
|
18
|
+
| 'phase-b';
|
|
12
19
|
|
|
13
20
|
interface ValidationResult {
|
|
14
21
|
phase: Phase;
|
|
@@ -186,10 +193,19 @@ function validateTasks(feature: string): ValidationResult {
|
|
|
186
193
|
}
|
|
187
194
|
|
|
188
195
|
// 5. JIRA Story作成チェック(必須)
|
|
189
|
-
|
|
196
|
+
// spec.jira.storyKeys 配列をチェック(新フォーマット)
|
|
197
|
+
// または spec.jira.stories.created(旧フォーマット)をチェック
|
|
198
|
+
const hasStories = spec.jira?.storyKeys && Array.isArray(spec.jira.storyKeys) && spec.jira.storyKeys.length > 0;
|
|
199
|
+
const hasLegacyStories = spec.jira?.stories && spec.jira.stories.created > 0;
|
|
200
|
+
|
|
201
|
+
if (!hasStories && !hasLegacyStories) {
|
|
190
202
|
errors.push('❌ JIRA Storyが1つも作成されていません');
|
|
191
203
|
errors.push(' → 実行: npm run jira:sync <feature>');
|
|
192
|
-
} else if (spec.jira
|
|
204
|
+
} else if (spec.jira?.storyKeys && spec.jira.storyKeys.length > 0) {
|
|
205
|
+
// 新フォーマット: storyKeys配列が存在する場合
|
|
206
|
+
// 成功として扱う(警告なし)
|
|
207
|
+
} else if (spec.jira?.stories && spec.jira.stories.created < spec.jira.stories.total) {
|
|
208
|
+
// 旧フォーマット: 一部未作成の場合のみ警告
|
|
193
209
|
warnings.push(`⚠️ JIRA Storyが一部未作成: ${spec.jira.stories.created}/${spec.jira.stories.total}`);
|
|
194
210
|
}
|
|
195
211
|
|
|
@@ -206,6 +222,132 @@ function validateTasks(feature: string): ValidationResult {
|
|
|
206
222
|
};
|
|
207
223
|
}
|
|
208
224
|
|
|
225
|
+
/**
|
|
226
|
+
* テストタイプ選択フェーズのバリデーション(Phase 0.3)
|
|
227
|
+
* マニュアル対応フェーズ - バリデーション不要(常に成功)
|
|
228
|
+
*/
|
|
229
|
+
function validateTestTypeSelection(feature: string): ValidationResult {
|
|
230
|
+
const errors: string[] = [];
|
|
231
|
+
const warnings: string[] = [];
|
|
232
|
+
|
|
233
|
+
// feature名のバリデーション
|
|
234
|
+
const nameValidation = validateFeatureName(feature);
|
|
235
|
+
if (!nameValidation.valid) {
|
|
236
|
+
errors.push(...nameValidation.errors);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
warnings.push('⚠️ このフェーズはマニュアル対応です。ガイダンスに従ってテストタイプを選択してください');
|
|
240
|
+
|
|
241
|
+
return {
|
|
242
|
+
phase: 'test-type-selection',
|
|
243
|
+
valid: errors.length === 0,
|
|
244
|
+
errors,
|
|
245
|
+
warnings
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* テスト仕様書作成フェーズのバリデーション(Phase 0.4)
|
|
251
|
+
* マニュアル対応フェーズ - バリデーション不要(常に成功)
|
|
252
|
+
*/
|
|
253
|
+
function validateTestSpec(feature: string): ValidationResult {
|
|
254
|
+
const errors: string[] = [];
|
|
255
|
+
const warnings: string[] = [];
|
|
256
|
+
|
|
257
|
+
// feature名のバリデーション
|
|
258
|
+
const nameValidation = validateFeatureName(feature);
|
|
259
|
+
if (!nameValidation.valid) {
|
|
260
|
+
errors.push(...nameValidation.errors);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// テスト仕様書ディレクトリの存在チェック(任意)
|
|
264
|
+
const testSpecDir = join(process.cwd(), 'docs', 'testing', 'specs', feature);
|
|
265
|
+
if (!existsSync(testSpecDir)) {
|
|
266
|
+
warnings.push('⚠️ テスト仕様書ディレクトリがありません: docs/testing/specs/' + feature);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
warnings.push('⚠️ このフェーズはマニュアル対応です。テンプレートを使用してテスト仕様書を作成してください');
|
|
270
|
+
|
|
271
|
+
return {
|
|
272
|
+
phase: 'test-spec',
|
|
273
|
+
valid: errors.length === 0,
|
|
274
|
+
errors,
|
|
275
|
+
warnings
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* 環境構築フェーズのバリデーション(Phase 1)
|
|
281
|
+
* マニュアル対応フェーズ - バリデーション不要(常に成功)
|
|
282
|
+
*/
|
|
283
|
+
function validateEnvironmentSetup(feature: string): ValidationResult {
|
|
284
|
+
const errors: string[] = [];
|
|
285
|
+
const warnings: string[] = [];
|
|
286
|
+
|
|
287
|
+
// feature名のバリデーション
|
|
288
|
+
const nameValidation = validateFeatureName(feature);
|
|
289
|
+
if (!nameValidation.valid) {
|
|
290
|
+
errors.push(...nameValidation.errors);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
warnings.push('⚠️ このフェーズはマニュアル対応です。環境構築チェックリストを完了してください');
|
|
294
|
+
|
|
295
|
+
return {
|
|
296
|
+
phase: 'environment-setup',
|
|
297
|
+
valid: errors.length === 0,
|
|
298
|
+
errors,
|
|
299
|
+
warnings
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* PR前自動テストフェーズのバリデーション(Phase A)
|
|
305
|
+
* CI/CD自動実行 - バリデーション不要(常に成功)
|
|
306
|
+
*/
|
|
307
|
+
function validatePhaseA(feature: string): ValidationResult {
|
|
308
|
+
const errors: string[] = [];
|
|
309
|
+
const warnings: string[] = [];
|
|
310
|
+
|
|
311
|
+
// feature名のバリデーション
|
|
312
|
+
const nameValidation = validateFeatureName(feature);
|
|
313
|
+
if (!nameValidation.valid) {
|
|
314
|
+
errors.push(...nameValidation.errors);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
warnings.push('⚠️ このフェーズはCI/CD自動実行です。PR作成時に自動でテストが実行されます');
|
|
318
|
+
|
|
319
|
+
return {
|
|
320
|
+
phase: 'phase-a',
|
|
321
|
+
valid: errors.length === 0,
|
|
322
|
+
errors,
|
|
323
|
+
warnings
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* リリース準備テストフェーズのバリデーション(Phase B)
|
|
329
|
+
* マニュアル対応フェーズ - バリデーション不要(常に成功)
|
|
330
|
+
*/
|
|
331
|
+
function validatePhaseB(feature: string): ValidationResult {
|
|
332
|
+
const errors: string[] = [];
|
|
333
|
+
const warnings: string[] = [];
|
|
334
|
+
|
|
335
|
+
// feature名のバリデーション
|
|
336
|
+
const nameValidation = validateFeatureName(feature);
|
|
337
|
+
if (!nameValidation.valid) {
|
|
338
|
+
errors.push(...nameValidation.errors);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
warnings.push('⚠️ このフェーズはマニュアル対応です。リリース準備テストチェックリストを完了してください');
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
phase: 'phase-b',
|
|
345
|
+
valid: errors.length === 0,
|
|
346
|
+
errors,
|
|
347
|
+
warnings
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
209
351
|
/**
|
|
210
352
|
* フェーズをバリデート
|
|
211
353
|
*/
|
|
@@ -221,9 +363,24 @@ export function validatePhase(feature: string, phase: Phase): ValidationResult {
|
|
|
221
363
|
case 'design':
|
|
222
364
|
result = validateDesign(feature);
|
|
223
365
|
break;
|
|
366
|
+
case 'test-type-selection':
|
|
367
|
+
result = validateTestTypeSelection(feature);
|
|
368
|
+
break;
|
|
369
|
+
case 'test-spec':
|
|
370
|
+
result = validateTestSpec(feature);
|
|
371
|
+
break;
|
|
224
372
|
case 'tasks':
|
|
225
373
|
result = validateTasks(feature);
|
|
226
374
|
break;
|
|
375
|
+
case 'environment-setup':
|
|
376
|
+
result = validateEnvironmentSetup(feature);
|
|
377
|
+
break;
|
|
378
|
+
case 'phase-a':
|
|
379
|
+
result = validatePhaseA(feature);
|
|
380
|
+
break;
|
|
381
|
+
case 'phase-b':
|
|
382
|
+
result = validatePhaseB(feature);
|
|
383
|
+
break;
|
|
227
384
|
default:
|
|
228
385
|
throw new Error(`Unknown phase: ${phase}`);
|
|
229
386
|
}
|
|
@@ -257,14 +414,34 @@ if (import.meta.url === `file://${process.argv[1]}`) {
|
|
|
257
414
|
if (args.length < 2) {
|
|
258
415
|
console.error('Usage: npm run validate:phase <feature> <phase>');
|
|
259
416
|
console.error('Example: npm run validate:phase calculator-app requirements');
|
|
260
|
-
console.error('Phases:
|
|
417
|
+
console.error('\nAvailable Phases:');
|
|
418
|
+
console.error(' requirements - Phase 0.1: 要件定義');
|
|
419
|
+
console.error(' design - Phase 0.2: 設計');
|
|
420
|
+
console.error(' test-type-selection- Phase 0.3: テストタイプ選択(任意)');
|
|
421
|
+
console.error(' test-spec - Phase 0.4: テスト仕様書作成(任意)');
|
|
422
|
+
console.error(' tasks - Phase 0.5-0.6: タスク分割・JIRA同期');
|
|
423
|
+
console.error(' environment-setup - Phase 1: 環境構築(任意)');
|
|
424
|
+
console.error(' phase-a - Phase A: PR前自動テスト(任意)');
|
|
425
|
+
console.error(' phase-b - Phase B: リリース準備テスト(任意)');
|
|
261
426
|
process.exit(1);
|
|
262
427
|
}
|
|
263
|
-
|
|
428
|
+
|
|
264
429
|
const [feature, phase] = args;
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
430
|
+
|
|
431
|
+
const validPhases = [
|
|
432
|
+
'requirements',
|
|
433
|
+
'design',
|
|
434
|
+
'test-type-selection',
|
|
435
|
+
'test-spec',
|
|
436
|
+
'tasks',
|
|
437
|
+
'environment-setup',
|
|
438
|
+
'phase-a',
|
|
439
|
+
'phase-b'
|
|
440
|
+
];
|
|
441
|
+
|
|
442
|
+
if (!validPhases.includes(phase)) {
|
|
443
|
+
console.error(`Invalid phase: ${phase}`);
|
|
444
|
+
console.error('Must be one of: requirements, design, test-type-selection, test-spec, tasks, environment-setup, phase-a, phase-b');
|
|
268
445
|
process.exit(1);
|
|
269
446
|
}
|
|
270
447
|
|
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
|
|
6
6
|
import { config } from 'dotenv';
|
|
7
7
|
import { loadProjectMeta } from './utils/project-meta.js';
|
|
8
|
-
import { syncToConfluence } from './confluence-sync.js';
|
|
9
|
-
import { syncTasksToJIRA } from './jira-sync.js';
|
|
10
|
-
import {
|
|
8
|
+
import { syncToConfluence, getConfluenceConfig } from './confluence-sync.js';
|
|
9
|
+
import { syncTasksToJIRA, JIRAClient } from './jira-sync.js';
|
|
10
|
+
import { analyzeLanguage } from './utils/language-detector.js';
|
|
11
|
+
import { executeTests, generateTestReport } from './utils/test-runner.js';
|
|
12
|
+
import { createReleaseNotes } from './utils/release-notes-generator.js';
|
|
13
|
+
import { pollForApproval, waitForManualApproval } from './utils/confluence-approval.js';
|
|
11
14
|
|
|
12
15
|
config();
|
|
13
16
|
|
|
@@ -94,12 +97,12 @@ export class WorkflowOrchestrator {
|
|
|
94
97
|
|
|
95
98
|
case 'test':
|
|
96
99
|
console.log(' Test phase - execute tests');
|
|
97
|
-
|
|
100
|
+
await this.executeTestPhase();
|
|
98
101
|
break;
|
|
99
|
-
|
|
102
|
+
|
|
100
103
|
case 'release':
|
|
101
104
|
console.log(' Release preparation');
|
|
102
|
-
|
|
105
|
+
await this.executeReleasePhase();
|
|
103
106
|
break;
|
|
104
107
|
}
|
|
105
108
|
}
|
|
@@ -120,23 +123,138 @@ export class WorkflowOrchestrator {
|
|
|
120
123
|
return Array.isArray(gateList) && gateList.length > 0;
|
|
121
124
|
}
|
|
122
125
|
|
|
126
|
+
/**
|
|
127
|
+
* テストフェーズを実行
|
|
128
|
+
*/
|
|
129
|
+
private async executeTestPhase(): Promise<void> {
|
|
130
|
+
// プロジェクトの言語を検出
|
|
131
|
+
const languageInfo = analyzeLanguage(this.config.feature);
|
|
132
|
+
console.log(` Detected language: ${languageInfo.language} (${languageInfo.confidence} confidence)`);
|
|
133
|
+
|
|
134
|
+
// テストを実行
|
|
135
|
+
console.log(' Running tests...');
|
|
136
|
+
const testResult = await executeTests(languageInfo.language);
|
|
137
|
+
|
|
138
|
+
// レポートを生成
|
|
139
|
+
const report = generateTestReport(testResult, this.config.feature);
|
|
140
|
+
|
|
141
|
+
// Confluenceにレポートをアップロード
|
|
142
|
+
try {
|
|
143
|
+
const confluenceConfig = getConfluenceConfig();
|
|
144
|
+
const projectMeta = loadProjectMeta();
|
|
145
|
+
const spaceKey = confluenceConfig.space;
|
|
146
|
+
|
|
147
|
+
// レポートをConfluenceに同期(テスト用のページとして)
|
|
148
|
+
console.log(' Uploading test report to Confluence...');
|
|
149
|
+
|
|
150
|
+
// テストレポートをファイルに保存
|
|
151
|
+
const { writeFileSync, mkdirSync } = await import('fs');
|
|
152
|
+
const { resolve } = await import('path');
|
|
153
|
+
const reportDir = resolve(`.kiro/specs/${this.config.feature}`);
|
|
154
|
+
mkdirSync(reportDir, { recursive: true });
|
|
155
|
+
const reportPath = resolve(reportDir, 'test-report.md');
|
|
156
|
+
writeFileSync(reportPath, report, 'utf-8');
|
|
157
|
+
|
|
158
|
+
console.log(` ✅ Test report saved: ${reportPath}`);
|
|
159
|
+
|
|
160
|
+
if (!testResult.success) {
|
|
161
|
+
throw new Error('Tests failed. Please fix the issues before proceeding.');
|
|
162
|
+
}
|
|
163
|
+
} catch (error: any) {
|
|
164
|
+
console.error(' ❌ Test execution failed:', error.message);
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* リリースフェーズを実行
|
|
171
|
+
*/
|
|
172
|
+
private async executeReleasePhase(): Promise<void> {
|
|
173
|
+
const projectMeta = loadProjectMeta();
|
|
174
|
+
|
|
175
|
+
// リリースバージョンを決定(環境変数またはデフォルト)
|
|
176
|
+
const version = process.env.RELEASE_VERSION || 'v1.0.0';
|
|
177
|
+
|
|
178
|
+
console.log(` Generating release notes for ${version}...`);
|
|
179
|
+
|
|
180
|
+
// リリースノートを生成
|
|
181
|
+
const releaseNotes = await createReleaseNotes(version);
|
|
182
|
+
|
|
183
|
+
// リリースノートをファイルに保存
|
|
184
|
+
const { writeFileSync, mkdirSync } = await import('fs');
|
|
185
|
+
const { resolve } = await import('path');
|
|
186
|
+
const releaseDir = resolve(`.kiro/specs/${this.config.feature}`);
|
|
187
|
+
mkdirSync(releaseDir, { recursive: true });
|
|
188
|
+
const releaseNotesPath = resolve(releaseDir, `release-notes-${version}.md`);
|
|
189
|
+
writeFileSync(releaseNotesPath, releaseNotes, 'utf-8');
|
|
190
|
+
|
|
191
|
+
console.log(` ✅ Release notes saved: ${releaseNotesPath}`);
|
|
192
|
+
|
|
193
|
+
// JIRA Releaseを作成
|
|
194
|
+
try {
|
|
195
|
+
const jiraConfig = {
|
|
196
|
+
url: process.env.ATLASSIAN_URL || '',
|
|
197
|
+
email: process.env.ATLASSIAN_EMAIL || '',
|
|
198
|
+
apiToken: process.env.ATLASSIAN_API_TOKEN || ''
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const jiraClient = new JIRAClient(jiraConfig);
|
|
202
|
+
|
|
203
|
+
console.log(' Creating JIRA Release...');
|
|
204
|
+
|
|
205
|
+
// JIRA Release作成APIを呼び出し
|
|
206
|
+
// Note: JIRAClientにcreateVersionメソッドを追加する必要があります
|
|
207
|
+
console.log(' ℹ️ JIRA Release creation is pending JIRAClient enhancement');
|
|
208
|
+
console.log(` 📋 Manual action required: Create release ${version} in JIRA`);
|
|
209
|
+
console.log(` 📄 Release notes: ${releaseNotesPath}`);
|
|
210
|
+
} catch (error: any) {
|
|
211
|
+
console.warn(' ⚠️ Failed to create JIRA Release:', error.message);
|
|
212
|
+
console.log(' 📋 Please create the release manually in JIRA');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
123
216
|
/**
|
|
124
217
|
* 承認を待つ
|
|
125
218
|
*/
|
|
126
219
|
private async waitForApproval(stage: WorkflowStage): Promise<void> {
|
|
127
220
|
console.log(`\n⏸️ Approval required for: ${stage}`);
|
|
128
|
-
|
|
221
|
+
|
|
129
222
|
const approvers = this.config.approvalGates?.[stage as keyof typeof this.config.approvalGates];
|
|
130
223
|
if (approvers) {
|
|
131
224
|
console.log(` Approvers: ${approvers.join(', ')}`);
|
|
132
225
|
}
|
|
133
|
-
|
|
226
|
+
|
|
134
227
|
console.log(' ✅ Confluence で承認してください');
|
|
135
228
|
console.log(' ⏳ 承認完了後、次のステージに進みます');
|
|
136
|
-
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
|
|
229
|
+
|
|
230
|
+
// Confluence自動ポーリングが有効な場合
|
|
231
|
+
if (process.env.CONFLUENCE_AUTO_POLL === 'true') {
|
|
232
|
+
try {
|
|
233
|
+
const confluenceConfig = getConfluenceConfig();
|
|
234
|
+
|
|
235
|
+
// TODO: ステージに応じたページIDを取得する必要があります
|
|
236
|
+
// 現在は環境変数から取得
|
|
237
|
+
const pageId = process.env.CONFLUENCE_APPROVAL_PAGE_ID;
|
|
238
|
+
|
|
239
|
+
if (!pageId) {
|
|
240
|
+
console.log(' ℹ️ CONFLUENCE_APPROVAL_PAGE_ID not set, falling back to manual approval');
|
|
241
|
+
waitForManualApproval('', approvers || []);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
console.log(' 🔄 Polling for approval...');
|
|
246
|
+
const status = await pollForApproval(pageId, confluenceConfig);
|
|
247
|
+
|
|
248
|
+
console.log(` ✅ Approved by: ${status.approvers.join(', ')}`);
|
|
249
|
+
} catch (error: any) {
|
|
250
|
+
console.error(' ❌ Approval polling failed:', error.message);
|
|
251
|
+
throw error;
|
|
252
|
+
}
|
|
253
|
+
} else {
|
|
254
|
+
// 手動承認
|
|
255
|
+
waitForManualApproval('', approvers || []);
|
|
256
|
+
console.log(' (手動で承認を確認してください)');
|
|
257
|
+
}
|
|
140
258
|
}
|
|
141
259
|
}
|
|
142
260
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
tags:
|
|
8
|
+
- "v*"
|
|
9
|
+
pull_request:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
|
|
15
|
+
strategy:
|
|
16
|
+
matrix:
|
|
17
|
+
java-version: [17, 21]
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout code
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Setup JDK ${{ matrix.java-version }}
|
|
24
|
+
uses: actions/setup-java@v4
|
|
25
|
+
with:
|
|
26
|
+
distribution: "temurin"
|
|
27
|
+
java-version: ${{ matrix.java-version }}
|
|
28
|
+
cache: "gradle"
|
|
29
|
+
|
|
30
|
+
- name: Grant execute permission for gradlew
|
|
31
|
+
run: chmod +x gradlew
|
|
32
|
+
|
|
33
|
+
- name: Run checkstyle
|
|
34
|
+
run: ./gradlew checkstyleMain checkstyleTest
|
|
35
|
+
|
|
36
|
+
- name: Run tests
|
|
37
|
+
run: ./gradlew test
|
|
38
|
+
|
|
39
|
+
- name: Build
|
|
40
|
+
run: ./gradlew build
|
|
41
|
+
|
|
42
|
+
- name: Upload test results
|
|
43
|
+
uses: actions/upload-artifact@v4
|
|
44
|
+
if: failure()
|
|
45
|
+
with:
|
|
46
|
+
name: test-results
|
|
47
|
+
path: build/reports/tests/test/
|
|
48
|
+
|
|
49
|
+
- name: Upload coverage
|
|
50
|
+
uses: codecov/codecov-action@v3
|
|
51
|
+
if: matrix.java-version == '21'
|
|
52
|
+
with:
|
|
53
|
+
files: ./build/reports/jacoco/test/jacocoTestReport.xml
|
|
54
|
+
fail_ci_if_error: false
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
tags:
|
|
8
|
+
- 'v*'
|
|
9
|
+
pull_request:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
|
|
15
|
+
strategy:
|
|
16
|
+
matrix:
|
|
17
|
+
node-version: [18.x, 20.x]
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout code
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Setup Node.js ${{ matrix.node-version }}
|
|
24
|
+
uses: actions/setup-node@v4
|
|
25
|
+
with:
|
|
26
|
+
node-version: ${{ matrix.node-version }}
|
|
27
|
+
cache: 'npm'
|
|
28
|
+
|
|
29
|
+
- name: Install dependencies
|
|
30
|
+
run: npm ci
|
|
31
|
+
|
|
32
|
+
- name: Run lint
|
|
33
|
+
run: npm run lint
|
|
34
|
+
|
|
35
|
+
- name: Run tests
|
|
36
|
+
run: npm test
|
|
37
|
+
|
|
38
|
+
- name: Build
|
|
39
|
+
run: npm run build
|
|
40
|
+
|
|
41
|
+
- name: Upload coverage
|
|
42
|
+
uses: codecov/codecov-action@v3
|
|
43
|
+
if: matrix.node-version == '20.x'
|
|
44
|
+
with:
|
|
45
|
+
files: ./coverage/coverage-final.json
|
|
46
|
+
fail_ci_if_error: false
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
tags:
|
|
8
|
+
- 'v*'
|
|
9
|
+
pull_request:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
|
|
15
|
+
strategy:
|
|
16
|
+
matrix:
|
|
17
|
+
php-version: ['8.1', '8.2', '8.3']
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout code
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Setup PHP ${{ matrix.php-version }}
|
|
24
|
+
uses: shivammathur/setup-php@v2
|
|
25
|
+
with:
|
|
26
|
+
php-version: ${{ matrix.php-version }}
|
|
27
|
+
coverage: xdebug
|
|
28
|
+
tools: composer:v2
|
|
29
|
+
|
|
30
|
+
- name: Cache Composer packages
|
|
31
|
+
uses: actions/cache@v3
|
|
32
|
+
with:
|
|
33
|
+
path: vendor
|
|
34
|
+
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
|
|
35
|
+
restore-keys: |
|
|
36
|
+
${{ runner.os }}-php-
|
|
37
|
+
|
|
38
|
+
- name: Install dependencies
|
|
39
|
+
run: composer install --prefer-dist --no-progress
|
|
40
|
+
|
|
41
|
+
- name: Run PHPStan
|
|
42
|
+
run: composer phpstan
|
|
43
|
+
|
|
44
|
+
- name: Run tests
|
|
45
|
+
run: composer test
|
|
46
|
+
|
|
47
|
+
- name: Upload coverage
|
|
48
|
+
uses: codecov/codecov-action@v3
|
|
49
|
+
if: matrix.php-version == '8.3'
|
|
50
|
+
with:
|
|
51
|
+
files: ./coverage.xml
|
|
52
|
+
fail_ci_if_error: false
|