@sk8metal/michi-cli 0.0.9 → 0.2.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 (388) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +236 -57
  3. package/dist/scripts/__tests__/create-project.test.js +24 -28
  4. package/dist/scripts/__tests__/create-project.test.js.map +1 -1
  5. package/dist/scripts/__tests__/jira-transitions.test.d.ts +5 -0
  6. package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +1 -0
  7. package/dist/scripts/__tests__/jira-transitions.test.js +172 -0
  8. package/dist/scripts/__tests__/jira-transitions.test.js.map +1 -0
  9. package/dist/scripts/__tests__/multi-project-estimate.test.js +14 -15
  10. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -1
  11. package/dist/scripts/__tests__/setup-existing-project.test.js +79 -0
  12. package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
  13. package/dist/scripts/__tests__/setup-interactive.test.js +23 -17
  14. package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -1
  15. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +5 -0
  16. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +1 -0
  17. package/dist/scripts/__tests__/spec-impl-workflow.test.js +321 -0
  18. package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +1 -0
  19. package/dist/scripts/__tests__/spec-loader.test.d.ts +5 -0
  20. package/dist/scripts/__tests__/spec-loader.test.d.ts.map +1 -0
  21. package/dist/scripts/__tests__/spec-loader.test.js +153 -0
  22. package/dist/scripts/__tests__/spec-loader.test.js.map +1 -0
  23. package/dist/scripts/__tests__/validate-phase.test.js +109 -22
  24. package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
  25. package/dist/scripts/config/config-schema.d.ts +31 -0
  26. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  27. package/dist/scripts/config/config-schema.js +64 -26
  28. package/dist/scripts/config/config-schema.js.map +1 -1
  29. package/dist/scripts/config-interactive.d.ts.map +1 -1
  30. package/dist/scripts/config-interactive.js +53 -38
  31. package/dist/scripts/config-interactive.js.map +1 -1
  32. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  33. package/dist/scripts/confluence-sync.js +0 -11
  34. package/dist/scripts/confluence-sync.js.map +1 -1
  35. package/dist/scripts/constants/__tests__/environments.test.js +39 -5
  36. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -1
  37. package/dist/scripts/constants/environments.d.ts +1 -1
  38. package/dist/scripts/constants/environments.d.ts.map +1 -1
  39. package/dist/scripts/constants/environments.js +22 -7
  40. package/dist/scripts/constants/environments.js.map +1 -1
  41. package/dist/scripts/constants/test-commands.d.ts +36 -0
  42. package/dist/scripts/constants/test-commands.d.ts.map +1 -0
  43. package/dist/scripts/constants/test-commands.js +70 -0
  44. package/dist/scripts/constants/test-commands.js.map +1 -0
  45. package/dist/scripts/jira-sync.d.ts +89 -3
  46. package/dist/scripts/jira-sync.d.ts.map +1 -1
  47. package/dist/scripts/jira-sync.js +366 -96
  48. package/dist/scripts/jira-sync.js.map +1 -1
  49. package/dist/scripts/markdown-to-confluence.js +1 -1
  50. package/dist/scripts/markdown-to-confluence.js.map +1 -1
  51. package/dist/scripts/phase-runner.d.ts +1 -1
  52. package/dist/scripts/phase-runner.d.ts.map +1 -1
  53. package/dist/scripts/phase-runner.js +809 -13
  54. package/dist/scripts/phase-runner.js.map +1 -1
  55. package/dist/scripts/pr-automation.d.ts.map +1 -1
  56. package/dist/scripts/pr-automation.js.map +1 -1
  57. package/dist/scripts/pre-flight-check.js +1 -1
  58. package/dist/scripts/pre-flight-check.js.map +1 -1
  59. package/dist/scripts/setup-existing-project.js +61 -29
  60. package/dist/scripts/setup-existing-project.js.map +1 -1
  61. package/dist/scripts/setup-interactive.js +3 -3
  62. package/dist/scripts/setup-interactive.js.map +1 -1
  63. package/dist/scripts/spec-impl-workflow.d.ts +94 -0
  64. package/dist/scripts/spec-impl-workflow.d.ts.map +1 -0
  65. package/dist/scripts/spec-impl-workflow.js +354 -0
  66. package/dist/scripts/spec-impl-workflow.js.map +1 -0
  67. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -1
  68. package/dist/scripts/test-execution-generator.d.ts +52 -0
  69. package/dist/scripts/test-execution-generator.d.ts.map +1 -0
  70. package/dist/scripts/test-execution-generator.js +576 -0
  71. package/dist/scripts/test-execution-generator.js.map +1 -0
  72. package/dist/scripts/test-interactive.d.ts +10 -0
  73. package/dist/scripts/test-interactive.d.ts.map +1 -0
  74. package/dist/scripts/test-interactive.js +627 -0
  75. package/dist/scripts/test-interactive.js.map +1 -0
  76. package/dist/scripts/test-new-features.d.ts +5 -0
  77. package/dist/scripts/test-new-features.d.ts.map +1 -0
  78. package/dist/scripts/test-new-features.js +145 -0
  79. package/dist/scripts/test-new-features.js.map +1 -0
  80. package/dist/scripts/test-spec-generator.d.ts +29 -0
  81. package/dist/scripts/test-spec-generator.d.ts.map +1 -0
  82. package/dist/scripts/test-spec-generator.js +494 -0
  83. package/dist/scripts/test-spec-generator.js.map +1 -0
  84. package/dist/scripts/test-workflow-stages.d.ts +6 -0
  85. package/dist/scripts/test-workflow-stages.d.ts.map +1 -0
  86. package/dist/scripts/test-workflow-stages.js +43 -0
  87. package/dist/scripts/test-workflow-stages.js.map +1 -0
  88. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +5 -0
  89. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +1 -0
  90. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +315 -0
  91. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +1 -0
  92. package/dist/scripts/utils/__tests__/business-days.test.d.ts +5 -0
  93. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +1 -0
  94. package/dist/scripts/utils/__tests__/business-days.test.js +171 -0
  95. package/dist/scripts/utils/__tests__/business-days.test.js.map +1 -0
  96. package/dist/scripts/utils/__tests__/config-loader.test.js +1 -1
  97. package/dist/scripts/utils/__tests__/config-loader.test.js.map +1 -1
  98. package/dist/scripts/utils/__tests__/config-validator.test.js +164 -35
  99. package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
  100. package/dist/scripts/utils/__tests__/env-config.test.d.ts +5 -0
  101. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +1 -0
  102. package/dist/scripts/utils/__tests__/env-config.test.js +218 -0
  103. package/dist/scripts/utils/__tests__/env-config.test.js.map +1 -0
  104. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +5 -0
  105. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +1 -0
  106. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +202 -0
  107. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +1 -0
  108. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +5 -0
  109. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +1 -0
  110. package/dist/scripts/utils/__tests__/tasks-converter.test.js +500 -0
  111. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +1 -0
  112. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +5 -0
  113. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +1 -0
  114. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +314 -0
  115. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +1 -0
  116. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +5 -0
  117. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +1 -0
  118. package/dist/scripts/utils/__tests__/test-runner.test.js +64 -0
  119. package/dist/scripts/utils/__tests__/test-runner.test.js.map +1 -0
  120. package/dist/scripts/utils/aidlc-parser.d.ts +86 -0
  121. package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -0
  122. package/dist/scripts/utils/aidlc-parser.js +208 -0
  123. package/dist/scripts/utils/aidlc-parser.js.map +1 -0
  124. package/dist/scripts/utils/business-days.d.ts +52 -0
  125. package/dist/scripts/utils/business-days.d.ts.map +1 -0
  126. package/dist/scripts/utils/business-days.js +98 -0
  127. package/dist/scripts/utils/business-days.js.map +1 -0
  128. package/dist/scripts/utils/ci-generator.d.ts +14 -0
  129. package/dist/scripts/utils/ci-generator.d.ts.map +1 -0
  130. package/dist/scripts/utils/ci-generator.js +61 -0
  131. package/dist/scripts/utils/ci-generator.js.map +1 -0
  132. package/dist/scripts/utils/config-loader.js +2 -2
  133. package/dist/scripts/utils/config-loader.js.map +1 -1
  134. package/dist/scripts/utils/config-validator.d.ts +7 -1
  135. package/dist/scripts/utils/config-validator.d.ts.map +1 -1
  136. package/dist/scripts/utils/config-validator.js +136 -23
  137. package/dist/scripts/utils/config-validator.js.map +1 -1
  138. package/dist/scripts/utils/confluence-approval.d.ts +46 -0
  139. package/dist/scripts/utils/confluence-approval.d.ts.map +1 -0
  140. package/dist/scripts/utils/confluence-approval.js +118 -0
  141. package/dist/scripts/utils/confluence-approval.js.map +1 -0
  142. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  143. package/dist/scripts/utils/confluence-hierarchy.js +1 -1
  144. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  145. package/dist/scripts/utils/docker-generator.d.ts +9 -0
  146. package/dist/scripts/utils/docker-generator.d.ts.map +1 -0
  147. package/dist/scripts/utils/docker-generator.js +132 -0
  148. package/dist/scripts/utils/docker-generator.js.map +1 -0
  149. package/dist/scripts/utils/docker-requirement-detector.d.ts +15 -0
  150. package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -0
  151. package/dist/scripts/utils/docker-requirement-detector.js +124 -0
  152. package/dist/scripts/utils/docker-requirement-detector.js.map +1 -0
  153. package/dist/scripts/utils/env-config.d.ts +54 -0
  154. package/dist/scripts/utils/env-config.d.ts.map +1 -0
  155. package/dist/scripts/utils/env-config.js +414 -0
  156. package/dist/scripts/utils/env-config.js.map +1 -0
  157. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts +70 -0
  158. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -0
  159. package/dist/scripts/utils/jira-issue-type-fetcher.js +147 -0
  160. package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -0
  161. package/dist/scripts/utils/language-detector.d.ts +14 -0
  162. package/dist/scripts/utils/language-detector.d.ts.map +1 -0
  163. package/dist/scripts/utils/language-detector.js +119 -0
  164. package/dist/scripts/utils/language-detector.js.map +1 -0
  165. package/dist/scripts/utils/markdown-parser.d.ts +55 -0
  166. package/dist/scripts/utils/markdown-parser.d.ts.map +1 -0
  167. package/dist/scripts/utils/markdown-parser.js +289 -0
  168. package/dist/scripts/utils/markdown-parser.js.map +1 -0
  169. package/dist/scripts/utils/project-detector.d.ts +17 -0
  170. package/dist/scripts/utils/project-detector.d.ts.map +1 -0
  171. package/dist/scripts/utils/project-detector.js +166 -0
  172. package/dist/scripts/utils/project-detector.js.map +1 -0
  173. package/dist/scripts/utils/project-finder.js +2 -2
  174. package/dist/scripts/utils/project-finder.js.map +1 -1
  175. package/dist/scripts/utils/release-notes-generator.d.ts +56 -0
  176. package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -0
  177. package/dist/scripts/utils/release-notes-generator.js +162 -0
  178. package/dist/scripts/utils/release-notes-generator.js.map +1 -0
  179. package/dist/scripts/utils/spec-loader.d.ts +79 -0
  180. package/dist/scripts/utils/spec-loader.d.ts.map +1 -0
  181. package/dist/scripts/utils/spec-loader.js +80 -0
  182. package/dist/scripts/utils/spec-loader.js.map +1 -0
  183. package/dist/scripts/utils/spec-updater.d.ts +7 -0
  184. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  185. package/dist/scripts/utils/spec-updater.js.map +1 -1
  186. package/dist/scripts/utils/tasks-converter.d.ts +57 -0
  187. package/dist/scripts/utils/tasks-converter.d.ts.map +1 -0
  188. package/dist/scripts/utils/tasks-converter.js +322 -0
  189. package/dist/scripts/utils/tasks-converter.js.map +1 -0
  190. package/dist/scripts/utils/tasks-format-validator.d.ts +36 -0
  191. package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -0
  192. package/dist/scripts/utils/tasks-format-validator.js +158 -0
  193. package/dist/scripts/utils/tasks-format-validator.js.map +1 -0
  194. package/dist/scripts/utils/template-applier.d.ts +37 -0
  195. package/dist/scripts/utils/template-applier.d.ts.map +1 -0
  196. package/dist/scripts/utils/template-applier.js +129 -0
  197. package/dist/scripts/utils/template-applier.js.map +1 -0
  198. package/dist/scripts/utils/test-config-generator.d.ts +12 -0
  199. package/dist/scripts/utils/test-config-generator.d.ts.map +1 -0
  200. package/dist/scripts/utils/test-config-generator.js +185 -0
  201. package/dist/scripts/utils/test-config-generator.js.map +1 -0
  202. package/dist/scripts/utils/test-runner.d.ts +31 -0
  203. package/dist/scripts/utils/test-runner.d.ts.map +1 -0
  204. package/dist/scripts/utils/test-runner.js +103 -0
  205. package/dist/scripts/utils/test-runner.js.map +1 -0
  206. package/dist/scripts/validate-phase.d.ts +1 -1
  207. package/dist/scripts/validate-phase.d.ts.map +1 -1
  208. package/dist/scripts/validate-phase.js +171 -8
  209. package/dist/scripts/validate-phase.js.map +1 -1
  210. package/dist/scripts/workflow-orchestrator.d.ts +8 -0
  211. package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
  212. package/dist/scripts/workflow-orchestrator.js +108 -7
  213. package/dist/scripts/workflow-orchestrator.js.map +1 -1
  214. package/dist/src/__tests__/integration/internationalization.test.d.ts +8 -0
  215. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +1 -0
  216. package/dist/src/__tests__/integration/internationalization.test.js +333 -0
  217. package/dist/src/__tests__/integration/internationalization.test.js.map +1 -0
  218. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +1 -1
  219. package/dist/src/__tests__/integration/setup/claude-agent.test.js +17 -20
  220. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -1
  221. package/dist/src/__tests__/integration/setup/claude.test.js +82 -0
  222. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -1
  223. package/dist/src/__tests__/integration/setup/cursor.test.js +23 -19
  224. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -1
  225. package/dist/src/__tests__/integration/setup/validation.test.js +41 -58
  226. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -1
  227. package/dist/src/cli.d.ts.map +1 -1
  228. package/dist/src/cli.js +209 -18
  229. package/dist/src/cli.js.map +1 -1
  230. package/dist/src/commands/setup-existing.d.ts +4 -0
  231. package/dist/src/commands/setup-existing.d.ts.map +1 -1
  232. package/dist/src/commands/setup-existing.js +367 -47
  233. package/dist/src/commands/setup-existing.js.map +1 -1
  234. package/docs/README.md +3 -1
  235. package/docs/context.md +59 -0
  236. package/docs/design-issue-55.md +240 -0
  237. package/docs/design-issue-56.md +181 -0
  238. package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
  239. package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
  240. package/docs/plan.md +275 -0
  241. package/docs/user-guide/getting-started/github-token-setup.md +509 -0
  242. package/docs/{getting-started → user-guide/getting-started}/quick-start.md +16 -0
  243. package/docs/{getting-started → user-guide/getting-started}/setup.md +28 -1
  244. package/docs/user-guide/guides/agent-skills-integration.md +217 -0
  245. package/docs/{guides → user-guide/guides}/customization.md +2 -2
  246. package/docs/user-guide/guides/internationalization.md +540 -0
  247. package/docs/{guides → user-guide/guides}/multi-project.md +3 -3
  248. package/docs/{guides → user-guide/guides}/phase-automation.md +92 -34
  249. package/docs/user-guide/guides/workflow.md +570 -0
  250. package/docs/user-guide/hands-on/README.md +142 -0
  251. package/docs/user-guide/hands-on/claude-agent-setup.md +455 -0
  252. package/docs/user-guide/hands-on/claude-setup.md +398 -0
  253. package/docs/user-guide/hands-on/cursor-setup.md +352 -0
  254. package/docs/user-guide/hands-on/troubleshooting.md +964 -0
  255. package/docs/user-guide/hands-on/verification-checklist.md +438 -0
  256. package/docs/user-guide/hands-on/workflow-walkthrough.md +906 -0
  257. package/docs/user-guide/reference/config.md +564 -0
  258. package/docs/{reference → user-guide/reference}/quick-reference.md +53 -40
  259. package/docs/{reference → user-guide/reference}/tasks-template.md +2 -2
  260. package/docs/user-guide/release/ci-setup.md +541 -0
  261. package/docs/user-guide/release/release-flow.md +476 -0
  262. package/docs/user-guide/templates/test-specs/README.md +173 -0
  263. package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
  264. package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
  265. package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
  266. package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
  267. package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
  268. package/docs/{testing → user-guide/testing}/integration-tests.md +24 -9
  269. package/docs/user-guide/testing/tdd-cycle.md +349 -0
  270. package/docs/user-guide/testing/test-execution-flow.md +396 -0
  271. package/docs/user-guide/testing/test-failure-handling.md +521 -0
  272. package/docs/user-guide/testing/test-planning-flow.md +181 -0
  273. package/docs/user-guide/testing-strategy.md +185 -0
  274. package/docs/verification-guide.md +518 -0
  275. package/package.json +7 -2
  276. package/scripts/__tests__/create-project.test.ts +67 -49
  277. package/scripts/__tests__/jira-transitions.test.ts +225 -0
  278. package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
  279. package/scripts/__tests__/setup-existing-project.test.ts +98 -1
  280. package/scripts/__tests__/setup-interactive.test.ts +52 -46
  281. package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
  282. package/scripts/__tests__/spec-loader.test.ts +199 -0
  283. package/scripts/__tests__/validate-phase.test.ts +178 -54
  284. package/scripts/config/config-schema.ts +100 -50
  285. package/scripts/config-interactive.ts +191 -136
  286. package/scripts/confluence-sync.ts +0 -12
  287. package/scripts/constants/__tests__/environments.test.ts +42 -6
  288. package/scripts/constants/environments.ts +33 -13
  289. package/scripts/constants/test-commands.ts +96 -0
  290. package/scripts/jira-sync.ts +767 -232
  291. package/scripts/markdown-to-confluence.ts +1 -1
  292. package/scripts/phase-runner.ts +1056 -63
  293. package/scripts/pr-automation.ts +0 -1
  294. package/scripts/pre-flight-check.ts +1 -1
  295. package/scripts/pre-publish-check.sh +311 -0
  296. package/scripts/quick-verify.sh +115 -0
  297. package/scripts/setup-existing-project.ts +201 -117
  298. package/scripts/setup-interactive.ts +4 -4
  299. package/scripts/spec-impl-workflow.ts +505 -0
  300. package/scripts/template/__tests__/renderer.test.ts +1 -2
  301. package/scripts/test-execution-generator.ts +695 -0
  302. package/scripts/test-interactive.ts +779 -0
  303. package/scripts/test-new-features.ts +168 -0
  304. package/scripts/test-npm-package.sh +345 -0
  305. package/scripts/test-spec-generator.ts +574 -0
  306. package/scripts/test-workflow-stages.ts +53 -0
  307. package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
  308. package/scripts/utils/__tests__/business-days.test.ts +214 -0
  309. package/scripts/utils/__tests__/config-loader.test.ts +1 -1
  310. package/scripts/utils/__tests__/config-validator.test.ts +309 -88
  311. package/scripts/utils/__tests__/env-config.test.ts +259 -0
  312. package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
  313. package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
  314. package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
  315. package/scripts/utils/__tests__/test-runner.test.ts +77 -0
  316. package/scripts/utils/aidlc-parser.ts +289 -0
  317. package/scripts/utils/business-days.ts +115 -0
  318. package/scripts/utils/ci-generator.ts +84 -0
  319. package/scripts/utils/config-loader.ts +2 -2
  320. package/scripts/utils/config-validator.ts +304 -117
  321. package/scripts/utils/confluence-approval.ts +167 -0
  322. package/scripts/utils/confluence-hierarchy.ts +2 -4
  323. package/scripts/utils/docker-generator.ts +151 -0
  324. package/scripts/utils/docker-requirement-detector.ts +153 -0
  325. package/scripts/utils/env-config.ts +526 -0
  326. package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
  327. package/scripts/utils/language-detector.ts +139 -0
  328. package/scripts/utils/markdown-parser.ts +376 -0
  329. package/scripts/utils/project-detector.ts +192 -0
  330. package/scripts/utils/project-finder.ts +2 -2
  331. package/scripts/utils/release-notes-generator.ts +210 -0
  332. package/scripts/utils/spec-loader.ts +125 -0
  333. package/scripts/utils/spec-updater.ts +8 -1
  334. package/scripts/utils/tasks-converter.ts +601 -0
  335. package/scripts/utils/tasks-format-validator.ts +193 -0
  336. package/scripts/utils/template-applier.ts +202 -0
  337. package/scripts/utils/test-config-generator.ts +210 -0
  338. package/scripts/utils/test-runner.ts +133 -0
  339. package/scripts/validate-phase.ts +207 -12
  340. package/scripts/workflow-orchestrator.ts +130 -12
  341. package/templates/ci/github-actions/java.yml +54 -0
  342. package/templates/ci/github-actions/nodejs.yml +46 -0
  343. package/templates/ci/github-actions/php.yml +52 -0
  344. package/templates/ci/screwdriver/java.yaml +17 -0
  345. package/templates/ci/screwdriver/nodejs.yaml +17 -0
  346. package/templates/ci/screwdriver/php.yaml +20 -0
  347. package/templates/claude/agents/design-reviewer/AGENT.md +497 -0
  348. package/templates/claude/agents/e2e-first-planner/AGENT.md +410 -0
  349. package/templates/claude/agents/oss-license-checker/AGENT.md +265 -0
  350. package/templates/claude/agents/pr-resolver/AGENT.md +196 -0
  351. package/templates/claude/agents/stable-version-auditor/AGENT.md +279 -0
  352. package/templates/claude/commands/kiro/kiro-spec-impl.md +253 -0
  353. package/templates/claude/commands/kiro/kiro-spec-tasks.md +368 -0
  354. package/templates/claude/commands/michi/design-review.md +66 -0
  355. package/templates/claude/commands/michi/e2e-plan.md +113 -0
  356. package/templates/claude/commands/michi/license-check.md +80 -0
  357. package/templates/claude/commands/michi/pr-resolve.md +153 -0
  358. package/templates/claude/commands/michi/version-audit.md +91 -0
  359. package/templates/claude/skills/design-review/SKILL.md +648 -0
  360. package/templates/claude/skills/e2e-first-planning/SKILL.md +360 -0
  361. package/templates/claude/skills/oss-license/SKILL.md +232 -0
  362. package/templates/claude/skills/stable-version/SKILL.md +252 -0
  363. package/templates/claude-agent/README.md +7 -1
  364. package/templates/claude-agent/agents/.gitkeep +0 -0
  365. package/templates/claude-agent/agents/designer.md +79 -0
  366. package/templates/claude-agent/agents/developer.md +68 -0
  367. package/templates/claude-agent/agents/manager-agent.md +59 -0
  368. package/templates/claude-agent/agents/tester.md +101 -0
  369. package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
  370. package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
  371. package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
  372. package/templates/cline/rules/atlassian-integration.md +36 -0
  373. package/templates/cline/rules/michi-core.md +56 -0
  374. package/templates/codex/AGENTS.override.md +277 -0
  375. package/templates/codex/prompts/confluence-sync.md +177 -0
  376. package/templates/codex/rules/README.md +210 -0
  377. package/templates/common/.kiro/project.json.template +21 -0
  378. package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
  379. package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
  380. package/templates/gemini/commands/README.md +41 -0
  381. package/templates/gemini/rules/GEMINI.md +80 -0
  382. package/docs/guides/workflow.md +0 -342
  383. package/docs/reference/config.md +0 -545
  384. package/scripts/setup-existing.sh +0 -279
  385. /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
  386. /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
  387. /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
  388. /package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +0 -0
