@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,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,18 @@
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';
9
+ import { loadConfig } from './utils/config-loader.js';
10
10
 
11
- type Phase = 'requirements' | 'design' | 'tasks';
11
+ type Phase =
12
+ | 'requirements'
13
+ | 'design'
14
+ | 'test-type-selection'
15
+ | 'test-spec'
16
+ | 'tasks'
17
+ | 'environment-setup'
18
+ | 'phase-a'
19
+ | 'phase-b';
12
20
 
13
21
  interface ValidationResult {
14
22
  phase: Phase;
@@ -152,11 +160,28 @@ function validateTasks(feature: string): ValidationResult {
152
160
  if (!existsSync(tasksPath)) {
153
161
  errors.push('❌ tasks.md が作成されていません');
154
162
  } else {
155
- // 営業日表記チェック
163
+ // 設定読み込み(バリデーション設定)
164
+ let config;
165
+ try {
166
+ config = loadConfig();
167
+ } catch {
168
+ // 設定ファイルの読み込みエラーは無視(デフォルト設定を使用)
169
+ config = { validation: { weekdayNotation: true } };
170
+ }
171
+
172
+ // 営業日表記チェック(設定で無効化可能)
156
173
  const tasksContent = readFileSync(tasksPath, 'utf-8');
157
- if (!tasksContent.includes('(月)') && !tasksContent.includes('(火)')) {
158
- warnings.push('⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません');
174
+
175
+ if (config.validation?.weekdayNotation !== false) {
176
+ // 日本語または英語の曜日表記をチェック
177
+ const hasJapaneseWeekday = ['(月)', '(火)'].some(p => tasksContent.includes(p));
178
+ const hasEnglishWeekday = ['(Mon)', '(Tue)'].some(p => tasksContent.includes(p));
179
+
180
+ if (!hasJapaneseWeekday && !hasEnglishWeekday) {
181
+ warnings.push('⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません');
182
+ }
159
183
  }
184
+
160
185
  if (!tasksContent.includes('Day 1') && !tasksContent.includes('Day1')) {
161
186
  warnings.push('⚠️ tasks.mdに営業日カウント(Day 1, Day 2...)が含まれていません');
162
187
  }
@@ -186,10 +211,19 @@ function validateTasks(feature: string): ValidationResult {
186
211
  }
187
212
 
188
213
  // 5. JIRA Story作成チェック(必須)
189
- if (!spec.jira?.stories || spec.jira.stories.created === 0) {
214
+ // spec.jira.storyKeys 配列をチェック(新フォーマット)
215
+ // または spec.jira.stories.created(旧フォーマット)をチェック
216
+ const hasStories = spec.jira?.storyKeys && Array.isArray(spec.jira.storyKeys) && spec.jira.storyKeys.length > 0;
217
+ const hasLegacyStories = spec.jira?.stories && spec.jira.stories.created > 0;
218
+
219
+ if (!hasStories && !hasLegacyStories) {
190
220
  errors.push('❌ JIRA Storyが1つも作成されていません');
191
221
  errors.push(' → 実行: npm run jira:sync <feature>');
192
- } else if (spec.jira.stories.created < spec.jira.stories.total) {
222
+ } else if (spec.jira?.storyKeys && spec.jira.storyKeys.length > 0) {
223
+ // 新フォーマット: storyKeys配列が存在する場合
224
+ // 成功として扱う(警告なし)
225
+ } else if (spec.jira?.stories && spec.jira.stories.created < spec.jira.stories.total) {
226
+ // 旧フォーマット: 一部未作成の場合のみ警告
193
227
  warnings.push(`⚠️ JIRA Storyが一部未作成: ${spec.jira.stories.created}/${spec.jira.stories.total}`);
194
228
  }
195
229
 
@@ -206,6 +240,132 @@ function validateTasks(feature: string): ValidationResult {
206
240
  };
207
241
  }
208
242
 
243
+ /**
244
+ * テストタイプ選択フェーズのバリデーション(Phase 0.3)
245
+ * マニュアル対応フェーズ - バリデーション不要(常に成功)
246
+ */
247
+ function validateTestTypeSelection(feature: string): ValidationResult {
248
+ const errors: string[] = [];
249
+ const warnings: string[] = [];
250
+
251
+ // feature名のバリデーション
252
+ const nameValidation = validateFeatureName(feature);
253
+ if (!nameValidation.valid) {
254
+ errors.push(...nameValidation.errors);
255
+ }
256
+
257
+ warnings.push('⚠️ このフェーズはマニュアル対応です。ガイダンスに従ってテストタイプを選択してください');
258
+
259
+ return {
260
+ phase: 'test-type-selection',
261
+ valid: errors.length === 0,
262
+ errors,
263
+ warnings
264
+ };
265
+ }
266
+
267
+ /**
268
+ * テスト仕様書作成フェーズのバリデーション(Phase 0.4)
269
+ * マニュアル対応フェーズ - バリデーション不要(常に成功)
270
+ */
271
+ function validateTestSpec(feature: string): ValidationResult {
272
+ const errors: string[] = [];
273
+ const warnings: string[] = [];
274
+
275
+ // feature名のバリデーション
276
+ const nameValidation = validateFeatureName(feature);
277
+ if (!nameValidation.valid) {
278
+ errors.push(...nameValidation.errors);
279
+ }
280
+
281
+ // テスト仕様書ディレクトリの存在チェック(任意)
282
+ const testSpecDir = join(process.cwd(), 'docs', 'testing', 'specs', feature);
283
+ if (!existsSync(testSpecDir)) {
284
+ warnings.push('⚠️ テスト仕様書ディレクトリがありません: docs/testing/specs/' + feature);
285
+ }
286
+
287
+ warnings.push('⚠️ このフェーズはマニュアル対応です。テンプレートを使用してテスト仕様書を作成してください');
288
+
289
+ return {
290
+ phase: 'test-spec',
291
+ valid: errors.length === 0,
292
+ errors,
293
+ warnings
294
+ };
295
+ }
296
+
297
+ /**
298
+ * 環境構築フェーズのバリデーション(Phase 1)
299
+ * マニュアル対応フェーズ - バリデーション不要(常に成功)
300
+ */
301
+ function validateEnvironmentSetup(feature: string): ValidationResult {
302
+ const errors: string[] = [];
303
+ const warnings: string[] = [];
304
+
305
+ // feature名のバリデーション
306
+ const nameValidation = validateFeatureName(feature);
307
+ if (!nameValidation.valid) {
308
+ errors.push(...nameValidation.errors);
309
+ }
310
+
311
+ warnings.push('⚠️ このフェーズはマニュアル対応です。環境構築チェックリストを完了してください');
312
+
313
+ return {
314
+ phase: 'environment-setup',
315
+ valid: errors.length === 0,
316
+ errors,
317
+ warnings
318
+ };
319
+ }
320
+
321
+ /**
322
+ * PR前自動テストフェーズのバリデーション(Phase A)
323
+ * CI/CD自動実行 - バリデーション不要(常に成功)
324
+ */
325
+ function validatePhaseA(feature: string): ValidationResult {
326
+ const errors: string[] = [];
327
+ const warnings: string[] = [];
328
+
329
+ // feature名のバリデーション
330
+ const nameValidation = validateFeatureName(feature);
331
+ if (!nameValidation.valid) {
332
+ errors.push(...nameValidation.errors);
333
+ }
334
+
335
+ warnings.push('⚠️ このフェーズはCI/CD自動実行です。PR作成時に自動でテストが実行されます');
336
+
337
+ return {
338
+ phase: 'phase-a',
339
+ valid: errors.length === 0,
340
+ errors,
341
+ warnings
342
+ };
343
+ }
344
+
345
+ /**
346
+ * リリース準備テストフェーズのバリデーション(Phase B)
347
+ * マニュアル対応フェーズ - バリデーション不要(常に成功)
348
+ */
349
+ function validatePhaseB(feature: string): ValidationResult {
350
+ const errors: string[] = [];
351
+ const warnings: string[] = [];
352
+
353
+ // feature名のバリデーション
354
+ const nameValidation = validateFeatureName(feature);
355
+ if (!nameValidation.valid) {
356
+ errors.push(...nameValidation.errors);
357
+ }
358
+
359
+ warnings.push('⚠️ このフェーズはマニュアル対応です。リリース準備テストチェックリストを完了してください');
360
+
361
+ return {
362
+ phase: 'phase-b',
363
+ valid: errors.length === 0,
364
+ errors,
365
+ warnings
366
+ };
367
+ }
368
+
209
369
  /**
210
370
  * フェーズをバリデート
211
371
  */
@@ -221,9 +381,24 @@ export function validatePhase(feature: string, phase: Phase): ValidationResult {
221
381
  case 'design':
222
382
  result = validateDesign(feature);
223
383
  break;
384
+ case 'test-type-selection':
385
+ result = validateTestTypeSelection(feature);
386
+ break;
387
+ case 'test-spec':
388
+ result = validateTestSpec(feature);
389
+ break;
224
390
  case 'tasks':
225
391
  result = validateTasks(feature);
226
392
  break;
393
+ case 'environment-setup':
394
+ result = validateEnvironmentSetup(feature);
395
+ break;
396
+ case 'phase-a':
397
+ result = validatePhaseA(feature);
398
+ break;
399
+ case 'phase-b':
400
+ result = validatePhaseB(feature);
401
+ break;
227
402
  default:
228
403
  throw new Error(`Unknown phase: ${phase}`);
229
404
  }
@@ -257,14 +432,34 @@ if (import.meta.url === `file://${process.argv[1]}`) {
257
432
  if (args.length < 2) {
258
433
  console.error('Usage: npm run validate:phase <feature> <phase>');
259
434
  console.error('Example: npm run validate:phase calculator-app requirements');
260
- console.error('Phases: requirements, design, tasks');
435
+ console.error('\nAvailable Phases:');
436
+ console.error(' requirements - Phase 0.1: 要件定義');
437
+ console.error(' design - Phase 0.2: 設計');
438
+ console.error(' test-type-selection- Phase 0.3: テストタイプ選択(任意)');
439
+ console.error(' test-spec - Phase 0.4: テスト仕様書作成(任意)');
440
+ console.error(' tasks - Phase 0.5-0.6: タスク分割・JIRA同期');
441
+ console.error(' environment-setup - Phase 1: 環境構築(任意)');
442
+ console.error(' phase-a - Phase A: PR前自動テスト(任意)');
443
+ console.error(' phase-b - Phase B: リリース準備テスト(任意)');
261
444
  process.exit(1);
262
445
  }
263
-
446
+
264
447
  const [feature, phase] = args;
265
-
266
- if (!['requirements', 'design', 'tasks'].includes(phase)) {
267
- console.error('Invalid phase. Must be: requirements, design, or tasks');
448
+
449
+ const validPhases = [
450
+ 'requirements',
451
+ 'design',
452
+ 'test-type-selection',
453
+ 'test-spec',
454
+ 'tasks',
455
+ 'environment-setup',
456
+ 'phase-a',
457
+ 'phase-b'
458
+ ];
459
+
460
+ if (!validPhases.includes(phase)) {
461
+ console.error(`Invalid phase: ${phase}`);
462
+ console.error('Must be one of: requirements, design, test-type-selection, test-spec, tasks, environment-setup, phase-a, phase-b');
268
463
  process.exit(1);
269
464
  }
270
465
 
@@ -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