@sk8metal/michi-cli 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +420 -49
  3. package/dist/scripts/__tests__/create-project.test.js +24 -28
  4. package/dist/scripts/__tests__/create-project.test.js.map +1 -1
  5. package/dist/scripts/__tests__/jira-transitions.test.d.ts +5 -0
  6. package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +1 -0
  7. package/dist/scripts/__tests__/jira-transitions.test.js +172 -0
  8. package/dist/scripts/__tests__/jira-transitions.test.js.map +1 -0
  9. package/dist/scripts/__tests__/multi-project-estimate.test.js +14 -15
  10. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -1
  11. package/dist/scripts/__tests__/setup-existing-project.test.js +146 -5
  12. package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
  13. package/dist/scripts/__tests__/setup-interactive.test.js +23 -17
  14. package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -1
  15. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +5 -0
  16. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +1 -0
  17. package/dist/scripts/__tests__/spec-impl-workflow.test.js +321 -0
  18. package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +1 -0
  19. package/dist/scripts/__tests__/spec-loader.test.d.ts +5 -0
  20. package/dist/scripts/__tests__/spec-loader.test.d.ts.map +1 -0
  21. package/dist/scripts/__tests__/spec-loader.test.js +153 -0
  22. package/dist/scripts/__tests__/spec-loader.test.js.map +1 -0
  23. package/dist/scripts/__tests__/validate-phase.test.js +26 -22
  24. package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
  25. package/dist/scripts/config/config-schema.d.ts +17 -0
  26. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  27. package/dist/scripts/config/config-schema.js +55 -26
  28. package/dist/scripts/config/config-schema.js.map +1 -1
  29. package/dist/scripts/config-interactive.d.ts.map +1 -1
  30. package/dist/scripts/config-interactive.js +53 -38
  31. package/dist/scripts/config-interactive.js.map +1 -1
  32. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  33. package/dist/scripts/confluence-sync.js +0 -11
  34. package/dist/scripts/confluence-sync.js.map +1 -1
  35. package/dist/scripts/constants/__tests__/environments.test.d.ts +2 -0
  36. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
  37. package/dist/scripts/constants/__tests__/environments.test.js +125 -0
  38. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
  39. package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
  40. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
  41. package/dist/scripts/constants/__tests__/languages.test.js +82 -0
  42. package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
  43. package/dist/scripts/constants/environments.d.ts +33 -0
  44. package/dist/scripts/constants/environments.d.ts.map +1 -0
  45. package/dist/scripts/constants/environments.js +64 -0
  46. package/dist/scripts/constants/environments.js.map +1 -0
  47. package/dist/scripts/constants/languages.d.ts +23 -0
  48. package/dist/scripts/constants/languages.d.ts.map +1 -0
  49. package/dist/scripts/constants/languages.js +53 -0
  50. package/dist/scripts/constants/languages.js.map +1 -0
  51. package/dist/scripts/constants/test-commands.d.ts +36 -0
  52. package/dist/scripts/constants/test-commands.d.ts.map +1 -0
  53. package/dist/scripts/constants/test-commands.js +70 -0
  54. package/dist/scripts/constants/test-commands.js.map +1 -0
  55. package/dist/scripts/create-project.d.ts +4 -0
  56. package/dist/scripts/create-project.d.ts.map +1 -1
  57. package/dist/scripts/create-project.js +51 -22
  58. package/dist/scripts/create-project.js.map +1 -1
  59. package/dist/scripts/jira-sync.d.ts +89 -3
  60. package/dist/scripts/jira-sync.d.ts.map +1 -1
  61. package/dist/scripts/jira-sync.js +366 -96
  62. package/dist/scripts/jira-sync.js.map +1 -1
  63. package/dist/scripts/markdown-to-confluence.js +1 -1
  64. package/dist/scripts/markdown-to-confluence.js.map +1 -1
  65. package/dist/scripts/phase-runner.d.ts +1 -1
  66. package/dist/scripts/phase-runner.d.ts.map +1 -1
  67. package/dist/scripts/phase-runner.js +809 -13
  68. package/dist/scripts/phase-runner.js.map +1 -1
  69. package/dist/scripts/pr-automation.d.ts.map +1 -1
  70. package/dist/scripts/pr-automation.js.map +1 -1
  71. package/dist/scripts/pre-flight-check.js +1 -1
  72. package/dist/scripts/pre-flight-check.js.map +1 -1
  73. package/dist/scripts/setup-existing-project.d.ts +3 -1
  74. package/dist/scripts/setup-existing-project.d.ts.map +1 -1
  75. package/dist/scripts/setup-existing-project.js +165 -78
  76. package/dist/scripts/setup-existing-project.js.map +1 -1
  77. package/dist/scripts/setup-interactive.js +3 -3
  78. package/dist/scripts/setup-interactive.js.map +1 -1
  79. package/dist/scripts/spec-impl-workflow.d.ts +94 -0
  80. package/dist/scripts/spec-impl-workflow.d.ts.map +1 -0
  81. package/dist/scripts/spec-impl-workflow.js +354 -0
  82. package/dist/scripts/spec-impl-workflow.js.map +1 -0
  83. package/dist/scripts/template/__tests__/renderer.test.d.ts +2 -0
  84. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
  85. package/dist/scripts/template/__tests__/renderer.test.js +165 -0
  86. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
  87. package/dist/scripts/template/renderer.d.ts +70 -0
  88. package/dist/scripts/template/renderer.d.ts.map +1 -0
  89. package/dist/scripts/template/renderer.js +99 -0
  90. package/dist/scripts/template/renderer.js.map +1 -0
  91. package/dist/scripts/test-execution-generator.d.ts +52 -0
  92. package/dist/scripts/test-execution-generator.d.ts.map +1 -0
  93. package/dist/scripts/test-execution-generator.js +576 -0
  94. package/dist/scripts/test-execution-generator.js.map +1 -0
  95. package/dist/scripts/test-interactive.d.ts +10 -0
  96. package/dist/scripts/test-interactive.d.ts.map +1 -0
  97. package/dist/scripts/test-interactive.js +627 -0
  98. package/dist/scripts/test-interactive.js.map +1 -0
  99. package/dist/scripts/test-new-features.d.ts +5 -0
  100. package/dist/scripts/test-new-features.d.ts.map +1 -0
  101. package/dist/scripts/test-new-features.js +145 -0
  102. package/dist/scripts/test-new-features.js.map +1 -0
  103. package/dist/scripts/test-spec-generator.d.ts +29 -0
  104. package/dist/scripts/test-spec-generator.d.ts.map +1 -0
  105. package/dist/scripts/test-spec-generator.js +494 -0
  106. package/dist/scripts/test-spec-generator.js.map +1 -0
  107. package/dist/scripts/test-workflow-stages.d.ts +6 -0
  108. package/dist/scripts/test-workflow-stages.d.ts.map +1 -0
  109. package/dist/scripts/test-workflow-stages.js +43 -0
  110. package/dist/scripts/test-workflow-stages.js.map +1 -0
  111. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +5 -0
  112. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +1 -0
  113. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +315 -0
  114. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +1 -0
  115. package/dist/scripts/utils/__tests__/business-days.test.d.ts +5 -0
  116. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +1 -0
  117. package/dist/scripts/utils/__tests__/business-days.test.js +171 -0
  118. package/dist/scripts/utils/__tests__/business-days.test.js.map +1 -0
  119. package/dist/scripts/utils/__tests__/config-loader.test.js +1 -1
  120. package/dist/scripts/utils/__tests__/config-loader.test.js.map +1 -1
  121. package/dist/scripts/utils/__tests__/config-validator.test.js +164 -35
  122. package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
  123. package/dist/scripts/utils/__tests__/env-config.test.d.ts +5 -0
  124. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +1 -0
  125. package/dist/scripts/utils/__tests__/env-config.test.js +218 -0
  126. package/dist/scripts/utils/__tests__/env-config.test.js.map +1 -0
  127. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +5 -0
  128. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +1 -0
  129. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +202 -0
  130. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +1 -0
  131. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +5 -0
  132. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +1 -0
  133. package/dist/scripts/utils/__tests__/tasks-converter.test.js +500 -0
  134. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +1 -0
  135. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +5 -0
  136. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +1 -0
  137. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +314 -0
  138. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +1 -0
  139. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +5 -0
  140. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +1 -0
  141. package/dist/scripts/utils/__tests__/test-runner.test.js +64 -0
  142. package/dist/scripts/utils/__tests__/test-runner.test.js.map +1 -0
  143. package/dist/scripts/utils/aidlc-parser.d.ts +86 -0
  144. package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -0
  145. package/dist/scripts/utils/aidlc-parser.js +208 -0
  146. package/dist/scripts/utils/aidlc-parser.js.map +1 -0
  147. package/dist/scripts/utils/business-days.d.ts +52 -0
  148. package/dist/scripts/utils/business-days.d.ts.map +1 -0
  149. package/dist/scripts/utils/business-days.js +98 -0
  150. package/dist/scripts/utils/business-days.js.map +1 -0
  151. package/dist/scripts/utils/ci-generator.d.ts +14 -0
  152. package/dist/scripts/utils/ci-generator.d.ts.map +1 -0
  153. package/dist/scripts/utils/ci-generator.js +61 -0
  154. package/dist/scripts/utils/ci-generator.js.map +1 -0
  155. package/dist/scripts/utils/config-loader.js +2 -2
  156. package/dist/scripts/utils/config-loader.js.map +1 -1
  157. package/dist/scripts/utils/config-validator.d.ts +7 -1
  158. package/dist/scripts/utils/config-validator.d.ts.map +1 -1
  159. package/dist/scripts/utils/config-validator.js +136 -23
  160. package/dist/scripts/utils/config-validator.js.map +1 -1
  161. package/dist/scripts/utils/confluence-approval.d.ts +46 -0
  162. package/dist/scripts/utils/confluence-approval.d.ts.map +1 -0
  163. package/dist/scripts/utils/confluence-approval.js +118 -0
  164. package/dist/scripts/utils/confluence-approval.js.map +1 -0
  165. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  166. package/dist/scripts/utils/confluence-hierarchy.js +1 -1
  167. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  168. package/dist/scripts/utils/docker-generator.d.ts +9 -0
  169. package/dist/scripts/utils/docker-generator.d.ts.map +1 -0
  170. package/dist/scripts/utils/docker-generator.js +132 -0
  171. package/dist/scripts/utils/docker-generator.js.map +1 -0
  172. package/dist/scripts/utils/docker-requirement-detector.d.ts +15 -0
  173. package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -0
  174. package/dist/scripts/utils/docker-requirement-detector.js +124 -0
  175. package/dist/scripts/utils/docker-requirement-detector.js.map +1 -0
  176. package/dist/scripts/utils/env-config.d.ts +54 -0
  177. package/dist/scripts/utils/env-config.d.ts.map +1 -0
  178. package/dist/scripts/utils/env-config.js +414 -0
  179. package/dist/scripts/utils/env-config.js.map +1 -0
  180. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts +70 -0
  181. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -0
  182. package/dist/scripts/utils/jira-issue-type-fetcher.js +147 -0
  183. package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -0
  184. package/dist/scripts/utils/language-detector.d.ts +14 -0
  185. package/dist/scripts/utils/language-detector.d.ts.map +1 -0
  186. package/dist/scripts/utils/language-detector.js +119 -0
  187. package/dist/scripts/utils/language-detector.js.map +1 -0
  188. package/dist/scripts/utils/markdown-parser.d.ts +55 -0
  189. package/dist/scripts/utils/markdown-parser.d.ts.map +1 -0
  190. package/dist/scripts/utils/markdown-parser.js +289 -0
  191. package/dist/scripts/utils/markdown-parser.js.map +1 -0
  192. package/dist/scripts/utils/project-detector.d.ts +17 -0
  193. package/dist/scripts/utils/project-detector.d.ts.map +1 -0
  194. package/dist/scripts/utils/project-detector.js +166 -0
  195. package/dist/scripts/utils/project-detector.js.map +1 -0
  196. package/dist/scripts/utils/project-finder.js +2 -2
  197. package/dist/scripts/utils/project-finder.js.map +1 -1
  198. package/dist/scripts/utils/release-notes-generator.d.ts +56 -0
  199. package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -0
  200. package/dist/scripts/utils/release-notes-generator.js +162 -0
  201. package/dist/scripts/utils/release-notes-generator.js.map +1 -0
  202. package/dist/scripts/utils/spec-loader.d.ts +79 -0
  203. package/dist/scripts/utils/spec-loader.d.ts.map +1 -0
  204. package/dist/scripts/utils/spec-loader.js +80 -0
  205. package/dist/scripts/utils/spec-loader.js.map +1 -0
  206. package/dist/scripts/utils/spec-updater.d.ts +7 -0
  207. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  208. package/dist/scripts/utils/spec-updater.js.map +1 -1
  209. package/dist/scripts/utils/tasks-converter.d.ts +57 -0
  210. package/dist/scripts/utils/tasks-converter.d.ts.map +1 -0
  211. package/dist/scripts/utils/tasks-converter.js +322 -0
  212. package/dist/scripts/utils/tasks-converter.js.map +1 -0
  213. package/dist/scripts/utils/tasks-format-validator.d.ts +36 -0
  214. package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -0
  215. package/dist/scripts/utils/tasks-format-validator.js +158 -0
  216. package/dist/scripts/utils/tasks-format-validator.js.map +1 -0
  217. package/dist/scripts/utils/template-applier.d.ts +37 -0
  218. package/dist/scripts/utils/template-applier.d.ts.map +1 -0
  219. package/dist/scripts/utils/template-applier.js +129 -0
  220. package/dist/scripts/utils/template-applier.js.map +1 -0
  221. package/dist/scripts/utils/template-finder.d.ts +37 -0
  222. package/dist/scripts/utils/template-finder.d.ts.map +1 -0
  223. package/dist/scripts/utils/template-finder.js +63 -0
  224. package/dist/scripts/utils/template-finder.js.map +1 -0
  225. package/dist/scripts/utils/test-config-generator.d.ts +12 -0
  226. package/dist/scripts/utils/test-config-generator.d.ts.map +1 -0
  227. package/dist/scripts/utils/test-config-generator.js +185 -0
  228. package/dist/scripts/utils/test-config-generator.js.map +1 -0
  229. package/dist/scripts/utils/test-runner.d.ts +31 -0
  230. package/dist/scripts/utils/test-runner.d.ts.map +1 -0
  231. package/dist/scripts/utils/test-runner.js +103 -0
  232. package/dist/scripts/utils/test-runner.js.map +1 -0
  233. package/dist/scripts/validate-phase.d.ts +1 -1
  234. package/dist/scripts/validate-phase.d.ts.map +1 -1
  235. package/dist/scripts/validate-phase.js +153 -5
  236. package/dist/scripts/validate-phase.js.map +1 -1
  237. package/dist/scripts/workflow-orchestrator.d.ts +8 -0
  238. package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
  239. package/dist/scripts/workflow-orchestrator.js +108 -7
  240. package/dist/scripts/workflow-orchestrator.js.map +1 -1
  241. package/dist/src/__tests__/integration/internationalization.test.d.ts +8 -0
  242. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +1 -0
  243. package/dist/src/__tests__/integration/internationalization.test.js +333 -0
  244. package/dist/src/__tests__/integration/internationalization.test.js.map +1 -0
  245. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +5 -0
  246. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
  247. package/dist/src/__tests__/integration/setup/claude-agent.test.js +122 -0
  248. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
  249. package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
  250. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
  251. package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
  252. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
  253. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
  254. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
  255. package/dist/src/__tests__/integration/setup/cursor.test.js +166 -0
  256. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
  257. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
  258. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
  259. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
  260. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
  261. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
  262. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
  263. package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
  264. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
  265. package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
  266. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
  267. package/dist/src/__tests__/integration/setup/validation.test.js +301 -0
  268. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
  269. package/dist/src/cli.d.ts.map +1 -1
  270. package/dist/src/cli.js +228 -18
  271. package/dist/src/cli.js.map +1 -1
  272. package/dist/src/commands/setup-existing.d.ts +25 -0
  273. package/dist/src/commands/setup-existing.d.ts.map +1 -0
  274. package/dist/src/commands/setup-existing.js +695 -0
  275. package/dist/src/commands/setup-existing.js.map +1 -0
  276. package/dist/vitest.config.d.ts.map +1 -1
  277. package/dist/vitest.config.js +4 -3
  278. package/dist/vitest.config.js.map +1 -1
  279. package/docs/README.md +3 -1
  280. package/docs/context.md +59 -0
  281. package/docs/design-issue-55.md +240 -0
  282. package/docs/design-issue-56.md +181 -0
  283. package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
  284. package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
  285. package/docs/plan.md +275 -0
  286. package/docs/user-guide/getting-started/github-token-setup.md +509 -0
  287. package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +108 -28
  288. package/docs/{getting-started → user-guide/getting-started}/quick-start.md +73 -6
  289. package/docs/{getting-started → user-guide/getting-started}/setup.md +278 -3
  290. package/docs/{guides → user-guide/guides}/customization.md +3 -3
  291. package/docs/user-guide/guides/internationalization.md +540 -0
  292. package/docs/{guides → user-guide/guides}/multi-project.md +2 -2
  293. package/docs/{guides → user-guide/guides}/phase-automation.md +67 -9
  294. package/docs/user-guide/guides/workflow.md +582 -0
  295. package/docs/user-guide/hands-on/README.md +142 -0
  296. package/docs/user-guide/hands-on/claude-agent-setup.md +455 -0
  297. package/docs/user-guide/hands-on/claude-setup.md +398 -0
  298. package/docs/user-guide/hands-on/cursor-setup.md +352 -0
  299. package/docs/user-guide/hands-on/troubleshooting.md +964 -0
  300. package/docs/user-guide/hands-on/verification-checklist.md +438 -0
  301. package/docs/user-guide/hands-on/workflow-walkthrough.md +906 -0
  302. package/docs/user-guide/reference/config.md +564 -0
  303. package/docs/{reference → user-guide/reference}/quick-reference.md +75 -53
  304. package/docs/user-guide/release/ci-setup.md +541 -0
  305. package/docs/user-guide/release/release-flow.md +476 -0
  306. package/docs/user-guide/templates/test-specs/README.md +173 -0
  307. package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
  308. package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
  309. package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
  310. package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
  311. package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
  312. package/docs/user-guide/testing/integration-tests.md +312 -0
  313. package/docs/user-guide/testing/tdd-cycle.md +349 -0
  314. package/docs/user-guide/testing/test-execution-flow.md +396 -0
  315. package/docs/user-guide/testing/test-failure-handling.md +521 -0
  316. package/docs/user-guide/testing/test-planning-flow.md +181 -0
  317. package/docs/user-guide/testing-strategy.md +185 -0
  318. package/docs/verification-guide.md +518 -0
  319. package/package.json +13 -3
  320. package/scripts/__tests__/create-project.test.ts +67 -49
  321. package/scripts/__tests__/jira-transitions.test.ts +225 -0
  322. package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
  323. package/scripts/__tests__/setup-existing-project.test.ts +171 -6
  324. package/scripts/__tests__/setup-interactive.test.ts +52 -46
  325. package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
  326. package/scripts/__tests__/spec-loader.test.ts +199 -0
  327. package/scripts/__tests__/validate-phase.test.ts +78 -54
  328. package/scripts/config/config-schema.ts +89 -50
  329. package/scripts/config-interactive.ts +191 -136
  330. package/scripts/confluence-sync.ts +0 -12
  331. package/scripts/constants/__tests__/environments.test.ts +146 -0
  332. package/scripts/constants/__tests__/languages.test.ts +100 -0
  333. package/scripts/constants/environments.ts +81 -0
  334. package/scripts/constants/languages.ts +70 -0
  335. package/scripts/constants/test-commands.ts +96 -0
  336. package/scripts/create-project.ts +52 -22
  337. package/scripts/jira-sync.ts +767 -232
  338. package/scripts/markdown-to-confluence.ts +1 -1
  339. package/scripts/phase-runner.ts +1056 -63
  340. package/scripts/pr-automation.ts +0 -1
  341. package/scripts/pre-flight-check.ts +1 -1
  342. package/scripts/pre-publish-check.sh +311 -0
  343. package/scripts/quick-verify.sh +115 -0
  344. package/scripts/setup-existing-project.ts +306 -143
  345. package/scripts/setup-interactive.ts +4 -4
  346. package/scripts/spec-impl-workflow.ts +505 -0
  347. package/scripts/template/__tests__/renderer.test.ts +206 -0
  348. package/scripts/template/renderer.ts +133 -0
  349. package/scripts/test-execution-generator.ts +695 -0
  350. package/scripts/test-interactive.ts +779 -0
  351. package/scripts/test-new-features.ts +168 -0
  352. package/scripts/test-npm-package.sh +345 -0
  353. package/scripts/test-spec-generator.ts +574 -0
  354. package/scripts/test-workflow-stages.ts +53 -0
  355. package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
  356. package/scripts/utils/__tests__/business-days.test.ts +214 -0
  357. package/scripts/utils/__tests__/config-loader.test.ts +1 -1
  358. package/scripts/utils/__tests__/config-validator.test.ts +309 -88
  359. package/scripts/utils/__tests__/env-config.test.ts +259 -0
  360. package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
  361. package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
  362. package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
  363. package/scripts/utils/__tests__/test-runner.test.ts +77 -0
  364. package/scripts/utils/aidlc-parser.ts +289 -0
  365. package/scripts/utils/business-days.ts +115 -0
  366. package/scripts/utils/ci-generator.ts +84 -0
  367. package/scripts/utils/config-loader.ts +2 -2
  368. package/scripts/utils/config-validator.ts +304 -117
  369. package/scripts/utils/confluence-approval.ts +167 -0
  370. package/scripts/utils/confluence-hierarchy.ts +2 -4
  371. package/scripts/utils/docker-generator.ts +151 -0
  372. package/scripts/utils/docker-requirement-detector.ts +153 -0
  373. package/scripts/utils/env-config.ts +526 -0
  374. package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
  375. package/scripts/utils/language-detector.ts +139 -0
  376. package/scripts/utils/markdown-parser.ts +376 -0
  377. package/scripts/utils/project-detector.ts +192 -0
  378. package/scripts/utils/project-finder.ts +2 -2
  379. package/scripts/utils/release-notes-generator.ts +210 -0
  380. package/scripts/utils/spec-loader.ts +125 -0
  381. package/scripts/utils/spec-updater.ts +8 -1
  382. package/scripts/utils/tasks-converter.ts +601 -0
  383. package/scripts/utils/tasks-format-validator.ts +193 -0
  384. package/scripts/utils/template-applier.ts +202 -0
  385. package/scripts/utils/template-finder.ts +75 -0
  386. package/scripts/utils/test-config-generator.ts +210 -0
  387. package/scripts/utils/test-runner.ts +133 -0
  388. package/scripts/validate-phase.ts +186 -9
  389. package/scripts/workflow-orchestrator.ts +130 -12
  390. package/templates/ci/github-actions/java.yml +54 -0
  391. package/templates/ci/github-actions/nodejs.yml +46 -0
  392. package/templates/ci/github-actions/php.yml +52 -0
  393. package/templates/ci/screwdriver/java.yaml +17 -0
  394. package/templates/ci/screwdriver/nodejs.yaml +17 -0
  395. package/templates/ci/screwdriver/php.yaml +20 -0
  396. package/templates/claude/commands/kiro/kiro-spec-impl.md +244 -0
  397. package/templates/claude/commands/kiro/kiro-spec-tasks.md +354 -0
  398. package/templates/claude/commands/michi/confluence-sync.md +38 -0
  399. package/templates/claude/commands/michi/project-switch.md +36 -0
  400. package/templates/claude/rules/atlassian-integration.md +35 -0
  401. package/templates/claude/rules/michi-core.md +54 -0
  402. package/templates/claude-agent/README.md +31 -0
  403. package/templates/claude-agent/agents/.gitkeep +0 -0
  404. package/templates/claude-agent/agents/designer.md +79 -0
  405. package/templates/claude-agent/agents/developer.md +68 -0
  406. package/templates/claude-agent/agents/manager-agent.md +59 -0
  407. package/templates/claude-agent/agents/tester.md +101 -0
  408. package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
  409. package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
  410. package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
  411. package/templates/cline/rules/atlassian-integration.md +36 -0
  412. package/templates/cline/rules/michi-core.md +56 -0
  413. package/templates/codex/AGENTS.override.md +277 -0
  414. package/templates/codex/prompts/confluence-sync.md +177 -0
  415. package/templates/codex/rules/README.md +210 -0
  416. package/templates/common/.kiro/project.json.template +21 -0
  417. package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
  418. package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
  419. package/templates/cursor/commands/michi/confluence-sync.md +76 -0
  420. package/templates/cursor/commands/michi/project-switch.md +69 -0
  421. package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
  422. package/templates/cursor/rules/github-ssot.mdc +151 -0
  423. package/templates/cursor/rules/multi-project.mdc +81 -0
  424. package/templates/gemini/commands/README.md +41 -0
  425. package/templates/gemini/rules/GEMINI.md +80 -0
  426. package/docs/guides/workflow.md +0 -342
  427. package/docs/reference/config.md +0 -545
  428. package/scripts/setup-env.sh +0 -52
  429. package/scripts/setup-existing.sh +0 -152
  430. /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
  431. /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
  432. /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
  433. /package/docs/{reference → user-guide/reference}/tasks-template.md +0 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Integration tests for argument validation in setup-existing command
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
5
+ import { setupExisting } from '../../../commands/setup-existing.js';
6
+ import { createTestProject } from './helpers/test-project.js';
7
+ // Mock readline to auto-confirm prompts
8
+ vi.mock('readline', () => ({
9
+ createInterface: () => ({
10
+ question: (question, callback) => {
11
+ callback('y'); // Auto-confirm
12
+ },
13
+ close: () => { },
14
+ }),
15
+ }));
16
+ describe('Setup Argument Validation', () => {
17
+ let testProject;
18
+ let originalCwd;
19
+ beforeEach(() => {
20
+ originalCwd = process.cwd();
21
+ testProject = createTestProject({ name: 'validation-test' });
22
+ process.chdir(testProject.path);
23
+ });
24
+ afterEach(() => {
25
+ process.chdir(originalCwd);
26
+ testProject.destroy();
27
+ });
28
+ describe('Environment Selection', () => {
29
+ it('should create cursor directory when cursor flag is provided', async () => {
30
+ // This test verifies that the cursor flag explicitly creates the .cursor directory
31
+ await setupExisting({
32
+ cursor: true,
33
+ projectName: 'Test Project',
34
+ jiraKey: 'TEST',
35
+ });
36
+ const { existsSync } = await import('fs');
37
+ const { join } = await import('path');
38
+ const cursorDir = join(testProject.path, '.cursor');
39
+ expect(existsSync(cursorDir)).toBe(true);
40
+ });
41
+ it('should accept cursor environment flag', async () => {
42
+ await setupExisting({
43
+ cursor: true,
44
+ projectName: 'Test Project',
45
+ jiraKey: 'TEST',
46
+ });
47
+ const { existsSync } = await import('fs');
48
+ const { join } = await import('path');
49
+ expect(existsSync(join(testProject.path, '.cursor'))).toBe(true);
50
+ });
51
+ it('should accept claude environment flag', async () => {
52
+ await setupExisting({
53
+ claude: true,
54
+ projectName: 'Test Project',
55
+ jiraKey: 'TEST',
56
+ });
57
+ const { existsSync } = await import('fs');
58
+ const { join } = await import('path');
59
+ expect(existsSync(join(testProject.path, '.claude/rules'))).toBe(true);
60
+ });
61
+ it('should accept claude-agent environment flag', async () => {
62
+ await setupExisting({
63
+ claudeAgent: true,
64
+ projectName: 'Test Project',
65
+ jiraKey: 'TEST',
66
+ });
67
+ const { existsSync } = await import('fs');
68
+ const { join } = await import('path');
69
+ expect(existsSync(join(testProject.path, '.claude/agents'))).toBe(true);
70
+ });
71
+ });
72
+ describe('Language Validation', () => {
73
+ it('should accept supported language: ja', async () => {
74
+ await setupExisting({
75
+ cursor: true,
76
+ lang: 'ja',
77
+ projectName: 'Test Project',
78
+ jiraKey: 'TEST',
79
+ });
80
+ const { join } = await import('path');
81
+ const { readFileSync } = await import('fs');
82
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
83
+ expect(projectJson.language).toBe('ja');
84
+ });
85
+ it('should accept supported language: en', async () => {
86
+ await setupExisting({
87
+ cursor: true,
88
+ lang: 'en',
89
+ projectName: 'Test Project',
90
+ jiraKey: 'TEST',
91
+ });
92
+ const { join } = await import('path');
93
+ const { readFileSync } = await import('fs');
94
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
95
+ expect(projectJson.language).toBe('en');
96
+ });
97
+ it('should accept supported language: zh-TW', async () => {
98
+ await setupExisting({
99
+ cursor: true,
100
+ lang: 'zh-TW',
101
+ projectName: 'Test Project',
102
+ jiraKey: 'TEST',
103
+ });
104
+ const { join } = await import('path');
105
+ const { readFileSync } = await import('fs');
106
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
107
+ expect(projectJson.language).toBe('zh-TW');
108
+ });
109
+ it('should reject unsupported language', async () => {
110
+ await expect(async () => {
111
+ await setupExisting({
112
+ cursor: true,
113
+ lang: 'xx', // Unsupported language (changed from 'fr' which is now supported)
114
+ projectName: 'Test Project',
115
+ jiraKey: 'TEST',
116
+ });
117
+ }).rejects.toThrow(/Unsupported language/);
118
+ });
119
+ });
120
+ describe('Project Name Validation', () => {
121
+ it('should accept valid project name', async () => {
122
+ await setupExisting({
123
+ cursor: true,
124
+ projectName: 'My Test Project',
125
+ jiraKey: 'TEST',
126
+ });
127
+ const { join } = await import('path');
128
+ const { readFileSync } = await import('fs');
129
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
130
+ expect(projectJson.projectName).toBe('My Test Project');
131
+ });
132
+ it('should accept project name with Japanese characters', async () => {
133
+ await setupExisting({
134
+ cursor: true,
135
+ projectName: 'テストプロジェクト',
136
+ jiraKey: 'TEST',
137
+ });
138
+ const { join } = await import('path');
139
+ const { readFileSync } = await import('fs');
140
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
141
+ expect(projectJson.projectName).toBe('テストプロジェクト');
142
+ });
143
+ it('should trim whitespace from project name', async () => {
144
+ await setupExisting({
145
+ cursor: true,
146
+ projectName: ' Test Project ',
147
+ jiraKey: 'TEST',
148
+ });
149
+ const { join } = await import('path');
150
+ const { readFileSync } = await import('fs');
151
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
152
+ expect(projectJson.projectName).toBe('Test Project');
153
+ });
154
+ it('should reject empty project name', async () => {
155
+ await expect(async () => {
156
+ await setupExisting({
157
+ cursor: true,
158
+ projectName: '',
159
+ jiraKey: 'TEST',
160
+ });
161
+ }).rejects.toThrow(/プロジェクト名が空です/);
162
+ });
163
+ it('should reject project name with path traversal characters', async () => {
164
+ await expect(async () => {
165
+ await setupExisting({
166
+ cursor: true,
167
+ projectName: '../hack',
168
+ jiraKey: 'TEST',
169
+ });
170
+ }).rejects.toThrow(/パス区切り文字/);
171
+ });
172
+ it('should reject project name with backslash', async () => {
173
+ await expect(async () => {
174
+ await setupExisting({
175
+ cursor: true,
176
+ projectName: 'test\\hack',
177
+ jiraKey: 'TEST',
178
+ });
179
+ }).rejects.toThrow(/パス区切り文字/);
180
+ });
181
+ it('should reject project name with control characters', async () => {
182
+ await expect(async () => {
183
+ await setupExisting({
184
+ cursor: true,
185
+ projectName: 'test\x00hack',
186
+ jiraKey: 'TEST',
187
+ });
188
+ }).rejects.toThrow(/制御文字/);
189
+ });
190
+ it('should reject project name that is too long', async () => {
191
+ const longName = 'a'.repeat(101); // Over 100 characters
192
+ await expect(async () => {
193
+ await setupExisting({
194
+ cursor: true,
195
+ projectName: longName,
196
+ jiraKey: 'TEST',
197
+ });
198
+ }).rejects.toThrow(/長すぎます/);
199
+ });
200
+ });
201
+ describe('JIRA Key Validation', () => {
202
+ it('should accept valid JIRA key', async () => {
203
+ await setupExisting({
204
+ cursor: true,
205
+ projectName: 'Test Project',
206
+ jiraKey: 'TEST',
207
+ });
208
+ const { join } = await import('path');
209
+ const { readFileSync } = await import('fs');
210
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
211
+ expect(projectJson.jiraProjectKey).toBe('TEST');
212
+ });
213
+ it('should convert lowercase JIRA key to uppercase', async () => {
214
+ await setupExisting({
215
+ cursor: true,
216
+ projectName: 'Test Project',
217
+ jiraKey: 'test',
218
+ });
219
+ const { join } = await import('path');
220
+ const { readFileSync } = await import('fs');
221
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
222
+ expect(projectJson.jiraProjectKey).toBe('TEST');
223
+ });
224
+ it('should accept JIRA key with 2 characters', async () => {
225
+ await setupExisting({
226
+ cursor: true,
227
+ projectName: 'Test Project',
228
+ jiraKey: 'AB',
229
+ });
230
+ const { join } = await import('path');
231
+ const { readFileSync } = await import('fs');
232
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
233
+ expect(projectJson.jiraProjectKey).toBe('AB');
234
+ });
235
+ it('should accept JIRA key with 10 characters', async () => {
236
+ await setupExisting({
237
+ cursor: true,
238
+ projectName: 'Test Project',
239
+ jiraKey: 'ABCDEFGHIJ',
240
+ });
241
+ const { join } = await import('path');
242
+ const { readFileSync } = await import('fs');
243
+ const projectJson = JSON.parse(readFileSync(join(testProject.path, '.kiro/project.json'), 'utf-8'));
244
+ expect(projectJson.jiraProjectKey).toBe('ABCDEFGHIJ');
245
+ });
246
+ it('should reject JIRA key with 1 character', async () => {
247
+ await expect(async () => {
248
+ await setupExisting({
249
+ cursor: true,
250
+ projectName: 'Test Project',
251
+ jiraKey: 'A',
252
+ });
253
+ }).rejects.toThrow(/JIRAキーの形式が不正です/);
254
+ });
255
+ it('should reject JIRA key with 11 characters', async () => {
256
+ await expect(async () => {
257
+ await setupExisting({
258
+ cursor: true,
259
+ projectName: 'Test Project',
260
+ jiraKey: 'ABCDEFGHIJK',
261
+ });
262
+ }).rejects.toThrow(/JIRAキーの形式が不正です/);
263
+ });
264
+ it('should reject JIRA key with numbers', async () => {
265
+ await expect(async () => {
266
+ await setupExisting({
267
+ cursor: true,
268
+ projectName: 'Test Project',
269
+ jiraKey: 'TEST123',
270
+ });
271
+ }).rejects.toThrow(/JIRAキーの形式が不正です/);
272
+ });
273
+ it('should reject JIRA key with special characters', async () => {
274
+ await expect(async () => {
275
+ await setupExisting({
276
+ cursor: true,
277
+ projectName: 'Test Project',
278
+ jiraKey: 'TEST-',
279
+ });
280
+ }).rejects.toThrow(/JIRAキーの形式が不正です/);
281
+ });
282
+ });
283
+ describe('Git Repository Validation', () => {
284
+ it('should show warning if not Git repository', async () => {
285
+ // Remove .git directory
286
+ const { rmSync } = await import('fs');
287
+ const { join } = await import('path');
288
+ const gitPath = join(testProject.path, '.git');
289
+ rmSync(gitPath, { recursive: true, force: true });
290
+ // Should not throw, but continue with warning
291
+ await setupExisting({
292
+ cursor: true,
293
+ projectName: 'Test Project',
294
+ jiraKey: 'TEST',
295
+ });
296
+ // If we reach here, the test passes
297
+ expect(true).toBe(true);
298
+ });
299
+ });
300
+ });
301
+ //# sourceMappingURL=validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/integration/setup/validation.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAe,MAAM,2BAA2B,CAAC;AAE3E,wCAAwC;AACxC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAgB,EAAE,QAAkC,EAAE,EAAE;YACjE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe;QAChC,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;KAChB,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,WAAwB,CAAC;IAC7B,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC5B,WAAW,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,WAAW,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,mFAAmF;YAEnF,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACpD,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,IAAI,EAAE,kEAAkE;oBAC9E,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,iBAAiB;gBAC9B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,WAAW;gBACxB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,kBAAkB;gBAC/B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,EAAE;oBACf,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,SAAS;oBACtB,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,YAAY;oBACzB,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB;YAExD,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,QAAQ;oBACrB,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACpE,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,GAAG;iBACb,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,aAAa;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,SAAS;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,aAAa,CAAC;oBAClB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,OAAO;iBACjB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,wBAAwB;YACxB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAElD,8CAA8C;YAC9C,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,oCAAoC;YACpC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CpC;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CA2LnC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgFpC;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CA+dnC"}
package/dist/src/cli.js CHANGED
@@ -6,7 +6,7 @@
6
6
  import { Command } from 'commander';
