create-einja-app 0.3.1 → 0.3.2

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 (80) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +32 -16
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +1 -1
  5. package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +23 -0
  6. package/templates/default/.claude/settings.json +15 -1
  7. package/templates/default/.env.personal.example +6 -2
  8. package/templates/default/.envrc +5 -0
  9. package/templates/default/.github/workflows/deploy-pr-preview.yml +23 -24
  10. package/templates/default/.github/workflows/deploy-stable-branches.yml +55 -49
  11. package/templates/default/.mcp.json +2 -12
  12. package/templates/default/.serena/project.yml +7 -0
  13. package/templates/default/CLAUDE.md +28 -4
  14. package/templates/default/README.md +2 -2
  15. package/templates/default/apps/admin/package.json +1 -1
  16. package/templates/default/apps/admin/tsconfig.json +2 -1
  17. package/templates/default/apps/web/package.json +1 -1
  18. package/templates/default/apps/web/tsconfig.json +2 -1
  19. package/templates/default/docs/plans/.gitkeep +0 -0
  20. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-a87e67c.md +221 -0
  21. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-ab73a1c.md +107 -0
  22. package/templates/default/docs/plans/ancient-greeting-flamingo.md +120 -0
  23. package/templates/default/docs/plans/bright-stargazing-dawn.md +87 -0
  24. package/templates/default/docs/plans/calm-stirring-bonbon.md +196 -0
  25. package/templates/default/docs/plans/calm-watching-widget.md +111 -0
  26. package/templates/default/docs/plans/cheerful-wiggling-ullman.md +164 -0
  27. package/templates/default/docs/plans/compiled-humming-cherny.md +94 -0
  28. package/templates/default/docs/plans/dapper-launching-lynx.md +81 -0
  29. package/templates/default/docs/plans/effervescent-munching-kite-agent-ac08baf.md +672 -0
  30. package/templates/default/docs/plans/effervescent-munching-kite-agent-aecc373.md +442 -0
  31. package/templates/default/docs/plans/effervescent-munching-kite.md +263 -0
  32. package/templates/default/docs/plans/fix-orphan-cleaner-review.md +25 -0
  33. package/templates/default/docs/plans/fix-sync-template-variables.md +162 -0
  34. package/templates/default/docs/plans/glimmering-giggling-sedgewick.md +126 -0
  35. package/templates/default/docs/plans/glittery-swimming-bachman.md +78 -0
  36. package/templates/default/docs/plans/happy-watching-toast.md +56 -0
  37. package/templates/default/docs/plans/harmonic-strolling-nebula.md +210 -0
  38. package/templates/default/docs/plans/import-alias-refactor.md +75 -0
  39. package/templates/default/docs/plans/lazy-percolating-sloth-agent-abda679.md +346 -0
  40. package/templates/default/docs/plans/lazy-percolating-sloth.md +151 -0
  41. package/templates/default/docs/plans/linked-greeting-llama-agent-a7a6e5b.md +345 -0
  42. package/templates/default/docs/plans/linked-greeting-llama.md +467 -0
  43. package/templates/default/docs/plans/lovely-bubbling-rose.md +80 -0
  44. package/templates/default/docs/plans/optimized-watching-sprout.md +149 -0
  45. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a292da6.md +288 -0
  46. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a819699.md +366 -0
  47. package/templates/default/docs/plans/peaceful-beaming-toast-agent-ac11de2.md +474 -0
  48. package/templates/default/docs/plans/peaceful-beaming-toast.md +345 -0
  49. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6194c.md +300 -0
  50. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6900e.md +444 -0
  51. package/templates/default/docs/plans/purrfect-spinning-hickey.md +361 -0
  52. package/templates/default/docs/plans/recursive-kindling-lemon-agent-a42199e.md +186 -0
  53. package/templates/default/docs/plans/recursive-kindling-lemon.md +36 -0
  54. package/templates/default/docs/plans/seed-migration-tests.md +47 -0
  55. package/templates/default/docs/plans/sprightly-leaping-manatee.md +224 -0
  56. package/templates/default/docs/plans/stateful-wishing-lerdorf.md +161 -0
  57. package/templates/default/docs/plans/streamed-purring-wreath.md +40 -0
  58. package/templates/default/docs/plans/synthetic-percolating-pearl.md +101 -0
  59. package/templates/default/docs/plans/todo-fix-sync-template-variables.md +21 -0
  60. package/templates/default/docs/plans/todo-phase4-marker-update.md +39 -0
  61. package/templates/default/docs/plans/todo-skill-creator-sync.md +23 -0
  62. package/templates/default/docs/plans/typed-snuggling-parnas-agent-a6f6391.md +476 -0
  63. package/templates/default/docs/plans/typed-snuggling-parnas-agent-adb678b.md +144 -0
  64. package/templates/default/docs/plans/typed-snuggling-parnas.md +84 -0
  65. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a30aa4f.md +534 -0
  66. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a57a278.md +508 -0
  67. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a90b809.md +421 -0
  68. package/templates/default/docs/plans/warm-hopping-lighthouse.md +199 -0
  69. package/templates/default/docs/verification-test.md +2 -0
  70. package/templates/default/gitignore +4 -0
  71. package/templates/default/package.json +2 -2
  72. package/templates/default/packages/admin-ui/package.json +1 -1
  73. package/templates/default/packages/server-core/tsconfig.json +6 -1
  74. package/templates/default/pnpm-lock.yaml +276 -57
  75. package/templates/default/scripts/ensure-serena.sh +75 -0
  76. package/templates/default/scripts/lib/worktree-config.ts +64 -0
  77. package/templates/default/scripts/stop-serena.sh +25 -0
  78. package/templates/default/scripts/worktree/dev.ts +2 -2
  79. /package/templates/default/scripts/{cli-template-update.ts → _cli-template-update.ts} +0 -0
  80. /package/templates/default/scripts/{template-update.ts → _template-update.ts} +0 -0
