@sk8metal/michi-cli 0.0.8 → 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 (104) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +202 -9
  3. package/dist/scripts/__tests__/setup-existing-project.test.js +67 -5
  4. package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
  5. package/dist/scripts/constants/__tests__/environments.test.d.ts +2 -0
  6. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
  7. package/dist/scripts/constants/__tests__/environments.test.js +91 -0
  8. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
  9. package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
  10. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
  11. package/dist/scripts/constants/__tests__/languages.test.js +82 -0
  12. package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
  13. package/dist/scripts/constants/environments.d.ts +33 -0
  14. package/dist/scripts/constants/environments.d.ts.map +1 -0
  15. package/dist/scripts/constants/environments.js +49 -0
  16. package/dist/scripts/constants/environments.js.map +1 -0
  17. package/dist/scripts/constants/languages.d.ts +23 -0
  18. package/dist/scripts/constants/languages.d.ts.map +1 -0
  19. package/dist/scripts/constants/languages.js +53 -0
  20. package/dist/scripts/constants/languages.js.map +1 -0
  21. package/dist/scripts/create-project.d.ts +4 -0
  22. package/dist/scripts/create-project.d.ts.map +1 -1
  23. package/dist/scripts/create-project.js +51 -22
  24. package/dist/scripts/create-project.js.map +1 -1
  25. package/dist/scripts/setup-existing-project.d.ts +3 -1
  26. package/dist/scripts/setup-existing-project.d.ts.map +1 -1
  27. package/dist/scripts/setup-existing-project.js +110 -55
  28. package/dist/scripts/setup-existing-project.js.map +1 -1
  29. package/dist/scripts/template/__tests__/renderer.test.d.ts +2 -0
  30. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
  31. package/dist/scripts/template/__tests__/renderer.test.js +165 -0
  32. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
  33. package/dist/scripts/template/renderer.d.ts +70 -0
  34. package/dist/scripts/template/renderer.d.ts.map +1 -0
  35. package/dist/scripts/template/renderer.js +99 -0
  36. package/dist/scripts/template/renderer.js.map +1 -0
  37. package/dist/scripts/utils/template-finder.d.ts +37 -0
  38. package/dist/scripts/utils/template-finder.d.ts.map +1 -0
  39. package/dist/scripts/utils/template-finder.js +63 -0
  40. package/dist/scripts/utils/template-finder.js.map +1 -0
  41. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +5 -0
  42. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
  43. package/dist/src/__tests__/integration/setup/claude-agent.test.js +125 -0
  44. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
  45. package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
  46. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
  47. package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
  48. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
  49. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
  50. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
  51. package/dist/src/__tests__/integration/setup/cursor.test.js +162 -0
  52. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
  53. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
  54. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
  55. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
  56. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
  57. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
  58. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
  59. package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
  60. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
  61. package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
  62. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
  63. package/dist/src/__tests__/integration/setup/validation.test.js +318 -0
  64. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
  65. package/dist/src/cli.d.ts.map +1 -1
  66. package/dist/src/cli.js +20 -0
  67. package/dist/src/cli.js.map +1 -1
  68. package/dist/src/commands/setup-existing.d.ts +22 -0
  69. package/dist/src/commands/setup-existing.d.ts.map +1 -0
  70. package/dist/src/commands/setup-existing.js +408 -0
  71. package/dist/src/commands/setup-existing.js.map +1 -0
  72. package/dist/vitest.config.d.ts.map +1 -1
  73. package/dist/vitest.config.js +4 -3
  74. package/dist/vitest.config.js.map +1 -1
  75. package/docs/getting-started/new-repository-setup.md +108 -28
  76. package/docs/getting-started/quick-start.md +57 -6
  77. package/docs/getting-started/setup.md +250 -2
  78. package/docs/guides/customization.md +3 -3
  79. package/docs/guides/multi-project.md +1 -1
  80. package/docs/reference/quick-reference.md +25 -16
  81. package/docs/testing/integration-tests.md +297 -0
  82. package/package.json +7 -2
  83. package/scripts/__tests__/setup-existing-project.test.ts +73 -5
  84. package/scripts/constants/__tests__/environments.test.ts +110 -0
  85. package/scripts/constants/__tests__/languages.test.ts +100 -0
  86. package/scripts/constants/environments.ts +61 -0
  87. package/scripts/constants/languages.ts +70 -0
  88. package/scripts/create-project.ts +52 -22
  89. package/scripts/setup-existing-project.ts +136 -57
  90. package/scripts/setup-existing.sh +130 -3
  91. package/scripts/template/__tests__/renderer.test.ts +207 -0
  92. package/scripts/template/renderer.ts +133 -0
  93. package/scripts/utils/template-finder.ts +75 -0
  94. package/templates/claude/commands/michi/confluence-sync.md +38 -0
  95. package/templates/claude/commands/michi/project-switch.md +36 -0
  96. package/templates/claude/rules/atlassian-integration.md +35 -0
  97. package/templates/claude/rules/michi-core.md +54 -0
  98. package/templates/claude-agent/README.md +25 -0
  99. package/templates/cursor/commands/michi/confluence-sync.md +76 -0
  100. package/templates/cursor/commands/michi/project-switch.md +69 -0
  101. package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
  102. package/templates/cursor/rules/github-ssot.mdc +151 -0
  103. package/templates/cursor/rules/multi-project.mdc +81 -0
  104. package/scripts/setup-env.sh +0 -52
