@sk8metal/michi-cli 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +420 -49
  3. package/dist/scripts/__tests__/create-project.test.js +24 -28
  4. package/dist/scripts/__tests__/create-project.test.js.map +1 -1
  5. package/dist/scripts/__tests__/jira-transitions.test.d.ts +5 -0
  6. package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +1 -0
  7. package/dist/scripts/__tests__/jira-transitions.test.js +172 -0
  8. package/dist/scripts/__tests__/jira-transitions.test.js.map +1 -0
  9. package/dist/scripts/__tests__/multi-project-estimate.test.js +14 -15
  10. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -1
  11. package/dist/scripts/__tests__/setup-existing-project.test.js +146 -5
  12. package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
  13. package/dist/scripts/__tests__/setup-interactive.test.js +23 -17
  14. package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -1
  15. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +5 -0
  16. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +1 -0
  17. package/dist/scripts/__tests__/spec-impl-workflow.test.js +321 -0
  18. package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +1 -0
  19. package/dist/scripts/__tests__/spec-loader.test.d.ts +5 -0
  20. package/dist/scripts/__tests__/spec-loader.test.d.ts.map +1 -0
  21. package/dist/scripts/__tests__/spec-loader.test.js +153 -0
  22. package/dist/scripts/__tests__/spec-loader.test.js.map +1 -0
  23. package/dist/scripts/__tests__/validate-phase.test.js +26 -22
  24. package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
  25. package/dist/scripts/config/config-schema.d.ts +17 -0
  26. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  27. package/dist/scripts/config/config-schema.js +55 -26
  28. package/dist/scripts/config/config-schema.js.map +1 -1
  29. package/dist/scripts/config-interactive.d.ts.map +1 -1
  30. package/dist/scripts/config-interactive.js +53 -38
  31. package/dist/scripts/config-interactive.js.map +1 -1
  32. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  33. package/dist/scripts/confluence-sync.js +0 -11
  34. package/dist/scripts/confluence-sync.js.map +1 -1
  35. package/dist/scripts/constants/__tests__/environments.test.d.ts +2 -0
  36. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
  37. package/dist/scripts/constants/__tests__/environments.test.js +125 -0
  38. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
  39. package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
  40. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
  41. package/dist/scripts/constants/__tests__/languages.test.js +82 -0
  42. package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
  43. package/dist/scripts/constants/environments.d.ts +33 -0
  44. package/dist/scripts/constants/environments.d.ts.map +1 -0
  45. package/dist/scripts/constants/environments.js +64 -0
  46. package/dist/scripts/constants/environments.js.map +1 -0
  47. package/dist/scripts/constants/languages.d.ts +23 -0
  48. package/dist/scripts/constants/languages.d.ts.map +1 -0
  49. package/dist/scripts/constants/languages.js +53 -0
  50. package/dist/scripts/constants/languages.js.map +1 -0
  51. package/dist/scripts/constants/test-commands.d.ts +36 -0
  52. package/dist/scripts/constants/test-commands.d.ts.map +1 -0
  53. package/dist/scripts/constants/test-commands.js +70 -0
  54. package/dist/scripts/constants/test-commands.js.map +1 -0
  55. package/dist/scripts/create-project.d.ts +4 -0
  56. package/dist/scripts/create-project.d.ts.map +1 -1
  57. package/dist/scripts/create-project.js +51 -22
  58. package/dist/scripts/create-project.js.map +1 -1
  59. package/dist/scripts/jira-sync.d.ts +89 -3
  60. package/dist/scripts/jira-sync.d.ts.map +1 -1
  61. package/dist/scripts/jira-sync.js +366 -96
  62. package/dist/scripts/jira-sync.js.map +1 -1
  63. package/dist/scripts/markdown-to-confluence.js +1 -1
  64. package/dist/scripts/markdown-to-confluence.js.map +1 -1
  65. package/dist/scripts/phase-runner.d.ts +1 -1
  66. package/dist/scripts/phase-runner.d.ts.map +1 -1
  67. package/dist/scripts/phase-runner.js +809 -13
  68. package/dist/scripts/phase-runner.js.map +1 -1
  69. package/dist/scripts/pr-automation.d.ts.map +1 -1
  70. package/dist/scripts/pr-automation.js.map +1 -1
  71. package/dist/scripts/pre-flight-check.js +1 -1
  72. package/dist/scripts/pre-flight-check.js.map +1 -1
  73. package/dist/scripts/setup-existing-project.d.ts +3 -1
  74. package/dist/scripts/setup-existing-project.d.ts.map +1 -1
  75. package/dist/scripts/setup-existing-project.js +165 -78
  76. package/dist/scripts/setup-existing-project.js.map +1 -1
  77. package/dist/scripts/setup-interactive.js +3 -3
  78. package/dist/scripts/setup-interactive.js.map +1 -1
  79. package/dist/scripts/spec-impl-workflow.d.ts +94 -0
  80. package/dist/scripts/spec-impl-workflow.d.ts.map +1 -0
  81. package/dist/scripts/spec-impl-workflow.js +354 -0
  82. package/dist/scripts/spec-impl-workflow.js.map +1 -0
  83. package/dist/scripts/template/__tests__/renderer.test.d.ts +2 -0
  84. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
  85. package/dist/scripts/template/__tests__/renderer.test.js +165 -0
  86. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
  87. package/dist/scripts/template/renderer.d.ts +70 -0
  88. package/dist/scripts/template/renderer.d.ts.map +1 -0
  89. package/dist/scripts/template/renderer.js +99 -0
  90. package/dist/scripts/template/renderer.js.map +1 -0
  91. package/dist/scripts/test-execution-generator.d.ts +52 -0
  92. package/dist/scripts/test-execution-generator.d.ts.map +1 -0
  93. package/dist/scripts/test-execution-generator.js +576 -0
  94. package/dist/scripts/test-execution-generator.js.map +1 -0
  95. package/dist/scripts/test-interactive.d.ts +10 -0
  96. package/dist/scripts/test-interactive.d.ts.map +1 -0
  97. package/dist/scripts/test-interactive.js +627 -0
  98. package/dist/scripts/test-interactive.js.map +1 -0
  99. package/dist/scripts/test-new-features.d.ts +5 -0
  100. package/dist/scripts/test-new-features.d.ts.map +1 -0
  101. package/dist/scripts/test-new-features.js +145 -0
  102. package/dist/scripts/test-new-features.js.map +1 -0
  103. package/dist/scripts/test-spec-generator.d.ts +29 -0
  104. package/dist/scripts/test-spec-generator.d.ts.map +1 -0
  105. package/dist/scripts/test-spec-generator.js +494 -0
  106. package/dist/scripts/test-spec-generator.js.map +1 -0
  107. package/dist/scripts/test-workflow-stages.d.ts +6 -0
  108. package/dist/scripts/test-workflow-stages.d.ts.map +1 -0
  109. package/dist/scripts/test-workflow-stages.js +43 -0
  110. package/dist/scripts/test-workflow-stages.js.map +1 -0
  111. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +5 -0
  112. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +1 -0
  113. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +315 -0
  114. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +1 -0
  115. package/dist/scripts/utils/__tests__/business-days.test.d.ts +5 -0
  116. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +1 -0
  117. package/dist/scripts/utils/__tests__/business-days.test.js +171 -0
  118. package/dist/scripts/utils/__tests__/business-days.test.js.map +1 -0
  119. package/dist/scripts/utils/__tests__/config-loader.test.js +1 -1
  120. package/dist/scripts/utils/__tests__/config-loader.test.js.map +1 -1
  121. package/dist/scripts/utils/__tests__/config-validator.test.js +164 -35
  122. package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
  123. package/dist/scripts/utils/__tests__/env-config.test.d.ts +5 -0
  124. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +1 -0
  125. package/dist/scripts/utils/__tests__/env-config.test.js +218 -0
  126. package/dist/scripts/utils/__tests__/env-config.test.js.map +1 -0
  127. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +5 -0
  128. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +1 -0
  129. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +202 -0
  130. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +1 -0
  131. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +5 -0
  132. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +1 -0
  133. package/dist/scripts/utils/__tests__/tasks-converter.test.js +500 -0
  134. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +1 -0
  135. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +5 -0
  136. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +1 -0
  137. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +314 -0
  138. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +1 -0
  139. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +5 -0
  140. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +1 -0
  141. package/dist/scripts/utils/__tests__/test-runner.test.js +64 -0
  142. package/dist/scripts/utils/__tests__/test-runner.test.js.map +1 -0
  143. package/dist/scripts/utils/aidlc-parser.d.ts +86 -0
  144. package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -0
  145. package/dist/scripts/utils/aidlc-parser.js +208 -0
  146. package/dist/scripts/utils/aidlc-parser.js.map +1 -0
  147. package/dist/scripts/utils/business-days.d.ts +52 -0
  148. package/dist/scripts/utils/business-days.d.ts.map +1 -0
  149. package/dist/scripts/utils/business-days.js +98 -0
  150. package/dist/scripts/utils/business-days.js.map +1 -0
  151. package/dist/scripts/utils/ci-generator.d.ts +14 -0
  152. package/dist/scripts/utils/ci-generator.d.ts.map +1 -0
  153. package/dist/scripts/utils/ci-generator.js +61 -0
  154. package/dist/scripts/utils/ci-generator.js.map +1 -0
  155. package/dist/scripts/utils/config-loader.js +2 -2
  156. package/dist/scripts/utils/config-loader.js.map +1 -1
  157. package/dist/scripts/utils/config-validator.d.ts +7 -1
  158. package/dist/scripts/utils/config-validator.d.ts.map +1 -1
  159. package/dist/scripts/utils/config-validator.js +136 -23
  160. package/dist/scripts/utils/config-validator.js.map +1 -1
  161. package/dist/scripts/utils/confluence-approval.d.ts +46 -0
  162. package/dist/scripts/utils/confluence-approval.d.ts.map +1 -0
  163. package/dist/scripts/utils/confluence-approval.js +118 -0
  164. package/dist/scripts/utils/confluence-approval.js.map +1 -0
  165. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  166. package/dist/scripts/utils/confluence-hierarchy.js +1 -1
  167. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  168. package/dist/scripts/utils/docker-generator.d.ts +9 -0
  169. package/dist/scripts/utils/docker-generator.d.ts.map +1 -0
  170. package/dist/scripts/utils/docker-generator.js +132 -0
  171. package/dist/scripts/utils/docker-generator.js.map +1 -0
  172. package/dist/scripts/utils/docker-requirement-detector.d.ts +15 -0
  173. package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -0
  174. package/dist/scripts/utils/docker-requirement-detector.js +124 -0
  175. package/dist/scripts/utils/docker-requirement-detector.js.map +1 -0
  176. package/dist/scripts/utils/env-config.d.ts +54 -0
  177. package/dist/scripts/utils/env-config.d.ts.map +1 -0
  178. package/dist/scripts/utils/env-config.js +414 -0
  179. package/dist/scripts/utils/env-config.js.map +1 -0
  180. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts +70 -0
  181. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -0
  182. package/dist/scripts/utils/jira-issue-type-fetcher.js +147 -0
  183. package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -0
  184. package/dist/scripts/utils/language-detector.d.ts +14 -0
  185. package/dist/scripts/utils/language-detector.d.ts.map +1 -0
  186. package/dist/scripts/utils/language-detector.js +119 -0
  187. package/dist/scripts/utils/language-detector.js.map +1 -0
  188. package/dist/scripts/utils/markdown-parser.d.ts +55 -0
  189. package/dist/scripts/utils/markdown-parser.d.ts.map +1 -0
  190. package/dist/scripts/utils/markdown-parser.js +289 -0
  191. package/dist/scripts/utils/markdown-parser.js.map +1 -0
  192. package/dist/scripts/utils/project-detector.d.ts +17 -0
  193. package/dist/scripts/utils/project-detector.d.ts.map +1 -0
  194. package/dist/scripts/utils/project-detector.js +166 -0
  195. package/dist/scripts/utils/project-detector.js.map +1 -0
  196. package/dist/scripts/utils/project-finder.js +2 -2
  197. package/dist/scripts/utils/project-finder.js.map +1 -1
  198. package/dist/scripts/utils/release-notes-generator.d.ts +56 -0
  199. package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -0
  200. package/dist/scripts/utils/release-notes-generator.js +162 -0
  201. package/dist/scripts/utils/release-notes-generator.js.map +1 -0
  202. package/dist/scripts/utils/spec-loader.d.ts +79 -0
  203. package/dist/scripts/utils/spec-loader.d.ts.map +1 -0
  204. package/dist/scripts/utils/spec-loader.js +80 -0
  205. package/dist/scripts/utils/spec-loader.js.map +1 -0
  206. package/dist/scripts/utils/spec-updater.d.ts +7 -0
  207. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  208. package/dist/scripts/utils/spec-updater.js.map +1 -1
  209. package/dist/scripts/utils/tasks-converter.d.ts +57 -0
  210. package/dist/scripts/utils/tasks-converter.d.ts.map +1 -0
  211. package/dist/scripts/utils/tasks-converter.js +322 -0
  212. package/dist/scripts/utils/tasks-converter.js.map +1 -0
  213. package/dist/scripts/utils/tasks-format-validator.d.ts +36 -0
  214. package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -0
  215. package/dist/scripts/utils/tasks-format-validator.js +158 -0
  216. package/dist/scripts/utils/tasks-format-validator.js.map +1 -0
  217. package/dist/scripts/utils/template-applier.d.ts +37 -0
  218. package/dist/scripts/utils/template-applier.d.ts.map +1 -0
  219. package/dist/scripts/utils/template-applier.js +129 -0
  220. package/dist/scripts/utils/template-applier.js.map +1 -0
  221. package/dist/scripts/utils/template-finder.d.ts +37 -0
  222. package/dist/scripts/utils/template-finder.d.ts.map +1 -0
  223. package/dist/scripts/utils/template-finder.js +63 -0
  224. package/dist/scripts/utils/template-finder.js.map +1 -0
  225. package/dist/scripts/utils/test-config-generator.d.ts +12 -0
  226. package/dist/scripts/utils/test-config-generator.d.ts.map +1 -0
  227. package/dist/scripts/utils/test-config-generator.js +185 -0
  228. package/dist/scripts/utils/test-config-generator.js.map +1 -0
  229. package/dist/scripts/utils/test-runner.d.ts +31 -0
  230. package/dist/scripts/utils/test-runner.d.ts.map +1 -0
  231. package/dist/scripts/utils/test-runner.js +103 -0
  232. package/dist/scripts/utils/test-runner.js.map +1 -0
  233. package/dist/scripts/validate-phase.d.ts +1 -1
  234. package/dist/scripts/validate-phase.d.ts.map +1 -1
  235. package/dist/scripts/validate-phase.js +153 -5
  236. package/dist/scripts/validate-phase.js.map +1 -1
  237. package/dist/scripts/workflow-orchestrator.d.ts +8 -0
  238. package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
  239. package/dist/scripts/workflow-orchestrator.js +108 -7
  240. package/dist/scripts/workflow-orchestrator.js.map +1 -1
  241. package/dist/src/__tests__/integration/internationalization.test.d.ts +8 -0
  242. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +1 -0
  243. package/dist/src/__tests__/integration/internationalization.test.js +333 -0
  244. package/dist/src/__tests__/integration/internationalization.test.js.map +1 -0
  245. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +5 -0
  246. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
  247. package/dist/src/__tests__/integration/setup/claude-agent.test.js +122 -0
  248. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
  249. package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
  250. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
  251. package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
  252. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
  253. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
  254. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
  255. package/dist/src/__tests__/integration/setup/cursor.test.js +166 -0
  256. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
  257. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
  258. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
  259. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
  260. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
  261. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
  262. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
  263. package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
  264. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
  265. package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
  266. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
  267. package/dist/src/__tests__/integration/setup/validation.test.js +301 -0
  268. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
  269. package/dist/src/cli.d.ts.map +1 -1
  270. package/dist/src/cli.js +228 -18
  271. package/dist/src/cli.js.map +1 -1
  272. package/dist/src/commands/setup-existing.d.ts +25 -0
  273. package/dist/src/commands/setup-existing.d.ts.map +1 -0
  274. package/dist/src/commands/setup-existing.js +695 -0
  275. package/dist/src/commands/setup-existing.js.map +1 -0
  276. package/dist/vitest.config.d.ts.map +1 -1
  277. package/dist/vitest.config.js +4 -3
  278. package/dist/vitest.config.js.map +1 -1
  279. package/docs/README.md +3 -1
  280. package/docs/context.md +59 -0
  281. package/docs/design-issue-55.md +240 -0
  282. package/docs/design-issue-56.md +181 -0
  283. package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
  284. package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
  285. package/docs/plan.md +275 -0
  286. package/docs/user-guide/getting-started/github-token-setup.md +509 -0
  287. package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +108 -28
  288. package/docs/{getting-started → user-guide/getting-started}/quick-start.md +73 -6
  289. package/docs/{getting-started → user-guide/getting-started}/setup.md +278 -3
  290. package/docs/{guides → user-guide/guides}/customization.md +3 -3
  291. package/docs/user-guide/guides/internationalization.md +540 -0
  292. package/docs/{guides → user-guide/guides}/multi-project.md +2 -2
  293. package/docs/{guides → user-guide/guides}/phase-automation.md +67 -9
  294. package/docs/user-guide/guides/workflow.md +582 -0
  295. package/docs/user-guide/hands-on/README.md +142 -0
  296. package/docs/user-guide/hands-on/claude-agent-setup.md +455 -0
  297. package/docs/user-guide/hands-on/claude-setup.md +398 -0
  298. package/docs/user-guide/hands-on/cursor-setup.md +352 -0
  299. package/docs/user-guide/hands-on/troubleshooting.md +964 -0
  300. package/docs/user-guide/hands-on/verification-checklist.md +438 -0
  301. package/docs/user-guide/hands-on/workflow-walkthrough.md +906 -0
  302. package/docs/user-guide/reference/config.md +564 -0
  303. package/docs/{reference → user-guide/reference}/quick-reference.md +75 -53
  304. package/docs/user-guide/release/ci-setup.md +541 -0
  305. package/docs/user-guide/release/release-flow.md +476 -0
  306. package/docs/user-guide/templates/test-specs/README.md +173 -0
  307. package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
  308. package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
  309. package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
  310. package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
  311. package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
  312. package/docs/user-guide/testing/integration-tests.md +312 -0
  313. package/docs/user-guide/testing/tdd-cycle.md +349 -0
  314. package/docs/user-guide/testing/test-execution-flow.md +396 -0
  315. package/docs/user-guide/testing/test-failure-handling.md +521 -0
  316. package/docs/user-guide/testing/test-planning-flow.md +181 -0
  317. package/docs/user-guide/testing-strategy.md +185 -0
  318. package/docs/verification-guide.md +518 -0
  319. package/package.json +13 -3
  320. package/scripts/__tests__/create-project.test.ts +67 -49
  321. package/scripts/__tests__/jira-transitions.test.ts +225 -0
  322. package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
  323. package/scripts/__tests__/setup-existing-project.test.ts +171 -6
  324. package/scripts/__tests__/setup-interactive.test.ts +52 -46
  325. package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
  326. package/scripts/__tests__/spec-loader.test.ts +199 -0
  327. package/scripts/__tests__/validate-phase.test.ts +78 -54
  328. package/scripts/config/config-schema.ts +89 -50
  329. package/scripts/config-interactive.ts +191 -136
  330. package/scripts/confluence-sync.ts +0 -12
  331. package/scripts/constants/__tests__/environments.test.ts +146 -0
  332. package/scripts/constants/__tests__/languages.test.ts +100 -0
  333. package/scripts/constants/environments.ts +81 -0
  334. package/scripts/constants/languages.ts +70 -0
  335. package/scripts/constants/test-commands.ts +96 -0
  336. package/scripts/create-project.ts +52 -22
  337. package/scripts/jira-sync.ts +767 -232
  338. package/scripts/markdown-to-confluence.ts +1 -1
  339. package/scripts/phase-runner.ts +1056 -63
  340. package/scripts/pr-automation.ts +0 -1
  341. package/scripts/pre-flight-check.ts +1 -1
  342. package/scripts/pre-publish-check.sh +311 -0
  343. package/scripts/quick-verify.sh +115 -0
  344. package/scripts/setup-existing-project.ts +306 -143
  345. package/scripts/setup-interactive.ts +4 -4
  346. package/scripts/spec-impl-workflow.ts +505 -0
  347. package/scripts/template/__tests__/renderer.test.ts +206 -0
  348. package/scripts/template/renderer.ts +133 -0
  349. package/scripts/test-execution-generator.ts +695 -0
  350. package/scripts/test-interactive.ts +779 -0
  351. package/scripts/test-new-features.ts +168 -0
  352. package/scripts/test-npm-package.sh +345 -0
  353. package/scripts/test-spec-generator.ts +574 -0
  354. package/scripts/test-workflow-stages.ts +53 -0
  355. package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
  356. package/scripts/utils/__tests__/business-days.test.ts +214 -0
  357. package/scripts/utils/__tests__/config-loader.test.ts +1 -1
  358. package/scripts/utils/__tests__/config-validator.test.ts +309 -88
  359. package/scripts/utils/__tests__/env-config.test.ts +259 -0
  360. package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
  361. package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
  362. package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
  363. package/scripts/utils/__tests__/test-runner.test.ts +77 -0
  364. package/scripts/utils/aidlc-parser.ts +289 -0
  365. package/scripts/utils/business-days.ts +115 -0
  366. package/scripts/utils/ci-generator.ts +84 -0
  367. package/scripts/utils/config-loader.ts +2 -2
  368. package/scripts/utils/config-validator.ts +304 -117
  369. package/scripts/utils/confluence-approval.ts +167 -0
  370. package/scripts/utils/confluence-hierarchy.ts +2 -4
  371. package/scripts/utils/docker-generator.ts +151 -0
  372. package/scripts/utils/docker-requirement-detector.ts +153 -0
  373. package/scripts/utils/env-config.ts +526 -0
  374. package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
  375. package/scripts/utils/language-detector.ts +139 -0
  376. package/scripts/utils/markdown-parser.ts +376 -0
  377. package/scripts/utils/project-detector.ts +192 -0
  378. package/scripts/utils/project-finder.ts +2 -2
  379. package/scripts/utils/release-notes-generator.ts +210 -0
  380. package/scripts/utils/spec-loader.ts +125 -0
  381. package/scripts/utils/spec-updater.ts +8 -1
  382. package/scripts/utils/tasks-converter.ts +601 -0
  383. package/scripts/utils/tasks-format-validator.ts +193 -0
  384. package/scripts/utils/template-applier.ts +202 -0
  385. package/scripts/utils/template-finder.ts +75 -0
  386. package/scripts/utils/test-config-generator.ts +210 -0
  387. package/scripts/utils/test-runner.ts +133 -0
  388. package/scripts/validate-phase.ts +186 -9
  389. package/scripts/workflow-orchestrator.ts +130 -12
  390. package/templates/ci/github-actions/java.yml +54 -0
  391. package/templates/ci/github-actions/nodejs.yml +46 -0
  392. package/templates/ci/github-actions/php.yml +52 -0
  393. package/templates/ci/screwdriver/java.yaml +17 -0
  394. package/templates/ci/screwdriver/nodejs.yaml +17 -0
  395. package/templates/ci/screwdriver/php.yaml +20 -0
  396. package/templates/claude/commands/kiro/kiro-spec-impl.md +244 -0
  397. package/templates/claude/commands/kiro/kiro-spec-tasks.md +354 -0
  398. package/templates/claude/commands/michi/confluence-sync.md +38 -0
  399. package/templates/claude/commands/michi/project-switch.md +36 -0
  400. package/templates/claude/rules/atlassian-integration.md +35 -0
  401. package/templates/claude/rules/michi-core.md +54 -0
  402. package/templates/claude-agent/README.md +31 -0
  403. package/templates/claude-agent/agents/.gitkeep +0 -0
  404. package/templates/claude-agent/agents/designer.md +79 -0
  405. package/templates/claude-agent/agents/developer.md +68 -0
  406. package/templates/claude-agent/agents/manager-agent.md +59 -0
  407. package/templates/claude-agent/agents/tester.md +101 -0
  408. package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
  409. package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
  410. package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
  411. package/templates/cline/rules/atlassian-integration.md +36 -0
  412. package/templates/cline/rules/michi-core.md +56 -0
  413. package/templates/codex/AGENTS.override.md +277 -0
  414. package/templates/codex/prompts/confluence-sync.md +177 -0
  415. package/templates/codex/rules/README.md +210 -0
  416. package/templates/common/.kiro/project.json.template +21 -0
  417. package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
  418. package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
  419. package/templates/cursor/commands/michi/confluence-sync.md +76 -0
  420. package/templates/cursor/commands/michi/project-switch.md +69 -0
  421. package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
  422. package/templates/cursor/rules/github-ssot.mdc +151 -0
  423. package/templates/cursor/rules/multi-project.mdc +81 -0
  424. package/templates/gemini/commands/README.md +41 -0
  425. package/templates/gemini/rules/GEMINI.md +80 -0
  426. package/docs/guides/workflow.md +0 -342
  427. package/docs/reference/config.md +0 -545
  428. package/scripts/setup-env.sh +0 -52
  429. package/scripts/setup-existing.sh +0 -152
  430. /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
  431. /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
  432. /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
  433. /package/docs/{reference → user-guide/reference}/tasks-template.md +0 -0
