@sk8metal/michi-cli 0.0.9 → 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 (371) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +235 -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 +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.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 +153 -5
  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/cursor.test.js +23 -19
  222. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -1
  223. package/dist/src/__tests__/integration/setup/validation.test.js +41 -58
  224. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -1
  225. package/dist/src/cli.d.ts.map +1 -1
  226. package/dist/src/cli.js +208 -18
  227. package/dist/src/cli.js.map +1 -1
  228. package/dist/src/commands/setup-existing.d.ts +3 -0
  229. package/dist/src/commands/setup-existing.d.ts.map +1 -1
  230. package/dist/src/commands/setup-existing.js +334 -47
  231. package/dist/src/commands/setup-existing.js.map +1 -1
  232. package/docs/README.md +3 -1
  233. package/docs/context.md +59 -0
  234. package/docs/design-issue-55.md +240 -0
  235. package/docs/design-issue-56.md +181 -0
  236. package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
  237. package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
  238. package/docs/plan.md +275 -0
  239. package/docs/user-guide/getting-started/github-token-setup.md +509 -0
  240. package/docs/{getting-started → user-guide/getting-started}/quick-start.md +16 -0
  241. package/docs/{getting-started → user-guide/getting-started}/setup.md +28 -1
  242. package/docs/user-guide/guides/internationalization.md +540 -0
  243. package/docs/{guides → user-guide/guides}/multi-project.md +1 -1
  244. package/docs/{guides → user-guide/guides}/phase-automation.md +67 -9
  245. package/docs/user-guide/guides/workflow.md +582 -0
  246. package/docs/user-guide/hands-on/README.md +142 -0
  247. package/docs/user-guide/hands-on/claude-agent-setup.md +455 -0
  248. package/docs/user-guide/hands-on/claude-setup.md +398 -0
  249. package/docs/user-guide/hands-on/cursor-setup.md +352 -0
  250. package/docs/user-guide/hands-on/troubleshooting.md +964 -0
  251. package/docs/user-guide/hands-on/verification-checklist.md +438 -0
  252. package/docs/user-guide/hands-on/workflow-walkthrough.md +906 -0
  253. package/docs/user-guide/reference/config.md +564 -0
  254. package/docs/{reference → user-guide/reference}/quick-reference.md +53 -40
  255. package/docs/user-guide/release/ci-setup.md +541 -0
  256. package/docs/user-guide/release/release-flow.md +476 -0
  257. package/docs/user-guide/templates/test-specs/README.md +173 -0
  258. package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
  259. package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
  260. package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
  261. package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
  262. package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
  263. package/docs/{testing → user-guide/testing}/integration-tests.md +24 -9
  264. package/docs/user-guide/testing/tdd-cycle.md +349 -0
  265. package/docs/user-guide/testing/test-execution-flow.md +396 -0
  266. package/docs/user-guide/testing/test-failure-handling.md +521 -0
  267. package/docs/user-guide/testing/test-planning-flow.md +181 -0
  268. package/docs/user-guide/testing-strategy.md +185 -0
  269. package/docs/verification-guide.md +518 -0
  270. package/package.json +7 -2
  271. package/scripts/__tests__/create-project.test.ts +67 -49
  272. package/scripts/__tests__/jira-transitions.test.ts +225 -0
  273. package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
  274. package/scripts/__tests__/setup-existing-project.test.ts +98 -1
  275. package/scripts/__tests__/setup-interactive.test.ts +52 -46
  276. package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
  277. package/scripts/__tests__/spec-loader.test.ts +199 -0
  278. package/scripts/__tests__/validate-phase.test.ts +78 -54
  279. package/scripts/config/config-schema.ts +89 -50
  280. package/scripts/config-interactive.ts +191 -136
  281. package/scripts/confluence-sync.ts +0 -12
  282. package/scripts/constants/__tests__/environments.test.ts +42 -6
  283. package/scripts/constants/environments.ts +33 -13
  284. package/scripts/constants/test-commands.ts +96 -0
  285. package/scripts/jira-sync.ts +767 -232
  286. package/scripts/markdown-to-confluence.ts +1 -1
  287. package/scripts/phase-runner.ts +1056 -63
  288. package/scripts/pr-automation.ts +0 -1
  289. package/scripts/pre-flight-check.ts +1 -1
  290. package/scripts/pre-publish-check.sh +311 -0
  291. package/scripts/quick-verify.sh +115 -0
  292. package/scripts/setup-existing-project.ts +201 -117
  293. package/scripts/setup-interactive.ts +4 -4
  294. package/scripts/spec-impl-workflow.ts +505 -0
  295. package/scripts/template/__tests__/renderer.test.ts +1 -2
  296. package/scripts/test-execution-generator.ts +695 -0
  297. package/scripts/test-interactive.ts +779 -0
  298. package/scripts/test-new-features.ts +168 -0
  299. package/scripts/test-npm-package.sh +345 -0
  300. package/scripts/test-spec-generator.ts +574 -0
  301. package/scripts/test-workflow-stages.ts +53 -0
  302. package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
  303. package/scripts/utils/__tests__/business-days.test.ts +214 -0
  304. package/scripts/utils/__tests__/config-loader.test.ts +1 -1
  305. package/scripts/utils/__tests__/config-validator.test.ts +309 -88
  306. package/scripts/utils/__tests__/env-config.test.ts +259 -0
  307. package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
  308. package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
  309. package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
  310. package/scripts/utils/__tests__/test-runner.test.ts +77 -0
  311. package/scripts/utils/aidlc-parser.ts +289 -0
  312. package/scripts/utils/business-days.ts +115 -0
  313. package/scripts/utils/ci-generator.ts +84 -0
  314. package/scripts/utils/config-loader.ts +2 -2
  315. package/scripts/utils/config-validator.ts +304 -117
  316. package/scripts/utils/confluence-approval.ts +167 -0
  317. package/scripts/utils/confluence-hierarchy.ts +2 -4
  318. package/scripts/utils/docker-generator.ts +151 -0
  319. package/scripts/utils/docker-requirement-detector.ts +153 -0
  320. package/scripts/utils/env-config.ts +526 -0
  321. package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
  322. package/scripts/utils/language-detector.ts +139 -0
  323. package/scripts/utils/markdown-parser.ts +376 -0
  324. package/scripts/utils/project-detector.ts +192 -0
  325. package/scripts/utils/project-finder.ts +2 -2
  326. package/scripts/utils/release-notes-generator.ts +210 -0
  327. package/scripts/utils/spec-loader.ts +125 -0
  328. package/scripts/utils/spec-updater.ts +8 -1
  329. package/scripts/utils/tasks-converter.ts +601 -0
  330. package/scripts/utils/tasks-format-validator.ts +193 -0
  331. package/scripts/utils/template-applier.ts +202 -0
  332. package/scripts/utils/test-config-generator.ts +210 -0
  333. package/scripts/utils/test-runner.ts +133 -0
  334. package/scripts/validate-phase.ts +186 -9
  335. package/scripts/workflow-orchestrator.ts +130 -12
  336. package/templates/ci/github-actions/java.yml +54 -0
  337. package/templates/ci/github-actions/nodejs.yml +46 -0
  338. package/templates/ci/github-actions/php.yml +52 -0
  339. package/templates/ci/screwdriver/java.yaml +17 -0
  340. package/templates/ci/screwdriver/nodejs.yaml +17 -0
  341. package/templates/ci/screwdriver/php.yaml +20 -0
  342. package/templates/claude/commands/kiro/kiro-spec-impl.md +244 -0
  343. package/templates/claude/commands/kiro/kiro-spec-tasks.md +354 -0
  344. package/templates/claude-agent/README.md +7 -1
  345. package/templates/claude-agent/agents/.gitkeep +0 -0
  346. package/templates/claude-agent/agents/designer.md +79 -0
  347. package/templates/claude-agent/agents/developer.md +68 -0
  348. package/templates/claude-agent/agents/manager-agent.md +59 -0
  349. package/templates/claude-agent/agents/tester.md +101 -0
  350. package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
  351. package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
  352. package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
  353. package/templates/cline/rules/atlassian-integration.md +36 -0
  354. package/templates/cline/rules/michi-core.md +56 -0
  355. package/templates/codex/AGENTS.override.md +277 -0
  356. package/templates/codex/prompts/confluence-sync.md +177 -0
  357. package/templates/codex/rules/README.md +210 -0
  358. package/templates/common/.kiro/project.json.template +21 -0
  359. package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
  360. package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
  361. package/templates/gemini/commands/README.md +41 -0
  362. package/templates/gemini/rules/GEMINI.md +80 -0
  363. package/docs/guides/workflow.md +0 -342
  364. package/docs/reference/config.md +0 -545
  365. package/scripts/setup-existing.sh +0 -279
  366. /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
  367. /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
  368. /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
  369. /package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +0 -0
  370. /package/docs/{guides → user-guide/guides}/customization.md +0 -0
  371. /package/docs/{reference → user-guide/reference}/tasks-template.md +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env tsx
