@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
@@ -5,11 +5,13 @@
5
5
  import { describe, it, expect, beforeEach, vi } from 'vitest';
6
6
  import { existsSync, readFileSync } from 'fs';
7
7
  import { validatePhase } from '../validate-phase.js';
8
+ import { loadConfig } from '../utils/config-loader.js';
9
+ import type { AppConfig } from '../config/config-schema.js';
8
10
 
9
11
  // fsモジュールのモック
10
12
  vi.mock('fs', () => ({
11
13
  existsSync: vi.fn(),
12
- readFileSync: vi.fn()
14
+ readFileSync: vi.fn(),
13
15
  }));
14
16
 
15
17
  // project-metaのモック
@@ -17,8 +19,19 @@ vi.mock('../utils/project-meta.js', () => ({
17
19
  loadProjectMeta: vi.fn(() => ({
18
20
  projectId: 'test-project',
19
21
  projectName: 'テストプロジェクト',
20
- jiraProjectKey: 'TEST'
21
- }))
22
+ jiraProjectKey: 'TEST',
23
+ })),
24
+ }));
25
+
26
+ // config-loaderのモック
27
+ vi.mock('../utils/config-loader.js', () => ({
28
+ loadConfig: vi.fn(() => ({
29
+ validation: {
30
+ weekdayNotation: true,
31
+ businessDayCount: true,
32
+ weekendExclusion: true,
33
+ },
34
+ })),
22
35
  }));
23
36
 