7
7
  import { fileURLToPath } from 'url';
8
8
  import { realpathSync } from 'fs';
9
- import { syncTasksToJIRA } from '../scripts/jira-sync.js';
9
+ import { syncTasksToJIRA, JIRAClient } from '../scripts/jira-sync.js';
10
10
  import { syncToConfluence } from '../scripts/confluence-sync.js';
11
11
  import { runPhase } from '../scripts/phase-runner.js';
12
12
  import { validatePhase } from '../scripts/validate-phase.js';
@@ -16,18 +16,47 @@ import { createResourceDashboard } from '../scripts/resource-dashboard.js';
16
16
  import { WorkflowOrchestrator } from '../scripts/workflow-orchestrator.js';
17
17
  import { configInteractive } from '../scripts/config-interactive.js';
18
18
  import { validateAndReport } from '../scripts/utils/config-validator.js';
19
+ import { setupExisting } from './commands/setup-existing.js';
20
+ import { convertTasksFile } from '../scripts/utils/tasks-converter.js';
21
+ import { isAIDLCFormat } from '../scripts/utils/aidlc-parser.js';
19
22
  import { config } from 'dotenv';
20
23
  import { readFileSync, existsSync } from 'fs';
21
24
  import { dirname, join } from 'path';
22
25
  // package.jsonからバージョンを読み込む
