@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
@@ -134,7 +134,6 @@ gh pr create --head <project-id>/feature/<feature> --base main
134
134
  | `/michi:spec-design <feature>` | 設計生成(Phase 0.3-0.4 ガイダンス付き)⭐推奨 |
135
135
  | `/michi:validate-design <feature>` | 設計レビュー(テスト計画完了確認付き) |
136
136
  | `/michi:confluence-sync <feature> [type]` | Confluence同期 |
137
- | `/michi:project-switch <project_id>` | プロジェクト切り替え |
138
137
 
139
138
  ## Michi CLIコマンド一覧
140
139
 
@@ -149,8 +148,8 @@ gh pr create --head <project-id>/feature/<feature> --base main
149
148
  | `michi phase:run <feature> <phase>` | フェーズ実行(requirements/design/tasks) |
150
149
  | `michi validate:phase <feature> <phase>` | フェーズ完了バリデーション |
151
150
  | `michi preflight [phase]` | プリフライトチェック |
152
- | `michi project:list` | プロジェクト一覧 |
153
- | `michi project:dashboard` | リソースダッシュボード生成 |
151
+ | `michi spec:list [--all]` | 仕様書一覧(--allでアーカイブも表示) |
152
+ | `michi spec:archive <feature> [--reason]` | 完了した仕様書をアーカイブ |
154
153
  | `michi workflow:run --feature <name>` | 統合ワークフロー実行 |
155
154
  | `michi config:validate` | 設定ファイルのバリデーション |
156
155
  | `michi tasks:convert <feature>` | AI-DLC形式のtasks.mdをMichiワークフロー形式に変換 |
@@ -167,51 +166,38 @@ gh pr create --head <project-id>/feature/<feature> --base main
167
166
 
168
167
  ## npmスクリプト一覧(michiリポジトリ内)
169
168
 
170
- | コマンド | 説明 |
171
- | ------------------------ | --------------------- |
172
- | `npm run setup:env` | .env テンプレート作成 |
173
- | `npm run create-project` | 新規プロジェクト作成 |
174
- | `npm run multi-estimate` | 見積もり集計 |
175
- | `npm run michi` | ローカルCLIツール実行 |
169
+ | コマンド | 説明 |
170
+ | ------------------- | --------------------- |
171
+ | `npm run setup:env` | .env テンプレート作成 |
172
+ | `npm run michi` | ローカルCLIツール実行 |
176
173
 
177
- ## プロジェクト切り替え
174
+ ## 仕様書管理
178
175
 
179
- ### 方法1: Cursorコマンド
180
-
181
- ```
182
- /michi:project-switch <project-id>
183
- ```
184
-
185
- ### 方法2: ターミナル
176
+ ### 仕様書一覧の確認
186
177
 
187
178
  ```bash
188
- cd ~/work/projects/<project-name>
189
- cat .kiro/project.json
190
- ```
191
-
192
- ## プロジェクト横断操作
179
+ # アクティブな仕様書のみ
180
+ npx @sk8metal/michi-cli spec:list
193
181
 
194
- ### すべてのプロジェクトを確認
195
-
196
- ```bash
197
- cd /path/to/michi
198
- # 全プロジェクトの一覧を表示
199
- npx @sk8metal/michi-cli project:list
182
+ # アーカイブ済みも含む
183
+ npx @sk8metal/michi-cli spec:list --all
200
184
  ```
201
185
 
202
- ### リソースダッシュボード
186
+ ### 完了した仕様書のアーカイブ
203
187
 
204
188
  ```bash
205
- # Confluenceにプロジェクト横断ダッシュボードを作成
206
- npx @sk8metal/michi-cli project:dashboard
207
- ```
189
+ # 基本的な使い方
190
+ npx @sk8metal/michi-cli spec:archive <feature>
208
191
 
209
- ### 見積もり集計
210
-
211
- ```bash
212
- npm run multi-estimate
192
+ # 理由を付けてアーカイブ
193
+ npx @sk8metal/michi-cli spec:archive <feature> --reason "v1.0.0としてリリース済み"
213
194
  ```
214
195
 
196
+ **アーカイブ条件**:
197
+ - Phase が `implementation-complete`
198
+ - `release-notes-*.md` ファイルが存在する
199
+ - まだアーカイブされていない
200
+
215
201
  ## Git/Jujutsuコマンド
216
202
 
217
203
  ### 基本フロー
@@ -308,5 +294,4 @@ npm install
308
294
  - [セットアップガイド](./setup.md)
309
295
  - [新規リポジトリセットアップ](../getting-started/new-repository-setup.md)
310
296
  - [ワークフローガイド](./workflow.md)
