---
generated_at: 2026-02-24 19:30:00
metrics:
  claims_total: 172
  claims_with_evidence: 172
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：cli-create-medusa-app.csv

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でテストケースの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各テストケースに対して、ソースコード・既存テスト・APIドキュメントなどの根拠（Evidence）が存在するか
2. **根拠との整合性**：テストケースの内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：172 / 172、根拠なし：0
- 優先レビュー（高）
  1. 該当なし - すべてのテストケースにソースコード根拠あり

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `packages/cli/create-medusa-app/src/index.ts` - CLIエントリポイント
- E-02: `packages/cli/create-medusa-app/src/commands/create.ts` - createコマンド実装
- E-03: `packages/cli/create-medusa-app/src/utils/node-version.ts` - Node.jsバージョン検証
- E-04: `packages/cli/create-medusa-app/src/utils/format-connection-string.ts` - DB接続文字列フォーマット
- E-05: `packages/cli/create-medusa-app/src/utils/get-current-os.ts` - OS検出
- E-06: `packages/cli/create-medusa-app/src/utils/create-abort-controller.ts` - 中断制御
- E-07: `packages/cli/create-medusa-app/src/utils/process-manager.ts` - プロセス管理
- E-08: `packages/cli/create-medusa-app/src/utils/package-manager.ts` - パッケージマネージャー
- E-09: `packages/cli/create-medusa-app/src/utils/execute.ts` - コマンド実行
- E-10: `packages/cli/create-medusa-app/src/utils/log-message.ts` - ログ出力
- E-11: `packages/cli/create-medusa-app/src/utils/clone-repo.ts` - リポジトリクローン
- E-12: `packages/cli/create-medusa-app/src/utils/create-db.ts` - データベース作成
- E-13: `packages/cli/create-medusa-app/src/utils/postgres-client.ts` - PostgreSQLクライアント
- E-14: `packages/cli/create-medusa-app/src/utils/facts.ts` - ファクトボックス表示
- E-15: `packages/cli/create-medusa-app/src/utils/get-config-store.ts` - 設定ストア
- E-16: `packages/cli/create-medusa-app/src/utils/update-package-versions.ts` - パッケージバージョン更新
- E-17: `packages/cli/create-medusa-app/src/utils/nextjs-utils.ts` - Next.jsユーティリティ
- E-18: `packages/cli/create-medusa-app/src/utils/start-medusa.ts` - Medusa起動
- E-19: `packages/cli/create-medusa-app/src/utils/prepare-project.ts` - プロジェクト準備
- E-20: `packages/cli/create-medusa-app/src/utils/project-creator/creator.ts` - 基底クリエータークラス
- E-21: `packages/cli/create-medusa-app/src/utils/project-creator/project-creator-factory.ts` - クリエーターファクトリー
- E-22: `packages/cli/create-medusa-app/src/utils/project-creator/medusa-project-creator.ts` - Medusaプロジェクトクリエーター
- E-23: `packages/cli/create-medusa-app/src/utils/project-creator/medusa-plugin-creator.ts` - Medusaプラグインクリエーター
- E-24: `packages/cli/create-medusa-app/src/utils/__tests__/create-abort-controller.test.ts` - 既存テスト参照
- E-25: `packages/cli/create-medusa-app/src/utils/__tests__/package-manager.test.ts` - 既存テスト参照

## 3) Claims と根拠の対応（レビューの主戦場）

### node-version.ts (UT-CMA-001 - UT-CMA-004)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | getNodeVersionがメジャーバージョンを返す | E-03: `process.versions.node.split(".").map(Number)` | ○ |
| C-02 | MIN_SUPPORTED_NODE_VERSIONが20である | E-03: `export const MIN_SUPPORTED_NODE_VERSION = 20` | ○ |

### format-connection-string.ts (UT-CMA-005 - UT-CMA-011)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-03 | encodeDbValueがencodeURIComponentを使用 | E-04: `return encodeURIComponent(value)` | ○ |
| C-04 | ユーザー名・パスワード付き接続文字列生成 | E-04: `connection += encodeDbValue(user)` | ○ |
| C-05 | 認証情報なしでも接続文字列が生成される | E-04: `connection += '${host}/${db}'` | ○ |

### get-current-os.ts (UT-CMA-012 - UT-CMA-015)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-06 | darwinでmacosが返る | E-05: `case "darwin": return "macos"` | ○ |
| C-07 | linuxでlinuxが返る | E-05: `case "linux": return "linux"` | ○ |
| C-08 | デフォルトでwindowsが返る | E-05: `default: return "windows"` | ○ |

### create-abort-controller.ts (UT-CMA-016 - UT-CMA-021)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 | AbortControllerが生成される | E-06: `const abortController = new AbortController()` | ○ |
| C-10 | isAbortErrorがABORT_ERRコードを検出 | E-06: `e.code === "ABORT_ERR"` | ○ |
| C-11 | getAbortErrorがABORT_ERRオブジェクトを返す | E-06: `return { code: "ABORT_ERR" }` | ○ |