@@ -4,7 +4,6 @@
4
4
  */
5
5
 
6
6
  import { readFileSync, writeFileSync, existsSync } from 'fs';
7
- import { resolve } from 'path';
8
7
  import * as readline from 'readline';
9
8
  import { loadProjectMeta } from './utils/project-meta.js';
10
9
  import { validateProjectConfig } from './utils/config-validator.js';
@@ -15,7 +14,7 @@ import { validateProjectConfig } from './utils/config-validator.js';
15
14
  function createInterface(): readline.Interface {
16
15
  return readline.createInterface({
17
16
  input: process.stdin,
18
- output: process.stdout
17
+ output: process.stdout,
19
18
  });
20
19
  }
21
20
 
@@ -23,8 +22,8 @@ function createInterface(): readline.Interface {
23
22
  * 質問を表示して回答を取得
24
23
  */
25
24
  function question(rl: readline.Interface, query: string): Promise<string> {
26
- return new Promise(resolve => {
27
- rl.question(query, answer => {
25
+ return new Promise((resolve) => {
26
+ rl.question(query, (answer) => {
28
27
  resolve(answer.trim());
29
28
  });
30
29
  });
@@ -38,7 +37,7 @@ async function select(
38
37
  prompt: string,
39
38
  choices: Array<{ value: string; label: string; description?: string }>,
40
39
  defaultValue?: string,
41
- maxRetries: number = 3
40
+ maxRetries: number = 3,
42
41
  ): Promise<string> {
43
42
  console.log(`\n${prompt}`);
44
43
  choices.forEach((choice, index) => {
@@ -46,44 +45,55 @@ async function select(
46
45
  const desc = choice.description ? ` - ${choice.description}` : '';
47
46
  console.log(` ${index + 1}. ${choice.label}${desc}${defaultMark}`);
48
47
  });
49
-
50
- const answer = await question(rl, `\n選択してください [1-${choices.length}]: `);
51
-
48
+
49
+ const answer = await question(
50
+ rl,
51
+ `\n選択してください [1-${choices.length}]: `,
52
+ );
53
+
52
54
  if (!answer && defaultValue) {
53
55
  return defaultValue;
54
56
  }
55
-
57
+
56
58
  const index = parseInt(answer, 10) - 1;
57
59
  if (index >= 0 && index < choices.length) {
58
60
  return choices[index].value;
59
61
  }
60
-
62
+
61
63
  if (defaultValue) {
62
64
  return defaultValue;
63
65
  }
64
-
66
+
65
67
  // 無効な入力の場合は再試行(最大試行回数まで)
66
68
  if (maxRetries > 0) {
67
- console.log(`⚠️ 無効な選択です。もう一度入力してください(残り試行回数: ${maxRetries})。`);
69
+ console.log(
70
+ `⚠️ 無効な選択です。もう一度入力してください(残り試行回数: ${maxRetries})。`,
71
+ );
68
72
  return select(rl, prompt, choices, defaultValue, maxRetries - 1);
69
73
  }
70
-
74
+
71
75
  // 最大試行回数に達した場合はデフォルト値または最初の選択肢を返す
72
- console.log(`⚠️ 最大試行回数に達しました。デフォルト値を使用します: ${defaultValue || choices[0].value}`);
76
+ console.log(
77
+ `⚠️ 最大試行回数に達しました。デフォルト値を使用します: ${defaultValue || choices[0].value}`,
78
+ );
73
79
  return defaultValue || choices[0].value;
74
80
  }
75
81
 
76
82
  /**
77
83
  * Yes/No質問
78
84
  */
79
- async function confirm(rl: readline.Interface, prompt: string, defaultValue: boolean = true): Promise<boolean> {
85
+ async function confirm(
86
+ rl: readline.Interface,
87
+ prompt: string,
88
+ defaultValue: boolean = true,
89
+ ): Promise<boolean> {
80
90
  const defaultText = defaultValue ? '[Y/n]' : '[y/N]';
81
91
  const answer = await question(rl, `${prompt} ${defaultText}: `);
82
-
92
+
83
93
  if (!answer) {
84
94
  return defaultValue;
85
95
  }
86
-
96
+
87
97
  return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
88
98
  }
89
99
 
@@ -94,131 +104,145 @@ async function multiSelect(
94
104
  rl: readline.Interface,
95
105
  prompt: string,
96
106
  choices: Array<{ value: string; label: string }>,
97
- defaults: string[] = []
107
+ defaults: string[] = [],
98
108
  ): Promise<string[]> {
99
109
  console.log(`\n${prompt}`);
100
110
  choices.forEach((choice, index) => {
101
111
  const checked = defaults.includes(choice.value) ? '[x]' : '[ ]';
102
112
  console.log(` ${checked} ${index + 1}. ${choice.label}`);
103
113
  });
104
-
105
- const answer = await question(rl, '\n選択してください(カンマ区切り、例: 1,2,3): ');
106
-
114
+
115
+ const answer = await question(
116
+ rl,
117
+ '\n選択してください(カンマ区切り、例: 1,2,3): ',
118
+ );
119
+
107
120
  if (!answer && defaults.length > 0) {
108
121
  return defaults;
109
122
  }
110
-
123
+
111
124
  if (!answer) {
112
125
  return [];
113
126
  }
114
-
115
- const indices = answer.split(',').map(s => parseInt(s.trim(), 10) - 1).filter(i => i >= 0 && i < choices.length);
116
- return indices.map(i => choices[i].value);
127
+
128
+ const indices = answer
129
+ .split(',')
130
+ .map((s) => parseInt(s.trim(), 10) - 1)
131
+ .filter((i) => i >= 0 && i < choices.length);
132
+ return indices.map((i) => choices[i].value);
117
133
  }
118
134
 
119
135
  /**
120
136
  * Confluence設定を対話的に取得
121
137
  */
122
- async function getConfluenceConfig(rl: readline.Interface, projectMeta: any): Promise<any> {
138
+ async function getConfluenceConfig(
139
+ rl: readline.Interface,
140
+ _projectMeta: any,
141
+ ): Promise<any> {
123
142
  console.log('\n📄 Confluence設定');
124
143
  console.log('='.repeat(60));
125
-
144
+
126
145
  const granularityChoices = [
127
146
  {
128
147
  value: 'single',
129
148
  label: 'single(1ドキュメント = 1ページ)',
130
- description: 'デフォルト・現在の動作'
149
+ description: 'デフォルト・現在の動作',
131
150
  },
132
151
  {
133
152
  value: 'by-section',
134
153
  label: 'by-section(セクションごとにページ分割)',
135
- description: '## セクションごとにページを作成'
154
+ description: '## セクションごとにページを作成',
136
155
  },
137
156
  {
138
157
  value: 'by-hierarchy',
139
158
  label: 'by-hierarchy(階層構造)',
140
- description: '親ページ + 子ページの階層構造'
159
+ description: '親ページ + 子ページの階層構造',
141
160
  },
142
161
  {
143
162
  value: 'manual',
144
163
  label: 'manual(手動指定)',
145
- description: '設定ファイルで明示的に指定'
146
- }
164
+ description: '設定ファイルで明示的に指定',
165
+ },
147
166
  ];
148
-
167
+
149
168
  const granularity = await select(
150
169
  rl,
151
170
  'ページ作成粒度を選択してください:',
152
171
  granularityChoices,
153
- 'single'
172
+ 'single',
154
173
  );
155
-
174
+
156
175
  const config: any = {
157
- pageCreationGranularity: granularity
176
+ pageCreationGranularity: granularity,
158
177
  };
159
-
178
+
160
179
  // タイトル形式のカスタマイズ
161
180
  const customTitle = await confirm(
162
181
  rl,
163
182
  'ページタイトル形式をカスタマイズしますか?',
164
- false
183
+ false,
165
184
  );
166
-
185
+
167
186
  if (customTitle) {
168
187
  const titleFormat = await question(
169
188
  rl,
170
- 'タイトル形式を入力してください(例: {projectName} - {featureName}): '
189
+ 'タイトル形式を入力してください(例: {projectName} - {featureName}): ',
171
190
  );
172
191
  if (titleFormat) {
173
192
  config.pageTitleFormat = titleFormat;
174
193
  }
175
194
  }
176
-
195
+
177
196
  // 階層構造設定
178
197
  if (granularity === 'by-hierarchy' || granularity === 'manual') {
179
198
  config.hierarchy = {};
180
-
199
+
181
200
  if (granularity === 'by-hierarchy') {
182
201
  const modeChoices = [
183
202
  {
184
203
  value: 'simple',
185
204
  label: 'simple(親ページ + ドキュメントタイプ子ページ)',
186
- description: '2階層構造'
205
+ description: '2階層構造',
187
206
  },
188
207
  {
189
208
  value: 'nested',
190
- label: 'nested(親ページ → ドキュメントタイプ親 → セクション子ページ)',
191
- description: '3階層構造'
192
- }
209
+ label:
210
+ 'nested(親ページ → ドキュメントタイプ親 → セクション子ページ)',
211
+ description: '3階層構造',
212
+ },
193
213
  ];
194
-
214
+
195
215
  const mode = await select(
196
216
  rl,
197
217
  '階層構造のモードを選択してください:',
198
218
  modeChoices,
199
- 'simple'
219
+ 'simple',
200
220
  );
201
-
221
+
202
222
  config.hierarchy.mode = mode;
203
223
  }
204
-
224
+
205
225
  const parentTitle = await question(
206
226
  rl,
207
- '親ページのタイトル形式を入力してください(例: [{projectName}] {featureName}): '
227
+ '親ページのタイトル形式を入力してください(例: [{projectName}] {featureName}): ',
208
228
  );
209
-
229
+
210
230
  if (parentTitle) {
211
231
  config.hierarchy.parentPageTitle = parentTitle;
212
232
  } else {
213
233
  config.hierarchy.parentPageTitle = '[{projectName}] {featureName}';
214
234
  }
215
-
235
+
216
236
  if (granularity === 'manual') {
217
- console.log('\n⚠️ manualモードでは、設定ファイルを手動で編集する必要があります。');
218
- console.log(' hierarchy.structure に各ドキュメントタイプのページ構造を定義してください。');
237
+ console.log(
238
+ '\n⚠️ manualモードでは、設定ファイルを手動で編集する必要があります。',
239
+ );
240
+ console.log(
241
+ ' hierarchy.structure に各ドキュメントタイプのページ構造を定義してください。',
242
+ );
219
243
  }
220
244
  }
221
-
245
+
222
246
  return config;
223
247
  }
224
248
 
@@ -228,74 +252,82 @@ async function getConfluenceConfig(rl: readline.Interface, projectMeta: any): Pr
228
252
  async function getJiraConfig(rl: readline.Interface): Promise<any> {
229
253
  console.log('\n📋 JIRA設定');
230
254
  console.log('='.repeat(60));
231
-
255
+
232
256
  const createEpic = await confirm(rl, 'Epicを作成しますか?', true);
233
-
257
+
234
258
  const granularityChoices = [
235
259
  {
236
260
  value: 'all',
237
261
  label: 'all(全Storyを作成)',
238
- description: 'デフォルト'
262
+ description: 'デフォルト',
239
263
  },
240
264
  {
241
265
  value: 'by-phase',
242
266
  label: 'by-phase(フェーズごとに作成)',
243
- description: 'Phase 0-5を個別に作成'
267
+ description: 'フェーズごとに個別に作成',
244
268
  },
245
269
  {
246
270
  value: 'selected-phases',
247
271
  label: 'selected-phases(指定フェーズのみ)',
248
- description: '選択したフェーズのみ作成'
249
- }
272
+ description: '選択したフェーズのみ作成',
273
+ },
250
274
  ];
251
-
275
+
252
276
  const granularity = await select(
253
277
  rl,
254
278
  'Story作成粒度を選択してください:',
255
279
  granularityChoices,
256
- 'all'
280
+ 'all',
257
281
  );
258
-
282
+
259
283
  const config: any = {
260
284
  createEpic,
261
- storyCreationGranularity: granularity
285
+ storyCreationGranularity: granularity,
262
286
  };
263
-
287
+
264
288
  if (granularity === 'selected-phases') {
265
289
  const phaseChoices = [
266
- { value: 'requirements', label: '要件定義(Requirements)' },
267
- { value: 'design', label: '設計(Design)' },
268
- { value: 'implementation', label: '実装(Implementation)' },
269
- { value: 'testing', label: '試験(Testing)' },
270
- { value: 'release-prep', label: 'リリース準備(Release Preparation)' },
271
- { value: 'release', label: 'リリース(Release)' }
290
+ // 新ワークフロー構造
291
+ { value: 'spec-init', label: 'Phase 0.0: プロジェクト初期化' },
292
+ { value: 'requirements', label: 'Phase 0.1: 要件定義(Requirements)' },
293
+ { value: 'design', label: 'Phase 0.2: 設計(Design)' },
294
+ { value: 'test-type-selection', label: 'Phase 0.3: テストタイプ選択' },
295
+ { value: 'test-spec', label: 'Phase 0.4: テスト仕様書作成' },
296
+ { value: 'spec-tasks', label: 'Phase 0.5: タスク分割' },
297
+ { value: 'environment-setup', label: 'Phase 1: 環境構築' },
298
+ { value: 'implementation', label: 'Phase 2: TDD実装(Implementation)' },
299
+ { value: 'phase-a', label: 'Phase A: PR前自動テスト' },
300
+ { value: 'testing', label: 'Phase 3: 追加QA(Testing)' },
301
+ { value: 'phase-b', label: 'Phase B: リリース準備テスト' },
302
+ { value: 'release-prep', label: 'Phase 4: リリース準備(Release Preparation)' },
303
+ { value: 'release', label: 'Phase 5: リリース(Release)' },
272
304
  ];
273
-
305
+
274
306
  const selectedPhases = await multiSelect(
275
307
  rl,
276
308
  '作成するフェーズを選択してください:',
277
309
  phaseChoices,
278
- ['implementation', 'testing']
310
+ ['implementation', 'testing'],
279
311
  );
280
-
312
+
281
313
  config.selectedPhases = selectedPhases;
282
314
  }
283
-
315
+
284
316
  const storyPointsChoices = [
285
317
  { value: 'auto', label: 'auto(自動抽出)', description: 'デフォルト' },
286
318
  { value: 'manual', label: 'manual(手動設定)' },
287
- { value: 'disabled', label: 'disabled(設定しない)' }
319
+ { value: 'disabled', label: 'disabled(設定しない)' },
288
320
  ];
289
-
321
+
290
322
  const storyPoints = await select(
291
323
  rl,
292
324
  'Story Points設定を選択してください:',
293
325
  storyPointsChoices,
294
- 'auto'
326
+ 'auto',
295
327
  );
296
-
328
+
297
329
  config.storyPoints = storyPoints;
298
-
330
+
299
331
  return config;
300
332
  }
301
333
 
@@ -305,62 +337,66 @@ async function getJiraConfig(rl: readline.Interface): Promise<any> {
305
337
  async function getWorkflowConfig(rl: readline.Interface): Promise<any> {
306
338
  console.log('\n⚙️ ワークフロー設定');
307
339
  console.log('='.repeat(60));
308
-
340
+
309
341
  const phaseChoices = [
310
342
  { value: 'requirements', label: '要件定義(Requirements)' },
311
343
  { value: 'design', label: '設計(Design)' },
312
- { value: 'tasks', label: 'タスク分割(Tasks)' }
344
+ { value: 'tasks', label: 'タスク分割(Tasks)' },
313
345
  ];
314
-
346
+
315
347
  const enabledPhases = await multiSelect(
316
348
  rl,
317
349
  '有効化するフェーズを選択してください:',
318
350
  phaseChoices,
319
- ['requirements', 'design', 'tasks']
351
+ ['requirements', 'design', 'tasks'],
320
352
  );
321
-
353
+
322
354
  const config: any = {
323
- enabledPhases
355
+ enabledPhases,
324
356
  };
325
-
357
+
326
358
  const customApprovalGates = await confirm(
327
359
  rl,
328
360
  '承認ゲートをカスタマイズしますか?',
329
- false
361
+ false,
330
362
  );
331
-
363
+
332
364
  if (customApprovalGates) {
333
365
  config.approvalGates = {};
334
-
366
+
335
367
  if (enabledPhases.includes('requirements')) {
336
368
  const approvers = await question(
337
369
  rl,
338
- '要件定義フェーズの承認者(カンマ区切り、例: pm,director): '
370
+ '要件定義フェーズの承認者(カンマ区切り、例: pm,director): ',
339
371
  );
340
372
  if (approvers) {
341
- config.approvalGates.requirements = approvers.split(',').map(s => s.trim());
373
+ config.approvalGates.requirements = approvers
374
+ .split(',')
375
+ .map((s) => s.trim());
342
376
  }
343
377
  }
344
-
378
+
345
379
  if (enabledPhases.includes('design')) {
346
380
  const approvers = await question(
347
381
  rl,
348
- '設計フェーズの承認者(カンマ区切り、例: architect,director): '
382
+ '設計フェーズの承認者(カンマ区切り、例: architect,director): ',
349
383
  );
350
384
  if (approvers) {
351
- config.approvalGates.design = approvers.split(',').map(s => s.trim());
385
+ config.approvalGates.design = approvers.split(',').map((s) => s.trim());
352
386
  }
353
387
  }
354
-
388
+
355
389
  const releaseApprovers = await question(
356
390
  rl,
357
- 'リリースフェーズの承認者(カンマ区切り、例: sm,director): '
391
+ 'リリースフェーズの承認者(カンマ区切り、例: sm,director): ',
358
392
  );
359
393
  if (releaseApprovers) {
360
- config.approvalGates.release = releaseApprovers.split(',').map(s => s.trim());
394
+ config.approvalGates.release = releaseApprovers
395
+ .split(',')
396
+ .map((s) => s.trim());
361
397
  }
362
398
  }
363
-
399
+
364
400
  return config;
365
401
  }
366
402
 
@@ -369,114 +405,134 @@ async function getWorkflowConfig(rl: readline.Interface): Promise<any> {
369
405
  */
370
406
  async function main(): Promise<void> {
371
407
  const rl = createInterface();
372
-
408
+
373
409
  try {
374
410
  console.log('🎨 Michi カスタマイズ設定ツール');
375
411
  console.log('='.repeat(60));
376
412
  console.log('このツールで .michi/config.json を作成・更新できます。\n');
377
-
413
+
378
414
  // プロジェクトメタデータを読み込み
379
415
  let projectMeta;
380
416
  try {
381
417
  projectMeta = loadProjectMeta();
382
- console.log(`📦 プロジェクト: ${projectMeta.projectName} (${projectMeta.projectId})\n`);
383
- } catch (error) {
418
+ console.log(
419
+ `📦 プロジェクト: ${projectMeta.projectName} (${projectMeta.projectId})\n`,
420
+ );
421
+ } catch {
384
422
  console.error('❌ プロジェクトメタデータが見つかりません。');
385
423
  console.error(' .kiro/project.json が存在するか確認してください。');
386
424
  process.exit(1);
387
425
  }
388
-
426
+
389
427
  // 既存の設定ファイルを確認
390
428
  const { getConfigPath } = await import('./utils/config-loader.js');
391
429
  const configPath = getConfigPath();
392
430
  let existingConfig: any = null;
393
-
431
+
394
432
  if (existsSync(configPath)) {
395
433
  console.log('⚠️ 既存の設定ファイルが見つかりました。');
396
434
  const overwrite = await confirm(rl, '上書きしますか?', false);
397
-
435
+
398
436
  if (!overwrite) {
399
437
  console.log('中止しました。');
400
438
  process.exit(0);
401
439
  }
402
-
440
+
403
441
  try {
404
442
  const content = readFileSync(configPath, 'utf-8');
405
443
  existingConfig = JSON.parse(content);
406
444
  console.log('既存の設定を読み込みました。\n');
407
- } catch (error) {
408
- console.log('既存の設定ファイルの読み込みに失敗しました。新規作成します。\n');
445
+ } catch {
446
+ console.log(
447
+ '既存の設定ファイルの読み込みに失敗しました。新規作成します。\n',
448
+ );
409
449
  }
410
450
  }
411
-
451
+
412
452
  // 設定を対話的に取得
413
453
  const config: any = existingConfig || {};
414
-
454
+
415
455
  // Confluence設定
416
- const configureConfluence = await confirm(rl, 'Confluence設定をカスタマイズしますか?', false);
456
+ const configureConfluence = await confirm(
457
+ rl,
458
+ 'Confluence設定をカスタマイズしますか?',
459
+ false,
460
+ );
417
461
  if (configureConfluence) {
418
462
  config.confluence = await getConfluenceConfig(rl, projectMeta);
419
463
  }
420
-
464
+
421
465
  // JIRA設定
422
- const configureJira = await confirm(rl, 'JIRA設定をカスタマイズしますか?', false);
466
+ const configureJira = await confirm(
467
+ rl,
468
+ 'JIRA設定をカスタマイズしますか?',
469
+ false,
470
+ );
423
471
  if (configureJira) {
424
472
  config.jira = await getJiraConfig(rl);
425
473
  }
426
-
474
+
427
475
  // ワークフロー設定
428
- const configureWorkflow = await confirm(rl, 'ワークフロー設定をカスタマイズしますか?', false);
476
+ const configureWorkflow = await confirm(
477
+ rl,
478
+ 'ワークフロー設定をカスタマイズしますか?',
479
+ false,
480
+ );
429
481
  if (configureWorkflow) {
430
482
  config.workflow = await getWorkflowConfig(rl);
431
483
  }
432
-
484
+
433
485
  // 設定の確認
434
486
  console.log('\n📋 設定内容の確認');
435
487
  console.log('='.repeat(60));
436
488
  console.log(JSON.stringify(config, null, 2));
437
489
  console.log('');
438
-
490
+
439
491
  const confirmSave = await confirm(rl, 'この設定を保存しますか?', true);
440
-
492
+
441
493
  if (!confirmSave) {
442
494
  console.log('保存をキャンセルしました。');
443
495
  process.exit(0);
444
496
  }
445
-
497
+
446
498
  // 設定ファイルを保存
447
499
  writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
448
500
  console.log(`\n✅ 設定ファイルを保存しました: ${configPath}`);
449
-
501
+
450
502
  // バリデーション
451
503
  console.log('\n🔍 設定ファイルのバリデーション...');
452
504
  const validation = validateProjectConfig();
453
-
505
+
454
506
  if (validation.info.length > 0) {
455
507
  console.log('ℹ️ Info:');
456
- validation.info.forEach(msg => console.log(` - ${msg}`));
508
+ validation.info.forEach((msg) => console.log(` - ${msg}`));
457
509
  }
458
-
510
+
459
511
  if (validation.warnings.length > 0) {
460
512
  console.log('⚠️ Warnings:');
461
- validation.warnings.forEach(warning => console.log(` - ${warning}`));
513
+ validation.warnings.forEach((warning) => console.log(` - ${warning}`));
462
514
  }
463
-
515
+
464
516
  if (validation.errors.length > 0) {
465
517
  console.error('❌ Validation errors:');
466
- validation.errors.forEach(error => console.error(` - ${error}`));
467
- console.error('\n設定ファイルにエラーがあります。手動で修正してください。');
518
+ validation.errors.forEach((error) => console.error(` - ${error}`));
519
+ console.error(
520
+ '\n設定ファイルにエラーがあります。手動で修正してください。',
521
+ );
468
522
  process.exit(1);
469
523
  }
470
-
524
+
471
525
  if (validation.valid) {
472
526
  console.log('✅ 設定ファイルは有効です。');
473
527
  }
474
-
528
+
475
529
  console.log('\n🎉 設定が完了しました!');
476
530
  console.log(' 次回のConfluence/JIRA同期時に、この設定が適用されます。');
477
-
478
531
  } catch (error) {
479
- console.error('❌ エラーが発生しました:', error instanceof Error ? error.message : error);
532
+ console.error(
533
+ '❌ エラーが発生しました:',
534
+ error instanceof Error ? error.message : error,
535
+ );
480
536
  process.exit(1);
481
537
  } finally {
482
538
  rl.close();
@@ -485,11 +541,10 @@ async function main(): Promise<void> {
485
541
 
486
542
  // CLI実行
487
543
  if (import.meta.url === `file://${process.argv[1]}`) {
488
- main().catch(error => {
544
+ main().catch((error) => {
489
545
  console.error('❌ 予期しないエラー:', error);
490
546
  process.exit(1);
491
547
  });
492
548
  }
493
549
 
494
550
  export { main as configInteractive };
495
-
@@ -443,18 +443,6 @@ async function syncToConfluence(
443
443
  return firstPageUrl;
444
444
  }
445
445
 
446
- /**
447
- * ドキュメントタイプのラベルを取得
448
- */
449
- function getDocTypeLabel(docType: string): string {
450
- const labels: Record<string, string> = {
451
- requirements: '要件定義',
452
- design: '設計',
453
- tasks: 'タスク分割'
454
- };
455
- return labels[docType] || docType;
456
- }
457
-
458
446
  // CLI実行
459
447
  if (import.meta.url === `file://${process.argv[1]}`) {
460
448
  const args = process.argv.slice(2);