@@ -0,0 +1,149 @@
1
+ # Plan: `@einja:seed` → `@einja:project-private` リネーム+機能拡張
2
+
3
+ ## Context
4
+
5
+ einja CLIのsync機能で配布されるmdファイルに、利用者が「プロジェクト固有コンテンツ」を追記できる領域を明示的に提供したい。
6
+
7
+ **現状の問題:**
8
+ - `@einja:seed` はマーカー名が機能を表していない(「種」より「プロジェクト固有領域」が正しい)
9
+ - 一部ファイル(新規3ファイル等)にseedセクションがない
10
+ - `.claude/` 配下にマーカーがなく、利用者がどこに追記できるか不明
11
+ - seedのみ(managedなし)だと本文がunmanaged扱いになりテンプレート更新が反映されない
12
+
13
+ **解決策:**
14
+ 1. `@einja:seed` → `@einja:project-private` に完全リネーム
15
+ 2. 利用者リポジトリの旧マーカーはsync時に自動マイグレーション
16
+ 3. managedなしファイルでも使えるよう挙動を拡張
17
+ 4. `.claude/` 配下の全配布対象ファイルにproject-privateセクション追加
18
+
19
+ ## 挙動
20
+
21
+ ### managed + project-private(docs/einja/ 等)
22
+ 従来のseedと同じ。マーカーベース処理内でローカル版を保持。
23
+
24
+ ### project-privateのみ(managedなし。.claude/ 等)— 新規挙動
25
+ ```
26
+ 1. base版・テンプレート・ローカルの3つからproject-privateセクションを抽出
27
+ 2. 残りの本文を3方向マージで処理(テンプレート更新が反映される)
28
+ 3. ローカル版のproject-privateセクションをファイル末尾に再付加
29
+ 4. ローカルにproject-privateがなければテンプレート版をseed(マーカーペアが存在すれば空でも「存在する」扱い)
30
+ ```
31
+
32
+ ### 自動マイグレーション
33
+ sync時にローカルファイルで `@einja:seed` を検出したら、処理前に自動で `@einja:project-private` にリネーム。
34
+
35
+ ## 変更対象ファイル
36
+
37
+ ### Phase 1: sync engine リネーム+拡張
38
+
39
+ | ファイル | 変更内容 |
40
+ |---------|---------|
41
+ | `packages/cli/src/types/sync.ts` | `MarkerSectionType` の `"seed"` → `"project-private"`。`MarkerErrorType` の `"seed_without_id"` → `"project_private_without_id"`。`JsonPathsConfigSchema` の `seed` → `project-private`(キー名変更) |
42
+ | `packages/cli/src/lib/sync/marker-processor.ts` | 全パターンの `seed` → `project-private` 置換。`extractProjectPrivateSections(content)` / `reattachProjectPrivateSections(content, sections)` / `hasManagedMarkers(content)` メソッド追加。`migrateLegacySeedMarkers(content)` メソッド追加(自動マイグレーション用) |
43
+ | `packages/cli/src/lib/sync/seed-synchronizer.ts` → **`project-private-synchronizer.ts`** にリネーム | クラス名・メソッド名リネーム + managedなしファイル用の同期ロジック追加 |
44
+ | `packages/cli/src/lib/sync/json-processor.ts` | `isPathSeed()` → `isPathProjectPrivate()` 等、seed参照12箇所をリネーム |
45
+ | `packages/cli/src/commands/sync.ts` | import変更、`hasMarkers()` の `seed` → `project-private`、managedなしファイルの分岐追加、マイグレーション処理の呼び出し |
46
+ | `packages/cli/src/lib/sync/metadata-manager.ts` | `.einja-sync.json` のマイグレーション処理追加(`jsonPaths.seed` → `jsonPaths["project-private"]`) |
47
+
48
+ ### Phase 2: テスト リネーム+追加
49
+
50
+ | ファイル | 変更内容 |
51
+ |---------|---------|
52
+ | `packages/cli/src/lib/sync/marker-processor.test.ts` | 全テストの `seed` → `project-private` + 抽出・再付加テスト追加 + マイグレーションテスト追加 |
53
+ | `packages/cli/src/lib/sync/integration.test.ts` | seed → project-private + managedなしファイルの統合テスト追加(下記シナリオ) |
54
+ | `packages/cli/src/lib/sync/metadata-manager.test.ts` | seed参照置換 + .einja-sync.jsonマイグレーションテスト |
55
+ | `packages/cli/src/lib/sync/conflict-reporter.test.ts` | seed参照があれば置換 |
56
+ | `packages/cli/src/lib/sync/json-processor.test.ts`(存在すれば) | seed参照置換 |
57
+
58
+ **統合テストシナリオ:**
59
+ - 初回sync: project-privateのみファイル → テンプレート全体がコピーされる
60
+ - 2回目sync: テンプレート本文変更 → 3方向マージで本文更新、project-private保持
61
+ - 2回目sync: ローカル本文も変更 → 3方向マージでコンフリクト検出、project-private保持
62
+ - project-private空セクションの処理(マーカーペアのみ → 存在扱い)
63
+ - 旧 `@einja:seed` マーカー → 自動マイグレーション → 正常処理
64
+
65
+ ### Phase 3: create-einja-app対応
66
+
67
+ | ファイル | 変更内容 |
68
+ |---------|---------|
69
+ | `packages/create-einja-app/src/utils/merger.ts` | ローカル `MarkerSection` 型、`parseStartMarker()`、`parseEndMarker()` 含め `seed` → `project-private` 置換 + managedなしファイル対応 |
70
+ | `packages/create-einja-app/tests/unit/utils/merger.test.ts` | テスト置換+追加 |
71
+
72
+ ### Phase 4: 配布対象ファイルのマーカー更新
73
+
74
+ #### 4-a: 既存26ファイルの `@einja:seed` → `@einja:project-private` 置換
75
+
76
+ `docs/einja/steering/`, `docs/einja/instructions/`, `docs/einja/memory/` 配下の全seedマーカー付きファイル
77
+
78
+ #### 4-b: seedセクション未設置の3ファイルに新規追加
79
+
80
+ | ファイル | ID |
81
+ |---------|-----|
82
+ | `docs/einja/steering/development/coding-standards.md` | `coding-standards-project` |
83
+ | `docs/einja/steering/development/component-design.md` | `component-design-project` |
84
+ | `docs/einja/steering/development/playwright-guidelines.md` | `playwright-guidelines-project` |
85
+
86
+ #### 4-c: .claude/skills/einja-*/(SKILL.mdのみ、11ファイル)
87
+
88
+ 末尾にproject-privateセクション新規追加。ID: `{skill名}-project`
89
+
90
+ #### 4-d: .claude/agents/einja/(全17ファイル)
91
+
92
+ 末尾にproject-privateセクション新規追加。ID: `{agent名}-project`
93
+
94
+ #### 4-e: .claude/commands/einja/(全7ファイル)
95
+
96
+ 末尾にproject-privateセクション新規追加。ID: `{command名}-project`
97
+
98
+ #### 4-f: CLAUDE.md
99
+
100
+ `@einja:excluded` セクションの直前にproject-privateセクション追加(ID: `claude-md-project`)
101
+
102
+ #### 4-g: skill-creatorのドキュメント例示更新
103
+
104
+ `.claude/skills/einja-skill-creator/SKILL.md` と `scripts/init_skill.py` 内のseed例示をproject-privateに更新
105
+
106
+ #### 4-h: ドキュメント内のseed参照更新
107
+
108
+ | ファイル | 内容 |
109
+ |---------|------|
110
+ | `packages/cli/docs/MARKER_SPECIFICATION.md`(存在すれば) | seed → project-private |
111
+ | `packages/cli/README.md` | seed参照があれば更新 |
112
+ | `packages/create-einja-app/README.md` | seed参照があれば更新 |
113
+ | CHANGELOG内のseed参照 | 歴史的記録のため**据え置き** |
114
+
115
+ ### Phase 5: ビルド+最終確認
116
+
117
+ 1. `pnpm --filter @einja/dev-cli build` でpresets/defaultに反映
118
+ 2. `pnpm prepush`(lint + typecheck + test)
119
+ 3. `grep -r "@einja:seed" --include="*.ts" --include="*.md" --include="*.py" --include="*.json" --include="*.yml"` — seed残存なし確認(CHANGELOG除く)
120
+
121
+ ## project-privateセクションの共通フォーマット
122
+
123
+ ```markdown
124
+ ---
125
+
126
+ <!-- @einja:project-private:start id="{ID}" -->
127
+ ## プロジェクト固有の設定
128
+
129
+ <!-- このセクションはプロジェクト固有の内容を追記する場所です -->
130
+ <!-- einja syncで上書きされません -->
131
+ <!-- @einja:project-private:end -->
132
+ ```
133
+
134
+ ## 除外対象(project-privateを追加しない)
135
+
136
+ | ファイル | 理由 |
137
+ |---------|------|
138
+ | `.claude/skills/einja-*/references/*.md` | リファレンス資料 |
139
+ | `.claude/skills/einja-*/templates/*.md` | テンプレート定義 |
140
+ | `docs/einja/example/**/*.md` | サンプル教材 |
141
+ | `docs/einja/templates/README.md` | テンプレートREADME |
142
+
143
+ ## 検証方法
144
+
145
+ 1. `pnpm --filter @einja/dev-cli test` — CLIの全テストパス
146
+ 2. `pnpm --filter create-einja-app test` — create-einja-appの全テストパス
147
+ 3. `pnpm prepush` — lint + typecheck + test パス
148
+ 4. `grep -r "@einja:seed" --include="*.ts" --include="*.md" --include="*.py" --include="*.json" --include="*.yml"` — seed残存なし(CHANGELOG除く)
149
+ 5. 統合テストシナリオ(Phase 2参照)
@@ -0,0 +1,288 @@
1
+ # プリセットファイルのハードコード値調査レポート
2
+
3
+ ## 調査目的
4
+ `einja init` で配布されるプリセットファイル群(`packages/cli/presets/default/`)に、テンプレートリポジトリ(einja-management-template)固有のハードコードされた値が含まれていないかを調査する。
5
+
6
+ ## 調査対象ファイル
7
+
8
+ ### 1. scripts/ 配下のファイル
9
+
10
+ #### ✅ scripts/init.sh
11
+ **問題なし** - 汎用的なスクリプト
12
+ - package.jsonから動的にNode/pnpmバージョンを取得
13
+ - 環境依存の値なし
14
+
15
+ #### ✅ scripts/env.ts
16
+ **問題なし** - 汎用的な環境変数ウィザード
17
+ - ファイルパスは相対パス(`process.cwd()`ベース)
18
+ - 環境変数名は一般的な命名(DATABASE_URL, AUTH_SECRET, GITHUB_TOKEN等)
19
+
20
+ #### ✅ scripts/env-show.ts
21
+ **問題なし** - 汎用的な表示スクリプト
22
+ - 環境設定は共通定義(ENVIRONMENTS配列)を使用
23
+ - 固有の値なし
24
+
25
+ #### ✅ scripts/env-rotate-secrets.ts
26
+ **問題なし** - 汎用的な秘密鍵ローテーションスクリプト
27
+ - 共通ライブラリ(env-common.ts)を使用
28
+ - 固有の値なし
29
+
30
+ #### ✅ scripts/setup-dev.ts
31
+ **問題なし** - 汎用的なセットアップスクリプト
32
+ - `process.cwd()`で現在ディレクトリを基準
33
+ - ポート番号等は環境変数や設定ファイルから動的取得(推測)
34
+
35
+ #### ⚠️ scripts/worktree/dev.ts
36
+ **潜在的な問題あり**
37
+ - **L14**: `import type { AppConfig, WorktreeConfig } from "../../packages/config/src/worktree-config.js";`
38
+ - **問題**: テンプレートリポジトリ固有のパッケージパス構造に依存
39
+ - **影響**: 他プロジェクトがこの構造を持たない場合、import失敗でエラー
40
+ - **L101**: `config = loadWorktreeConfig();`
41
+ - **問題**: worktree.config.jsonの存在を前提としている
42
+ - **影響**: 設定ファイル未作成時のエラーハンドリングが不明確
43
+
44
+ #### ✅ scripts/lib/env-common.ts
45
+ **問題なし** - 汎用的な共通ライブラリ
46
+ - 環境設定定義は標準的(local, develop, preview, production, ci)
47
+ - 固有の値なし
48
+
49
+ ---
50
+
51
+ ### 2. .envrc
52
+ **問題なし** - 汎用的なdirenv設定
53
+ - 相対パスのみ(`.env`, `.env.personal`)
54
+ - git worktree対応の汎用ロジック
55
+
56
+ ---
57
+
58
+ ### 3. .mcp.json
59
+ **問題なし** - 汎用的なMCP設定
60
+ - MCPサーバー設定は汎用的
61
+ - `${GITHUB_TOKEN}` は環境変数参照(動的)
62
+
63
+ ---
64
+
65
+ ### 4. CLAUDE.md.template
66
+ **問題なし** - テンプレート化済み
67
+ - `@einja:excluded:start` ~ `@einja:excluded:end` で囲まれた部分は配布時に除外される
68
+ - 変数プレースホルダーは未検出(要確認: テンプレート変換処理の詳細)
69
+
70
+ ---
71
+
72
+ ### 5. preset.yaml
73
+ **問題なし** - プリセット定義
74
+ - 変数定義セクション(`variables:`)でユーザーカスタマイズ可能
75
+ - `PROJECT_NAME`, `INSTALL_COMMAND` 等のプレースホルダーを提供
76
+
77
+ ---
78
+
79
+ ### 6. .claude/settings.json
80
+ **問題なし** - 汎用的なClaude設定
81
+ - パーミッション設定は汎用的
82
+ - フック定義のパスは `$CLAUDE_PROJECT_DIR` を使用(動的)
83
+
84
+ ---
85
+
86
+ ## 追加調査結果
87
+
88
+ ### grep検索結果
89
+
90
+ #### 1. テンプレートリポジトリ名の検出
91
+ ```bash
92
+ grep -r "einja-management-template" packages/cli/presets/default/
93
+ ```
94
+ **検出箇所**:
95
+ - `docs/einja/steering/README.md`:
96
+ ```
97
+ 詳細な仕様は [CLIのマーカー仕様書](https://github.com/einja-inc/einja-management-template/blob/main/packages/cli/docs/MARKER_SPECIFICATION.md) を参照してください。
98
+ ```
99
+ - **問題**: ハードコードされたGitHubリポジトリURL
100
+ - **影響**: 外部リンクが切れる(他プロジェクトには無関係なリンク)
101
+ - **重要度**: 🟡 中(ドキュメントの参照リンクのみ)
102
+
103
+ #### 2. ハードコードされたポート番号の検出
104
+ ```bash
105
+ grep -r "localhost:300[0-9]" packages/cli/presets/default/
106
+ ```
107
+ **検出箇所** (多数):
108
+
109
+ | ファイル | 行内容 | 重要度 |
110
+ |---------|--------|--------|
111
+ | `.claude/agents/einja/specs/spec-qa-generator.md` | `http://localhost:3000/auth/login` | 🟡 中 |
112
+ | `docs/einja/instructions/environment-setup.md` | `NEXTAUTH_URL="http://localhost:3000"` | 🔴 高 |
113
+ | `docs/einja/example/specs/issues/issue999-example-task/qa-tests/README.md` | `http://localhost:3000` (複数箇所) | 🟢 低(例示) |
114
+ | `docs/einja/steering/acceptance-criteria-and-qa-guide.md` | `http://localhost:3000` (複数箇所) | 🟡 中 |
115
+ | `docs/einja/steering/development/testing-strategy.md` | `baseURL: 'http://localhost:3000'` | 🟡 中 |
116
+
117
+ **問題点**:
118
+ - テンプレート固有のポート番号(3000)がハードコード
119
+ - 実際のプロジェクトは異なるポート(例: 3001, 8080等)を使用する可能性
120
+ - Worktree環境では動的ポート割り当てが必要
121
+
122
+ #### 3. ハードコードされたリポジトリURLの検出
123
+ ```bash
124
+ grep -r "github.com/einja-inc" packages/cli/presets/default/
125
+ ```
126
+ **検出箇所**:
127
+ - `docs/einja/steering/README.md`: 同上(問題1と同じ)
128
+
129
+ #### 4. 開発者固有の絶対パスの検出
130
+ ```bash
131
+ grep -r "/Users/kzp" packages/cli/presets/default/
132
+ ```
133
+ **結果**: 検出なし ✅
134
+
135
+ ---
136
+
137
+ ## 修正が必要な箇所
138
+
139
+ ### 🔴 高優先度1: docs/einja/instructions/environment-setup.md
140
+
141
+ #### 問題: ハードコードされたポート番号
142
+ ```
143
+ NEXTAUTH_URL="http://localhost:3000"
144
+ ```
145
+
146
+ **修正案**:
147
+ - 変数プレースホルダーに置き換え:
148
+ ```
149
+ NEXTAUTH_URL="http://localhost:${PORT:-3000}"
150
+ ```
151
+ - またはドキュメント内で「ポート番号は環境に応じて変更してください」と注記
152
+
153
+ ---
154
+
155
+ ### 🔴 高優先度2: scripts/worktree/dev.ts
156
+
157
+ #### 問題1: packages/config へのハードコードされた依存
158
+ ```typescript
159
+ import type { AppConfig, WorktreeConfig } from "../../packages/config/src/worktree-config.js";
160
+ ```
161
+
162
+ **修正案**:
163
+ - オプション1(推奨): 型定義をスクリプト内にインライン化
164
+ ```typescript
165
+ interface AppConfig {
166
+ id: string;
167
+ portRangeStart: number;
168
+ rangeSize: number;
169
+ }
170
+ interface WorktreeConfig {
171
+ apps: AppConfig[];
172
+ postgres: { port: number; containerName: string };
173
+ }
174
+ ```
175
+ - オプション2: worktree.config.json から型を動的に推論
176
+ - オプション3: 設定ファイルのパスを環境変数で指定可能にする
177
+
178
+ #### 問題2: loadWorktreeConfig() の依存
179
+ ```typescript
180
+ import { loadWorktreeConfig } from "../../packages/config/src/worktree-config-loader.js";
181
+ ```
182
+
183
+ **修正案**:
184
+ - `loadWorktreeConfig()` の実装を `dev.ts` 内にインライン化
185
+ - または、設定ファイルが存在しない場合のデフォルト値を提供
186
+
187
+ ---
188
+
189
+ ### 🟡 中優先度: ドキュメント内のポート番号
190
+
191
+ #### 問題箇所
192
+ - `.claude/agents/einja/specs/spec-qa-generator.md`
193
+ - `docs/einja/steering/acceptance-criteria-and-qa-guide.md`
194
+ - `docs/einja/steering/development/testing-strategy.md`
195
+
196
+ **修正案**:
197
+ - 例示部分は `http://localhost:${PORT}` のように変数表記に変更
198
+ - または「例: localhost:3000(実際のポートは環境に応じて変更)」と注記を追加
199
+
200
+ ---
201
+
202
+ ### 🟡 中優先度: docs/einja/steering/README.md
203
+
204
+ #### 問題: 外部リンク
205
+ ```
206
+ https://github.com/einja-inc/einja-management-template/blob/main/packages/cli/docs/MARKER_SPECIFICATION.md
207
+ ```
208
+
209
+ **修正案**:
210
+ - 相対パス参照に変更:
211
+ ```
212
+ [CLIのマーカー仕様書](../../../packages/cli/docs/MARKER_SPECIFICATION.md)
213
+ ```
214
+ - または汎用的なドキュメントリンクに変更
215
+
216
+ ---
217
+
218
+ ## 推奨アクション
219
+
220
+ ### 優先度1: 環境依存値の変数化
221
+ 1. **docs/einja/instructions/environment-setup.md**
222
+ - ポート番号を変数化(`${PORT:-3000}`)
223
+ - 環境変数設定ガイドを追記
224
+
225
+ ### 優先度2: スクリプトの依存解消
226
+ 2. **scripts/worktree/dev.ts**
227
+ - packages/config への依存を解消
228
+ - worktree.config.json のスキーマ定義をスクリプト内に含める
229
+ - 設定ファイル不在時のフォールバック処理を追加
230
+
231
+ ### 優先度3: ドキュメントの汎用化
232
+ 3. **ドキュメント全体**
233
+ - 例示のポート番号に「環境依存」の注記を追加
234
+ - 外部リンクを相対パス参照に変更
235
+ - テンプレート変換処理(CLAUDE.md.template → CLAUDE.md)の詳細調査
236
+
237
+ ### 優先度4: 検証・ドキュメント化
238
+ 4. **追加タスク**
239
+ - preset.yaml の変数置換ロジックの検証
240
+ - プリセットファイルのカスタマイズガイド作成
241
+ - einja init 時の変数入力プロンプトの設計
242
+
243
+ ---
244
+
245
+ ## 調査結果サマリー
246
+
247
+ ### ✅ 問題なし(11ファイル)
248
+ - scripts/init.sh
249
+ - scripts/env.ts
250
+ - scripts/env-show.ts
251
+ - scripts/env-rotate-secrets.ts
252
+ - scripts/setup-dev.ts
253
+ - scripts/lib/env-common.ts
254
+ - .envrc
255
+ - .mcp.json
256
+ - CLAUDE.md.template
257
+ - preset.yaml
258
+ - .claude/settings.json
259
+
260
+ ### ⚠️ 修正必要(5ファイル)
261
+
262
+ | ファイル | 問題 | 重要度 |
263
+ |---------|------|--------|
264
+ | scripts/worktree/dev.ts | packages/config への依存 | 🔴 高 |
265
+ | docs/einja/instructions/environment-setup.md | ポート番号ハードコード | 🔴 高 |
266
+ | docs/einja/steering/README.md | 外部リンク | 🟡 中 |
267
+ | .claude/agents/einja/specs/spec-qa-generator.md | ポート番号ハードコード | 🟡 中 |
268
+ | docs/einja/steering/acceptance-criteria-and-qa-guide.md | ポート番号ハードコード | 🟡 中 |
269
+ | docs/einja/steering/development/testing-strategy.md | ポート番号ハードコード | 🟡 中 |
270
+
271
+ ### 🟢 例示のみ(修正推奨だが低優先度)
272
+ - docs/einja/example/specs/issues/issue999-example-task/qa-tests/README.md
273
+
274
+ ---
275
+
276
+ ## 次のステップ
277
+
278
+ 1. **ユーザー確認**
279
+ - この調査結果をユーザーに報告
280
+ - 修正方針の承認を得る
281
+
282
+ 2. **修正実施**
283
+ - 承認後、優先度順に修正タスクを実行
284
+ - コミット・プッシュ
285
+
286
+ 3. **検証**
287
+ - einja init で新規プロジェクト作成テスト
288
+ - プリセット適用後の動作確認