@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,285 @@
1
+ /**
2
+ * multi-repo:ci-status command implementation
3
+ * リポジトリのCI結果を集約して表示
4
+ */
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { findProject } from '../../scripts/utils/config-loader.js';
8
+ import { GitHubActionsClient, parseGitHubWorkflowRun, } from '../../scripts/github-actions-client.js';
9
+ /**
10
+ * GitHub URLからowner/repoを抽出
11
+ * @param url GitHub URL
12
+ * @returns {owner, repo} または null
13
+ */
14
+ function extractGitHubOwnerRepo(url) {
15
+ const match = url.match(/github\.com\/([^/]+)\/([^/]+)/);
16
+ if (!match)
17
+ return null;
18
+ return { owner: match[1], repo: match[2] };
19
+ }
20
+ /**
21
+ * Markdownテーブル形式でCI結果を出力
22
+ * @param repositories リポジトリのCI結果
23
+ * @param diff 差分情報(オプション)
24
+ * @returns Markdown形式の文字列
25
+ */
26
+ function formatCIStatusMarkdown(repositories, diff) {
27
+ const statusIcon = {
28
+ success: '✅',
29
+ failure: '❌',
30
+ running: '⏳',
31
+ unknown: '❓',
32
+ };
33
+ const testStatusIcon = {
34
+ passed: '✅',
35
+ failed: '❌',
36
+ skipped: '⏭️',
37
+ unknown: '❓',
38
+ };
39
+ const diffIcon = (repoName) => {
40
+ if (!diff)
41
+ return '';
42
+ if (diff.newFailures.includes(repoName))
43
+ return ' 🆕';
44
+ if (diff.newSuccesses.includes(repoName))
45
+ return ' ✨';
46
+ if (diff.unchanged.includes(repoName))
47
+ return ' ➖';
48
+ return '';
49
+ };
50
+ let markdown = '# CI結果集約\n\n';
51
+ markdown += `更新日時: ${new Date().toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' })}\n\n`;
52
+ markdown += '| リポジトリ名 | ビルドステータス | テストステータス | カバレッジ | 最終実行日時 | 失敗詳細 |\n';
53
+ markdown += '|---|---|---|---|---|---|\n';
54
+ for (const repo of repositories) {
55
+ const name = repo.name + diffIcon(repo.name);
56
+ const buildStatus = statusIcon[repo.status];
57
+ const testStatus = testStatusIcon[repo.testStatus];
58
+ const coverage = repo.coverage !== undefined ? `${repo.coverage}%` : 'N/A';
59
+ const lastExecution = repo.lastExecutionTime.toLocaleString('ja-JP', {
60
+ timeZone: 'Asia/Tokyo',
61
+ year: 'numeric',
62
+ month: '2-digit',
63
+ day: '2-digit',
64
+ hour: '2-digit',
65
+ minute: '2-digit',
66
+ second: '2-digit',
67
+ });
68
+ const failureDetails = repo.failureDetails
69
+ ? `[詳細](${repo.failureDetails})`
70
+ : '-';
71
+ markdown += `| ${name} | ${buildStatus} | ${testStatus} | ${coverage} | ${lastExecution} | ${failureDetails} |\n`;
72
+ }
73
+ if (diff) {
74
+ markdown += '\n## 差分情報\n\n';
75
+ if (diff.newFailures.length > 0) {
76
+ markdown += `🆕 **新規失敗** (${diff.newFailures.length}件): ${diff.newFailures.join(', ')}\n\n`;
77
+ }
78
+ if (diff.newSuccesses.length > 0) {
79
+ markdown += `✨ **新規成功** (${diff.newSuccesses.length}件): ${diff.newSuccesses.join(', ')}\n\n`;
80
+ }
81
+ if (diff.unchanged.length > 0) {
82
+ markdown += `➖ **変化なし** (${diff.unchanged.length}件): ${diff.unchanged.join(', ')}\n\n`;
83
+ }
84
+ }
85
+ return markdown;
86
+ }
87
+ /**
88
+ * キャッシュを読み込む
89
+ * @param cachePath キャッシュファイルパス
90
+ * @returns キャッシュデータ(存在しない場合はnull)
91
+ */
92
+ function loadCache(cachePath) {
93
+ try {
94
+ if (!existsSync(cachePath)) {
95
+ return null;
96
+ }
97
+ const content = readFileSync(cachePath, 'utf-8');
98
+ const cache = JSON.parse(content);
99
+ // キャッシュの有効期限チェック(15分)
100
+ const cacheTime = new Date(cache.timestamp);
101
+ const now = new Date();
102
+ const diffMinutes = (now.getTime() - cacheTime.getTime()) / 1000 / 60;
103
+ if (diffMinutes > 15) {
104
+ return null; // 有効期限切れ
105
+ }
106
+ // lastExecutionTimeをDateオブジェクトに変換
107
+ cache.repositories = cache.repositories.map((repo) => ({
108
+ ...repo,
109
+ lastExecutionTime: new Date(repo.lastExecutionTime),
110
+ }));
111
+ return cache;
112
+ }
113
+ catch (error) {
114
+ console.warn('キャッシュの読み込みに失敗しました:', error);
115
+ return null;
116
+ }
117
+ }
118
+ /**
119
+ * キャッシュを保存
120
+ * @param cachePath キャッシュファイルパス
121
+ * @param data キャッシュデータ
122
+ */
123
+ function saveCache(cachePath, data) {
124
+ try {
125
+ const cacheDir = join(cachePath, '..');
126
+ if (!existsSync(cacheDir)) {
127
+ mkdirSync(cacheDir, { recursive: true });
128
+ }
129
+ writeFileSync(cachePath, JSON.stringify(data, null, 2), 'utf-8');
130
+ }
131
+ catch (error) {
132
+ console.warn('キャッシュの保存に失敗しました:', error);
133
+ }
134
+ }
135
+ /**
136
+ * 差分を計算
137
+ * @param previousResults 前回のCI結果
138
+ * @param currentResults 今回のCI結果
139
+ * @returns 差分情報
140
+ */
141
+ function calculateDiff(previousResults, currentResults) {
142
+ const diff = {
143
+ newFailures: [],
144
+ newSuccesses: [],
145
+ unchanged: [],
146
+ };
147
+ for (const current of currentResults) {
148
+ const previous = previousResults.find((r) => r.name === current.name);
149
+ if (!previous) {
150
+ // 新規リポジトリ
151
+ diff.unchanged.push(current.name);
152
+ continue;
153
+ }
154
+ if (previous.status === 'success' && current.status === 'failure') {
155
+ diff.newFailures.push(current.name);
156
+ }
157
+ else if (previous.status === 'failure' && current.status === 'success') {
158
+ diff.newSuccesses.push(current.name);
159
+ }
160
+ else {
161
+ diff.unchanged.push(current.name);
162
+ }
163
+ }
164
+ return diff;
165
+ }
166
+ /**
167
+ * Multi-RepoプロジェクトのCI結果を集約
168
+ *
169
+ * @param projectName プロジェクト名
170
+ * @param options オプション
171
+ * @param projectRoot プロジェクトルートディレクトリ(デフォルト: process.cwd())
172
+ * @returns CI結果集約結果
173
+ */
174
+ export async function multiRepoCIStatus(projectName, options = {}, projectRoot = process.cwd()) {
175
+ // 1. GitHub Token存在確認
176
+ if (!process.env.GITHUB_TOKEN) {
177
+ throw new Error('GITHUB_TOKENが設定されていません。環境変数にGitHub Personal Access Tokenを設定してください。');
178
+ }
179
+ // 2. プロジェクト存在確認
180
+ const project = await findProject(projectName);
181
+ if (!project) {
182
+ throw new Error(`プロジェクト「${projectName}」が見つかりません`);
183
+ }
184
+ // 3. リポジトリ存在確認
185
+ if (!project.repositories || project.repositories.length === 0) {
186
+ throw new Error(`プロジェクト「${projectName}」にリポジトリが登録されていません`);
187
+ }
188
+ // 4. 前回結果のキャッシュ読み込み
189
+ const baseDir = join(projectRoot, 'docs', 'michi', projectName, 'docs');
190
+ const cachePath = join(baseDir, '.ci-cache.json');
191
+ const previousCache = options.diff ? loadCache(cachePath) : null;
192
+ // 5. GitHub Actions APIでCI結果を並列取得
193
+ const client = new GitHubActionsClient();
194
+ const repositories = [];
195
+ const promises = project.repositories.map(async (repo) => {
196
+ const parsed = extractGitHubOwnerRepo(repo.url);
197
+ if (!parsed) {
198
+ console.warn(`リポジトリURL「${repo.url}」が無効です。スキップします。`);
199
+ return {
200
+ name: repo.name,
201
+ url: repo.url,
202
+ branch: repo.branch,
203
+ status: 'unknown',
204
+ testStatus: 'unknown',
205
+ lastExecutionTime: new Date(),
206
+ };
207
+ }
208
+ const result = await client.getLatestWorkflowRun(parsed.owner, parsed.repo, repo.branch);
209
+ if (!result.success) {
210
+ // エラーハンドリング
211
+ const error = result.error;
212
+ if (error.type === 'RATE_LIMIT_EXCEEDED') {
213
+ console.warn(`GitHub APIのレート制限に達しました。${error.retryAfter}秒後に再試行してください。`);
214
+ }
215
+ else if (error.type === 'NOT_FOUND') {
216
+ console.warn(`リポジトリ「${repo.name}」のWorkflow Runが見つかりません。`);
217
+ }
218
+ else if (error.type === 'UNAUTHORIZED') {
219
+ console.warn(`GitHub認証エラー: ${error.message}`);
220
+ }
221
+ else {
222
+ console.warn(`GitHub APIエラー (${repo.name}): ${error.message} (HTTP ${error.statusCode})`);
223
+ }
224
+ return {
225
+ name: repo.name,
226
+ url: repo.url,
227
+ branch: repo.branch,
228
+ status: 'unknown',
229
+ testStatus: 'unknown',
230
+ lastExecutionTime: new Date(),
231
+ };
232
+ }
233
+ // CI結果を解析
234
+ const parsed結果 = parseGitHubWorkflowRun(result.data);
235
+ return {
236
+ name: repo.name,
237
+ url: repo.url,
238
+ branch: repo.branch,
239
+ ...parsed結果,
240
+ };
241
+ });
242
+ const results = await Promise.all(promises);
243
+ repositories.push(...results);
244
+ // 6. 差分計算(--diffオプションが指定されている場合)
245
+ let diff;
246
+ if (options.diff && previousCache) {
247
+ diff = calculateDiff(previousCache.repositories, repositories);
248
+ }
249
+ // 7. Markdownファイルに出力
250
+ const outputPath = join(baseDir, 'ci-status.md');
251
+ const markdown = formatCIStatusMarkdown(repositories, diff);
252
+ try {
253
+ if (!existsSync(baseDir)) {
254
+ mkdirSync(baseDir, { recursive: true });
255
+ }
256
+ writeFileSync(outputPath, markdown, 'utf-8');
257
+ }
258
+ catch (error) {
259
+ const errorMessage = error instanceof Error ? error.message : String(error);
260
+ throw new Error(`Markdownファイルの書き込みに失敗しました: ${errorMessage}`);
261
+ }
262
+ // 8. キャッシュ保存
263
+ const cache = {
264
+ timestamp: new Date().toISOString(),
265
+ repositories,
266
+ };
267
+ saveCache(cachePath, cache);
268
+ // 9. サマリー計算
269
+ const summary = {
270
+ total: repositories.length,
271
+ success: repositories.filter((r) => r.status === 'success').length,
272
+ failure: repositories.filter((r) => r.status === 'failure').length,
273
+ running: repositories.filter((r) => r.status === 'running').length,
274
+ unknown: repositories.filter((r) => r.status === 'unknown').length,
275
+ };
276
+ return {
277
+ success: true,
278
+ projectName,
279
+ repositories,
280
+ outputPath,
281
+ diff,
282
+ summary,
283
+ };
284
+ }
285
+ //# sourceMappingURL=multi-repo-ci-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-repo-ci-status.js","sourceRoot":"","sources":["../../../src/commands/multi-repo-ci-status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GAEvB,MAAM,wCAAwC,CAAC;AA4ChD;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAC7B,YAAmC,EACnC,IAAmB;IAEnB,MAAM,UAAU,GAAG;QACjB,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,GAAG;KACb,CAAC;IAEF,MAAM,cAAc,GAAG;QACrB,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,GAAG;KACb,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAU,EAAE;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACtD,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,IAAI,QAAQ,GAAG,cAAc,CAAC;IAC9B,QAAQ,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC;IAE1F,QAAQ,IAAI,4DAA4D,CAAC;IACzE,QAAQ,IAAI,6BAA6B,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3E,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,EAAE;YACnE,QAAQ,EAAE,YAAY;YACtB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc;YACxC,CAAC,CAAC,QAAQ,IAAI,CAAC,cAAc,GAAG;YAChC,CAAC,CAAC,GAAG,CAAC;QAER,QAAQ,IAAI,KAAK,IAAI,MAAM,WAAW,MAAM,UAAU,MAAM,QAAQ,MAAM,aAAa,MAAM,cAAc,MAAM,CAAC;IACpH,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,QAAQ,IAAI,eAAe,CAAC;QAC5B,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,QAAQ,IAAI,gBAAgB,IAAI,CAAC,WAAW,CAAC,MAAM,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9F,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,QAAQ,IAAI,eAAe,IAAI,CAAC,YAAY,CAAC,MAAM,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/F,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,QAAQ,IAAI,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACzF,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,SAAiB;IAClC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;QAEnD,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QAEtE,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,CAAC,SAAS;QACxB,CAAC;QAED,kCAAkC;QAClC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACrD,GAAG,IAAI;YACP,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;SACpD,CAAC,CAAC,CAAC;QAEJ,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,SAAiB,EAAE,IAAmB;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CACpB,eAAsC,EACtC,cAAqC;IAErC,MAAM,IAAI,GAAiB;QACzB,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAEtE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,UAAU;YACV,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,UAA2B,EAAE,EAC7B,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,sBAAsB;IACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,UAAU,WAAW,WAAW,CAAC,CAAC;IACpD,CAAC;IAED,eAAe;IACf,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CACb,UAAU,WAAW,mBAAmB,CACzC,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjE,kCAAkC;IAClC,MAAM,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;IACzC,MAAM,YAAY,GAA0B,EAAE,CAAC;IAE/C,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CACV,YAAY,IAAI,CAAC,GAAG,iBAAiB,CACtC,CAAC;YACF,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,SAAkB;gBAC1B,UAAU,EAAE,SAAkB;gBAC9B,iBAAiB,EAAE,IAAI,IAAI,EAAE;aAC9B,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAC9C,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,IAAI,EACX,IAAI,CAAC,MAAM,CACZ,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,YAAY;YACZ,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBACzC,OAAO,CAAC,IAAI,CACV,0BAA0B,KAAK,CAAC,UAAU,eAAe,CAC1D,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,yBAAyB,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,kBAAkB,IAAI,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,UAAU,KAAK,CAAC,UAAU,GAAG,CAC5E,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,SAAkB;gBAC1B,UAAU,EAAE,SAAkB;gBAC9B,iBAAiB,EAAE,IAAI,IAAI,EAAE;aAC9B,CAAC;QACJ,CAAC;QAED,UAAU;QACV,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,QAAQ;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAE9B,iCAAiC;IACjC,IAAI,IAA8B,CAAC;IACnC,IAAI,OAAO,CAAC,IAAI,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACjE,CAAC;IAED,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,aAAa;IACb,MAAM,KAAK,GAAkB;QAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,YAAY;KACb,CAAC;IACF,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE5B,YAAY;IACZ,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,YAAY,CAAC,MAAM;QAC1B,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAClE,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAClE,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAClE,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;KACnE,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,WAAW;QACX,YAAY;QACZ,UAAU;QACV,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Multi-Repo Confluence同期コマンド
3
+ * docs/michi/{project-name}/ 配下のドキュメントをConfluenceに同期
4
+ */
5
+ /**
6
+ * 同期可能なドキュメントタイプ
7
+ */
8
+ export type DocumentType = 'requirements' | 'architecture' | 'sequence' | 'strategy' | 'ci-status' | 'release-notes';
9
+ /**
10
+ * 同期オプション
11
+ */
12
+ export interface SyncOptions {
13
+ docType?: DocumentType;
14
+ projectRoot?: string;
15
+ }
16
+ /**
17
+ * 同期されたドキュメント情報
18
+ */
19
+ export interface SyncedDocument {
20
+ docType: DocumentType;
21
+ success: boolean;
22
+ pageId?: string;
23
+ pageTitle?: string;
24
+ pageUrl?: string;
25
+ confluenceContent?: string;
26
+ error?: string;
27
+ }
28
+ /**
29
+ * 同期結果
30
+ */
31
+ export interface SyncResult {
32
+ projectName: string;
33
+ syncedDocs: SyncedDocument[];
34
+ totalSuccess: number;
35
+ totalFailed: number;
36
+ }
37
+ /**
38
+ * Multi-RepoプロジェクトのドキュメントをConfluenceに同期
39
+ *
40
+ * @param projectName プロジェクト名
41
+ * @param options 同期オプション
42
+ * @returns 同期結果
43
+ */
44
+ export declare function multiRepoConfluenceSync(projectName: string, options?: SyncOptions): Promise<SyncResult>;
45
+ //# sourceMappingURL=multi-repo-confluence-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-repo-confluence-sync.d.ts","sourceRoot":"","sources":["../../../src/commands/multi-repo-confluence-sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,cAAc,GACd,UAAU,GACV,UAAU,GACV,WAAW,GACX,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AA0BD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CA4HrB"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Multi-Repo Confluence同期コマンド
3
+ * docs/michi/{project-name}/ 配下のドキュメントをConfluenceに同期
4
+ */
5
+ import { existsSync, readFileSync } from 'fs';
6
+ import { resolve } from 'path';
7
+ import { getConfig } from '../../scripts/utils/config-loader.js';
8
+ import { ConfluenceClient, getConfluenceConfig } from '../../scripts/confluence-sync.js';
9
+ import { convertMarkdownToConfluence } from '../../scripts/markdown-to-confluence.js';
10
+ /**
11
+ * ドキュメントタイプとファイルパスのマッピング
12
+ */
13
+ const DOC_TYPE_PATHS = {
14
+ requirements: 'overview/requirements.md',
15
+ architecture: 'overview/architecture.md',
16
+ sequence: 'overview/sequence.md',
17
+ strategy: 'tests/strategy.md',
18
+ 'ci-status': 'docs/ci-status.md',
19
+ 'release-notes': 'docs/release-notes.md',
20
+ };
21
+ /**
22
+ * ドキュメントタイプのラベル(Confluenceページタイトル用)
23
+ */
24
+ const DOC_TYPE_LABELS = {
25
+ requirements: 'Requirements',
26
+ architecture: 'Architecture',
27
+ sequence: 'Sequence Diagrams',
28
+ strategy: 'Test Strategy',
29
+ 'ci-status': 'CI Status',
30
+ 'release-notes': 'Release Notes',
31
+ };
32
+ /**
33
+ * Multi-RepoプロジェクトのドキュメントをConfluenceに同期
34
+ *
35
+ * @param projectName プロジェクト名
36
+ * @param options 同期オプション
37
+ * @returns 同期結果
38
+ */
39
+ export async function multiRepoConfluenceSync(projectName, options = {}) {
40
+ const { docType, projectRoot = process.cwd() } = options;
41
+ // 1. プロジェクト存在確認
42
+ const config = getConfig();
43
+ const project = config.multiRepoProjects?.find(p => p.name === projectName);
44
+ if (!project) {
45
+ throw new Error(`Project not found: ${projectName}`);
46
+ }
47
+ // 2. Confluence認証情報確認
48
+ if (!process.env.ATLASSIAN_URL || !process.env.ATLASSIAN_EMAIL || !process.env.ATLASSIAN_API_TOKEN) {
49
+ throw new Error('Confluence credentials not configured. Please set ATLASSIAN_URL, ATLASSIAN_EMAIL, and ATLASSIAN_API_TOKEN environment variables.');
50
+ }
51
+ // 3. ドキュメントタイプのバリデーション
52
+ const docTypes = docType
53
+ ? [docType]
54
+ : ['requirements', 'architecture', 'sequence', 'strategy', 'ci-status', 'release-notes'];
55
+ // 無効なドキュメントタイプチェック
56
+ if (docType && !DOC_TYPE_PATHS[docType]) {
57
+ throw new Error(`Invalid document type: ${docType}. Valid types: ${Object.keys(DOC_TYPE_PATHS).join(', ')}`);
58
+ }
59
+ // 4. Confluenceクライアント初期化
60
+ const confluenceConfig = getConfluenceConfig();
61
+ const client = new ConfluenceClient(confluenceConfig);
62
+ const spaceKey = project.confluenceSpace || confluenceConfig.space;
63
+ // 5. 各ドキュメントを同期
64
+ const syncedDocs = [];
65
+ for (const type of docTypes) {
66
+ const docPath = resolve(projectRoot, 'docs', 'michi', projectName, DOC_TYPE_PATHS[type]);
67
+ // ドキュメントファイル存在確認
68
+ if (!existsSync(docPath)) {
69
+ syncedDocs.push({
70
+ docType: type,
71
+ success: false,
72
+ error: `Document not found: ${docPath}`,
73
+ });
74
+ console.log(`⏭️ Skipping ${type}: file not found`);
75
+ continue;
76
+ }
77
+ try {
78
+ // Markdownファイル読み込み
79
+ const markdown = readFileSync(docPath, 'utf-8');
80
+ // Confluence Storage Format に変換(Mermaid変換を含む)
81
+ const confluenceContent = convertMarkdownToConfluence(markdown);
82
+ // ページタイトル生成
83
+ const pageTitle = `${projectName} - ${DOC_TYPE_LABELS[type]}`;
84
+ // 親ページを検索または作成(プロジェクト名のページ)
85
+ let parentPage = await client.searchPage(spaceKey, projectName);
86
+ if (!parentPage) {
87
+ // 親ページが存在しない場合は作成
88
+ parentPage = await client.createPage(spaceKey, projectName, `<p>Multi-Repo project: ${projectName}</p>`, ['multi-repo', projectName]);
89
+ console.log(`✅ Created parent page: ${projectName}`);
90
+ }
91
+ // ドキュメントページを検索または作成
92
+ let page = await client.searchPage(spaceKey, pageTitle, parentPage.id);
93
+ if (page) {
94
+ // 既存ページを更新
95
+ const version = page.version?.number || 1;
96
+ page = await client.updatePage(page.id, pageTitle, confluenceContent, version);
97
+ console.log(`✅ Updated: ${pageTitle}`);
98
+ }
99
+ else {
100
+ // 新規ページ作成
101
+ page = await client.createPageUnderParent(spaceKey, pageTitle, confluenceContent, ['multi-repo', projectName, type], parentPage.id);
102
+ console.log(`✅ Created: ${pageTitle}`);
103
+ }
104
+ // ページURL生成
105
+ const pageUrl = `${confluenceConfig.url}/wiki/spaces/${spaceKey}/pages/${page.id}/${encodeURIComponent(pageTitle)}`;
106
+ syncedDocs.push({
107
+ docType: type,
108
+ success: true,
109
+ pageId: page.id,
110
+ pageTitle,
111
+ pageUrl,
112
+ confluenceContent,
113
+ });
114
+ }
115
+ catch (error) {
116
+ const errorMessage = error instanceof Error ? error.message : String(error);
117
+ syncedDocs.push({
118
+ docType: type,
119
+ success: false,
120
+ error: errorMessage,
121
+ });
122
+ console.error(`❌ Failed to sync ${type}: ${errorMessage}`);
123
+ }
124
+ }
125
+ // 6. 結果集計
126
+ const totalSuccess = syncedDocs.filter(d => d.success).length;
127
+ const totalFailed = syncedDocs.filter(d => !d.success).length;
128
+ return {
129
+ projectName,
130
+ syncedDocs,
131
+ totalSuccess,
132
+ totalFailed,
133
+ };
134
+ }
135
+ //# sourceMappingURL=multi-repo-confluence-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-repo-confluence-sync.js","sourceRoot":"","sources":["../../../src/commands/multi-repo-confluence-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * multi-repo:init command implementation
3
+ * 新規マルチリポジトリプロジェクトを初期化
4
+ */
5
+ /**
6
+ * 初期化結果
7
+ */
8
+ export interface InitResult {
9
+ success: boolean;
10
+ projectName: string;
11
+ jiraKey: string;
12
+ confluenceSpace: string;
13
+ createdDirectories: string[];
14
+ createdFiles: string[];
15
+ }
16
+ /**
17
+ * Multi-Repoプロジェクトを初期化
18
+ *
19
+ * @param projectName プロジェクト名
20
+ * @param jiraKey JIRAキー
21
+ * @param confluenceSpace Confluenceスペースキー
22
+ * @param projectRoot プロジェクトルートディレクトリ(デフォルト: process.cwd())
23
+ * @returns 初期化結果
24
+ */
25
+ export declare function multiRepoInit(projectName: string, jiraKey: string, confluenceSpace: string, projectRoot?: string): Promise<InitResult>;
26
+ //# sourceMappingURL=multi-repo-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-repo-init.d.ts","sourceRoot":"","sources":["../../../src/commands/multi-repo-init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,UAAU,CAAC,CA+GrB"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * multi-repo:init command implementation
3
+ * 新規マルチリポジトリプロジェクトを初期化
4
+ */
5
+ import { mkdirSync, writeFileSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { validateProjectName, validateJiraKey, } from '../../scripts/utils/multi-repo-validator.js';
8
+ import { findProject, addMultiRepoProject, } from '../../scripts/utils/config-loader.js';
9
+ import { createMultiRepoTemplateContext, renderMultiRepoTemplates, MULTI_REPO_TEMPLATES, } from '../../scripts/template/multi-repo-renderer.js';
10
+ /**
11
+ * Multi-Repoプロジェクトを初期化
12
+ *
13
+ * @param projectName プロジェクト名
14
+ * @param jiraKey JIRAキー
15
+ * @param confluenceSpace Confluenceスペースキー
16
+ * @param projectRoot プロジェクトルートディレクトリ(デフォルト: process.cwd())
17
+ * @returns 初期化結果
18
+ */
19
+ export async function multiRepoInit(projectName, jiraKey, confluenceSpace, projectRoot = process.cwd()) {
20
+ // 1. プロジェクト名のバリデーション
21
+ const projectNameValidation = validateProjectName(projectName);
22
+ if (!projectNameValidation.isValid) {
23
+ throw new Error(`プロジェクト名が無効です: ${projectNameValidation.errors.join(', ')}`);
24
+ }
25
+ // 2. JIRAキーのバリデーション
26
+ const jiraKeyValidation = validateJiraKey(jiraKey);
27
+ if (!jiraKeyValidation.isValid) {
28
+ throw new Error(`JIRAキーが無効です: ${jiraKeyValidation.errors.join(', ')}`);
29
+ }
30
+ // 3. Confluenceスペースキーの検証
31
+ if (!confluenceSpace || confluenceSpace.trim() === '') {
32
+ throw new Error('Confluenceスペースキーが空です');
33
+ }
34
+ // 4. 既存プロジェクト重複チェック
35
+ const existingProject = await findProject(projectName);
36
+ if (existingProject) {
37
+ throw new Error(`プロジェクト「${projectName}」は既に存在します`);
38
+ }
39
+ // 5. ディレクトリ構造の生成
40
+ const createdDirectories = [];
41
+ const baseDir = join(projectRoot, 'docs', 'michi', projectName);
42
+ const directories = [
43
+ join(baseDir, 'overview'),
44
+ join(baseDir, 'steering'),
45
+ join(baseDir, 'tests'),
46
+ join(baseDir, 'tests', 'scripts'),
47
+ join(baseDir, 'tests', 'results'),
48
+ join(baseDir, 'tests', 'unit'),
49
+ join(baseDir, 'tests', 'integration'),
50
+ join(baseDir, 'tests', 'e2e'),
51
+ join(baseDir, 'tests', 'performance'),
52
+ join(baseDir, 'docs'),
53
+ ];
54
+ try {
55
+ for (const dir of directories) {
56
+ mkdirSync(dir, { recursive: true });
57
+ createdDirectories.push(dir);
58
+ }
59
+ }
60
+ catch (error) {
61
+ const errorMessage = error instanceof Error ? error.message : String(error);
62
+ throw new Error(`ディレクトリの作成に失敗しました: ${errorMessage}`);
63
+ }
64
+ // 6. テンプレートファイルの展開
65
+ const createdFiles = [];
66
+ const createdAt = new Date().toISOString();
67
+ const templateContext = createMultiRepoTemplateContext(projectName, jiraKey, confluenceSpace, createdAt);
68
+ try {
69
+ const renderedTemplates = renderMultiRepoTemplates([...MULTI_REPO_TEMPLATES], templateContext, projectRoot);
70
+ // テンプレートファイルを書き込み
71
+ for (const [templateName, content] of Object.entries(renderedTemplates)) {
72
+ const filePath = join(baseDir, `${templateName}.md`);
73
+ writeFileSync(filePath, content, 'utf-8');
74
+ createdFiles.push(filePath);
75
+ }
76
+ }
77
+ catch (error) {
78
+ const errorMessage = error instanceof Error ? error.message : String(error);
79
+ throw new Error(`ファイルの作成に失敗しました: ${errorMessage}`);
80
+ }
81
+ // 7. config.jsonへのプロジェクト情報登録
82
+ const addResult = addMultiRepoProject({
83
+ name: projectName,
84
+ jiraKey,
85
+ confluenceSpace,
86
+ createdAt,
87
+ repositories: [],
88
+ }, projectRoot);
89
+ if (!addResult.success) {
90
+ throw new Error(`設定ファイルの更新に失敗しました: ${addResult.error || 'Unknown error'}`);
91
+ }
92
+ return {
93
+ success: true,
94
+ projectName,
95
+ jiraKey,
96
+ confluenceSpace,
97
+ createdDirectories,
98
+ createdFiles,
99
+ };
100
+ }
101
+ //# sourceMappingURL=multi-repo-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-repo-init.js","sourceRoot":"","sources":["../../../src/commands/multi-repo-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * multi-repo:list command implementation
3
+ * マルチリポジトリプロジェクトの一覧を表示
4
+ */
5
+ /**
6
+ * プロジェクトサマリー
7
+ */
8
+ export interface ProjectSummary {
9
+ name: string;
10
+ jiraKey: string;
11
+ repositoryCount: number;
12
+ createdAt: string;
13
+ }
14
+ /**
15
+ * リスト表示結果
16
+ */
17
+ export interface ListResult {
18
+ projects: ProjectSummary[];
19
+ totalCount: number;
20
+ }
21
+ /**
22
+ * Multi-Repoプロジェクトの一覧を取得
23
+ *
24
+ * @param projectRoot プロジェクトルートディレクトリ(デフォルト: process.cwd())
25
+ * @returns リスト表示結果
26
+ */
27
+ export declare function multiRepoList(projectRoot?: string): Promise<ListResult>;
28
+ //# sourceMappingURL=multi-repo-list.d.ts.map