@sk8metal/michi-cli 0.5.0 → 0.8.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 (284) hide show
  1. package/CHANGELOG.md +136 -1
  2. package/README.md +2 -1
  3. package/dist/scripts/config/config-schema.d.ts +35 -0
  4. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  5. package/dist/scripts/config/config-schema.js +56 -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/template/multi-repo-renderer.d.ts +67 -0
  26. package/dist/scripts/template/multi-repo-renderer.d.ts.map +1 -0
  27. package/dist/scripts/template/multi-repo-renderer.js +123 -0
  28. package/dist/scripts/template/multi-repo-renderer.js.map +1 -0
  29. package/dist/scripts/template/renderer.d.ts +4 -0
  30. package/dist/scripts/template/renderer.d.ts.map +1 -1
  31. package/dist/scripts/template/renderer.js.map +1 -1
  32. package/dist/scripts/test-execution-generator.d.ts.map +1 -1
  33. package/dist/scripts/test-execution-generator.js +94 -11
  34. package/dist/scripts/test-execution-generator.js.map +1 -1
  35. package/dist/scripts/test-script-runner.d.ts +33 -0
  36. package/dist/scripts/test-script-runner.d.ts.map +1 -0
  37. package/dist/scripts/test-script-runner.js +77 -0
  38. package/dist/scripts/test-script-runner.js.map +1 -0
  39. package/dist/scripts/utils/config-loader.d.ts +21 -1
  40. package/dist/scripts/utils/config-loader.d.ts.map +1 -1
  41. package/dist/scripts/utils/config-loader.js +149 -3
  42. package/dist/scripts/utils/config-loader.js.map +1 -1
  43. package/dist/scripts/utils/multi-repo-validator.d.ts +30 -0
  44. package/dist/scripts/utils/multi-repo-validator.d.ts.map +1 -0
  45. package/dist/scripts/utils/multi-repo-validator.js +105 -0
  46. package/dist/scripts/utils/multi-repo-validator.js.map +1 -0
  47. package/dist/scripts/utils/spec-archiver.d.ts +38 -0
  48. package/dist/scripts/utils/spec-archiver.d.ts.map +1 -0
  49. package/dist/scripts/utils/spec-archiver.js +210 -0
  50. package/dist/scripts/utils/spec-archiver.js.map +1 -0
  51. package/dist/scripts/utils/spec-updater.d.ts +4 -0
  52. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  53. package/dist/scripts/utils/spec-updater.js.map +1 -1
  54. package/dist/src/cli.d.ts.map +1 -1
  55. package/dist/src/cli.js +262 -14
  56. package/dist/src/cli.js.map +1 -1
  57. package/dist/src/commands/multi-repo-add-repo.d.ts +26 -0
  58. package/dist/src/commands/multi-repo-add-repo.d.ts.map +1 -0
  59. package/dist/src/commands/multi-repo-add-repo.js +56 -0
  60. package/dist/src/commands/multi-repo-add-repo.js.map +1 -0
  61. package/dist/src/commands/multi-repo-ci-status.d.ts +46 -0
  62. package/dist/src/commands/multi-repo-ci-status.d.ts.map +1 -0
  63. package/dist/src/commands/multi-repo-ci-status.js +285 -0
  64. package/dist/src/commands/multi-repo-ci-status.js.map +1 -0
  65. package/dist/src/commands/multi-repo-confluence-sync.d.ts +45 -0
  66. package/dist/src/commands/multi-repo-confluence-sync.d.ts.map +1 -0
  67. package/dist/src/commands/multi-repo-confluence-sync.js +135 -0
  68. package/dist/src/commands/multi-repo-confluence-sync.js.map +1 -0
  69. package/dist/src/commands/multi-repo-init.d.ts +26 -0
  70. package/dist/src/commands/multi-repo-init.d.ts.map +1 -0
  71. package/dist/src/commands/multi-repo-init.js +101 -0
  72. package/dist/src/commands/multi-repo-init.js.map +1 -0
  73. package/dist/src/commands/multi-repo-list.d.ts +28 -0
  74. package/dist/src/commands/multi-repo-list.d.ts.map +1 -0
  75. package/dist/src/commands/multi-repo-list.js +38 -0
  76. package/dist/src/commands/multi-repo-list.js.map +1 -0
  77. package/dist/src/commands/multi-repo-test.d.ts +56 -0
  78. package/dist/src/commands/multi-repo-test.d.ts.map +1 -0
  79. package/dist/src/commands/multi-repo-test.js +70 -0
  80. package/dist/src/commands/multi-repo-test.js.map +1 -0
  81. package/dist/src/commands/setup-existing.d.ts.map +1 -1
  82. package/dist/src/commands/setup-existing.js +30 -8
  83. package/dist/src/commands/setup-existing.js.map +1 -1
  84. package/dist/src/commands/spec-archive.d.ts +17 -0
  85. package/dist/src/commands/spec-archive.d.ts.map +1 -0
  86. package/dist/src/commands/spec-archive.js +40 -0
  87. package/dist/src/commands/spec-archive.js.map +1 -0
  88. package/dist/src/commands/spec-list.d.ts +15 -0
  89. package/dist/src/commands/spec-list.d.ts.map +1 -0
  90. package/dist/src/commands/spec-list.js +55 -0
  91. package/dist/src/commands/spec-list.js.map +1 -0
  92. package/docs/user-guide/guides/multi-repo-guide.md +591 -0
  93. package/docs/user-guide/guides/multi-repo-migration-guide.md +516 -0
  94. package/docs/user-guide/reference/multi-repo-api.md +771 -0
  95. package/docs/user-guide/reference/quick-reference.md +22 -37
  96. package/package.json +1 -4
  97. package/scripts/__tests__/config-loader-multi-repo.test.ts +342 -0
  98. package/scripts/__tests__/github-actions-client.test.ts +543 -0
  99. package/scripts/__tests__/health-check-service.test.ts +142 -0
  100. package/scripts/__tests__/markdown-to-confluence.test.ts +262 -0
  101. package/scripts/__tests__/mermaid-converter.test.ts +236 -0
  102. package/scripts/__tests__/multi-repo-config-schema.test.ts +335 -0
  103. package/scripts/__tests__/multi-repo-validator.test.ts +524 -0
  104. package/scripts/__tests__/spec-archiver.test.ts +512 -0
  105. package/scripts/__tests__/test-script-runner.test.ts +217 -0
  106. package/scripts/config/config-schema.ts +64 -0
  107. package/scripts/confluence-sync.ts +16 -2
  108. package/scripts/github-actions-client.ts +258 -0
  109. package/scripts/health-check-service.ts +171 -0
  110. package/scripts/markdown-to-confluence.ts +37 -6
  111. package/scripts/mermaid-converter.ts +56 -0
  112. package/scripts/template/__tests__/multi-repo-renderer.test.ts +261 -0
  113. package/scripts/template/multi-repo-renderer.ts +172 -0
  114. package/scripts/template/renderer.ts +5 -0
  115. package/scripts/test-execution-generator.ts +104 -11
  116. package/scripts/test-script-runner.ts +130 -0
  117. package/scripts/utils/__tests__/config-validator.test.ts +104 -6
  118. package/scripts/utils/__tests__/multi-repo-validator.test.ts +335 -0
  119. package/scripts/utils/config-loader.ts +197 -3
  120. package/scripts/utils/multi-repo-validator.ts +141 -0
  121. package/scripts/utils/spec-archiver.ts +260 -0
  122. package/scripts/utils/spec-updater.ts +4 -0
  123. package/templates/claude/agents/pr-size-monitor/AGENT.md +330 -0
  124. package/templates/claude/commands/michi/spec-impl.md +208 -35
  125. package/templates/claude-agent/agents/doc-reviewer.md +176 -0
  126. package/templates/claude-agent/rules/doc-review-rules.md +98 -0
  127. package/templates/claude-agent/rules/doc-review.md +91 -0
  128. package/templates/multi-repo/docs/ci-status.md +51 -0
  129. package/templates/multi-repo/docs/release-notes.md +99 -0
  130. package/templates/multi-repo/overview/architecture.md +102 -0
  131. package/templates/multi-repo/overview/requirements.md +68 -0
  132. package/templates/multi-repo/overview/sequence.md +79 -0
  133. package/templates/multi-repo/steering/multi-repo.md +74 -0
  134. package/templates/multi-repo/tests/strategy.md +89 -0
  135. package/dist/scripts/__tests__/create-project.test.d.ts +0 -2
  136. package/dist/scripts/__tests__/create-project.test.d.ts.map +0 -1
  137. package/dist/scripts/__tests__/create-project.test.js +0 -243
  138. package/dist/scripts/__tests__/create-project.test.js.map +0 -1
  139. package/dist/scripts/__tests__/jira-transitions.test.d.ts +0 -5
  140. package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +0 -1
  141. package/dist/scripts/__tests__/jira-transitions.test.js +0 -172
  142. package/dist/scripts/__tests__/jira-transitions.test.js.map +0 -1
  143. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts +0 -2
  144. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts.map +0 -1
  145. package/dist/scripts/__tests__/multi-project-estimate.test.js +0 -118
  146. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +0 -1
  147. package/dist/scripts/__tests__/setup-existing-project.test.d.ts +0 -2
  148. package/dist/scripts/__tests__/setup-existing-project.test.d.ts.map +0 -1
  149. package/dist/scripts/__tests__/setup-existing-project.test.js +0 -208
  150. package/dist/scripts/__tests__/setup-existing-project.test.js.map +0 -1
  151. package/dist/scripts/__tests__/setup-interactive.test.d.ts +0 -2
  152. package/dist/scripts/__tests__/setup-interactive.test.d.ts.map +0 -1
  153. package/dist/scripts/__tests__/setup-interactive.test.js +0 -166
  154. package/dist/scripts/__tests__/setup-interactive.test.js.map +0 -1
  155. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +0 -5
  156. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +0 -1
  157. package/dist/scripts/__tests__/spec-impl-workflow.test.js +0 -323
  158. package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +0 -1
  159. package/dist/scripts/__tests__/spec-loader.test.d.ts +0 -5
  160. package/dist/scripts/__tests__/spec-loader.test.d.ts.map +0 -1
  161. package/dist/scripts/__tests__/spec-loader.test.js +0 -153
  162. package/dist/scripts/__tests__/spec-loader.test.js.map +0 -1
  163. package/dist/scripts/__tests__/validate-phase.test.d.ts +0 -5
  164. package/dist/scripts/__tests__/validate-phase.test.d.ts.map +0 -1
  165. package/dist/scripts/__tests__/validate-phase.test.js +0 -249
  166. package/dist/scripts/__tests__/validate-phase.test.js.map +0 -1
  167. package/dist/scripts/constants/__tests__/environments.test.d.ts +0 -2
  168. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +0 -1
  169. package/dist/scripts/constants/__tests__/environments.test.js +0 -125
  170. package/dist/scripts/constants/__tests__/environments.test.js.map +0 -1
  171. package/dist/scripts/constants/__tests__/languages.test.d.ts +0 -2
  172. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +0 -1
  173. package/dist/scripts/constants/__tests__/languages.test.js +0 -82
  174. package/dist/scripts/constants/__tests__/languages.test.js.map +0 -1
  175. package/dist/scripts/create-project.d.ts +0 -16
  176. package/dist/scripts/create-project.d.ts.map +0 -1
  177. package/dist/scripts/create-project.js +0 -334
  178. package/dist/scripts/create-project.js.map +0 -1
  179. package/dist/scripts/list-projects.d.ts +0 -7
  180. package/dist/scripts/list-projects.d.ts.map +0 -1
  181. package/dist/scripts/list-projects.js +0 -88
  182. package/dist/scripts/list-projects.js.map +0 -1
  183. package/dist/scripts/template/__tests__/renderer.test.d.ts +0 -2
  184. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +0 -1
  185. package/dist/scripts/template/__tests__/renderer.test.js +0 -165
  186. package/dist/scripts/template/__tests__/renderer.test.js.map +0 -1
  187. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +0 -5
  188. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +0 -1
  189. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +0 -315
  190. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +0 -1
  191. package/dist/scripts/utils/__tests__/business-days.test.d.ts +0 -5
  192. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +0 -1
  193. package/dist/scripts/utils/__tests__/business-days.test.js +0 -171
  194. package/dist/scripts/utils/__tests__/business-days.test.js.map +0 -1
  195. package/dist/scripts/utils/__tests__/config-loader.test.d.ts +0 -5
  196. package/dist/scripts/utils/__tests__/config-loader.test.d.ts.map +0 -1
  197. package/dist/scripts/utils/__tests__/config-loader.test.js +0 -314
  198. package/dist/scripts/utils/__tests__/config-loader.test.js.map +0 -1
  199. package/dist/scripts/utils/__tests__/config-validator.test.d.ts +0 -5
  200. package/dist/scripts/utils/__tests__/config-validator.test.d.ts.map +0 -1
  201. package/dist/scripts/utils/__tests__/config-validator.test.js +0 -396
  202. package/dist/scripts/utils/__tests__/config-validator.test.js.map +0 -1
  203. package/dist/scripts/utils/__tests__/env-config.test.d.ts +0 -5
  204. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +0 -1
  205. package/dist/scripts/utils/__tests__/env-config.test.js +0 -216
  206. package/dist/scripts/utils/__tests__/env-config.test.js.map +0 -1
  207. package/dist/scripts/utils/__tests__/feature-name-validator.test.d.ts +0 -5
  208. package/dist/scripts/utils/__tests__/feature-name-validator.test.d.ts.map +0 -1
  209. package/dist/scripts/utils/__tests__/feature-name-validator.test.js +0 -106
  210. package/dist/scripts/utils/__tests__/feature-name-validator.test.js.map +0 -1
  211. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +0 -5
  212. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +0 -1
  213. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +0 -202
  214. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +0 -1
  215. package/dist/scripts/utils/__tests__/project-meta.test.d.ts +0 -6
  216. package/dist/scripts/utils/__tests__/project-meta.test.d.ts.map +0 -1
  217. package/dist/scripts/utils/__tests__/project-meta.test.js +0 -154
  218. package/dist/scripts/utils/__tests__/project-meta.test.js.map +0 -1
  219. package/dist/scripts/utils/__tests__/security-validator.test.d.ts +0 -6
  220. package/dist/scripts/utils/__tests__/security-validator.test.d.ts.map +0 -1
  221. package/dist/scripts/utils/__tests__/security-validator.test.js +0 -219
  222. package/dist/scripts/utils/__tests__/security-validator.test.js.map +0 -1
  223. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts +0 -5
  224. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts.map +0 -1
  225. package/dist/scripts/utils/__tests__/spec-updater.test.js +0 -158
  226. package/dist/scripts/utils/__tests__/spec-updater.test.js.map +0 -1
  227. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +0 -5
  228. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +0 -1
  229. package/dist/scripts/utils/__tests__/tasks-converter.test.js +0 -500
  230. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +0 -1
  231. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +0 -5
  232. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +0 -1
  233. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +0 -314
  234. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +0 -1
  235. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +0 -5
  236. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +0 -1
  237. package/dist/scripts/utils/__tests__/test-runner.test.js +0 -64
  238. package/dist/scripts/utils/__tests__/test-runner.test.js.map +0 -1
  239. package/dist/src/__tests__/cli.test.d.ts +0 -5
  240. package/dist/src/__tests__/cli.test.d.ts.map +0 -1
  241. package/dist/src/__tests__/cli.test.js +0 -58
  242. package/dist/src/__tests__/cli.test.js.map +0 -1
  243. package/dist/src/__tests__/integration/internationalization.test.d.ts +0 -8
  244. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +0 -1
  245. package/dist/src/__tests__/integration/internationalization.test.js +0 -333
  246. package/dist/src/__tests__/integration/internationalization.test.js.map +0 -1
  247. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +0 -5
  248. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +0 -1
  249. package/dist/src/__tests__/integration/setup/claude-agent.test.js +0 -122
  250. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +0 -1
  251. package/dist/src/__tests__/integration/setup/claude.test.d.ts +0 -5
  252. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +0 -1
  253. package/dist/src/__tests__/integration/setup/claude.test.js +0 -193
  254. package/dist/src/__tests__/integration/setup/claude.test.js.map +0 -1
  255. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +0 -5
  256. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +0 -1
  257. package/dist/src/__tests__/integration/setup/cursor.test.js +0 -166
  258. package/dist/src/__tests__/integration/setup/cursor.test.js.map +0 -1
  259. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +0 -32
  260. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +0 -1
  261. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +0 -72
  262. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +0 -1
  263. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +0 -38
  264. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +0 -1
  265. package/dist/src/__tests__/integration/setup/helpers/test-project.js +0 -83
  266. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +0 -1
  267. package/dist/src/__tests__/integration/setup/init.test.d.ts +0 -5
  268. package/dist/src/__tests__/integration/setup/init.test.d.ts.map +0 -1
  269. package/dist/src/__tests__/integration/setup/init.test.js +0 -352
  270. package/dist/src/__tests__/integration/setup/init.test.js.map +0 -1
  271. package/dist/src/__tests__/integration/setup/validation.test.d.ts +0 -5
  272. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +0 -1
  273. package/dist/src/__tests__/integration/setup/validation.test.js +0 -301
  274. package/dist/src/__tests__/integration/setup/validation.test.js.map +0 -1
  275. package/dist/src/commands/__tests__/init.test.d.ts +0 -5
  276. package/dist/src/commands/__tests__/init.test.d.ts.map +0 -1
  277. package/dist/src/commands/__tests__/init.test.js +0 -255
  278. package/dist/src/commands/__tests__/init.test.js.map +0 -1
  279. package/dist/src/commands/__tests__/migrate.test.d.ts +0 -5
  280. package/dist/src/commands/__tests__/migrate.test.d.ts.map +0 -1
  281. package/dist/src/commands/__tests__/migrate.test.js +0 -216
  282. package/dist/src/commands/__tests__/migrate.test.js.map +0 -1
  283. package/scripts/create-project.ts +0 -386
  284. package/scripts/list-projects.ts +0 -112