@@ -0,0 +1,338 @@
1
+ /**
2
+ * tasks-format-validator.ts のユニットテスト
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { writeFileSync, unlinkSync, mkdirSync, rmdirSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { tmpdir } from 'os';
9
+ import {
10
+ validateTasksFormat,
11
+ isValidTasksFormat,
12
+ countPhases,
13
+ countStories
14
+ } from '../tasks-format-validator.js';
15
+
16
+ describe('tasks-format-validator', () => {
17
+ let testDir: string;
18
+ let testFilePath: string;
19
+
20
+ beforeEach(() => {
21
+ // テスト用一時ディレクトリ作成
22
+ testDir = join(tmpdir(), `test-tasks-validator-${Date.now()}`);
23
+ mkdirSync(testDir, { recursive: true });
24
+ testFilePath = join(testDir, 'tasks.md');
25
+ });
26
+
27
+ afterEach(() => {
28
+ // クリーンアップ
29
+ try {
30
+ if (testFilePath) unlinkSync(testFilePath);
31
+ if (testDir) rmdirSync(testDir);
32
+ } catch {
33
+ // Ignore cleanup errors
34
+ }
35
+ });
36
+
37
+ describe('validateTasksFormat', () => {
38
+ it('正しい新ワークフローフォーマットが成功する', () => {
39
+ const validContent = `# tasks.md
40
+
41
+ ## Phase 0.1: 要件定義
42
+
43
+ ### Story 0.1.1: 要件定義書作成
44
+
45
+ ## Phase 0.2: 設計
46
+
47
+ ### Story 0.2.1: 基本設計
48
+
49
+ ## Phase 1: 環境構築
50
+
51
+ ### Story 1.1: テスト環境セットアップ
52
+
53
+ ## Phase 2: TDD実装
54
+
55
+ ### Story 2.1: プロジェクトセットアップ
56
+
57
+ ## Phase A: PR前自動テスト
58
+
59
+ ### Story A.1: 単体テスト実行
60
+
61
+ ## Phase 3: 追加QA
62
+
63
+ ### Story 3.1: 統合テスト
64
+
65
+ ## Phase B: リリース準備テスト
66
+
67
+ ### Story B.1: E2Eテスト実行
68
+
69
+ ## Phase 4: リリース準備
70
+
71
+ ### Story 4.1: 本番環境構築
72
+
73
+ ## Phase 5: リリース
74
+
75
+ ### Story 5.1: ステージング環境デプロイ
76
+
77
+ Day 1(月): 営業日ベース
78
+ `;
79
+ writeFileSync(testFilePath, validContent, 'utf-8');
80
+ expect(() => validateTasksFormat(testFilePath)).not.toThrow();
81
+ });
82
+
83
+ it('正しい新ワークフローフォーマット(任意フェーズ省略)が成功する', () => {
84
+ const validContent = `# tasks.md
85
+
86
+ ## Phase 0.1: 要件定義
87
+
88
+ ### Story 0.1.1: 要件定義書作成
89
+
90
+ ## Phase 0.2: 設計
91
+
92
+ ### Story 0.2.1: 基本設計
93
+
94
+ ## Phase 2: TDD実装
95
+
96
+ ### Story 2.1: プロジェクトセットアップ
97
+
98
+ ## Phase 4: リリース準備
99
+
100
+ ### Story 4.1: 本番環境構築
101
+
102
+ ## Phase 5: リリース
103
+
104
+ ### Story 5.1: ステージング環境デプロイ
105
+
106
+ Day 1(月): 営業日ベース
107
+ `;
108
+ writeFileSync(testFilePath, validContent, 'utf-8');
109
+ expect(() => validateTasksFormat(testFilePath)).not.toThrow();
110
+ });
111
+
112
+ it('正しい6フェーズフォーマット(レガシー)が成功する', () => {
113
+ const validContent = `# tasks.md
114
+
115
+ ## Phase 0: 要件定義(Requirements)
116
+
117
+ ### Story 0.1: 要件定義書作成
118
+
119
+ ## Phase 1: 設計(Design)
120
+
121
+ ### Story 1.1: 基本設計
122
+
123
+ ## Phase 2: 実装(Implementation)
124
+
125
+ ### Story 2.1: プロジェクトセットアップ
126
+
127
+ ## Phase 3: 試験(Testing)
128
+
129
+ ### Story 3.1: 結合テスト
130
+
131
+ ## Phase 4: リリース準備(Release Preparation)
132
+
133
+ ### Story 4.1: 本番環境構築
134
+
135
+ ## Phase 5: リリース(Release)
136
+
137
+ ### Story 5.1: ステージング環境デプロイ
138
+
139
+ Day 1(月): 営業日ベース
140
+ `;
141
+ writeFileSync(testFilePath, validContent, 'utf-8');
142
+ expect(() => validateTasksFormat(testFilePath)).not.toThrow();
143
+ });
144
+
145
+ it('Phase 0が不足している場合エラー', () => {
146
+ const invalidContent = `# tasks.md
147
+
148
+ ## Phase 1: 設計(Design)
149
+
150
+ ### Story 1.1: 基本設計
151
+
152
+ ## Phase 2: 実装(Implementation)
153
+
154
+ ### Story 2.1: プロジェクトセットアップ
155
+
156
+ ## Phase 3: 試験(Testing)
157
+
158
+ ### Story 3.1: 結合テスト
159
+
160
+ ## Phase 4: リリース準備(Release Preparation)
161
+
162
+ ### Story 4.1: 本番環境構築
163
+
164
+ ## Phase 5: リリース(Release)
165
+
166
+ ### Story 5.1: ステージング環境デプロイ
167
+ `;
168
+ writeFileSync(testFilePath, invalidContent, 'utf-8');
169
+ expect(() => validateTasksFormat(testFilePath)).toThrow(/Phase 0: 要件定義(Requirements)/);
170
+ });
171
+
172
+ it('複数のフェーズが不足している場合エラー', () => {
173
+ const invalidContent = `# tasks.md
174
+
175
+ ## Phase 0: 要件定義(Requirements)
176
+
177
+ ### Story 0.1: 要件定義書作成
178
+
179
+ ## Phase 2: 実装(Implementation)
180
+
181
+ ### Story 2.1: プロジェクトセットアップ
182
+ `;
183
+ writeFileSync(testFilePath, invalidContent, 'utf-8');
184
+ expect(() => validateTasksFormat(testFilePath)).toThrow(/Phase 1: 設計(Design)/);
185
+ expect(() => validateTasksFormat(testFilePath)).toThrow(/Phase 3: 試験(Testing)/);
186
+ });
187
+
188
+ it('新ワークフローで必須フェーズが不足している場合エラー', () => {
189
+ const invalidContent = `# tasks.md
190
+
191
+ ## Phase 0.1: 要件定義
192
+
193
+ ### Story 0.1.1: 要件定義書作成
194
+
195
+ ## Phase 2: TDD実装
196
+
197
+ ### Story 2.1: プロジェクトセットアップ
198
+ `;
199
+ writeFileSync(testFilePath, invalidContent, 'utf-8');
200
+ expect(() => validateTasksFormat(testFilePath)).toThrow(/Phase 0.2:/);
201
+ expect(() => validateTasksFormat(testFilePath)).toThrow(/does not match either workflow structure/);
202
+ });
203
+
204
+ it('Storyヘッダーがない場合エラー', () => {
205
+ const invalidContent = `# tasks.md
206
+
207
+ ## Phase 0: 要件定義(Requirements)
208
+ ## Phase 1: 設計(Design)
209
+ ## Phase 2: 実装(Implementation)
210
+ ## Phase 3: 試験(Testing)
211
+ ## Phase 4: リリース準備(Release Preparation)
212
+ ## Phase 5: リリース(Release)
213
+ `;
214
+ writeFileSync(testFilePath, invalidContent, 'utf-8');
215
+ expect(() => validateTasksFormat(testFilePath)).toThrow(/Story headers/);
216
+ });
217
+
218
+ it('AI-DLCフォーマットを検出してエラー', () => {
219
+ const invalidContent = `# Implementation Plan
220
+
221
+ ## Task Breakdown
222
+
223
+ - [ ] 1. プロジェクトセットアップ
224
+ - [ ] 2. HealthControllerを実装
225
+ - [ ] 3. HealthServiceを実装
226
+ `;
227
+ writeFileSync(testFilePath, invalidContent, 'utf-8');
228
+ expect(() => validateTasksFormat(testFilePath)).toThrow(/AI-DLC format/);
229
+ });
230
+
231
+ it('ファイルが存在しない場合エラー', () => {
232
+ const nonExistentPath = join(testDir, 'non-existent.md');
233
+ expect(() => validateTasksFormat(nonExistentPath)).toThrow(/Failed to read/);
234
+ });
235
+ });
236
+
237
+ describe('isValidTasksFormat', () => {
238
+ it('正しいフォーマットの場合trueを返す', () => {
239
+ const validContent = `# tasks.md
240
+
241
+ ## Phase 0: 要件定義(Requirements)
242
+ ### Story 0.1: タイトル
243
+
244
+ ## Phase 1: 設計(Design)
245
+ ### Story 1.1: タイトル
246
+
247
+ ## Phase 2: 実装(Implementation)
248
+ ### Story 2.1: タイトル
249
+
250
+ ## Phase 3: 試験(Testing)
251
+ ### Story 3.1: タイトル
252
+
253
+ ## Phase 4: リリース準備(Release Preparation)
254
+ ### Story 4.1: タイトル
255
+
256
+ ## Phase 5: リリース(Release)
257
+ ### Story 5.1: タイトル
258
+
259
+ Day 1(月): 営業日ベース
260
+ `;
261
+ writeFileSync(testFilePath, validContent, 'utf-8');
262
+ expect(isValidTasksFormat(testFilePath)).toBe(true);
263
+ });
264
+
265
+ it('不正なフォーマットの場合falseを返す', () => {
266
+ const invalidContent = `# tasks.md
267
+
268
+ ## Phase 0: 要件定義(Requirements)
269
+ `;
270
+ writeFileSync(testFilePath, invalidContent, 'utf-8');
271
+ expect(isValidTasksFormat(testFilePath)).toBe(false);
272
+ });
273
+ });
274
+
275
+ describe('countPhases', () => {
276
+ it('正しくフェーズ数をカウントする', () => {
277
+ const content = `# tasks.md
278
+
279
+ ## Phase 0: 要件定義(Requirements)
280
+ ## Phase 1: 設計(Design)
281
+ ## Phase 2: 実装(Implementation)
282
+ ## Phase 3: 試験(Testing)
283
+ ## Phase 4: リリース準備(Release Preparation)
284
+ ## Phase 5: リリース(Release)
285
+ `;
286
+ writeFileSync(testFilePath, content, 'utf-8');
287
+ expect(countPhases(testFilePath)).toBe(6);
288
+ });
289
+
290
+ it('フェーズが少ない場合正しくカウントする', () => {
291
+ const content = `# tasks.md
292
+
293
+ ## Phase 0: 要件定義(Requirements)
294
+ ## Phase 1: 設計(Design)
295
+ `;
296
+ writeFileSync(testFilePath, content, 'utf-8');
297
+ expect(countPhases(testFilePath)).toBe(2);
298
+ });
299
+
300
+ it('ファイルが存在しない場合0を返す', () => {
301
+ const nonExistentPath = join(testDir, 'non-existent.md');
302
+ expect(countPhases(nonExistentPath)).toBe(0);
303
+ });
304
+ });
305
+
306
+ describe('countStories', () => {
307
+ it('正しくStory数をカウントする', () => {
308
+ const content = `# tasks.md
309
+
310
+ ## Phase 0: 要件定義(Requirements)
311
+ ### Story 0.1: 要件定義書作成
312
+ ### Story 0.2: PM承認
313
+
314
+ ## Phase 1: 設計(Design)
315
+ ### Story 1.1: 基本設計
316
+ ### Story 1.2: 詳細設計
317
+ `;
318
+ writeFileSync(testFilePath, content, 'utf-8');
319
+ expect(countStories(testFilePath)).toBe(4);
320
+ });
321
+
322
+ it('Storyがない場合0を返す', () => {
323
+ const content = `# tasks.md
324
+
325
+ ## Phase 0: 要件定義(Requirements)
326
+ `;
327
+ writeFileSync(testFilePath, content, 'utf-8');
328
+ expect(countStories(testFilePath)).toBe(0);
329
+ });
330
+
331
+ it('ファイルが存在しない場合0を返す', () => {
332
+ const nonExistentPath = join(testDir, 'non-existent.md');
333
+ expect(countStories(nonExistentPath)).toBe(0);
334
+ });
335
+ });
336
+ });
337
+
338
+
@@ -0,0 +1,77 @@
1
+ /**
2
+ * テストランナーのユニットテスト
3
+ */
4
+
5
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
6
+ import { generateTestReport, type TestResult } from '../test-runner.js';
7
+
8
+ // child_processのモック
9
+ vi.mock('child_process', () => ({
10
+ exec: vi.fn()
11
+ }));
12
+
13
+ vi.mock('util', () => ({
14
+ promisify: vi.fn((fn) => fn)
15
+ }));
16
+
17
+ describe('test-runner', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+
22
+ // executeTestsは実際のコマンド実行に依存するため、統合テストとして別途実施
23
+ // ここでは generateTestReport の単体テストのみ実施
24
+
25
+ describe('executeTests', () => {
26
+ it.skip('Node.js/TypeScriptプロジェクトでnpm testを実行する', async () => {
27
+ // 統合テストとして別途実施
28
+ });
29
+
30
+ it.skip('Javaプロジェクトでgradle testを実行する', async () => {
31
+ // 統合テストとして別途実施
32
+ });
33
+
34
+ it.skip('テスト失敗時にエラー情報を返す', async () => {
35
+ // 統合テストとして別途実施
36
+ });
37
+ });
38
+
39
+ describe('generateTestReport', () => {
40
+ it('テスト結果からMarkdownレポートを生成する', () => {
41
+ const testResult: TestResult = {
42
+ success: true,
43
+ language: 'Node.js/TypeScript',
44
+ command: 'npm test',
45
+ output: 'Test Suites: 5 passed, 5 total\nTests: 50 passed, 50 total',
46
+ duration: 15.5,
47
+ timestamp: '2025-12-03T10:00:00Z'
48
+ };
49
+
50
+ const report = generateTestReport(testResult, 'user-auth');
51
+
52
+ expect(report).toContain('# テスト実行レポート: user-auth');
53
+ expect(report).toContain('✅ 成功');
54
+ expect(report).toContain('Node.js/TypeScript');
55
+ expect(report).toContain('npm test');
56
+ expect(report).toContain('15.5');
57
+ });
58
+
59
+ it('テスト失敗時のレポートを生成する', () => {
60
+ const testResult: TestResult = {
61
+ success: false,
62
+ language: 'Java',
63
+ command: 'gradle test',
64
+ output: '',
65
+ error: 'Test failed',
66
+ duration: 5.0,
67
+ timestamp: '2025-12-03T10:00:00Z'
68
+ };
69
+
70
+ const report = generateTestReport(testResult, 'payment');
71
+
72
+ expect(report).toContain('# テスト実行レポート: payment');
73
+ expect(report).toContain('❌ 失敗');
74
+ expect(report).toContain('Test failed');
75
+ });
76
+ });
77
+ });
@@ -0,0 +1,289 @@
1
+ /**
2
+ * AI-DLC形式のtasks.mdパーサー
3
+ *
4
+ * AI-DLC形式:
5
+ * - `## 1. Category Name` のようなカテゴリヘッダー
6
+ * - `- [ ] 1.1 Task description` のようなタスク形式
7
+ * - 任意の `_Requirements: X.X, Y.Y_` タグ
8
+ * - 任意の `(P)` 並列実行マーカー
9
+ */
10
+
11
+ import { readFileSync } from 'fs';
12
+
13
+ /**
14
+ * AI-DLC形式のタスク
15
+ */
16
+ export interface AIDLCTask {
17
+ id: string; // "1.1", "2.3" など
18
+ title: string; // タスクのタイトル
19
+ description: string[]; // インデントされた詳細行
20
+ requirements: string[]; // 関連する要件ID
21
+ isParallel: boolean; // (P)マーカーがあるか
22
+ completed: boolean; // チェックボックスの状態
23
+ }
24
+
25
+ /**
26
+ * AI-DLC形式のカテゴリ
27
+ */
28
+ export interface AIDLCCategory {
29
+ id: string; // "1", "2" など
30
+ title: string; // カテゴリ名
31
+ tasks: AIDLCTask[];
32
+ }
33
+
34
+ /**
35
+ * AI-DLC形式のドキュメント
36
+ */
37
+ export interface AIDLCDocument {
38
+ title: string; // ドキュメントタイトル
39
+ categories: AIDLCCategory[];
40
+ summary?: AIDLCSummary; // オプショナルなサマリーセクション
41
+ rawContent: string; // 元のコンテンツ
42
+ }
43
+
44
+ /**
45
+ * AI-DLC形式のサマリー情報
46
+ */
47
+ export interface AIDLCSummary {
48
+ majorTasks?: number;
49
+ subTasks?: number;
50
+ estimatedHours?: string;
51
+ requirementsCoverage?: Map<string, string[]>; // 要件ID -> タスクID[]
52
+ }
53
+
54
+ /**
55
+ * AI-DLC形式かどうかを判定
56
+ *
57
+ * 判定基準:
58
+ * 1. `- [ ] X.Y` 形式のチェックボックスパターンが存在
59
+ * 2. Phase構造(Phase 0.1:, Phase 2: など)が存在しない
60
+ *
61
+ * @param content - 検証するコンテンツ
62
+ * @returns AI-DLC形式の場合true
63
+ */
64
+ export function isAIDLCFormat(content: string): boolean {
65
+ // AI-DLCパターン: "- [ ] 1." or "- [x] 1." (数字.で始まるタスク)
66
+ const hasAIDLCPattern = /^- \[[ x]\] \d+\./m.test(content);
67
+
68
+ // Michiワークフロー形式のPhase構造
69
+ const hasPhaseStructure =
70
+ content.includes('Phase 0:') ||
71
+ content.includes('Phase 0.1:') ||
72
+ content.includes('Phase 2:') ||
73
+ content.includes('## Phase');
74
+
75
+ // Story構造もチェック
76
+ const hasStoryStructure = /### Story \d+\.\d+:/.test(content);
77
+
78
+ return hasAIDLCPattern && !hasPhaseStructure && !hasStoryStructure;
79
+ }
80
+
81
+ /**
82
+ * AI-DLC形式のコンテンツをパース
83
+ *
84
+ * @param content - パースするコンテンツ
85
+ * @returns パースされたドキュメント
86
+ */
87
+ export function parseAIDLCFormat(content: string): AIDLCDocument {
88
+ const lines = content.split('\n');
89
+ const document: AIDLCDocument = {
90
+ title: '',
91
+ categories: [],
92
+ rawContent: content,
93
+ };
94
+
95
+ // タイトル抽出(最初の # で始まる行)
96
+ const titleMatch = content.match(/^# (.+)$/m);
97
+ if (titleMatch) {
98
+ document.title = titleMatch[1].trim();
99
+ }
100
+
101
+ let currentCategory: AIDLCCategory | null = null;
102
+ let currentTask: AIDLCTask | null = null;
103
+ let inSummarySection = false;
104
+
105
+ for (let i = 0; i < lines.length; i++) {
106
+ const line = lines[i];
107
+ const trimmedLine = line.trim();
108
+
109
+ // サマリーセクションの検出
110
+ if (
111
+ trimmedLine.startsWith('## 要件カバレッジ') ||
112
+ trimmedLine.startsWith('## Requirements Coverage') ||
113
+ trimmedLine.startsWith('## 並列実行可能') ||
114
+ trimmedLine.startsWith('## Parallel') ||
115
+ trimmedLine.startsWith('## タスク見積') ||
116
+ trimmedLine.startsWith('## Task Estimate') ||
117
+ trimmedLine === '---'
118
+ ) {
119
+ inSummarySection = true;
120
+ // 現在のタスクを保存
121
+ if (currentTask && currentCategory) {
122
+ currentCategory.tasks.push(currentTask);
123
+ currentTask = null;
124
+ }
125
+ continue;
126
+ }
127
+
128
+ if (inSummarySection) {
129
+ // サマリーセクションの解析(オプション)
130
+ parseSummaryLine(document, trimmedLine);
131
+ continue;
132
+ }
133
+
134
+ // カテゴリヘッダー: ## 1. Category Name
135
+ const categoryMatch = trimmedLine.match(/^## (\d+)\. (.+)$/);
136
+ if (categoryMatch) {
137
+ // 前のタスクを保存
138
+ if (currentTask && currentCategory) {
139
+ currentCategory.tasks.push(currentTask);
140
+ currentTask = null;
141
+ }
142
+ // 前のカテゴリを保存
143
+ if (currentCategory) {
144
+ document.categories.push(currentCategory);
145
+ }
146
+
147
+ currentCategory = {
148
+ id: categoryMatch[1],
149
+ title: categoryMatch[2].trim(),
150
+ tasks: [],
151
+ };
152
+ continue;
153
+ }
154
+
155
+ // タスク行: - [ ] 1.1 Task description または - [x] 1.1 Task description
156
+ const taskMatch = trimmedLine.match(
157
+ /^- \[([ x])\] (\d+\.\d+\*?) (?:\(P\) )?(.+)$/,
158
+ );
159
+ if (taskMatch && currentCategory) {
160
+ // 前のタスクを保存
161
+ if (currentTask) {
162
+ currentCategory.tasks.push(currentTask);
163
+ }
164
+
165
+ const isParallel =
166
+ trimmedLine.includes('(P)') || taskMatch[2].endsWith('*');
167
+ const taskId = taskMatch[2].replace('*', '');
168
+
169
+ currentTask = {
170
+ id: taskId,
171
+ title: taskMatch[3].trim(),
172
+ description: [],
173
+ requirements: [],
174
+ isParallel,
175
+ completed: taskMatch[1] === 'x',
176
+ };
177
+ continue;
178
+ }
179
+
180
+ // タスクの詳細行(インデントされた行)
181
+ if (currentTask && line.startsWith(' ') && trimmedLine) {
182
+ // Requirements タグの抽出
183
+ const reqMatch = trimmedLine.match(/_Requirements?: (.+)_|_要件: (.+)_/i);
184
+ if (reqMatch) {
185
+ const reqString = reqMatch[1] || reqMatch[2];
186
+ const requirements = reqString.split(',').map((r) => r.trim());
187
+ currentTask.requirements.push(...requirements);
188
+ } else {
189
+ // 通常の詳細行
190
+ currentTask.description.push(trimmedLine.replace(/^- /, ''));
191
+ }
192
+ }
193
+ }
194
+
195
+ // 最後のタスクとカテゴリを保存
196
+ if (currentTask && currentCategory) {
197
+ currentCategory.tasks.push(currentTask);
198
+ }
199
+ if (currentCategory) {
200
+ document.categories.push(currentCategory);
201
+ }
202
+
203
+ return document;
204
+ }
205
+
206
+ /**
207
+ * サマリー行を解析
208
+ */
209
+ function parseSummaryLine(document: AIDLCDocument, line: string): void {
210
+ if (!document.summary) {
211
+ document.summary = {};
212
+ }
213
+
214
+ // Major Tasks
215
+ const majorMatch = line.match(/Major Tasks.*?(\d+)/i);
216
+ if (majorMatch) {
217
+ document.summary.majorTasks = parseInt(majorMatch[1], 10);
218
+ }
219
+
220
+ // Sub-Tasks
221
+ const subMatch = line.match(/Sub-?Tasks.*?(\d+)/i);
222
+ if (subMatch) {
223
+ document.summary.subTasks = parseInt(subMatch[1], 10);
224
+ }
225
+
226
+ // Estimated hours
227
+ const hoursMatch = line.match(
228
+ /総工数見積.*?[::]?\s*(.+)|Estimated.*?[::]?\s*(.+)/i,
229
+ );
230
+ if (hoursMatch) {
231
+ document.summary.estimatedHours = (hoursMatch[1] || hoursMatch[2]).trim();
232
+ }
233
+ }
234
+
235
+ /**
236
+ * ファイルからAI-DLC形式をパース
237
+ *
238
+ * @param filePath - ファイルパス
239
+ * @returns パースされたドキュメント
240
+ * @throws ファイルが存在しない、またはAI-DLC形式でない場合
241
+ */
242
+ export function parseAIDLCFile(filePath: string): AIDLCDocument {
243
+ const content = readFileSync(filePath, 'utf-8');
244
+
245
+ if (!isAIDLCFormat(content)) {
246
+ throw new Error(
247
+ `File is not in AI-DLC format: ${filePath}\n` +
248
+ 'Expected format: "- [ ] X.Y Task description" without Phase structure',
249
+ );
250
+ }
251
+
252
+ return parseAIDLCFormat(content);
253
+ }
254
+
255
+ /**
256
+ * AI-DLCドキュメントの統計情報を取得
257
+ *
258
+ * @param doc - AI-DLCドキュメント
259
+ * @returns 統計情報
260
+ */
261
+ export function getAIDLCStats(doc: AIDLCDocument): {
262
+ totalCategories: number;
263
+ totalTasks: number;
264
+ completedTasks: number;
265
+ parallelTasks: number;
266
+ tasksWithRequirements: number;
267
+ } {
268
+ let totalTasks = 0;
269
+ let completedTasks = 0;
270
+ let parallelTasks = 0;
271
+ let tasksWithRequirements = 0;
272
+
273
+ for (const category of doc.categories) {
274
+ for (const task of category.tasks) {
275
+ totalTasks++;
276
+ if (task.completed) completedTasks++;
277
+ if (task.isParallel) parallelTasks++;
278
+ if (task.requirements.length > 0) tasksWithRequirements++;
279
+ }
280
+ }
281
+
282
+ return {
283
+ totalCategories: doc.categories.length,
284
+ totalTasks,
285
+ completedTasks,
286
+ parallelTasks,
287
+ tasksWithRequirements,
288
+ };
289
+ }