24
37
  describe('validatePhase', () => {
@@ -30,17 +43,19 @@ describe('validatePhase', () => {
30
43
  it('すべての必須項目が揃っている場合、validationが成功する', () => {
31
44
  // Arrange: requirementsフェーズを代表例としてテスト
32
45
  vi.mocked(existsSync).mockReturnValue(true);
33
- vi.mocked(readFileSync).mockReturnValue(JSON.stringify({
34
- confluence: {
35
- spaceKey: 'TEST',
36
- requirementsPageId: '12345'
37
- },
38
- milestones: {
39
- requirements: {
40
- completed: true
41
- }
42
- }
43
- }));
46
+ vi.mocked(readFileSync).mockReturnValue(
47
+ JSON.stringify({
48
+ confluence: {
49
+ spaceKey: 'TEST',
50
+ requirementsPageId: '12345',
51
+ },
52
+ milestones: {
53
+ requirements: {
54
+ completed: true,
55
+ },
56
+ },
57
+ }),
58
+ );
44
59
 
45
60
  // Act
46
61
  const result = validatePhase('test-feature', 'requirements');
@@ -54,19 +69,23 @@ describe('validatePhase', () => {
54
69
  it('Confluenceページが作成されていない場合、エラーを返す', () => {
55
70
  // Arrange
56
71
  vi.mocked(existsSync).mockReturnValue(true);
57
- vi.mocked(readFileSync).mockReturnValue(JSON.stringify({
58
- confluence: {
59
- spaceKey: 'TEST'
60
- // requirementsPageId が存在しない
61
- }
62
- }));
72
+ vi.mocked(readFileSync).mockReturnValue(
73
+ JSON.stringify({
74
+ confluence: {
75
+ spaceKey: 'TEST',
76
+ // requirementsPageId が存在しない
77
+ },
78
+ }),
79
+ );
63
80
 
64
81
  // Act
65
82
  const result = validatePhase('test-feature', 'requirements');
66
83
 
67
84
  // Assert
68
85
  expect(result.valid).toBe(false);
69
- expect(result.errors).toContain('❌ Confluenceページ(要件定義)が作成されていません');
86
+ expect(result.errors).toContain(
87
+ '❌ Confluenceページ(要件定義)が作成されていません',
88
+ );
70
89
  });
71
90
  });
72
91
 
@@ -74,23 +93,27 @@ describe('validatePhase', () => {
74
93
  it('designフェーズ: 前提条件(requirements完了)をチェックする', () => {
75
94
  // Arrange
76
95
  vi.mocked(existsSync).mockReturnValue(true);
77
- vi.mocked(readFileSync).mockReturnValue(JSON.stringify({
78
- confluence: {
79
- designPageId: '67890'
80
- },
81
- milestones: {
82
- requirements: {
83
- completed: false // 前提条件が満たされていない
84
- }
85
- }
86
- }));
96
+ vi.mocked(readFileSync).mockReturnValue(
97
+ JSON.stringify({
98
+ confluence: {
99
+ designPageId: '67890',
100
+ },
101
+ milestones: {
102
+ requirements: {
103
+ completed: false, // 前提条件が満たされていない
104
+ },
105
+ },
106
+ }),
107
+ );
87
108
 
88
109
  // Act
89
110
  const result = validatePhase('test-feature', 'design');
90
111
 
91
112
  // Assert
92
113
  expect(result.valid).toBe(false);
93
- expect(result.errors).toContain('❌ 要件定義が完了していません(前提条件)');
114
+ expect(result.errors).toContain(
115
+ '❌ 要件定義が完了していません(前提条件)',
116
+ );
94
117
  });
95
118
 
96
119
  it('tasksフェーズ: JIRA Epic/Story作成をチェックする', () => {
@@ -103,12 +126,12 @@ describe('validatePhase', () => {
103
126
  return JSON.stringify({
104
127
  milestones: {
105
128
  design: {
106
- completed: true
107
- }
129
+ completed: true,
130
+ },
108
131
  },
109
132
  jira: {
110
133
  // epicKey が存在しない(重要なチェック)
111
- }
134
+ },
112
135
  });
113
136
  });
114
137
 
@@ -130,16 +153,16 @@ describe('validatePhase', () => {
130
153
  return JSON.stringify({
131
154
  milestones: {
132
155
  design: {
133
- completed: true
134
- }
156
+ completed: true,
157
+ },
135
158
  },
136
159
  jira: {
137
160
  epicKey: 'TEST-1',
138
161
  stories: {
139
162
  created: 5,
140
- total: 5
141
- }
142
- }
163
+ total: 5,
164
+ },
165
+ },
143
166
  });
144
167
  });
145
168
 
@@ -148,7 +171,96 @@ describe('validatePhase', () => {
148
171
 
149
172
  // Assert
150
173
  expect(result.valid).toBe(true); // 警告だけなのでvalid
151
- expect(result.warnings).toContain('⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません');
174
+ expect(result.warnings).toContain(
175
+ '⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません',
176
+ );
177
+ });
178
+
179
+ it('tasksフェーズ: 日本語曜日表記を受け入れる', () => {
180
+ // Arrange
181
+ vi.mocked(existsSync).mockReturnValue(true);
182
+ vi.mocked(readFileSync).mockImplementation((path) => {
183
+ if (String(path).includes('tasks.md')) {
184
+ return 'Day 1(月):\n - タスク1\nDay 2(火):\n - タスク2\n土日休み';
185
+ }
186
+ return JSON.stringify({
187
+ milestones: { design: { completed: true } },
188
+ jira: { epicKey: 'TEST-1', storyKeys: ['TEST-2'] },
189
+ });
190
+ });
191
+ vi.mocked(loadConfig).mockReturnValue({
192
+ validation: {
193
+ weekdayNotation: true,
194
+ businessDayCount: true,
195
+ weekendExclusion: true,
196
+ },
197
+ } as Partial<AppConfig> as AppConfig);
198
+
199
+ // Act
200
+ const result = validatePhase('test-feature', 'tasks');
201
+
202
+ // Assert
203
+ expect(result.warnings).not.toContain(
204
+ '⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません',
205
+ );
206
+ });
207
+
208
+ it('tasksフェーズ: 英語曜日表記を受け入れる', () => {
209
+ // Arrange
210
+ vi.mocked(existsSync).mockReturnValue(true);
211
+ vi.mocked(readFileSync).mockImplementation((path) => {
212
+ if (String(path).includes('tasks.md')) {
213
+ return 'Day 1 (Mon):\n - Task 1\nDay 2 (Tue):\n - Task 2\nWeekends excluded';
214
+ }
215
+ return JSON.stringify({
216
+ milestones: { design: { completed: true } },
217
+ jira: { epicKey: 'TEST-1', storyKeys: ['TEST-2'] },
218
+ });
219
+ });
220
+ vi.mocked(loadConfig).mockReturnValue({
221
+ validation: {
222
+ weekdayNotation: true,
223
+ businessDayCount: true,
224
+ weekendExclusion: true,
225
+ },
226
+ } as Partial<AppConfig> as AppConfig);
227
+
228
+ // Act
229
+ const result = validatePhase('test-feature', 'tasks');
230
+
231
+ // Assert
232
+ expect(result.warnings).not.toContain(
233
+ '⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません',
234
+ );
235
+ });
236
+
237
+ it('tasksフェーズ: バリデーション無効化設定を尊重する', () => {
238
+ // Arrange
239
+ vi.mocked(existsSync).mockReturnValue(true);
240
+ vi.mocked(readFileSync).mockImplementation((path) => {
241
+ if (String(path).includes('tasks.md')) {
242
+ return 'タスク一覧(曜日表記なし)'; // 営業日表記がない
243
+ }
244
+ return JSON.stringify({
245
+ milestones: { design: { completed: true } },
246
+ jira: { epicKey: 'TEST-1', storyKeys: ['TEST-2'] },
247
+ });
248
+ });
249
+ vi.mocked(loadConfig).mockReturnValue({
250
+ validation: {
251
+ weekdayNotation: false, // バリデーション無効化
252
+ businessDayCount: true,
253
+ weekendExclusion: true,
254
+ },
255
+ } as Partial<AppConfig> as AppConfig);
256
+
257
+ // Act
258
+ const result = validatePhase('test-feature', 'tasks');
259
+
260
+ // Assert
261
+ expect(result.warnings).not.toContain(
262
+ '⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません',
263
+ );
152
264
  });
153
265
  });
154
266
 
@@ -156,30 +268,42 @@ describe('validatePhase', () => {
156
268
  it('spec.jsonが存在しない場合、エラーを返す', () => {
157
269
  // Arrange
158
270
  // requirements.mdは存在するが、spec.jsonは存在しない
159
- vi.mocked(existsSync).mockImplementation((path: string | Buffer | URL) => {
160
- const pathStr = typeof path === 'string' ? path : path instanceof URL ? path.pathname : path.toString();
161
- if (pathStr.includes('requirements.md')) {
162
- return true;
163
- }
164
- if (pathStr.includes('spec.json')) {
271
+ vi.mocked(existsSync).mockImplementation(
272
+ (path: string | Buffer | URL) => {
273
+ const pathStr =
274
+ typeof path === 'string'
275
+ ? path
276
+ : path instanceof URL
277
+ ? path.pathname
278
+ : path.toString();
279
+ if (pathStr.includes('requirements.md')) {
280
+ return true;
281
+ }
282
+ if (pathStr.includes('spec.json')) {
283
+ return false;
284
+ }
165
285
  return false;
166
- }
167
- return false;
168
- });
286
+ },
287
+ );
169
288
 
170
289
  // Act
171
290
  const result = validatePhase('test-feature', 'requirements');
172
291
 
173
292
  // Assert: エラーをスローせず、errors配列にエラーを含めて返す
174
293
  expect(result.valid).toBe(false);
175
- expect(result.errors).toContainEqual(expect.stringContaining('spec.json読み込みエラー'));
176
- expect(result.errors).toContainEqual(expect.stringContaining('spec.json not found'));
294
+ expect(result.errors).toContainEqual(
295
+ expect.stringContaining('spec.json読み込みエラー'),
296
+ );
297
+ expect(result.errors).toContainEqual(
298
+ expect.stringContaining('spec.json not found'),
299
+ );
177
300
  });
178
301
 
179
302
  it('不正なフェーズ名の場合、エラーをスローする', () => {
180
303
  // Act & Assert
181
- expect(() => validatePhase('test-feature', 'invalid' as any)).toThrow('Unknown phase: invalid');
304
+ expect(() =>
305
+ validatePhase('test-feature', 'invalid' as 'requirements'),
306
+ ).toThrow('Unknown phase: invalid');
182
307
  });
183
308
  });
184
309
  });
185
-
@@ -17,7 +17,7 @@ export const ConfluencePageCreationGranularitySchema = z.enum([
17
17
  'single',
18
18
  'by-section',
19
19
  'by-hierarchy',
20
- 'manual'
20
+ 'manual',
21
21
  ]);
22
22
 
23
23
  /**
@@ -27,41 +27,54 @@ export const ConfluenceHierarchyStructureSchema = z.object({
27
27
  mode: ConfluenceHierarchyModeSchema.optional(),
28
28
  parentPageTitle: z.string().optional(),
29
29
  createDocTypeParents: z.boolean().optional(),
30
- structure: z.record(
31
- z.string(),
32
- z.object({
33
- parent: z.string().optional(),
34
- title: z.string().optional(),
35
- children: z.array(
36
- z.object({
37
- section: z.string(),
38
- title: z.string()
39
- })
40
- ).optional(),
41
- pages: z.array(
42
- z.object({
43
- title: z.string(),
44
- sections: z.array(z.string()),
45
- labels: z.array(z.string()).optional()
46
- })
47
- ).optional()
48
- })
49
- ).optional()
30
+ structure: z
31
+ .record(
32
+ z.string(),
33
+ z.object({
34
+ parent: z.string().optional(),
35
+ title: z.string().optional(),
36
+ children: z
37
+ .array(
38
+ z.object({
39
+ section: z.string(),
40
+ title: z.string(),
41
+ }),
42
+ )
43
+ .optional(),
44
+ pages: z
45
+ .array(
46
+ z.object({
47
+ title: z.string(),
48
+ sections: z.array(z.string()),
49
+ labels: z.array(z.string()).optional(),
50
+ }),
51
+ )
52
+ .optional(),
53
+ }),
54
+ )
55
+ .optional(),
50
56
  });
51
57
 
52
58
  /**
53
59
  * Confluence設定スキーマ
54
60
  */
55
61
  export const ConfluenceConfigSchema = z.object({
56
- pageCreationGranularity: ConfluencePageCreationGranularitySchema.default('single'),
57
- pageTitleFormat: z.string().default('[{projectName}] {featureName} {docTypeLabel}'),
58
- autoLabels: z.array(z.string()).default(['{projectLabel}', '{docType}', '{featureName}', 'github-sync']),
59
- spaces: z.object({
60
- requirements: z.string().optional(),
61
- design: z.string().optional(),
62
- tasks: z.string().optional()
63
- }).optional(),
64
- hierarchy: ConfluenceHierarchyStructureSchema.optional()
62
+ pageCreationGranularity:
63
+ ConfluencePageCreationGranularitySchema.default('single'),
64
+ pageTitleFormat: z
65
+ .string()
66
+ .default('[{projectName}] {featureName} {docTypeLabel}'),
67
+ autoLabels: z
68
+ .array(z.string())
69
+ .default(['{projectLabel}', '{docType}', '{featureName}', 'github-sync']),
70
+ spaces: z
71
+ .object({
72
+ requirements: z.string().optional(),
73
+ design: z.string().optional(),
74
+ tasks: z.string().optional(),
75
+ })
76
+ .optional(),
77
+ hierarchy: ConfluenceHierarchyStructureSchema.optional(),
65
78
  });
66
79
 
67
80
  /**
@@ -70,7 +83,7 @@ export const ConfluenceConfigSchema = z.object({
70
83
  export const JiraStoryCreationGranularitySchema = z.enum([
71
84
  'all',
72
85
  'by-phase',
73
- 'selected-phases'
86
+ 'selected-phases',
74
87
  ]);
75
88
 
76
89
  /**
@@ -78,6 +91,15 @@ export const JiraStoryCreationGranularitySchema = z.enum([
78
91
  */
79
92
  export const JiraStoryPointsSchema = z.enum(['auto', 'manual', 'disabled']);
80
93
 
94
+ /**
95
+ * JIRA ステータスマッピングスキーマ
96
+ * spec-impl ワークフローで使用するステータス名
97
+ */
98
+ export const JiraStatusMappingSchema = z.object({
99
+ inProgress: z.string().default('In Progress'),
100
+ readyForReview: z.string().default('Ready for Review'),
101
+ });
102
+
81
103
  /**
82
104
  * JIRA設定スキーマ
83
105
  */
@@ -85,25 +107,43 @@ export const JiraConfigSchema = z.object({
85
107
  storyCreationGranularity: JiraStoryCreationGranularitySchema.default('all'),
86
108
  createEpic: z.boolean().default(true),
87
109
  storyPoints: JiraStoryPointsSchema.default('auto'),
88
- autoLabels: z.array(z.string()).default(['{projectLabel}', '{featureName}', '{phaseLabel}']),
89
- issueTypes: z.object({
90
- epic: z.string().default('Epic'),
91
- story: z.string().nullish().default(null), // null | undefined | string
92
- subtask: z.string().nullish().default(null) // null | undefined | string
93
- }).optional(),
94
- selectedPhases: z.array(z.string()).optional()
110
+ autoLabels: z
111
+ .array(z.string())
112
+ .default(['{projectLabel}', '{featureName}', '{phaseLabel}']),
113
+ issueTypes: z
114
+ .object({
115
+ epic: z.string().default('Epic'),
116
+ story: z.string().nullish().default(null), // null | undefined | string
117
+ subtask: z.string().nullish().default(null), // null | undefined | string
118
+ })
119
+ .optional(),
120
+ selectedPhases: z.array(z.string()).optional(),
121
+ statusMapping: JiraStatusMappingSchema.optional(),
95
122
  });
96
123
 
97
124
  /**
98
125
  * ワークフロー設定スキーマ
99
126
  */
100
127
  export const WorkflowConfigSchema = z.object({
101
- enabledPhases: z.array(z.string()).default(['requirements', 'design', 'tasks']),
102
- approvalGates: z.object({
103
- requirements: z.array(z.string()).optional(),
104
- design: z.array(z.string()).optional(),
105
- release: z.array(z.string()).optional()
106
- }).optional()
128
+ enabledPhases: z
129
+ .array(z.string())
130
+ .default(['requirements', 'design', 'tasks']),
131
+ approvalGates: z
132
+ .object({
133
+ requirements: z.array(z.string()).optional(),
134
+ design: z.array(z.string()).optional(),
135
+ release: z.array(z.string()).optional(),
136
+ })
137
+ .optional(),
138
+ });
139
+
140
+ /**
141
+ * バリデーション設定スキーマ
142
+ */
143
+ export const ValidationConfigSchema = z.object({
144
+ weekdayNotation: z.boolean().default(true),
145
+ businessDayCount: z.boolean().default(true),
146
+ weekendExclusion: z.boolean().default(true),
107
147
  });
108
148
 
109
149
  /**
@@ -112,19 +152,29 @@ export const WorkflowConfigSchema = z.object({
112
152
  export const AppConfigSchema = z.object({
113
153
  confluence: ConfluenceConfigSchema.optional(),
114
154
  jira: JiraConfigSchema.optional(),
115
- workflow: WorkflowConfigSchema.optional()
155
+ workflow: WorkflowConfigSchema.optional(),
156
+ validation: ValidationConfigSchema.optional(),
116
157
  });
117
158
 
118
159
  /**
119
160
  * 設定の型定義
120
161
  */
121
- export type ConfluenceHierarchyMode = z.infer<typeof ConfluenceHierarchyModeSchema>;
122
- export type ConfluencePageCreationGranularity = z.infer<typeof ConfluencePageCreationGranularitySchema>;
123
- export type ConfluenceHierarchyStructure = z.infer<typeof ConfluenceHierarchyStructureSchema>;
162
+ export type ConfluenceHierarchyMode = z.infer<
163
+ typeof ConfluenceHierarchyModeSchema
164
+ >;
165
+ export type ConfluencePageCreationGranularity = z.infer<
166
+ typeof ConfluencePageCreationGranularitySchema
167
+ >;
168
+ export type ConfluenceHierarchyStructure = z.infer<
169
+ typeof ConfluenceHierarchyStructureSchema
170
+ >;
124
171
  export type ConfluenceConfig = z.infer<typeof ConfluenceConfigSchema>;
125
- export type JiraStoryCreationGranularity = z.infer<typeof JiraStoryCreationGranularitySchema>;
172
+ export type JiraStoryCreationGranularity = z.infer<
173
+ typeof JiraStoryCreationGranularitySchema
174
+ >;
126
175
  export type JiraStoryPoints = z.infer<typeof JiraStoryPointsSchema>;
176
+ export type JiraStatusMapping = z.infer<typeof JiraStatusMappingSchema>;
127
177
  export type JiraConfig = z.infer<typeof JiraConfigSchema>;
128
178
  export type WorkflowConfig = z.infer<typeof WorkflowConfigSchema>;
179
+ export type ValidationConfig = z.infer<typeof ValidationConfigSchema>;
129
180
  export type AppConfig = z.infer<typeof AppConfigSchema>;
130
-