@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.
Files changed (371) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +235 -57
  3. package/dist/scripts/__tests__/create-project.test.js +24 -28
  4. package/dist/scripts/__tests__/create-project.test.js.map +1 -1
  5. package/dist/scripts/__tests__/jira-transitions.test.d.ts +5 -0
  6. package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +1 -0
  7. package/dist/scripts/__tests__/jira-transitions.test.js +172 -0
  8. package/dist/scripts/__tests__/jira-transitions.test.js.map +1 -0
  9. package/dist/scripts/__tests__/multi-project-estimate.test.js +14 -15
  10. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -1
  11. package/dist/scripts/__tests__/setup-existing-project.test.js +79 -0
  12. package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
  13. package/dist/scripts/__tests__/setup-interactive.test.js +23 -17
  14. package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -1
  15. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +5 -0
  16. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +1 -0
  17. package/dist/scripts/__tests__/spec-impl-workflow.test.js +321 -0
  18. package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +1 -0
  19. package/dist/scripts/__tests__/spec-loader.test.d.ts +5 -0
  20. package/dist/scripts/__tests__/spec-loader.test.d.ts.map +1 -0
  21. package/dist/scripts/__tests__/spec-loader.test.js +153 -0
  22. package/dist/scripts/__tests__/spec-loader.test.js.map +1 -0
  23. package/dist/scripts/__tests__/validate-phase.test.js +26 -22
  24. package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
  25. package/dist/scripts/config/config-schema.d.ts +17 -0
  26. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  27. package/dist/scripts/config/config-schema.js +55 -26
  28. package/dist/scripts/config/config-schema.js.map +1 -1
  29. package/dist/scripts/config-interactive.d.ts.map +1 -1
  30. package/dist/scripts/config-interactive.js +53 -38
  31. package/dist/scripts/config-interactive.js.map +1 -1
  32. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  33. package/dist/scripts/confluence-sync.js +0 -11
  34. package/dist/scripts/confluence-sync.js.map +1 -1
  35. package/dist/scripts/constants/__tests__/environments.test.js +39 -5
  36. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -1
  37. package/dist/scripts/constants/environments.d.ts +1 -1
  38. package/dist/scripts/constants/environments.d.ts.map +1 -1
  39. package/dist/scripts/constants/environments.js +22 -7
  40. package/dist/scripts/constants/environments.js.map +1 -1
  41. package/dist/scripts/constants/test-commands.d.ts +36 -0
  42. package/dist/scripts/constants/test-commands.d.ts.map +1 -0
  43. package/dist/scripts/constants/test-commands.js +70 -0
  44. package/dist/scripts/constants/test-commands.js.map +1 -0
  45. package/dist/scripts/jira-sync.d.ts +89 -3
  46. package/dist/scripts/jira-sync.d.ts.map +1 -1
  47. package/dist/scripts/jira-sync.js +366 -96
  48. package/dist/scripts/jira-sync.js.map +1 -1
  49. package/dist/scripts/markdown-to-confluence.js +1 -1
  50. package/dist/scripts/markdown-to-confluence.js.map +1 -1
  51. package/dist/scripts/phase-runner.d.ts +1 -1
  52. package/dist/scripts/phase-runner.d.ts.map +1 -1
  53. package/dist/scripts/phase-runner.js +809 -13
  54. package/dist/scripts/phase-runner.js.map +1 -1
  55. package/dist/scripts/pr-automation.d.ts.map +1 -1
  56. package/dist/scripts/pr-automation.js.map +1 -1
  57. package/dist/scripts/pre-flight-check.js +1 -1
  58. package/dist/scripts/pre-flight-check.js.map +1 -1
  59. package/dist/scripts/setup-existing-project.js +61 -29
  60. package/dist/scripts/setup-existing-project.js.map +1 -1
  61. package/dist/scripts/setup-interactive.js +3 -3
  62. package/dist/scripts/setup-interactive.js.map +1 -1
  63. package/dist/scripts/spec-impl-workflow.d.ts +94 -0
  64. package/dist/scripts/spec-impl-workflow.d.ts.map +1 -0
  65. package/dist/scripts/spec-impl-workflow.js +354 -0
  66. package/dist/scripts/spec-impl-workflow.js.map +1 -0
  67. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -1
  68. package/dist/scripts/test-execution-generator.d.ts +52 -0
  69. package/dist/scripts/test-execution-generator.d.ts.map +1 -0
  70. package/dist/scripts/test-execution-generator.js +576 -0
  71. package/dist/scripts/test-execution-generator.js.map +1 -0
  72. package/dist/scripts/test-interactive.d.ts +10 -0
  73. package/dist/scripts/test-interactive.d.ts.map +1 -0
  74. package/dist/scripts/test-interactive.js +627 -0
  75. package/dist/scripts/test-interactive.js.map +1 -0
  76. package/dist/scripts/test-new-features.d.ts +5 -0
  77. package/dist/scripts/test-new-features.d.ts.map +1 -0
  78. package/dist/scripts/test-new-features.js +145 -0
  79. package/dist/scripts/test-new-features.js.map +1 -0
  80. package/dist/scripts/test-spec-generator.d.ts +29 -0
  81. package/dist/scripts/test-spec-generator.d.ts.map +1 -0
  82. package/dist/scripts/test-spec-generator.js +494 -0
  83. package/dist/scripts/test-spec-generator.js.map +1 -0
  84. package/dist/scripts/test-workflow-stages.d.ts +6 -0
  85. package/dist/scripts/test-workflow-stages.d.ts.map +1 -0
  86. package/dist/scripts/test-workflow-stages.js +43 -0
  87. package/dist/scripts/test-workflow-stages.js.map +1 -0
  88. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +5 -0
  89. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +1 -0
  90. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +315 -0
  91. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +1 -0
  92. package/dist/scripts/utils/__tests__/business-days.test.d.ts +5 -0
  93. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +1 -0
  94. package/dist/scripts/utils/__tests__/business-days.test.js +171 -0
  95. package/dist/scripts/utils/__tests__/business-days.test.js.map +1 -0
  96. package/dist/scripts/utils/__tests__/config-loader.test.js +1 -1
  97. package/dist/scripts/utils/__tests__/config-loader.test.js.map +1 -1
  98. package/dist/scripts/utils/__tests__/config-validator.test.js +164 -35
  99. package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
  100. package/dist/scripts/utils/__tests__/env-config.test.d.ts +5 -0
  101. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +1 -0
  102. package/dist/scripts/utils/__tests__/env-config.test.js +218 -0
  103. package/dist/scripts/utils/__tests__/env-config.test.js.map +1 -0
  104. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +5 -0
  105. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +1 -0
  106. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +202 -0
  107. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +1 -0
  108. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +5 -0
  109. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +1 -0
  110. package/dist/scripts/utils/__tests__/tasks-converter.test.js +500 -0
  111. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +1 -0
  112. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +5 -0
  113. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +1 -0
  114. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +314 -0
  115. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +1 -0
  116. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +5 -0
  117. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +1 -0
  118. package/dist/scripts/utils/__tests__/test-runner.test.js +64 -0
  119. package/dist/scripts/utils/__tests__/test-runner.test.js.map +1 -0
  120. package/dist/scripts/utils/aidlc-parser.d.ts +86 -0
  121. package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -0
  122. package/dist/scripts/utils/aidlc-parser.js +208 -0
  123. package/dist/scripts/utils/aidlc-parser.js.map +1 -0
  124. package/dist/scripts/utils/business-days.d.ts +52 -0
  125. package/dist/scripts/utils/business-days.d.ts.map +1 -0
  126. package/dist/scripts/utils/business-days.js +98 -0
  127. package/dist/scripts/utils/business-days.js.map +1 -0
  128. package/dist/scripts/utils/ci-generator.d.ts +14 -0
  129. package/dist/scripts/utils/ci-generator.d.ts.map +1 -0
  130. package/dist/scripts/utils/ci-generator.js +61 -0
  131. package/dist/scripts/utils/ci-generator.js.map +1 -0
  132. package/dist/scripts/utils/config-loader.js +2 -2
  133. package/dist/scripts/utils/config-loader.js.map +1 -1
  134. package/dist/scripts/utils/config-validator.d.ts +7 -1
  135. package/dist/scripts/utils/config-validator.d.ts.map +1 -1
  136. package/dist/scripts/utils/config-validator.js +136 -23
  137. package/dist/scripts/utils/config-validator.js.map +1 -1
  138. package/dist/scripts/utils/confluence-approval.d.ts +46 -0
  139. package/dist/scripts/utils/confluence-approval.d.ts.map +1 -0
  140. package/dist/scripts/utils/confluence-approval.js +118 -0
  141. package/dist/scripts/utils/confluence-approval.js.map +1 -0
  142. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  143. package/dist/scripts/utils/confluence-hierarchy.js +1 -1
  144. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  145. package/dist/scripts/utils/docker-generator.d.ts +9 -0
  146. package/dist/scripts/utils/docker-generator.d.ts.map +1 -0
  147. package/dist/scripts/utils/docker-generator.js +132 -0
  148. package/dist/scripts/utils/docker-generator.js.map +1 -0
  149. package/dist/scripts/utils/docker-requirement-detector.d.ts +15 -0
  150. package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -0
  151. package/dist/scripts/utils/docker-requirement-detector.js +124 -0
  152. package/dist/scripts/utils/docker-requirement-detector.js.map +1 -0
  153. package/dist/scripts/utils/env-config.d.ts +54 -0
  154. package/dist/scripts/utils/env-config.d.ts.map +1 -0
  155. package/dist/scripts/utils/env-config.js +414 -0
  156. package/dist/scripts/utils/env-config.js.map +1 -0
  157. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts +70 -0
  158. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -0
  159. package/dist/scripts/utils/jira-issue-type-fetcher.js +147 -0
  160. package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -0
  161. package/dist/scripts/utils/language-detector.d.ts +14 -0
  162. package/dist/scripts/utils/language-detector.d.ts.map +1 -0
  163. package/dist/scripts/utils/language-detector.js +119 -0
  164. package/dist/scripts/utils/language-detector.js.map +1 -0
  165. package/dist/scripts/utils/markdown-parser.d.ts +55 -0
  166. package/dist/scripts/utils/markdown-parser.d.ts.map +1 -0
  167. package/dist/scripts/utils/markdown-parser.js +289 -0
  168. package/dist/scripts/utils/markdown-parser.js.map +1 -0
  169. package/dist/scripts/utils/project-detector.d.ts +17 -0
  170. package/dist/scripts/utils/project-detector.d.ts.map +1 -0
  171. package/dist/scripts/utils/project-detector.js +166 -0
  172. package/dist/scripts/utils/project-detector.js.map +1 -0
  173. package/dist/scripts/utils/project-finder.js +2 -2
  174. package/dist/scripts/utils/project-finder.js.map +1 -1
  175. package/dist/scripts/utils/release-notes-generator.d.ts +56 -0
  176. package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -0
  177. package/dist/scripts/utils/release-notes-generator.js +162 -0
  178. package/dist/scripts/utils/release-notes-generator.js.map +1 -0
  179. package/dist/scripts/utils/spec-loader.d.ts +79 -0
  180. package/dist/scripts/utils/spec-loader.d.ts.map +1 -0
  181. package/dist/scripts/utils/spec-loader.js +80 -0
  182. package/dist/scripts/utils/spec-loader.js.map +1 -0
  183. package/dist/scripts/utils/spec-updater.d.ts +7 -0
  184. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  185. package/dist/scripts/utils/spec-updater.js.map +1 -1
  186. package/dist/scripts/utils/tasks-converter.d.ts +57 -0
  187. package/dist/scripts/utils/tasks-converter.d.ts.map +1 -0
  188. package/dist/scripts/utils/tasks-converter.js +322 -0
  189. package/dist/scripts/utils/tasks-converter.js.map +1 -0
  190. package/dist/scripts/utils/tasks-format-validator.d.ts +36 -0
  191. package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -0
  192. package/dist/scripts/utils/tasks-format-validator.js +158 -0
  193. package/dist/scripts/utils/tasks-format-validator.js.map +1 -0
  194. package/dist/scripts/utils/template-applier.d.ts +37 -0
  195. package/dist/scripts/utils/template-applier.d.ts.map +1 -0
  196. package/dist/scripts/utils/template-applier.js +129 -0
  197. package/dist/scripts/utils/template-applier.js.map +1 -0
  198. package/dist/scripts/utils/test-config-generator.d.ts +12 -0
  199. package/dist/scripts/utils/test-config-generator.d.ts.map +1 -0
  200. package/dist/scripts/utils/test-config-generator.js +185 -0
  201. package/dist/scripts/utils/test-config-generator.js.map +1 -0
  202. package/dist/scripts/utils/test-runner.d.ts +31 -0
  203. package/dist/scripts/utils/test-runner.d.ts.map +1 -0
  204. package/dist/scripts/utils/test-runner.js +103 -0
  205. package/dist/scripts/utils/test-runner.js.map +1 -0
  206. package/dist/scripts/validate-phase.d.ts +1 -1
  207. package/dist/scripts/validate-phase.d.ts.map +1 -1
  208. package/dist/scripts/validate-phase.js +153 -5
  209. package/dist/scripts/validate-phase.js.map +1 -1
  210. package/dist/scripts/workflow-orchestrator.d.ts +8 -0
  211. package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
  212. package/dist/scripts/workflow-orchestrator.js +108 -7
  213. package/dist/scripts/workflow-orchestrator.js.map +1 -1
  214. package/dist/src/__tests__/integration/internationalization.test.d.ts +8 -0
  215. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +1 -0
  216. package/dist/src/__tests__/integration/internationalization.test.js +333 -0
  217. package/dist/src/__tests__/integration/internationalization.test.js.map +1 -0
  218. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +1 -1
  219. package/dist/src/__tests__/integration/setup/claude-agent.test.js +17 -20
  220. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -1
  221. package/dist/src/__tests__/integration/setup/cursor.test.js +23 -19
  222. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -1
  223. package/dist/src/__tests__/integration/setup/validation.test.js +41 -58
  224. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -1
  225. package/dist/src/cli.d.ts.map +1 -1
  226. package/dist/src/cli.js +208 -18
  227. package/dist/src/cli.js.map +1 -1
  228. package/dist/src/commands/setup-existing.d.ts +3 -0
  229. package/dist/src/commands/setup-existing.d.ts.map +1 -1
  230. package/dist/src/commands/setup-existing.js +334 -47
  231. package/dist/src/commands/setup-existing.js.map +1 -1
  232. package/docs/README.md +3 -1
  233. package/docs/context.md +59 -0
  234. package/docs/design-issue-55.md +240 -0
  235. package/docs/design-issue-56.md +181 -0
  236. package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
  237. package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
  238. package/docs/plan.md +275 -0
  239. package/docs/user-guide/getting-started/github-token-setup.md +509 -0
  240. package/docs/{getting-started → user-guide/getting-started}/quick-start.md +16 -0
  241. package/docs/{getting-started → user-guide/getting-started}/setup.md +28 -1
  242. package/docs/user-guide/guides/internationalization.md +540 -0
  243. package/docs/{guides → user-guide/guides}/multi-project.md +1 -1
  244. package/docs/{guides → user-guide/guides}/phase-automation.md +67 -9
  245. package/docs/user-guide/guides/workflow.md +582 -0
  246. package/docs/user-guide/hands-on/README.md +142 -0
  247. package/docs/user-guide/hands-on/claude-agent-setup.md +455 -0
  248. package/docs/user-guide/hands-on/claude-setup.md +398 -0
  249. package/docs/user-guide/hands-on/cursor-setup.md +352 -0
  250. package/docs/user-guide/hands-on/troubleshooting.md +964 -0
  251. package/docs/user-guide/hands-on/verification-checklist.md +438 -0
  252. package/docs/user-guide/hands-on/workflow-walkthrough.md +906 -0
  253. package/docs/user-guide/reference/config.md +564 -0
  254. package/docs/{reference → user-guide/reference}/quick-reference.md +53 -40
  255. package/docs/user-guide/release/ci-setup.md +541 -0
  256. package/docs/user-guide/release/release-flow.md +476 -0
  257. package/docs/user-guide/templates/test-specs/README.md +173 -0
  258. package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
  259. package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
  260. package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
  261. package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
  262. package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
  263. package/docs/{testing → user-guide/testing}/integration-tests.md +24 -9
  264. package/docs/user-guide/testing/tdd-cycle.md +349 -0
  265. package/docs/user-guide/testing/test-execution-flow.md +396 -0
  266. package/docs/user-guide/testing/test-failure-handling.md +521 -0
  267. package/docs/user-guide/testing/test-planning-flow.md +181 -0
  268. package/docs/user-guide/testing-strategy.md +185 -0
  269. package/docs/verification-guide.md +518 -0
  270. package/package.json +7 -2
  271. package/scripts/__tests__/create-project.test.ts +67 -49
  272. package/scripts/__tests__/jira-transitions.test.ts +225 -0
  273. package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
  274. package/scripts/__tests__/setup-existing-project.test.ts +98 -1
  275. package/scripts/__tests__/setup-interactive.test.ts +52 -46
  276. package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
  277. package/scripts/__tests__/spec-loader.test.ts +199 -0
  278. package/scripts/__tests__/validate-phase.test.ts +78 -54
  279. package/scripts/config/config-schema.ts +89 -50
  280. package/scripts/config-interactive.ts +191 -136
  281. package/scripts/confluence-sync.ts +0 -12
  282. package/scripts/constants/__tests__/environments.test.ts +42 -6
  283. package/scripts/constants/environments.ts +33 -13
  284. package/scripts/constants/test-commands.ts +96 -0
  285. package/scripts/jira-sync.ts +767 -232
  286. package/scripts/markdown-to-confluence.ts +1 -1
  287. package/scripts/phase-runner.ts +1056 -63
  288. package/scripts/pr-automation.ts +0 -1
  289. package/scripts/pre-flight-check.ts +1 -1
  290. package/scripts/pre-publish-check.sh +311 -0
  291. package/scripts/quick-verify.sh +115 -0
  292. package/scripts/setup-existing-project.ts +201 -117
  293. package/scripts/setup-interactive.ts +4 -4
  294. package/scripts/spec-impl-workflow.ts +505 -0
  295. package/scripts/template/__tests__/renderer.test.ts +1 -2
  296. package/scripts/test-execution-generator.ts +695 -0
  297. package/scripts/test-interactive.ts +779 -0
  298. package/scripts/test-new-features.ts +168 -0
  299. package/scripts/test-npm-package.sh +345 -0
  300. package/scripts/test-spec-generator.ts +574 -0
  301. package/scripts/test-workflow-stages.ts +53 -0
  302. package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
  303. package/scripts/utils/__tests__/business-days.test.ts +214 -0
  304. package/scripts/utils/__tests__/config-loader.test.ts +1 -1
  305. package/scripts/utils/__tests__/config-validator.test.ts +309 -88
  306. package/scripts/utils/__tests__/env-config.test.ts +259 -0
  307. package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
  308. package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
  309. package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
  310. package/scripts/utils/__tests__/test-runner.test.ts +77 -0
  311. package/scripts/utils/aidlc-parser.ts +289 -0
  312. package/scripts/utils/business-days.ts +115 -0
  313. package/scripts/utils/ci-generator.ts +84 -0
  314. package/scripts/utils/config-loader.ts +2 -2
  315. package/scripts/utils/config-validator.ts +304 -117
  316. package/scripts/utils/confluence-approval.ts +167 -0
  317. package/scripts/utils/confluence-hierarchy.ts +2 -4
  318. package/scripts/utils/docker-generator.ts +151 -0
  319. package/scripts/utils/docker-requirement-detector.ts +153 -0
  320. package/scripts/utils/env-config.ts +526 -0
  321. package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
  322. package/scripts/utils/language-detector.ts +139 -0
  323. package/scripts/utils/markdown-parser.ts +376 -0
  324. package/scripts/utils/project-detector.ts +192 -0
  325. package/scripts/utils/project-finder.ts +2 -2
  326. package/scripts/utils/release-notes-generator.ts +210 -0
  327. package/scripts/utils/spec-loader.ts +125 -0
  328. package/scripts/utils/spec-updater.ts +8 -1
  329. package/scripts/utils/tasks-converter.ts +601 -0
  330. package/scripts/utils/tasks-format-validator.ts +193 -0
  331. package/scripts/utils/template-applier.ts +202 -0
  332. package/scripts/utils/test-config-generator.ts +210 -0
  333. package/scripts/utils/test-runner.ts +133 -0
  334. package/scripts/validate-phase.ts +186 -9
  335. package/scripts/workflow-orchestrator.ts +130 -12
  336. package/templates/ci/github-actions/java.yml +54 -0
  337. package/templates/ci/github-actions/nodejs.yml +46 -0
  338. package/templates/ci/github-actions/php.yml +52 -0
  339. package/templates/ci/screwdriver/java.yaml +17 -0
  340. package/templates/ci/screwdriver/nodejs.yaml +17 -0
  341. package/templates/ci/screwdriver/php.yaml +20 -0
  342. package/templates/claude/commands/kiro/kiro-spec-impl.md +244 -0
  343. package/templates/claude/commands/kiro/kiro-spec-tasks.md +354 -0
  344. package/templates/claude-agent/README.md +7 -1
  345. package/templates/claude-agent/agents/.gitkeep +0 -0
  346. package/templates/claude-agent/agents/designer.md +79 -0
  347. package/templates/claude-agent/agents/developer.md +68 -0
  348. package/templates/claude-agent/agents/manager-agent.md +59 -0
  349. package/templates/claude-agent/agents/tester.md +101 -0
  350. package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
  351. package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
  352. package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
  353. package/templates/cline/rules/atlassian-integration.md +36 -0
  354. package/templates/cline/rules/michi-core.md +56 -0
  355. package/templates/codex/AGENTS.override.md +277 -0
  356. package/templates/codex/prompts/confluence-sync.md +177 -0
  357. package/templates/codex/rules/README.md +210 -0
  358. package/templates/common/.kiro/project.json.template +21 -0
  359. package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
  360. package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
  361. package/templates/gemini/commands/README.md +41 -0
  362. package/templates/gemini/rules/GEMINI.md +80 -0
  363. package/docs/guides/workflow.md +0 -342
  364. package/docs/reference/config.md +0 -545
  365. package/scripts/setup-existing.sh +0 -279
  366. /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
  367. /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
  368. /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
  369. /package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +0 -0
  370. /package/docs/{guides → user-guide/guides}/customization.md +0 -0
  371. /package/docs/{reference → user-guide/reference}/tasks-template.md +0 -0
