@sk8metal/michi-cli 0.4.0 → 0.7.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 (321) hide show
  1. package/CHANGELOG.md +162 -1
  2. package/README.md +2 -1
  3. package/dist/scripts/config/config-schema.d.ts +87 -0
  4. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  5. package/dist/scripts/config/config-schema.js +81 -0
  6. package/dist/scripts/config/config-schema.js.map +1 -1
  7. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  8. package/dist/scripts/confluence-sync.js +15 -2
  9. package/dist/scripts/confluence-sync.js.map +1 -1
  10. package/dist/scripts/github-actions-client.d.ts +79 -0
  11. package/dist/scripts/github-actions-client.d.ts.map +1 -0
  12. package/dist/scripts/github-actions-client.js +182 -0
  13. package/dist/scripts/github-actions-client.js.map +1 -0
  14. package/dist/scripts/health-check-service.d.ts +46 -0
  15. package/dist/scripts/health-check-service.d.ts.map +1 -0
  16. package/dist/scripts/health-check-service.js +114 -0
  17. package/dist/scripts/health-check-service.js.map +1 -0
  18. package/dist/scripts/markdown-to-confluence.d.ts.map +1 -1
  19. package/dist/scripts/markdown-to-confluence.js +25 -3
  20. package/dist/scripts/markdown-to-confluence.js.map +1 -1
  21. package/dist/scripts/mermaid-converter.d.ts +24 -0
  22. package/dist/scripts/mermaid-converter.d.ts.map +1 -0
  23. package/dist/scripts/mermaid-converter.js +49 -0
  24. package/dist/scripts/mermaid-converter.js.map +1 -0
  25. package/dist/scripts/pr-automation.d.ts.map +1 -1
  26. package/dist/scripts/pr-automation.js +11 -3
  27. package/dist/scripts/pr-automation.js.map +1 -1
  28. package/dist/scripts/spec-impl-workflow.d.ts.map +1 -1
  29. package/dist/scripts/spec-impl-workflow.js +22 -6
  30. package/dist/scripts/spec-impl-workflow.js.map +1 -1
  31. package/dist/scripts/template/multi-repo-renderer.d.ts +67 -0
  32. package/dist/scripts/template/multi-repo-renderer.d.ts.map +1 -0
  33. package/dist/scripts/template/multi-repo-renderer.js +123 -0
  34. package/dist/scripts/template/multi-repo-renderer.js.map +1 -0
  35. package/dist/scripts/template/renderer.d.ts +4 -0
  36. package/dist/scripts/template/renderer.d.ts.map +1 -1
  37. package/dist/scripts/template/renderer.js.map +1 -1
  38. package/dist/scripts/test-execution-generator.d.ts.map +1 -1
  39. package/dist/scripts/test-execution-generator.js +94 -11
  40. package/dist/scripts/test-execution-generator.js.map +1 -1
  41. package/dist/scripts/test-script-runner.d.ts +33 -0
  42. package/dist/scripts/test-script-runner.d.ts.map +1 -0
  43. package/dist/scripts/test-script-runner.js +77 -0
  44. package/dist/scripts/test-script-runner.js.map +1 -0
  45. package/dist/scripts/utils/config-loader.d.ts +31 -5
  46. package/dist/scripts/utils/config-loader.d.ts.map +1 -1
  47. package/dist/scripts/utils/config-loader.js +363 -50
  48. package/dist/scripts/utils/config-loader.js.map +1 -1
  49. package/dist/scripts/utils/env-config.d.ts +1 -1
  50. package/dist/scripts/utils/env-config.d.ts.map +1 -1
  51. package/dist/scripts/utils/env-config.js +2 -14
  52. package/dist/scripts/utils/env-config.js.map +1 -1
  53. package/dist/scripts/utils/multi-repo-validator.d.ts +30 -0
  54. package/dist/scripts/utils/multi-repo-validator.d.ts.map +1 -0
  55. package/dist/scripts/utils/multi-repo-validator.js +105 -0
  56. package/dist/scripts/utils/multi-repo-validator.js.map +1 -0
  57. package/dist/scripts/utils/project-meta.d.ts +9 -0
  58. package/dist/scripts/utils/project-meta.d.ts.map +1 -1
  59. package/dist/scripts/utils/project-meta.js +22 -0
  60. package/dist/scripts/utils/project-meta.js.map +1 -1
  61. package/dist/scripts/utils/security-validator.d.ts +55 -0
  62. package/dist/scripts/utils/security-validator.d.ts.map +1 -0
  63. package/dist/scripts/utils/security-validator.js +232 -0
  64. package/dist/scripts/utils/security-validator.js.map +1 -0
  65. package/dist/scripts/utils/spec-archiver.d.ts +38 -0
  66. package/dist/scripts/utils/spec-archiver.d.ts.map +1 -0
  67. package/dist/scripts/utils/spec-archiver.js +210 -0
  68. package/dist/scripts/utils/spec-archiver.js.map +1 -0
  69. package/dist/scripts/utils/spec-updater.d.ts +4 -0
  70. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  71. package/dist/scripts/utils/spec-updater.js.map +1 -1
  72. package/dist/src/cli.d.ts.map +1 -1
  73. package/dist/src/cli.js +303 -17
  74. package/dist/src/cli.js.map +1 -1
  75. package/dist/src/commands/config-validate.d.ts +9 -0
  76. package/dist/src/commands/config-validate.d.ts.map +1 -0
  77. package/dist/src/commands/config-validate.js +90 -0
  78. package/dist/src/commands/config-validate.js.map +1 -0
  79. package/dist/src/commands/init.d.ts +1 -0
  80. package/dist/src/commands/init.d.ts.map +1 -1
  81. package/dist/src/commands/init.js +29 -6
  82. package/dist/src/commands/init.js.map +1 -1
  83. package/dist/src/commands/migrate.d.ts +25 -0
  84. package/dist/src/commands/migrate.d.ts.map +1 -0
  85. package/dist/src/commands/migrate.js +341 -0
  86. package/dist/src/commands/migrate.js.map +1 -0
  87. package/dist/src/commands/multi-repo-add-repo.d.ts +26 -0
  88. package/dist/src/commands/multi-repo-add-repo.d.ts.map +1 -0
  89. package/dist/src/commands/multi-repo-add-repo.js +56 -0
  90. package/dist/src/commands/multi-repo-add-repo.js.map +1 -0
  91. package/dist/src/commands/multi-repo-ci-status.d.ts +46 -0
  92. package/dist/src/commands/multi-repo-ci-status.d.ts.map +1 -0
  93. package/dist/src/commands/multi-repo-ci-status.js +285 -0
  94. package/dist/src/commands/multi-repo-ci-status.js.map +1 -0
  95. package/dist/src/commands/multi-repo-confluence-sync.d.ts +45 -0
  96. package/dist/src/commands/multi-repo-confluence-sync.d.ts.map +1 -0
  97. package/dist/src/commands/multi-repo-confluence-sync.js +135 -0
  98. package/dist/src/commands/multi-repo-confluence-sync.js.map +1 -0
  99. package/dist/src/commands/multi-repo-init.d.ts +26 -0
  100. package/dist/src/commands/multi-repo-init.d.ts.map +1 -0
  101. package/dist/src/commands/multi-repo-init.js +101 -0
  102. package/dist/src/commands/multi-repo-init.js.map +1 -0
  103. package/dist/src/commands/multi-repo-list.d.ts +28 -0
  104. package/dist/src/commands/multi-repo-list.d.ts.map +1 -0
  105. package/dist/src/commands/multi-repo-list.js +38 -0
  106. package/dist/src/commands/multi-repo-list.js.map +1 -0
  107. package/dist/src/commands/multi-repo-test.d.ts +56 -0
  108. package/dist/src/commands/multi-repo-test.d.ts.map +1 -0
  109. package/dist/src/commands/multi-repo-test.js +70 -0
  110. package/dist/src/commands/multi-repo-test.js.map +1 -0
  111. package/dist/src/commands/setup-existing.d.ts.map +1 -1
  112. package/dist/src/commands/setup-existing.js +0 -1
  113. package/dist/src/commands/setup-existing.js.map +1 -1
  114. package/dist/src/commands/spec-archive.d.ts +17 -0
  115. package/dist/src/commands/spec-archive.d.ts.map +1 -0
  116. package/dist/src/commands/spec-archive.js +40 -0
  117. package/dist/src/commands/spec-archive.js.map +1 -0
  118. package/dist/src/commands/spec-list.d.ts +15 -0
  119. package/dist/src/commands/spec-list.d.ts.map +1 -0
  120. package/dist/src/commands/spec-list.js +55 -0
  121. package/dist/src/commands/spec-list.js.map +1 -0
  122. package/dist/vitest.config.d.ts.map +1 -1
  123. package/dist/vitest.config.js +32 -8
  124. package/dist/vitest.config.js.map +1 -1
  125. package/docs/michi-development/design/config-unification.md +4789 -0
  126. package/docs/user-guide/getting-started/github-token-setup.md +2 -1
  127. package/docs/user-guide/getting-started/new-repository-setup.md +1 -1
  128. package/docs/user-guide/getting-started/quick-start.md +1 -1
  129. package/docs/user-guide/getting-started/setup.md +4 -11
  130. package/docs/user-guide/guides/multi-repo-guide.md +591 -0
  131. package/docs/user-guide/guides/multi-repo-migration-guide.md +516 -0
  132. package/docs/user-guide/hands-on/claude-agent-setup.md +2 -2
  133. package/docs/user-guide/hands-on/claude-setup.md +2 -2
  134. package/docs/user-guide/hands-on/cursor-setup.md +2 -2
  135. package/docs/user-guide/hands-on/workflow-walkthrough.md +4 -1
  136. package/docs/user-guide/reference/multi-repo-api.md +771 -0
  137. package/docs/user-guide/reference/quick-reference.md +22 -37
  138. package/env.example +1 -1
  139. package/package.json +2 -5
  140. package/scripts/__tests__/config-loader-multi-repo.test.ts +342 -0
  141. package/scripts/__tests__/github-actions-client.test.ts +543 -0
  142. package/scripts/__tests__/health-check-service.test.ts +142 -0
  143. package/scripts/__tests__/markdown-to-confluence.test.ts +262 -0
  144. package/scripts/__tests__/mermaid-converter.test.ts +236 -0
  145. package/scripts/__tests__/multi-repo-config-schema.test.ts +335 -0
  146. package/scripts/__tests__/multi-repo-validator.test.ts +524 -0
  147. package/scripts/__tests__/spec-archiver.test.ts +512 -0
  148. package/scripts/__tests__/spec-impl-workflow.test.ts +5 -2
  149. package/scripts/__tests__/test-script-runner.test.ts +217 -0
  150. package/scripts/config/config-schema.ts +104 -0
  151. package/scripts/confluence-sync.ts +16 -2
  152. package/scripts/github-actions-client.ts +258 -0
  153. package/scripts/health-check-service.ts +171 -0
  154. package/scripts/markdown-to-confluence.ts +37 -6
  155. package/scripts/mermaid-converter.ts +56 -0
  156. package/scripts/pr-automation.ts +15 -5
  157. package/scripts/spec-impl-workflow.ts +22 -6
  158. package/scripts/template/__tests__/multi-repo-renderer.test.ts +261 -0
  159. package/scripts/template/multi-repo-renderer.ts +172 -0
  160. package/scripts/template/renderer.ts +5 -0
  161. package/scripts/test-execution-generator.ts +104 -11
  162. package/scripts/test-script-runner.ts +130 -0
  163. package/scripts/utils/__tests__/config-loader.test.ts +149 -0
  164. package/scripts/utils/__tests__/config-validator.test.ts +106 -6
  165. package/scripts/utils/__tests__/env-config.test.ts +0 -2
  166. package/scripts/utils/__tests__/multi-repo-validator.test.ts +335 -0
  167. package/scripts/utils/__tests__/project-meta.test.ts +192 -0
  168. package/scripts/utils/__tests__/security-validator.test.ts +272 -0
  169. package/scripts/utils/config-loader.ts +429 -56
  170. package/scripts/utils/env-config.ts +2 -14
  171. package/scripts/utils/multi-repo-validator.ts +141 -0
  172. package/scripts/utils/project-meta.ts +27 -0
  173. package/scripts/utils/security-validator.ts +286 -0
  174. package/scripts/utils/spec-archiver.ts +260 -0
  175. package/scripts/utils/spec-updater.ts +4 -0
  176. package/templates/claude/agents/pr-size-monitor/AGENT.md +330 -0
  177. package/templates/claude/commands/kiro/kiro-spec-impl.md +1 -1
  178. package/templates/claude/commands/michi/spec-impl.md +208 -35
  179. package/templates/claude-agent/commands/kiro/kiro-spec-impl.md +1 -1
  180. package/templates/cursor/commands/kiro/kiro-spec-impl.md +1 -1
  181. package/templates/multi-repo/docs/ci-status.md +51 -0
  182. package/templates/multi-repo/docs/release-notes.md +99 -0
  183. package/templates/multi-repo/overview/architecture.md +102 -0
  184. package/templates/multi-repo/overview/requirements.md +68 -0
  185. package/templates/multi-repo/overview/sequence.md +79 -0
  186. package/templates/multi-repo/steering/multi-repo.md +74 -0
  187. package/templates/multi-repo/tests/strategy.md +89 -0
  188. package/dist/scripts/__tests__/create-project.test.d.ts +0 -2
  189. package/dist/scripts/__tests__/create-project.test.d.ts.map +0 -1
  190. package/dist/scripts/__tests__/create-project.test.js +0 -243
  191. package/dist/scripts/__tests__/create-project.test.js.map +0 -1
  192. package/dist/scripts/__tests__/jira-transitions.test.d.ts +0 -5
  193. package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +0 -1
  194. package/dist/scripts/__tests__/jira-transitions.test.js +0 -172
  195. package/dist/scripts/__tests__/jira-transitions.test.js.map +0 -1
  196. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts +0 -2
  197. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts.map +0 -1
  198. package/dist/scripts/__tests__/multi-project-estimate.test.js +0 -118
  199. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +0 -1
  200. package/dist/scripts/__tests__/setup-existing-project.test.d.ts +0 -2
  201. package/dist/scripts/__tests__/setup-existing-project.test.d.ts.map +0 -1
  202. package/dist/scripts/__tests__/setup-existing-project.test.js +0 -208
  203. package/dist/scripts/__tests__/setup-existing-project.test.js.map +0 -1
  204. package/dist/scripts/__tests__/setup-interactive.test.d.ts +0 -2
  205. package/dist/scripts/__tests__/setup-interactive.test.d.ts.map +0 -1
  206. package/dist/scripts/__tests__/setup-interactive.test.js +0 -166
  207. package/dist/scripts/__tests__/setup-interactive.test.js.map +0 -1
  208. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +0 -5
  209. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +0 -1
  210. package/dist/scripts/__tests__/spec-impl-workflow.test.js +0 -321
  211. package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +0 -1
  212. package/dist/scripts/__tests__/spec-loader.test.d.ts +0 -5
  213. package/dist/scripts/__tests__/spec-loader.test.d.ts.map +0 -1
  214. package/dist/scripts/__tests__/spec-loader.test.js +0 -153
  215. package/dist/scripts/__tests__/spec-loader.test.js.map +0 -1
  216. package/dist/scripts/__tests__/validate-phase.test.d.ts +0 -5
  217. package/dist/scripts/__tests__/validate-phase.test.d.ts.map +0 -1
  218. package/dist/scripts/__tests__/validate-phase.test.js +0 -249
  219. package/dist/scripts/__tests__/validate-phase.test.js.map +0 -1
  220. package/dist/scripts/constants/__tests__/environments.test.d.ts +0 -2
  221. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +0 -1
  222. package/dist/scripts/constants/__tests__/environments.test.js +0 -125
  223. package/dist/scripts/constants/__tests__/environments.test.js.map +0 -1
  224. package/dist/scripts/constants/__tests__/languages.test.d.ts +0 -2
  225. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +0 -1
  226. package/dist/scripts/constants/__tests__/languages.test.js +0 -82
  227. package/dist/scripts/constants/__tests__/languages.test.js.map +0 -1
  228. package/dist/scripts/create-project.d.ts +0 -16
  229. package/dist/scripts/create-project.d.ts.map +0 -1
  230. package/dist/scripts/create-project.js +0 -334
  231. package/dist/scripts/create-project.js.map +0 -1
  232. package/dist/scripts/list-projects.d.ts +0 -7
  233. package/dist/scripts/list-projects.d.ts.map +0 -1
  234. package/dist/scripts/list-projects.js +0 -88
  235. package/dist/scripts/list-projects.js.map +0 -1
  236. package/dist/scripts/template/__tests__/renderer.test.d.ts +0 -2
  237. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +0 -1
  238. package/dist/scripts/template/__tests__/renderer.test.js +0 -165
  239. package/dist/scripts/template/__tests__/renderer.test.js.map +0 -1
  240. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +0 -5
  241. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +0 -1
  242. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +0 -315
  243. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +0 -1
  244. package/dist/scripts/utils/__tests__/business-days.test.d.ts +0 -5
  245. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +0 -1
  246. package/dist/scripts/utils/__tests__/business-days.test.js +0 -171
  247. package/dist/scripts/utils/__tests__/business-days.test.js.map +0 -1
  248. package/dist/scripts/utils/__tests__/config-loader.test.d.ts +0 -5
  249. package/dist/scripts/utils/__tests__/config-loader.test.d.ts.map +0 -1
  250. package/dist/scripts/utils/__tests__/config-loader.test.js +0 -201
  251. package/dist/scripts/utils/__tests__/config-loader.test.js.map +0 -1
  252. package/dist/scripts/utils/__tests__/config-validator.test.d.ts +0 -5
  253. package/dist/scripts/utils/__tests__/config-validator.test.d.ts.map +0 -1
  254. package/dist/scripts/utils/__tests__/config-validator.test.js +0 -394
  255. package/dist/scripts/utils/__tests__/config-validator.test.js.map +0 -1
  256. package/dist/scripts/utils/__tests__/env-config.test.d.ts +0 -5
  257. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +0 -1
  258. package/dist/scripts/utils/__tests__/env-config.test.js +0 -218
  259. package/dist/scripts/utils/__tests__/env-config.test.js.map +0 -1
  260. package/dist/scripts/utils/__tests__/feature-name-validator.test.d.ts +0 -5
  261. package/dist/scripts/utils/__tests__/feature-name-validator.test.d.ts.map +0 -1
  262. package/dist/scripts/utils/__tests__/feature-name-validator.test.js +0 -106
  263. package/dist/scripts/utils/__tests__/feature-name-validator.test.js.map +0 -1
  264. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +0 -5
  265. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +0 -1
  266. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +0 -202
  267. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +0 -1
  268. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts +0 -5
  269. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts.map +0 -1
  270. package/dist/scripts/utils/__tests__/spec-updater.test.js +0 -158
  271. package/dist/scripts/utils/__tests__/spec-updater.test.js.map +0 -1
  272. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +0 -5
  273. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +0 -1
  274. package/dist/scripts/utils/__tests__/tasks-converter.test.js +0 -500
  275. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +0 -1
  276. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +0 -5
  277. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +0 -1
  278. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +0 -314
  279. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +0 -1
  280. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +0 -5
  281. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +0 -1
  282. package/dist/scripts/utils/__tests__/test-runner.test.js +0 -64
  283. package/dist/scripts/utils/__tests__/test-runner.test.js.map +0 -1
  284. package/dist/src/__tests__/cli.test.d.ts +0 -5
  285. package/dist/src/__tests__/cli.test.d.ts.map +0 -1
  286. package/dist/src/__tests__/cli.test.js +0 -58
  287. package/dist/src/__tests__/cli.test.js.map +0 -1
  288. package/dist/src/__tests__/integration/internationalization.test.d.ts +0 -8
  289. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +0 -1
  290. package/dist/src/__tests__/integration/internationalization.test.js +0 -333
  291. package/dist/src/__tests__/integration/internationalization.test.js.map +0 -1
  292. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +0 -5
  293. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +0 -1
  294. package/dist/src/__tests__/integration/setup/claude-agent.test.js +0 -122
  295. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +0 -1
  296. package/dist/src/__tests__/integration/setup/claude.test.d.ts +0 -5
  297. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +0 -1
  298. package/dist/src/__tests__/integration/setup/claude.test.js +0 -193
  299. package/dist/src/__tests__/integration/setup/claude.test.js.map +0 -1
  300. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +0 -5
  301. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +0 -1
  302. package/dist/src/__tests__/integration/setup/cursor.test.js +0 -166
  303. package/dist/src/__tests__/integration/setup/cursor.test.js.map +0 -1
  304. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +0 -32
  305. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +0 -1
  306. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +0 -72
  307. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +0 -1
  308. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +0 -38
  309. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +0 -1
  310. package/dist/src/__tests__/integration/setup/helpers/test-project.js +0 -83
  311. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +0 -1
  312. package/dist/src/__tests__/integration/setup/init.test.d.ts +0 -5
  313. package/dist/src/__tests__/integration/setup/init.test.d.ts.map +0 -1
  314. package/dist/src/__tests__/integration/setup/init.test.js +0 -352
  315. package/dist/src/__tests__/integration/setup/init.test.js.map +0 -1
  316. package/dist/src/__tests__/integration/setup/validation.test.d.ts +0 -5
  317. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +0 -1
  318. package/dist/src/__tests__/integration/setup/validation.test.js +0 -301
  319. package/dist/src/__tests__/integration/setup/validation.test.js.map +0 -1
  320. package/scripts/create-project.ts +0 -386
  321. package/scripts/list-projects.ts +0 -112
