@sk8metal/michi-cli 0.5.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 (278) hide show
  1. package/CHANGELOG.md +122 -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/spec-archive.d.ts +17 -0
  82. package/dist/src/commands/spec-archive.d.ts.map +1 -0
  83. package/dist/src/commands/spec-archive.js +40 -0
  84. package/dist/src/commands/spec-archive.js.map +1 -0
  85. package/dist/src/commands/spec-list.d.ts +15 -0
  86. package/dist/src/commands/spec-list.d.ts.map +1 -0
  87. package/dist/src/commands/spec-list.js +55 -0
  88. package/dist/src/commands/spec-list.js.map +1 -0
  89. package/docs/user-guide/guides/multi-repo-guide.md +591 -0
  90. package/docs/user-guide/guides/multi-repo-migration-guide.md +516 -0
  91. package/docs/user-guide/reference/multi-repo-api.md +771 -0
  92. package/docs/user-guide/reference/quick-reference.md +22 -37
  93. package/package.json +1 -4
  94. package/scripts/__tests__/config-loader-multi-repo.test.ts +342 -0
  95. package/scripts/__tests__/github-actions-client.test.ts +543 -0
  96. package/scripts/__tests__/health-check-service.test.ts +142 -0
  97. package/scripts/__tests__/markdown-to-confluence.test.ts +262 -0
  98. package/scripts/__tests__/mermaid-converter.test.ts +236 -0
  99. package/scripts/__tests__/multi-repo-config-schema.test.ts +335 -0
  100. package/scripts/__tests__/multi-repo-validator.test.ts +524 -0
  101. package/scripts/__tests__/spec-archiver.test.ts +512 -0
  102. package/scripts/__tests__/test-script-runner.test.ts +217 -0
  103. package/scripts/config/config-schema.ts +64 -0
  104. package/scripts/confluence-sync.ts +16 -2
  105. package/scripts/github-actions-client.ts +258 -0
  106. package/scripts/health-check-service.ts +171 -0
  107. package/scripts/markdown-to-confluence.ts +37 -6
  108. package/scripts/mermaid-converter.ts +56 -0
  109. package/scripts/template/__tests__/multi-repo-renderer.test.ts +261 -0
  110. package/scripts/template/multi-repo-renderer.ts +172 -0
  111. package/scripts/template/renderer.ts +5 -0
  112. package/scripts/test-execution-generator.ts +104 -11
  113. package/scripts/test-script-runner.ts +130 -0
  114. package/scripts/utils/__tests__/config-validator.test.ts +104 -6
  115. package/scripts/utils/__tests__/multi-repo-validator.test.ts +335 -0
  116. package/scripts/utils/config-loader.ts +197 -3
  117. package/scripts/utils/multi-repo-validator.ts +141 -0
  118. package/scripts/utils/spec-archiver.ts +260 -0
  119. package/scripts/utils/spec-updater.ts +4 -0
  120. package/templates/claude/agents/pr-size-monitor/AGENT.md +330 -0
  121. package/templates/claude/commands/michi/spec-impl.md +208 -35
  122. package/templates/multi-repo/docs/ci-status.md +51 -0
  123. package/templates/multi-repo/docs/release-notes.md +99 -0
  124. package/templates/multi-repo/overview/architecture.md +102 -0
  125. package/templates/multi-repo/overview/requirements.md +68 -0
  126. package/templates/multi-repo/overview/sequence.md +79 -0
  127. package/templates/multi-repo/steering/multi-repo.md +74 -0
  128. package/templates/multi-repo/tests/strategy.md +89 -0
  129. package/dist/scripts/__tests__/create-project.test.d.ts +0 -2
  130. package/dist/scripts/__tests__/create-project.test.d.ts.map +0 -1
  131. package/dist/scripts/__tests__/create-project.test.js +0 -243
  132. package/dist/scripts/__tests__/create-project.test.js.map +0 -1
  133. package/dist/scripts/__tests__/jira-transitions.test.d.ts +0 -5
  134. package/dist/scripts/__tests__/jira-transitions.test.d.ts.map +0 -1
  135. package/dist/scripts/__tests__/jira-transitions.test.js +0 -172
  136. package/dist/scripts/__tests__/jira-transitions.test.js.map +0 -1
  137. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts +0 -2
  138. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts.map +0 -1
  139. package/dist/scripts/__tests__/multi-project-estimate.test.js +0 -118
  140. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +0 -1
  141. package/dist/scripts/__tests__/setup-existing-project.test.d.ts +0 -2
  142. package/dist/scripts/__tests__/setup-existing-project.test.d.ts.map +0 -1
  143. package/dist/scripts/__tests__/setup-existing-project.test.js +0 -208
  144. package/dist/scripts/__tests__/setup-existing-project.test.js.map +0 -1
  145. package/dist/scripts/__tests__/setup-interactive.test.d.ts +0 -2
  146. package/dist/scripts/__tests__/setup-interactive.test.d.ts.map +0 -1
  147. package/dist/scripts/__tests__/setup-interactive.test.js +0 -166
  148. package/dist/scripts/__tests__/setup-interactive.test.js.map +0 -1
  149. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts +0 -5
  150. package/dist/scripts/__tests__/spec-impl-workflow.test.d.ts.map +0 -1
  151. package/dist/scripts/__tests__/spec-impl-workflow.test.js +0 -323
  152. package/dist/scripts/__tests__/spec-impl-workflow.test.js.map +0 -1
  153. package/dist/scripts/__tests__/spec-loader.test.d.ts +0 -5
  154. package/dist/scripts/__tests__/spec-loader.test.d.ts.map +0 -1
  155. package/dist/scripts/__tests__/spec-loader.test.js +0 -153
  156. package/dist/scripts/__tests__/spec-loader.test.js.map +0 -1
  157. package/dist/scripts/__tests__/validate-phase.test.d.ts +0 -5
  158. package/dist/scripts/__tests__/validate-phase.test.d.ts.map +0 -1
  159. package/dist/scripts/__tests__/validate-phase.test.js +0 -249
  160. package/dist/scripts/__tests__/validate-phase.test.js.map +0 -1
  161. package/dist/scripts/constants/__tests__/environments.test.d.ts +0 -2
  162. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +0 -1
  163. package/dist/scripts/constants/__tests__/environments.test.js +0 -125
  164. package/dist/scripts/constants/__tests__/environments.test.js.map +0 -1
  165. package/dist/scripts/constants/__tests__/languages.test.d.ts +0 -2
  166. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +0 -1
  167. package/dist/scripts/constants/__tests__/languages.test.js +0 -82
  168. package/dist/scripts/constants/__tests__/languages.test.js.map +0 -1
  169. package/dist/scripts/create-project.d.ts +0 -16
  170. package/dist/scripts/create-project.d.ts.map +0 -1
  171. package/dist/scripts/create-project.js +0 -334
  172. package/dist/scripts/create-project.js.map +0 -1
  173. package/dist/scripts/list-projects.d.ts +0 -7
  174. package/dist/scripts/list-projects.d.ts.map +0 -1
  175. package/dist/scripts/list-projects.js +0 -88
  176. package/dist/scripts/list-projects.js.map +0 -1
  177. package/dist/scripts/template/__tests__/renderer.test.d.ts +0 -2
  178. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +0 -1
  179. package/dist/scripts/template/__tests__/renderer.test.js +0 -165
  180. package/dist/scripts/template/__tests__/renderer.test.js.map +0 -1
  181. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts +0 -5
  182. package/dist/scripts/utils/__tests__/aidlc-parser.test.d.ts.map +0 -1
  183. package/dist/scripts/utils/__tests__/aidlc-parser.test.js +0 -315
  184. package/dist/scripts/utils/__tests__/aidlc-parser.test.js.map +0 -1
  185. package/dist/scripts/utils/__tests__/business-days.test.d.ts +0 -5
  186. package/dist/scripts/utils/__tests__/business-days.test.d.ts.map +0 -1
  187. package/dist/scripts/utils/__tests__/business-days.test.js +0 -171
  188. package/dist/scripts/utils/__tests__/business-days.test.js.map +0 -1
  189. package/dist/scripts/utils/__tests__/config-loader.test.d.ts +0 -5
  190. package/dist/scripts/utils/__tests__/config-loader.test.d.ts.map +0 -1
  191. package/dist/scripts/utils/__tests__/config-loader.test.js +0 -314
  192. package/dist/scripts/utils/__tests__/config-loader.test.js.map +0 -1
  193. package/dist/scripts/utils/__tests__/config-validator.test.d.ts +0 -5
  194. package/dist/scripts/utils/__tests__/config-validator.test.d.ts.map +0 -1
  195. package/dist/scripts/utils/__tests__/config-validator.test.js +0 -396
  196. package/dist/scripts/utils/__tests__/config-validator.test.js.map +0 -1
  197. package/dist/scripts/utils/__tests__/env-config.test.d.ts +0 -5
  198. package/dist/scripts/utils/__tests__/env-config.test.d.ts.map +0 -1
  199. package/dist/scripts/utils/__tests__/env-config.test.js +0 -216
  200. package/dist/scripts/utils/__tests__/env-config.test.js.map +0 -1
  201. package/dist/scripts/utils/__tests__/feature-name-validator.test.d.ts +0 -5
  202. package/dist/scripts/utils/__tests__/feature-name-validator.test.d.ts.map +0 -1
  203. package/dist/scripts/utils/__tests__/feature-name-validator.test.js +0 -106
  204. package/dist/scripts/utils/__tests__/feature-name-validator.test.js.map +0 -1
  205. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts +0 -5
  206. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.d.ts.map +0 -1
  207. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js +0 -202
  208. package/dist/scripts/utils/__tests__/jira-issue-type-fetcher.test.js.map +0 -1
  209. package/dist/scripts/utils/__tests__/project-meta.test.d.ts +0 -6
  210. package/dist/scripts/utils/__tests__/project-meta.test.d.ts.map +0 -1
  211. package/dist/scripts/utils/__tests__/project-meta.test.js +0 -154
  212. package/dist/scripts/utils/__tests__/project-meta.test.js.map +0 -1
  213. package/dist/scripts/utils/__tests__/security-validator.test.d.ts +0 -6
  214. package/dist/scripts/utils/__tests__/security-validator.test.d.ts.map +0 -1
  215. package/dist/scripts/utils/__tests__/security-validator.test.js +0 -219
  216. package/dist/scripts/utils/__tests__/security-validator.test.js.map +0 -1
  217. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts +0 -5
  218. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts.map +0 -1
  219. package/dist/scripts/utils/__tests__/spec-updater.test.js +0 -158
  220. package/dist/scripts/utils/__tests__/spec-updater.test.js.map +0 -1
  221. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts +0 -5
  222. package/dist/scripts/utils/__tests__/tasks-converter.test.d.ts.map +0 -1
  223. package/dist/scripts/utils/__tests__/tasks-converter.test.js +0 -500
  224. package/dist/scripts/utils/__tests__/tasks-converter.test.js.map +0 -1
  225. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts +0 -5
  226. package/dist/scripts/utils/__tests__/tasks-format-validator.test.d.ts.map +0 -1
  227. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js +0 -314
  228. package/dist/scripts/utils/__tests__/tasks-format-validator.test.js.map +0 -1
  229. package/dist/scripts/utils/__tests__/test-runner.test.d.ts +0 -5
  230. package/dist/scripts/utils/__tests__/test-runner.test.d.ts.map +0 -1
  231. package/dist/scripts/utils/__tests__/test-runner.test.js +0 -64
  232. package/dist/scripts/utils/__tests__/test-runner.test.js.map +0 -1
  233. package/dist/src/__tests__/cli.test.d.ts +0 -5
  234. package/dist/src/__tests__/cli.test.d.ts.map +0 -1
  235. package/dist/src/__tests__/cli.test.js +0 -58
  236. package/dist/src/__tests__/cli.test.js.map +0 -1
  237. package/dist/src/__tests__/integration/internationalization.test.d.ts +0 -8
  238. package/dist/src/__tests__/integration/internationalization.test.d.ts.map +0 -1
  239. package/dist/src/__tests__/integration/internationalization.test.js +0 -333
  240. package/dist/src/__tests__/integration/internationalization.test.js.map +0 -1
  241. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +0 -5
  242. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +0 -1
  243. package/dist/src/__tests__/integration/setup/claude-agent.test.js +0 -122
  244. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +0 -1
  245. package/dist/src/__tests__/integration/setup/claude.test.d.ts +0 -5
  246. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +0 -1
  247. package/dist/src/__tests__/integration/setup/claude.test.js +0 -193
  248. package/dist/src/__tests__/integration/setup/claude.test.js.map +0 -1
  249. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +0 -5
  250. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +0 -1
  251. package/dist/src/__tests__/integration/setup/cursor.test.js +0 -166
  252. package/dist/src/__tests__/integration/setup/cursor.test.js.map +0 -1
  253. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +0 -32
  254. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +0 -1
  255. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +0 -72
  256. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +0 -1
  257. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +0 -38
  258. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +0 -1
  259. package/dist/src/__tests__/integration/setup/helpers/test-project.js +0 -83
  260. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +0 -1
  261. package/dist/src/__tests__/integration/setup/init.test.d.ts +0 -5
  262. package/dist/src/__tests__/integration/setup/init.test.d.ts.map +0 -1
  263. package/dist/src/__tests__/integration/setup/init.test.js +0 -352
  264. package/dist/src/__tests__/integration/setup/init.test.js.map +0 -1
  265. package/dist/src/__tests__/integration/setup/validation.test.d.ts +0 -5
  266. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +0 -1
  267. package/dist/src/__tests__/integration/setup/validation.test.js +0 -301
  268. package/dist/src/__tests__/integration/setup/validation.test.js.map +0 -1
  269. package/dist/src/commands/__tests__/init.test.d.ts +0 -5
  270. package/dist/src/commands/__tests__/init.test.d.ts.map +0 -1
  271. package/dist/src/commands/__tests__/init.test.js +0 -255
  272. package/dist/src/commands/__tests__/init.test.js.map +0 -1
  273. package/dist/src/commands/__tests__/migrate.test.d.ts +0 -5
  274. package/dist/src/commands/__tests__/migrate.test.d.ts.map +0 -1
  275. package/dist/src/commands/__tests__/migrate.test.js +0 -216
  276. package/dist/src/commands/__tests__/migrate.test.js.map +0 -1
  277. package/scripts/create-project.ts +0 -386
  278. package/scripts/list-projects.ts +0 -112
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Tests for markdown-to-confluence integration with MermaidConverter
3
+ */
4
+
5
+ import { describe, it, expect } from 'vitest';
6
+ import { convertMarkdownToConfluence } from '../markdown-to-confluence.js';
7
+
8
+ describe('convertMarkdownToConfluence', () => {
9
+ describe('Mermaid統合', () => {
10
+ it('Mermaidブロックを正しく変換', () => {
11
+ const markdown = `
12
+ # Architecture
13
+
14
+ \`\`\`mermaid
15
+ graph TD
16
+ A --> B
17
+ \`\`\`
18
+
19
+ Some text
20
+ `;
21
+
22
+ const result = convertMarkdownToConfluence(markdown);
23
+
24
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
25
+ expect(result).toContain('graph TD');
26
+ expect(result).toContain('A --> B');
27
+ expect(result).toContain('<h1>Architecture</h1>');
28
+ expect(result).toContain('<p>Some text</p>');
29
+ });
30
+
31
+ it('Mermaidと通常のコードブロックを区別', () => {
32
+ const markdown = `
33
+ \`\`\`mermaid
34
+ graph TD
35
+ A --> B
36
+ \`\`\`
37
+
38
+ \`\`\`javascript
39
+ console.log('Hello');
40
+ \`\`\`
41
+ `;
42
+
43
+ const result = convertMarkdownToConfluence(markdown);
44
+
45
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
46
+ expect(result).toContain('graph TD');
47
+ expect(result).toContain('<ac:structured-macro ac:name="code">');
48
+ expect(result).toContain('<ac:parameter ac:name="language">javascript</ac:parameter>');
49
+ expect(result).toContain('console.log(\'Hello\');');
50
+ });
51
+
52
+ it('複数のMermaidブロックを変換', () => {
53
+ const markdown = `
54
+ \`\`\`mermaid
55
+ graph TD
56
+ A --> B
57
+ \`\`\`
58
+
59
+ Text
60
+
61
+ \`\`\`mermaid
62
+ sequenceDiagram
63
+ Alice->>Bob: Hello
64
+ \`\`\`
65
+ `;
66
+
67
+ const result = convertMarkdownToConfluence(markdown);
68
+
69
+ const macroCount = (result.match(/<ac:structured-macro ac:name="mermaid">/g) || []).length;
70
+ expect(macroCount).toBe(2);
71
+ expect(result).toContain('graph TD');
72
+ expect(result).toContain('sequenceDiagram');
73
+ });
74
+ });
75
+
76
+ describe('既存機能の互換性', () => {
77
+ it('通常のMarkdownを変換', () => {
78
+ const markdown = `
79
+ # Title
80
+
81
+ This is a paragraph.
82
+
83
+ ## Subtitle
84
+
85
+ - Item 1
86
+ - Item 2
87
+ `;
88
+
89
+ const result = convertMarkdownToConfluence(markdown);
90
+
91
+ expect(result).toContain('<h1>Title</h1>');
92
+ expect(result).toContain('<h2>Subtitle</h2>');
93
+ expect(result).toContain('<p>This is a paragraph.</p>');
94
+ expect(result).toContain('<ul>');
95
+ expect(result).toContain('<li>Item 1</li>');
96
+ });
97
+
98
+ it('コードブロックを変換', () => {
99
+ const markdown = `
100
+ \`\`\`javascript
101
+ const x = 1;
102
+ \`\`\`
103
+
104
+ \`\`\`python
105
+ print("hello")
106
+ \`\`\`
107
+ `;
108
+
109
+ const result = convertMarkdownToConfluence(markdown);
110
+
111
+ expect(result).toContain('<ac:structured-macro ac:name="code">');
112
+ expect(result).toContain('<ac:parameter ac:name="language">javascript</ac:parameter>');
113
+ expect(result).toContain('const x = 1;');
114
+ expect(result).toContain('<ac:parameter ac:name="language">python</ac:parameter>');
115
+ expect(result).toContain('print("hello")');
116
+ });
117
+
118
+ it('引用をInfoマクロに変換', () => {
119
+ const markdown = `
120
+ > This is a blockquote
121
+ `;
122
+
123
+ const result = convertMarkdownToConfluence(markdown);
124
+
125
+ expect(result).toContain('<ac:structured-macro ac:name="info">');
126
+ expect(result).toContain('This is a blockquote');
127
+ });
128
+
129
+ it('テーブルを変換', () => {
130
+ const markdown = `
131
+ | Name | Age |
132
+ |------|-----|
133
+ | Alice | 30 |
134
+ | Bob | 25 |
135
+ `;
136
+
137
+ const result = convertMarkdownToConfluence(markdown);
138
+
139
+ expect(result).toContain('<table>');
140
+ expect(result).toContain('<th>Name</th>');
141
+ expect(result).toContain('<td>Alice</td>');
142
+ });
143
+
144
+ it('リンクを変換', () => {
145
+ const markdown = '[Link text](https://example.com)';
146
+
147
+ const result = convertMarkdownToConfluence(markdown);
148
+
149
+ expect(result).toContain('<a href="https://example.com">Link text</a>');
150
+ });
151
+
152
+ it('強調とボールドを変換', () => {
153
+ const markdown = '**bold** and *italic*';
154
+
155
+ const result = convertMarkdownToConfluence(markdown);
156
+
157
+ expect(result).toContain('<strong>bold</strong>');
158
+ expect(result).toContain('<em>italic</em>');
159
+ });
160
+ });
161
+
162
+ describe('複雑なドキュメント', () => {
163
+ it('Mermaidと通常のMarkdownを含むドキュメント', () => {
164
+ const markdown = `
165
+ # System Architecture
166
+
167
+ ## Overview
168
+
169
+ This is the system architecture.
170
+
171
+ \`\`\`mermaid
172
+ graph TD
173
+ A[Frontend] --> B[API Gateway]
174
+ B --> C[Microservice 1]
175
+ B --> D[Microservice 2]
176
+ \`\`\`
177
+
178
+ ## Components
179
+
180
+ ### Frontend
181
+
182
+ The frontend is built with React.
183
+
184
+ \`\`\`javascript
185
+ import React from 'react';
186
+ \`\`\`
187
+
188
+ ### Backend
189
+
190
+ \`\`\`mermaid
191
+ sequenceDiagram
192
+ Client->>API: Request
193
+ API->>Service: Process
194
+ Service-->>API: Response
195
+ API-->>Client: Result
196
+ \`\`\`
197
+
198
+ > **Note**: This is a simplified diagram.
199
+
200
+ ## Deployment
201
+
202
+ | Environment | URL |
203
+ |-------------|-----|
204
+ | Dev | dev.example.com |
205
+ | Prod | example.com |
206
+ `;
207
+
208
+ const result = convertMarkdownToConfluence(markdown);
209
+
210
+ // Mermaidブロックが変換されている
211
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
212
+ const mermaidCount = (result.match(/<ac:structured-macro ac:name="mermaid">/g) || []).length;
213
+ expect(mermaidCount).toBe(2);
214
+
215
+ // 通常のコードブロックが変換されている
216
+ expect(result).toContain('<ac:structured-macro ac:name="code">');
217
+ expect(result).toContain('import React from \'react\';');
218
+
219
+ // Markdownの基本要素が変換されている
220
+ expect(result).toContain('<h1>System Architecture</h1>');
221
+ expect(result).toContain('<h2>Overview</h2>');
222
+ expect(result).toContain('<h3>Frontend</h3>');
223
+
224
+ // 引用が変換されている
225
+ expect(result).toContain('<ac:structured-macro ac:name="info">');
226
+
227
+ // テーブルが変換されている
228
+ expect(result).toContain('<table>');
229
+ expect(result).toContain('dev.example.com');
230
+ });
231
+ });
232
+
233
+ describe('エッジケース', () => {
234
+ it('空文字列を処理', () => {
235
+ const result = convertMarkdownToConfluence('');
236
+
237
+ expect(result).toBe('');
238
+ });
239
+
240
+ it('Mermaidブロックのみ', () => {
241
+ const markdown = `\`\`\`mermaid
242
+ graph TD
243
+ A --> B
244
+ \`\`\``;
245
+
246
+ const result = convertMarkdownToConfluence(markdown);
247
+
248
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
249
+ expect(result).toContain('graph TD');
250
+ });
251
+
252
+ it('通常のMarkdownのみ(Mermaidなし)', () => {
253
+ const markdown = '# Title\n\nParagraph';
254
+
255
+ const result = convertMarkdownToConfluence(markdown);
256
+
257
+ expect(result).toContain('<h1>Title</h1>');
258
+ expect(result).toContain('<p>Paragraph</p>');
259
+ expect(result).not.toContain('mermaid');
260
+ });
261
+ });
262
+ });
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Tests for MermaidConverter
3
+ */
4
+
5
+ import { describe, it, expect } from 'vitest';
6
+ import { MermaidConverter } from '../mermaid-converter.js';
7
+
8
+ describe('MermaidConverter', () => {
9
+ let converter: MermaidConverter;
10
+
11
+ beforeEach(() => {
12
+ converter = new MermaidConverter();
13
+ });
14
+
15
+ describe('Mermaidブロック検出', () => {
16
+ it('単一のMermaidブロックを検出', () => {
17
+ const markdown = `
18
+ # タイトル
19
+
20
+ \`\`\`mermaid
21
+ graph TD
22
+ A --> B
23
+ \`\`\`
24
+
25
+ 通常のテキスト
26
+ `;
27
+
28
+ const result = converter.convertMermaidToConfluence(markdown);
29
+
30
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
31
+ expect(result).toContain('graph TD');
32
+ expect(result).toContain('A --> B');
33
+ expect(result).toContain('</ac:structured-macro>');
34
+ });
35
+
36
+ it('複数のMermaidブロックを検出', () => {
37
+ const markdown = `
38
+ \`\`\`mermaid
39
+ graph TD
40
+ A --> B
41
+ \`\`\`
42
+
43
+ テキスト
44
+
45
+ \`\`\`mermaid
46
+ sequenceDiagram
47
+ Alice->>Bob: Hello
48
+ \`\`\`
49
+ `;
50
+
51
+ const result = converter.convertMermaidToConfluence(markdown);
52
+
53
+ const macroCount = (result.match(/<ac:structured-macro ac:name="mermaid">/g) || []).length;
54
+ expect(macroCount).toBe(2);
55
+ expect(result).toContain('graph TD');
56
+ expect(result).toContain('sequenceDiagram');
57
+ });
58
+
59
+ it('Mermaidブロックがない場合は変更なし', () => {
60
+ const markdown = `
61
+ # タイトル
62
+
63
+ 通常のテキスト
64
+
65
+ \`\`\`javascript
66
+ console.log('Hello');
67
+ \`\`\`
68
+ `;
69
+
70
+ const result = converter.convertMermaidToConfluence(markdown);
71
+
72
+ expect(result).toBe(markdown);
73
+ expect(result).not.toContain('<ac:structured-macro ac:name="mermaid">');
74
+ });
75
+ });
76
+
77
+ describe('Confluenceマクロ形式変換', () => {
78
+ it('Mermaidブロックを正しいXML形式に変換', () => {
79
+ const markdown = `\`\`\`mermaid
80
+ graph LR
81
+ Start --> End
82
+ \`\`\``;
83
+
84
+ const result = converter.convertMermaidToConfluence(markdown);
85
+
86
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
87
+ expect(result).toContain('<ac:plain-text-body><![CDATA[');
88
+ expect(result).toContain('graph LR');
89
+ expect(result).toContain('Start --> End');
90
+ expect(result).toContain(']]></ac:plain-text-body>');
91
+ expect(result).toContain('</ac:structured-macro>');
92
+ });
93
+
94
+ it('Mermaid以外のコードブロックは変更しない', () => {
95
+ const markdown = `
96
+ \`\`\`mermaid
97
+ graph TD
98
+ A --> B
99
+ \`\`\`
100
+
101
+ \`\`\`javascript
102
+ const x = 1;
103
+ \`\`\`
104
+
105
+ \`\`\`python
106
+ print("hello")
107
+ \`\`\`
108
+ `;
109
+
110
+ const result = converter.convertMermaidToConfluence(markdown);
111
+
112
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
113
+ expect(result).toContain('```javascript');
114
+ expect(result).toContain('```python');
115
+ expect(result).toContain('const x = 1;');
116
+ expect(result).toContain('print("hello")');
117
+ });
118
+
119
+ it('インデントされたMermaidブロックも正しく変換', () => {
120
+ const markdown = `
121
+ \`\`\`mermaid
122
+ graph TD
123
+ A --> B
124
+ \`\`\`
125
+ `;
126
+
127
+ const result = converter.convertMermaidToConfluence(markdown);
128
+
129
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
130
+ expect(result).toContain('graph TD');
131
+ });
132
+ });
133
+
134
+ describe('特殊文字のエスケープ', () => {
135
+ it('CDATA内の特殊文字をエスケープ', () => {
136
+ const markdown = `\`\`\`mermaid
137
+ graph TD
138
+ A["Text with <> & symbols"] --> B
139
+ \`\`\``;
140
+
141
+ const result = converter.convertMermaidToConfluence(markdown);
142
+
143
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
144
+ expect(result).toContain('Text with <> & symbols');
145
+ });
146
+
147
+ it(']]>をエスケープ(CDATA終了マーカー)', () => {
148
+ const markdown = `\`\`\`mermaid
149
+ graph TD
150
+ A["Text with ]]> marker"] --> B
151
+ \`\`\``;
152
+
153
+ const result = converter.convertMermaidToConfluence(markdown);
154
+
155
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
156
+ // ]]> should be escaped or handled properly
157
+ expect(result).toMatch(/Text with.*marker/);
158
+ });
159
+ });
160
+
161
+ describe('エラーハンドリング', () => {
162
+ it('空のMermaidブロックを処理', () => {
163
+ const markdown = `\`\`\`mermaid
164
+ \`\`\``;
165
+
166
+ const result = converter.convertMermaidToConfluence(markdown);
167
+
168
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
169
+ expect(result).toContain('<ac:plain-text-body><![CDATA[');
170
+ });
171
+
172
+ it('不正な形式のMermaidブロックはフォールバック', () => {
173
+ const markdown = `\`\`\`mermaid
174
+ invalid syntax without proper structure
175
+ \`\`\``;
176
+
177
+ const result = converter.convertMermaidToConfluence(markdown);
178
+
179
+ // Should still convert to macro format (Confluence will handle rendering)
180
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
181
+ expect(result).toContain('invalid syntax without proper structure');
182
+ });
183
+ });
184
+
185
+ describe('複雑なMermaidダイアグラム', () => {
186
+ it('フローチャートを変換', () => {
187
+ const markdown = `\`\`\`mermaid
188
+ graph TD
189
+ A[Start] --> B{Decision}
190
+ B -->|Yes| C[Process 1]
191
+ B -->|No| D[Process 2]
192
+ C --> E[End]
193
+ D --> E
194
+ \`\`\``;
195
+
196
+ const result = converter.convertMermaidToConfluence(markdown);
197
+
198
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
199
+ expect(result).toContain('A[Start]');
200
+ expect(result).toContain('B{Decision}');
201
+ });
202
+
203
+ it('シーケンス図を変換', () => {
204
+ const markdown = `\`\`\`mermaid
205
+ sequenceDiagram
206
+ participant Alice
207
+ participant Bob
208
+ Alice->>Bob: Hello Bob!
209
+ Bob-->>Alice: Hi Alice!
210
+ \`\`\``;
211
+
212
+ const result = converter.convertMermaidToConfluence(markdown);
213
+
214
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
215
+ expect(result).toContain('participant Alice');
216
+ expect(result).toContain('Alice->>Bob: Hello Bob!');
217
+ });
218
+
219
+ it('クラス図を変換', () => {
220
+ const markdown = `\`\`\`mermaid
221
+ classDiagram
222
+ class Animal {
223
+ +String name
224
+ +int age
225
+ +makeSound()
226
+ }
227
+ \`\`\``;
228
+
229
+ const result = converter.convertMermaidToConfluence(markdown);
230
+
231
+ expect(result).toContain('<ac:structured-macro ac:name="mermaid">');
232
+ expect(result).toContain('classDiagram');
233
+ expect(result).toContain('class Animal');
234
+ });
235
+ });
236
+ });