@sk8metal/michi-cli 0.0.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +236 -57
  3. package/dist/scripts/__tests__/create-project.test.js +24 -28
  4. package/dist/scripts/__tests__/create-project.test.js.map +1 -1
  5. package/dist/scripts/__tests__/jira-transitions.test.d.ts +5 -0
  6. package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +1 -0
  7. package/dist/scripts/__tests__/jira-transitions.test.js +172 -0
  8. package/dist/scripts/__tests__/jira-transitions.test.js.map +1 -0
  9. package/dist/scripts/__tests__/multi-project-estimate.test.js +14 -15
  10. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -1
  11. package/dist/scripts/__tests__/setup-existing-project.test.js +79 -0
  12. package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
  13. package/dist/scripts/__tests__/setup-interactive.test.js +23 -17
  14. package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -1
  15. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +5 -0
  16. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +1 -0
  17. package/dist/scripts/__tests__/spec-impl-workflow.test.js +321 -0
  18. package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +1 -0
  19. package/dist/scripts/__tests__/spec-loader.test.d.ts +5 -0
  20. package/dist/scripts/__tests__/spec-loader.test.d.ts.map +1 -0
  21. package/dist/scripts/__tests__/spec-loader.test.js +153 -0
  22. package/dist/scripts/__tests__/spec-loader.test.js.map +1 -0
  23. package/dist/scripts/__tests__/validate-phase.test.js +109 -22
  24. package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
  25. package/dist/scripts/config/config-schema.d.ts +31 -0
  26. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  27. package/dist/scripts/config/config-schema.js +64 -26
  28. package/dist/scripts/config/config-schema.js.map +1 -1
  29. package/dist/scripts/config-interactive.d.ts.map +1 -1
  30. package/dist/scripts/config-interactive.js +53 -38
  31. package/dist/scripts/config-interactive.js.map +1 -1
  32. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  33. package/dist/scripts/confluence-sync.js +0 -11
  34. package/dist/scripts/confluence-sync.js.map +1 -1
  35. package/dist/scripts/constants/__tests__/environments.test.js +39 -5
  36. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -1
  37. package/dist/scripts/constants/environments.d.ts +1 -1
  38. package/dist/scripts/constants/environments.d.ts.map +1 -1
  39. package/dist/scripts/constants/environments.js +22 -7
  40. package/dist/scripts/constants/environments.js.map +1 -1
  41. package/dist/scripts/constants/test-commands.d.ts +36 -0
  42. package/dist/scripts/constants/test-commands.d.ts.map +1 -0
  43. package/dist/scripts/constants/test-commands.js +70 -0
  44. package/dist/scripts/constants/test-commands.js.map +1 -0
  45. package/dist/scripts/jira-sync.d.ts +89 -3
  46. package/dist/scripts/jira-sync.d.ts.map +1 -1
  47. package/dist/scripts/jira-sync.js +366 -96
  48. package/dist/scripts/jira-sync.js.map +1 -1
  49. package/dist/scripts/markdown-to-confluence.js +1 -1
  50. package/dist/scripts/markdown-to-confluence.js.map +1 -1
  51. package/dist/scripts/phase-runner.d.ts +1 -1
  52. package/dist/scripts/phase-runner.d.ts.map +1 -1
  53. package/dist/scripts/phase-runner.js +809 -13
  54. package/dist/scripts/phase-runner.js.map +1 -1
  55. package/dist/scripts/pr-automation.d.ts.map +1 -1
  56. package/dist/scripts/pr-automation.js.map +1 -1
  57. package/dist/scripts/pre-flight-check.js +1 -1
  58. package/dist/scripts/pre-flight-check.js.map +1 -1
  59. package/dist/scripts/setup-existing-project.js +61 -29
  60. package/dist/scripts/setup-existing-project.js.map +1 -1
  61. package/dist/scripts/setup-interactive.js +3 -3
  62. package/dist/scripts/setup-interactive.js.map +1 -1
  63. package/dist/scripts/spec-impl-workflow.d.ts +94 -0
  64. package/dist/scripts/spec-impl-workflow.d.ts.map +1 -0
  65. package/dist/scripts/spec-impl-workflow.js +354 -0
  66. package/dist/scripts/spec-impl-workflow.js.map +1 -0
  67. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -1
  68. package/dist/scripts/test-execution-generator.d.ts +52 -0
  69. package/dist/scripts/test-execution-generator.d.ts.map +1 -0
  70. package/dist/scripts/test-execution-generator.js +576 -0
  71. package/dist/scripts/test-execution-generator.js.map +1 -0
  72. package/dist/scripts/test-interactive.d.ts +10 -0
  73. package/dist/scripts/test-interactive.d.ts.map +1 -0
  74. package/dist/scripts/test-interactive.js +627 -0
  75. package/dist/scripts/test-interactive.js.map +1 -0
  76. package/dist/scripts/test-new-features.d.ts +5 -0
  77. package/dist/scripts/test-new-features.d.ts.map +1 -0
  78. package/dist/scripts/test-new-features.js +145 -0
  79. package/dist/scripts/test-new-features.js.map +1 -0
  80. package/dist/scripts/test-spec-generator.d.ts +29 -0
  81. package/dist/scripts/test-spec-generator.d.ts.map +1 -0
  82. package/dist/scripts/test-spec-generator.js +494 -0
  83. package/dist/scripts/test-spec-generator.js.map +1 -0
  84. package/dist/scripts/test-workflow-stages.d.ts +6 -0
  85. package/dist/scripts/test-workflow-stages.d.ts.map +1 -0
  86. package/dist/scripts/test-workflow-stages.js +43 -0
  87. package/dist/scripts/test-workflow-stages.js.map +1 -0
  88. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +5 -0
  89. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +1 -0
  90. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +315 -0
  91. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +1 -0
  92. package/dist/scripts/utils/__tests__/business-days.test.d.ts +5 -0
  93. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +1 -0
  94. package/dist/scripts/utils/__tests__/business-days.test.js +171 -0
  95. package/dist/scripts/utils/__tests__/business-days.test.js.map +1 -0
  96. package/dist/scripts/utils/__tests__/config-loader.test.js +1 -1
  97. package/dist/scripts/utils/__tests__/config-loader.test.js.map +1 -1
  98. package/dist/scripts/utils/__tests__/config-validator.test.js +164 -35
  99. package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
  100. package/dist/scripts/utils/__tests__/env-config.test.d.ts +5 -0
  101. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +1 -0
  102. package/dist/scripts/utils/__tests__/env-config.test.js +218 -0
  103. package/dist/scripts/utils/__tests__/env-config.test.js.map +1 -0
  104. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +5 -0
  105. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +1 -0
  106. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +202 -0
  107. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +1 -0
  108. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +5 -0
  109. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +1 -0
  110. package/dist/scripts/utils/__tests__/tasks-converter.test.js +500 -0
  111. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +1 -0
  112. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +5 -0
  113. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +1 -0
  114. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +314 -0
  115. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +1 -0
  116. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +5 -0
  117. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +1 -0
  118. package/dist/scripts/utils/__tests__/test-runner.test.js +64 -0
  119. package/dist/scripts/utils/__tests__/test-runner.test.js.map +1 -0
  120. package/dist/scripts/utils/aidlc-parser.d.ts +86 -0
  121. package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -0
  122. package/dist/scripts/utils/aidlc-parser.js +208 -0
  123. package/dist/scripts/utils/aidlc-parser.js.map +1 -0
  124. package/dist/scripts/utils/business-days.d.ts +52 -0
  125. package/dist/scripts/utils/business-days.d.ts.map +1 -0
  126. package/dist/scripts/utils/business-days.js +98 -0
  127. package/dist/scripts/utils/business-days.js.map +1 -0
  128. package/dist/scripts/utils/ci-generator.d.ts +14 -0
  129. package/dist/scripts/utils/ci-generator.d.ts.map +1 -0
  130. package/dist/scripts/utils/ci-generator.js +61 -0
  131. package/dist/scripts/utils/ci-generator.js.map +1 -0
  132. package/dist/scripts/utils/config-loader.js +2 -2
  133. package/dist/scripts/utils/config-loader.js.map +1 -1
  134. package/dist/scripts/utils/config-validator.d.ts +7 -1
  135. package/dist/scripts/utils/config-validator.d.ts.map +1 -1
  136. package/dist/scripts/utils/config-validator.js +136 -23
  137. package/dist/scripts/utils/config-validator.js.map +1 -1
  138. package/dist/scripts/utils/confluence-approval.d.ts +46 -0
  139. package/dist/scripts/utils/confluence-approval.d.ts.map +1 -0
  140. package/dist/scripts/utils/confluence-approval.js +118 -0
  141. package/dist/scripts/utils/confluence-approval.js.map +1 -0
  142. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  143. package/dist/scripts/utils/confluence-hierarchy.js +1 -1
  144. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  145. package/dist/scripts/utils/docker-generator.d.ts +9 -0
  146. package/dist/scripts/utils/docker-generator.d.ts.map +1 -0
  147. package/dist/scripts/utils/docker-generator.js +132 -0
  148. package/dist/scripts/utils/docker-generator.js.map +1 -0
  149. package/dist/scripts/utils/docker-requirement-detector.d.ts +15 -0
  150. package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -0
  151. package/dist/scripts/utils/docker-requirement-detector.js +124 -0
  152. package/dist/scripts/utils/docker-requirement-detector.js.map +1 -0
  153. package/dist/scripts/utils/env-config.d.ts +54 -0
  154. package/dist/scripts/utils/env-config.d.ts.map +1 -0
  155. package/dist/scripts/utils/env-config.js +414 -0
  156. package/dist/scripts/utils/env-config.js.map +1 -0
  157. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts +70 -0
  158. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -0
  159. package/dist/scripts/utils/jira-issue-type-fetcher.js +147 -0
  160. package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -0
  161. package/dist/scripts/utils/language-detector.d.ts +14 -0
  162. package/dist/scripts/utils/language-detector.d.ts.map +1 -0
  163. package/dist/scripts/utils/language-detector.js +119 -0
  164. package/dist/scripts/utils/language-detector.js.map +1 -0
  165. package/dist/scripts/utils/markdown-parser.d.ts +55 -0
  166. package/dist/scripts/utils/markdown-parser.d.ts.map +1 -0
  167. package/dist/scripts/utils/markdown-parser.js +289 -0
  168. package/dist/scripts/utils/markdown-parser.js.map +1 -0
  169. package/dist/scripts/utils/project-detector.d.ts +17 -0
  170. package/dist/scripts/utils/project-detector.d.ts.map +1 -0
  171. package/dist/scripts/utils/project-detector.js +166 -0
  172. package/dist/scripts/utils/project-detector.js.map +1 -0
  173. package/dist/scripts/utils/project-finder.js +2 -2
  174. package/dist/scripts/utils/project-finder.js.map +1 -1
  175. package/dist/scripts/utils/release-notes-generator.d.ts +56 -0
  176. package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -0
  177. package/dist/scripts/utils/release-notes-generator.js +162 -0
  178. package/dist/scripts/utils/release-notes-generator.js.map +1 -0
  179. package/dist/scripts/utils/spec-loader.d.ts +79 -0
  180. package/dist/scripts/utils/spec-loader.d.ts.map +1 -0
  181. package/dist/scripts/utils/spec-loader.js +80 -0
  182. package/dist/scripts/utils/spec-loader.js.map +1 -0
  183. package/dist/scripts/utils/spec-updater.d.ts +7 -0
  184. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  185. package/dist/scripts/utils/spec-updater.js.map +1 -1
  186. package/dist/scripts/utils/tasks-converter.d.ts +57 -0
  187. package/dist/scripts/utils/tasks-converter.d.ts.map +1 -0
  188. package/dist/scripts/utils/tasks-converter.js +322 -0
  189. package/dist/scripts/utils/tasks-converter.js.map +1 -0
  190. package/dist/scripts/utils/tasks-format-validator.d.ts +36 -0
  191. package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -0
  192. package/dist/scripts/utils/tasks-format-validator.js +158 -0
  193. package/dist/scripts/utils/tasks-format-validator.js.map +1 -0
  194. package/dist/scripts/utils/template-applier.d.ts +37 -0
  195. package/dist/scripts/utils/template-applier.d.ts.map +1 -0
  196. package/dist/scripts/utils/template-applier.js +129 -0
  197. package/dist/scripts/utils/template-applier.js.map +1 -0
  198. package/dist/scripts/utils/test-config-generator.d.ts +12 -0
  199. package/dist/scripts/utils/test-config-generator.d.ts.map +1 -0
  200. package/dist/scripts/utils/test-config-generator.js +185 -0
  201. package/dist/scripts/utils/test-config-generator.js.map +1 -0
  202. package/dist/scripts/utils/test-runner.d.ts +31 -0
  203. package/dist/scripts/utils/test-runner.d.ts.map +1 -0
  204. package/dist/scripts/utils/test-runner.js +103 -0
  205. package/dist/scripts/utils/test-runner.js.map +1 -0
  206. package/dist/scripts/validate-phase.d.ts +1 -1
  207. package/dist/scripts/validate-phase.d.ts.map +1 -1
  208. package/dist/scripts/validate-phase.js +171 -8
  209. package/dist/scripts/validate-phase.js.map +1 -1
  210. package/dist/scripts/workflow-orchestrator.d.ts +8 -0
  211. package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
  212. package/dist/scripts/workflow-orchestrator.js +108 -7
  213. package/dist/scripts/workflow-orchestrator.js.map +1 -1
  214. package/dist/src/__tests__/integration/internationalization.test.d.ts +8 -0
  215. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +1 -0
  216. package/dist/src/__tests__/integration/internationalization.test.js +333 -0
  217. package/dist/src/__tests__/integration/internationalization.test.js.map +1 -0
  218. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +1 -1
  219. package/dist/src/__tests__/integration/setup/claude-agent.test.js +17 -20
  220. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -1
  221. package/dist/src/__tests__/integration/setup/claude.test.js +82 -0
  222. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -1
  223. package/dist/src/__tests__/integration/setup/cursor.test.js +23 -19
  224. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -1
  225. package/dist/src/__tests__/integration/setup/validation.test.js +41 -58
  226. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -1
  227. package/dist/src/cli.d.ts.map +1 -1
  228. package/dist/src/cli.js +209 -18
  229. package/dist/src/cli.js.map +1 -1
  230. package/dist/src/commands/setup-existing.d.ts +4 -0
  231. package/dist/src/commands/setup-existing.d.ts.map +1 -1
  232. package/dist/src/commands/setup-existing.js +367 -47
  233. package/dist/src/commands/setup-existing.js.map +1 -1
  234. package/docs/README.md +3 -1
  235. package/docs/context.md +59 -0
  236. package/docs/design-issue-55.md +240 -0
  237. package/docs/design-issue-56.md +181 -0
  238. package/docs/michi-development/testing/manual-verification-flow.md +2242 -0
  239. package/docs/michi-development/testing/pre-publish-checklist.md +560 -0
  240. package/docs/plan.md +275 -0
  241. package/docs/user-guide/getting-started/github-token-setup.md +509 -0
  242. package/docs/{getting-started → user-guide/getting-started}/quick-start.md +16 -0
  243. package/docs/{getting-started → user-guide/getting-started}/setup.md +28 -1
  244. package/docs/user-guide/guides/agent-skills-integration.md +217 -0
  245. package/docs/{guides → user-guide/guides}/customization.md +2 -2
  246. package/docs/user-guide/guides/internationalization.md +540 -0
  247. package/docs/{guides → user-guide/guides}/multi-project.md +3 -3
  248. package/docs/{guides → user-guide/guides}/phase-automation.md +92 -34
  249. package/docs/user-guide/guides/workflow.md +570 -0
  250. package/docs/user-guide/hands-on/README.md +142 -0
  251. package/docs/user-guide/hands-on/claude-agent-setup.md +455 -0
  252. package/docs/user-guide/hands-on/claude-setup.md +398 -0
  253. package/docs/user-guide/hands-on/cursor-setup.md +352 -0
  254. package/docs/user-guide/hands-on/troubleshooting.md +964 -0
  255. package/docs/user-guide/hands-on/verification-checklist.md +438 -0
  256. package/docs/user-guide/hands-on/workflow-walkthrough.md +906 -0
  257. package/docs/user-guide/reference/config.md +564 -0
  258. package/docs/{reference → user-guide/reference}/quick-reference.md +53 -40
  259. package/docs/{reference → user-guide/reference}/tasks-template.md +2 -2
  260. package/docs/user-guide/release/ci-setup.md +541 -0
  261. package/docs/user-guide/release/release-flow.md +476 -0
  262. package/docs/user-guide/templates/test-specs/README.md +173 -0
  263. package/docs/user-guide/templates/test-specs/e2e-test-spec-template.md +547 -0
  264. package/docs/user-guide/templates/test-specs/integration-test-spec-template.md +435 -0
  265. package/docs/user-guide/templates/test-specs/performance-test-spec-template.md +454 -0
  266. package/docs/user-guide/templates/test-specs/security-test-spec-template.md +664 -0
  267. package/docs/user-guide/templates/test-specs/unit-test-spec-template.md +328 -0
  268. package/docs/{testing → user-guide/testing}/integration-tests.md +24 -9
  269. package/docs/user-guide/testing/tdd-cycle.md +349 -0
  270. package/docs/user-guide/testing/test-execution-flow.md +396 -0
  271. package/docs/user-guide/testing/test-failure-handling.md +521 -0
  272. package/docs/user-guide/testing/test-planning-flow.md +181 -0
  273. package/docs/user-guide/testing-strategy.md +185 -0
  274. package/docs/verification-guide.md +518 -0
  275. package/package.json +7 -2
  276. package/scripts/__tests__/create-project.test.ts +67 -49
  277. package/scripts/__tests__/jira-transitions.test.ts +225 -0
  278. package/scripts/__tests__/multi-project-estimate.test.ts +36 -30
  279. package/scripts/__tests__/setup-existing-project.test.ts +98 -1
  280. package/scripts/__tests__/setup-interactive.test.ts +52 -46
  281. package/scripts/__tests__/spec-impl-workflow.test.ts +429 -0
  282. package/scripts/__tests__/spec-loader.test.ts +199 -0
  283. package/scripts/__tests__/validate-phase.test.ts +178 -54
  284. package/scripts/config/config-schema.ts +100 -50
  285. package/scripts/config-interactive.ts +191 -136
  286. package/scripts/confluence-sync.ts +0 -12
  287. package/scripts/constants/__tests__/environments.test.ts +42 -6
  288. package/scripts/constants/environments.ts +33 -13
  289. package/scripts/constants/test-commands.ts +96 -0
  290. package/scripts/jira-sync.ts +767 -232
  291. package/scripts/markdown-to-confluence.ts +1 -1
  292. package/scripts/phase-runner.ts +1056 -63
  293. package/scripts/pr-automation.ts +0 -1
  294. package/scripts/pre-flight-check.ts +1 -1
  295. package/scripts/pre-publish-check.sh +311 -0
  296. package/scripts/quick-verify.sh +115 -0
  297. package/scripts/setup-existing-project.ts +201 -117
  298. package/scripts/setup-interactive.ts +4 -4
  299. package/scripts/spec-impl-workflow.ts +505 -0
  300. package/scripts/template/__tests__/renderer.test.ts +1 -2
  301. package/scripts/test-execution-generator.ts +695 -0
  302. package/scripts/test-interactive.ts +779 -0
  303. package/scripts/test-new-features.ts +168 -0
  304. package/scripts/test-npm-package.sh +345 -0
  305. package/scripts/test-spec-generator.ts +574 -0
  306. package/scripts/test-workflow-stages.ts +53 -0
  307. package/scripts/utils/__tests__/aidlc-parser.test.ts +349 -0
  308. package/scripts/utils/__tests__/business-days.test.ts +214 -0
  309. package/scripts/utils/__tests__/config-loader.test.ts +1 -1
  310. package/scripts/utils/__tests__/config-validator.test.ts +309 -88
  311. package/scripts/utils/__tests__/env-config.test.ts +259 -0
  312. package/scripts/utils/__tests__/jira-issue-type-fetcher.test.ts +272 -0
  313. package/scripts/utils/__tests__/tasks-converter.test.ts +582 -0
  314. package/scripts/utils/__tests__/tasks-format-validator.test.ts +338 -0
  315. package/scripts/utils/__tests__/test-runner.test.ts +77 -0
  316. package/scripts/utils/aidlc-parser.ts +289 -0
  317. package/scripts/utils/business-days.ts +115 -0
  318. package/scripts/utils/ci-generator.ts +84 -0
  319. package/scripts/utils/config-loader.ts +2 -2
  320. package/scripts/utils/config-validator.ts +304 -117
  321. package/scripts/utils/confluence-approval.ts +167 -0
  322. package/scripts/utils/confluence-hierarchy.ts +2 -4
  323. package/scripts/utils/docker-generator.ts +151 -0
  324. package/scripts/utils/docker-requirement-detector.ts +153 -0
  325. package/scripts/utils/env-config.ts +526 -0
  326. package/scripts/utils/jira-issue-type-fetcher.ts +199 -0
  327. package/scripts/utils/language-detector.ts +139 -0
  328. package/scripts/utils/markdown-parser.ts +376 -0
  329. package/scripts/utils/project-detector.ts +192 -0
  330. package/scripts/utils/project-finder.ts +2 -2
  331. package/scripts/utils/release-notes-generator.ts +210 -0
  332. package/scripts/utils/spec-loader.ts +125 -0
  333. package/scripts/utils/spec-updater.ts +8 -1
  334. package/scripts/utils/tasks-converter.ts +601 -0
  335. package/scripts/utils/tasks-format-validator.ts +193 -0
  336. package/scripts/utils/template-applier.ts +202 -0
  337. package/scripts/utils/test-config-generator.ts +210 -0
  338. package/scripts/utils/test-runner.ts +133 -0
  339. package/scripts/validate-phase.ts +207 -12
  340. package/scripts/workflow-orchestrator.ts +130 -12
  341. package/templates/ci/github-actions/java.yml +54 -0
  342. package/templates/ci/github-actions/nodejs.yml +46 -0
  343. package/templates/ci/github-actions/php.yml +52 -0
  344. package/templates/ci/screwdriver/java.yaml +17 -0
  345. package/templates/ci/screwdriver/nodejs.yaml +17 -0
  346. package/templates/ci/screwdriver/php.yaml +20 -0
  347. package/templates/claude/agents/design-reviewer/AGENT.md +497 -0
  348. package/templates/claude/agents/e2e-first-planner/AGENT.md +410 -0
  349. package/templates/claude/agents/oss-license-checker/AGENT.md +265 -0
  350. package/templates/claude/agents/pr-resolver/AGENT.md +196 -0
  351. package/templates/claude/agents/stable-version-auditor/AGENT.md +279 -0
  352. package/templates/claude/commands/kiro/kiro-spec-impl.md +253 -0
  353. package/templates/claude/commands/kiro/kiro-spec-tasks.md +368 -0
  354. package/templates/claude/commands/michi/design-review.md +66 -0
  355. package/templates/claude/commands/michi/e2e-plan.md +113 -0
  356. package/templates/claude/commands/michi/license-check.md +80 -0
  357. package/templates/claude/commands/michi/pr-resolve.md +153 -0
  358. package/templates/claude/commands/michi/version-audit.md +91 -0
  359. package/templates/claude/skills/design-review/SKILL.md +648 -0
  360. package/templates/claude/skills/e2e-first-planning/SKILL.md +360 -0
  361. package/templates/claude/skills/oss-license/SKILL.md +232 -0
  362. package/templates/claude/skills/stable-version/SKILL.md +252 -0
  363. package/templates/claude-agent/README.md +7 -1
  364. package/templates/claude-agent/agents/.gitkeep +0 -0
  365. package/templates/claude-agent/agents/designer.md +79 -0
  366. package/templates/claude-agent/agents/developer.md +68 -0
  367. package/templates/claude-agent/agents/manager-agent.md +59 -0
  368. package/templates/claude-agent/agents/tester.md +101 -0
  369. package/templates/claude-agent/commands/kiro/.gitkeep +0 -0
  370. package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +244 -0
  371. package/templates/claude-agent/commands/kiro/kiro-spec-tasks.md +354 -0
  372. package/templates/cline/rules/atlassian-integration.md +36 -0
  373. package/templates/cline/rules/michi-core.md +56 -0
  374. package/templates/codex/AGENTS.override.md +277 -0
  375. package/templates/codex/prompts/confluence-sync.md +177 -0
  376. package/templates/codex/rules/README.md +210 -0
  377. package/templates/common/.kiro/project.json.template +21 -0
  378. package/templates/cursor/commands/kiro/kiro-spec-impl.md +244 -0
  379. package/templates/cursor/commands/kiro/kiro-spec-tasks.md +354 -0
  380. package/templates/gemini/commands/README.md +41 -0
  381. package/templates/gemini/rules/GEMINI.md +80 -0
  382. package/docs/guides/workflow.md +0 -342
  383. package/docs/reference/config.md +0 -545
  384. package/scripts/setup-existing.sh +0 -279
  385. /package/docs/{contributing → michi-development/contributing}/development.md +0 -0
  386. /package/docs/{contributing → michi-development/contributing}/release.md +0 -0
  387. /package/docs/{testing-strategy.md → michi-development/testing-strategy.md} +0 -0
  388. /package/docs/{getting-started → user-guide/getting-started}/new-repository-setup.md +0 -0
