@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.
Files changed (433) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +420 -49
  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 +146 -5
  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.d.ts +2 -0
  36. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
  37. package/dist/scripts/constants/__tests__/environments.test.js +125 -0
  38. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
  39. package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
  40. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
  41. package/dist/scripts/constants/__tests__/languages.test.js +82 -0
  42. package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
  43. package/dist/scripts/constants/environments.d.ts +33 -0
  44. package/dist/scripts/constants/environments.d.ts.map +1 -0
  45. package/dist/scripts/constants/environments.js +64 -0
  46. package/dist/scripts/constants/environments.js.map +1 -0
  47. package/dist/scripts/constants/languages.d.ts +23 -0
  48. package/dist/scripts/constants/languages.d.ts.map +1 -0
  49. package/dist/scripts/constants/languages.js +53 -0
  50. package/dist/scripts/constants/languages.js.map +1 -0
  51. package/dist/scripts/constants/test-commands.d.ts +36 -0
  52. package/dist/scripts/constants/test-commands.d.ts.map +1 -0
  53. package/dist/scripts/constants/test-commands.js +70 -0
  54. package/dist/scripts/constants/test-commands.js.map +1 -0
  55. package/dist/scripts/create-project.d.ts +4 -0
  56. package/dist/scripts/create-project.d.ts.map +1 -1
  57. package/dist/scripts/create-project.js +51 -22
  58. package/dist/scripts/create-project.js.map +1 -1
  59. package/dist/scripts/jira-sync.d.ts +89 -3
  60. package/dist/scripts/jira-sync.d.ts.map +1 -1
  61. package/dist/scripts/jira-sync.js +366 -96
  62. package/dist/scripts/jira-sync.js.map +1 -1
  63. package/dist/scripts/markdown-to-confluence.js +1 -1
  64. package/dist/scripts/markdown-to-confluence.js.map +1 -1
  65. package/dist/scripts/phase-runner.d.ts +1 -1
  66. package/dist/scripts/phase-runner.d.ts.map +1 -1
  67. package/dist/scripts/phase-runner.js +809 -13
  68. package/dist/scripts/phase-runner.js.map +1 -1
  69. package/dist/scripts/pr-automation.d.ts.map +1 -1
  70. package/dist/scripts/pr-automation.js.map +1 -1
  71. package/dist/scripts/pre-flight-check.js +1 -1
  72. package/dist/scripts/pre-flight-check.js.map +1 -1
  73. package/dist/scripts/setup-existing-project.d.ts +3 -1
  74. package/dist/scripts/setup-existing-project.d.ts.map +1 -1
  75. package/dist/scripts/setup-existing-project.js +165 -78
  76. package/dist/scripts/setup-existing-project.js.map +1 -1
  77. package/dist/scripts/setup-interactive.js +3 -3
  78. package/dist/scripts/setup-interactive.js.map +1 -1
  79. package/dist/scripts/spec-impl-workflow.d.ts +94 -0
  80. package/dist/scripts/spec-impl-workflow.d.ts.map +1 -0
  81. package/dist/scripts/spec-impl-workflow.js +354 -0
  82. package/dist/scripts/spec-impl-workflow.js.map +1 -0
  83. package/dist/scripts/template/__tests__/renderer.test.d.ts +2 -0
  84. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
  85. package/dist/scripts/template/__tests__/renderer.test.js +165 -0
  86. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
  87. package/dist/scripts/template/renderer.d.ts +70 -0
  88. package/dist/scripts/template/renderer.d.ts.map +1 -0
  89. package/dist/scripts/template/renderer.js +99 -0
  90. package/dist/scripts/template/renderer.js.map +1 -0
  91. package/dist/scripts/test-execution-generator.d.ts +52 -0
  92. package/dist/scripts/test-execution-generator.d.ts.map +1 -0
  93. package/dist/scripts/test-execution-generator.js +576 -0
  94. package/dist/scripts/test-execution-generator.js.map +1 -0
  95. package/dist/scripts/test-interactive.d.ts +10 -0
  96. package/dist/scripts/test-interactive.d.ts.map +1 -0
  97. package/dist/scripts/test-interactive.js +627 -0
  98. package/dist/scripts/test-interactive.js.map +1 -0
  99. package/dist/scripts/test-new-features.d.ts +5 -0
  100. package/dist/scripts/test-new-features.d.ts.map +1 -0
  101. package/dist/scripts/test-new-features.js +145 -0
  102. package/dist/scripts/test-new-features.js.map +1 -0
  103. package/dist/scripts/test-spec-generator.d.ts +29 -0
  104. package/dist/scripts/test-spec-generator.d.ts.map +1 -0
  105. package/dist/scripts/test-spec-generator.js +494 -0
  106. package/dist/scripts/test-spec-generator.js.map +1 -0
  107. package/dist/scripts/test-workflow-stages.d.ts +6 -0
  108. package/dist/scripts/test-workflow-stages.d.ts.map +1 -0
  109. package/dist/scripts/test-workflow-stages.js +43 -0
  110. package/dist/scripts/test-workflow-stages.js.map +1 -0
  111. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +5 -0
  112. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +1 -0
  113. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +315 -0
  114. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +1 -0
  115. package/dist/scripts/utils/__tests__/business-days.test.d.ts +5 -0
  116. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +1 -0
  117. package/dist/scripts/utils/__tests__/business-days.test.js +171 -0
  118. package/dist/scripts/utils/__tests__/business-days.test.js.map +1 -0
  119. package/dist/scripts/utils/__tests__/config-loader.test.js +1 -1
  120. package/dist/scripts/utils/__tests__/config-loader.test.js.map +1 -1
  121. package/dist/scripts/utils/__tests__/config-validator.test.js +164 -35
  122. package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
  123. package/dist/scripts/utils/__tests__/env-config.test.d.ts +5 -0
  124. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +1 -0
  125. package/dist/scripts/utils/__tests__/env-config.test.js +218 -0
  126. package/dist/scripts/utils/__tests__/env-config.test.js.map +1 -0
  127. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +5 -0
  128. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +1 -0
  129. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +202 -0
  130. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +1 -0
  131. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +5 -0
  132. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +1 -0
  133. package/dist/scripts/utils/__tests__/tasks-converter.test.js +500 -0
  134. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +1 -0
  135. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +5 -0
  136. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +1 -0
  137. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +314 -0
  138. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +1 -0
  139. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +5 -0
  140. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +1 -0
  141. package/dist/scripts/utils/__tests__/test-runner.test.js +64 -0
  142. package/dist/scripts/utils/__tests__/test-runner.test.js.map +1 -0
  143. package/dist/scripts/utils/aidlc-parser.d.ts +86 -0
  144. package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -0
  145. package/dist/scripts/utils/aidlc-parser.js +208 -0
  146. package/dist/scripts/utils/aidlc-parser.js.map +1 -0
  147. package/dist/scripts/utils/business-days.d.ts +52 -0
  148. package/dist/scripts/utils/business-days.d.ts.map +1 -0
  149. package/dist/scripts/utils/business-days.js +98 -0
  150. package/dist/scripts/utils/business-days.js.map +1 -0
  151. package/dist/scripts/utils/ci-generator.d.ts +14 -0
  152. package/dist/scripts/utils/ci-generator.d.ts.map +1 -0
  153. package/dist/scripts/utils/ci-generator.js +61 -0
  154. package/dist/scripts/utils/ci-generator.js.map +1 -0
  155. package/dist/scripts/utils/config-loader.js +2 -2
  156. package/dist/scripts/utils/config-loader.js.map +1 -1
  157. package/dist/scripts/utils/config-validator.d.ts +7 -1
  158. package/dist/scripts/utils/config-validator.d.ts.map +1 -1
  159. package/dist/scripts/utils/config-validator.js +136 -23
  160. package/dist/scripts/utils/config-validator.js.map +1 -1
  161. package/dist/scripts/utils/confluence-approval.d.ts +46 -0
  162. package/dist/scripts/utils/confluence-approval.d.ts.map +1 -0
  163. package/dist/scripts/utils/confluence-approval.js +118 -0
  164. package/dist/scripts/utils/confluence-approval.js.map +1 -0
  165. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  166. package/dist/scripts/utils/confluence-hierarchy.js +1 -1
  167. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  168. package/dist/scripts/utils/docker-generator.d.ts +9 -0
  169. package/dist/scripts/utils/docker-generator.d.ts.map +1 -0
  170. package/dist/scripts/utils/docker-generator.js +132 -0
  171. package/dist/scripts/utils/docker-generator.js.map +1 -0
  172. package/dist/scripts/utils/docker-requirement-detector.d.ts +15 -0
  173. package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -0
  174. package/dist/scripts/utils/docker-requirement-detector.js +124 -0
  175. package/dist/scripts/utils/docker-requirement-detector.js.map +1 -0
  176. package/dist/scripts/utils/env-config.d.ts +54 -0
  177. package/dist/scripts/utils/env-config.d.ts.map +1 -0
  178. package/dist/scripts/utils/env-config.js +414 -0
  179. package/dist/scripts/utils/env-config.js.map +1 -0
  180. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts +70 -0
  181. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -0
  182. package/dist/scripts/utils/jira-issue-type-fetcher.js +147 -0
  183. package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -0
  184. package/dist/scripts/utils/language-detector.d.ts +14 -0
  185. package/dist/scripts/utils/language-detector.d.ts.map +1 -0
  186. package/dist/scripts/utils/language-detector.js +119 -0
  187. package/dist/scripts/utils/language-detector.js.map +1 -0
  188. package/dist/scripts/utils/markdown-parser.d.ts +55 -0
  189. package/dist/scripts/utils/markdown-parser.d.ts.map +1 -0
  190. package/dist/scripts/utils/markdown-parser.js +289 -0
  191. package/dist/scripts/utils/markdown-parser.js.map +1 -0
  192. package/dist/scripts/utils/project-detector.d.ts +17 -0
  193. package/dist/scripts/utils/project-detector.d.ts.map +1 -0
  194. package/dist/scripts/utils/project-detector.js +166 -0
  195. package/dist/scripts/utils/project-detector.js.map +1 -0
  196. package/dist/scripts/utils/project-finder.js +2 -2
  197. package/dist/scripts/utils/project-finder.js.map +1 -1
  198. package/dist/scripts/utils/release-notes-generator.d.ts +56 -0
  199. package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -0
  200. package/dist/scripts/utils/release-notes-generator.js +162 -0
  201. package/dist/scripts/utils/release-notes-generator.js.map +1 -0
  202. package/dist/scripts/utils/spec-loader.d.ts +79 -0
  203. package/dist/scripts/utils/spec-loader.d.ts.map +1 -0
  204. package/dist/scripts/utils/spec-loader.js +80 -0
  205. package/dist/scripts/utils/spec-loader.js.map +1 -0
  206. package/dist/scripts/utils/spec-updater.d.ts +7 -0
  207. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  208. package/dist/scripts/utils/spec-updater.js.map +1 -1
  209. package/dist/scripts/utils/tasks-converter.d.ts +57 -0
  210. package/dist/scripts/utils/tasks-converter.d.ts.map +1 -0
  211. package/dist/scripts/utils/tasks-converter.js +322 -0
  212. package/dist/scripts/utils/tasks-converter.js.map +1 -0
  213. package/dist/scripts/utils/tasks-format-validator.d.ts +36 -0
  214. package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -0
  215. package/dist/scripts/utils/tasks-format-validator.js +158 -0
  216. package/dist/scripts/utils/tasks-format-validator.js.map +1 -0
  217. package/dist/scripts/utils/template-applier.d.ts +37 -0
  218. package/dist/scripts/utils/template-applier.d.ts.map +1 -0
  219. package/dist/scripts/utils/template-applier.js +129 -0
  220. package/dist/scripts/utils/template-applier.js.map +1 -0
  221. package/dist/scripts/utils/template-finder.d.ts +37 -0
  222. package/dist/scripts/utils/template-finder.d.ts.map +1 -0
  223. package/dist/scripts/utils/template-finder.js +63 -0
  224. package/dist/scripts/utils/template-finder.js.map +1 -0
  225. package/dist/scripts/utils/test-config-generator.d.ts +12 -0
  226. package/dist/scripts/utils/test-config-generator.d.ts.map +1 -0
  227. package/dist/scripts/utils/test-config-generator.js +185 -0
  228. package/dist/scripts/utils/test-config-generator.js.map +1 -0
  229. package/dist/scripts/utils/test-runner.d.ts +31 -0
  230. package/dist/scripts/utils/test-runner.d.ts.map +1 -0
  231. package/dist/scripts/utils/test-runner.js +103 -0
  232. package/dist/scripts/utils/test-runner.js.map +1 -0
  233. package/dist/scripts/validate-phase.d.ts +1 -1
  234. package/dist/scripts/validate-phase.d.ts.map +1 -1
  235. package/dist/scripts/validate-phase.js +153 -5
  236. package/dist/scripts/validate-phase.js.map +1 -1
  237. package/dist/scripts/workflow-orchestrator.d.ts +8 -0
  238. package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
  239. package/dist/scripts/workflow-orchestrator.js +108 -7
  240. package/dist/scripts/workflow-orchestrator.js.map +1 -1
  241. package/dist/src/__tests__/integration/internationalization.test.d.ts +8 -0
  242. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +1 -0
  243. package/dist/src/__tests__/integration/internationalization.test.js +333 -0
  244. package/dist/src/__tests__/integration/internationalization.test.js.map +1 -0
  245. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +5 -0
  246. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
  247. package/dist/src/__tests__/integration/setup/claude-agent.test.js +122 -0
  248. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
  249. package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
  250. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
  251. package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
  252. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
  253. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
  254. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
  255. package/dist/src/__tests__/integration/setup/cursor.test.js +166 -0
  256. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
  257. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
  258. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
  259. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
  260. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
  261. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
  262. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
  263. package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
  264. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
  265. package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
  266. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
  267. package/dist/src/__tests__/integration/setup/validation.test.js +301 -0
  268. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
  269. package/dist/src/cli.d.ts.map +1 -1
  270. package/dist/src/cli.js +228 -18
  271. package/dist/src/cli.js.map +1 -1
  272. package/dist/src/commands/setup-existing.d.ts +25 -0
  273. package/dist/src/commands/setup-existing.d.ts.map +1 -0
  274. package/dist/src/commands/setup-existing.js +695 -0
  275. package/dist/src/commands/setup-existing.js.map +1 -0
  276. package/dist/vitest.config.d.ts.map +1 -1
  277. package/dist/vitest.config.js +4 -3
  278. package/dist/vitest.config.js.map +1 -1
  279. package/docs/README.md +3 -1
  280. package/docs/context.md +59 -0
  281. package/docs/design-issue-55.md +240 -0
  282. package/docs/design-issue-56.md +181 -0
  283. package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
  284. package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
  285. package/docs/plan.md +275 -0
  286. package/docs/user-guide/getting-started/github-token-setup.md +509 -0
  287. package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +108 -28
  288. package/docs/{getting-started → user-guide/getting-started}/quick-start.md +73 -6
  289. package/docs/{getting-started → user-guide/getting-started}/setup.md +278 -3
  290. package/docs/{guides → user-guide/guides}/customization.md +3 -3
  291. package/docs/user-guide/guides/internationalization.md +540 -0
  292. package/docs/{guides → user-guide/guides}/multi-project.md +2 -2
  293. package/docs/{guides → user-guide/guides}/phase-automation.md +67 -9
  294. package/docs/user-guide/guides/workflow.md +582 -0
  295. package/docs/user-guide/hands-on/README.md +142 -0
  296. package/docs/user-guide/hands-on/claude-agent-setup.md +455 -0
  297. package/docs/user-guide/hands-on/claude-setup.md +398 -0
  298. package/docs/user-guide/hands-on/cursor-setup.md +352 -0
  299. package/docs/user-guide/hands-on/troubleshooting.md +964 -0
  300. package/docs/user-guide/hands-on/verification-checklist.md +438 -0
  301. package/docs/user-guide/hands-on/workflow-walkthrough.md +906 -0
  302. package/docs/user-guide/reference/config.md +564 -0
  303. package/docs/{reference → user-guide/reference}/quick-reference.md +75 -53
  304. package/docs/user-guide/release/ci-setup.md +541 -0
  305. package/docs/user-guide/release/release-flow.md +476 -0
  306. package/docs/user-guide/templates/test-specs/README.md +173 -0
  307. package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
  308. package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
  309. package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
  310. package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
  311. package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
  312. package/docs/user-guide/testing/integration-tests.md +312 -0
  313. package/docs/user-guide/testing/tdd-cycle.md +349 -0
  314. package/docs/user-guide/testing/test-execution-flow.md +396 -0
  315. package/docs/user-guide/testing/test-failure-handling.md +521 -0
  316. package/docs/user-guide/testing/test-planning-flow.md +181 -0
  317. package/docs/user-guide/testing-strategy.md +185 -0
  318. package/docs/verification-guide.md +518 -0
  319. package/package.json +13 -3
  320. package/scripts/__tests__/create-project.test.ts +67 -49
  321. package/scripts/__tests__/jira-transitions.test.ts +225 -0
  322. package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
  323. package/scripts/__tests__/setup-existing-project.test.ts +171 -6
  324. package/scripts/__tests__/setup-interactive.test.ts +52 -46
  325. package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
  326. package/scripts/__tests__/spec-loader.test.ts +199 -0
  327. package/scripts/__tests__/validate-phase.test.ts +78 -54
  328. package/scripts/config/config-schema.ts +89 -50
  329. package/scripts/config-interactive.ts +191 -136
  330. package/scripts/confluence-sync.ts +0 -12
  331. package/scripts/constants/__tests__/environments.test.ts +146 -0
  332. package/scripts/constants/__tests__/languages.test.ts +100 -0
  333. package/scripts/constants/environments.ts +81 -0
  334. package/scripts/constants/languages.ts +70 -0
  335. package/scripts/constants/test-commands.ts +96 -0
  336. package/scripts/create-project.ts +52 -22
  337. package/scripts/jira-sync.ts +767 -232
  338. package/scripts/markdown-to-confluence.ts +1 -1
  339. package/scripts/phase-runner.ts +1056 -63
  340. package/scripts/pr-automation.ts +0 -1
  341. package/scripts/pre-flight-check.ts +1 -1
  342. package/scripts/pre-publish-check.sh +311 -0
  343. package/scripts/quick-verify.sh +115 -0
  344. package/scripts/setup-existing-project.ts +306 -143
  345. package/scripts/setup-interactive.ts +4 -4
  346. package/scripts/spec-impl-workflow.ts +505 -0
  347. package/scripts/template/__tests__/renderer.test.ts +206 -0
  348. package/scripts/template/renderer.ts +133 -0
  349. package/scripts/test-execution-generator.ts +695 -0
  350. package/scripts/test-interactive.ts +779 -0
  351. package/scripts/test-new-features.ts +168 -0
  352. package/scripts/test-npm-package.sh +345 -0
  353. package/scripts/test-spec-generator.ts +574 -0
  354. package/scripts/test-workflow-stages.ts +53 -0
  355. package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
  356. package/scripts/utils/__tests__/business-days.test.ts +214 -0
  357. package/scripts/utils/__tests__/config-loader.test.ts +1 -1
  358. package/scripts/utils/__tests__/config-validator.test.ts +309 -88
  359. package/scripts/utils/__tests__/env-config.test.ts +259 -0
  360. package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
  361. package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
  362. package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
  363. package/scripts/utils/__tests__/test-runner.test.ts +77 -0
  364. package/scripts/utils/aidlc-parser.ts +289 -0
  365. package/scripts/utils/business-days.ts +115 -0
  366. package/scripts/utils/ci-generator.ts +84 -0
  367. package/scripts/utils/config-loader.ts +2 -2
  368. package/scripts/utils/config-validator.ts +304 -117
  369. package/scripts/utils/confluence-approval.ts +167 -0
  370. package/scripts/utils/confluence-hierarchy.ts +2 -4
  371. package/scripts/utils/docker-generator.ts +151 -0
  372. package/scripts/utils/docker-requirement-detector.ts +153 -0
  373. package/scripts/utils/env-config.ts +526 -0
  374. package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
  375. package/scripts/utils/language-detector.ts +139 -0
  376. package/scripts/utils/markdown-parser.ts +376 -0
  377. package/scripts/utils/project-detector.ts +192 -0
  378. package/scripts/utils/project-finder.ts +2 -2
  379. package/scripts/utils/release-notes-generator.ts +210 -0
  380. package/scripts/utils/spec-loader.ts +125 -0
  381. package/scripts/utils/spec-updater.ts +8 -1
  382. package/scripts/utils/tasks-converter.ts +601 -0
  383. package/scripts/utils/tasks-format-validator.ts +193 -0
  384. package/scripts/utils/template-applier.ts +202 -0
  385. package/scripts/utils/template-finder.ts +75 -0
  386. package/scripts/utils/test-config-generator.ts +210 -0
  387. package/scripts/utils/test-runner.ts +133 -0
  388. package/scripts/validate-phase.ts +186 -9
  389. package/scripts/workflow-orchestrator.ts +130 -12
  390. package/templates/ci/github-actions/java.yml +54 -0
  391. package/templates/ci/github-actions/nodejs.yml +46 -0
  392. package/templates/ci/github-actions/php.yml +52 -0
  393. package/templates/ci/screwdriver/java.yaml +17 -0
  394. package/templates/ci/screwdriver/nodejs.yaml +17 -0
  395. package/templates/ci/screwdriver/php.yaml +20 -0
  396. package/templates/claude/commands/kiro/kiro-spec-impl.md +244 -0
  397. package/templates/claude/commands/kiro/kiro-spec-tasks.md +354 -0
  398. package/templates/claude/commands/michi/confluence-sync.md +38 -0
  399. package/templates/claude/commands/michi/project-switch.md +36 -0
  400. package/templates/claude/rules/atlassian-integration.md +35 -0
  401. package/templates/claude/rules/michi-core.md +54 -0
  402. package/templates/claude-agent/README.md +31 -0
  403. package/templates/claude-agent/agents/.gitkeep +0 -0
  404. package/templates/claude-agent/agents/designer.md +79 -0
  405. package/templates/claude-agent/agents/developer.md +68 -0
  406. package/templates/claude-agent/agents/manager-agent.md +59 -0
  407. package/templates/claude-agent/agents/tester.md +101 -0
  408. package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
  409. package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
  410. package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
  411. package/templates/cline/rules/atlassian-integration.md +36 -0
  412. package/templates/cline/rules/michi-core.md +56 -0
  413. package/templates/codex/AGENTS.override.md +277 -0
  414. package/templates/codex/prompts/confluence-sync.md +177 -0
  415. package/templates/codex/rules/README.md +210 -0
  416. package/templates/common/.kiro/project.json.template +21 -0
  417. package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
  418. package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
  419. package/templates/cursor/commands/michi/confluence-sync.md +76 -0
  420. package/templates/cursor/commands/michi/project-switch.md +69 -0
  421. package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
  422. package/templates/cursor/rules/github-ssot.mdc +151 -0
  423. package/templates/cursor/rules/multi-project.mdc +81 -0
  424. package/templates/gemini/commands/README.md +41 -0
  425. package/templates/gemini/rules/GEMINI.md +80 -0
  426. package/docs/guides/workflow.md +0 -342
  427. package/docs/reference/config.md +0 -545
  428. package/scripts/setup-env.sh +0 -52
  429. package/scripts/setup-existing.sh +0 -152
  430. /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
  431. /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
  432. /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
  433. /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
+ }