2
2
  /**
3
3
  * 既存プロジェクトにMichiワークフローを追加するスクリプト
4
- *
4
+ *
5
5
  * 使い方:
6
6
  * cd /path/to/existing-repo
7
7
  * npx tsx /path/to/michi/scripts/setup-existing-project.ts \
@@ -12,46 +12,50 @@
12
12
  * --lang ja
13
13
  */
14
14
 
15
- import { cpSync, existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync } from 'fs';
15
+ import {
16
+ cpSync,
17
+ existsSync,
18
+ mkdirSync,
19
+ writeFileSync,
20
+ readFileSync,
21
+ readdirSync,
22
+ } from 'fs';
16
23
  import { resolve, join, basename, dirname } from 'path';
17
24
  import { fileURLToPath } from 'url';
18
25
  import { execSync } from 'child_process';
19
26
  import { findRepositoryRoot } from './utils/project-finder.js';
20
- import {
21
- type Environment,
22
- getEnvironmentConfig,
23
- isSupportedEnvironment
27
+ import {
28
+ type Environment,
29
+ getEnvironmentConfig,
30
+ isSupportedEnvironment,
24
31
  } from './constants/environments.js';
25
- import {
26
- type SupportedLanguage,
27
- isSupportedLanguage
32
+ import {
33
+ type SupportedLanguage,
34
+ isSupportedLanguage,
28
35
  } from './constants/languages.js';
29
- import {
30
- createTemplateContext,
31
- renderTemplate
32
- } from './template/renderer.js';
36
+ import { createTemplateContext, renderTemplate } from './template/renderer.js';
33
37
 
34
38
  // ES module で __dirname を取得
35
39
  const __filename = fileURLToPath(import.meta.url);
36
40
  const __dirname = dirname(__filename);
37
41
 
38
42
  interface SetupConfig {
39
- michiPath: string; // Michiリポジトリのパス
40
- projectName: string; // プロジェクト表示名
41
- jiraKey: string; // JIRAプロジェクトキー
42
- labels?: string[]; // Confluenceラベル(オプション)
43
- environment: Environment; // cc-sdd環境: 'claude' | 'claude-agent' | 'cursor'
44
- langCode: SupportedLanguage; // 言語コード: 'ja'
43
+ michiPath: string; // Michiリポジトリのパス
44
+ projectName: string; // プロジェクト表示名
45
+ jiraKey: string; // JIRAプロジェクトキー
46
+ labels?: string[]; // Confluenceラベル(オプション)
47
+ environment: Environment; // cc-sdd環境: 'claude' | 'claude-agent' | 'cursor'
48
+ langCode: SupportedLanguage; // 言語コード: 'ja'
45
49
  }
46
50
 
47
51
  function parseArgs(): SetupConfig {
48
52
  const args = process.argv.slice(2);
49
53
  const config: Partial<SetupConfig> = {};
50
-
54
+
51
55
  for (let i = 0; i < args.length; i += 2) {
52
56
  const key = args[i].replace(/^--/, '');
53
57
  const value = args[i + 1];
54
-
58
+
55
59
  switch (key) {
56
60
  case 'michi-path':
57
61
  config.michiPath = value;
@@ -70,7 +74,7 @@ function parseArgs(): SetupConfig {
70
74
  break;
71
75
  }
72
76
  }
73
-
77
+
74
78
  // デフォルト値
75
79
  if (!config.michiPath) {
76
80
  config.michiPath = resolve(__dirname, '..');
@@ -81,34 +85,38 @@ function parseArgs(): SetupConfig {
81
85
  if (!config.langCode) {
82
86
  config.langCode = 'ja';
83
87
  }
84
-
88
+
85
89
  // 必須フィールドチェック
86
90
  if (!config.projectName || !config.jiraKey) {
87
91
  console.error('Missing required parameters');
88
- console.error('Usage: tsx setup-existing-project.ts --project-name <name> --jira-key <key> [--michi-path <path>] [--environment <env>] [--lang <code>]');
92
+ console.error(
93
+ 'Usage: tsx setup-existing-project.ts --project-name <name> --jira-key <key> [--michi-path <path>] [--environment <env>] [--lang <code>]',
94
+ );
89
95
  process.exit(1);
90
96
  }
91
-
97
+
92
98
  // 環境バリデーション
93
99
  if (!isSupportedEnvironment(config.environment)) {
94
100
  console.error(`Unsupported environment: ${config.environment}`);
95
101
  console.error('Supported environments: claude, claude-agent, cursor');
96
102
  process.exit(1);
97
103
  }
98
-
104
+
99
105
  // 言語バリデーション
100
106
  if (!isSupportedLanguage(config.langCode)) {
101
107
  console.error(`Unsupported language: ${config.langCode}`);
102
- console.error('Supported languages: ja, en, zh-TW, zh, es, pt, de, fr, ru, it, ko, ar');
108
+ console.error(
109
+ 'Supported languages: ja, en, zh-TW, zh, es, pt, de, fr, ru, it, ko, ar',
110
+ );
103
111
  process.exit(1);
104
112
  }
105
-
113
+
106
114
  return config as SetupConfig;
107
115
  }
108
116
 
109
117
  /**
110
118
  * Copy and render templates recursively
111
- *
119
+ *
112
120
  * @param sourceDir - Source directory containing templates
113
121
  * @param destDir - Destination directory for rendered files
114
122
  * @param context - Template context for rendering
@@ -116,14 +124,14 @@ function parseArgs(): SetupConfig {
116
124
  function copyAndRenderTemplates(
117
125
  sourceDir: string,
118
126
  destDir: string,
119
- context: ReturnType<typeof createTemplateContext>
127
+ context: ReturnType<typeof createTemplateContext>,
120
128
  ): void {
121
129
  const entries = readdirSync(sourceDir, { withFileTypes: true });
122
-
130
+
123
131
  for (const entry of entries) {
124
132
  const sourcePath = join(sourceDir, entry.name);
125
133
  const destPath = join(destDir, entry.name);
126
-
134
+
127
135
  if (entry.isDirectory()) {
128
136
  // ディレクトリは再帰的にコピー
129
137
  mkdirSync(destPath, { recursive: true });
@@ -140,7 +148,7 @@ function copyAndRenderTemplates(
140
148
  async function setupExistingProject(config: SetupConfig): Promise<void> {
141
149
  const currentDir = process.cwd();
142
150
  const projectId = basename(currentDir);
143
-
151
+
144
152
  console.log('🚀 既存プロジェクトにMichiワークフローを追加');
145
153
  console.log(` プロジェクト: ${config.projectName}`);
146
154
  console.log(` ディレクトリ: ${currentDir}`);
@@ -148,18 +156,18 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
148
156
  console.log(` 環境: ${config.environment}`);
149
157
  console.log(` 言語: ${config.langCode}`);
150
158
  console.log('');
151
-
159
+
152
160
  // リポジトリルートを検出
153
161
  const repoRoot = findRepositoryRoot(currentDir);
154
-
162
+
155
163
  // projects/{project-id}/配下にプロジェクトを作成
156
164
  const projectsDir = join(repoRoot, 'projects');
157
165
  const projectDir = join(projectsDir, projectId);
158
-
166
+
159
167
  console.log(`📁 リポジトリルート: ${repoRoot}`);
160
168
  console.log(`📁 プロジェクトディレクトリ: ${projectDir}`);
161
169
  console.log('');
162
-
170
+
163
171
  // projects/ディレクトリとプロジェクトディレクトリを作成
164
172
  if (!existsSync(projectsDir)) {
165
173
  mkdirSync(projectsDir, { recursive: true });
@@ -169,24 +177,26 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
169
177
  mkdirSync(projectDir, { recursive: true });
170
178
  console.log(` ✅ Created: ${projectDir}`);
171
179
  }
172
-
180
+
173
181
  // 元の作業ディレクトリを保存
174
182
  const originalCwd = process.cwd();
175
-
183
+
176
184
  try {
177
185
  // プロジェクトディレクトリに移動
178
186
  process.chdir(projectDir);
179
-
187
+
180
188
  // Step 1: cc-sdd導入確認
181
189
  console.log('\n📦 Step 1: Checking cc-sdd installation...');
182
190
  if (!existsSync('.cursor/commands/kiro')) {
183
191
  console.log(' Installing cc-sdd...');
184
- execSync('npx cc-sdd@latest --cursor --lang ja --yes', { stdio: 'inherit' });
192
+ execSync('npx cc-sdd@latest --cursor --lang ja --yes', {
193
+ stdio: 'inherit',
194
+ });
185
195
  console.log(' ✅ cc-sdd installed');
186
196
  } else {
187
197
  console.log(' ✅ cc-sdd already installed');
188
198
  }
189
-
199
+
190
200
  // Step 2: .kiro ディレクトリ作成
191
201
  console.log('\n📁 Step 2: Creating .kiro directory structure...');
192
202
  mkdirSync('.kiro/settings/templates', { recursive: true });
@@ -196,39 +206,48 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
196
206
 
197
207
  // Step 3: プロジェクトメタデータ作成
198
208
  console.log('\n📝 Step 3: Creating project metadata...');
199
-
209
+
200
210
  // GitHub URLを取得(既存リポジトリから)
201
211
  let repoUrl = '';
202
212
  try {
203
- repoUrl = execSync('git config --get remote.origin.url', { encoding: 'utf-8', cwd: repoRoot }).trim();
213
+ repoUrl = execSync('git config --get remote.origin.url', {
214
+ encoding: 'utf-8',
215
+ cwd: repoRoot,
216
+ }).trim();
204
217
  // SSH形式をHTTPS形式に変換
205
218
  if (repoUrl.startsWith('git@github.com:')) {
206
- repoUrl = repoUrl.replace('git@github.com:', 'https://github.com/').replace('.git', '');
219
+ repoUrl = repoUrl
220
+ .replace('git@github.com:', 'https://github.com/')
221
+ .replace('.git', '');
207
222
  }
208
223
  } catch {
209
224
  repoUrl = `https://github.com/org/${projectId}`;
210
225
  }
211
-
212
- const labels = config.labels || (() => {
213
- // プロジェクトIDからプロジェクトラベル生成
214
- const projectLabel = projectId.toLowerCase().replace(/[^a-z0-9-]/g, '');
215
- const labelSet = new Set([`project:${projectLabel}`]);
216
-
217
- // ハイフンが存在する場合のみサービスラベルを生成
218
- if (projectId.includes('-')) {
219
- const parts = projectId.split('-');
220
- const servicePart = parts[parts.length - 1];
221
- const serviceLabel = servicePart.toLowerCase().replace(/[^a-z0-9-]/g, '');
222
-
223
- // サービスラベルがプロジェクトラベルと異なる場合のみ追加
224
- if (serviceLabel !== projectLabel) {
225
- labelSet.add(`service:${serviceLabel}`);
226
+
227
+ const labels =
228
+ config.labels ||
229
+ (() => {
230
+ // プロジェクトIDからプロジェクトラベル生成
231
+ const projectLabel = projectId.toLowerCase().replace(/[^a-z0-9-]/g, '');
232
+ const labelSet = new Set([`project:${projectLabel}`]);
233
+
234
+ // ハイフンが存在する場合のみサービスラベルを生成
235
+ if (projectId.includes('-')) {
236
+ const parts = projectId.split('-');
237
+ const servicePart = parts[parts.length - 1];
238
+ const serviceLabel = servicePart
239
+ .toLowerCase()
240
+ .replace(/[^a-z0-9-]/g, '');
241
+
242
+ // サービスラベルがプロジェクトラベルと異なる場合のみ追加
243
+ if (serviceLabel !== projectLabel) {
244
+ labelSet.add(`service:${serviceLabel}`);
245
+ }
226
246
  }
227
- }
228
-
229
- return Array.from(labelSet);
230
- })();
231
-
247
+
248
+ return Array.from(labelSet);
249
+ })();
250
+
232
251
  const projectJson = {
233
252
  projectId,
234
253
  projectName: config.projectName,
@@ -239,89 +258,141 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
239
258
  team: [],
240
259
  stakeholders: ['@企画', '@部長'],
241
260
  repository: repoUrl,
242
- description: `${config.projectName}の開発`
261
+ description: `${config.projectName}の開発`,
243
262
  };
244
-
263
+
245
264
  writeFileSync('.kiro/project.json', JSON.stringify(projectJson, null, 2));
246
265
  console.log(' ✅ project.json created');
247
-
266
+
248
267
  // Step 4: 環境別テンプレートのコピーとレンダリング
249
268
  console.log('\n📋 Step 4: Copying and rendering templates from Michi...');
250
-
269
+
251
270
  const envConfig = getEnvironmentConfig(config.environment);
252
271
  const templateContext = createTemplateContext(
253
272
  config.langCode,
254
273
  '.kiro',
255
- envConfig.rulesDir.startsWith('.') ? envConfig.rulesDir.substring(1, envConfig.rulesDir.indexOf('/', 1)) : envConfig.rulesDir.split('/')[0]
274
+ envConfig.rulesDir.startsWith('.')
275
+ ? envConfig.rulesDir.substring(1, envConfig.rulesDir.indexOf('/', 1))
276
+ : envConfig.rulesDir.split('/')[0],
256
277
  );
257
-
278
+
258
279
  // テンプレートソースディレクトリ
259
- const templateSourceDir = join(config.michiPath, 'templates', envConfig.templateSource);
260
-
280
+ const templateSourceDir = join(
281
+ config.michiPath,
282
+ 'templates',
283
+ envConfig.templateSource,
284
+ );
285
+
261
286
  if (!existsSync(templateSourceDir)) {
262
287
  console.log(` ⚠️ Template source not found: ${templateSourceDir}`);
263
288
  console.log(' Skipping template copy');
264
289
  } else {
265
- // rulesディレクトリのコピーとレンダリング
266
- const rulesTemplateDir = join(templateSourceDir, 'rules');
290
+ // rulesディレクトリのコピーとレンダリング(環境別にテンプレートディレクトリ名が異なる)
291
+ // cursor/claude: 'rules', claude-agent: 'agents'
292
+ const templateDirName =
293
+ config.environment === 'claude-agent' ? 'agents' : 'rules';
294
+ const rulesTemplateDir = join(templateSourceDir, templateDirName);
267
295
  const rulesDestDir = join(projectDir, envConfig.rulesDir);
268
-
296
+
269
297
  if (existsSync(rulesTemplateDir)) {
270
298
  mkdirSync(rulesDestDir, { recursive: true });
271
299
  copyAndRenderTemplates(rulesTemplateDir, rulesDestDir, templateContext);
272
300
  console.log(` ✅ Rules copied and rendered to ${envConfig.rulesDir}`);
273
301
  }
274
-
302
+
275
303
  // commandsディレクトリのコピーとレンダリング
276
304
  const commandsTemplateDir = join(templateSourceDir, 'commands');
277
305
  const commandsDestDir = join(projectDir, envConfig.commandsDir);
278
-
306
+
279
307
  if (existsSync(commandsTemplateDir)) {
280
308
  mkdirSync(commandsDestDir, { recursive: true });
281
- copyAndRenderTemplates(commandsTemplateDir, commandsDestDir, templateContext);
282
- console.log(` ✅ Commands copied and rendered to ${envConfig.commandsDir}`);
309
+ copyAndRenderTemplates(
310
+ commandsTemplateDir,
311
+ commandsDestDir,
312
+ templateContext,
313
+ );
314
+ console.log(
315
+ ` ✅ Commands copied and rendered to ${envConfig.commandsDir}`,
316
+ );
283
317
  }
284
318
  }
285
-
319
+
286
320
  // Step 5: Steeringテンプレートをコピー
287
321
  console.log('\n📚 Step 5: Copying steering templates...');
288
-
322
+
289
323
  const steeringDir = join(config.michiPath, '.kiro/steering');
290
324
  if (existsSync(steeringDir)) {
291
- cpSync(steeringDir, join(projectDir, '.kiro/steering'), { recursive: true });
325
+ cpSync(steeringDir, join(projectDir, '.kiro/steering'), {
326
+ recursive: true,
327
+ });
292
328
  console.log(' ✅ product.md, tech.md, structure.md');
293
329
  }
294
-
330
+
295
331
  // Step 6: テンプレートをコピー
296
332
  console.log('\n📄 Step 6: Copying spec templates...');
297
-
333
+
298
334
  const templatesDir = join(config.michiPath, '.kiro/settings/templates');
299
335
  if (existsSync(templatesDir)) {
300
- cpSync(templatesDir, join(projectDir, '.kiro/settings/templates'), { recursive: true });
336
+ cpSync(templatesDir, join(projectDir, '.kiro/settings/templates'), {
337
+ recursive: true,
338
+ });
301
339
  console.log(' ✅ requirements.md, design.md, tasks.md');
302
340
  }
303
-
341
+
342
+ // Step 6.1: kiro-spec-tasksテンプレートを上書き(cc-sddのAI-DLC形式をMichiワークフロー形式に置換)
343
+ console.log('\n📋 Step 6.1: Overriding kiro-spec-tasks template...');
344
+ const kiroSpecTasksSource = join(
345
+ config.michiPath,
346
+ 'templates',
347
+ envConfig.templateSource,
348
+ 'commands',
349
+ 'kiro',
350
+ 'kiro-spec-tasks.md',
351
+ );
352
+ const kiroSpecTasksDest = join(projectDir, '.kiro', 'commands', 'kiro');
353
+
354
+ if (existsSync(kiroSpecTasksSource)) {
355
+ mkdirSync(kiroSpecTasksDest, { recursive: true });
356
+ cpSync(
357
+ kiroSpecTasksSource,
358
+ join(kiroSpecTasksDest, 'kiro-spec-tasks.md'),
359
+ );
360
+ console.log(
361
+ ' ✅ kiro-spec-tasks.md overridden with Michi workflow format',
362
+ );
363
+ console.log(
364
+ ' (This ensures /kiro:spec-tasks generates Phase-based tasks.md)',
365
+ );
366
+ } else {
367
+ console.log(
368
+ ` ⚠️ kiro-spec-tasks template not found: ${kiroSpecTasksSource}`,
369
+ );
370
+ console.log(' (cc-sdd default template will be used)');
371
+ }
372
+
304
373
  // Step 7: CLIツールのセットアップ案内
305
374
  console.log('\n⚙️ Step 7: Setting up Michi CLI...');
306
375
  console.log(' ✅ Michi CLI setup complete!');
307
376
  console.log('');
308
377
  console.log(' 📋 使用方法:');
309
378
  console.log(' npx @sk8metal/michi-cli jira:sync <feature>');
310
- console.log(' npx @sk8metal/michi-cli confluence:sync <feature> requirements');
379
+ console.log(
380
+ ' npx @sk8metal/michi-cli confluence:sync <feature> requirements',
381
+ );
311
382
  console.log(' npx @sk8metal/michi-cli phase:run <feature> tasks');
312
383
  console.log('');
313
384
  console.log(' または、グローバルインストール:');
314
385
  console.log(' npm install -g @sk8metal/michi-cli');
315
386
  console.log(' michi jira:sync <feature>');
316
-
387
+
317
388
  // Step 8: package.json と tsconfig.json をリポジトリルートにコピー
318
389
  console.log('\n📦 Step 8: Setting up package.json and TypeScript...');
319
-
390
+
320
391
  // 既存の package.json があるかチェック(リポジトリルート)
321
392
  const hasPackageJson = existsSync(join(repoRoot, 'package.json'));
322
-
393
+
323
394
  if (!hasPackageJson) {
324
- // package.json がない場合はリポジトリルートにコピー
395
+ // package.json がない場合はリポジトリルートにコピー
325
396
  const src = join(config.michiPath, 'package.json');
326
397
  const dest = join(repoRoot, 'package.json');
327
398
  if (existsSync(src)) {
@@ -329,23 +400,33 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
329
400
  console.log(' ✅ package.json created (in repository root)');
330
401
  }
331
402
  } else {
332
- // 既存の package.json にスクリプトを追加
403
+ // 既存の package.json にスクリプトを追加
333
404
  console.log(' ℹ️ Existing package.json found');
334
405
  console.log(' 📝 手動で以下のスクリプトを追加してください:');
335
406
  console.log('');
336
407
  console.log(' "scripts": {');
337
408
  console.log(' "jira:sync": "npx @sk8metal/michi-cli jira:sync",');
338
- console.log(' "confluence:sync": "npx @sk8metal/michi-cli confluence:sync",');
409
+ console.log(
410
+ ' "confluence:sync": "npx @sk8metal/michi-cli confluence:sync",',
411
+ );
339
412
  console.log(' "phase:run": "npx @sk8metal/michi-cli phase:run",');
340
- console.log(' "validate:phase": "npx @sk8metal/michi-cli validate:phase",');
413
+ console.log(
414
+ ' "validate:phase": "npx @sk8metal/michi-cli validate:phase",',
415
+ );
341
416
  console.log(' "preflight": "npx @sk8metal/michi-cli preflight",');
342
- console.log(' "project:list": "npx @sk8metal/michi-cli project:list",');
343
- console.log(' "project:dashboard": "npx @sk8metal/michi-cli project:dashboard",');
344
- console.log(' "workflow:run": "npx @sk8metal/michi-cli workflow:run"');
417
+ console.log(
418
+ ' "project:list": "npx @sk8metal/michi-cli project:list",',
419
+ );
420
+ console.log(
421
+ ' "project:dashboard": "npx @sk8metal/michi-cli project:dashboard",',
422
+ );
423
+ console.log(
424
+ ' "workflow:run": "npx @sk8metal/michi-cli workflow:run"',
425
+ );
345
426
  console.log(' }');
346
427
  console.log('');
347
428
  }
348
-
429
+
349
430
  // tsconfig.json をリポジトリルートにコピー
350
431
  if (!existsSync(join(repoRoot, 'tsconfig.json'))) {
351
432
  const src = join(config.michiPath, 'tsconfig.json');
@@ -357,10 +438,10 @@ async function setupExistingProject(config: SetupConfig): Promise<void> {
357
438
  } else {
358
439
  console.log(' ℹ️ Existing tsconfig.json found (kept)');
359
440
  }
360
-
441
+
361
442
  // Step 9: .env テンプレート作成(プロジェクトディレクトリに)
362
443
  console.log('\n🔐 Step 9: Creating .env template...');
363
-
444
+
364
445
  const envTemplate = `# Atlassian設定(MCP + REST API共通)
365
446
  ATLASSIAN_URL=https://your-domain.atlassian.net
366
447
  ATLASSIAN_EMAIL=your-email@company.com
@@ -379,21 +460,21 @@ CONFLUENCE_RELEASE_SPACE=RELEASE
379
460
  # JIRAプロジェクトキー
380
461
  JIRA_PROJECT_KEYS=${config.jiraKey}
381
462
  `;
382
-
463
+
383
464
  if (!existsSync(join(projectDir, '.env'))) {
384
465
  writeFileSync(join(projectDir, '.env'), envTemplate);
385
466
  console.log(' ✅ .env template created');
386
467
  } else {
387
468
  console.log(' ℹ️ .env already exists (kept)');
388
469
  }
389
-
470
+
390
471
  // Step 10: README.md を更新(オプション、プロジェクトディレクトリに)
391
472
  console.log('\n📖 Step 10: Updating documentation...');
392
-
473
+
393
474
  const readmePath = join(projectDir, 'README.md');
394
475
  if (existsSync(readmePath)) {
395
476
  const currentReadme = readFileSync(readmePath, 'utf-8');
396
-
477
+
397
478
  // Michiワークフロー情報を追加
398
479
  const workflowSection = `
399
480
 
@@ -421,7 +502,7 @@ npm run github:create-pr <branch> # PR作成
421
502
 
422
503
  詳細: [Michi Documentation](https://github.com/sk8metalme/michi)
423
504
  `;
424
-
505
+
425
506
  if (!currentReadme.includes('AI開発ワークフロー')) {
426
507
  writeFileSync(readmePath, currentReadme + workflowSection);
427
508
  console.log(' ✅ README.md updated');
@@ -429,25 +510,25 @@ npm run github:create-pr <branch> # PR作成
429
510
  console.log(' ℹ️ README.md already has workflow section');
430
511
  }
431
512
  }
432
-
513
+
433
514
  // Step 11: .gitignore 更新(リポジトリルートに)
434
515
  console.log('\n🚫 Step 11: Updating .gitignore...');
435
-
516
+
436
517
  const gitignoreEntries = [
437
518
  '# AI Development Workflow',
438
519
  'node_modules/',
439
520
  '.env',
440
521
  '.env.local',
441
522
  'dist/',
442
- '*.log'
523
+ '*.log',
443
524
  ];
444
-
525
+
445
526
  const gitignorePath = join(repoRoot, '.gitignore');
446
527
  let gitignore = '';
447
528
  if (existsSync(gitignorePath)) {
448
529
  gitignore = readFileSync(gitignorePath, 'utf-8');
449
530
  }
450
-
531
+
451
532
  let updated = false;
452
533
  for (const entry of gitignoreEntries) {
453
534
  if (!gitignore.includes(entry)) {
@@ -455,14 +536,14 @@ npm run github:create-pr <branch> # PR作成
455
536
  updated = true;
456
537
  }
457
538
  }
458
-
539
+
459
540
  if (updated) {
460
541
  writeFileSync(gitignorePath, gitignore);
461
542
  console.log(' ✅ .gitignore updated (in repository root)');
462
543
  } else {
463
544
  console.log(' ℹ️ .gitignore already up to date');
464
545
  }
465
-
546
+
466
547
  // 完了メッセージ
467
548
  console.log('\n');
468
549
  console.log('🎉 セットアップ完了!');
@@ -471,8 +552,12 @@ npm run github:create-pr <branch> # PR作成
471
552
  console.log(` 1. cd ${projectDir}`);
472
553
  console.log(' 2. .env ファイルを編集して認証情報を設定');
473
554
  console.log(' 3. package.json が既存の場合、スクリプトを手動追加');
474
- console.log(' 4. npm install で依存関係をインストール(リポジトリルートで実行)');
475
- console.log(` 5. cc-sddを導入: npx cc-sdd@latest --lang ${config.langCode} --${config.environment}`);
555
+ console.log(
556
+ ' 4. npm install で依存関係をインストール(リポジトリルートで実行)',
557
+ );
558
+ console.log(
559
+ ` 5. cc-sddを導入: npx cc-sdd@latest --lang ${config.langCode} --${config.environment}`,
560
+ );
476
561
  console.log(' 6. jj commit でセットアップをコミット');
477
562
  console.log(' 7. Cursor で開く: cursor .');
478
563
  console.log(' 8. /kiro:spec-init <機能説明> で開発開始');
@@ -486,7 +571,6 @@ npm run github:create-pr <branch> # PR作成
486
571
  console.log(` - ${repoRoot}/package.json (新規の場合)`);
487
572
  console.log(` - ${repoRoot}/tsconfig.json (新規の場合)`);
488
573
  console.log(` - ${projectDir}/.env (テンプレート)`);
489
-
490
574
  } finally {
491
575
  // 元の作業ディレクトリに戻る
492
576
  process.chdir(originalCwd);
@@ -495,7 +579,7 @@ npm run github:create-pr <branch> # PR作成
495
579
 
496
580
  // 実行
497
581
  const config = parseArgs();
498
- setupExistingProject(config).catch(error => {
582
+ setupExistingProject(config).catch((error) => {
499
583
  console.error('❌ Error:', error.message);
500
584
  process.exit(1);
501
585
  });
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
7
- import { resolve, join, basename } from 'path';
7
+ import { join, basename } from 'path';
8
8
  import * as readline from 'readline';
9
9
  import { findCurrentProject, findAllProjects, selectProject, findRepositoryRoot } from './utils/project-finder.js';
10
10
  import type { ProjectMetadata } from './utils/project-meta.js';
@@ -375,7 +375,7 @@ async function main(): Promise<number> {
375
375
  const projectsDir = join(repoRoot, 'projects');
376
376
 
377
377
  // プロジェクト検出
378
- const currentProject = findCurrentProject();
378
+ findCurrentProject();
379
379
  const allProjects = findAllProjects();
380
380
 
381
381
  let projectPath: string;
@@ -420,7 +420,7 @@ async function main(): Promise<number> {
420
420
  try {
421
421
  const content = readFileSync(projectJsonPath, 'utf-8');
422
422
  existingMeta = JSON.parse(content);
423
- } catch (error) {
423
+ } catch {
424
424
  // 読み込みエラーは無視
425
425
  }
426
426
  }
@@ -442,7 +442,7 @@ async function main(): Promise<number> {
442
442
  try {
443
443
  const content = readFileSync(projectJsonPath, 'utf-8');
444
444
  existingMeta = JSON.parse(content);
445
- } catch (error) {
445
+ } catch {
446
446
  // 読み込みエラーは無視
447
447
  }
448
448
  }