23
- // コンパイル後は dist/src/cli.js から実行されるため、2階層上がる必要がある
24
- // テスト環境では src/cli.ts から直接実行されるため、process.cwd()も考慮する
26
+ // Michi自身のpackage.jsonのみを読み込み、利用者のpackage.jsonは読まない
25
27
  const __filename = fileURLToPath(import.meta.url);
26
28
  const __dirname = dirname(__filename);
27
- // まず、コンパイル後のパス(dist/src/cli.js)を試す
28
- const distPath = join(__dirname, '..', '..', 'package.json');
29
- const packageJsonPath = existsSync(distPath) ? distPath : join(process.cwd(), 'package.json');
30
- const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
29
+ /**
30
+ * Michi自身のpackage.jsonからバージョンを取得
31
+ * 利用者のプロジェクトがNode.jsでなくてもMichiを使えるようにする
32
+ */
33
+ function getMichiVersion() {
34
+ // package.jsonの場所を探索
35
+ // - ビルド後/npm実行時: __dirname/../../package.json (dist/src/cli.js)
36
+ // - 開発時: __dirname/../package.json (src/cli.ts)
37
+ const possiblePaths = [
38
+ join(__dirname, '..', '..', 'package.json'),
39
+ join(__dirname, '..', 'package.json'),
40
+ ];
41
+ for (const path of possiblePaths) {
42
+ if (existsSync(path)) {
43
+ try {
44
+ const packageJson = JSON.parse(readFileSync(path, 'utf-8'));
45
+ // name フィールドで確実にMichiのpackage.jsonか確認
46
+ if (packageJson.name === '@sk8metal/michi-cli') {
47
+ return packageJson.version;
48
+ }
49
+ }
50
+ catch {
51
+ // 次のパスを試す
52
+ continue;
53
+ }
54
+ }
55
+ }
56
+ // どこにも見つからない場合はデフォルト値(開発環境など)
57
+ return '0.0.0-dev';
58
+ }
59
+ const michiVersion = getMichiVersion();
31
60
  // 環境変数読み込み
