@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
@@ -3,11 +3,17 @@
3
3
  */
4
4
 
5
5
  import { existsSync, readFileSync } from 'fs';
6
- import { resolve } from 'path';
7
6
  import { AppConfigSchema } from '../config/config-schema.js';
8
7
  import type { ZodIssue } from 'zod';
9
- import type { AppConfig } from '../config/config-schema.js';
10
8
  import { getConfig, getConfigPath } from './config-loader.js';
9
+ import { loadProjectMeta } from './project-meta.js';
10
+ import {
11
+ getProjectIssueTypes,
12
+ hasJiraCredentials,
13
+ hasIssueTypeId,
14
+ filterStoryTypes,
15
+ filterSubtaskTypes,
16
+ } from './jira-issue-type-fetcher.js';
11
17
 
12
18
  /**
13
19
  * バリデーション結果
@@ -22,13 +28,15 @@ export interface ValidationResult {
22
28
  /**
23
29
  * プロジェクト設定ファイルをバリデーション
24
30
  */
25
- export function validateProjectConfig(projectRoot: string = process.cwd()): ValidationResult {
31
+ export function validateProjectConfig(
32
+ projectRoot: string = process.cwd(),
33
+ ): ValidationResult {
26
34
  const errors: string[] = [];
27
35
  const warnings: string[] = [];
28
36
  const info: string[] = [];
29
-
37
+
30
38
  const configPath = getConfigPath(projectRoot);
31
-
39
+
32
40
  if (!existsSync(configPath)) {
33
41
  // 設定ファイルが存在しない場合は情報メッセージ(デフォルト設定を使用)
34
42
  info.push('Project config file not found. Using default configuration.');
@@ -36,100 +44,153 @@ export function validateProjectConfig(projectRoot: string = process.cwd()): Vali
36
44
  valid: true,
37
45
  errors: [],
38
46
  warnings: [],
39
- info
47
+ info,
40
48
  };
41
49
  }
42
-
50
+
43
51
  try {
44
52
  const content = readFileSync(configPath, 'utf-8');
45
53
  const parsed = JSON.parse(content);
46
-
54
+
47
55
  // スキーマでバリデーション
48
56
  const result = AppConfigSchema.safeParse(parsed);
49
-
57
+
50
58
  if (!result.success) {
51
59
  result.error.issues.forEach((error: ZodIssue) => {
52
60
  const path = error.path.map(String).join('.');
53
61
  errors.push(`${path}: ${error.message}`);
54
62
  });
55
-
63
+
56
64
  return {
57
65
  valid: false,
58
66
  errors,
59
67
  warnings: [],
60
- info: []
68
+ info: [],
61
69
  };
62
70
  }
63
-
71
+
64
72
  // 追加のバリデーション
65
73
  const config = result.data;
66
-
74
+
67
75
  // Confluence設定のバリデーション
68
76
  if (config.confluence) {
69
77
  const confluence = config.confluence;
70
-
78
+
71
79
  // hierarchy設定の整合性チェック
72
- if (confluence.pageCreationGranularity === 'by-hierarchy' || confluence.pageCreationGranularity === 'manual') {
80
+ if (
81
+ confluence.pageCreationGranularity === 'by-hierarchy' ||
82
+ confluence.pageCreationGranularity === 'manual'
83
+ ) {
73
84
  if (!confluence.hierarchy) {
74
- errors.push('confluence.hierarchy is required when pageCreationGranularity is "by-hierarchy" or "manual"');
85
+ errors.push(
86
+ 'confluence.hierarchy is required when pageCreationGranularity is "by-hierarchy" or "manual"',
87
+ );
75
88
  } else {
76
- if (confluence.pageCreationGranularity === 'by-hierarchy' && !confluence.hierarchy.parentPageTitle) {
77
- warnings.push('confluence.hierarchy.parentPageTitle is recommended for "by-hierarchy" mode');
89
+ if (
90
+ confluence.pageCreationGranularity === 'by-hierarchy' &&
91
+ !confluence.hierarchy.parentPageTitle
92
+ ) {
93
+ warnings.push(
94
+ 'confluence.hierarchy.parentPageTitle is recommended for "by-hierarchy" mode',
95
+ );
78
96
  }
79
-
80
- if (confluence.pageCreationGranularity === 'manual' && !confluence.hierarchy.structure) {
81
- errors.push('confluence.hierarchy.structure is required when pageCreationGranularity is "manual"');
97
+
98
+ if (
99
+ confluence.pageCreationGranularity === 'manual' &&
100
+ !confluence.hierarchy.structure
101
+ ) {
102
+ errors.push(
103
+ 'confluence.hierarchy.structure is required when pageCreationGranularity is "manual"',
104
+ );
82
105
  }
83
106
  }
84
107
  }
85
108
  }
86
-
109
+
87
110
  // JIRA設定のバリデーション
88
111
  if (config.jira) {
89
112
  const jira = config.jira;
90
-
91
- if (jira.storyCreationGranularity === 'selected-phases' && !jira.selectedPhases) {
92
- errors.push('jira.selectedPhases is required when storyCreationGranularity is "selected-phases"');
113
+
114
+ if (
115
+ jira.storyCreationGranularity === 'selected-phases' &&
116
+ !jira.selectedPhases
117
+ ) {
118
+ errors.push(
119
+ 'jira.selectedPhases is required when storyCreationGranularity is "selected-phases"',
120
+ );
93
121
  }
94
-
122
+
95
123
  if (jira.selectedPhases && jira.selectedPhases.length === 0) {
96
- warnings.push('jira.selectedPhases is empty. No stories will be created.');
124
+ warnings.push(
125
+ 'jira.selectedPhases is empty. No stories will be created.',
126
+ );
97
127
  }
98
128
  }
99
-
129
+
100
130
  // ワークフロー設定のバリデーション
101
131
  if (config.workflow) {
102
132
  const workflow = config.workflow;
103
-
133
+
104
134
  if (workflow.enabledPhases && workflow.enabledPhases.length === 0) {
105
- warnings.push('workflow.enabledPhases is empty. No phases will be executed.');
135
+ warnings.push(
136
+ 'workflow.enabledPhases is empty. No phases will be executed.',
137
+ );
106
138
  }
107
-
108
- const validPhases = ['requirements', 'design', 'tasks'];
109
- const invalidPhases = workflow.enabledPhases?.filter(phase => !validPhases.includes(phase));
139
+
140
+ const validPhases = [
141
+ // 新ワークフロー構造
142
+ 'spec-init', // Phase 0.0: プロジェクト初期化
143
+ 'requirements', // Phase 0.1: 要件定義
144
+ 'design', // Phase 0.2: 設計
145
+ 'test-type-selection', // Phase 0.3: テストタイプ選択
146
+ 'test-spec', // Phase 0.4: テスト仕様書作成
147
+ 'tasks', // Phase 0.5: タスク分割
148
+ 'spec-tasks', // Phase 0.5: タスク分割(別名)
149
+ 'jira-sync', // Phase 0.6: JIRA同期
150
+ 'environment-setup', // Phase 1: 環境構築
151
+ 'implementation', // Phase 2: TDD実装
152
+ 'tdd-implementation', // Phase 2: TDD実装(別名)
153
+ 'phase-a', // Phase A: PR前自動テスト
154
+ 'pr-tests', // Phase A: PR前自動テスト(別名)
155
+ 'additional-qa', // Phase 3: 追加QA
156
+ 'testing', // Phase 3: 追加QA(別名)
157
+ 'phase-b', // Phase B: リリース準備テスト
158
+ 'release-tests', // Phase B: リリース準備テスト(別名)
159
+ 'release-prep', // Phase 4: リリース準備
160
+ 'release-preparation', // Phase 4: リリース準備(別名)
161
+ 'release', // Phase 5: リリース
162
+ ];
163
+ const invalidPhases = workflow.enabledPhases?.filter(
164
+ (phase) => !validPhases.includes(phase),
165
+ );
110
166
  if (invalidPhases && invalidPhases.length > 0) {
111
- warnings.push(`Unknown phases in workflow.enabledPhases: ${invalidPhases.join(', ')}`);
167
+ warnings.push(
168
+ `Unknown phases in workflow.enabledPhases: ${invalidPhases.join(', ')}\n` +
169
+ 'See: docs/user-guide/guides/workflow.md for valid phase names',
170
+ );
112
171
  }
113
172
  }
114
-
173
+
115
174
  return {
116
175
  valid: errors.length === 0,
117
176
  errors,
118
177
  warnings,
119
- info: []
178
+ info: [],
120
179
  };
121
180
  } catch (error) {
122
181
  if (error instanceof SyntaxError) {
123
182
  errors.push(`Invalid JSON: ${error.message}`);
124
183
  } else {
125
- errors.push(`Error reading config file: ${error instanceof Error ? error.message : 'Unknown error'}`);
184
+ errors.push(
185
+ `Error reading config file: ${error instanceof Error ? error.message : 'Unknown error'}`,
186
+ );
126
187
  }
127
-
188
+
128
189
  return {
129
190
  valid: false,
130
191
  errors,
131
192
  warnings: [],
132
- info: []
193
+ info: [],
133
194
  };
134
195
  }
135
196
  }
@@ -137,35 +198,37 @@ export function validateProjectConfig(projectRoot: string = process.cwd()): Vali
137
198
  /**
138
199
  * 設定ファイルのバリデーションを実行して結果を表示
139
200
  */
140
- export function validateAndReport(projectRoot: string = process.cwd()): boolean {
201
+ export function validateAndReport(
202
+ projectRoot: string = process.cwd(),
203
+ ): boolean {
141
204
  const result = validateProjectConfig(projectRoot);
142
-
205
+
143
206
  if (result.info.length > 0) {
144
207
  console.log('ℹ️ Info:');
145
- result.info.forEach(message => {
208
+ result.info.forEach((message) => {
146
209
  console.log(` - ${message}`);
147
210
  });
148
211
  }
149
-
212
+
150
213
  if (result.warnings.length > 0) {
151
214
  console.log('⚠️ Warnings:');
152
- result.warnings.forEach(warning => {
215
+ result.warnings.forEach((warning) => {
153
216
  console.log(` - ${warning}`);
154
217
  });
155
218
  }
156
-
219
+
157
220
  if (result.errors.length > 0) {
158
221
  console.error('❌ Validation errors:');
159
- result.errors.forEach(error => {
222
+ result.errors.forEach((error) => {
160
223
  console.error(` - ${error}`);
161
224
  });
162
225
  return false;
163
226
  }
164
-
227
+
165
228
  if (result.valid) {
166
229
  console.log('✅ Configuration is valid');
167
230
  }
168
-
231
+
169
232
  return result.valid;
170
233
  }
171
234
 
@@ -177,172 +240,296 @@ export function validateAndReport(projectRoot: string = process.cwd()): boolean
177
240
  */
178
241
  export function validateForConfluenceSync(
179
242
  docType: 'requirements' | 'design' | 'tasks',
180
- projectRoot: string = process.cwd()
243
+ projectRoot: string = process.cwd(),
181
244
  ): ValidationResult {
182
245
  const errors: string[] = [];
183
246
  const warnings: string[] = [];
184
247
  const info: string[] = [];
185
-
248
+
186
249
  const config = getConfig(projectRoot);
187
- const configPath = getConfigPath(projectRoot);
188
-
250
+
189
251
  // Confluence設定のチェック
190
252
  if (!config.confluence) {
191
253
  warnings.push('confluence設定がありません。デフォルト設定を使用します。');
192
254
  } else {
193
255
  const confluence = config.confluence;
194
-
256
+
195
257
  // spaces設定のチェック
196
258
  if (!confluence.spaces || !confluence.spaces[docType]) {
197
259
  if (!process.env.CONFLUENCE_PRD_SPACE) {
198
260
  warnings.push(
199
261
  `confluence.spaces.${docType}が設定されていません。` +
200
- '環境変数CONFLUENCE_PRD_SPACEも設定されていないため、デフォルト値(PRD)を使用します。' +
201
- '\n 推奨: .michi/config.jsonに以下を追加してください:\n' +
202
- ' {\n' +
203
- ' "confluence": {\n' +
204
- ' "spaces": {\n' +
205
- ` "${docType}": "YOUR_SPACE_KEY"\n` +
206
- ' }\n' +
207
- ' }\n' +
208
- ' }'
262
+ '環境変数CONFLUENCE_PRD_SPACEも設定されていないため、デフォルト値(PRD)を使用します。' +
263
+ '\n 推奨: .michi/config.jsonに以下を追加してください:\n' +
264
+ ' {\n' +
265
+ ' "confluence": {\n' +
266
+ ' "spaces": {\n' +
267
+ ` "${docType}": "YOUR_SPACE_KEY"\n` +
268
+ ' }\n' +
269
+ ' }\n' +
270
+ ' }',
209
271
  );
210
272
  } else {
211
- info.push(`confluence.spaces.${docType}が設定されていませんが、環境変数CONFLUENCE_PRD_SPACE(${process.env.CONFLUENCE_PRD_SPACE})を使用します。`);
273
+ info.push(
274
+ `confluence.spaces.${docType}が設定されていませんが、環境変数CONFLUENCE_PRD_SPACE(${process.env.CONFLUENCE_PRD_SPACE})を使用します。`,
275
+ );
212
276
  }
213
277
  }
214
-
278
+
215
279
  // hierarchy設定のチェック(by-hierarchyモードの場合)
216
- if (confluence.pageCreationGranularity === 'by-hierarchy' || confluence.pageCreationGranularity === 'manual') {
280
+ if (
281
+ confluence.pageCreationGranularity === 'by-hierarchy' ||
282
+ confluence.pageCreationGranularity === 'manual'
283
+ ) {
217
284
  if (!confluence.hierarchy) {
218
285
  errors.push(
219
286
  'confluence.hierarchyが設定されていません。' +
220
- `pageCreationGranularityが"${confluence.pageCreationGranularity}"の場合、hierarchy設定が必須です。` +
221
- '\n 解決方法: .michi/config.jsonに以下を追加してください:\n' +
222
- ' {\n' +
223
- ' "confluence": {\n' +
224
- ' "hierarchy": {\n' +
225
- ' "mode": "simple",\n' +
226
- ' "parentPageTitle": "[{projectName}] {featureName}"\n' +
227
- ' }\n' +
228
- ' }\n' +
229
- ' }'
287
+ `pageCreationGranularityが"${confluence.pageCreationGranularity}"の場合、hierarchy設定が必須です。` +
288
+ '\n 解決方法: .michi/config.jsonに以下を追加してください:\n' +
289
+ ' {\n' +
290
+ ' "confluence": {\n' +
291
+ ' "hierarchy": {\n' +
292
+ ' "mode": "simple",\n' +
293
+ ' "parentPageTitle": "[{projectName}] {featureName}"\n' +
294
+ ' }\n' +
295
+ ' }\n' +
296
+ ' }',
230
297
  );
231
- } else if (confluence.pageCreationGranularity === 'by-hierarchy' && confluence.hierarchy && !confluence.hierarchy.parentPageTitle) {
298
+ } else if (
299
+ confluence.pageCreationGranularity === 'by-hierarchy' &&
300
+ confluence.hierarchy &&
301
+ !confluence.hierarchy.parentPageTitle
302
+ ) {
232
303
  warnings.push(
233
304
  'confluence.hierarchy.parentPageTitleが設定されていません。' +
234
- 'by-hierarchyモードでは推奨されます。'
305
+ 'by-hierarchyモードでは推奨されます。',
235
306
  );
236
307
  }
237
-
238
- if (confluence.pageCreationGranularity === 'manual' && confluence.hierarchy && !confluence.hierarchy.structure) {
308
+
309
+ if (
310
+ confluence.pageCreationGranularity === 'manual' &&
311
+ confluence.hierarchy &&
312
+ !confluence.hierarchy.structure
313
+ ) {
239
314
  errors.push(
240
315
  'confluence.hierarchy.structureが設定されていません。' +
241
- 'pageCreationGranularityが"manual"の場合、structure設定が必須です。'
316
+ 'pageCreationGranularityが"manual"の場合、structure設定が必須です。',
242
317
  );
243
318
  }
244
319
  }
245
320
  }
246
-
321
+
247
322
  return {
248
323
  valid: errors.length === 0,
249
324
  errors,
250
325
  warnings,
251
- info
326
+ info,
252
327
  };
253
328
  }
254
329
 
255
330
  /**
256
- * JIRA同期実行前の必須設定値チェック
331
+ * JIRA同期実行前の必須設定値チェック(同期版)
257
332
  * @param projectRoot プロジェクトルート(デフォルト: process.cwd())
258
333
  * @returns バリデーション結果
259
334
  */
260
- export function validateForJiraSync(projectRoot: string = process.cwd()): ValidationResult {
335
+ export function validateForJiraSync(
336
+ projectRoot: string = process.cwd(),
337
+ ): ValidationResult {
261
338
  const errors: string[] = [];
262
339
  const warnings: string[] = [];
263
340
  const info: string[] = [];
264
-
341
+
265
342
  const config = getConfig(projectRoot);
266
- const configPath = getConfigPath(projectRoot);
267
-
343
+
268
344
  // JIRA設定のチェック
269
345
  if (!config.jira) {
270
346
  warnings.push('jira設定がありません。デフォルト設定を使用します。');
271
347
  } else {
272
348
  const jira = config.jira;
273
-
349
+
274
350
  // issueTypes設定のチェック
275
351
  if (!jira.issueTypes) {
276
352
  if (!process.env.JIRA_ISSUE_TYPE_STORY) {
277
353
  errors.push(
278
354
  'jira.issueTypes.storyが設定されていません。' +
279
- '環境変数JIRA_ISSUE_TYPE_STORYも設定されていないため、JIRA同期を実行できません。' +
280
- '\n 解決方法1: 環境変数を設定:\n' +
281
- ' export JIRA_ISSUE_TYPE_STORY=10036 # JIRAインスタンス固有のID\n' +
282
- '\n 解決方法2: .michi/config.jsonに以下を追加:\n' +
283
- ' {\n' +
284
- ' "jira": {\n' +
285
- ' "issueTypes": {\n' +
286
- ' "story": "10036",\n' +
287
- ' "subtask": "10037"\n' +
288
- ' }\n' +
289
- ' }\n' +
290
- ' }' +
291
- '\n 確認方法: JIRA管理画面(Settings > Issues > Issue types)またはREST API: GET /rest/api/3/issuetype'
355
+ '環境変数JIRA_ISSUE_TYPE_STORYも設定されていないため、JIRA同期を実行できません。' +
356
+ '\n 解決方法1: 環境変数を設定:\n' +
357
+ ' export JIRA_ISSUE_TYPE_STORY=10036 # JIRAインスタンス固有のID\n' +
358
+ '\n 解決方法2: .michi/config.jsonに以下を追加:\n' +
359
+ ' {\n' +
360
+ ' "jira": {\n' +
361
+ ' "issueTypes": {\n' +
362
+ ' "story": "10036",\n' +
363
+ ' "subtask": "10037"\n' +
364
+ ' }\n' +
365
+ ' }\n' +
366
+ ' }' +
367
+ '\n 確認方法: JIRA管理画面(Settings > Issues > Issue types)またはREST API: GET /rest/api/3/issuetype',
292
368
  );
293
369
  } else {
294
- info.push(`jira.issueTypes.storyが設定されていませんが、環境変数JIRA_ISSUE_TYPE_STORY(${process.env.JIRA_ISSUE_TYPE_STORY})を使用します。`);
370
+ info.push(
371
+ `jira.issueTypes.storyが設定されていませんが、環境変数JIRA_ISSUE_TYPE_STORY(${process.env.JIRA_ISSUE_TYPE_STORY})を使用します。`,
372
+ );
295
373
  }
296
374
  } else {
297
375
  if (!jira.issueTypes.story) {
298
376
  if (!process.env.JIRA_ISSUE_TYPE_STORY) {
299
377
  errors.push(
300
378
  'jira.issueTypes.storyが設定されていません。' +
301
- '環境変数JIRA_ISSUE_TYPE_STORYも設定されていないため、JIRA同期を実行できません。' +
302
- '\n 解決方法: .michi/config.jsonのjira.issueTypes.storyに値を設定するか、' +
303
- '環境変数JIRA_ISSUE_TYPE_STORYを設定してください。'
379
+ '環境変数JIRA_ISSUE_TYPE_STORYも設定されていないため、JIRA同期を実行できません。' +
380
+ '\n 解決方法: .michi/config.jsonのjira.issueTypes.storyに値を設定するか、' +
381
+ '環境変数JIRA_ISSUE_TYPE_STORYを設定してください。',
304
382
  );
305
383
  } else {
306
- info.push(`jira.issueTypes.storyが設定されていませんが、環境変数JIRA_ISSUE_TYPE_STORY(${process.env.JIRA_ISSUE_TYPE_STORY})を使用します。`);
384
+ info.push(
385
+ `jira.issueTypes.storyが設定されていませんが、環境変数JIRA_ISSUE_TYPE_STORY(${process.env.JIRA_ISSUE_TYPE_STORY})を使用します。`,
386
+ );
307
387
  }
308
388
  }
309
-
389
+
310
390
  if (!jira.issueTypes.subtask) {
311
391
  if (!process.env.JIRA_ISSUE_TYPE_SUBTASK) {
312
392
  warnings.push(
313
393
  'jira.issueTypes.subtaskが設定されていません。' +
314
- '環境変数JIRA_ISSUE_TYPE_SUBTASKも設定されていないため、サブタスクは作成されません。'
394
+ '環境変数JIRA_ISSUE_TYPE_SUBTASKも設定されていないため、サブタスクは作成されません。',
315
395
  );
316
396
  } else {
317
- info.push(`jira.issueTypes.subtaskが設定されていませんが、環境変数JIRA_ISSUE_TYPE_SUBTASK(${process.env.JIRA_ISSUE_TYPE_SUBTASK})を使用します。`);
397
+ info.push(
398
+ `jira.issueTypes.subtaskが設定されていませんが、環境変数JIRA_ISSUE_TYPE_SUBTASK(${process.env.JIRA_ISSUE_TYPE_SUBTASK})を使用します。`,
399
+ );
318
400
  }
319
401
  }
320
402
  }
321
-
403
+
322
404
  // selectedPhases設定のチェック
323
- if (jira.storyCreationGranularity === 'selected-phases' && !jira.selectedPhases) {
405
+ if (
406
+ jira.storyCreationGranularity === 'selected-phases' &&
407
+ !jira.selectedPhases
408
+ ) {
324
409
  errors.push(
325
410
  'jira.selectedPhasesが設定されていません。' +
326
- 'storyCreationGranularityが"selected-phases"の場合、selectedPhases設定が必須です。'
411
+ 'storyCreationGranularityが"selected-phases"の場合、selectedPhases設定が必須です。',
327
412
  );
328
413
  }
329
-
414
+
330
415
  if (jira.selectedPhases && jira.selectedPhases.length === 0) {
331
- warnings.push('jira.selectedPhasesが空です。ストーリーは作成されません。');
416
+ warnings.push(
417
+ 'jira.selectedPhasesが空です。ストーリーは作成されません。',
418
+ );
332
419
  }
333
420
  }
334
-
421
+
335
422
  return {
336
423
  valid: errors.length === 0,
337
424
  errors,
338
425
  warnings,
339
- info
426
+ info,
340
427
  };
341
428
  }
342
429
 
430
+ /**
431
+ * JIRA同期実行前の必須設定値チェック(非同期版・Issue Type IDの存在チェック付き)
432
+ * @param projectRoot プロジェクトルート(デフォルト: process.cwd())
433
+ * @returns バリデーション結果
434
+ */
435
+ export async function validateForJiraSyncAsync(
436
+ projectRoot: string = process.cwd(),
437
+ ): Promise<ValidationResult> {
438
+ // まず同期版のバリデーションを実行
439
+ const result = validateForJiraSync(projectRoot);
440
+
441
+ // JIRA認証情報とプロジェクトキーが設定されている場合、Issue Type IDの存在チェックを実行
442
+ if (hasJiraCredentials()) {
443
+ try {
444
+ const projectMeta = loadProjectMeta(projectRoot);
445
+ const projectKey = projectMeta.jiraProjectKey;
446
+
447
+ if (projectKey) {
448
+ const config = getConfig(projectRoot);
449
+ const storyId =
450
+ config.jira?.issueTypes?.story || process.env.JIRA_ISSUE_TYPE_STORY;
451
+ const subtaskId =
452
+ config.jira?.issueTypes?.subtask ||
453
+ process.env.JIRA_ISSUE_TYPE_SUBTASK;
454
+
455
+ // Issue Typesを取得
456
+ const issueTypes = await getProjectIssueTypes(projectKey);
457
+
458
+ if (issueTypes && issueTypes.length > 0) {
459
+ // Story Issue Type IDの存在チェック
460
+ if (storyId) {
461
+ if (!hasIssueTypeId(issueTypes, storyId)) {
462
+ const storyTypes = filterStoryTypes(issueTypes);
463
+ const suggestions =
464
+ storyTypes.length > 0
465
+ ? storyTypes
466
+ .map((it) => ` - ${it.name} (ID: ${it.id})`)
467
+ .join('\n')
468
+ : ' (Storyタイプが見つかりませんでした)';
469
+
470
+ result.errors.push(
471
+ `設定されたStory Issue Type ID (${storyId}) がプロジェクト '${projectKey}' に存在しません。\n` +
472
+ '\n利用可能なStoryタイプ:\n' +
473
+ suggestions +
474
+ '\n\n修正方法:\n' +
475
+ ' 1. .envファイルを編集:\n' +
476
+ ' JIRA_ISSUE_TYPE_STORY=<正しいID>\n' +
477
+ '\n' +
478
+ ' 2. または、対話的設定を再実行:\n' +
479
+ ' npm run setup:interactive',
480
+ );
481
+ result.valid = false;
482
+ }
483
+ }
484
+
485
+ // Subtask Issue Type IDの存在チェック
486
+ if (subtaskId) {
487
+ if (!hasIssueTypeId(issueTypes, subtaskId)) {
488
+ const subtaskTypes = filterSubtaskTypes(issueTypes);
489
+ const suggestions =
490
+ subtaskTypes.length > 0
491
+ ? subtaskTypes
492
+ .map((it) => ` - ${it.name} (ID: ${it.id})`)
493
+ .join('\n')
494
+ : ' (Subtaskタイプが見つかりませんでした)';
495
+
496
+ result.warnings.push(
497
+ `設定されたSubtask Issue Type ID (${subtaskId}) がプロジェクト '${projectKey}' に存在しません。\n` +
498
+ '\n利用可能なSubtaskタイプ:\n' +
499
+ suggestions +
500
+ '\n\n修正方法:\n' +
501
+ ' 1. .envファイルを編集:\n' +
502
+ ' JIRA_ISSUE_TYPE_SUBTASK=<正しいID>\n' +
503
+ '\n' +
504
+ ' 2. または、対話的設定を再実行:\n' +
505
+ ' npm run setup:interactive',
506
+ );
507
+ }
508
+ }
509
+ } else {
510
+ // Issue Types取得に失敗した場合(認証エラー、ネットワークエラーなど)
511
+ // エラーにはしないが、警告として記録
512
+ result.warnings.push(
513
+ `JIRAプロジェクト '${projectKey}' のIssue Typesを取得できませんでした。` +
514
+ '設定されたIssue Type IDの存在確認をスキップします。',
515
+ );
516
+ }
517
+ }
518
+ } catch (error) {
519
+ // プロジェクトメタデータの読み込みに失敗した場合など
520
+ // エラーにはしないが、警告として記録
521
+ result.warnings.push(
522
+ `プロジェクトメタデータの読み込みに失敗しました: ${error instanceof Error ? error.message : error}` +
523
+ '設定されたIssue Type IDの存在確認をスキップします。',
524
+ );
525
+ }
526
+ }
527
+
528
+ return result;
529
+ }
530
+
343
531
  // CLI実行
344
532
  if (import.meta.url === `file://${process.argv[1]}`) {
345
533
  const valid = validateAndReport();
346
534
  process.exit(valid ? 0 : 1);
347
535
  }
348
-