@@ -0,0 +1,582 @@
1
+ /**
2
+ * tasks-converter.ts のユニットテスト
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import {
7
+ writeFileSync,
8
+ unlinkSync,
9
+ mkdirSync,
10
+ rmdirSync,
11
+ readFileSync,
12
+ existsSync,
13
+ } from 'fs';
14
+ import { join } from 'path';
15
+ import { tmpdir } from 'os';
16
+ import { parseAIDLCFormat } from '../aidlc-parser.js';
17
+ import { convertToMichiFormat, convertTasksFile } from '../tasks-converter.js';
18
+
19
+ describe('tasks-converter', () => {
20
+ let testDir: string;
21
+ let testFilePath: string;
22
+
23
+ beforeEach(() => {
24
+ testDir = join(tmpdir(), `test-tasks-converter-${Date.now()}`);
25
+ mkdirSync(testDir, { recursive: true });
26
+ testFilePath = join(testDir, 'tasks.md');
27
+ });
28
+
29
+ afterEach(() => {
30
+ try {
31
+ // Clean up all files in testDir
32
+ const files = ['tasks.md', 'tasks.md.aidlc-backup', 'output.md'];
33
+ files.forEach((file) => {
34
+ const path = join(testDir, file);
35
+ if (existsSync(path)) unlinkSync(path);
36
+ });
37
+ if (testDir) rmdirSync(testDir);
38
+ } catch {
39
+ // Ignore cleanup errors
40
+ }
41
+ });
42
+
43
+ describe('convertToMichiFormat', () => {
44
+ it('基本的な変換が成功する', () => {
45
+ const content = `# Implementation Tasks: Test Feature
46
+
47
+ ## 1. セットアップ
48
+
49
+ - [ ] 1.1 プロジェクト初期化
50
+ - package.json作成
51
+ - TypeScript設定
52
+
53
+ ## 2. 実装
54
+
55
+ - [ ] 2.1 APIエンドポイント作成
56
+ `;
57
+ const doc = parseAIDLCFormat(content);
58
+ const result = convertToMichiFormat(doc, { projectName: 'test-feature' });
59
+
60
+ expect(result.success).toBe(true);
61
+ expect(result.convertedContent).toContain('# タスク分割: test-feature');
62
+ expect(result.convertedContent).toContain('## Phase 0.1:');
63
+ expect(result.convertedContent).toContain('## Phase 0.2:');
64
+ expect(result.stats.originalCategories).toBe(2);
65
+ expect(result.stats.originalTasks).toBe(2);
66
+ });
67
+
68
+ it('セットアップカテゴリがPhase 1にマッピングされる', () => {
69
+ const content = `# Tasks
70
+
71
+ ## 1. Setup
72
+
73
+ - [ ] 1.1 Initialize project
74
+ `;
75
+ const doc = parseAIDLCFormat(content);
76
+ const result = convertToMichiFormat(doc, { language: 'en' });
77
+
78
+ expect(result.convertedContent).toContain('## Phase 1:');
79
+ expect(result.convertedContent).toContain('Environment Setup');
80
+ });
81
+
82
+ it('実装カテゴリがPhase 2にマッピングされる', () => {
83
+ const content = `# Tasks
84
+
85
+ ## 1. Implementation Layer
86
+
87
+ - [ ] 1.1 Create API endpoint
88
+ `;
89
+ const doc = parseAIDLCFormat(content);
90
+ const result = convertToMichiFormat(doc, { language: 'en' });
91
+
92
+ expect(result.convertedContent).toContain('## Phase 2:');
93
+ expect(result.convertedContent).toContain('TDD Implementation');
94
+ });
95
+
96
+ it('テストカテゴリがPhase 3にマッピングされる', () => {
97
+ const content = `# Tasks
98
+
99
+ ## 1. Testing
100
+
101
+ - [ ] 1.1 Write unit tests
102
+ `;
103
+ const doc = parseAIDLCFormat(content);
104
+ const result = convertToMichiFormat(doc, { language: 'en' });
105
+
106
+ expect(result.convertedContent).toContain('## Phase 3:');
107
+ expect(result.convertedContent).toContain('Additional QA');
108
+ });
109
+
110
+ it('リリースカテゴリがPhase 5にマッピングされる', () => {
111
+ const content = `# Tasks
112
+
113
+ ## 1. Release
114
+
115
+ - [ ] 1.1 Deploy to production
116
+ `;
117
+ const doc = parseAIDLCFormat(content);
118
+ const result = convertToMichiFormat(doc, { language: 'en' });
119
+
120
+ expect(result.convertedContent).toContain('## Phase 5:');
121
+ expect(result.convertedContent).toContain('Release');
122
+ });
123
+
124
+ it('Storyヘッダーが正しく生成される', () => {
125
+ const content = `# Tasks
126
+
127
+ ## 1. Setup
128
+
129
+ - [ ] 1.1 Initialize project
130
+ - [ ] 1.2 Configure settings
131
+ `;
132
+ const doc = parseAIDLCFormat(content);
133
+ const result = convertToMichiFormat(doc);
134
+
135
+ expect(result.convertedContent).toContain('### Story 1.1:');
136
+ expect(result.convertedContent).toContain('### Story 1.2:');
137
+ });
138
+
139
+ it('タスクの詳細がStoryに含まれる', () => {
140
+ const content = `# Tasks
141
+
142
+ ## 1. Setup
143
+
144
+ - [ ] 1.1 Initialize project
145
+ - Create package.json
146
+ - Set up TypeScript
147
+ `;
148
+ const doc = parseAIDLCFormat(content);
149
+ const result = convertToMichiFormat(doc);
150
+
151
+ expect(result.convertedContent).toContain('Create package.json');
152
+ expect(result.convertedContent).toContain('Set up TypeScript');
153
+ });
154
+
155
+ it('要件が受け入れ基準に含まれる', () => {
156
+ const content = `# Tasks
157
+
158
+ ## 1. Setup
159
+
160
+ - [ ] 1.1 Initialize project
161
+ _Requirements: REQ-001, REQ-002_
162
+ `;
163
+ const doc = parseAIDLCFormat(content);
164
+ const result = convertToMichiFormat(doc);
165
+
166
+ expect(result.convertedContent).toContain('REQ-001');
167
+ expect(result.convertedContent).toContain('REQ-002');
168
+ });
169
+
170
+ it('並列実行マーカーが保持される', () => {
171
+ const content = `# Tasks
172
+
173
+ ## 1. Setup
174
+
175
+ - [ ] 1.1 (P) Task can run in parallel
176
+ `;
177
+ const doc = parseAIDLCFormat(content);
178
+ const result = convertToMichiFormat(doc);
179
+
180
+ expect(result.convertedContent).toContain('並列実行');
181
+ });
182
+
183
+ it('英語出力オプションが機能する', () => {
184
+ const content = `# Tasks
185
+
186
+ ## 1. Setup
187
+
188
+ - [ ] 1.1 Initialize project
189
+ `;
190
+ const doc = parseAIDLCFormat(content);
191
+ const result = convertToMichiFormat(doc, { language: 'en' });
192
+
193
+ expect(result.convertedContent).toContain('# Task Breakdown:');
194
+ expect(result.convertedContent).toContain('## Project Information');
195
+ expect(result.convertedContent).toContain('**Assignee**');
196
+ expect(result.convertedContent).toContain('**Effort**');
197
+ expect(result.convertedContent).toContain('person-days');
198
+ });
199
+
200
+ it('日本語出力オプションが機能する', () => {
201
+ const content = `# Tasks
202
+
203
+ ## 1. Setup
204
+
205
+ - [ ] 1.1 Initialize project
206
+ `;
207
+ const doc = parseAIDLCFormat(content);
208
+ const result = convertToMichiFormat(doc, { language: 'ja' });
209
+
210
+ expect(result.convertedContent).toContain('# タスク分割:');
211
+ expect(result.convertedContent).toContain('## プロジェクト情報');
212
+ expect(result.convertedContent).toContain('**担当**');
213
+ expect(result.convertedContent).toContain('**工数**');
214
+ expect(result.convertedContent).toContain('人日');
215
+ });
216
+
217
+ it('開始日オプションが機能する', () => {
218
+ const content = `# Tasks
219
+
220
+ ## 1. Setup
221
+
222
+ - [ ] 1.1 Initialize
223
+ `;
224
+ const doc = parseAIDLCFormat(content);
225
+ const result = convertToMichiFormat(doc, { startDate: '2025-01-15' });
226
+
227
+ expect(result.convertedContent).toContain('2025-01-15');
228
+ });
229
+
230
+ it('Phase 4と5のプレースホルダーが追加される', () => {
231
+ const content = `# Tasks
232
+
233
+ ## 1. Setup
234
+
235
+ - [ ] 1.1 Initialize
236
+ `;
237
+ const doc = parseAIDLCFormat(content);
238
+ const result = convertToMichiFormat(doc);
239
+
240
+ expect(result.convertedContent).toContain('## Phase 4:');
241
+ expect(result.convertedContent).toContain('## Phase 5:');
242
+ });
243
+
244
+ it('見積もりサマリーが生成される', () => {
245
+ const content = `# Tasks
246
+
247
+ ## 1. Setup
248
+
249
+ - [ ] 1.1 Task 1
250
+ - [ ] 1.2 Task 2
251
+
252
+ ## 2. Implementation
253
+
254
+ - [ ] 2.1 Task 3
255
+ `;
256
+ const doc = parseAIDLCFormat(content);
257
+ const result = convertToMichiFormat(doc);
258
+
259
+ expect(result.convertedContent).toContain('見積もりサマリー');
260
+ expect(result.convertedContent).toContain('| フェーズ |');
261
+ });
262
+
263
+ it('変換元情報が含まれる', () => {
264
+ const content = `# Tasks
265
+
266
+ ## 1. Setup
267
+
268
+ - [ ] 1.1 Task 1
269
+ - [ ] 1.2 Task 2
270
+ `;
271
+ const doc = parseAIDLCFormat(content);
272
+ const result = convertToMichiFormat(doc);
273
+
274
+ expect(result.convertedContent).toContain('AI-DLC形式から自動変換');
275
+ expect(result.convertedContent).toContain('元のカテゴリ数: 1');
276
+ expect(result.convertedContent).toContain('元のタスク数: 2');
277
+ });
278
+
279
+ it('変換結果に曜日表記が含まれる', () => {
280
+ const content = `# Tasks
281
+
282
+ ## 1. Setup
283
+
284
+ - [ ] 1.1 Initialize
285
+ `;
286
+ const doc = parseAIDLCFormat(content);
287
+ const result = convertToMichiFormat(doc, {
288
+ startDate: '2025-11-26', // 水曜日
289
+ });
290
+
291
+ // 曜日表記が含まれる
292
+ expect(result.convertedContent).toMatch(/([月火水木金])/);
293
+ // 土日表記が含まれる
294
+ expect(result.convertedContent).toContain('土日');
295
+ });
296
+
297
+ it('開始日の曜日が正しく反映される(水曜開始)', () => {
298
+ const content = `# Tasks
299
+
300
+ ## 1. Setup
301
+
302
+ - [ ] 1.1 Initialize
303
+ `;
304
+ const doc = parseAIDLCFormat(content);
305
+ const result = convertToMichiFormat(doc, {
306
+ startDate: '2025-11-26', // 水曜日
307
+ });
308
+
309
+ // Day 1 が水曜日
310
+ expect(result.convertedContent).toContain('2025-11-26(水)');
311
+ });
312
+
313
+ it('開始日の曜日が正しく反映される(月曜開始)', () => {
314
+ const content = `# Tasks
315
+
316
+ ## 1. Setup
317
+
318
+ - [ ] 1.1 Initialize
319
+ `;
320
+ const doc = parseAIDLCFormat(content);
321
+ const result = convertToMichiFormat(doc, {
322
+ startDate: '2025-11-24', // 月曜日
323
+ });
324
+
325
+ // Day 1 が月曜日
326
+ expect(result.convertedContent).toContain('2025-11-24(月)');
327
+ });
328
+
329
+ it('土日・祝日除外の注記が含まれる', () => {
330
+ const content = `# Tasks
331
+
332
+ ## 1. Setup
333
+
334
+ - [ ] 1.1 Initialize
335
+ `;
336
+ const doc = parseAIDLCFormat(content);
337
+ const result = convertToMichiFormat(doc);
338
+
339
+ expect(result.convertedContent).toContain(
340
+ '土日・祝日を除外した営業日ベース',
341
+ );
342
+ });
343
+
344
+ it('英語モードでも土日除外の注記が含まれる', () => {
345
+ const content = `# Tasks
346
+
347
+ ## 1. Setup
348
+
349
+ - [ ] 1.1 Initialize
350
+ `;
351
+ const doc = parseAIDLCFormat(content);
352
+ const result = convertToMichiFormat(doc, { language: 'en' });
353
+
354
+ expect(result.convertedContent).toContain(
355
+ 'Business days only (excluding weekends and holidays)',
356
+ );
357
+ });
358
+
359
+ it('Phase期間表記に曜日が含まれる', () => {
360
+ const content = `# Tasks
361
+
362
+ ## 1. Setup
363
+
364
+ - [ ] 1.1 Task 1
365
+ - [ ] 1.2 Task 2
366
+ `;
367
+ const doc = parseAIDLCFormat(content);
368
+ const result = convertToMichiFormat(doc, {
369
+ startDate: '2025-11-24', // 月曜日
370
+ });
371
+
372
+ // Phase 0.1 Day 1(月)
373
+ expect(result.convertedContent).toContain('Day 1(月)');
374
+ // Phase 0.2 Day 1-2(月火)
375
+ expect(result.convertedContent).toMatch(/Day 1-2([月火]+)/);
376
+ });
377
+
378
+ it('土曜日開始の場合は月曜日に調整される', () => {
379
+ const content = `# Tasks
380
+
381
+ ## 1. Setup
382
+
383
+ - [ ] 1.1 Initialize
384
+ `;
385
+ const doc = parseAIDLCFormat(content);
386
+ const result = convertToMichiFormat(doc, {
387
+ startDate: '2025-11-29', // 土曜日
388
+ });
389
+
390
+ // 土曜日は営業日ではないため、月曜日に調整
391
+ expect(result.convertedContent).toContain('2025-12-01(月)');
392
+ });
393
+
394
+ it('日曜日開始の場合は月曜日に調整される', () => {
395
+ const content = `# Tasks
396
+
397
+ ## 1. Setup
398
+
399
+ - [ ] 1.1 Initialize
400
+ `;
401
+ const doc = parseAIDLCFormat(content);
402
+ const result = convertToMichiFormat(doc, {
403
+ startDate: '2025-11-30', // 日曜日
404
+ });
405
+
406
+ // 日曜日は営業日ではないため、月曜日に調整
407
+ expect(result.convertedContent).toContain('2025-12-01(月)');
408
+ });
409
+ });
410
+
411
+ describe('convertTasksFile', () => {
412
+ it('ファイル変換が成功する', () => {
413
+ const content = `# Implementation Tasks
414
+
415
+ ## 1. Setup
416
+
417
+ - [ ] 1.1 Initialize project
418
+ `;
419
+ writeFileSync(testFilePath, content, 'utf-8');
420
+ const result = convertTasksFile(testFilePath);
421
+
422
+ expect(result.success).toBe(true);
423
+
424
+ const converted = readFileSync(testFilePath, 'utf-8');
425
+ expect(converted).toContain('## Phase 0.1:');
426
+ expect(converted).toContain('### Story');
427
+ });
428
+
429
+ it('dry-runオプションでファイルが変更されない', () => {
430
+ const content = `# Implementation Tasks
431
+
432
+ ## 1. Setup
433
+
434
+ - [ ] 1.1 Initialize project
435
+ `;
436
+ writeFileSync(testFilePath, content, 'utf-8');
437
+ const result = convertTasksFile(testFilePath, undefined, {
438
+ dryRun: true,
439
+ });
440
+
441
+ expect(result.success).toBe(true);
442
+ expect(result.warnings).toContain('Dry run: No files were modified');
443
+
444
+ const unchanged = readFileSync(testFilePath, 'utf-8');
445
+ expect(unchanged).toBe(content);
446
+ });
447
+
448
+ it('backupオプションでバックアップが作成される', () => {
449
+ const content = `# Implementation Tasks
450
+
451
+ ## 1. Setup
452
+
453
+ - [ ] 1.1 Initialize project
454
+ `;
455
+ writeFileSync(testFilePath, content, 'utf-8');
456
+ const result = convertTasksFile(testFilePath, undefined, {
457
+ backup: true,
458
+ });
459
+
460
+ expect(result.success).toBe(true);
461
+ expect(result.backupPath).toBe(testFilePath + '.aidlc-backup');
462
+ expect(existsSync(result.backupPath!)).toBe(true);
463
+
464
+ const backup = readFileSync(result.backupPath!, 'utf-8');
465
+ expect(backup).toBe(content);
466
+ });
467
+
468
+ it('カスタムバックアップサフィックスが機能する', () => {
469
+ const content = `# Implementation Tasks
470
+
471
+ ## 1. Setup
472
+
473
+ - [ ] 1.1 Initialize project
474
+ `;
475
+ writeFileSync(testFilePath, content, 'utf-8');
476
+ const result = convertTasksFile(testFilePath, undefined, {
477
+ backup: true,
478
+ backupSuffix: '.backup',
479
+ });
480
+
481
+ expect(result.backupPath).toBe(testFilePath + '.backup');
482
+ });
483
+
484
+ it('出力先パスを指定できる', () => {
485
+ const content = `# Implementation Tasks
486
+
487
+ ## 1. Setup
488
+
489
+ - [ ] 1.1 Initialize project
490
+ `;
491
+ const outputPath = join(testDir, 'output.md');
492
+ writeFileSync(testFilePath, content, 'utf-8');
493
+ const result = convertTasksFile(testFilePath, outputPath);
494
+
495
+ expect(result.success).toBe(true);
496
+ expect(existsSync(outputPath)).toBe(true);
497
+
498
+ // 元ファイルは変更されない
499
+ const original = readFileSync(testFilePath, 'utf-8');
500
+ expect(original).toBe(content);
501
+
502
+ // 出力ファイルは変換後の内容
503
+ const output = readFileSync(outputPath, 'utf-8');
504
+ expect(output).toContain('## Phase 0.1:');
505
+ });
506
+
507
+ it('AI-DLC形式でないファイルはエラーを返す', () => {
508
+ const content = `# tasks.md
509
+
510
+ ## Phase 0: 要件定義
511
+
512
+ ### Story 0.1: タスク
513
+ `;
514
+ writeFileSync(testFilePath, content, 'utf-8');
515
+ const result = convertTasksFile(testFilePath);
516
+
517
+ expect(result.success).toBe(false);
518
+ expect(result.warnings[0]).toContain('not in AI-DLC format');
519
+ });
520
+
521
+ it('languageオプションが変換に反映される', () => {
522
+ const content = `# Implementation Tasks
523
+
524
+ ## 1. Setup
525
+
526
+ - [ ] 1.1 Initialize project
527
+ `;
528
+ writeFileSync(testFilePath, content, 'utf-8');
529
+ const result = convertTasksFile(testFilePath, undefined, {
530
+ language: 'en',
531
+ });
532
+
533
+ expect(result.success).toBe(true);
534
+
535
+ const converted = readFileSync(testFilePath, 'utf-8');
536
+ expect(converted).toContain('# Task Breakdown:');
537
+ expect(converted).toContain('person-days');
538
+ });
539
+
540
+ it('projectNameオプションがヘッダーに反映される', () => {
541
+ const content = `# Implementation Tasks
542
+
543
+ ## 1. Setup
544
+
545
+ - [ ] 1.1 Initialize project
546
+ `;
547
+ writeFileSync(testFilePath, content, 'utf-8');
548
+ const result = convertTasksFile(testFilePath, undefined, {
549
+ projectName: 'my-awesome-feature',
550
+ });
551
+
552
+ expect(result.success).toBe(true);
553
+
554
+ const converted = readFileSync(testFilePath, 'utf-8');
555
+ expect(converted).toContain('my-awesome-feature');
556
+ });
557
+
558
+ it('統計情報が正しく返される', () => {
559
+ const content = `# Implementation Tasks
560
+
561
+ ## 1. Setup
562
+
563
+ - [ ] 1.1 Task 1
564
+ - [ ] 1.2 Task 2
565
+
566
+ ## 2. Implementation
567
+
568
+ - [ ] 2.1 Task 3
569
+ - [ ] 2.2 Task 4
570
+ - [ ] 2.3 Task 5
571
+ `;
572
+ writeFileSync(testFilePath, content, 'utf-8');
573
+ const result = convertTasksFile(testFilePath);
574
+
575
+ expect(result.success).toBe(true);
576
+ expect(result.stats.originalCategories).toBe(2);
577
+ expect(result.stats.originalTasks).toBe(5);
578
+ expect(result.stats.convertedPhases).toBeGreaterThan(0);
579
+ expect(result.stats.convertedStories).toBeGreaterThan(0);
580
+ });
581
+ });
582
+ });