@@ -1,396 +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
- projectId: 'test-project',
290
- projectName: 'Test Project',
291
- jiraProjectKey: 'TEST',
292
- }));
293
- const result = await validateForJiraSyncAsync(testProjectRoot);
294
- expect(result.valid).toBe(true);
295
- expect(result.errors).toHaveLength(0);
296
- });
297
- it('認証情報が設定されていて、Issue Type IDが存在する場合は成功', async () => {
298
- process.env.ATLASSIAN_URL = 'https://test.atlassian.net';
299
- process.env.ATLASSIAN_EMAIL = 'test@example.com';
300
- process.env.ATLASSIAN_API_TOKEN = 'test-token';
301
- process.env.JIRA_ISSUE_TYPE_STORY = '10073';
302
- const configPath = join(testProjectRoot, '.michi/config.json');
303
- writeFileSync(configPath, JSON.stringify({
304
- jira: {},
305
- }));
306
- // project.jsonを作成(すべての必須フィールドを含める)
307
- const projectJsonPath = join(testProjectRoot, '.kiro/project.json');
308
- mkdirSync(join(testProjectRoot, '.kiro'), { recursive: true });
309
- writeFileSync(projectJsonPath, JSON.stringify({
310
- projectId: 'test-project',
311
- projectName: 'Test Project',
312
- jiraProjectKey: 'TEST',
313
- confluenceLabels: [],
314
- status: 'active',
315
- team: [],
316
- stakeholders: [],
317
- repository: '',
318
- }));
319
- // JIRA APIのモック
320
- vi.spyOn(jiraFetcher, 'hasJiraCredentials').mockReturnValue(true);
321
- vi.spyOn(jiraFetcher, 'getProjectIssueTypes').mockResolvedValue([
322
- { id: '10071', name: 'タスク', subtask: false },
323
- { id: '10073', name: 'ストーリー', subtask: false },
324
- { id: '10075', name: 'サブタスク', subtask: true },
325
- ]);
326
- const result = await validateForJiraSyncAsync(testProjectRoot);
327
- expect(result.valid).toBe(true);
328
- expect(result.errors).toHaveLength(0);
329
- });
330
- it('認証情報が設定されていて、Issue Type IDが存在しない場合はエラー', async () => {
331
- process.env.ATLASSIAN_URL = 'https://test.atlassian.net';
332
- process.env.ATLASSIAN_EMAIL = 'test@example.com';
333
- process.env.ATLASSIAN_API_TOKEN = 'test-token';
334
- process.env.JIRA_ISSUE_TYPE_STORY = '99999'; // 存在しないID
335
- const configPath = join(testProjectRoot, '.michi/config.json');
336
- writeFileSync(configPath, JSON.stringify({
337
- jira: {},
338
- }));
339
- // project.jsonを作成(すべての必須フィールドを含める)
340
- const projectJsonPath = join(testProjectRoot, '.kiro/project.json');
341
- mkdirSync(join(testProjectRoot, '.kiro'), { recursive: true });
342
- writeFileSync(projectJsonPath, JSON.stringify({
343
- projectId: 'test-project',
344
- projectName: 'Test Project',
345
- jiraProjectKey: 'TEST',
346
- confluenceLabels: [],
347
- status: 'active',
348
- team: [],
349
- stakeholders: [],
350
- repository: '',
351
- }));
352
- // JIRA APIのモック
353
- vi.spyOn(jiraFetcher, 'hasJiraCredentials').mockReturnValue(true);
354
- vi.spyOn(jiraFetcher, 'getProjectIssueTypes').mockResolvedValue([
355
- { id: '10071', name: 'タスク', subtask: false },
356
- { id: '10073', name: 'ストーリー', subtask: false },
357
- { id: '10075', name: 'サブタスク', subtask: true },
358
- ]);
359
- const result = await validateForJiraSyncAsync(testProjectRoot);
360
- expect(result.valid).toBe(false);
361
- expect(result.errors.length).toBeGreaterThan(0);
362
- expect(result.errors.some((e) => e.includes('99999') && e.includes('存在しません'))).toBe(true);
363
- });
364
- it('JIRA API取得に失敗した場合は警告を追加するがエラーにはしない', async () => {
365
- process.env.ATLASSIAN_URL = 'https://test.atlassian.net';
366
- process.env.ATLASSIAN_EMAIL = 'test@example.com';
367
- process.env.ATLASSIAN_API_TOKEN = 'test-token';
368
- process.env.JIRA_ISSUE_TYPE_STORY = '10073';
369
- const configPath = join(testProjectRoot, '.michi/config.json');
370
- writeFileSync(configPath, JSON.stringify({
371
- jira: {},
372
- }));
373
- // project.jsonを作成(すべての必須フィールドを含める)
374
- const projectJsonPath = join(testProjectRoot, '.kiro/project.json');
375
- mkdirSync(join(testProjectRoot, '.kiro'), { recursive: true });
376
- writeFileSync(projectJsonPath, JSON.stringify({
377
- projectId: 'test-project',
378
- projectName: 'Test Project',
379
- jiraProjectKey: 'TEST',
380
- confluenceLabels: [],
381
- status: 'active',
382
- team: [],
383
- stakeholders: [],
384
- repository: '',
385
- }));
386
- // JIRA APIのモック(取得失敗)
387
- vi.spyOn(jiraFetcher, 'hasJiraCredentials').mockReturnValue(true);
388
- vi.spyOn(jiraFetcher, 'getProjectIssueTypes').mockResolvedValue(null);
389
- const result = await validateForJiraSyncAsync(testProjectRoot);
390
- expect(result.valid).toBe(true); // エラーにはしない
391
- expect(result.warnings.length).toBeGreaterThan(0);
392
- expect(result.warnings.some((w) => w.includes('取得できませんでした'))).toBe(true);
393
- });
394
- });
395
- });
396
- //# 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,216 +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
- ['CONFLUENCE_PRD_SPACE', 'PRD'],
158
- ['CONFLUENCE_QA_SPACE', 'QA'],
159
- ['CONFLUENCE_RELEASE_SPACE', 'RELEASE'],
160
- ['JIRA_PROJECT_KEYS', 'PROJ'],
161
- ['JIRA_ISSUE_TYPE_STORY', '10036'],
162
- ['JIRA_ISSUE_TYPE_SUBTASK', '10037']
163
- ]);
164
- const content = generateEnvContent(originalValues);
165
- writeFileSync(testEnvPath, content, 'utf-8');
166
- const parsedValues = parseEnvFile(testEnvPath);
167
- // すべての値が正しくパースされることを確認
168
- expect(parsedValues.size).toBe(originalValues.size);
169
- for (const [key, value] of originalValues) {
170
- expect(parsedValues.get(key)).toBe(value);
171
- }
172
- });
173
- });
174
- describe('round-trip test', () => {
175
- it('should maintain data integrity through parse -> generate -> parse cycle', () => {
176
- const initialContent = `# Atlassian設定(MCP + REST API共通)
177
- ATLASSIAN_URL=https://test.atlassian.net
178
- ATLASSIAN_EMAIL=test@example.com
179
- ATLASSIAN_API_TOKEN=test_token_123
180
-
181
- # GitHub設定
182
- GITHUB_ORG=testorg
183
- GITHUB_TOKEN=ghp_test123
184
-
185
- # Confluence共有スペース
186
- CONFLUENCE_PRD_SPACE=PRD
187
- CONFLUENCE_QA_SPACE=QA
188
- CONFLUENCE_RELEASE_SPACE=RELEASE
189
-
190
- # JIRAプロジェクトキー
191
- JIRA_PROJECT_KEYS=TEST
192
-
193
- # JIRA Issue Type IDs(JIRAインスタンス固有 - 必須)
194
- JIRA_ISSUE_TYPE_STORY=10036
195
- JIRA_ISSUE_TYPE_SUBTASK=10037
196
- `;
197
- writeFileSync(testEnvPath, initialContent, 'utf-8');
198
- // 1回目のパース
199
- const parsed1 = parseEnvFile(testEnvPath);
200
- // 生成
201
- const generated = generateEnvContent(parsed1);
202
- const generatedPath = join(testDir, '.env.generated');
203
- writeFileSync(generatedPath, generated, 'utf-8');
204
- // 2回目のパース
205
- const parsed2 = parseEnvFile(generatedPath);
206
- // データが一致することを確認
207
- expect(parsed1.size).toBe(parsed2.size);
208
- for (const [key, value] of parsed1) {
209
- expect(parsed2.get(key)).toBe(value);
210
- }
211
- // クリーンアップ
212
- unlinkSync(generatedPath);
213
- });
214
- });
215
- });
216
- //# sourceMappingURL=env-config.test.js.map