@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,133 @@
1
+ /**
2
+ * テスト実行ユーティリティ
3
+ * プロジェクトの言語に応じてテストを実行し、レポートを生成
4
+ */
5
+
6
+ import { exec } from 'child_process';
7
+ import { promisify } from 'util';
8
+
9
+ const execAsync = promisify(exec);
10
+
11
+ /**
12
+ * テスト実行結果
13
+ */
14
+ export interface TestResult {
15
+ success: boolean;
16
+ language: string;
17
+ command: string;
18
+ output: string;
19
+ error?: string;
20
+ duration: number;
21
+ timestamp: string;
22
+ }
23
+
24
+ /**
25
+ * テストを実行
26
+ * @param language プロジェクトの言語
27
+ * @param projectRoot プロジェクトルートディレクトリ
28
+ * @returns テスト実行結果
29
+ */
30
+ export async function executeTests(
31
+ language: string,
32
+ projectRoot: string = process.cwd()
33
+ ): Promise<TestResult> {
34
+ const startTime = Date.now();
35
+ const timestamp = new Date().toISOString();
36
+
37
+ // 言語に応じてテストコマンドを決定
38
+ const command = getTestCommand(language);
39
+
40
+ try {
41
+ const { stdout, stderr } = await execAsync(command, {
42
+ cwd: projectRoot,
43
+ env: { ...process.env, CI: 'true' }
44
+ });
45
+
46
+ const duration = (Date.now() - startTime) / 1000;
47
+
48
+ return {
49
+ success: true,
50
+ language,
51
+ command,
52
+ output: stdout + stderr,
53
+ duration,
54
+ timestamp
55
+ };
56
+ } catch (error: any) {
57
+ const duration = (Date.now() - startTime) / 1000;
58
+
59
+ return {
60
+ success: false,
61
+ language,
62
+ command,
63
+ output: error.stdout || '',
64
+ error: error.message || String(error),
65
+ duration,
66
+ timestamp
67
+ };
68
+ }
69
+ }
70
+
71
+ /**
72
+ * 言語に応じたテストコマンドを取得
73
+ */
74
+ function getTestCommand(language: string): string {
75
+ switch (language) {
76
+ case 'Node.js/TypeScript':
77
+ return 'npm test';
78
+ case 'Java':
79
+ return 'gradle test';
80
+ case 'PHP':
81
+ return 'composer test';
82
+ case 'Python':
83
+ return 'pytest';
84
+ case 'Go':
85
+ return 'go test ./...';
86
+ case 'Rust':
87
+ return 'cargo test';
88
+ default:
89
+ throw new Error(`Unsupported language: ${language}`);
90
+ }
91
+ }
92
+
93
+ /**
94
+ * テスト結果からMarkdownレポートを生成
95
+ * @param result テスト実行結果
96
+ * @param featureName 機能名
97
+ * @returns Markdownレポート
98
+ */
99
+ export function generateTestReport(
100
+ result: TestResult,
101
+ featureName: string
102
+ ): string {
103
+ const status = result.success ? '✅ 成功' : '❌ 失敗';
104
+
105
+ let report = `# テスト実行レポート: ${featureName}\n\n`;
106
+ report += '## 実行結果\n\n';
107
+ report += `- **ステータス**: ${status}\n`;
108
+ report += `- **言語**: ${result.language}\n`;
109
+ report += `- **コマンド**: \`${result.command}\`\n`;
110
+ report += `- **実行時間**: ${result.duration.toFixed(2)}秒\n`;
111
+ report += `- **タイムスタンプ**: ${result.timestamp}\n\n`;
112
+
113
+ if (result.success) {
114
+ report += '## テスト出力\n\n';
115
+ report += '```\n';
116
+ report += result.output;
117
+ report += '\n```\n\n';
118
+ } else {
119
+ report += '## エラー情報\n\n';
120
+ report += '```\n';
121
+ report += result.error || 'Unknown error';
122
+ report += '\n```\n\n';
123
+
124
+ if (result.output) {
125
+ report += '## テスト出力\n\n';
126
+ report += '```\n';
127
+ report += result.output;
128
+ report += '\n```\n\n';
129
+ }
130
+ }
131
+
132
+ return report;
133
+ }
@@ -5,10 +5,17 @@
5
5
 
