@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
@@ -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
+ });