### process-manager.ts (UT-CMA-022 - UT-CMA-030)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-12 | intervalsが空配列で初期化 | E-07: `intervals: NodeJS.Timeout[] = []` | ○ |
| C-13 | SIGTERM/SIGINTでコールバック実行 | E-07: `process.on("SIGTERM", async () => fn())` | ○ |
| C-14 | MAX_RETRIESが3 | E-07: `static MAX_RETRIES = 3` | ○ |
| C-15 | EAGAINでリトライされる | E-07: `error?.code === "EAGAIN"` | ○ |
| C-16 | ERESOLVEがignoreERESOLVEで無視される | E-07: `if (ignoreERESOLVE && ... error?.code === "ERESOLVE")` | ○ |

### package-manager.ts (UT-CMA-031 - UT-CMA-057)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-17 | useNpmでnpmが選択される | E-08: `if (options.useNpm) { this.chosenPackageManager = "npm" }` | ○ |
| C-18 | npm_config_user_agentからパッケージマネージャーを検出 | E-08: `const userAgent = process.env.npm_config_user_agent` | ○ |
| C-19 | pnpxがpnpmとして扱われる | E-08: `if (manager === "pnpx") { return { manager: "pnpm", version } }` | ○ |
| C-20 | ロックファイル削除の設定 | E-08: `const lockFiles: Record<PackageManagerType, string[]>` | ○ |
| C-21 | npmで npm install + npm ci が実行される | E-08: `if (this.packageManager === "npm") { ... await execute(["npm ci", execOptions]` | ○ |
| C-22 | getCommandStrがパッケージマネージャー未設定時にエラー | E-08: `if (!this.packageManager) { throw new Error("Package manager not set") }` | ○ |

### execute.ts (UT-CMA-058 - UT-CMA-061)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-23 | verbose=falseでpromiseExecが使用される | E-09: `const childProcess = await promiseExec(commandStr, ...)` | ○ |
| C-24 | verbose=trueでspawnSyncが使用される | E-09: `const childProcess = spawnSync(commandStr, ...)` | ○ |
| C-25 | SIGINT/SIGTERMでAbortエラー | E-09: `if (childProcess.signal && ["SIGINT", "SIGTERM"].includes(childProcess.signal))` | ○ |

### log-message.ts (UT-CMA-062 - UT-CMA-066)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-26 | タイプに応じたログ出力 | E-10: `switch (type)` | ○ |
| C-27 | errorでprogram.errorが呼ばれる | E-10: `case "error": program.error(...)` | ○ |

### clone-repo.ts (UT-CMA-067 - UT-CMA-072)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | デフォルトリポジトリURL | E-11: `const DEFAULT_REPO = "https://github.com/medusajs/medusa-starter-default"` | ○ |
| C-29 | プラグインリポジトリURL | E-11: `const DEFAULT_PLUGIN_REPO = "https://github.com/medusajs/medusa-starter-plugin"` | ○ |
| C-30 | .gitディレクトリの削除 | E-11: `fs.rmSync(path.join(projectDirectory, ".git"), ...)` | ○ |

### create-db.ts (UT-CMA-073 - UT-CMA-080)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-31 | CREATE DATABASEクエリ実行 | E-12: `await client.query('CREATE DATABASE "${db}"')` | ○ |
| C-32 | pg_catalogでDB存在確認 | E-12: `SELECT datname FROM pg_catalog.pg_database WHERE datname='${dbName}'` | ○ |
| C-33 | dbUrlが優先される | E-12: `if (dbUrl) { return await getForDbUrl(...) }` | ○ |

### postgres-client.ts (UT-CMA-081 - UT-CMA-083)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | pg.Clientが使用される | E-13: `const client = new Client(connect)` | ○ |
| C-35 | デフォルトホスト・ポート | E-13: `export const DEFAULT_HOST = "localhost"`, `export const DEFAULT_PORT = 5432` | ○ |

### facts.ts (UT-CMA-084 - UT-CMA-090)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-36 | ランダムなファクト取得 | E-14: `const randIndex = Math.floor(Math.random() * facts.length)` | ○ |
| C-37 | 10秒間隔のインターバル | E-14: `const interval = setInterval(() => { showFact(...) }, 10000)` | ○ |

### get-config-store.ts (UT-CMA-091 - UT-CMA-092)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-38 | シングルトンパターン | E-15: `if (!config) { config = new Configstore(...) }` | ○ |

### update-package-versions.ts (UT-CMA-093 - UT-CMA-100)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-39 | @medusajs/パッケージのバージョン更新 | E-16: `if (shouldUpdateVersion(dependency)) { packageJson.dependencies[dependency] = version }` | ○ |
| C-40 | @medusajs/uiは除外 | E-16: `return dependency.startsWith("@medusajs/") && dependency !== "@medusajs/ui"` | ○ |