311
- - [マルチプロジェクト管理](./multi-project.md)
312
297
  - [テスト・検証](./testing.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sk8metal/michi-cli",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Managed Intelligent Comprehensive Hub for Integration - AI-driven development workflow automation",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -49,12 +49,9 @@
49
49
  "michi:setup:cursor": "tsx src/cli.ts setup-existing --cursor",
50
50
  "michi:setup:claude": "tsx src/cli.ts setup-existing --claude",
51
51
  "michi:setup:claude-agent": "tsx src/cli.ts setup-existing --claude-agent",
52
- "create-project": "tsx scripts/create-project.ts",
53
52
  "confluence:sync": "tsx scripts/confluence-sync.ts",
54
53
  "jira:sync": "tsx scripts/jira-sync.ts",
55
54
  "github:create-pr": "tsx scripts/pr-automation.ts",
56
- "project:list": "tsx scripts/list-projects.ts",
57
- "project:dashboard": "tsx scripts/resource-dashboard.ts",
58
55
  "multi-estimate": "tsx scripts/multi-project-estimate.ts",
59
56
  "markdown:convert": "tsx scripts/markdown-to-confluence.ts",
60
57
  "michi": "tsx src/cli.ts",
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Config Loader - Multi-Repo機能のテスト
3
+ * Task 1.3: 設定管理APIの拡張
4
+ */
5
+
6
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import { mkdirSync, rmSync, writeFileSync, existsSync } from 'fs';
8
+ import { resolve } from 'path';
9
+ import {
10
+ addMultiRepoProject,
11
+ addRepositoryToProject,
12
+ findProject,
13
+ clearConfigCache,
14
+ } from '../utils/config-loader';
15
+
16
+ // テスト用の一時ディレクトリ
17
+ const TEST_PROJECT_ROOT = resolve(__dirname, '../__test-tmp__/multi-repo-test');
18
+
19
+ describe('Multi-Repo Config Management', () => {
20
+ beforeEach(() => {
21
+ // テスト用ディレクトリを作成
22
+ mkdirSync(resolve(TEST_PROJECT_ROOT, '.michi'), { recursive: true });
23
+ clearConfigCache();
24
+ });
25
+
26
+ afterEach(() => {
27
+ // テスト用ディレクトリをクリーンアップ
28
+ if (existsSync(TEST_PROJECT_ROOT)) {
29
+ rmSync(TEST_PROJECT_ROOT, { recursive: true, force: true });
30
+ }
31
+ clearConfigCache();
32
+ });
33
+
34
+ describe('addMultiRepoProject', () => {
35
+ it('新しいプロジェクトを追加できる', () => {
36
+ const project = {
37
+ name: 'test-project',
38
+ jiraKey: 'TEST',
39
+ confluenceSpace: 'SPACE',
40
+ createdAt: '2025-12-14T10:00:00Z',
41
+ repositories: [],
42
+ };
43
+
44
+ const result = addMultiRepoProject(project, TEST_PROJECT_ROOT);
45
+
46
+ expect(result.success).toBe(true);
47
+ expect(result.project).toEqual(project);
48
+
49
+ // 設定ファイルが作成されたことを確認
50
+ const configPath = resolve(TEST_PROJECT_ROOT, '.michi/config.json');
51
+ expect(existsSync(configPath)).toBe(true);
52
+ });
53
+
54
+ it('既存のプロジェクトに新しいプロジェクトを追加できる', () => {
55
+ // 1つ目のプロジェクトを追加
56
+ const project1 = {
57
+ name: 'project1',
58
+ jiraKey: 'PROJA',
59
+ confluenceSpace: 'SPACE1',
60
+ createdAt: '2025-12-14T10:00:00Z',
61
+ repositories: [],
62
+ };
63
+ addMultiRepoProject(project1, TEST_PROJECT_ROOT);
64
+
65
+ // 2つ目のプロジェクトを追加
66
+ const project2 = {
67
+ name: 'project2',
68
+ jiraKey: 'PROJB',
69
+ confluenceSpace: 'SPACE2',
70
+ createdAt: '2025-12-14T11:00:00Z',
71
+ repositories: [],
72
+ };
73
+ const result = addMultiRepoProject(project2, TEST_PROJECT_ROOT);
74
+
75
+ expect(result.success).toBe(true);
76
+ expect(result.project).toEqual(project2);
77
+
78
+ // 両方のプロジェクトが存在することを確認
79
+ const found1 = findProject('project1', TEST_PROJECT_ROOT);
80
+ const found2 = findProject('project2', TEST_PROJECT_ROOT);
81
+
82
+ expect(found1).toEqual(project1);
83
+ expect(found2).toEqual(project2);
84
+ });
85
+
86
+ it('重複するプロジェクト名の場合はエラー', () => {
87
+ const project = {
88
+ name: 'duplicate-project',
89
+ jiraKey: 'DUP',
90
+ confluenceSpace: 'SPACE',
91
+ createdAt: '2025-12-14T10:00:00Z',
92
+ repositories: [],
93
+ };
94
+
95
+ // 1回目は成功
96
+ addMultiRepoProject(project, TEST_PROJECT_ROOT);
97
+
98
+ // 2回目は失敗
99
+ const result = addMultiRepoProject(project, TEST_PROJECT_ROOT);
100
+
101
+ expect(result.success).toBe(false);
102
+ expect(result.error).toContain('already exists');
103
+ });
104
+
105
+ it('無効なプロジェクト情報の場合はエラー', () => {
106
+ const invalidProject = {
107
+ name: '../etc/passwd', // パストラバーサル
108
+ jiraKey: 'TEST',
109
+ confluenceSpace: 'SPACE',
110
+ createdAt: '2025-12-14T10:00:00Z',
111
+ repositories: [],
112
+ };
113
+
114
+ const result = addMultiRepoProject(invalidProject, TEST_PROJECT_ROOT);
115
+
116
+ expect(result.success).toBe(false);
117
+ expect(result.error).toBeDefined();
118
+ });
119
+
120
+ it('無効なJIRAキーの場合はエラー', () => {
121
+ const invalidProject = {
122
+ name: 'test-project',
123
+ jiraKey: 'abc', // 小文字は不可
124
+ confluenceSpace: 'SPACE',
125
+ createdAt: '2025-12-14T10:00:00Z',
126
+ repositories: [],
127
+ };
128
+
129
+ const result = addMultiRepoProject(invalidProject, TEST_PROJECT_ROOT);
130
+
131
+ expect(result.success).toBe(false);
132
+ expect(result.error).toBeDefined();
133
+ });
134
+ });
135
+
136
+ describe('addRepositoryToProject', () => {
137
+ beforeEach(() => {
138
+ // テスト用プロジェクトを作成
139
+ const project = {
140
+ name: 'test-project',
141
+ jiraKey: 'TEST',
142
+ confluenceSpace: 'SPACE',
143
+ createdAt: '2025-12-14T10:00:00Z',
144
+ repositories: [],
145
+ };
146
+ addMultiRepoProject(project, TEST_PROJECT_ROOT);
147
+ });
148
+
149
+ it('プロジェクトにリポジトリを追加できる', () => {
150
+ const repository = {
151
+ name: 'repo1',
152
+ url: 'https://github.com/owner/repo1',
153
+ branch: 'main',
154
+ };
155
+
156
+ const result = addRepositoryToProject(
157
+ 'test-project',
158
+ repository,
159
+ TEST_PROJECT_ROOT,
160
+ );
161
+
162
+ expect(result.success).toBe(true);
163
+ expect(result.repository).toEqual(repository);
164
+
165
+ // プロジェクトにリポジトリが追加されたことを確認
166
+ const project = findProject('test-project', TEST_PROJECT_ROOT);
167
+ expect(project?.repositories).toHaveLength(1);
168
+ expect(project?.repositories[0]).toEqual(repository);
169
+ });
170
+
171
+ it('複数のリポジトリを追加できる', () => {
172
+ const repo1 = {
173
+ name: 'repo1',
174
+ url: 'https://github.com/owner/repo1',
175
+ branch: 'main',
176
+ };
177
+ const repo2 = {
178
+ name: 'repo2',
179
+ url: 'https://github.com/owner/repo2',
180
+ branch: 'develop',
181
+ };
182
+
183
+ addRepositoryToProject('test-project', repo1, TEST_PROJECT_ROOT);
184
+ const result = addRepositoryToProject(
185
+ 'test-project',
186
+ repo2,
187
+ TEST_PROJECT_ROOT,
188
+ );
189
+
190
+ expect(result.success).toBe(true);
191
+
192
+ const project = findProject('test-project', TEST_PROJECT_ROOT);
193
+ expect(project?.repositories).toHaveLength(2);
194
+ expect(project?.repositories).toContainEqual(repo1);
195
+ expect(project?.repositories).toContainEqual(repo2);
196
+ });
197
+
198
+ it('存在しないプロジェクトの場合はエラー', () => {
199
+ const repository = {
200
+ name: 'repo1',
201
+ url: 'https://github.com/owner/repo1',
202
+ branch: 'main',
203
+ };
204
+
205
+ const result = addRepositoryToProject(
206
+ 'non-existent',
207
+ repository,
208
+ TEST_PROJECT_ROOT,
209
+ );
210
+
211
+ expect(result.success).toBe(false);
212
+ expect(result.error).toContain('not found');
213
+ });
214
+
215
+ it('無効なリポジトリURLの場合はエラー', () => {
216
+ const invalidRepo = {
217
+ name: 'repo1',
218
+ url: 'https://gitlab.com/owner/repo1', // GitLabは非対応
219
+ branch: 'main',
220
+ };
221
+
222
+ const result = addRepositoryToProject(
223
+ 'test-project',
224
+ invalidRepo,
225
+ TEST_PROJECT_ROOT,
226
+ );
227
+
228
+ expect(result.success).toBe(false);
229
+ expect(result.error).toBeDefined();
230
+ });
231
+
232
+ it('重複するリポジトリ名の場合はエラー', () => {
233
+ const repository = {
234
+ name: 'duplicate-repo',
235
+ url: 'https://github.com/owner/repo1',
236
+ branch: 'main',
237
+ };
238
+
239
+ // 1回目は成功
240
+ addRepositoryToProject('test-project', repository, TEST_PROJECT_ROOT);
241
+
242
+ // 2回目は失敗
243
+ const result = addRepositoryToProject(
244
+ 'test-project',
245
+ repository,
246
+ TEST_PROJECT_ROOT,
247
+ );
248
+
249
+ expect(result.success).toBe(false);
250
+ expect(result.error).toContain('already exists');
251
+ });
252
+ });
253
+
254
+ describe('findProject', () => {
255
+ beforeEach(() => {
256
+ // テスト用プロジェクトを複数作成
257
+ const project1 = {
258
+ name: 'project1',
259
+ jiraKey: 'PROJA',
260
+ confluenceSpace: 'SPACE1',
261
+ createdAt: '2025-12-14T10:00:00Z',
262
+ repositories: [
263
+ {
264
+ name: 'repo1',
265
+ url: 'https://github.com/owner/repo1',
266
+ branch: 'main',
267
+ },
268
+ ],
269
+ };
270
+ const project2 = {
271
+ name: 'project2',
272
+ jiraKey: 'PROJB',
273
+ confluenceSpace: 'SPACE2',
274
+ createdAt: '2025-12-14T11:00:00Z',
275
+ repositories: [],
276
+ };
277
+
278
+ addMultiRepoProject(project1, TEST_PROJECT_ROOT);
279
+ addMultiRepoProject(project2, TEST_PROJECT_ROOT);
280
+ });
281
+
282
+ it('プロジェクト名で検索できる', () => {
283
+ const project = findProject('project1', TEST_PROJECT_ROOT);
284
+
285
+ expect(project).toBeDefined();
286
+ expect(project?.name).toBe('project1');
287
+ expect(project?.jiraKey).toBe('PROJA');
288
+ expect(project?.repositories).toHaveLength(1);
289
+ });
290
+
291
+ it('存在しないプロジェクトの場合はnullを返す', () => {
292
+ const project = findProject('non-existent', TEST_PROJECT_ROOT);
293
+
294
+ expect(project).toBeNull();
295
+ });
296
+
297
+ it('設定ファイルが存在しない場合はnullを返す', () => {
298
+ const emptyRoot = resolve(__dirname, '../__test-tmp__/empty-project');
299
+ mkdirSync(emptyRoot, { recursive: true });
300
+
301
+ const project = findProject('project1', emptyRoot);
302
+
303
+ expect(project).toBeNull();
304
+
305
+ rmSync(emptyRoot, { recursive: true, force: true });
306
+ });
307
+ });
308
+
309
+ describe('アトミック更新', () => {
310
+ it('設定ファイルの更新中にエラーが発生しても既存の設定が破損しない', () => {
311
+ // 初期設定を作成
312
+ const configPath = resolve(TEST_PROJECT_ROOT, '.michi/config.json');
313
+ const initialConfig = {
314
+ multiRepoProjects: [
315
+ {
316
+ name: 'existing-project',
317
+ jiraKey: 'EXIST',
318
+ confluenceSpace: 'SPACE',
319
+ createdAt: '2025-12-14T10:00:00Z',
320
+ repositories: [],
321
+ },
322
+ ],
323
+ };
324
+ writeFileSync(configPath, JSON.stringify(initialConfig, null, 2));
325
+
326
+ // 無効なプロジェクトを追加しようとする(失敗するはず)
327
+ const invalidProject = {
328
+ name: '../etc/passwd',
329
+ jiraKey: 'TEST',
330
+ confluenceSpace: 'SPACE',
331
+ createdAt: '2025-12-14T11:00:00Z',
332
+ repositories: [],
333
+ };
334
+ addMultiRepoProject(invalidProject, TEST_PROJECT_ROOT);
335
+
336
+ // 既存の設定が破損していないことを確認
337
+ const existingProject = findProject('existing-project', TEST_PROJECT_ROOT);
338
+ expect(existingProject).toBeDefined();
339
+ expect(existingProject?.name).toBe('existing-project');
340
+ });
341
+ });
342
+ });