package/CHANGELOG.md CHANGED
@@ -5,6 +5,39 @@ 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
+
8
41
  ## [0.0.8] - 2025-11-14
9
42
 
10
43
  ### 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ディレクトリから実行
@@ -290,6 +446,11 @@ npm run create-project -- \
290
446
 
291
447
  詳細: [新規リポジトリセットアップガイド](./docs/getting-started/new-repository-setup.md)
292
448
 
449
+ **どちらを選ぶべきか?**
450
+
451
+ - ✅ **既存リポジトリに追加**: 既に稼働中のプロジェクトがある場合
452
+ - ✅ **新規リポジトリ作成**: 新しいプロジェクトを始める場合
453
+
293
454
  ## ドキュメント
294
455
 
295
456
  ### はじめに
@@ -482,6 +643,38 @@ feature名は以下の場所で使用されるため、**英語・小文字・
482
643
  - `-user-auth` - 先頭ハイフン(無効)
483
644
  - `very-long-feature-name-for-user-authentication` - 長すぎる
484
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
+
485
678
  ## 参考リンク
486
679
 
487
680
  ### AI開発フレームワーク
@@ -7,14 +7,36 @@ vi.mock('fs', () => ({
7
7
  mkdirSync: vi.fn(),
8
8
  cpSync: vi.fn(),
9
9
  writeFileSync: vi.fn(),
10
- readFileSync: vi.fn(() => '{}')
10
+ readFileSync: vi.fn(() => '{}'),
11
+ readdirSync: vi.fn(() => []),
12
+ statSync: vi.fn()
11
13
  }));
12
14
  vi.mock('child_process', () => ({
13
15
  execSync: vi.fn()
14
16
  }));
