@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
@@ -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
+ }