6
6
  import { existsSync, readFileSync } from 'fs';
7
7
  import { join } from 'path';
8
- import { loadProjectMeta } from './utils/project-meta.js';
9
8
  import { validateFeatureName } from './utils/feature-name-validator.js';
10
9
 
11
- type Phase = 'requirements' | 'design' | 'tasks';
10
+ type Phase =
11
+ | 'requirements'
12
+ | 'design'
13
+ | 'test-type-selection'
14
+ | 'test-spec'
15
+ | 'tasks'
16
+ | 'environment-setup'
17
+ | 'phase-a'
18
+ | 'phase-b';
12
19
 
13
20
  interface ValidationResult {
14
21
  phase: Phase;
@@ -186,10 +193,19 @@ function validateTasks(feature: string): ValidationResult {
186
193
  }
187
194
 
188
195
  // 5. JIRA Story作成チェック(必須)
189
- if (!spec.jira?.stories || spec.jira.stories.created === 0) {
196
+ // spec.jira.storyKeys 配列をチェック(新フォーマット)
197
+ // または spec.jira.stories.created(旧フォーマット)をチェック
198
+ const hasStories = spec.jira?.storyKeys && Array.isArray(spec.jira.storyKeys) && spec.jira.storyKeys.length > 0;
199
+ const hasLegacyStories = spec.jira?.stories && spec.jira.stories.created > 0;
200
+
201
+ if (!hasStories && !hasLegacyStories) {
190
202
  errors.push('❌ JIRA Storyが1つも作成されていません');
191
203
  errors.push(' → 実行: npm run jira:sync <feature>');
192
- } else if (spec.jira.stories.created < spec.jira.stories.total) {
204
+ } else if (spec.jira?.storyKeys && spec.jira.storyKeys.length > 0) {
205
+ // 新フォーマット: storyKeys配列が存在する場合
206
+ // 成功として扱う(警告なし)
207
+ } else if (spec.jira?.stories && spec.jira.stories.created < spec.jira.stories.total) {
208
+ // 旧フォーマット: 一部未作成の場合のみ警告
193
209
  warnings.push(`⚠️ JIRA Storyが一部未作成: ${spec.jira.stories.created}/${spec.jira.stories.total}`);
194
210
  }
195
211
 
@@ -206,6 +222,132 @@ function validateTasks(feature: string): ValidationResult {
206
222
  };
207
223
  }
208
224
 
225
+ /**
226
+ * テストタイプ選択フェーズのバリデーション(Phase 0.3)
227
+ * マニュアル対応フェーズ - バリデーション不要(常に成功)
228
+ */
229
+ function validateTestTypeSelection(feature: string): ValidationResult {
230
+ const errors: string[] = [];
231
+ const warnings: string[] = [];
232
+
233
+ // feature名のバリデーション
234
+ const nameValidation = validateFeatureName(feature);
235
+ if (!nameValidation.valid) {
236
+ errors.push(...nameValidation.errors);
237
+ }
238
+
239
+ warnings.push('⚠️ このフェーズはマニュアル対応です。ガイダンスに従ってテストタイプを選択してください');
240
+
241
+ return {
242
+ phase: 'test-type-selection',
243
+ valid: errors.length === 0,
244
+ errors,
245
+ warnings
246
+ };
247
+ }
248
+
249
+ /**
250
+ * テスト仕様書作成フェーズのバリデーション(Phase 0.4)
251
+ * マニュアル対応フェーズ - バリデーション不要(常に成功)
252
+ */
253
+ function validateTestSpec(feature: string): ValidationResult {
254
+ const errors: string[] = [];
255
+ const warnings: string[] = [];
256
+
257
+ // feature名のバリデーション
258
+ const nameValidation = validateFeatureName(feature);
259
+ if (!nameValidation.valid) {
260
+ errors.push(...nameValidation.errors);
261
+ }
262
+
263
+ // テスト仕様書ディレクトリの存在チェック(任意)
264
+ const testSpecDir = join(process.cwd(), 'docs', 'testing', 'specs', feature);
265
+ if (!existsSync(testSpecDir)) {
266
+ warnings.push('⚠️ テスト仕様書ディレクトリがありません: docs/testing/specs/' + feature);
267
+ }
268
+
269
+ warnings.push('⚠️ このフェーズはマニュアル対応です。テンプレートを使用してテスト仕様書を作成してください');
270
+
271
+ return {
272
+ phase: 'test-spec',
273
+ valid: errors.length === 0,
274
+ errors,
275
+ warnings
276
+ };
277
+ }
278
+
279
+ /**
280
+ * 環境構築フェーズのバリデーション(Phase 1)
281
+ * マニュアル対応フェーズ - バリデーション不要(常に成功)
282
+ */
283
+ function validateEnvironmentSetup(feature: string): ValidationResult {
284
+ const errors: string[] = [];
285
+ const warnings: string[] = [];
286
+
287
+ // feature名のバリデーション
288
+ const nameValidation = validateFeatureName(feature);
289
+ if (!nameValidation.valid) {
290
+ errors.push(...nameValidation.errors);
291
+ }
292
+
293
+ warnings.push('⚠️ このフェーズはマニュアル対応です。環境構築チェックリストを完了してください');
294
+
295
+ return {
296
+ phase: 'environment-setup',
297
+ valid: errors.length === 0,
298
+ errors,
299
+ warnings
300
+ };
301
+ }
302
+
303
+ /**
304
+ * PR前自動テストフェーズのバリデーション(Phase A)
305
+ * CI/CD自動実行 - バリデーション不要(常に成功)
306
+ */
307
+ function validatePhaseA(feature: string): ValidationResult {
308
+ const errors: string[] = [];
309
+ const warnings: string[] = [];
310
+
311
+ // feature名のバリデーション
312
+ const nameValidation = validateFeatureName(feature);
313
+ if (!nameValidation.valid) {
314
+ errors.push(...nameValidation.errors);
315
+ }
316
+
317
+ warnings.push('⚠️ このフェーズはCI/CD自動実行です。PR作成時に自動でテストが実行されます');
318
+
319
+ return {
320
+ phase: 'phase-a',
321
+ valid: errors.length === 0,
322
+ errors,
323
+ warnings
324
+ };
325
+ }
326
+
327
+ /**
328
+ * リリース準備テストフェーズのバリデーション(Phase B)
329
+ * マニュアル対応フェーズ - バリデーション不要(常に成功)
330
+ */
331
+ function validatePhaseB(feature: string): ValidationResult {
332
+ const errors: string[] = [];
333
+ const warnings: string[] = [];
334
+
335
+ // feature名のバリデーション
336
+ const nameValidation = validateFeatureName(feature);
337
+ if (!nameValidation.valid) {
338
+ errors.push(...nameValidation.errors);
339
+ }
340
+
341
+ warnings.push('⚠️ このフェーズはマニュアル対応です。リリース準備テストチェックリストを完了してください');
342
+
343
+ return {
344
+ phase: 'phase-b',
345
+ valid: errors.length === 0,
346
+ errors,
347
+ warnings
348
+ };
349
+ }
350
+
209
351
  /**
210
352
  * フェーズをバリデート
211
353
  */
@@ -221,9 +363,24 @@ export function validatePhase(feature: string, phase: Phase): ValidationResult {
221
363
  case 'design':
222
364
  result = validateDesign(feature);
223
365
  break;
366
+ case 'test-type-selection':
367
+ result = validateTestTypeSelection(feature);
368
+ break;
369
+ case 'test-spec':
370
+ result = validateTestSpec(feature);
371
+ break;
224
372
  case 'tasks':
225
373
  result = validateTasks(feature);
226
374
  break;
375
+ case 'environment-setup':
376
+ result = validateEnvironmentSetup(feature);
377
+ break;
378
+ case 'phase-a':
379
+ result = validatePhaseA(feature);
380
+ break;
381
+ case 'phase-b':
382
+ result = validatePhaseB(feature);
383
+ break;
227
384
  default:
228
385
  throw new Error(`Unknown phase: ${phase}`);
229
386
  }
@@ -257,14 +414,34 @@ if (import.meta.url === `file://${process.argv[1]}`) {
257
414
  if (args.length < 2) {
258
415
  console.error('Usage: npm run validate:phase <feature> <phase>');
259
416
  console.error('Example: npm run validate:phase calculator-app requirements');
260
- console.error('Phases: requirements, design, tasks');
417
+ console.error('\nAvailable Phases:');
418
+ console.error(' requirements - Phase 0.1: 要件定義');
419
+ console.error(' design - Phase 0.2: 設計');
420
+ console.error(' test-type-selection- Phase 0.3: テストタイプ選択(任意)');
421
+ console.error(' test-spec - Phase 0.4: テスト仕様書作成(任意)');
422
+ console.error(' tasks - Phase 0.5-0.6: タスク分割・JIRA同期');
423
+ console.error(' environment-setup - Phase 1: 環境構築(任意)');
424
+ console.error(' phase-a - Phase A: PR前自動テスト(任意)');
425
+ console.error(' phase-b - Phase B: リリース準備テスト(任意)');
261
426
  process.exit(1);
262
427
  }
263
-
428
+
264
429
  const [feature, phase] = args;
265
-
266
- if (!['requirements', 'design', 'tasks'].includes(phase)) {
267
- console.error('Invalid phase. Must be: requirements, design, or tasks');
430
+
431
+ const validPhases = [
432
+ 'requirements',
433
+ 'design',
434
+ 'test-type-selection',
435
+ 'test-spec',
436
+ 'tasks',
437
+ 'environment-setup',
438
+ 'phase-a',
439
+ 'phase-b'
440
+ ];
441
+
442
+ if (!validPhases.includes(phase)) {
443
+ console.error(`Invalid phase: ${phase}`);
444
+ console.error('Must be one of: requirements, design, test-type-selection, test-spec, tasks, environment-setup, phase-a, phase-b');
268
445
  process.exit(1);
269
446
  }
270
447
 
@@ -5,9 +5,12 @@
5
5
 
6
6
  import { config } from 'dotenv';
7
7
  import { loadProjectMeta } from './utils/project-meta.js';
8
- import { syncToConfluence } from './confluence-sync.js';
9
- import { syncTasksToJIRA } from './jira-sync.js';
10
- import { createPR } from './pr-automation.js';
8
+ import { syncToConfluence, getConfluenceConfig } from './confluence-sync.js';
9
+ import { syncTasksToJIRA, JIRAClient } from './jira-sync.js';
10
+ import { analyzeLanguage } from './utils/language-detector.js';
11
+ import { executeTests, generateTestReport } from './utils/test-runner.js';
12
+ import { createReleaseNotes } from './utils/release-notes-generator.js';
13
+ import { pollForApproval, waitForManualApproval } from './utils/confluence-approval.js';
11
14
 
12
15
  config();
13
16
 
@@ -94,12 +97,12 @@ export class WorkflowOrchestrator {
94
97
 
95
98
  case 'test':
96
99
  console.log(' Test phase - execute tests');
97
- // TODO: テスト実行とレポート生成
100
+ await this.executeTestPhase();
98
101
  break;
99
-
102
+
100
103
  case 'release':
101
104
  console.log(' Release preparation');
102
- // TODO: リリースノート生成とJIRA Release作成
105
+ await this.executeReleasePhase();
103
106
  break;
104
107
  }
105
108
  }
@@ -120,23 +123,138 @@ export class WorkflowOrchestrator {
120
123
  return Array.isArray(gateList) && gateList.length > 0;
121
124
  }
122
125
 
126
+ /**
127
+ * テストフェーズを実行
128
+ */
129
+ private async executeTestPhase(): Promise<void> {
130
+ // プロジェクトの言語を検出
131
+ const languageInfo = analyzeLanguage(this.config.feature);
132
+ console.log(` Detected language: ${languageInfo.language} (${languageInfo.confidence} confidence)`);
133
+
134
+ // テストを実行
135
+ console.log(' Running tests...');
136
+ const testResult = await executeTests(languageInfo.language);
137
+
138
+ // レポートを生成
139
+ const report = generateTestReport(testResult, this.config.feature);
140
+
141
+ // Confluenceにレポートをアップロード
142
+ try {
143
+ const confluenceConfig = getConfluenceConfig();
144
+ const projectMeta = loadProjectMeta();
145
+ const spaceKey = confluenceConfig.space;
146
+
147
+ // レポートをConfluenceに同期(テスト用のページとして)
148
+ console.log(' Uploading test report to Confluence...');
149
+
150
+ // テストレポートをファイルに保存
151
+ const { writeFileSync, mkdirSync } = await import('fs');
152
+ const { resolve } = await import('path');
153
+ const reportDir = resolve(`.kiro/specs/${this.config.feature}`);
154
+ mkdirSync(reportDir, { recursive: true });
155
+ const reportPath = resolve(reportDir, 'test-report.md');
156
+ writeFileSync(reportPath, report, 'utf-8');
157
+
158
+ console.log(` ✅ Test report saved: ${reportPath}`);
159
+
160
+ if (!testResult.success) {
161
+ throw new Error('Tests failed. Please fix the issues before proceeding.');
162
+ }
163
+ } catch (error: any) {
164
+ console.error(' ❌ Test execution failed:', error.message);
165
+ throw error;
166
+ }
167
+ }
168
+
169
+ /**
170
+ * リリースフェーズを実行
171
+ */
172
+ private async executeReleasePhase(): Promise<void> {
173
+ const projectMeta = loadProjectMeta();
174
+
175
+ // リリースバージョンを決定(環境変数またはデフォルト)
176
+ const version = process.env.RELEASE_VERSION || 'v1.0.0';
177
+
178
+ console.log(` Generating release notes for ${version}...`);
179
+
180
+ // リリースノートを生成
181
+ const releaseNotes = await createReleaseNotes(version);
182
+
183
+ // リリースノートをファイルに保存
184
+ const { writeFileSync, mkdirSync } = await import('fs');
185
+ const { resolve } = await import('path');
186
+ const releaseDir = resolve(`.kiro/specs/${this.config.feature}`);
187
+ mkdirSync(releaseDir, { recursive: true });
188
+ const releaseNotesPath = resolve(releaseDir, `release-notes-${version}.md`);
189
+ writeFileSync(releaseNotesPath, releaseNotes, 'utf-8');
190
+
191
+ console.log(` ✅ Release notes saved: ${releaseNotesPath}`);
192
+
193
+ // JIRA Releaseを作成
194
+ try {
195
+ const jiraConfig = {
196
+ url: process.env.ATLASSIAN_URL || '',
197
+ email: process.env.ATLASSIAN_EMAIL || '',
198
+ apiToken: process.env.ATLASSIAN_API_TOKEN || ''
199
+ };
200
+
201
+ const jiraClient = new JIRAClient(jiraConfig);
202
+
203
+ console.log(' Creating JIRA Release...');
204
+
205
+ // JIRA Release作成APIを呼び出し
206
+ // Note: JIRAClientにcreateVersionメソッドを追加する必要があります
207
+ console.log(' ℹ️ JIRA Release creation is pending JIRAClient enhancement');
208
+ console.log(` 📋 Manual action required: Create release ${version} in JIRA`);
209
+ console.log(` 📄 Release notes: ${releaseNotesPath}`);
210
+ } catch (error: any) {
211
+ console.warn(' ⚠️ Failed to create JIRA Release:', error.message);
212
+ console.log(' 📋 Please create the release manually in JIRA');
213
+ }
214
+ }
215
+
123
216
  /**
124
217
  * 承認を待つ
125
218
  */
126
219
  private async waitForApproval(stage: WorkflowStage): Promise<void> {
127
220
  console.log(`\n⏸️ Approval required for: ${stage}`);
128
-
221
+
129
222
  const approvers = this.config.approvalGates?.[stage as keyof typeof this.config.approvalGates];
130
223
  if (approvers) {
131
224
  console.log(` Approvers: ${approvers.join(', ')}`);
132
225
  }
133
-
226
+
134
227
  console.log(' ✅ Confluence で承認してください');
135
228
  console.log(' ⏳ 承認完了後、次のステージに進みます');
136
-
137
- // TODO: Confluence APIで承認状態をポーリング
138
- // 現在は手動確認
139
- console.log(' (手動で承認を確認してください)');
229
+
230
+ // Confluence自動ポーリングが有効な場合
231
+ if (process.env.CONFLUENCE_AUTO_POLL === 'true') {
232
+ try {
233
+ const confluenceConfig = getConfluenceConfig();
234
+
235
+ // TODO: ステージに応じたページIDを取得する必要があります
236
+ // 現在は環境変数から取得
237
+ const pageId = process.env.CONFLUENCE_APPROVAL_PAGE_ID;
238
+
239
+ if (!pageId) {
240
+ console.log(' ℹ️ CONFLUENCE_APPROVAL_PAGE_ID not set, falling back to manual approval');
241
+ waitForManualApproval('', approvers || []);
242
+ return;
243
+ }
244
+
245
+ console.log(' 🔄 Polling for approval...');
246
+ const status = await pollForApproval(pageId, confluenceConfig);
247
+
248
+ console.log(` ✅ Approved by: ${status.approvers.join(', ')}`);
249
+ } catch (error: any) {
250
+ console.error(' ❌ Approval polling failed:', error.message);
251
+ throw error;
252
+ }
253
+ } else {
254
+ // 手動承認
255
+ waitForManualApproval('', approvers || []);
256
+ console.log(' (手動で承認を確認してください)');
257
+ }
140
258
  }
141
259
  }
142
260
 
@@ -0,0 +1,54 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - "v*"
9
+ pull_request:
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+
15
+ strategy:
16
+ matrix:
17
+ java-version: [17, 21]
18
+
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Setup JDK ${{ matrix.java-version }}
24
+ uses: actions/setup-java@v4
25
+ with:
26
+ distribution: "temurin"
27
+ java-version: ${{ matrix.java-version }}
28
+ cache: "gradle"
29
+
30
+ - name: Grant execute permission for gradlew
31
+ run: chmod +x gradlew
32
+
33
+ - name: Run checkstyle
34
+ run: ./gradlew checkstyleMain checkstyleTest
35
+
36
+ - name: Run tests
37
+ run: ./gradlew test
38
+
39
+ - name: Build
40
+ run: ./gradlew build
41
+
42
+ - name: Upload test results
43
+ uses: actions/upload-artifact@v4
44
+ if: failure()
45
+ with:
46
+ name: test-results
47
+ path: build/reports/tests/test/
48
+
49
+ - name: Upload coverage
50
+ uses: codecov/codecov-action@v3
51
+ if: matrix.java-version == '21'
52
+ with:
53
+ files: ./build/reports/jacoco/test/jacocoTestReport.xml
54
+ fail_ci_if_error: false
@@ -0,0 +1,46 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - 'v*'
9
+ pull_request:
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+
15
+ strategy:
16
+ matrix:
17
+ node-version: [18.x, 20.x]
18
+
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Setup Node.js ${{ matrix.node-version }}
24
+ uses: actions/setup-node@v4
25
+ with:
26
+ node-version: ${{ matrix.node-version }}
27
+ cache: 'npm'
28
+
29
+ - name: Install dependencies
30
+ run: npm ci
31
+
32
+ - name: Run lint
33
+ run: npm run lint
34
+
35
+ - name: Run tests
36
+ run: npm test
37
+
38
+ - name: Build
39
+ run: npm run build
40
+
41
+ - name: Upload coverage
42
+ uses: codecov/codecov-action@v3
43
+ if: matrix.node-version == '20.x'
44
+ with:
45
+ files: ./coverage/coverage-final.json
46
+ fail_ci_if_error: false
@@ -0,0 +1,52 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - 'v*'
9
+ pull_request:
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+
15
+ strategy:
16
+ matrix:
17
+ php-version: ['8.1', '8.2', '8.3']
18
+
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Setup PHP ${{ matrix.php-version }}
24
+ uses: shivammathur/setup-php@v2
25
+ with:
26
+ php-version: ${{ matrix.php-version }}
27
+ coverage: xdebug
28
+ tools: composer:v2
29
+
30
+ - name: Cache Composer packages
31
+ uses: actions/cache@v3
32
+ with:
33
+ path: vendor
34
+ key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
35
+ restore-keys: |
36
+ ${{ runner.os }}-php-
37
+
38
+ - name: Install dependencies
39
+ run: composer install --prefer-dist --no-progress
40
+
41
+ - name: Run PHPStan
42
+ run: composer phpstan
43
+
44
+ - name: Run tests
45
+ run: composer test
46
+
47
+ - name: Upload coverage
48
+ uses: codecov/codecov-action@v3
49
+ if: matrix.php-version == '8.3'
50
+ with:
51
+ files: ./coverage.xml
52
+ fail_ci_if_error: false