@@ -0,0 +1,695 @@
1
+ /**
2
+ * テスト実行ファイル生成エンジン
3
+ * Phase Bで選択されたテストタイプに基づいて実行ファイルを生成
4
+ */
5
+
6
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, chmodSync } from 'fs';
7
+ import { join } from 'path';
8
+
9
+ /**
10
+ * テスト実行ファイルの生成オプション
11
+ */
12
+ export interface TestExecutionOptions {
13
+ feature: string;
14
+ testType: string;
15
+ projectRoot?: string;
16
+ baseUrl?: string;
17
+ endpoint?: string;
18
+ method?: string;
19
+ language?: string;
20
+ }
21
+
22
+ /**
23
+ * 生成結果
24
+ */
25
+ export interface GenerationResult {
26
+ testType: string;
27
+ files: string[];
28
+ success: boolean;
29
+ error?: string;
30
+ }
31
+
32
+ /**
33
+ * design.mdからエンドポイント情報を抽出
34
+ */
35
+ function extractEndpointsFromDesign(designPath: string): { endpoint: string; method: string; baseUrl: string }[] {
36
+ if (!existsSync(designPath)) {
37
+ return [{ endpoint: '/api/health', method: 'GET', baseUrl: 'http://localhost:8080' }];
38
+ }
39
+
40
+ const content = readFileSync(designPath, 'utf-8');
41
+ const endpoints: { endpoint: string; method: string; baseUrl: string }[] = [];
42
+
43
+ // APIエンドポイントのパターンを検索
44
+ const apiPattern = /(?:GET|POST|PUT|DELETE|PATCH)\s+([\w\-/{}]+)/gi;
45
+ let match;
46
+
47
+ while ((match = apiPattern.exec(content)) !== null) {
48
+ const method = match[0].split(/\s+/)[0].toUpperCase();
49
+ const endpoint = match[1];
50
+ endpoints.push({
51
+ endpoint,
52
+ method,
53
+ baseUrl: 'http://localhost:8080'
54
+ });
55
+ }
56
+
57
+ // デフォルト値
58
+ if (endpoints.length === 0) {
59
+ endpoints.push({ endpoint: '/api/health', method: 'GET', baseUrl: 'http://localhost:8080' });
60
+ }
61
+
62
+ return endpoints;
63
+ }
64
+
65
+ /**
66
+ * requirements.mdからパフォーマンス要件を抽出
67
+ */
68
+ function extractPerformanceRequirements(requirementsPath: string): {
69
+ targetRps: string;
70
+ targetResponseTime: string;
71
+ maxErrorRate: string;
72
+ } {
73
+ const defaults = {
74
+ targetRps: '100',
75
+ targetResponseTime: '500',
76
+ maxErrorRate: '1'
77
+ };
78
+
79
+ if (!existsSync(requirementsPath)) {
80
+ return defaults;
81
+ }
82
+
83
+ const content = readFileSync(requirementsPath, 'utf-8');
84
+
85
+ // レスポンスタイム要件を検索
86
+ const responseTimeMatch = content.match(/(\d+)\s*(?:ms|ミリ秒)以内/);
87
+ if (responseTimeMatch) {
88
+ defaults.targetResponseTime = responseTimeMatch[1];
89
+ }
90
+
91
+ // RPS要件を検索
92
+ const rpsMatch = content.match(/(\d+)\s*(?:RPS|リクエスト\/秒|req\/s)/i);
93
+ if (rpsMatch) {
94
+ defaults.targetRps = rpsMatch[1];
95
+ }
96
+
97
+ return defaults;
98
+ }
99
+
100
+ /**
101
+ * 負荷テスト(Locust)実行ファイルを生成
102
+ */
103
+ export async function generateLoadTestExecution(
104
+ options: TestExecutionOptions
105
+ ): Promise<GenerationResult> {
106
+ const { feature, projectRoot = process.cwd() } = options;
107
+ const files: string[] = [];
108
+
109
+ try {
110
+ const designPath = join(projectRoot, '.kiro', 'specs', feature, 'design.md');
111
+ const requirementsPath = join(projectRoot, '.kiro', 'specs', feature, 'requirements.md');
112
+ const outputDir = join(projectRoot, '.kiro', 'specs', feature, 'test-execution', 'performance');
113
+
114
+ mkdirSync(outputDir, { recursive: true });
115
+
116
+ // 設計書からエンドポイント情報を抽出
117
+ const endpoints = extractEndpointsFromDesign(designPath);
118
+ const mainEndpoint = endpoints[0];
119
+
120
+ // 要件からパフォーマンス要件を抽出
121
+ const perfReqs = extractPerformanceRequirements(requirementsPath);
122
+
123
+ // locustfile.py を生成
124
+ const locustContent = generateLocustFile(feature, mainEndpoint, perfReqs);
125
+ const locustPath = join(outputDir, 'locustfile.py');
126
+ writeFileSync(locustPath, locustContent, 'utf-8');
127
+ files.push(locustPath);
128
+
129
+ // 負荷テスト計画書を生成
130
+ const planContent = generateLoadTestPlan(feature, mainEndpoint, perfReqs);
131
+ const planPath = join(outputDir, 'load-test-plan.md');
132
+ writeFileSync(planPath, planContent, 'utf-8');
133
+ files.push(planPath);
134
+
135
+ return { testType: 'performance', files, success: true };
136
+ } catch (error) {
137
+ return {
138
+ testType: 'performance',
139
+ files,
140
+ success: false,
141
+ error: error instanceof Error ? error.message : String(error)
142
+ };
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Locustファイルを生成
148
+ */
149
+ function generateLocustFile(
150
+ feature: string,
151
+ endpoint: { endpoint: string; method: string; baseUrl: string },
152
+ perfReqs: { targetRps: string; targetResponseTime: string }
153
+ ): string {
154
+ const methodLower = endpoint.method.toLowerCase();
155
+ const hasBody = ['post', 'put', 'patch'].includes(methodLower);
156
+ const className = feature.replace(/[^a-zA-Z0-9]/g, '');
157
+
158
+ let taskCode = '';
159
+ if (hasBody) {
160
+ taskCode = ` self.client.${methodLower}(
161
+ "${endpoint.endpoint}",
162
+ json={},
163
+ headers={"Content-Type": "application/json"}
164
+ )`;
165
+ } else {
166
+ taskCode = ` self.client.${methodLower}("${endpoint.endpoint}")`;
167
+ }
168
+
169
+ return `"""
170
+ ${feature} 負荷テスト
171
+ 自動生成: michi phase:run ${feature} phase-b
172
+
173
+ 目標:
174
+ - RPS: ${perfReqs.targetRps}
175
+ - 応答時間: ${perfReqs.targetResponseTime}ms以内
176
+ """
177
+
178
+ from locust import HttpUser, task, between
179
+
180
+
181
+ class ${className}User(HttpUser):
182
+ """テスト対象ユーザーシミュレーション"""
183
+
184
+ wait_time = between(1, 3)
185
+ host = "${endpoint.baseUrl}"
186
+
187
+ @task
188
+ def test_endpoint(self):
189
+ """${endpoint.endpoint}への${endpoint.method}リクエスト"""
190
+ ${taskCode}
191
+
192
+
193
+ # 実行方法:
194
+ # locust -f locustfile.py --users 100 --spawn-rate 10 --run-time 5m
195
+ #
196
+ # Web UI: http://localhost:8089
197
+ `;
198
+ }
199
+
200
+ /**
201
+ * 負荷テスト計画書を生成
202
+ */
203
+ function generateLoadTestPlan(
204
+ feature: string,
205
+ endpoint: { endpoint: string; method: string; baseUrl: string },
206
+ perfReqs: { targetRps: string; targetResponseTime: string; maxErrorRate: string }
207
+ ): string {
208
+ return `# ${feature} 負荷テスト計画
209
+
210
+ ## 概要
211
+
212
+ - **対象**: ${endpoint.endpoint}
213
+ - **HTTPメソッド**: ${endpoint.method}
214
+ - **ベースURL**: ${endpoint.baseUrl}
215
+ - **生成日**: ${new Date().toISOString().split('T')[0]}
216
+
217
+ ## 成功基準
218
+
219
+ | 指標 | 目標値 |
220
+ |------|--------|
221
+ | RPS | ${perfReqs.targetRps} |
222
+ | 平均応答時間 | ${perfReqs.targetResponseTime}ms以内 |
223
+ | P95応答時間 | ${parseInt(perfReqs.targetResponseTime) * 2}ms以内 |
224
+ | P99応答時間 | ${parseInt(perfReqs.targetResponseTime) * 4}ms以内 |
225
+ | エラー率 | ${perfReqs.maxErrorRate}%以下 |
226
+
227
+ ## 実行手順
228
+
229
+ ### 1. 環境準備
230
+
231
+ \`\`\`bash
232
+ # Locustインストール
233
+ pip install locust
234
+
235
+ # テスト対象アプリケーションを起動
236
+ # (別ターミナルで実行)
237
+ \`\`\`
238
+
239
+ ### 2. 負荷テスト実行
240
+
241
+ \`\`\`bash
242
+ # このディレクトリに移動
243
+ cd .kiro/specs/${feature}/test-execution/performance
244
+
245
+ # Locust起動(Web UI)
246
+ locust -f locustfile.py
247
+
248
+ # またはヘッドレス実行
249
+ locust -f locustfile.py --headless \\
250
+ --users 100 \\
251
+ --spawn-rate 10 \\
252
+ --run-time 5m \\
253
+ --html report.html
254
+ \`\`\`
255
+
256
+ ### 3. 結果確認
257
+
258
+ - **Web UI**: http://localhost:8089
259
+ - **HTMLレポート**: report.html
260
+
261
+ ## テスト結果
262
+
263
+ | 項目 | 結果 | 判定 |
264
+ |------|------|------|
265
+ | 平均応答時間 | ___ms | [ ] Pass / [ ] Fail |
266
+ | P95応答時間 | ___ms | [ ] Pass / [ ] Fail |
267
+ | P99応答時間 | ___ms | [ ] Pass / [ ] Fail |
268
+ | エラー率 | __% | [ ] Pass / [ ] Fail |
269
+
270
+ ## 備考
271
+
272
+ `;
273
+ }
274
+
275
+ /**
276
+ * セキュリティテスト(OWASP ZAP)実行ファイルを生成
277
+ */
278
+ export async function generateSecurityTestExecution(
279
+ options: TestExecutionOptions
280
+ ): Promise<GenerationResult> {
281
+ const { feature, projectRoot = process.cwd() } = options;
282
+ const files: string[] = [];
283
+
284
+ try {
285
+ const designPath = join(projectRoot, '.kiro', 'specs', feature, 'design.md');
286
+ const outputDir = join(projectRoot, '.kiro', 'specs', feature, 'test-execution', 'security');
287
+
288
+ mkdirSync(outputDir, { recursive: true });
289
+
290
+ // 設計書からエンドポイント情報を抽出
291
+ const endpoints = extractEndpointsFromDesign(designPath);
292
+ const mainEndpoint = endpoints[0];
293
+
294
+ // zap-config.yaml を生成
295
+ const zapConfigContent = generateZapConfig(feature, mainEndpoint);
296
+ const zapConfigPath = join(outputDir, 'zap-config.yaml');
297
+ writeFileSync(zapConfigPath, zapConfigContent, 'utf-8');
298
+ files.push(zapConfigPath);
299
+
300
+ // run-zap-scan.sh を生成
301
+ const zapScriptContent = generateZapScript(feature, mainEndpoint);
302
+ const zapScriptPath = join(outputDir, 'run-zap-scan.sh');
303
+ writeFileSync(zapScriptPath, zapScriptContent, 'utf-8');
304
+ chmodSync(zapScriptPath, '755');
305
+ files.push(zapScriptPath);
306
+
307
+ // セキュリティテスト計画書を生成
308
+ const planContent = generateSecurityTestPlan(feature, mainEndpoint);
309
+ const planPath = join(outputDir, 'security-test-plan.md');
310
+ writeFileSync(planPath, planContent, 'utf-8');
311
+ files.push(planPath);
312
+
313
+ return { testType: 'security', files, success: true };
314
+ } catch (error) {
315
+ return {
316
+ testType: 'security',
317
+ files,
318
+ success: false,
319
+ error: error instanceof Error ? error.message : String(error)
320
+ };
321
+ }
322
+ }
323
+
324
+ /**
325
+ * ZAP設定ファイルを生成
326
+ */
327
+ function generateZapConfig(
328
+ feature: string,
329
+ endpoint: { endpoint: string; baseUrl: string }
330
+ ): string {
331
+ return `# OWASP ZAP設定
332
+ # 自動生成: michi phase:run ${feature} phase-b
333
+
334
+ env:
335
+ contexts:
336
+ - name: "${feature}"
337
+ urls:
338
+ - "${endpoint.baseUrl}"
339
+ excludePaths:
340
+ - "/health.*"
341
+ - "/metrics.*"
342
+
343
+ jobs:
344
+ - type: spider
345
+ parameters:
346
+ context: "${feature}"
347
+ maxDuration: 5
348
+ maxDepth: 5
349
+
350
+ - type: activeScan
351
+ parameters:
352
+ context: "${feature}"
353
+ policy: "Default Policy"
354
+ maxRuleDurationInMins: 5
355
+ maxScanDurationInMins: 30
356
+
357
+ - type: report
358
+ parameters:
359
+ template: "traditional-html"
360
+ reportDir: "./reports"
361
+ reportFile: "zap-report"
362
+ `;
363
+ }
364
+
365
+ /**
366
+ * ZAP実行スクリプトを生成
367
+ */
368
+ function generateZapScript(
369
+ feature: string,
370
+ endpoint: { baseUrl: string }
371
+ ): string {
372
+ return `#!/bin/bash
373
+ # OWASP ZAPセキュリティスキャン実行スクリプト
374
+ # 自動生成: michi phase:run ${feature} phase-b
375
+
376
+ set -e
377
+
378
+ # 変数定義
379
+ TARGET_URL="${endpoint.baseUrl}"
380
+ CONFIG_FILE="zap-config.yaml"
381
+ REPORT_DIR="./reports"
382
+
383
+ # レポートディレクトリ作成
384
+ mkdir -p "\${REPORT_DIR}"
385
+
386
+ echo "🔐 OWASP ZAPセキュリティスキャン開始"
387
+ echo "対象: \${TARGET_URL}"
388
+ echo "設定: \${CONFIG_FILE}"
389
+
390
+ # Docker経由でZAPを実行
391
+ docker run --rm -v "$(pwd):/zap/wrk:rw" \\
392
+ -t ghcr.io/zaproxy/zaproxy:stable \\
393
+ zap.sh -cmd \\
394
+ -autorun /zap/wrk/\${CONFIG_FILE}
395
+
396
+ echo "✅ スキャン完了"
397
+ echo "レポート: \${REPORT_DIR}/zap-report.html"
398
+ `;
399
+ }
400
+
401
+ /**
402
+ * セキュリティテスト計画書を生成
403
+ */
404
+ function generateSecurityTestPlan(
405
+ feature: string,
406
+ endpoint: { endpoint: string; baseUrl: string }
407
+ ): string {
408
+ return `# ${feature} セキュリティテスト計画
409
+
410
+ ## 概要
411
+
412
+ - **対象**: ${endpoint.baseUrl}
413
+ - **ツール**: OWASP ZAP
414
+ - **生成日**: ${new Date().toISOString().split('T')[0]}
415
+
416
+ ## 検出対象の脆弱性
417
+
418
+ - SQLインジェクション
419
+ - XSS(クロスサイトスクリプティング)
420
+ - CSRF(クロスサイトリクエストフォージェリ)
421
+ - 認証・認可の問題
422
+ - セキュリティヘッダーの不備
423
+
424
+ ## 実行手順
425
+
426
+ ### 1. 環境準備
427
+
428
+ \`\`\`bash
429
+ # Docker Desktopを起動
430
+
431
+ # テスト対象アプリケーションを起動
432
+ # (別ターミナルで実行)
433
+ \`\`\`
434
+
435
+ ### 2. セキュリティスキャン実行
436
+
437
+ \`\`\`bash
438
+ # このディレクトリに移動
439
+ cd .kiro/specs/${feature}/test-execution/security
440
+
441
+ # スキャン実行
442
+ ./run-zap-scan.sh
443
+ \`\`\`
444
+
445
+ ### 3. 結果確認
446
+
447
+ - **HTMLレポート**: reports/zap-report.html
448
+
449
+ ## テスト結果
450
+
451
+ | 重要度 | 検出数 | 対応状況 |
452
+ |--------|--------|----------|
453
+ | High | ___ | [ ] 対応済み |
454
+ | Medium | ___ | [ ] 対応済み |
455
+ | Low | ___ | [ ] 対応済み |
456
+ | Informational | ___ | - |
457
+
458
+ ## 備考
459
+
460
+ `;
461
+ }
462
+
463
+ /**
464
+ * 手動回帰テスト実行ファイルを生成
465
+ */
466
+ export async function generateManualRegressionExecution(
467
+ options: TestExecutionOptions
468
+ ): Promise<GenerationResult> {
469
+ const { feature, projectRoot = process.cwd() } = options;
470
+ const files: string[] = [];
471
+
472
+ try {
473
+ const designPath = join(projectRoot, '.kiro', 'specs', feature, 'design.md');
474
+ const outputDir = join(projectRoot, '.kiro', 'specs', feature, 'test-execution', 'manual-regression');
475
+
476
+ mkdirSync(outputDir, { recursive: true });
477
+
478
+ // 設計書からエンドポイント情報を抽出
479
+ const endpoints = extractEndpointsFromDesign(designPath);
480
+
481
+ // 手動回帰テストガイドを生成
482
+ const guideContent = generateManualRegressionGuide(feature, endpoints);
483
+ const guidePath = join(outputDir, 'manual-regression-guide.md');
484
+ writeFileSync(guidePath, guideContent, 'utf-8');
485
+ files.push(guidePath);
486
+
487
+ return { testType: 'manual-regression', files, success: true };
488
+ } catch (error) {
489
+ return {
490
+ testType: 'manual-regression',
491
+ files,
492
+ success: false,
493
+ error: error instanceof Error ? error.message : String(error)
494
+ };
495
+ }
496
+ }
497
+
498
+ /**
499
+ * 手動回帰テストガイドを生成
500
+ */
501
+ function generateManualRegressionGuide(
502
+ feature: string,
503
+ endpoints: { endpoint: string; method: string; baseUrl: string }[]
504
+ ): string {
505
+ let testCases = '';
506
+ let tcCounter = 1;
507
+
508
+ for (const ep of endpoints) {
509
+ testCases += `
510
+ ### TC-${String(tcCounter++).padStart(3, '0')}: ${ep.method} ${ep.endpoint}
511
+
512
+ \`\`\`bash
513
+ curl -X ${ep.method} ${ep.baseUrl}${ep.endpoint} \\
514
+ -H "Content-Type: application/json"
515
+ \`\`\`
516
+
517
+ | 項目 | 値 |
518
+ |------|-----|
519
+ | 期待ステータス | 200 |
520
+ | 確認 | [ ] Pass / [ ] Fail |
521
+
522
+ `;
523
+ }
524
+
525
+ return `# ${feature} 手動回帰テストガイド
526
+
527
+ ## 概要
528
+
529
+ - **対象**: ${feature}
530
+ - **生成日**: ${new Date().toISOString().split('T')[0]}
531
+
532
+ ## 環境準備
533
+
534
+ \`\`\`bash
535
+ # テスト対象アプリケーションを起動
536
+ # 別ターミナルで実行
537
+ \`\`\`
538
+
539
+ ## テストケース
540
+ ${testCases}
541
+
542
+ ## テスト結果サマリー
543
+
544
+ | 項目 | 結果 |
545
+ |------|------|
546
+ | 総テスト数 | ${endpoints.length} |
547
+ | 成功 | ___ |
548
+ | 失敗 | ___ |
549
+ | 実施日 | ____ |
550
+ | 実施者 | ____ |
551
+
552
+ ## 備考
553
+
554
+ `;
555
+ }
556
+
557
+ /**
558
+ * 統合テスト/E2Eテスト実行ファイルを生成
559
+ */
560
+ export async function generateIntegrationE2EExecution(
561
+ options: TestExecutionOptions & { testType: 'integration' | 'e2e' }
562
+ ): Promise<GenerationResult> {
563
+ const { feature, testType, projectRoot = process.cwd() } = options;
564
+ const files: string[] = [];
565
+
566
+ try {
567
+ const outputDir = join(projectRoot, '.kiro', 'specs', feature, 'test-execution', testType);
568
+ mkdirSync(outputDir, { recursive: true });
569
+
570
+ // チェックリストを生成
571
+ const checklistContent = generateIntegrationE2EChecklist(feature, testType);
572
+ const checklistPath = join(outputDir, `${testType}-checklist.md`);
573
+ writeFileSync(checklistPath, checklistContent, 'utf-8');
574
+ files.push(checklistPath);
575
+
576
+ return { testType, files, success: true };
577
+ } catch (error) {
578
+ return {
579
+ testType,
580
+ files,
581
+ success: false,
582
+ error: error instanceof Error ? error.message : String(error)
583
+ };
584
+ }
585
+ }
586
+
587
+ /**
588
+ * 統合/E2Eテストチェックリストを生成
589
+ */
590
+ function generateIntegrationE2EChecklist(
591
+ feature: string,
592
+ testType: 'integration' | 'e2e'
593
+ ): string {
594
+ const title = testType === 'integration' ? '統合テスト' : 'E2Eテスト';
595
+
596
+ return `# ${feature} ${title}チェックリスト
597
+
598
+ ## 概要
599
+
600
+ - **対象**: ${feature}
601
+ - **テストタイプ**: ${title}
602
+ - **生成日**: ${new Date().toISOString().split('T')[0]}
603
+
604
+ ## 事前準備
605
+
606
+ - [ ] テスト環境が起動している
607
+ - [ ] テストデータが準備されている
608
+ - [ ] 依存サービスが正常に動作している
609
+
610
+ ## テストシナリオ
611
+
612
+ ### シナリオ1: 正常系フロー
613
+
614
+ - [ ] ステップ1: (具体的な操作を記載)
615
+ - [ ] ステップ2: (具体的な操作を記載)
616
+ - [ ] ステップ3: (具体的な操作を記載)
617
+ - [ ] 期待結果の確認
618
+
619
+ ### シナリオ2: 異常系フロー
620
+
621
+ - [ ] エラー条件でのテスト
622
+ - [ ] エラーメッセージの確認
623
+ - [ ] リカバリー処理の確認
624
+
625
+ ## テスト結果
626
+
627
+ | シナリオ | 結果 | 備考 |
628
+ |----------|------|------|
629
+ | シナリオ1 | [ ] Pass / [ ] Fail | |
630
+ | シナリオ2 | [ ] Pass / [ ] Fail | |
631
+
632
+ ## 備考
633
+
634
+ `;
635
+ }
636
+
637
+ /**
638
+ * メイン生成関数: テストタイプに応じた実行ファイルを生成
639
+ */
640
+ export async function generateTestExecution(
641
+ feature: string,
642
+ testType: string,
643
+ projectRoot: string = process.cwd()
644
+ ): Promise<GenerationResult> {
645
+ const options: TestExecutionOptions = { feature, projectRoot, testType };
646
+
647
+ switch (testType) {
648
+ case 'performance':
649
+ return await generateLoadTestExecution(options);
650
+ case 'security':
651
+ return await generateSecurityTestExecution(options);
652
+ case 'integration':
653
+ return await generateIntegrationE2EExecution({ ...options, testType: 'integration' });
654
+ case 'e2e':
655
+ return await generateIntegrationE2EExecution({ ...options, testType: 'e2e' });
656
+ case 'manual-regression':
657
+ return await generateManualRegressionExecution(options);
658
+ default:
659
+ return {
660
+ testType,
661
+ files: [],
662
+ success: false,
663
+ error: `未対応のテストタイプ: ${testType}(unit, lint, buildはCI/CD設定で対応)`
664
+ };
665
+ }
666
+ }
667
+
668
+ /**
669
+ * 選択されたすべてのテストタイプの実行ファイルを生成
670
+ */
671
+ export async function generateAllTestExecutions(
672
+ feature: string,
673
+ projectRoot: string = process.cwd()
674
+ ): Promise<GenerationResult[]> {
675
+ const selectionPath = join(projectRoot, '.kiro', 'specs', feature, 'test-type-selection.json');
676
+
677
+ if (!existsSync(selectionPath)) {
678
+ throw new Error('test-type-selection.jsonが存在しません。先にtest-type-selectionフェーズを実行してください');
679
+ }
680
+
681
+ const selection = JSON.parse(readFileSync(selectionPath, 'utf-8'));
682
+ const testTypes: string[] = selection.selectedTypes || [];
683
+
684
+ const results: GenerationResult[] = [];
685
+
686
+ // Phase B対象のテストタイプのみを処理(unit, lint, buildはスキップ)
687
+ const phaseBTypes = testTypes.filter(t => !['unit', 'lint', 'build'].includes(t));
688
+
689
+ for (const testType of phaseBTypes) {
690
+ const result = await generateTestExecution(feature, testType, projectRoot);
691
+ results.push(result);
692
+ }
693
+
694
+ return results;
695
+ }