@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
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
7
- import { resolve, join, basename } from 'path';
7
+ import { join, basename } from 'path';
8
8
  import * as readline from 'readline';
9
9
  import { findCurrentProject, findAllProjects, selectProject, findRepositoryRoot } from './utils/project-finder.js';
10
10
  import type { ProjectMetadata } from './utils/project-meta.js';
@@ -375,7 +375,7 @@ async function main(): Promise<number> {
375
375
  const projectsDir = join(repoRoot, 'projects');
376
376
 
377
377
  // プロジェクト検出
378
- const currentProject = findCurrentProject();
378
+ findCurrentProject();
379
379
  const allProjects = findAllProjects();
380
380
 
381
381
  let projectPath: string;
@@ -420,7 +420,7 @@ async function main(): Promise<number> {
420
420
  try {
421
421
  const content = readFileSync(projectJsonPath, 'utf-8');
422
422
  existingMeta = JSON.parse(content);
423
- } catch (error) {
423
+ } catch {
424
424
  // 読み込みエラーは無視
425
425
  }
426
426
  }
@@ -442,7 +442,7 @@ async function main(): Promise<number> {
442
442
  try {
443
443
  const content = readFileSync(projectJsonPath, 'utf-8');
444
444
  existingMeta = JSON.parse(content);
445
- } catch (error) {
445
+ } catch {
446
446
  // 読み込みエラーは無視
447
447
  }
448
448
  }
@@ -0,0 +1,505 @@
1
+ /**
2
+ * spec-impl 統合ワークフロー管理
3
+ *
4
+ * /kiro:spec-impl コマンドの自動化処理を提供
5
+ * - spec.json から JIRA 情報を自動取得
6
+ * - 開始時: Epic + 最初の Story を「進行中」に移動
7
+ * - 終了時: PR作成、Epic + 最初の Story を「レビュー待ち」に移動、PRリンクをコメント
8
+ */
9
+
10
+ import { config } from 'dotenv';
11
+ import { JIRAClient } from './jira-sync.js';
12
+ import { getConfig } from './utils/config-loader.js';
13
+ import {
14
+ getJiraInfoFromSpec,
15
+ checkJiraInfoStatus,
16
+ JiraInfo,
17
+ } from './utils/spec-loader.js';
18
+
19
+ config();
20
+
21
+ /**
22
+ * spec-impl 統合ワークフローのオプション
23
+ */
24
+ export interface SpecImplWorkflowOptions {
25
+ /** フィーチャー名 */
26
+ featureName: string;
27
+ /** ブランチ名(オプション、デフォルトは feature/{featureName}) */
28
+ branchName?: string;
29
+ /** JIRA 連携をスキップするか */
30
+ skipJira?: boolean;
31
+ /** プロジェクトルート */
32
+ projectRoot?: string;
33
+ }
34
+
35
+ /**
36
+ * JIRAステータスマッピング
37
+ * michi.config.json でカスタマイズ可能
38
+ */
39
+ interface StatusMapping {
40
+ inProgress: string;
41
+ readyForReview: string;
42
+ }
43
+
44
+ /**
45
+ * 設定からステータスマッピングを取得
46
+ */
47
+ function getStatusMapping(): StatusMapping {
48
+ const appConfig = getConfig();
49
+ return {
50
+ inProgress: appConfig.jira?.statusMapping?.inProgress || 'In Progress',
51
+ readyForReview:
52
+ appConfig.jira?.statusMapping?.readyForReview || 'Ready for Review',
53
+ };
54
+ }
55
+
56
+ /**
57
+ * JIRA設定を取得
58
+ */
59
+ function getJIRAConfig() {
60
+ const url = process.env.ATLASSIAN_URL;
61
+ const email = process.env.ATLASSIAN_EMAIL;
62
+ const apiToken = process.env.ATLASSIAN_API_TOKEN;
63
+
64
+ if (!url || !email || !apiToken) {
65
+ throw new Error(
66
+ 'Missing JIRA credentials in .env. Required: ATLASSIAN_URL, ATLASSIAN_EMAIL, ATLASSIAN_API_TOKEN',
67
+ );
68
+ }
69
+
70
+ return { url, email, apiToken };
71
+ }
72
+
73
+ /**
74
+ * 単一チケットを指定ステータスに遷移
75
+ * @internal
76
+ */
77
+ async function transitionIssue(
78
+ client: JIRAClient,
79
+ issueKey: string,
80
+ status: string,
81
+ ): Promise<void> {
82
+ try {
83
+ await client.transitionIssue(issueKey, status);
84
+ console.log(` ✅ ${issueKey} → 「${status}」`);
85
+ } catch (error) {
86
+ console.error(
87
+ ` ❌ ${issueKey} のステータス変更に失敗: ${error instanceof Error ? error.message : error}`,
88
+ );
89
+ throw error;
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Epic と最初の Story を指定ステータスに遷移
95
+ * @internal
96
+ */
97
+ async function transitionEpicAndStory(
98
+ jiraInfo: JiraInfo,
99
+ status: string,
100
+ ): Promise<void> {
101
+ const jiraConfig = getJIRAConfig();
102
+ const client = new JIRAClient(jiraConfig);
103
+
104
+ console.log(`\n🔄 JIRA ステータス更新: 「${status}」`);
105
+
106
+ // Epic を遷移
107
+ if (jiraInfo.epicKey) {
108
+ await transitionIssue(client, jiraInfo.epicKey, status);
109
+ }
110
+
111
+ // 最初の Story を遷移
112
+ if (jiraInfo.firstStoryKey) {
113
+ await transitionIssue(client, jiraInfo.firstStoryKey, status);
114
+ }
115
+ }
116
+
117
+ /**
118
+ * JIRA 情報が不足している場合のエラー
119
+ */
120
+ export class JiraInfoNotFoundError extends Error {
121
+ constructor(
122
+ public readonly featureName: string,
123
+ public readonly missing: string[],
124
+ ) {
125
+ super(
126
+ `JIRA 情報が見つかりません (${featureName}): ${missing.join(', ')} が不足しています。\n` +
127
+ `先に "michi jira:sync ${featureName}" を実行してください。`,
128
+ );
129
+ this.name = 'JiraInfoNotFoundError';
130
+ }
131
+ }
132
+
133
+ /**
134
+ * spec-impl 開始ワークフロー
135
+ *
136
+ * 1. spec.json から JIRA 情報を自動取得
137
+ * 2. Epic と最初の Story を「進行中」に遷移
138
+ *
139
+ * @param options ワークフローオプション
140
+ * @throws {JiraInfoNotFoundError} JIRA 情報が見つからない場合(skipJira=false の時)
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * // 自動検出モード
145
+ * await runSpecImplStart({ featureName: 'user-auth' });
146
+ *
147
+ * // JIRA 連携スキップ
148
+ * await runSpecImplStart({ featureName: 'user-auth', skipJira: true });
149
+ * ```
150
+ */
151
+ export async function runSpecImplStart(
152
+ options: SpecImplWorkflowOptions,
153
+ ): Promise<{ jiraInfo: JiraInfo | null }> {
154
+ const {
155
+ featureName,
156
+ skipJira = false,
157
+ projectRoot = process.cwd(),
158
+ } = options;
159
+ const statusMapping = getStatusMapping();
160
+
161
+ console.log(`🚀 spec-impl 開始: ${featureName}`);
162
+
163
+ // JIRA 情報を自動取得
164
+ const jiraInfo = getJiraInfoFromSpec(featureName, projectRoot);
165
+ const status = checkJiraInfoStatus(featureName, projectRoot);
166
+
167
+ console.log('📋 JIRA 情報:');
168
+ console.log(` Epic: ${jiraInfo.epicKey || '(なし)'}`);
169
+ console.log(` Story: ${jiraInfo.firstStoryKey || '(なし)'}`);
170
+
171
+ // JIRA 連携スキップの場合
172
+ if (skipJira) {
173
+ console.log('⏭️ JIRA 連携をスキップします');
174
+ return { jiraInfo: null };
175
+ }
176
+
177
+ // JIRA 情報が不足している場合
178
+ if (!status.hasEpic) {
179
+ throw new JiraInfoNotFoundError(featureName, status.missing);
180
+ }
181
+
182
+ // Epic と Story を「進行中」に遷移
183
+ await transitionEpicAndStory(jiraInfo, statusMapping.inProgress);
184
+
185
+ console.log('\n✅ spec-impl 開始処理完了');
186
+ return { jiraInfo };
187
+ }
188
+
189
+ /**
190
+ * spec-impl 完了ワークフロー
191
+ *
192
+ * 1. spec.json から JIRA 情報を自動取得
193
+ * 2. PR を作成
194
+ * 3. Epic と最初の Story を「レビュー待ち」に遷移
195
+ * 4. PR リンクを JIRA にコメント
196
+ *
197
+ * @param options ワークフローオプション
198
+ * @returns PR URL
199
+ * @throws {JiraInfoNotFoundError} JIRA 情報が見つからない場合(skipJira=false の時)
200
+ *
201
+ * @example
202
+ * ```typescript
203
+ * // 自動検出モード
204
+ * const { prUrl } = await runSpecImplComplete({ featureName: 'user-auth' });
205
+ *
206
+ * // JIRA 連携スキップ
207
+ * const { prUrl } = await runSpecImplComplete({ featureName: 'user-auth', skipJira: true });
208
+ * ```
209
+ */
210
+ export async function runSpecImplComplete(
211
+ options: SpecImplWorkflowOptions,
212
+ ): Promise<{ prUrl: string }> {
213
+ const {
214
+ featureName,
215
+ branchName,
216
+ skipJira = false,
217
+ projectRoot = process.cwd(),
218
+ } = options;
219
+ const statusMapping = getStatusMapping();
220
+ const branch = branchName || `feature/${featureName}`;
221
+
222
+ console.log(`🏁 spec-impl 完了: ${featureName}`);
223
+ console.log(`🌿 ブランチ: ${branch}`);
224
+
225
+ // JIRA 情報を自動取得
226
+ const jiraInfo = getJiraInfoFromSpec(featureName, projectRoot);
227
+ const status = checkJiraInfoStatus(featureName, projectRoot);
228
+
229
+ console.log('📋 JIRA 情報:');
230
+ console.log(` Epic: ${jiraInfo.epicKey || '(なし)'}`);
231
+ console.log(` Story: ${jiraInfo.firstStoryKey || '(なし)'}`);
232
+
233
+ // JIRA 連携スキップでない場合、情報をチェック
234
+ if (!skipJira && !status.hasEpic) {
235
+ throw new JiraInfoNotFoundError(featureName, status.missing);
236
+ }
237
+
238
+ let prUrl = '';
239
+
240
+ // 1. PR を作成
241
+ try {
242
+ console.log('\n📝 PR を作成中...');
243
+ const prTitle = `feat: ${featureName}`;
244
+ const jiraBaseUrl = process.env.ATLASSIAN_URL || '';
245
+ const jiraLink = jiraInfo.epicKey
246
+ ? `[${jiraInfo.epicKey}](${jiraBaseUrl}/browse/${jiraInfo.epicKey})`
247
+ : '(JIRA 連携なし)';
248
+
249
+ const prBody = `## 概要
250
+
251
+ ${featureName} の実装
252
+
253
+ ## 関連 JIRA
254
+
255
+ ${jiraLink}
256
+
257
+ ---
258
+ *この PR は spec-impl ワークフローで自動作成されました*`;
259
+
260
+ const { Octokit } = await import('@octokit/rest');
261
+ const token = process.env.GITHUB_TOKEN;
262
+ const repo = process.env.GITHUB_REPO;
263
+
264
+ if (!token || !repo) {
265
+ throw new Error(
266
+ 'Missing GitHub credentials. Required: GITHUB_TOKEN, GITHUB_REPO',
267
+ );
268
+ }
269
+
270
+ const [owner, repoName] = repo.split('/');
271
+ const octokit = new Octokit({ auth: token });
272
+
273
+ const pr = await octokit.pulls.create({
274
+ owner,
275
+ repo: repoName,
276
+ title: prTitle,
277
+ body: prBody,
278
+ head: branch,
279
+ base: 'main',
280
+ });
281
+
282
+ prUrl = pr.data.html_url;
283
+ console.log(`✅ PR 作成完了: ${prUrl}`);
284
+ } catch (error) {
285
+ console.error(
286
+ `❌ PR 作成に失敗: ${error instanceof Error ? error.message : error}`,
287
+ );
288
+ throw error;
289
+ }
290
+
291
+ // JIRA 連携スキップの場合はここで終了
292
+ if (skipJira) {
293
+ console.log('\n⏭️ JIRA 連携をスキップします');
294
+ console.log('\n🎉 spec-impl ワークフロー完了');
295
+ console.log(` PR: ${prUrl}`);
296
+ return { prUrl };
297
+ }
298
+
299
+ // 2. Epic と Story を「レビュー待ち」に遷移
300
+ try {
301
+ await transitionEpicAndStory(jiraInfo, statusMapping.readyForReview);
302
+ } catch (error) {
303
+ console.error(
304
+ `⚠️ JIRA ステータス更新に失敗しましたが、PR は作成されています: ${prUrl}`,
305
+ );
306
+ // PR は作成済みなので、JIRA 更新の失敗は警告のみ
307
+ }
308
+
309
+ // 3. PR リンクを JIRA にコメント
310
+ if (jiraInfo.epicKey) {
311
+ try {
312
+ console.log('\n💬 JIRA に PR リンクをコメント中...');
313
+ const jiraConfig = getJIRAConfig();
314
+ const client = new JIRAClient(jiraConfig);
315
+ const commentText = `PR を作成しました: ${prUrl}
316
+
317
+ この PR は spec-impl ワークフローで自動作成されました。`;
318
+
319
+ await client.addComment(jiraInfo.epicKey, commentText);
320
+ console.log(` ✅ ${jiraInfo.epicKey} に PR リンクをコメントしました`);
321
+ } catch (error) {
322
+ console.error(
323
+ ` ⚠️ JIRA コメント追加に失敗: ${error instanceof Error ? error.message : error}`,
324
+ );
325
+ // コメント失敗は警告のみ
326
+ }
327
+ }
328
+
329
+ console.log('\n🎉 spec-impl ワークフロー完了');
330
+ console.log(` PR: ${prUrl}`);
331
+ if (jiraInfo.epicKey) {
332
+ console.log(
333
+ ` JIRA: ${process.env.ATLASSIAN_URL}/browse/${jiraInfo.epicKey}`,
334
+ );
335
+ }
336
+
337
+ return { prUrl };
338
+ }
339
+
340
+ // ============================================================================
341
+ // 後方互換性のための旧 API(非推奨)
342
+ // ============================================================================
343
+
344
+ /**
345
+ * @deprecated runSpecImplStart() を使用してください
346
+ */
347
+ export interface SpecImplContext {
348
+ featureName: string;
349
+ jiraKey: string;
350
+ branchName?: string;
351
+ }
352
+
353
+ /**
354
+ * @deprecated runSpecImplStart() を使用してください
355
+ */
356
+ export async function onSpecImplStart(context: SpecImplContext): Promise<void> {
357
+ console.warn(
358
+ '⚠️ onSpecImplStart は非推奨です。runSpecImplStart() を使用してください。',
359
+ );
360
+
361
+ const { featureName, jiraKey } = context;
362
+ const statusMapping = getStatusMapping();
363
+
364
+ console.log(`🚀 spec-impl 開始: ${featureName}`);
365
+ console.log(`📋 対象 JIRA: ${jiraKey}`);
366
+
367
+ const jiraConfig = getJIRAConfig();
368
+ const client = new JIRAClient(jiraConfig);
369
+
370
+ await client.transitionIssue(jiraKey, statusMapping.inProgress);
371
+ console.log(`✅ ${jiraKey} を「${statusMapping.inProgress}」に移動しました`);
372
+ }
373
+
374
+ /**
375
+ * @deprecated runSpecImplComplete() を使用してください
376
+ */
377
+ export async function onSpecImplEnd(
378
+ context: SpecImplContext,
379
+ ): Promise<{ prUrl: string }> {
380
+ console.warn(
381
+ '⚠️ onSpecImplEnd は非推奨です。runSpecImplComplete() を使用してください。',
382
+ );
383
+
384
+ const { featureName, jiraKey, branchName } = context;
385
+ const statusMapping = getStatusMapping();
386
+ const branch = branchName || `feature/${featureName}`;
387
+
388
+ console.log(`🏁 spec-impl 終了: ${featureName}`);
389
+ console.log(`📋 対象 JIRA: ${jiraKey}`);
390
+ console.log(`🌿 ブランチ: ${branch}`);
391
+
392
+ let prUrl = '';
393
+
394
+ // PR 作成
395
+ const { Octokit } = await import('@octokit/rest');
396
+ const token = process.env.GITHUB_TOKEN;
397
+ const repo = process.env.GITHUB_REPO;
398
+
399
+ if (!token || !repo) {
400
+ throw new Error(
401
+ 'Missing GitHub credentials. Required: GITHUB_TOKEN, GITHUB_REPO',
402
+ );
403
+ }
404
+
405
+ const [owner, repoName] = repo.split('/');
406
+ const octokit = new Octokit({ auth: token });
407
+
408
+ const prTitle = `feat: ${featureName}`;
409
+ const prBody = `## 概要
410
+
411
+ ${featureName} の実装
412
+
413
+ ## 関連 JIRA
414
+
415
+ [${jiraKey}](${process.env.ATLASSIAN_URL}/browse/${jiraKey})
416
+
417
+ ---
418
+ *この PR は spec-impl ワークフローで自動作成されました*`;
419
+
420
+ const pr = await octokit.pulls.create({
421
+ owner,
422
+ repo: repoName,
423
+ title: prTitle,
424
+ body: prBody,
425
+ head: branch,
426
+ base: 'main',
427
+ });
428
+
429
+ prUrl = pr.data.html_url;
430
+ console.log(`✅ PR 作成完了: ${prUrl}`);
431
+
432
+ // JIRA 更新
433
+ const jiraConfig = getJIRAConfig();
434
+ const client = new JIRAClient(jiraConfig);
435
+
436
+ await client.transitionIssue(jiraKey, statusMapping.readyForReview);
437
+ console.log(
438
+ `✅ ${jiraKey} を「${statusMapping.readyForReview}」に移動しました`,
439
+ );
440
+
441
+ const commentText = `PR を作成しました: ${prUrl}
442
+
443
+ この PR は spec-impl ワークフローで自動作成されました。`;
444
+
445
+ await client.addComment(jiraKey, commentText);
446
+ console.log(`✅ ${jiraKey} に PR リンクをコメントしました`);
447
+
448
+ console.log('\n🎉 spec-impl ワークフロー完了');
449
+ console.log(` PR: ${prUrl}`);
450
+ console.log(` JIRA: ${process.env.ATLASSIAN_URL}/browse/${jiraKey}`);
451
+
452
+ return { prUrl };
453
+ }
454
+
455
+ // ============================================================================
456
+ // CLI 実行(開発用)
457
+ // ============================================================================
458
+
459
+ if (import.meta.url === `file://${process.argv[1]}`) {
460
+ const args = process.argv.slice(2);
461
+ const command = args[0];
462
+
463
+ if (!command || !['start', 'complete'].includes(command)) {
464
+ console.error('Usage:');
465
+ console.error(
466
+ ' npx tsx scripts/spec-impl-workflow.ts start <feature> [--skip-jira]',
467
+ );
468
+ console.error(
469
+ ' npx tsx scripts/spec-impl-workflow.ts complete <feature> [--skip-jira] [--branch <name>]',
470
+ );
471
+ process.exit(1);
472
+ }
473
+
474
+ const featureName = args[1];
475
+ const skipJira = args.includes('--skip-jira');
476
+ const branchIndex = args.indexOf('--branch');
477
+ const branchName = branchIndex !== -1 ? args[branchIndex + 1] : undefined;
478
+
479
+ if (!featureName) {
480
+ console.error('Error: feature name is required');
481
+ process.exit(1);
482
+ }
483
+
484
+ const options: SpecImplWorkflowOptions = {
485
+ featureName,
486
+ skipJira,
487
+ branchName,
488
+ };
489
+
490
+ if (command === 'start') {
491
+ runSpecImplStart(options)
492
+ .then(() => process.exit(0))
493
+ .catch((error) => {
494
+ console.error(error.message);
495
+ process.exit(1);
496
+ });
497
+ } else {
498
+ runSpecImplComplete(options)
499
+ .then(() => process.exit(0))
500
+ .catch((error) => {
501
+ console.error(error.message);
502
+ process.exit(1);
503
+ });
504
+ }
505
+ }