@sk8metal/michi-cli 0.0.7 → 0.0.9

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 (175) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +205 -11
  3. package/dist/scripts/__tests__/create-project.test.d.ts +2 -0
  4. package/dist/scripts/__tests__/create-project.test.d.ts.map +1 -0
  5. package/dist/scripts/__tests__/create-project.test.js +247 -0
  6. package/dist/scripts/__tests__/create-project.test.js.map +1 -0
  7. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts +2 -0
  8. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts.map +1 -0
  9. package/dist/scripts/__tests__/multi-project-estimate.test.js +119 -0
  10. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -0
  11. package/dist/scripts/__tests__/setup-existing-project.test.d.ts +2 -0
  12. package/dist/scripts/__tests__/setup-existing-project.test.d.ts.map +1 -0
  13. package/dist/scripts/__tests__/setup-existing-project.test.js +129 -0
  14. package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -0
  15. package/dist/scripts/__tests__/setup-interactive.test.d.ts +2 -0
  16. package/dist/scripts/__tests__/setup-interactive.test.d.ts.map +1 -0
  17. package/dist/scripts/__tests__/setup-interactive.test.js +160 -0
  18. package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -0
  19. package/dist/scripts/config/default-config.json +57 -0
  20. package/dist/scripts/confluence-sync.d.ts +4 -0
  21. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  22. package/dist/scripts/confluence-sync.js +12 -23
  23. package/dist/scripts/confluence-sync.js.map +1 -1
  24. package/dist/scripts/constants/__tests__/environments.test.d.ts +2 -0
  25. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
  26. package/dist/scripts/constants/__tests__/environments.test.js +91 -0
  27. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
  28. package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
  29. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
  30. package/dist/scripts/constants/__tests__/languages.test.js +82 -0
  31. package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
  32. package/dist/scripts/constants/environments.d.ts +33 -0
  33. package/dist/scripts/constants/environments.d.ts.map +1 -0
  34. package/dist/scripts/constants/environments.js +49 -0
  35. package/dist/scripts/constants/environments.js.map +1 -0
  36. package/dist/scripts/constants/languages.d.ts +23 -0
  37. package/dist/scripts/constants/languages.d.ts.map +1 -0
  38. package/dist/scripts/constants/languages.js +53 -0
  39. package/dist/scripts/constants/languages.js.map +1 -0
  40. package/dist/scripts/create-project.d.ts +4 -0
  41. package/dist/scripts/create-project.d.ts.map +1 -1
  42. package/dist/scripts/create-project.js +227 -137
  43. package/dist/scripts/create-project.js.map +1 -1
  44. package/dist/scripts/jira-sync.d.ts.map +1 -1
  45. package/dist/scripts/jira-sync.js +15 -0
  46. package/dist/scripts/jira-sync.js.map +1 -1
  47. package/dist/scripts/list-projects.d.ts.map +1 -1
  48. package/dist/scripts/list-projects.js +42 -15
  49. package/dist/scripts/list-projects.js.map +1 -1
  50. package/dist/scripts/multi-project-estimate.d.ts.map +1 -1
  51. package/dist/scripts/multi-project-estimate.js +56 -21
  52. package/dist/scripts/multi-project-estimate.js.map +1 -1
  53. package/dist/scripts/resource-dashboard.d.ts.map +1 -1
  54. package/dist/scripts/resource-dashboard.js +74 -17
  55. package/dist/scripts/resource-dashboard.js.map +1 -1
  56. package/dist/scripts/setup-existing-project.d.ts +3 -1
  57. package/dist/scripts/setup-existing-project.d.ts.map +1 -1
  58. package/dist/scripts/setup-existing-project.js +306 -217
  59. package/dist/scripts/setup-existing-project.js.map +1 -1
  60. package/dist/scripts/setup-interactive.d.ts +10 -0
  61. package/dist/scripts/setup-interactive.d.ts.map +1 -0
  62. package/dist/scripts/setup-interactive.js +413 -0
  63. package/dist/scripts/setup-interactive.js.map +1 -0
  64. package/dist/scripts/template/__tests__/renderer.test.d.ts +2 -0
  65. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
  66. package/dist/scripts/template/__tests__/renderer.test.js +165 -0
  67. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
  68. package/dist/scripts/template/renderer.d.ts +70 -0
  69. package/dist/scripts/template/renderer.d.ts.map +1 -0
  70. package/dist/scripts/template/renderer.js +99 -0
  71. package/dist/scripts/template/renderer.js.map +1 -0
  72. package/dist/scripts/utils/__tests__/config-validator.test.js +5 -0
  73. package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
  74. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts +5 -0
  75. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts.map +1 -0
  76. package/dist/scripts/utils/__tests__/spec-updater.test.js +158 -0
  77. package/dist/scripts/utils/__tests__/spec-updater.test.js.map +1 -0
  78. package/dist/scripts/utils/confluence-hierarchy.d.ts +2 -1
  79. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  80. package/dist/scripts/utils/confluence-hierarchy.js +5 -0
  81. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  82. package/dist/scripts/utils/project-finder.d.ts +30 -0
  83. package/dist/scripts/utils/project-finder.d.ts.map +1 -0
  84. package/dist/scripts/utils/project-finder.js +147 -0
  85. package/dist/scripts/utils/project-finder.js.map +1 -0
  86. package/dist/scripts/utils/spec-updater.d.ts +72 -0
  87. package/dist/scripts/utils/spec-updater.d.ts.map +1 -0
  88. package/dist/scripts/utils/spec-updater.js +141 -0
  89. package/dist/scripts/utils/spec-updater.js.map +1 -0
  90. package/dist/scripts/utils/template-finder.d.ts +37 -0
  91. package/dist/scripts/utils/template-finder.d.ts.map +1 -0
  92. package/dist/scripts/utils/template-finder.js +63 -0
  93. package/dist/scripts/utils/template-finder.js.map +1 -0
  94. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +5 -0
  95. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
  96. package/dist/src/__tests__/integration/setup/claude-agent.test.js +125 -0
  97. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
  98. package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
  99. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
  100. package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
  101. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
  102. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
  103. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
  104. package/dist/src/__tests__/integration/setup/cursor.test.js +162 -0
  105. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
  106. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
  107. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
  108. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
  109. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
  110. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
  111. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
  112. package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
  113. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
  114. package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
  115. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
  116. package/dist/src/__tests__/integration/setup/validation.test.js +318 -0
  117. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
  118. package/dist/src/cli.d.ts.map +1 -1
  119. package/dist/src/cli.js +20 -0
  120. package/dist/src/cli.js.map +1 -1
  121. package/dist/src/commands/setup-existing.d.ts +22 -0
  122. package/dist/src/commands/setup-existing.d.ts.map +1 -0
  123. package/dist/src/commands/setup-existing.js +408 -0
  124. package/dist/src/commands/setup-existing.js.map +1 -0
  125. package/dist/vitest.config.d.ts.map +1 -1
  126. package/dist/vitest.config.js +9 -6
  127. package/dist/vitest.config.js.map +1 -1
  128. package/docs/README.md +2 -2
  129. package/docs/contributing/development.md +37 -0
  130. package/docs/getting-started/{new-project-setup.md → new-repository-setup.md} +165 -38
  131. package/docs/getting-started/quick-start.md +57 -6
  132. package/docs/getting-started/setup.md +551 -180
  133. package/docs/guides/customization.md +4 -4
  134. package/docs/guides/multi-project.md +12 -9
  135. package/docs/reference/quick-reference.md +27 -18
  136. package/docs/testing/integration-tests.md +297 -0
  137. package/docs/testing-strategy.md +87 -0
  138. package/package.json +23 -6
  139. package/scripts/__tests__/create-project.test.ts +292 -0
  140. package/scripts/__tests__/multi-project-estimate.test.ts +145 -0
  141. package/scripts/__tests__/setup-existing-project.test.ts +147 -0
  142. package/scripts/__tests__/setup-interactive.test.ts +199 -0
  143. package/scripts/confluence-sync.ts +17 -29
  144. package/scripts/constants/__tests__/environments.test.ts +110 -0
  145. package/scripts/constants/__tests__/languages.test.ts +100 -0
  146. package/scripts/constants/environments.ts +61 -0
  147. package/scripts/constants/languages.ts +70 -0
  148. package/scripts/copy-static-assets.js +50 -0
  149. package/scripts/create-project.ts +251 -158
  150. package/scripts/jira-sync.ts +16 -1
  151. package/scripts/list-projects.ts +51 -24
  152. package/scripts/multi-project-estimate.ts +58 -22
  153. package/scripts/resource-dashboard.ts +91 -26
  154. package/scripts/setup-existing-project.ts +350 -230
  155. package/scripts/setup-existing.sh +159 -25
  156. package/scripts/setup-interactive.ts +565 -0
  157. package/scripts/template/__tests__/renderer.test.ts +207 -0
  158. package/scripts/template/renderer.ts +133 -0
  159. package/scripts/utils/__tests__/config-validator.test.ts +6 -0
  160. package/scripts/utils/__tests__/spec-updater.test.ts +220 -0
  161. package/scripts/utils/confluence-hierarchy.ts +7 -1
  162. package/scripts/utils/project-finder.ts +184 -0
  163. package/scripts/utils/spec-updater.ts +212 -0
  164. package/scripts/utils/template-finder.ts +75 -0
  165. package/templates/claude/commands/michi/confluence-sync.md +38 -0
  166. package/templates/claude/commands/michi/project-switch.md +36 -0
  167. package/templates/claude/rules/atlassian-integration.md +35 -0
  168. package/templates/claude/rules/michi-core.md +54 -0
  169. package/templates/claude-agent/README.md +25 -0
  170. package/templates/cursor/commands/michi/confluence-sync.md +76 -0
  171. package/templates/cursor/commands/michi/project-switch.md +69 -0
  172. package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
  173. package/templates/cursor/rules/github-ssot.mdc +151 -0
  174. package/templates/cursor/rules/multi-project.mdc +81 -0
  175. package/scripts/setup-env.sh +0 -52