32
61
  config();
33
62
  /**
@@ -42,7 +71,10 @@ function getApprovalGates(envVar, defaultValue) {
42
71
  return defaultValue;
43
72
  }
44
73
  // カンマ区切りを配列に変換し、空白をトリム
45
- return envValue.split(',').map(role => role.trim()).filter(role => role.length > 0);
74
+ return envValue
75
+ .split(',')
76
+ .map((role) => role.trim())
77
+ .filter((role) => role.length > 0);
46
78
  }
47
79
  /**
48
80
  * CLIツールを作成
@@ -52,7 +84,7 @@ export function createCLI() {
52
84
  program
53
85
  .name('michi')
54
86
  .description('🛣️ Michi(道) - Managed Intelligent Comprehensive Hub for Integration')
55
- .version(packageJson.version);
87
+ .version(michiVersion);
56
88
  // jira:sync コマンド
57
89
  program
58
90
  .command('jira:sync')
@@ -87,9 +119,18 @@ export function createCLI() {
87
119
  .command('phase:run')
88
120
  .description('Run complete phase workflow')
89
121
  .argument('<feature>', 'Feature name')
90
- .argument('<phase>', 'Phase name (requirements, design, tasks)')
122
+ .argument('<phase>', 'Phase name (requirements, design, test-type-selection, test-spec, tasks, environment-setup, phase-a, phase-b)')
91
123
  .action(async (feature, phase) => {
92
- const validPhases = ['requirements', 'design', 'tasks'];
124
+ const validPhases = [
125
+ 'requirements',
126
+ 'design',
127
+ 'test-type-selection',
128
+ 'test-spec',
129
+ 'tasks',
130
+ 'environment-setup',
131
+ 'phase-a',
132
+ 'phase-b',
133
+ ];
93
134
  if (!validPhases.includes(phase)) {
94
135
  console.error(`❌ Invalid phase. Must be: ${validPhases.join(', ')}`);
95
136
  process.exit(1);
@@ -114,9 +155,18 @@ export function createCLI() {
114
155
  .command('validate:phase')
115
156
  .description('Validate phase completion')
116
157
  .argument('<feature>', 'Feature name')
117
- .argument('<phase>', 'Phase name (requirements, design, tasks)')
158
+ .argument('<phase>', 'Phase name (requirements, design, test-type-selection, test-spec, tasks, environment-setup, phase-a, phase-b)')
118
159
  .action(async (feature, phase) => {
119
- const validPhases = ['requirements', 'design', 'tasks'];
160
+ const validPhases = [
161
+ 'requirements',
162
+ 'design',
163
+ 'test-type-selection',
164
+ 'test-spec',
165
+ 'tasks',
166
+ 'environment-setup',
167
+ 'phase-a',
168
+ 'phase-b',
169
+ ];
120
170
  if (!validPhases.includes(phase)) {
121
171
  console.error(`❌ Invalid phase. Must be: ${validPhases.join(', ')}`);
122
172
  process.exit(1);
@@ -185,12 +235,28 @@ export function createCLI() {
185
235
  try {
186
236
  const workflowConfig = {
187
237
  feature: options.feature,
188
- stages: ['requirements', 'design', 'tasks', 'implement', 'test', 'release'],
238
+ stages: [
239
+ 'requirements',
240
+ 'design',
241
+ 'tasks',
242
+ 'implement',
243
+ 'test',
244
+ 'release',
245
+ ],
189
246
  approvalGates: {
190
- requirements: getApprovalGates('APPROVAL_GATES_REQUIREMENTS', ['pm', 'director']),
191
- design: getApprovalGates('APPROVAL_GATES_DESIGN', ['architect', 'director']),
192
- release: getApprovalGates('APPROVAL_GATES_RELEASE', ['sm', 'director'])
193
- }
247
+ requirements: getApprovalGates('APPROVAL_GATES_REQUIREMENTS', [
248
+ 'pm',
249
+ 'director',
250
+ ]),
251
+ design: getApprovalGates('APPROVAL_GATES_DESIGN', [
252
+ 'architect',
253
+ 'director',
254
+ ]),
255
+ release: getApprovalGates('APPROVAL_GATES_RELEASE', [
256
+ 'sm',
257
+ 'director',
258
+ ]),
259
+ },
194
260
  };
195
261
  const orchestrator = new WorkflowOrchestrator(workflowConfig);
196
262
  await orchestrator.run();
@@ -228,6 +294,150 @@ export function createCLI() {
228
294
  process.exit(1);
229
295
  }
230
296
  });
297
+ // setup-existing コマンド
298
+ program
299
+ .command('setup-existing')
300
+ .description('Add Michi workflow to existing repository')
301
+ .option('--cursor', 'Use Cursor IDE environment')
302
+ .option('--claude', 'Use Claude Code environment')
303
+ .option('--claude-agent', 'Use Claude Code Subagents environment')
304
+ .option('--gemini', 'Use Gemini CLI environment')
305
+ .option('--codex', 'Use Codex CLI environment')
306
+ .option('--cline', 'Use Cline environment')
307
+ .option('--lang <code>', 'Language code (default: ja)', 'ja')
308
+ .option('--project-name <name>', 'Project name')
309
+ .option('--jira-key <key>', 'JIRA project key')
310
+ .action(async (options) => {
311
+ try {
312
+ await setupExisting(options);
313
+ }
314
+ catch (error) {
315
+ console.error('❌ Setup failed:', error instanceof Error ? error.message : error);
316
+ process.exit(1);
317
+ }
318
+ });
319
+ // tasks:convert コマンド
320
+ program
321
+ .command('tasks:convert')
322
+ .description('Convert AI-DLC format tasks.md to Michi workflow format')
323
+ .argument('<feature>', 'Feature name')
324
+ .option('--dry-run', 'Preview conversion without modifying files')
325
+ .option('--backup', 'Create backup of original file')
326
+ .option('--lang <code>', 'Output language (ja/en)', 'ja')
327
+ .action(async (feature, options) => {
328
+ try {
329
+ const kiroDir = '.kiro';
330
+ const tasksPath = join(kiroDir, 'specs', feature, 'tasks.md');
331
+ if (!existsSync(tasksPath)) {
332
+ console.error(`❌ tasks.md not found: ${tasksPath}`);
333
+ process.exit(1);
334
+ }
335
+ // AI-DLC形式かチェック
336
+ const content = readFileSync(tasksPath, 'utf-8');
337
+ if (!isAIDLCFormat(content)) {
338
+ console.log('ℹ️ File is not in AI-DLC format (may already be in Michi format)');
339
+ console.log(' No conversion needed.');
340
+ process.exit(0);
341
+ }
342
+ console.log('🔄 Converting AI-DLC format to Michi workflow format...');
343
+ console.log(` Input: ${tasksPath}`);
344
+ const result = convertTasksFile(tasksPath, undefined, {
345
+ dryRun: options.dryRun,
346
+ backup: options.backup,
347
+ language: (options.lang || 'ja'),
348
+ projectName: feature,
349
+ });
350
+ if (!result.success) {
351
+ console.error('❌ Conversion failed:');
352
+ result.warnings.forEach((w) => console.error(` ${w}`));
353
+ process.exit(1);
354
+ }
355
+ console.log('');
356
+ console.log('📊 Conversion Statistics:');
357
+ console.log(` Original categories: ${result.stats.originalCategories}`);
358
+ console.log(` Original tasks: ${result.stats.originalTasks}`);
359
+ console.log(` Converted phases: ${result.stats.convertedPhases}`);
360
+ console.log(` Converted stories: ${result.stats.convertedStories}`);
361
+ if (result.backupPath) {
362
+ console.log(` Backup created: ${result.backupPath}`);
363
+ }
364
+ if (result.warnings.length > 0) {
365
+ console.log('');
366
+ console.log('⚠️ Warnings:');
367
+ result.warnings.forEach((w) => console.log(` ${w}`));
368
+ }
369
+ if (options.dryRun) {
370
+ console.log('');
371
+ console.log('📝 Preview (first 50 lines):');
372
+ console.log('---');
373
+ const previewLines = result.convertedContent
374
+ .split('\n')
375
+ .slice(0, 50);
376
+ console.log(previewLines.join('\n'));
377
+ if (result.convertedContent.split('\n').length > 50) {
378
+ console.log('... (truncated)');
379
+ }
380
+ console.log('---');
381
+ }
382
+ else {
383
+ console.log('');
384
+ console.log('✅ Conversion completed!');
385
+ console.log(` Output: ${tasksPath}`);
386
+ }
387
+ }
388
+ catch (error) {
389
+ console.error('❌ Conversion failed:', error instanceof Error ? error.message : error);
390
+ process.exit(1);
391
+ }
392
+ });
393
+ // jira:transition コマンド
394
+ program
395
+ .command('jira:transition')
396
+ .description('Change JIRA ticket status')
397
+ .argument('<issueKey>', 'JIRA issue key (e.g., PROJ-123)')
398
+ .argument('<status>', 'Target status name (e.g., "In Progress", "Ready for Review")')
399
+ .action(async (issueKey, status) => {
400
+ try {
401
+ const url = process.env.ATLASSIAN_URL;
402
+ const email = process.env.ATLASSIAN_EMAIL;
403
+ const apiToken = process.env.ATLASSIAN_API_TOKEN;
404
+ if (!url || !email || !apiToken) {
405
+ console.error('❌ Missing JIRA credentials in .env');
406
+ console.error(' Required: ATLASSIAN_URL, ATLASSIAN_EMAIL, ATLASSIAN_API_TOKEN');
407
+ process.exit(1);
408
+ }
409
+ const client = new JIRAClient({ url, email, apiToken });
410
+ await client.transitionIssue(issueKey, status);
411
+ }
412
+ catch (error) {
413
+ console.error('❌ JIRA transition failed:', error instanceof Error ? error.message : error);
414
+ process.exit(1);
415
+ }
416
+ });
417
+ // jira:comment コマンド
418
+ program
419
+ .command('jira:comment')
420
+ .description('Add comment to JIRA ticket')
421
+ .argument('<issueKey>', 'JIRA issue key (e.g., PROJ-123)')
422
+ .argument('<comment>', 'Comment text')
423
+ .action(async (issueKey, comment) => {
424
+ try {
425
+ const url = process.env.ATLASSIAN_URL;
426
+ const email = process.env.ATLASSIAN_EMAIL;
427
+ const apiToken = process.env.ATLASSIAN_API_TOKEN;
428
+ if (!url || !email || !apiToken) {
429
+ console.error('❌ Missing JIRA credentials in .env');
430
+ console.error(' Required: ATLASSIAN_URL, ATLASSIAN_EMAIL, ATLASSIAN_API_TOKEN');
431
+ process.exit(1);
432
+ }
433
+ const client = new JIRAClient({ url, email, apiToken });
434
+ await client.addComment(issueKey, comment);
435
+ }
436
+ catch (error) {
437
+ console.error('❌ JIRA comment failed:', error instanceof Error ? error.message : error);
438
+ process.exit(1);
439
+ }
440
+ });
231
441
  return program;
232
442
  }
233
443
  // CLI実行(直接実行時)