@@ -1,394 +0,0 @@
1
- /**
2
- * config-validator.ts のユニットテスト
3
- */
4
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
5
- import { existsSync, writeFileSync, unlinkSync, mkdirSync, rmSync } from 'fs';
6
- import { resolve, join } from 'path';
7
- import { tmpdir } from 'os';
8
- import { validateProjectConfig, validateForConfluenceSync, validateForJiraSync, validateForJiraSyncAsync, } from '../config-validator.js';
9
- import { clearConfigCache } from '../config-loader.js';
10
- import * as jiraFetcher from '../jira-issue-type-fetcher.js';
11
- describe('config-validator', () => {
12
- let testProjectRoot;
13
- let originalEnv;
14
- beforeEach(() => {
15
- // テスト用の一時ディレクトリを作成
16
- testProjectRoot = resolve(tmpdir(), `michi-test-${Date.now()}`);
17
- mkdirSync(testProjectRoot, { recursive: true });
18
- mkdirSync(join(testProjectRoot, '.michi'), { recursive: true });
19
- // 環境変数をバックアップ
20
- originalEnv = { ...process.env };
21
- // キャッシュをクリア
22
- clearConfigCache();
23
- });
24
- afterEach(() => {
25
- // モックをリストア
26
- vi.restoreAllMocks();
27
- // 環境変数を復元
28
- process.env = originalEnv;
29
- // テスト用ディレクトリを削除
30
- if (existsSync(testProjectRoot)) {
31
- // ファイルを削除
32
- const configPath = join(testProjectRoot, '.michi/config.json');
33
- if (existsSync(configPath)) {
34
- unlinkSync(configPath);
35
- }
36
- // ディレクトリを削除
37
- try {
38
- rmSync(testProjectRoot, { recursive: true, force: true });
39
- }
40
- catch {
41
- // 削除失敗は無視
42
- }
43
- }
44
- });
45
- describe('validateProjectConfig', () => {
46
- it('設定ファイルが存在しない場合は情報メッセージを返す', () => {
47
- // .michi/config.jsonが存在しないことを確認
48
- const michiConfigPath = join(testProjectRoot, '.michi/config.json');
49
- if (existsSync(michiConfigPath)) {
50
- unlinkSync(michiConfigPath);
51
- }
52
- const result = validateProjectConfig(testProjectRoot);
53
- expect(result.valid).toBe(true);
54
- expect(result.errors).toHaveLength(0);
55
- expect(result.warnings).toHaveLength(0);
56
- expect(result.info.length).toBeGreaterThan(0);
57
- expect(result.info[0]).toContain('not found');
58
- });
59
- it('有効な設定ファイルの場合は成功', () => {
60
- // .michiディレクトリが存在することを確認
61
- const michiDir = join(testProjectRoot, '.michi');
62
- if (!existsSync(michiDir)) {
63
- mkdirSync(michiDir, { recursive: true });
64
- }
65
- const configPath = join(testProjectRoot, '.michi/config.json');
66
- writeFileSync(configPath, JSON.stringify({
67
- confluence: {
68
- pageCreationGranularity: 'single',
69
- spaces: {
70
- requirements: 'Michi',
71
- },
72
- },
73
- }));
74
- const result = validateProjectConfig(testProjectRoot);
75
- expect(result.valid).toBe(true);
76
- expect(result.errors).toHaveLength(0);
77
- });
78
- it('無効なJSONの場合はエラーを返す', () => {
79
- const configPath = join(testProjectRoot, '.michi/config.json');
80
- writeFileSync(configPath, '{ invalid json }');
81
- const result = validateProjectConfig(testProjectRoot);
82
- expect(result.valid).toBe(false);
83
- expect(result.errors.length).toBeGreaterThan(0);
84
- expect(result.errors[0]).toContain('Invalid JSON');
85
- });
86
- it('by-hierarchyモードでhierarchy設定がない場合はエラー', () => {
87
- const configPath = join(testProjectRoot, '.michi/config.json');
88
- writeFileSync(configPath, JSON.stringify({
89
- confluence: {
90
- pageCreationGranularity: 'by-hierarchy',
91
- },
92
- }));
93
- const result = validateProjectConfig(testProjectRoot);
94
- expect(result.valid).toBe(false);
95
- expect(result.errors.length).toBeGreaterThan(0);
96
- expect(result.errors[0]).toContain('hierarchy');
97
- });
98
- it('selected-phasesモードでselectedPhases設定がない場合はエラー', () => {
99
- const configPath = join(testProjectRoot, '.michi/config.json');
100
- writeFileSync(configPath, JSON.stringify({
101
- jira: {
102
- storyCreationGranularity: 'selected-phases',
103
- },
104
- }));
105
- const result = validateProjectConfig(testProjectRoot);
106
- expect(result.valid).toBe(false);
107
- expect(result.errors.length).toBeGreaterThan(0);
108
- expect(result.errors[0]).toContain('selectedPhases');
109
- });
110
- });
111
- describe('validateForConfluenceSync', () => {
112
- it('spaces設定がない場合は警告を返す', () => {
113
- // 環境変数をクリア
114
- delete process.env.CONFLUENCE_PRD_SPACE;
115
- const configPath = join(testProjectRoot, '.michi/config.json');
116
- writeFileSync(configPath, JSON.stringify({
117
- confluence: {
118
- pageCreationGranularity: 'single',
119
- },
120
- }));
121
- const result = validateForConfluenceSync('requirements', testProjectRoot);
122
- expect(result.valid).toBe(true);
123
- // デフォルト設定がある場合、警告が表示されない可能性がある
124
- // 実際の動作に合わせてテストを調整
125
- if (result.warnings.length > 0) {
126
- expect(result.warnings[0]).toContain('spaces');
127
- }
128
- });
129
- it('spaces設定がある場合は成功', () => {
130
- const configPath = join(testProjectRoot, '.michi/config.json');
131
- writeFileSync(configPath, JSON.stringify({
132
- confluence: {
133
- spaces: {
134
- requirements: 'Michi',
135
- },
136
- },
137
- }));
138
- const result = validateForConfluenceSync('requirements', testProjectRoot);
139
- expect(result.valid).toBe(true);
140
- expect(result.errors).toHaveLength(0);
141
- });
142
- it('by-hierarchyモードでhierarchy設定がない場合はエラー', () => {
143
- // デフォルト設定を上書きするため、hierarchyキーを削除
144
- // デフォルト設定にhierarchyがあるため、実際にはエラーにならない可能性がある
145
- const configPath = join(testProjectRoot, '.michi/config.json');
146
- writeFileSync(configPath, JSON.stringify({
147
- confluence: {
148
- pageCreationGranularity: 'by-hierarchy',
149
- spaces: {
150
- requirements: 'Michi',
151
- },
152
- // hierarchyキーを明示的に削除(デフォルト設定がマージされるため、実際にはエラーにならない)
153
- },
154
- }));
155
- const result = validateForConfluenceSync('requirements', testProjectRoot);
156
- // デフォルト設定にhierarchyがある場合、エラーにならない
157
- // このテストは、デフォルト設定の動作を確認するためのもの
158
- expect(result.valid).toBe(true);
159
- });
160
- it('manualモードでstructure設定がない場合はエラー', () => {
161
- const configPath = join(testProjectRoot, '.michi/config.json');
162
- writeFileSync(configPath, JSON.stringify({
163
- confluence: {
164
- pageCreationGranularity: 'manual',
165
- hierarchy: {
166
- mode: 'simple',
167
- },
168
- },
169
- }));
170
- const result = validateForConfluenceSync('requirements', testProjectRoot);
171
- expect(result.valid).toBe(false);
172
- expect(result.errors.length).toBeGreaterThan(0);
173
- expect(result.errors[0]).toContain('structure');
174
- });
175
- it('環境変数CONFLUENCE_PRD_SPACEがある場合は情報メッセージ', () => {
176
- process.env.CONFLUENCE_PRD_SPACE = 'Michi';
177
- const configPath = join(testProjectRoot, '.michi/config.json');
178
- writeFileSync(configPath, JSON.stringify({
179
- confluence: {
180
- pageCreationGranularity: 'single',
181
- },
182
- }));
183
- const result = validateForConfluenceSync('requirements', testProjectRoot);
184
- expect(result.valid).toBe(true);
185
- // 環境変数がある場合、infoメッセージが表示される可能性がある
186
- // 実際の動作に合わせてテストを調整
187
- if (result.info.length > 0) {
188
- expect(result.info[0]).toContain('CONFLUENCE_PRD_SPACE');
189
- }
190
- });
191
- });
192
- describe('validateForJiraSync', () => {
193
- beforeEach(() => {
194
- // 環境変数をクリア
195
- delete process.env.JIRA_ISSUE_TYPE_STORY;
196
- delete process.env.JIRA_ISSUE_TYPE_SUBTASK;
197
- });
198
- it('issueTypes.story設定がない場合はエラー', () => {
199
- const configPath = join(testProjectRoot, '.michi/config.json');
200
- writeFileSync(configPath, JSON.stringify({
201
- jira: {},
202
- }));
203
- const result = validateForJiraSync(testProjectRoot);
204
- expect(result.valid).toBe(false);
205
- expect(result.errors.length).toBeGreaterThan(0);
206
- expect(result.errors[0]).toContain('issueTypes.story');
207
- });
208
- it('issueTypes.story設定がある場合は成功', () => {
209
- const configPath = join(testProjectRoot, '.michi/config.json');
210
- writeFileSync(configPath, JSON.stringify({
211
- jira: {
212
- issueTypes: {
213
- story: '10036',
214
- },
215
- },
216
- }));
217
- const result = validateForJiraSync(testProjectRoot);
218
- expect(result.valid).toBe(true);
219
- expect(result.errors).toHaveLength(0);
220
- });
221
- it('環境変数JIRA_ISSUE_TYPE_STORYがある場合は情報メッセージ', () => {
222
- process.env.JIRA_ISSUE_TYPE_STORY = '10036';
223
- const configPath = join(testProjectRoot, '.michi/config.json');
224
- writeFileSync(configPath, JSON.stringify({
225
- jira: {
226
- createEpic: true,
227
- },
228
- }));
229
- const result = validateForJiraSync(testProjectRoot);
230
- expect(result.valid).toBe(true);
231
- // 環境変数がある場合、infoメッセージが表示される可能性がある
232
- // 実際の動作に合わせてテストを調整
233
- if (result.info.length > 0) {
234
- expect(result.info[0]).toContain('JIRA_ISSUE_TYPE_STORY');
235
- }
236
- });
237
- it('issueTypes.subtask設定がない場合は警告', () => {
238
- const configPath = join(testProjectRoot, '.michi/config.json');
239
- writeFileSync(configPath, JSON.stringify({
240
- jira: {
241
- issueTypes: {
242
- story: '10036',
243
- },
244
- },
245
- }));
246
- const result = validateForJiraSync(testProjectRoot);
247
- expect(result.valid).toBe(true);
248
- expect(result.warnings.length).toBeGreaterThan(0);
249
- expect(result.warnings[0]).toContain('subtask');
250
- });
251
- it('selected-phasesモードでselectedPhases設定がない場合はエラー', () => {
252
- const configPath = join(testProjectRoot, '.michi/config.json');
253
- writeFileSync(configPath, JSON.stringify({
254
- jira: {
255
- storyCreationGranularity: 'selected-phases',
256
- issueTypes: {
257
- story: '10036',
258
- },
259
- },
260
- }));
261
- const result = validateForJiraSync(testProjectRoot);
262
- expect(result.valid).toBe(false);
263
- expect(result.errors.length).toBeGreaterThan(0);
264
- expect(result.errors[0]).toContain('selectedPhases');
265
- });
266
- });
267
- describe('validateForJiraSyncAsync', () => {
268
- beforeEach(() => {
269
- // 環境変数をクリア
270
- delete process.env.JIRA_ISSUE_TYPE_STORY;
271
- delete process.env.JIRA_ISSUE_TYPE_SUBTASK;
272
- delete process.env.ATLASSIAN_URL;
273
- delete process.env.ATLASSIAN_EMAIL;
274
- delete process.env.ATLASSIAN_API_TOKEN;
275
- });
276
- it('認証情報が未設定の場合は同期版と同じ結果を返す', async () => {
277
- const configPath = join(testProjectRoot, '.michi/config.json');
278
- writeFileSync(configPath, JSON.stringify({
279
- jira: {
280
- issueTypes: {
281
- story: '10036',
282
- },
283
- },
284
- }));
285
- // project.jsonを作成
286
- const projectJsonPath = join(testProjectRoot, '.kiro/project.json');
287
- mkdirSync(join(testProjectRoot, '.kiro'), { recursive: true });
288
- writeFileSync(projectJsonPath, JSON.stringify({
289
- jiraProjectKey: 'TEST',
290
- }));
291
- const result = await validateForJiraSyncAsync(testProjectRoot);
292
- expect(result.valid).toBe(true);
293
- expect(result.errors).toHaveLength(0);
294
- });
295
- it('認証情報が設定されていて、Issue Type IDが存在する場合は成功', async () => {
296
- process.env.ATLASSIAN_URL = 'https://test.atlassian.net';
297
- process.env.ATLASSIAN_EMAIL = 'test@example.com';
298
- process.env.ATLASSIAN_API_TOKEN = 'test-token';
299
- process.env.JIRA_ISSUE_TYPE_STORY = '10073';
300
- const configPath = join(testProjectRoot, '.michi/config.json');
301
- writeFileSync(configPath, JSON.stringify({
302
- jira: {},
303
- }));
304
- // project.jsonを作成(すべての必須フィールドを含める)
305
- const projectJsonPath = join(testProjectRoot, '.kiro/project.json');
306
- mkdirSync(join(testProjectRoot, '.kiro'), { recursive: true });
307
- writeFileSync(projectJsonPath, JSON.stringify({
308
- projectId: 'test-project',
309
- projectName: 'Test Project',
310
- jiraProjectKey: 'TEST',
311
- confluenceLabels: [],
312
- status: 'active',
313
- team: [],
314
- stakeholders: [],
315
- repository: '',
316
- }));
317
- // JIRA APIのモック
318
- vi.spyOn(jiraFetcher, 'hasJiraCredentials').mockReturnValue(true);
319
- vi.spyOn(jiraFetcher, 'getProjectIssueTypes').mockResolvedValue([
320
- { id: '10071', name: 'タスク', subtask: false },
321
- { id: '10073', name: 'ストーリー', subtask: false },
322
- { id: '10075', name: 'サブタスク', subtask: true },
323
- ]);
324
- const result = await validateForJiraSyncAsync(testProjectRoot);
325
- expect(result.valid).toBe(true);
326
- expect(result.errors).toHaveLength(0);
327
- });
328
- it('認証情報が設定されていて、Issue Type IDが存在しない場合はエラー', async () => {
329
- process.env.ATLASSIAN_URL = 'https://test.atlassian.net';
330
- process.env.ATLASSIAN_EMAIL = 'test@example.com';
331
- process.env.ATLASSIAN_API_TOKEN = 'test-token';
332
- process.env.JIRA_ISSUE_TYPE_STORY = '99999'; // 存在しないID
333
- const configPath = join(testProjectRoot, '.michi/config.json');
334
- writeFileSync(configPath, JSON.stringify({
335
- jira: {},
336
- }));
337
- // project.jsonを作成(すべての必須フィールドを含める)
338
- const projectJsonPath = join(testProjectRoot, '.kiro/project.json');
339
- mkdirSync(join(testProjectRoot, '.kiro'), { recursive: true });
340
- writeFileSync(projectJsonPath, JSON.stringify({
341
- projectId: 'test-project',
342
- projectName: 'Test Project',
343
- jiraProjectKey: 'TEST',
344
- confluenceLabels: [],
345
- status: 'active',
346
- team: [],
347
- stakeholders: [],
348
- repository: '',
349
- }));
350
- // JIRA APIのモック
351
- vi.spyOn(jiraFetcher, 'hasJiraCredentials').mockReturnValue(true);
352
- vi.spyOn(jiraFetcher, 'getProjectIssueTypes').mockResolvedValue([
353
- { id: '10071', name: 'タスク', subtask: false },
354
- { id: '10073', name: 'ストーリー', subtask: false },
355
- { id: '10075', name: 'サブタスク', subtask: true },
356
- ]);
357
- const result = await validateForJiraSyncAsync(testProjectRoot);
358
- expect(result.valid).toBe(false);
359
- expect(result.errors.length).toBeGreaterThan(0);
360
- expect(result.errors.some((e) => e.includes('99999') && e.includes('存在しません'))).toBe(true);
361
- });
362
- it('JIRA API取得に失敗した場合は警告を追加するがエラーにはしない', async () => {
363
- process.env.ATLASSIAN_URL = 'https://test.atlassian.net';
364
- process.env.ATLASSIAN_EMAIL = 'test@example.com';
365
- process.env.ATLASSIAN_API_TOKEN = 'test-token';
366
- process.env.JIRA_ISSUE_TYPE_STORY = '10073';
367
- const configPath = join(testProjectRoot, '.michi/config.json');
368
- writeFileSync(configPath, JSON.stringify({
369
- jira: {},
370
- }));
371
- // project.jsonを作成(すべての必須フィールドを含める)
372
- const projectJsonPath = join(testProjectRoot, '.kiro/project.json');
373
- mkdirSync(join(testProjectRoot, '.kiro'), { recursive: true });
374
- writeFileSync(projectJsonPath, JSON.stringify({
375
- projectId: 'test-project',
376
- projectName: 'Test Project',
377
- jiraProjectKey: 'TEST',
378
- confluenceLabels: [],
379
- status: 'active',
380
- team: [],
381
- stakeholders: [],
382
- repository: '',
383
- }));
384
- // JIRA APIのモック(取得失敗)
385
- vi.spyOn(jiraFetcher, 'hasJiraCredentials').mockReturnValue(true);
386
- vi.spyOn(jiraFetcher, 'getProjectIssueTypes').mockResolvedValue(null);
387
- const result = await validateForJiraSyncAsync(testProjectRoot);
388
- expect(result.valid).toBe(true); // エラーにはしない
389
- expect(result.warnings.length).toBeGreaterThan(0);
390
- expect(result.warnings.some((w) => w.includes('取得できませんでした'))).toBe(true);
391
- });
392
- });
393
- });
394
- //# sourceMappingURL=config-validator.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-validator.test.js","sourceRoot":"","sources":["../../../../scripts/utils/__tests__/config-validator.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * env-config.ts のユニットテスト
3
- */
4
- export {};
5
- //# sourceMappingURL=env-config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"env-config.test.d.ts","sourceRoot":"","sources":["../../../../scripts/utils/__tests__/env-config.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,218 +0,0 @@
1
- /**
2
- * env-config.ts のユニットテスト
3
- */
4
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
- import { writeFileSync, unlinkSync, existsSync, mkdirSync, rmdirSync } from 'fs';
6
- import { join } from 'path';
7
- import { parseEnvFile, generateEnvContent } from '../env-config.js';
8
- describe('env-config', () => {
9
- const testDir = join(process.cwd(), 'test-temp');
10
- const testEnvPath = join(testDir, '.env.test');
11
- beforeEach(() => {
12
- // テスト用ディレクトリ作成
13
- if (!existsSync(testDir)) {
14
- mkdirSync(testDir, { recursive: true });
15
- }
16
- });
17
- afterEach(() => {
18
- // クリーンアップ
19
- if (existsSync(testEnvPath)) {
20
- unlinkSync(testEnvPath);
21
- }
22
- if (existsSync(testDir)) {
23
- try {
24
- rmdirSync(testDir);
25
- }
26
- catch {
27
- // ディレクトリが空でない場合は無視
28
- }
29
- }
30
- });
31
- describe('parseEnvFile', () => {
32
- it('should parse a valid .env file', () => {
33
- const content = `# Comment
34
- ATLASSIAN_URL=https://example.atlassian.net
35
- ATLASSIAN_EMAIL=user@example.com
36
- ATLASSIAN_API_TOKEN=token123
37
-
38
- # Another comment
39
- GITHUB_TOKEN=ghp_xxx
40
- `;
41
- writeFileSync(testEnvPath, content, 'utf-8');
42
- const result = parseEnvFile(testEnvPath);
43
- expect(result.size).toBe(4);
44
- expect(result.get('ATLASSIAN_URL')).toBe('https://example.atlassian.net');
45
- expect(result.get('ATLASSIAN_EMAIL')).toBe('user@example.com');
46
- expect(result.get('ATLASSIAN_API_TOKEN')).toBe('token123');
47
- expect(result.get('GITHUB_TOKEN')).toBe('ghp_xxx');
48
- });
49
- it('should handle quoted values', () => {
50
- const content = `DOUBLE_QUOTED="value with spaces"
51
- SINGLE_QUOTED='another value'
52
- UNQUOTED=simple
53
- `;
54
- writeFileSync(testEnvPath, content, 'utf-8');
55
- const result = parseEnvFile(testEnvPath);
56
- expect(result.get('DOUBLE_QUOTED')).toBe('value with spaces');
57
- expect(result.get('SINGLE_QUOTED')).toBe('another value');
58
- expect(result.get('UNQUOTED')).toBe('simple');
59
- });
60
- it('should skip empty lines and comments', () => {
61
- const content = `# This is a comment
62
-
63
- KEY1=value1
64
-
65
- # Another comment
66
-
67
- KEY2=value2
68
- `;
69
- writeFileSync(testEnvPath, content, 'utf-8');
70
- const result = parseEnvFile(testEnvPath);
71
- expect(result.size).toBe(2);
72
- expect(result.get('KEY1')).toBe('value1');
73
- expect(result.get('KEY2')).toBe('value2');
74
- });
75
- it('should return empty map for non-existent file', () => {
76
- const result = parseEnvFile(join(testDir, 'nonexistent.env'));
77
- expect(result.size).toBe(0);
78
- });
79
- it('should handle malformed lines gracefully', () => {
80
- const content = `VALID_KEY=value
81
- invalid line without equals
82
- ANOTHER_VALID=value2
83
- =value_without_key
84
- KEY_WITHOUT_VALUE=
85
- `;
86
- writeFileSync(testEnvPath, content, 'utf-8');
87
- const result = parseEnvFile(testEnvPath);
88
- // 正しい形式の行のみパースされる
89
- expect(result.get('VALID_KEY')).toBe('value');
90
- expect(result.get('ANOTHER_VALID')).toBe('value2');
91
- expect(result.get('KEY_WITHOUT_VALUE')).toBe('');
92
- });
93
- it('should handle values with equals signs', () => {
94
- const content = `BASE64_VALUE=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0=
95
- URL_WITH_PARAMS=https://example.com?param1=value1&param2=value2
96
- `;
97
- writeFileSync(testEnvPath, content, 'utf-8');
98
- const result = parseEnvFile(testEnvPath);
99
- expect(result.get('BASE64_VALUE')).toBe('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0=');
100
- expect(result.get('URL_WITH_PARAMS')).toBe('https://example.com?param1=value1&param2=value2');
101
- });
102
- });
103
- describe('generateEnvContent', () => {
104
- it('should generate valid .env content', () => {
105
- const values = new Map([
106
- ['ATLASSIAN_URL', 'https://example.atlassian.net'],
107
- ['ATLASSIAN_EMAIL', 'user@example.com'],
108
- ['ATLASSIAN_API_TOKEN', 'token123'],
109
- ['GITHUB_TOKEN', 'ghp_xxx'],
110
- ['CONFLUENCE_PRD_SPACE', 'PRD'],
111
- ['JIRA_PROJECT_KEYS', 'PROJ'],
112
- ['JIRA_ISSUE_TYPE_STORY', '10036'],
113
- ['JIRA_ISSUE_TYPE_SUBTASK', '10037']
114
- ]);
115
- const content = generateEnvContent(values);
116
- // 各セクションが存在することを確認
117
- expect(content).toContain('# Atlassian設定');
118
- expect(content).toContain('# GitHub設定');
119
- expect(content).toContain('# Confluence共有スペース');
120
- expect(content).toContain('# JIRAプロジェクトキー');
121
- expect(content).toContain('# JIRA Issue Type IDs');
122
- // 値が正しく含まれることを確認
123
- expect(content).toContain('ATLASSIAN_URL=https://example.atlassian.net');
124
- expect(content).toContain('ATLASSIAN_EMAIL=user@example.com');
125
- expect(content).toContain('ATLASSIAN_API_TOKEN=token123');
126
- expect(content).toContain('GITHUB_TOKEN=ghp_xxx');
127
- expect(content).toContain('CONFLUENCE_PRD_SPACE=PRD');
128
- expect(content).toContain('JIRA_PROJECT_KEYS=PROJ');
129
- expect(content).toContain('JIRA_ISSUE_TYPE_STORY=10036');
130
- expect(content).toContain('JIRA_ISSUE_TYPE_SUBTASK=10037');
131
- });
132
- it('should handle empty values', () => {
133
- const values = new Map([
134
- ['ATLASSIAN_URL', ''],
135
- ['ATLASSIAN_EMAIL', ''],
136
- ['ATLASSIAN_API_TOKEN', '']
137
- ]);
138
- const content = generateEnvContent(values);
139
- expect(content).toContain('ATLASSIAN_URL=');
140
- expect(content).toContain('ATLASSIAN_EMAIL=');
141
- expect(content).toContain('ATLASSIAN_API_TOKEN=');
142
- });
143
- it('should use default values when keys are missing', () => {
144
- const values = new Map();
145
- const content = generateEnvContent(values);
146
- // デフォルト値が使用されることを確認
147
- expect(content).toContain('JIRA_ISSUE_TYPE_STORY=10036');
148
- expect(content).toContain('JIRA_ISSUE_TYPE_SUBTASK=10037');
149
- });
150
- it('should be parseable by parseEnvFile', () => {
151
- const originalValues = new Map([
152
- ['ATLASSIAN_URL', 'https://example.atlassian.net'],
153
- ['ATLASSIAN_EMAIL', 'user@example.com'],
154
- ['ATLASSIAN_API_TOKEN', 'token123'],
155
- ['GITHUB_ORG', 'myorg'],
156
- ['GITHUB_TOKEN', 'ghp_xxx'],
157
- ['GITHUB_REPO', 'myorg/myrepo'],
158
- ['CONFLUENCE_PRD_SPACE', 'PRD'],
159
- ['CONFLUENCE_QA_SPACE', 'QA'],
160
- ['CONFLUENCE_RELEASE_SPACE', 'RELEASE'],
161
- ['JIRA_PROJECT_KEYS', 'PROJ'],
162
- ['JIRA_ISSUE_TYPE_STORY', '10036'],
163
- ['JIRA_ISSUE_TYPE_SUBTASK', '10037']
164
- ]);
165
- const content = generateEnvContent(originalValues);
166
- writeFileSync(testEnvPath, content, 'utf-8');
167
- const parsedValues = parseEnvFile(testEnvPath);
168
- // すべての値が正しくパースされることを確認
169
- expect(parsedValues.size).toBe(originalValues.size);
170
- for (const [key, value] of originalValues) {
171
- expect(parsedValues.get(key)).toBe(value);
172
- }
173
- });
174
- });
175
- describe('round-trip test', () => {
176
- it('should maintain data integrity through parse -> generate -> parse cycle', () => {
177
- const initialContent = `# Atlassian設定(MCP + REST API共通)
178
- ATLASSIAN_URL=https://test.atlassian.net
179
- ATLASSIAN_EMAIL=test@example.com
180
- ATLASSIAN_API_TOKEN=test_token_123
181
-
182
- # GitHub設定
183
- GITHUB_ORG=testorg
184
- GITHUB_TOKEN=ghp_test123
185
- GITHUB_REPO=testorg/testrepo
186
-
187
- # Confluence共有スペース
188
- CONFLUENCE_PRD_SPACE=PRD
189
- CONFLUENCE_QA_SPACE=QA
190
- CONFLUENCE_RELEASE_SPACE=RELEASE
191
-
192
- # JIRAプロジェクトキー
193
- JIRA_PROJECT_KEYS=TEST
194
-
195
- # JIRA Issue Type IDs(JIRAインスタンス固有 - 必須)
196
- JIRA_ISSUE_TYPE_STORY=10036
197
- JIRA_ISSUE_TYPE_SUBTASK=10037
198
- `;
199
- writeFileSync(testEnvPath, initialContent, 'utf-8');
200
- // 1回目のパース
201
- const parsed1 = parseEnvFile(testEnvPath);
202
- // 生成
203
- const generated = generateEnvContent(parsed1);
204
- const generatedPath = join(testDir, '.env.generated');
205
- writeFileSync(generatedPath, generated, 'utf-8');
206
- // 2回目のパース
207
- const parsed2 = parseEnvFile(generatedPath);
208
- // データが一致することを確認
209
- expect(parsed1.size).toBe(parsed2.size);
210
- for (const [key, value] of parsed1) {
211
- expect(parsed2.get(key)).toBe(value);
212
- }
213
- // クリーンアップ
214
- unlinkSync(generatedPath);
215
- });
216
- });
217
- });
218
- //# sourceMappingURL=env-config.test.js.map