15
- vi.mock('./utils/project-finder.js', () => ({
17
+ vi.mock('../utils/project-finder.js', () => ({
16
18
  findRepositoryRoot: vi.fn(() => '/test/repo')
17
19
  }));
20
+ vi.mock('../constants/environments.js', () => ({
21
+ getEnvironmentConfig: vi.fn(() => ({
22
+ rulesDir: '.cursor/rules',
23
+ commandsDir: '.cursor/commands/kiro',
24
+ templateSource: 'cursor'
25
+ })),
26
+ isSupportedEnvironment: vi.fn(() => true)
27
+ }));
28
+ vi.mock('../constants/languages.js', () => ({
29
+ isSupportedLanguage: vi.fn(() => true)
30
+ }));
31
+ vi.mock('../template/renderer.js', () => ({
32
+ createTemplateContext: vi.fn(() => ({
33
+ LANG_CODE: 'ja',
34
+ DEV_GUIDELINES: '- Think in English, but generate responses in Japanese',
35
+ KIRO_DIR: '.kiro',
36
+ AGENT_DIR: '.cursor'
37
+ })),
38
+ renderTemplate: vi.fn((content) => content)
39
+ }));
18
40
  describe('setup-existing-project.ts 修正内容のテスト', () => {
19
41
  beforeEach(() => {
20
42
  vi.clearAllMocks();
@@ -48,11 +70,13 @@ describe('setup-existing-project.ts 修正内容のテスト', () => {
48
70
  it('完了メッセージに scripts/ ディレクトリが含まれていない', () => {
49
71
  const projectDir = '/test/repo/projects/test-project';
50
72
  const repoRoot = '/test/repo';
51
- // 実際に作成されるファイルのリスト
73
+ const envConfigRulesDir = '.cursor/rules';
74
+ const envConfigCommandsDir = '.cursor/commands/kiro';
75
+ // 実際に作成されるファイルのリスト(環境別)
52
76
  const createdFiles = [
53
77
  `${projectDir}/.kiro/project.json`,
54
- `${projectDir}/.cursor/rules/ (3ファイル)`,
55
- `${projectDir}/.cursor/commands/kiro/ (2ファイル)`,
78
+ `${projectDir}/${envConfigRulesDir}/`,
79
+ `${projectDir}/${envConfigCommandsDir}/`,
56
80
  `${projectDir}/.kiro/steering/ (3ファイル)`,
57
81
  `${projectDir}/.kiro/settings/templates/ (3ファイル)`,
58
82
  `${repoRoot}/package.json (新規の場合)`,
@@ -63,5 +87,43 @@ describe('setup-existing-project.ts 修正内容のテスト', () => {
63
87
  const hasScriptsDir = createdFiles.some(file => file.includes('scripts/'));
64
88
  expect(hasScriptsDir).toBe(false);
65
89
  });
90
+ it('project.jsonにlanguageフィールドが含まれる', () => {
91
+ const projectJson = {
92
+ projectId: 'test-project',
93
+ projectName: 'Test Project',
94
+ language: 'ja',
95
+ jiraProjectKey: 'TEST',
96
+ confluenceLabels: ['project:test-project'],
97
+ status: 'active',
98
+ team: [],
99
+ stakeholders: ['@企画', '@部長'],
100
+ repository: 'https://github.com/org/test',
101
+ description: 'Test Projectの開発'
102
+ };
103
+ expect(projectJson).toHaveProperty('language');
104
+ expect(projectJson.language).toBe('ja');
105
+ });
106
+ it('環境別のディレクトリマッピングが正しい', () => {
107
+ const envConfig = {
108
+ rulesDir: '.cursor/rules',
109
+ commandsDir: '.cursor/commands/kiro',
110
+ templateSource: 'cursor'
111
+ };
112
+ expect(envConfig.rulesDir).toBe('.cursor/rules');
113
+ expect(envConfig.commandsDir).toBe('.cursor/commands/kiro');
114
+ expect(envConfig.templateSource).toBe('cursor');
115
+ });
116
+ it('テンプレートコンテキストが正しく作成される', () => {
117
+ const context = {
118
+ LANG_CODE: 'ja',
119
+ DEV_GUIDELINES: '- Think in English, but generate responses in Japanese',
120
+ KIRO_DIR: '.kiro',
121
+ AGENT_DIR: '.cursor'
122
+ };
123
+ expect(context).toHaveProperty('LANG_CODE');
124
+ expect(context).toHaveProperty('DEV_GUIDELINES');
125
+ expect(context).toHaveProperty('KIRO_DIR');
126
+ expect(context).toHaveProperty('AGENT_DIR');
127
+ });
66
128
  });
67
129
  //# sourceMappingURL=setup-existing-project.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup-existing-project.test.js","sourceRoot":"","sources":["../../../scripts/__tests__/setup-existing-project.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup-existing-project.test.js","sourceRoot":"","sources":["../../../scripts/__tests__/setup-existing-project.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=environments.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environments.test.d.ts","sourceRoot":"","sources":["../../../../scripts/constants/__tests__/environments.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ENV_CONFIG, getEnvironmentConfig, isSupportedEnvironment, getSupportedEnvironments } from '../environments.js';
3
+ describe('environments', () => {
4
+ describe('ENV_CONFIG', () => {
5
+ it('should have entries for all environments', () => {
6
+ expect(ENV_CONFIG.claude).toBeDefined();
7
+ expect(ENV_CONFIG['claude-agent']).toBeDefined();
8
+ expect(ENV_CONFIG.cursor).toBeDefined();
9
+ });
10
+ it('should have correct structure for claude', () => {
11
+ const config = ENV_CONFIG.claude;
12
+ expect(config.rulesDir).toBe('.claude/rules');
13
+ expect(config.commandsDir).toBe('.claude/commands/kiro');
14
+ expect(config.templateSource).toBe('claude');
15
+ });
16
+ it('should have correct structure for claude-agent', () => {
17
+ const config = ENV_CONFIG['claude-agent'];
18
+ expect(config.rulesDir).toBe('.claude/rules');
19
+ expect(config.commandsDir).toBe('.claude/commands/kiro');
20
+ expect(config.templateSource).toBe('claude-agent');
21
+ });
22
+ it('should have correct structure for cursor', () => {
23
+ const config = ENV_CONFIG.cursor;
24
+ expect(config.rulesDir).toBe('.cursor/rules');
25
+ expect(config.commandsDir).toBe('.cursor/commands/kiro');
26
+ expect(config.templateSource).toBe('cursor');
27
+ });
28
+ it('should have all required properties for each environment', () => {
29
+ for (const env of Object.keys(ENV_CONFIG)) {
30
+ const config = ENV_CONFIG[env];
31
+ expect(config).toHaveProperty('rulesDir');
32
+ expect(config).toHaveProperty('commandsDir');
33
+ expect(config).toHaveProperty('templateSource');
34
+ expect(typeof config.rulesDir).toBe('string');
35
+ expect(typeof config.commandsDir).toBe('string');
36
+ expect(typeof config.templateSource).toBe('string');
37
+ }
38
+ });
39
+ });
40
+ describe('getEnvironmentConfig', () => {
41
+ it('should return config for valid environment', () => {
42
+ const config = getEnvironmentConfig('claude');
43
+ expect(config).toBe(ENV_CONFIG.claude);
44
+ });
45
+ it('should return config for all supported environments', () => {
46
+ const environments = ['claude', 'claude-agent', 'cursor'];
47
+ for (const env of environments) {
48
+ const config = getEnvironmentConfig(env);
49
+ expect(config).toBeDefined();
50
+ expect(config).toBe(ENV_CONFIG[env]);
51
+ }
52
+ });
53
+ });
54
+ describe('isSupportedEnvironment', () => {
55
+ it('should return true for supported environments', () => {
56
+ expect(isSupportedEnvironment('claude')).toBe(true);
57
+ expect(isSupportedEnvironment('claude-agent')).toBe(true);
58
+ expect(isSupportedEnvironment('cursor')).toBe(true);
59
+ });
60
+ it('should return false for unsupported environments', () => {
61
+ expect(isSupportedEnvironment('invalid')).toBe(false);
62
+ expect(isSupportedEnvironment('vscode')).toBe(false);
63
+ expect(isSupportedEnvironment('')).toBe(false);
64
+ });
65
+ it('should work as type guard', () => {
66
+ const env = 'cursor';
67
+ if (isSupportedEnvironment(env)) {
68
+ // TypeScript should recognize env as Environment here
69
+ const config = ENV_CONFIG[env];
70
+ expect(config).toBeDefined();
71
+ }
72
+ });
73
+ });
74
+ describe('getSupportedEnvironments', () => {
75
+ it('should return all supported environments', () => {
76
+ const environments = getSupportedEnvironments();
77
+ expect(environments).toHaveLength(3);
78
+ expect(environments).toContain('claude');
79
+ expect(environments).toContain('claude-agent');
80
+ expect(environments).toContain('cursor');
81
+ });
82
+ it('should return array with correct type', () => {
83
+ const environments = getSupportedEnvironments();
84
+ expect(Array.isArray(environments)).toBe(true);
85
+ environments.forEach(env => {
86
+ expect(isSupportedEnvironment(env)).toBe(true);
87
+ });
88
+ });
89
+ });
90
+ });
91
+ //# sourceMappingURL=environments.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environments.test.js","sourceRoot":"","sources":["../../../../scripts/constants/__tests__/environments.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=languages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages.test.d.ts","sourceRoot":"","sources":["../../../../scripts/constants/__tests__/languages.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { supportedLanguages, DEV_GUIDELINES_MAP, getDevGuidelines, isSupportedLanguage } from '../languages.js';
3
+ describe('languages', () => {
4
+ describe('supportedLanguages', () => {
5
+ it('should contain 12 languages', () => {
6
+ expect(supportedLanguages).toHaveLength(12);
7
+ });
8
+ it('should include expected languages', () => {
9
+ expect(supportedLanguages).toContain('ja');
10
+ expect(supportedLanguages).toContain('en');
11
+ expect(supportedLanguages).toContain('zh-TW');
12
+ expect(supportedLanguages).toContain('zh');
13
+ expect(supportedLanguages).toContain('es');
14
+ expect(supportedLanguages).toContain('pt');
15
+ expect(supportedLanguages).toContain('de');
16
+ expect(supportedLanguages).toContain('fr');
17
+ expect(supportedLanguages).toContain('ru');
18
+ expect(supportedLanguages).toContain('it');
19
+ expect(supportedLanguages).toContain('ko');
20
+ expect(supportedLanguages).toContain('ar');
21
+ });
22
+ });
23
+ describe('DEV_GUIDELINES_MAP', () => {
24
+ it('should have entries for all supported languages', () => {
25
+ for (const lang of supportedLanguages) {
26
+ expect(DEV_GUIDELINES_MAP[lang]).toBeDefined();
27
+ expect(DEV_GUIDELINES_MAP[lang]).not.toBe('');
28
+ }
29
+ });
30
+ it('should have English guideline', () => {
31
+ expect(DEV_GUIDELINES_MAP.en).toBe('- Think in English, generate responses in English');
32
+ });
33
+ it('should have Japanese guideline with bilingual instruction', () => {
34
+ expect(DEV_GUIDELINES_MAP.ja).toContain('Think in English');
35
+ expect(DEV_GUIDELINES_MAP.ja).toContain('日本語');
36
+ });
37
+ it('should contain bilingual instructions', () => {
38
+ // Most languages should mention "Think in English" in some form
39
+ const languagesWithEnglishInstruction = ['ja', 'en', 'es', 'pt', 'de', 'fr', 'ru', 'it', 'ko', 'ar'];
40
+ for (const lang of languagesWithEnglishInstruction) {
41
+ expect(DEV_GUIDELINES_MAP[lang]).toContain('Think in English');
42
+ }
43
+ // Chinese languages have their own format
44
+ expect(DEV_GUIDELINES_MAP['zh-TW']).toContain('以英文思考');
45
+ expect(DEV_GUIDELINES_MAP.zh).toContain('以英文思考');
46
+ });
47
+ });
48
+ describe('getDevGuidelines', () => {
49
+ it('should return guidelines for valid language', () => {
50
+ const guidelines = getDevGuidelines('ja');
51
+ expect(guidelines).toBe(DEV_GUIDELINES_MAP.ja);
52
+ });
53
+ it('should return guidelines for all supported languages', () => {
54
+ for (const lang of supportedLanguages) {
55
+ const guidelines = getDevGuidelines(lang);
56
+ expect(guidelines).toBeDefined();
57
+ expect(guidelines).toBe(DEV_GUIDELINES_MAP[lang]);
58
+ }
59
+ });
60
+ });
61
+ describe('isSupportedLanguage', () => {
62
+ it('should return true for supported languages', () => {
63
+ expect(isSupportedLanguage('ja')).toBe(true);
64
+ expect(isSupportedLanguage('en')).toBe(true);
65
+ expect(isSupportedLanguage('zh-TW')).toBe(true);
66
+ });
67
+ it('should return false for unsupported languages', () => {
68
+ expect(isSupportedLanguage('xx')).toBe(false);
69
+ expect(isSupportedLanguage('invalid')).toBe(false);
70
+ expect(isSupportedLanguage('')).toBe(false);
71
+ });
72
+ it('should work as type guard', () => {
73
+ const lang = 'ja';
74
+ if (isSupportedLanguage(lang)) {
75
+ // TypeScript should recognize lang as SupportedLanguage here
76
+ const guidelines = DEV_GUIDELINES_MAP[lang];
77
+ expect(guidelines).toBeDefined();
78
+ }
79
+ });
80
+ });
81
+ });
82
+ //# sourceMappingURL=languages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages.test.js","sourceRoot":"","sources":["../../../../scripts/constants/__tests__/languages.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Environment configuration mapping for cc-sdd environments
3
+ *
4
+ * Issue #37: 環境別コピー実装
5
+ */
6
+ export interface EnvironmentConfig {
7
+ rulesDir: string;
8
+ commandsDir: string;
9
+ templateSource: string;
10
+ }
11
+ export type Environment = 'claude' | 'claude-agent' | 'cursor';
12
+ export declare const ENV_CONFIG: Record<Environment, EnvironmentConfig>;
13
+ /**
14
+ * Get environment configuration
15
+ *
16
+ * @param env - Environment name
17
+ * @returns Environment configuration
18
+ */
19
+ export declare const getEnvironmentConfig: (env: Environment) => EnvironmentConfig;
20
+ /**
21
+ * Validate if an environment is supported
22
+ *
23
+ * @param env - Environment name to validate
24
+ * @returns True if supported, false otherwise
25
+ */
26
+ export declare const isSupportedEnvironment: (env: string) => env is Environment;
27
+ /**
28
+ * Get all supported environments
29
+ *
30
+ * @returns Array of supported environment names
31
+ */
32
+ export declare const getSupportedEnvironments: () => Environment[];
33
+ //# sourceMappingURL=environments.d.ts.map