package/CHANGELOG.md CHANGED
@@ -5,6 +5,61 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.0.9] - 2025-11-17
9
+
10
+ ### Added
11
+ - **統合テストスイート**: `setup-existing`コマンドの統合テスト42個を追加(#39)
12
+ - 環境別テスト(Cursor, Claude, Claude Agent)
13
+ - バリデーションテスト(プロジェクト名、JIRAキー、言語サポート)
14
+ - テストヘルパー作成(`test-project.ts`, `fs-assertions.ts`)
15
+ - テストドキュメント(`docs/testing/integration-tests.md`)
16
+ - **CI/CDワークフロー**: 統合テスト用のGitHub Actionsワークフロー(`.github/workflows/test-setup.yml`)を追加
17
+ - Node.js 20.x, 22.xでのマトリックステスト
18
+ - カバレッジレポート(Codecov統合)
19
+
20
+ ### Changed
21
+ - **Node.jsサポート範囲を変更**: Node.js 18.xのサポートを削除
22
+ - 理由: Vitest v4が使用する`node:inspector/promises`がNode.js 18.xで利用不可
23
+ - サポート対象: Node.js 20.x, 22.x
24
+
25
+ ### Fixed
26
+ - **テンプレートパス解決のバグ修正**: `scripts/setup-existing-project.ts`がテンプレートを正しく見つけられない問題を修正
27
+ - `join(michiPath, templateSource)`から`join(michiPath, 'templates', templateSource)`に変更
28
+ - 影響: スクリプト直接実行時にテンプレートファイルがコピーされなかった
29
+ - **環境定数のテスト修正**: `scripts/constants/__tests__/environments.test.ts`の期待値を更新
30
+ - `templateSource`の値を`'templates/cursor'`から`'cursor'`に修正
31
+ - **誤解を招くテスト記述を修正**: テスト名とコメントを実装と一致させるよう改善
32
+ - JIRA key conversionテスト: 「拒否」から「変換」に記述を変更
33
+ - Cursor flagテスト: 「デフォルト」から「明示的フラグ」に記述を変更
34
+ - **親ディレクトリ取得の実装を修正**: `test-project.ts`の`writeFile`メソッドを改善
35
+ - 不正確な`join(filePath, '..')`から正しい`dirname(filePath)`に変更
36
+
37
+ ### Tests
38
+ - **テスト成功率**: 82.4% (42/51テスト成功、9テストスキップ)
39
+ - **スキップされたテスト**: Issue #55(バリデーションエラーハンドリング)とIssue #56(Claude-agentテンプレート構造)で対応予定
40
+
41
+ ## [0.0.8] - 2025-11-14
42
+
43
+ ### Fixed
44
+ - `create-project.ts`: `.env`ファイルがリポジトリルートではなくプロジェクトディレクトリ(`projects/{id}/`)に作成されるように修正
45
+ - `npm run setup:env`実行時の`cwd`を`projectDir`から`actualProjectDir`に変更
46
+ - `setup-existing-project.ts`: `.cursor/rules`と`.cursor/commands/kiro`ディレクトリが存在しない場合のエラーを修正
47
+ - ファイルコピー前に`mkdirSync`でディレクトリを事前作成するように変更
48
+ - `setup-existing-project.ts`: パッケージ名の表記を統一
49
+ - すべての`@michi/cli`参照を`@sk8metal/michi-cli`に修正(使用例、package.jsonスクリプト例、グローバルインストール例)
50
+ - `setup-existing-project.ts`: 完了メッセージの不整合を修正
51
+ - 実際には作成されない`scripts/`ディレクトリの記述を削除
52
+ - `setup-interactive.ts`: プロジェクトIDのバリデーションを強化
53
+ - `getProjectMetadata`内で`validateProjectId`を呼び出し、パストラバーサル攻撃を防止
54
+ - `setup-interactive.ts`: `process.exit`の直接呼び出しを削除
55
+ - `main`関数が`Promise<number>`を返すように変更し、CLIエントリーポイントでのみ`process.exit`を呼び出すように改善
56
+ - これにより、関数のテスト容易性と再利用性が向上
57
+
58
+ ### Added
59
+ - `setup-existing-project.test.ts`: 既存プロジェクトセットアップスクリプトのテストを追加(3テスト)
60
+ - `setup-interactive.test.ts`: 対話式設定ツールのテストを追加(11テスト)
61
+ - `create-project.test.ts`: `.env`作成時の`cwd`修正をテストするケースを追加(2テスト)
62
+
8
63
  ## [0.0.7] - 2025-11-14
9
64
 
10
65
  ### Fixed
package/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
  AI駆動開発ワークフロー自動化プラットフォーム
5
5
 
6
6
  [![CI](https://github.com/sk8metalme/michi/actions/workflows/ci.yml/badge.svg)](https://github.com/sk8metalme/michi/actions/workflows/ci.yml)
7
+ [![Test Setup](https://github.com/sk8metalme/michi/actions/workflows/test-setup.yml/badge.svg)](https://github.com/sk8metalme/michi/actions/workflows/test-setup.yml)
7
8
  [![Security](https://github.com/sk8metalme/michi/actions/workflows/security.yml/badge.svg)](https://github.com/sk8metalme/michi/actions/workflows/security.yml)
8
9
  [![codecov](https://codecov.io/gh/sk8metalme/michi/branch/main/graph/badge.svg)](https://codecov.io/gh/sk8metalme/michi)
9
10
 
@@ -198,6 +199,16 @@ michi/
198
199
  │ ├── settings/ # テンプレート
199
200
  │ ├── specs/ # 機能仕様書(GitHub SSoT)
200
201
  │ └── steering/ # AIガイダンス
202
+ ├── templates/ # cc-sdd準拠のマルチ環境テンプレート(Issue #35)
203
+ │ ├── cursor/ # Cursor IDE用テンプレート
204
+ │ │ ├── rules/ # ルールファイル(.mdc)
205
+ │ │ └── commands/
206
+ │ │ └── michi/ # Michi専用コマンド
207
+ │ ├── claude/ # Claude Code用テンプレート(プレースホルダー含む)
208
+ │ │ ├── rules/ # ルールファイル(.md、統合版)
209
+ │ │ └── commands/
210
+ │ │ └── michi/ # Michi専用コマンド(言語指示含む)
211
+ │ └── claude-agent/ # Claude Agentテンプレート
201
212
  ├── scripts/ # 自動化スクリプト
202
213
  ├── docs/ # ドキュメント
203
214
  ├── env.example # 環境変数テンプレート
@@ -205,6 +216,52 @@ michi/
205
216
  └── package.json # 依存関係
206
217
  ```
207
218
 
219
+ ### テンプレートアーキテクチャ
220
+
221
+ Michiは**cc-sdd準拠の多環境対応**を目指しています:
222
+
223
+ #### 設計原則
224
+
225
+ 1. **単一の英語テンプレート**: 言語別ファイルを作らない
226
+ 2. **プレースホルダー使用**: `{{LANG_CODE}}`, `{{DEV_GUIDELINES}}` 等
227
+ 3. **AI駆動の多言語生成**: 実行時にAIが指定言語で出力
228
+ 4. **セットアップ時は置換しない**: テンプレートをそのままコピー、AIが実行時に解釈
229
+
230
+ #### プレースホルダー一覧
231
+
232
+ | プレースホルダー | 説明 | 例 |
233
+ |----------------|------|-----|
234
+ | `{{LANG_CODE}}` | 言語コード | ja, en |
235
+ | `{{DEV_GUIDELINES}}` | 言語別AI指示 | "Think in English, generate in Japanese" |
236
+ | `{{KIRO_DIR}}` | 仕様書ルート | .kiro |
237
+ | `{{AGENT_DIR}}` | エージェント設定 | .claude |
238
+ | `{{PROJECT_ID}}` | プロジェクトID | michi |
239
+ | `{{FEATURE_NAME}}` | 機能名 | user-auth |
240
+
241
+ #### テンプレート例
242
+
243
+ ```markdown
244
+ # Michi Core Principles
245
+
246
+ ## Development Guidelines
247
+ {{DEV_GUIDELINES}}
248
+
249
+ ## Language
250
+ All generated documents should be in: **{{LANG_CODE}}**
251
+
252
+ ## Project Metadata
253
+ - Project ID: {{PROJECT_ID}}
254
+ - Kiro directory: {{KIRO_DIR}}
255
+ - Agent directory: {{AGENT_DIR}}
256
+ ```
257
+
258
+ **利点:**
259
+ - ✅ 静的翻訳ファイル不要(メンテナンスコスト削減)
260
+ - ✅ cc-sddとの完全互換
261
+ - ✅ Cursor/Claude両環境で動作
262
+ - ✅ プロジェクト固有値の動的生成
263
+
264
+
208
265
  ### 設定ファイル
209
266
 
210
267
  OSS公開に対応するため、以下のテンプレートファイルを用意しています:
@@ -260,24 +317,123 @@ APPROVAL_GATES_RELEASE=SM,部長
260
317
 
261
318
  ## 他のリポジトリでプロジェクトを進める
262
319
 
263
- ### 既存リポジトリにMichiワークフローを追加(最も簡単)
320
+ ### 推奨ワークフロー(cc-sdd準拠)
321
+
322
+ 既存リポジトリにMichiを導入する標準的な手順です:
323
+
324
+ ```bash
325
+ # Step 1: cc-sddで標準ファイル生成
326
+ npx cc-sdd@latest --cursor --lang ja
327
+
328
+ # Step 2: Michi固有ファイルを追加
329
+ npx @sk8metal/michi-cli setup-existing --cursor --lang ja
330
+
331
+ # Step 3: 環境設定
332
+ npm run setup:interactive
333
+ ```
334
+
335
+ **ステップの説明**:
336
+
337
+ 1. **cc-sdd導入**: AI駆動開発ワークフローのコアフレームワークをインストール
338
+ 2. **Michi固有ファイル追加**: Confluence/JIRA連携、マルチプロジェクト管理などのMichi専用機能を追加
339
+ 3. **環境設定**: 認証情報とプロジェクトメタデータを対話的に設定
340
+
341
+ ### IDE別セットアップ例
342
+
343
+ #### Cursor IDE(推奨)
344
+
345
+ ```bash
346
+ # Step 1: cc-sdd導入
347
+ npx cc-sdd@latest --cursor --lang ja
348
+
349
+ # Step 2: Michi固有ファイル追加
350
+ npx @sk8metal/michi-cli setup-existing --cursor --lang ja
351
+ # または npm run michi:setup:cursor
352
+
353
+ # Step 3: 環境設定
354
+ npm run setup:interactive
355
+ ```
356
+
357
+ #### Claude Code
358
+
359
+ ```bash
360
+ # Step 1: cc-sdd導入
361
+ npx cc-sdd@latest --claude --lang ja
362
+
363
+ # Step 2: Michi固有ファイル追加
364
+ npx @sk8metal/michi-cli setup-existing --claude --lang ja
365
+ # または npm run michi:setup:claude
366
+
367
+ # Step 3: 環境設定
368
+ npm run setup:interactive
369
+ ```
370
+
371
+ #### Gemini CLI
372
+
373
+ ```bash
374
+ # Step 1: cc-sdd導入
375
+ npx cc-sdd@latest --gemini --lang ja
376
+
377
+ # Step 2: Michi固有ファイル追加(Cursor互換モード)
378
+ npx @sk8metal/michi-cli setup-existing --cursor --lang ja
379
+
380
+ # Step 3: 環境設定
381
+ npm run setup:interactive
382
+ ```
383
+
384
+ #### Codex CLI
385
+
386
+ ```bash
387
+ # Step 1: cc-sdd導入
388
+ npx cc-sdd@next --codex --lang ja
389
+
390
+ # Step 2: Michi固有ファイル追加(Cursor互換モード)
391
+ npx @sk8metal/michi-cli setup-existing --cursor --lang ja
392
+
393
+ # Step 3: 環境設定
394
+ npm run setup:interactive
395
+ ```
396
+
397
+ #### Windsurf IDE
398
+
399
+ ```bash
400
+ # Step 1: cc-sdd導入
401
+ npx cc-sdd@next --windsurf --lang ja
402
+
403
+ # Step 2: Michi固有ファイル追加(Cursor互換モード)
404
+ npx @sk8metal/michi-cli setup-existing --cursor --lang ja
405
+
406
+ # Step 3: 環境設定
407
+ npm run setup:interactive
408
+ ```
409
+
410
+ ### 既存リポジトリ vs 新規リポジトリ
411
+
412
+ #### 既存リポジトリにMichiを追加(推奨)
413
+
414
+ 既に稼働しているプロジェクトにMichiを追加する場合:
264
415
 
265
416
  ```bash
266
417
  # 既存プロジェクトのディレクトリに移動
267
418
  cd /path/to/existing-repo
268
419
 
269
- # Michiのセットアップスクリプトを実行(対話式)
270
- bash /path/to/michi/scripts/setup-existing.sh
420
+ # 推奨ワークフローを実行
421
+ npx cc-sdd@latest --cursor --lang ja
422
+ npx @sk8metal/michi-cli setup-existing --cursor --lang ja
423
+ npm run setup:interactive
271
424
  ```
272
425
 
273
- 対話式で以下を入力:
274
- - プロジェクト名
275
- - JIRAプロジェクトキー
276
- - 顧客名
426
+ **自動的に追加されるもの**:
427
+ - 共通ルール(`.cursor/rules/`または`.claude/rules/`)
428
+ - Michi専用コマンド(`.cursor/commands/michi/`または`.claude/commands/michi/`)
429
+ - Steeringテンプレート(`.kiro/steering/`)
430
+ - Specテンプレート(`.kiro/settings/templates/`)
431
+ - プロジェクトメタデータ(`.kiro/project.json`)
432
+ - 環境変数テンプレート(`.env`)
277
433
 
278
- 自動的にcc-sdd、ルール、スクリプトなどがセットアップされます。
434
+ #### 新規リポジトリを作成してMichiを導入
279
435
 
280
- ### 新規リポジトリを作成してセットアップ
436
+ 新しいプロジェクトをゼロから始める場合:
281
437
 
282
438
  ```bash
283
439
  # Michiディレクトリから実行
@@ -288,14 +444,19 @@ npm run create-project -- \
288
444
  --jira-key "PRJA"
289
445
  ```
290
446
 
291
- 詳細: [新規プロジェクトセットアップガイド](./docs/getting-started/new-project-setup.md)
447
+ 詳細: [新規リポジトリセットアップガイド](./docs/getting-started/new-repository-setup.md)
448
+
449
+ **どちらを選ぶべきか?**
450
+
451
+ - ✅ **既存リポジトリに追加**: 既に稼働中のプロジェクトがある場合
452
+ - ✅ **新規リポジトリ作成**: 新しいプロジェクトを始める場合
292
453
 
293
454
  ## ドキュメント
294
455
 
295
456
  ### はじめに
296
457
  - [クイックスタート](./docs/getting-started/quick-start.md) - 5分で始める ⭐
297
458
  - [セットアップガイド](./docs/getting-started/setup.md) - インストール・設定手順
298
- - [新規プロジェクトセットアップ](./docs/getting-started/new-project-setup.md) - 他リポジトリでの開始方法
459
+ - [新規リポジトリセットアップ](./docs/getting-started/new-repository-setup.md) - 新規リポジトリでの開始方法
299
460
 
300
461
  ### 実践ガイド
301
462
  - [ワークフローガイド](./docs/guides/workflow.md) - AI開発フロー ⭐
@@ -311,6 +472,7 @@ npm run create-project -- \
311
472
  - [コントリビューションガイド](./CONTRIBUTING.md) - 貢献方法
312
473
  - [開発環境セットアップ](./docs/contributing/development.md) - 開発者向けセットアップ
313
474
  - [リリース手順](./docs/contributing/release.md) - バージョンアップ・NPM公開手順
475
+ - [テスト戦略](./docs/testing-strategy.md) - テストカバレッジ目標と段階的計画 ⭐
314
476
 
315
477
  すべてのドキュメントは [docs/README.md](./docs/README.md) から参照できます。
316
478
 
@@ -481,6 +643,38 @@ feature名は以下の場所で使用されるため、**英語・小文字・
481
643
  - `-user-auth` - 先頭ハイフン(無効)
482
644
  - `very-long-feature-name-for-user-authentication` - 長すぎる
483
645
 
646
+ ## テスト
647
+
648
+ Michiプロジェクトは、統合テストによって品質を保証しています。
649
+
650
+ ### テスト実行
651
+
652
+ ```bash
653
+ # すべてのテスト実行
654
+ npm test
655
+
656
+ # 統合テストのみ実行
657
+ npm run test:integration:setup
658
+
659
+ # カバレッジ付き実行
660
+ npm run test:coverage:setup
661
+
662
+ # 監視モード
663
+ npm test -- --watch
664
+
665
+ # UIモード
666
+ npm run test:ui
667
+ ```
668
+
669
+ ### テストカバレッジ
670
+
671
+ - **目標**: 95%以上
672
+ - **現在のカバレッジ**: [![codecov](https://codecov.io/gh/sk8metalme/michi/branch/main/graph/badge.svg)](https://codecov.io/gh/sk8metalme/michi)
673
+
674
+ ### テストドキュメント
675
+
676
+ 詳細なテストガイドは [docs/testing/integration-tests.md](./docs/testing/integration-tests.md) を参照してください。
677
+
484
678
  ## 参考リンク
485
679
 
486
680
  ### AI開発フレームワーク
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create-project.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.test.d.ts","sourceRoot":"","sources":["../../../scripts/__tests__/create-project.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,247 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { execSync } from 'child_process';
3
+ import { join } from 'path';
4
+ // モジュールのモック
5
+ vi.mock('child_process');
6
+ vi.mock('fs', () => ({
7
+ existsSync: vi.fn(() => true),
8
+ mkdirSync: vi.fn(),
9
+ cpSync: vi.fn(),
10
+ writeFileSync: vi.fn()
11
+ }));
12
+ vi.mock('dotenv', () => ({ config: vi.fn() }));
13
+ describe('create-project.ts パス問題', () => {
14
+ beforeEach(() => {
15
+ vi.clearAllMocks();
16
+ });
17
+ it('.cursor, .kiro, scripts が actualProjectDir にコピーされる', () => {
18
+ const projectDir = '/test/repo';
19
+ const actualProjectDir = '/test/repo/projects/test-project';
20
+ // .cursor/rules のコピー先パスを検証
21
+ const cursorRulesPath = join(actualProjectDir, '.cursor/rules', 'test.mdc');
22
+ expect(cursorRulesPath).toContain('projects/test-project/.cursor/rules');
23
+ expect(cursorRulesPath).not.toContain(join(projectDir, '.cursor'));
24
+ // .cursor/commands のコピー先パスを検証
25
+ const cursorCommandsPath = join(actualProjectDir, '.cursor/commands/kiro', 'test.md');
26
+ expect(cursorCommandsPath).toContain('projects/test-project/.cursor/commands');
27
+ // .kiro/steering のコピー先パスを検証
28
+ const kiroSteeringPath = join(actualProjectDir, '.kiro/steering');
29
+ expect(kiroSteeringPath).toContain('projects/test-project/.kiro/steering');
30
+ // scripts のコピー先パスを検証
31
+ const scriptsPath = join(actualProjectDir, 'scripts', 'test.ts');
32
+ expect(scriptsPath).toContain('projects/test-project/scripts');
33
+ });
34
+ it('package.json と tsconfig.json は projectDir (リポジトリルート) にコピーされる', () => {
35
+ const projectDir = '/test/repo';
36
+ // package.json はリポジトリルート
37
+ const packageJsonPath = join(projectDir, 'package.json');
38
+ expect(packageJsonPath).toBe('/test/repo/package.json');
39
+ expect(packageJsonPath).not.toContain('projects/test-project');
40
+ // tsconfig.json もリポジトリルート
41
+ const tsconfigPath = join(projectDir, 'tsconfig.json');
42
+ expect(tsconfigPath).toBe('/test/repo/tsconfig.json');
43
+ expect(tsconfigPath).not.toContain('projects/test-project');
44
+ });
45
+ it('ディレクトリ作成が actualProjectDir 配下で行われる', () => {
46
+ const actualProjectDir = '/test/repo/projects/test-project';
47
+ const directories = [
48
+ join(actualProjectDir, '.cursor/rules'),
49
+ join(actualProjectDir, '.cursor/commands/kiro'),
50
+ join(actualProjectDir, '.kiro/steering'),
51
+ join(actualProjectDir, '.kiro/settings/templates'),
52
+ join(actualProjectDir, 'scripts/utils')
53
+ ];
54
+ // すべてのディレクトリが actualProjectDir 配下にあることを確認
55
+ directories.forEach(dir => {
56
+ expect(dir).toContain('projects/test-project');
57
+ expect(dir.startsWith(actualProjectDir)).toBe(true);
58
+ });
59
+ });
60
+ });
61
+ describe('create-project.ts jj/git 依存性', () => {
62
+ let mockExecSync;
63
+ beforeEach(() => {
64
+ vi.clearAllMocks();
65
+ mockExecSync = vi.mocked(execSync);
66
+ });
67
+ afterEach(() => {
68
+ vi.restoreAllMocks();
69
+ });
70
+ it('jj が利用可能な場合は jj を使用する', () => {
71
+ // jj --version が成功(文字列を返す)
72
+ mockExecSync.mockImplementationOnce((command) => {
73
+ if (command === 'jj --version') {
74
+ return 'jj 0.15.0';
75
+ }
76
+ throw new Error('Unexpected command');
77
+ });
78
+ // checkDependencies のロジックを再現
79
+ const checkDeps = () => {
80
+ try {
81
+ const jjVersion = execSync('jj --version', {
82
+ encoding: 'utf-8',
83
+ stdio: ['pipe', 'pipe', 'pipe']
84
+ }).trim();
85
+ return { vcs: 'jj', version: jjVersion };
86
+ }
87
+ catch {
88
+ return { vcs: 'git', version: 'fallback' };
89
+ }
90
+ };
91
+ const result = checkDeps();
92
+ expect(result.vcs).toBe('jj');
93
+ expect(mockExecSync).toHaveBeenCalledWith('jj --version', expect.objectContaining({ encoding: 'utf-8' }));
94
+ });
95
+ it('jj 未インストール時は git にフォールバックする', () => {
96
+ // jj --version が失敗、git --version が成功
97
+ mockExecSync.mockImplementation((command) => {
98
+ if (command === 'jj --version') {
99
+ throw new Error('jj not found');
100
+ }
101
+ if (command === 'git --version') {
102
+ return 'git version 2.40.0';
103
+ }
104
+ throw new Error('Unexpected command');
105
+ });
106
+ // checkDependencies のロジックを再現
107
+ const checkDeps = () => {
108
+ try {
109
+ const jjVersion = execSync('jj --version', {
110
+ encoding: 'utf-8',
111
+ stdio: ['pipe', 'pipe', 'pipe']
112
+ }).trim();
113
+ return { vcs: 'jj', version: jjVersion };
114
+ }
115
+ catch {
116
+ try {
117
+ const gitVersion = execSync('git --version', {
118
+ encoding: 'utf-8',
119
+ stdio: ['pipe', 'pipe', 'pipe']
120
+ }).trim();
121
+ return { vcs: 'git', version: gitVersion };
122
+ }
123
+ catch {
124
+ throw new Error('Neither jj nor git is installed');
125
+ }
126
+ }
127
+ };
128
+ const result = checkDeps();
129
+ expect(result.vcs).toBe('git');
130
+ expect(mockExecSync).toHaveBeenCalledTimes(2);
131
+ expect(mockExecSync).toHaveBeenNthCalledWith(1, 'jj --version', expect.anything());
132
+ expect(mockExecSync).toHaveBeenNthCalledWith(2, 'git --version', expect.anything());
133
+ });
134
+ it('jj も git も未インストール時はエラーを投げる', () => {
135
+ // 両方とも失敗
136
+ mockExecSync.mockImplementation(() => {
137
+ throw new Error('command not found');
138
+ });
139
+ // checkDependencies のロジックを再現
140
+ const checkDeps = () => {
141
+ try {
142
+ const jjVersion = execSync('jj --version', {
143
+ encoding: 'utf-8',
144
+ stdio: ['pipe', 'pipe', 'pipe']
145
+ }).trim();
146
+ return { vcs: 'jj', version: jjVersion };
147
+ }
148
+ catch {
149
+ try {
150
+ const gitVersion = execSync('git --version', {
151
+ encoding: 'utf-8',
152
+ stdio: ['pipe', 'pipe', 'pipe']
153
+ }).trim();
154
+ return { vcs: 'git', version: gitVersion };
155
+ }
156
+ catch {
157
+ throw new Error('Neither jj nor git is installed');
158
+ }
159
+ }
160
+ };
161
+ expect(() => checkDeps()).toThrow('Neither jj nor git is installed');
162
+ });
163
+ it('clone コマンドが VCS に応じて切り替わる', () => {
164
+ const repoUrl = 'https://github.com/org/repo';
165
+ const projectDir = '/test/repo';
166
+ // jj の場合
167
+ const jjDeps = { vcs: 'jj', version: 'jj 0.15.0' };
168
+ const jjCommand = jjDeps.vcs === 'jj'
169
+ ? `jj git clone ${repoUrl} ${projectDir}`
170
+ : `git clone ${repoUrl} ${projectDir}`;
171
+ expect(jjCommand).toBe(`jj git clone ${repoUrl} ${projectDir}`);
172
+ // git の場合
173
+ const gitDeps = { vcs: 'git', version: 'git version 2.40' };
174
+ const gitCommand = gitDeps.vcs === 'jj'
175
+ ? `jj git clone ${repoUrl} ${projectDir}`
176
+ : `git clone ${repoUrl} ${projectDir}`;
177
+ expect(gitCommand).toBe(`git clone ${repoUrl} ${projectDir}`);
178
+ });
179
+ it('commit コマンドが VCS に応じて切り替わる', () => {
180
+ const message = 'chore: initial commit';
181
+ // jj の場合のコマンド群
182
+ const jjDeps = { vcs: 'jj' };
183
+ const jjCommands = jjDeps.vcs === 'jj' ? [
184
+ `jj commit -m "${message}"`,
185
+ 'jj bookmark create main -r "@-"'
186
+ ] : [
187
+ 'git add .',
188
+ `git commit -m "${message}"`,
189
+ 'git branch -M main'
190
+ ];
191
+ expect(jjCommands).toContain('jj commit -m "chore: initial commit"');
192
+ expect(jjCommands).toContain('jj bookmark create main -r "@-"');
193
+ // git の場合のコマンド群
194
+ const gitDeps = { vcs: 'git' };
195
+ const gitCommands = gitDeps.vcs === 'jj' ? [
196
+ `jj commit -m "${message}"`,
197
+ 'jj bookmark create main -r "@-"'
198
+ ] : [
199
+ 'git add .',
200
+ `git commit -m "${message}"`,
201
+ 'git branch -M main'
202
+ ];
203
+ expect(gitCommands).toContain('git add .');
204
+ expect(gitCommands).toContain('git commit -m "chore: initial commit"');
205
+ expect(gitCommands).toContain('git branch -M main');
206
+ });
207
+ });
208
+ describe('create-project.ts .env作成時のcwd修正', () => {
209
+ let mockExecSync;
210
+ beforeEach(() => {
211
+ vi.clearAllMocks();
212
+ mockExecSync = vi.mocked(execSync);
213
+ });
214
+ afterEach(() => {
215
+ vi.restoreAllMocks();
216
+ });
217
+ it('.env作成時に actualProjectDir を cwd として使用する', () => {
218
+ const projectDir = '/test/repo';
219
+ const actualProjectDir = '/test/repo/projects/test-project';
220
+ // execSync の呼び出しをモック
221
+ mockExecSync.mockImplementation((command, options) => {
222
+ if (command === 'npm run setup:env') {
223
+ // cwd が actualProjectDir であることを確認
224
+ expect(options?.cwd).toBe(actualProjectDir);
225
+ expect(options?.cwd).not.toBe(projectDir);
226
+ return '';
227
+ }
228
+ return '';
229
+ });
230
+ // .env作成のロジックを再現
231
+ execSync('npm run setup:env', { cwd: actualProjectDir, stdio: 'inherit' });
232
+ expect(mockExecSync).toHaveBeenCalledWith('npm run setup:env', expect.objectContaining({ cwd: actualProjectDir }));
233
+ });
234
+ it('.env が actualProjectDir に作成される(projectDir ではない)', () => {
235
+ const projectDir = '/test/repo';
236
+ const actualProjectDir = '/test/repo/projects/test-project';
237
+ // .env のパスを検証
238
+ const envPathInProjectDir = join(projectDir, '.env');
239
+ const envPathInActualProjectDir = join(actualProjectDir, '.env');
240
+ // .env は actualProjectDir に作成されるべき
241
+ expect(envPathInActualProjectDir).toContain('projects/test-project/.env');
242
+ expect(envPathInActualProjectDir).not.toBe(envPathInProjectDir);
243
+ expect(envPathInProjectDir).toBe('/test/repo/.env');
244
+ expect(envPathInActualProjectDir).toBe('/test/repo/projects/test-project/.env');
245
+ });
246
+ });
247
+ //# sourceMappingURL=create-project.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.test.js","sourceRoot":"","sources":["../../../scripts/__tests__/create-project.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=multi-project-estimate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-project-estimate.test.d.ts","sourceRoot":"","sources":["../../../scripts/__tests__/multi-project-estimate.test.ts"],"names":[],"mappings":""}