@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
@@ -1,216 +0,0 @@
1
- /**
2
- * migrate command のテスト
3
- */
4
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
- import { existsSync, writeFileSync, mkdirSync, rmSync, readFileSync, readdirSync } from 'fs';
6
- import { resolve, join } from 'path';
7
- import { tmpdir } from 'os';
8
- import { migrate } from '../migrate.js';
9
- describe('migrate command', () => {
10
- let testProjectRoot;
11
- let testHomeDir;
12
- let originalEnv;
13
- beforeEach(() => {
14
- // テスト用の一時ディレクトリを作成(ランダム要素を追加して衝突を防ぐ)
15
- testProjectRoot = resolve(tmpdir(), `michi-test-project-${Date.now()}-${Math.random().toString(36).substring(7)}`);
16
- testHomeDir = resolve(tmpdir(), `michi-test-home-${Date.now()}-${Math.random().toString(36).substring(7)}`);
17
- // 既存のディレクトリがあれば削除
18
- if (existsSync(testProjectRoot)) {
19
- rmSync(testProjectRoot, { recursive: true, force: true });
20
- }
21
- if (existsSync(testHomeDir)) {
22
- rmSync(testHomeDir, { recursive: true, force: true });
23
- }
24
- // テスト用ディレクトリ構造を作成
25
- mkdirSync(testProjectRoot, { recursive: true });
26
- mkdirSync(join(testProjectRoot, '.kiro'), { recursive: true });
27
- mkdirSync(join(testProjectRoot, '.michi'), { recursive: true });
28
- mkdirSync(testHomeDir, { recursive: true });
29
- mkdirSync(join(testHomeDir, '.michi'), { recursive: true });
30
- // 環境変数をバックアップ
31
- originalEnv = { ...process.env };
32
- // HOMEディレクトリをテスト用に変更
33
- process.env.HOME = testHomeDir;
34
- // プロジェクトルートに移動
35
- process.chdir(testProjectRoot);
36
- });
37
- afterEach(() => {
38
- // 環境変数を復元
39
- process.env = originalEnv;
40
- // テスト用ディレクトリを削除
41
- if (existsSync(testProjectRoot)) {
42
- try {
43
- rmSync(testProjectRoot, { recursive: true, force: true });
44
- }
45
- catch {
46
- // 削除失敗は無視
47
- }
48
- }
49
- if (existsSync(testHomeDir)) {
50
- try {
51
- rmSync(testHomeDir, { recursive: true, force: true });
52
- }
53
- catch {
54
- // 削除失敗は無視
55
- }
56
- }
57
- });
58
- describe('正常移行', () => {
59
- it('.env から ~/.michi/.env に組織設定を移行し、プロジェクト設定を残す', async () => {
60
- // .env ファイルを作成
61
- const envContent = `
62
- ATLASSIAN_URL=https://test.atlassian.net
63
- ATLASSIAN_EMAIL=test@example.com
64
- ATLASSIAN_API_TOKEN=test-token
65
- GITHUB_ORG=test-org
66
- GITHUB_TOKEN=ghp_test
67
- CONFLUENCE_PRD_SPACE=PRD
68
- CONFLUENCE_QA_SPACE=QA
69
- CONFLUENCE_RELEASE_SPACE=REL
70
- JIRA_ISSUE_TYPE_STORY=Story
71
- JIRA_ISSUE_TYPE_SUBTASK=Subtask
72
- JIRA_PROJECT_KEYS=TEST,DEMO
73
- GITHUB_REPO=test-org/test-repo
74
- `.trim();
75
- writeFileSync(join(testProjectRoot, '.env'), envContent);
76
- // project.json を作成
77
- writeFileSync(join(testProjectRoot, '.kiro', 'project.json'), JSON.stringify({
78
- projectId: 'test-project',
79
- projectName: 'Test Project'
80
- }, null, 2));
81
- // migrate 実行(--force で確認スキップ)
82
- await migrate({ force: true });
83
- // ~/.michi/.env が作成されたことを確認
84
- const globalEnvPath = join(testHomeDir, '.michi', '.env');
85
- expect(existsSync(globalEnvPath)).toBe(true);
86
- // 組織設定が ~/.michi/.env に移行されたことを確認
87
- const globalEnvContent = readFileSync(globalEnvPath, 'utf-8');
88
- expect(globalEnvContent).toContain('ATLASSIAN_URL=https://test.atlassian.net');
89
- expect(globalEnvContent).toContain('ATLASSIAN_EMAIL=test@example.com');
90
- expect(globalEnvContent).toContain('ATLASSIAN_API_TOKEN=test-token');
91
- expect(globalEnvContent).toContain('GITHUB_ORG=test-org');
92
- expect(globalEnvContent).toContain('GITHUB_TOKEN=ghp_test');
93
- expect(globalEnvContent).toContain('CONFLUENCE_PRD_SPACE=PRD');
94
- expect(globalEnvContent).toContain('CONFLUENCE_QA_SPACE=QA');
95
- expect(globalEnvContent).toContain('CONFLUENCE_RELEASE_SPACE=REL');
96
- expect(globalEnvContent).toContain('JIRA_ISSUE_TYPE_STORY=Story');
97
- expect(globalEnvContent).toContain('JIRA_ISSUE_TYPE_SUBTASK=Subtask');
98
- // プロジェクト .env にプロジェクト設定が残っていることを確認
99
- const projectEnvContent = readFileSync(join(testProjectRoot, '.env'), 'utf-8');
100
- expect(projectEnvContent).toContain('JIRA_PROJECT_KEYS=TEST,DEMO');
101
- // 組織設定が削除されていることを確認
102
- expect(projectEnvContent).not.toContain('ATLASSIAN_URL');
103
- expect(projectEnvContent).not.toContain('GITHUB_TOKEN');
104
- // project.json に repository が追加されたことを確認
105
- const projectJson = JSON.parse(readFileSync(join(testProjectRoot, '.kiro', 'project.json'), 'utf-8'));
106
- expect(projectJson.repository).toBe('https://github.com/test-org/test-repo.git');
107
- // GITHUB_REPO が削除されたことを確認
108
- expect(projectEnvContent).not.toContain('GITHUB_REPO');
109
- });
110
- });
111
- describe('--dry-run モード', () => {
112
- it('変更内容をプレビューするが実際には変更しない', async () => {
113
- // .env ファイルを作成
114
- const envContent = 'ATLASSIAN_URL=https://test.atlassian.net\nJIRA_PROJECT_KEYS=TEST';
115
- writeFileSync(join(testProjectRoot, '.env'), envContent);
116
- // migrate 実行(--dry-run)
117
- await migrate({ dryRun: true });
118
- // ~/.michi/.env が作成されていないことを確認
119
- const globalEnvPath = join(testHomeDir, '.michi', '.env');
120
- expect(existsSync(globalEnvPath)).toBe(false);
121
- // プロジェクト .env が変更されていないことを確認
122
- const projectEnvContent = readFileSync(join(testProjectRoot, '.env'), 'utf-8');
123
- expect(projectEnvContent).toBe(envContent);
124
- });
125
- });
126
- describe('--force モード', () => {
127
- it('確認プロンプトをスキップして移行を実行する', async () => {
128
- // .env ファイルを作成
129
- const envContent = 'ATLASSIAN_URL=https://test.atlassian.net';
130
- writeFileSync(join(testProjectRoot, '.env'), envContent);
131
- // migrate 実行(--force)
132
- await migrate({ force: true });
133
- // ~/.michi/.env が作成されたことを確認
134
- const globalEnvPath = join(testHomeDir, '.michi', '.env');
135
- expect(existsSync(globalEnvPath)).toBe(true);
136
- });
137
- });
138
- describe('--rollback モード', () => {
139
- it('バックアップから設定を復元する', async () => {
140
- // バックアップディレクトリを作成
141
- const backupDir = join(testProjectRoot, '.michi-backup-test');
142
- mkdirSync(backupDir, { recursive: true });
143
- // バックアップファイルを作成
144
- const originalEnvContent = 'ATLASSIAN_URL=https://original.atlassian.net';
145
- writeFileSync(join(backupDir, '.env'), originalEnvContent);
146
- // 現在の .env を作成(異なる内容)
147
- writeFileSync(join(testProjectRoot, '.env'), 'ATLASSIAN_URL=https://modified.atlassian.net');
148
- // ロールバック実行
149
- await migrate({ rollback: backupDir });
150
- // .env が元の内容に戻っていることを確認
151
- const restoredContent = readFileSync(join(testProjectRoot, '.env'), 'utf-8');
152
- expect(restoredContent).toBe(originalEnvContent);
153
- });
154
- });
155
- describe('~/.michi/.env 既存時の処理', () => {
156
- it('既存の ~/.michi/.env がある場合はエラーを表示する(--force なし)', async () => {
157
- // .env ファイルを作成
158
- writeFileSync(join(testProjectRoot, '.env'), 'ATLASSIAN_URL=https://test.atlassian.net');
159
- // 既存の ~/.michi/.env を作成
160
- writeFileSync(join(testHomeDir, '.michi', '.env'), 'EXISTING=value');
161
- // migrate 実行(エラーを期待)
162
- await expect(migrate({})).rejects.toThrow();
163
- });
164
- it('--force を使用すると既存の ~/.michi/.env を上書きする', async () => {
165
- // .env ファイルを作成
166
- writeFileSync(join(testProjectRoot, '.env'), 'ATLASSIAN_URL=https://test.atlassian.net');
167
- // 既存の ~/.michi/.env を作成
168
- writeFileSync(join(testHomeDir, '.michi', '.env'), 'EXISTING=value');
169
- // migrate 実行(--force)
170
- await migrate({ force: true });
171
- // ~/.michi/.env が更新されたことを確認
172
- const globalEnvContent = readFileSync(join(testHomeDir, '.michi', '.env'), 'utf-8');
173
- expect(globalEnvContent).toContain('ATLASSIAN_URL=https://test.atlassian.net');
174
- expect(globalEnvContent).not.toContain('EXISTING=value');
175
- });
176
- });
177
- describe('.env 不存在時のエラー', () => {
178
- it('.env が存在しない場合はエラーを表示する', async () => {
179
- // .env を作成しない
180
- // migrate 実行(エラーを期待)
181
- await expect(migrate({ force: true })).rejects.toThrow(/\.env.*not found/i);
182
- });
183
- });
184
- describe('GITHUB_REPO 移行', () => {
185
- it('GITHUB_REPO を project.json の repository に移行する', async () => {
186
- // .env ファイルを作成(GITHUB_REPO 含む)
187
- writeFileSync(join(testProjectRoot, '.env'), 'GITHUB_REPO=myorg/myrepo\nJIRA_PROJECT_KEYS=TEST');
188
- // project.json を作成
189
- writeFileSync(join(testProjectRoot, '.kiro', 'project.json'), JSON.stringify({
190
- projectId: 'test-project',
191
- projectName: 'Test Project'
192
- }, null, 2));
193
- // migrate 実行
194
- await migrate({ force: true });
195
- // project.json に repository が追加されたことを確認
196
- const projectJson = JSON.parse(readFileSync(join(testProjectRoot, '.kiro', 'project.json'), 'utf-8'));
197
- expect(projectJson.repository).toBe('https://github.com/myorg/myrepo.git');
198
- // .env から GITHUB_REPO が削除されたことを確認
199
- const projectEnvContent = readFileSync(join(testProjectRoot, '.env'), 'utf-8');
200
- expect(projectEnvContent).not.toContain('GITHUB_REPO');
201
- });
202
- });
203
- describe('バックアップ作成', () => {
204
- it('移行前にバックアップを作成する', async () => {
205
- // .env ファイルを作成
206
- writeFileSync(join(testProjectRoot, '.env'), 'ATLASSIAN_URL=https://test.atlassian.net');
207
- // migrate 実行
208
- await migrate({ force: true });
209
- // バックアップディレクトリが作成されたことを確認
210
- const files = readdirSync(testProjectRoot);
211
- const backupDirs = files.filter(f => f.startsWith('.michi-backup-'));
212
- expect(backupDirs.length).toBeGreaterThan(0);
213
- });
214
- });
215
- });
216
- //# sourceMappingURL=migrate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.test.js","sourceRoot":"","sources":["../../../../src/commands/__tests__/migrate.test.ts"],"names":[],"mappings":"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"}
@@ -1,386 +0,0 @@
1
- #!/usr/bin/env tsx
2
- /**
3
- * 新規プロジェクト自動セットアップスクリプト
4
- *
5
- * Issue #35: cc-sdd準拠の多環境対応基盤
6
- * - templates/ディレクトリから読み込み
7
- * - プレースホルダーはそのまま(実行時にAIが解釈)
8
- *
9
- * 使い方:
10
- * npm run create-project -- \
11
- * --name "20240115-payment-api" \
12
- * --project-name "プロジェクトA" \
13
- * --jira-key "PRJA"
14
- */
15
-
16
- import { execSync } from 'child_process';
17
- import { writeFileSync, mkdirSync, cpSync, existsSync } from 'fs';
18
- import { resolve, join, dirname, basename } from 'path';
19
- import { fileURLToPath } from 'url';
20
- import { config as loadDotenv } from 'dotenv';
21
- import { findTemplateFile, validateRequiredTemplates } from './utils/template-finder.js';
22
-
23
- // ESモジュール対応: __dirnameの代替
24
- const __filename = fileURLToPath(import.meta.url);
25
- const __dirname = dirname(__filename);
26
-
27
- loadDotenv();
28
-
29
- interface ProjectConfig {
30
- name: string; // リポジトリ名: 20240115-payment-api
31
- projectName: string; // 表示名: プロジェクトA
32
- jiraKey: string; // JIRAキー: PRJA
33
- org?: string; // GitHub組織名(デフォルト: .envから)
34
- labels?: string[]; // Confluenceラベル(デフォルト: 自動生成)
35
- }
36
-
37
- function parseArgs(): ProjectConfig {
38
- const args = process.argv.slice(2);
39
- const config: Partial<ProjectConfig> = {};
40
-
41
- for (let i = 0; i < args.length; i += 2) {
42
- const key = args[i].replace(/^--/, '');
43
- const value = args[i + 1];
44
-
45
- switch (key) {
46
- case 'name':
47
- config.name = value;
48
- break;
49
- case 'project-name':
50
- config.projectName = value;
51
- break;
52
- case 'jira-key':
53
- config.jiraKey = value;
54
- break;
55
- case 'org':
56
- config.org = value;
57
- break;
58
- case 'labels':
59
- // カンマ区切りでラベル配列に変換
60
- config.labels = value.split(',').map(l => l.trim());
61
- break;
62
- }
63
- }
64
-
65
- // 必須フィールドチェック
66
- if (!config.name || !config.projectName || !config.jiraKey) {
67
- console.error('Missing required parameters');
68
- console.error('Usage: npm run create-project -- --name <name> --project-name <display> --jira-key <key>');
69
- process.exit(1);
70
- }
71
-
72
- return config as ProjectConfig;
73
- }
74
-
75
- /**
76
- * jj/git の依存性をチェックし、利用可能なVCSを返す
77
- */
78
- function checkDependencies(): { vcs: 'jj' | 'git'; version: string } {
79
- try {
80
- const jjVersion = execSync('jj --version', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
81
- return { vcs: 'jj', version: jjVersion };
82
- } catch {
83
- try {
84
- const gitVersion = execSync('git --version', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
85
- return { vcs: 'git', version: gitVersion };
86
- } catch {
87
- console.error('❌ Neither jj nor git is installed');
88
- console.error(' Please install jj (https://github.com/martinvonz/jj) or git');
89
- process.exit(1);
90
- }
91
- }
92
- }
93
-
94
- async function createProject(config: ProjectConfig): Promise<void> {
95
- const org = config.org || process.env.GITHUB_ORG;
96
-
97
- if (!org) {
98
- console.error('❌ GitHub organization not specified');
99
- console.error(' Set GITHUB_ORG in .env or use --org parameter');
100
- process.exit(1);
101
- }
102
-
103
- const repoName = config.name;
104
- const repoUrl = `https://github.com/${org}/${repoName}`;
105
- const projectDir = resolve(`../${repoName}`);
106
-
107
- // VCS依存性チェック
108
- const deps = checkDependencies();
109
-
110
- console.log(`🚀 Creating new project: ${config.projectName}`);
111
- console.log(` Repository: ${org}/${repoName}`);
112
- console.log(` JIRA: ${config.jiraKey}`);
113
- console.log(` VCS: ${deps.vcs} (${deps.version})`);
114
- console.log('');
115
-
116
- // Step 1: GitHubリポジトリ作成
117
- console.log('📦 Step 1: Creating GitHub repository...');
118
- try {
119
- execSync(
120
- `gh repo create ${org}/${repoName} --private --description "${config.projectName}"`,
121
- { stdio: 'inherit' }
122
- );
123
- console.log(' ✅ Repository created');
124
- } catch {
125
- console.log(' ⚠️ Repository may already exist');
126
- }
127
-
128
- // Step 2: リポジトリクローン
129
- console.log('\n📥 Step 2: Cloning repository...');
130
- try {
131
- if (deps.vcs === 'jj') {
132
- execSync(`jj git clone ${repoUrl} ${projectDir}`, { stdio: 'inherit' });
133
- } else {
134
- execSync(`git clone ${repoUrl} ${projectDir}`, { stdio: 'inherit' });
135
- }
136
- console.log(' ✅ Repository cloned');
137
- } catch {
138
- console.log(' ⚠️ Clone failed, checking if directory exists...');
139
- }
140
-
141
- // Step 3: ディレクトリ存在確認と移動
142
- if (!existsSync(projectDir)) {
143
- console.error(' ❌ Project directory does not exist. Clone may have failed.');
144
- console.error(` Expected directory: ${projectDir}`);
145
- process.exit(1);
146
- }
147
-
148
- // 元の作業ディレクトリを保存
149
- const originalCwd = process.cwd();
150
-
151
- try {
152
- process.chdir(projectDir);
153
- console.log(` 📂 Working directory: ${projectDir}`);
154
-
155
- // Step 4: projects/ディレクトリとプロジェクトディレクトリを作成
156
- console.log('\n📁 Step 4: Creating project directory structure...');
157
- const projectsDir = join(projectDir, 'projects');
158
- const actualProjectDir = join(projectsDir, repoName);
159
- mkdirSync(actualProjectDir, { recursive: true });
160
- console.log(` ✅ Project directory created: ${actualProjectDir}`);
161
-
162
- // Step 5: プロジェクトディレクトリに移動
163
- process.chdir(actualProjectDir);
164
- console.log(` 📂 Working directory: ${actualProjectDir}`);
165
-
166
- // Step 6: cc-sdd導入
167
- console.log('\n⚙️ Step 6: Installing cc-sdd...');
168
- execSync('npx cc-sdd@latest --cursor --lang ja --yes', { stdio: 'inherit' });
169
- console.log(' ✅ cc-sdd installed');
170
-
171
- // Step 7: .kiro/project.json 作成
172
- console.log('\n📝 Step 7: Creating project metadata...');
173
- mkdirSync('.kiro', { recursive: true });
174
-
175
- // ラベル生成(安全なフォールバック付き)
176
- const labels = config.labels || (() => {
177
- // プロジェクトIDからプロジェクトラベル生成
178
- const projectLabel = repoName.toLowerCase().replace(/[^a-z0-9-]/g, '');
179
- const labelSet = new Set([`project:${projectLabel}`]);
180
-
181
- // ハイフンが存在する場合のみサービスラベルを生成
182
- if (repoName.includes('-')) {
183
- const parts = repoName.split('-');
184
- const servicePart = parts[parts.length - 1];
185
- const serviceLabel = servicePart.toLowerCase().replace(/[^a-z0-9-]/g, '');
186
-
187
- // サービスラベルがプロジェクトラベルと異なる場合のみ追加
188
- if (serviceLabel !== projectLabel) {
189
- labelSet.add(`service:${serviceLabel}`);
190
- }
191
- }
192
-
193
- return Array.from(labelSet);
194
- })();
195
-
196
- const projectJson = {
197
- projectId: repoName,
198
- projectName: config.projectName,
199
- jiraProjectKey: config.jiraKey,
200
- confluenceLabels: labels,
201
- status: 'active',
202
- team: [],
203
- stakeholders: ['@企画', '@部長'],
204
- repository: repoUrl,
205
- description: `${config.projectName}の開発`
206
- };
207
-
208
- writeFileSync('.kiro/project.json', JSON.stringify(projectJson, null, 2));
209
- console.log(' ✅ project.json created');
210
-
211
- // Step 8: Michiから共通ファイルをコピー(templates/から)
212
- console.log('\n📋 Step 8: Copying common files from Michi templates...');
213
- console.log(' ℹ️ Issue #35: cc-sdd compliant approach (placeholders preserved)');
214
- const michiPath = resolve(__dirname, '..');
215
-
216
- // 必須テンプレートのバリデーション
217
- const requiredTemplates = [
218
- 'rules/github-ssot.mdc',
219
- 'rules/multi-project.mdc',
220
- 'commands/michi/confluence-sync.md',
221
- 'commands/michi/project-switch.md'
222
- ];
223
-
224
- try {
225
- validateRequiredTemplates(michiPath, requiredTemplates);
226
- } catch (error) {
227
- console.error('\n❌ Template validation failed:');
228
- console.error(` ${error instanceof Error ? error.message : String(error)}`);
229
- process.exit(1);
230
- }
231
-
232
- // コピー先ディレクトリを事前に作成(actualProjectDir 配下に作成)
233
- console.log(` 📂 Copying to: ${actualProjectDir}`);
234
- mkdirSync(join(actualProjectDir, '.cursor/rules'), { recursive: true });
235
- mkdirSync(join(actualProjectDir, '.cursor/commands/michi'), { recursive: true });
236
- mkdirSync(join(actualProjectDir, '.kiro/steering'), { recursive: true });
237
- mkdirSync(join(actualProjectDir, '.kiro/settings/templates'), { recursive: true });
238
- mkdirSync(join(actualProjectDir, 'scripts/utils'), { recursive: true });
239
-
240
- // ルールファイル(templates/から)
241
- const rulesToCopy = [
242
- 'rules/multi-project.mdc',
243
- 'rules/github-ssot.mdc',
244
- 'rules/atlassian-mcp.mdc'
245
- ];
246
-
247
- for (const rulePath of rulesToCopy) {
248
- const src = findTemplateFile(michiPath, rulePath);
249
- const fileName = basename(rulePath);
250
- const dest = join(actualProjectDir, '.cursor/rules', fileName);
251
-
252
- if (src) {
253
- cpSync(src, dest);
254
- console.log(` ✅ Copied: .cursor/rules/${fileName} (from templates/)`);
255
- } else {
256
- console.log(` ⚠️ ${fileName} not found in templates/`);
257
- }
258
- }
259
-
260
- // カスタムコマンド(templates/から)
261
- const commandsToCopy = [
262
- 'commands/michi/confluence-sync.md',
263
- 'commands/michi/project-switch.md'
264
- ];
265
-
266
- for (const cmdPath of commandsToCopy) {
267
- const src = findTemplateFile(michiPath, cmdPath);
268
- const fileName = basename(cmdPath);
269
- const dest = join(actualProjectDir, '.cursor/commands/michi', fileName);
270
-
271
- if (src) {
272
- cpSync(src, dest);
273
- console.log(` ✅ Copied: .cursor/commands/michi/${fileName} (from templates/)`);
274
- } else {
275
- console.log(` ⚠️ ${fileName} not found in templates/`);
276
- }
277
- }
278
-
279
- // Steering
280
- const steeringDir = join(michiPath, '.kiro/steering');
281
- if (existsSync(steeringDir)) {
282
- const destSteeringDir = join(actualProjectDir, '.kiro/steering');
283
- mkdirSync(destSteeringDir, { recursive: true });
284
- cpSync(steeringDir, destSteeringDir, { recursive: true });
285
- console.log(' ✅ Copied: .kiro/steering/');
286
- }
287
-
288
- // Scripts(必要なスクリプトのみコピー)
289
- const scriptsDir = join(michiPath, 'scripts');
290
- if (existsSync(scriptsDir)) {
291
- const scriptsToCopy = [
292
- 'confluence-sync.ts',
293
- 'jira-sync.ts',
294
- 'pr-automation.ts',
295
- 'markdown-to-confluence.ts',
296
- 'workflow-orchestrator.ts',
297
- 'list-projects.ts',
298
- 'resource-dashboard.ts',
299
- 'multi-project-estimate.ts',
300
- 'utils/project-meta.ts'
301
- ];
302
-
303
- for (const script of scriptsToCopy) {
304
- const src = join(scriptsDir, script);
305
- const dest = join(actualProjectDir, 'scripts', script);
306
- if (existsSync(src)) {
307
- // ディレクトリが必要な場合は作成
308
- const destDir = dirname(dest);
309
- mkdirSync(destDir, { recursive: true });
310
- cpSync(src, dest);
311
- console.log(` ✅ Copied: scripts/${script}`);
312
- }
313
- }
314
- }
315
-
316
- // package.json, tsconfig.jsonをリポジトリルートにコピー
317
- ['package.json', 'tsconfig.json'].forEach(file => {
318
- const src = join(michiPath, file);
319
- const dest = join(projectDir, file); // リポジトリルートにコピー
320
- if (existsSync(src)) {
321
- cpSync(src, dest);
322
- console.log(` ✅ Copied: ${file} (to repository root)`);
323
- }
324
- });
325
-
326
- // Step 9: npm install(リポジトリルートで実行)
327
- // 注意: setup:env は bash スクリプトなので依存関係不要だが、
328
- // 将来的に setup:env が tsx やローカルスクリプトに依存する場合は
329
- // npm install を先に実行する必要があるため、順序を入れ替え
330
- console.log('\n📦 Step 9: Installing dependencies...');
331
- process.chdir(projectDir);
332
- execSync('npm install', { stdio: 'inherit' });
333
- console.log(' ✅ Dependencies installed');
334
-
335
- // Step 10: .env テンプレート作成(プロジェクトディレクトリで実行)
336
- console.log('\n🔐 Step 10: Creating .env template...');
337
- // package.jsonはprojectDirにあるため、そこで実行
338
- execSync('npm run setup:env', { cwd: actualProjectDir, stdio: 'inherit' });
339
- console.log(' ✅ .env created');
340
-
341
- // Step 11: 初期コミット
342
- console.log('\n💾 Step 11: Creating initial commit...');
343
-
344
- const commitMessage = `chore: プロジェクト初期化
345
-
346
- - cc-sdd導入
347
- - プロジェクトメタデータ設定(${config.jiraKey})
348
- - 自動化スクリプト追加
349
- - Confluence/JIRA連携設定`;
350
-
351
- if (deps.vcs === 'jj') {
352
- execSync(`jj commit -m "${commitMessage}"`, { stdio: 'inherit' });
353
- execSync('jj bookmark create main -r "@-"', { stdio: 'inherit' });
354
- } else {
355
- execSync('git add .', { stdio: 'inherit' });
356
- execSync(`git commit -m "${commitMessage}"`, { stdio: 'inherit' });
357
- execSync('git branch -M main', { stdio: 'inherit' });
358
- }
359
- console.log(' ✅ Initial commit created');
360
-
361
- // 完了メッセージ
362
- console.log('\n');
363
- console.log('🎉 プロジェクトセットアップ完了!');
364
- console.log('');
365
- console.log('次のステップ:');
366
- console.log(` 1. cd ${actualProjectDir}`);
367
- console.log(' 2. .env ファイルを編集して認証情報を設定');
368
- console.log(' 3. jj git push --bookmark main --allow-new');
369
- console.log(' 4. Cursor で開く: cursor .');
370
- console.log(' 5. /kiro:spec-init <機能説明> で開発開始');
371
- console.log('');
372
- console.log('詳細: docs/getting-started/new-repository-setup.md');
373
-
374
- } finally {
375
- // 元の作業ディレクトリに戻る
376
- process.chdir(originalCwd);
377
- }
378
- }
379
-
380
- // 実行
381
- const config = parseArgs();
382
- createProject(config).catch(error => {
383
- console.error('❌ Error:', error.message);
384
- process.exit(1);
385
- });
386
-