### nextjs-utils.ts (UT-CMA-101 - UT-CMA-108)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-41 | inquirerでNext.jsインストール確認 | E-17: `const { installNextjs } = await inquirer.prompt(...)` | ○ |
| C-42 | 重複時にランダムサフィックス追加 | E-17: `nextjsDirectory += '-${customAlphabet(...)()'` | ○ |
| C-43 | .env.templateを.env.localにリネーム | E-17: `fs.renameSync(path.join(nextjsDirectory, ".env.template"), path.join(nextjsDirectory, ".env.local"))` | ○ |

### start-medusa.ts (UT-CMA-109 - UT-CMA-110)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-44 | devコマンド実行 | E-18: `const command = packageManager.getCommandStr('dev')` | ○ |
| C-45 | AbortControllerシグナル使用 | E-18: `signal: abortController?.signal` | ○ |

### prepare-project.ts (UT-CMA-111 - UT-CMA-123)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | isPluginによる分岐 | E-19: `if (prepareOptions.isPlugin) { return preparePlugin(...) }` | ○ |
| C-47 | package.json name更新 | E-19: `packageJson.name = projectName` | ○ |
| C-48 | .envファイル作成 | E-19: `fs.appendFileSync(path.join(directory, '.env'), env)` | ○ |
| C-49 | マイグレーション実行 | E-19: `await packageManager.runMedusaCommand("db:migrate", ...)` | ○ |
| C-50 | 管理者ユーザー作成 | E-19: `await packageManager.runMedusaCommand('user -e ${ADMIN_EMAIL} --invite', ...)` | ○ |
| C-51 | inviteToken抽出 | E-19: `const match = (userExecResult.stdout as string).match(/Invite token: (?<token>.+)/)` | ○ |

### project-creator/creator.ts (UT-CMA-124 - UT-CMA-126)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-52 | BaseProjectCreatorの初期化 | E-20: `constructor(projectName: string, protected options: ProjectOptions, protected args: string[])` | ○ |
| C-53 | projectPathの計算 | E-20: `this.projectPath = path.join(basePath, projectName)` | ○ |

### project-creator/project-creator-factory.ts (UT-CMA-127 - UT-CMA-139)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-54 | pluginオプションでPluginProjectCreator | E-21: `return options.plugin ? new PluginProjectCreator(...) : new MedusaProjectCreator(...)` | ○ |
| C-55 | Node.jsバージョン検証 | E-21: `if (nodeVersion < MIN_SUPPORTED_NODE_VERSION)` | ○ |
| C-56 | 既存ディレクトリチェック | E-21: `if (fs.existsSync(projectPath) && fs.lstatSync(projectPath).isDirectory())` | ○ |
| C-57 | ドット禁止検証 | E-21: `if (args[0].includes("."))` | ○ |
| C-58 | slugifyによる正規化 | E-21: `filter: (input) => { return slugify(input).toLowerCase() }` | ○ |

### project-creator/medusa-project-creator.ts (UT-CMA-140 - UT-CMA-161)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-59 | テレメトリイベント送信 | E-22: `track("CREATE_CLI_CMA")` | ○ |
| C-60 | initializeProject/setupProject/startServicesフロー | E-22: `await this.initializeProject(); await this.setupProject(); await this.startServices()` | ○ |
| C-61 | skipDbでDB設定スキップ | E-22: `if (!this.options.skipDb) { await this.setupDatabase() }` | ○ |
| C-62 | Next.jsインストール呼び出し | E-22: `if (installNextjs) { this.nextjsDirectory = await installNextjsStarter(...) }` | ○ |
| C-63 | waitOnでヘルスチェック | E-22: `await waitOn({ resources: ["http://localhost:9000/health"] })` | ○ |
| C-64 | inviteToken付きURL | E-22: `this.inviteToken ? 'http://localhost:9000/app/invite?token=${this.inviteToken}&first_run=true' : "http://localhost:9000/app"` | ○ |

### project-creator/medusa-plugin-creator.ts (UT-CMA-162 - UT-CMA-170)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-65 | テレメトリイベント送信 | E-23: `track("CREATE_CLI_CMP")` | ○ |
| C-66 | isPlugin=trueでクローン | E-23: `await runCloneRepo({ ..., isPlugin: true })` | ○ |
| C-67 | isPlugin=trueでprepare | E-23: `await prepareProject({ isPlugin: true, ... })` | ○ |

### commands/create.ts (UT-CMA-171 - UT-CMA-172)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-68 | ファクトリーパターンによる作成 | E-02: `const projectCreator = await ProjectCreatorFactory.create(args, options)` | ○ |
| C-69 | creatorのcreate呼び出し | E-02: `await projectCreator.create()` | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし - すべてのテストケースはソースコードを根拠として生成

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - すべてのテストケースがソースコードに基づいて生成されている

## 6) レビュアーチェックリスト（最小）
- [ ] テストケースの観点（正常系/異常系/境界値）が適切にカバーされているか
- [ ] 優先度の設定が妥当か（金額計算・認証関連は高、表示処理は低など）
- [ ] 既存テスト（E-24, E-25）との重複・整合性を確認
- [ ] 外部依存（PostgreSQL, git）を伴うテストのモック方針を確認
- [ ] シグナルハンドリング（SIGTERM/SIGINT）のテスト実行環境を確認
