create-einja-app 0.3.3 → 0.3.4

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.
@@ -117,6 +117,7 @@ description: "@einja/dev-cli と create-einja-app のビルド・テンプレー
117
117
  |--------|------------|----------|
118
118
  | `.envrc` | `.envrc` | env |
119
119
  | `.vscode/settings.json` | `.vscode/settings.json` | tools |
120
+ | `package.json`(ルート) | `package.json` | root-config |
120
121
 
121
122
  ---
122
123
 
@@ -127,16 +128,16 @@ description: "@einja/dev-cli と create-einja-app のビルド・テンプレー
127
128
  **ファイル**: `packages/cli/src/lib/preset-update/file-copier.ts` L194-195
128
129
 
129
130
  ```typescript
130
- // skillsカテゴリの場合、einja-プレフィックスでフィルタリング
131
- const prefixFilter = mapping.category === "skills" ? "einja-" : undefined;
131
+ // skillsカテゴリの場合、einja-/_einja-プレフィックスでフィルタリング
132
+ const prefixFilter = mapping.category === "skills" ? ["einja-", "_einja-"] : undefined;
132
133
  ```
133
134
 
134
- `.claude/skills/` 配下のトップレベルディレクトリのうち、**`einja-` で始まるもののみ**が配布対象。
135
+ `.claude/skills/` 配下のトップレベルディレクトリのうち、**`einja-` または `_einja-` で始まるもの**が配布対象。
135
136
 
136
- - **配布される**: `einja-project-overview/`, `einja-task-commit/`, `einja-skill-creator/` 等
137
- - **配布されない**: `cli-package-specs/`(このSkill自体)、その他 `einja-` プレフィックスなしのSkill
137
+ - **配布される**: `einja-task-commit/`, `einja-skill-creator/`, `_einja-project-overview/` 等
138
+ - **配布されない**: `cli-package-specs/`(このSkill自体)、その他プレフィックスなしのSkill
138
139
 
139
- `copy-presets.mjs` では個別列挙(L62-101)で同等の制御を実現している。
140
+ `copy-presets.mjs` ではディレクトリを動的スキャンし、`einja-*` / `_einja-*` パターンにマッチするものを個別エントリとしてコピーする。
140
141
 
141
142
  ### 3.2 `_` プレフィックスフィルタ
142
143
 
@@ -205,6 +206,52 @@ const prefixFilter = mapping.category === "skills" ? "einja-" : undefined;
205
206
  | project-private に ID 必須 | `project_private_without_id` |
206
207
  | ID 重複禁止 | `duplicate_id` |
207
208
 
209
+ ### 4.5 JSON マージ仕様
210
+
211
+ **実装**: `packages/cli/src/lib/sync/json-processor.ts`
212
+ **設定**: `.einja-sync.json` の `jsonPaths` フィールド
213
+
214
+ #### マージモード(ブラックリスト方式)
215
+
216
+ | モード | 動作 | 用途 |
217
+ |--------|------|------|
218
+ | `managed` | テンプレート値で強制上書き | テンプレートが完全管理するセクション |
219
+ | `project-private` | 完全除外(テンプレートから追加・更新しない) | プロジェクト固有のセクション |
220
+ | デフォルト | base/local/templateの3方向マージ | 上記以外の全パス |
221
+
222
+ #### ネスト指定
223
+
224
+ パスはドット区切りでネスト指定可能。`deepMergeWithPaths` の再帰により
225
+ 各レベルで jsonPaths チェックが行われる。
226
+
227
+ 例: `"project-private": { "package.json": ["devDependencies.@types/node"] }`
228
+ → devDependencies 全体は3方向マージ、@types/node のみ除外
229
+
230
+ #### 設定例
231
+
232
+ ```
233
+ jsonPaths:
234
+ managed: { ".claude/settings.json": ["plansDirectory"] }
235
+ project-private: { "package.json": ["name", "version", "private", "workspaces"] }
236
+ ```
237
+
238
+ → plansDirectory はテンプレート強制上書き
239
+ → name, version 等は完全除外
240
+ → scripts, devDependencies 等は3方向マージ
241
+
242
+ #### base スナップショット
243
+
244
+ 3方向マージには前回sync時のテンプレート内容(base)が必要。
245
+ `.einja-sync.json` の各ファイルメタデータに `baseContent` として保存。
246
+ 初回sync(base なし)はローカル優先 + テンプレート新規キーのみ追加。
247
+
248
+ #### コンフリクト
249
+
250
+ 両方が同じキーを異なる値に変更した場合:
251
+ - ローカル値を保持(安全側)
252
+ - コンソールに警告出力
253
+ - `mergeJson` の戻り値 `conflicts` 配列で呼び出し元にも通知
254
+
208
255
  ---
209
256
 
210
257
  ## 5. `post-setup.ts` 処理フロー
@@ -136,7 +136,7 @@
136
136
  ## プロジェクト概要
137
137
 
138
138
  Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は以下のSkillを参照:
139
- - `einja-project-overview` - 構成、技術スタック、頻出コマンド
139
+ - `_einja-project-overview` - 構成、技術スタック、頻出コマンド
140
140
  - `docs/einja/steering/development/coding-standards.md` - コーディング規約、インポートパス規約
141
141
  - `einja-infra-maintenance` - 開発環境セットアップ、サーバー管理
142
142
 
@@ -231,6 +231,19 @@ Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は
231
231
 
232
232
  このセクションはテンプレート生成時に除外され、CLIで他リポジトリにコピーされません。
233
233
 
234
+ ### Skill命名規則(配布制御)
235
+
236
+ | 区分 | ディレクトリ名 | name フィールド | 配布 |
237
+ |------|--------------|----------------|------|
238
+ | ユーザー向け | `einja-{name}/` | `einja-{name}` | される |
239
+ | インナー(内部参照用) | `_einja-{name}/` | `_einja-{name}` | される |
240
+ | リポジトリ固有 | `{name}/` | `{name}` | されない |
241
+
242
+ - Skill作成時は `einja-` プレフィックスをつける(配布対象にするため)
243
+ - インナーSkill(他Skillから内部的に参照されるもの)はディレクトリ名に `_einja-` プレフィックスをつける
244
+ - 配布しないリポジトリ固有Skillはプレフィックスをつけない
245
+ - 配布制御は `copy-presets.mjs` がディレクトリ名の `einja-` / `_einja-` プレフィックスで自動判定する
246
+
234
247
  ### キーワードトリガー(専用Skill使用必須)
235
248
 
236
249
  以下のキーワードを検出したら、**即座に該当Skillを参照**すること:
@@ -240,6 +253,7 @@ Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は
240
253
  | `einja cli` `@einja/dev-cli` `create-einja-app` `公開` `リリース` `publish` `release` | `.claude/skills/einja-npm-release/SKILL.md` |
241
254
  | `インフラ` `環境変数管理` `Vercel` `Neon` `デプロイ設定` `GitHub Secrets` `環境セットアップ` `ローカルセットアップ` `ローカル環境` `セットアップ` `GitHub Actions` `CI/CD` `ワークフロー` | `.claude/skills/einja-infra-maintenance/SKILL.md` |
242
255
  | `Skill作るべき?` `Skill化` `skill-first` `Skill-first` | `.claude/skills/einja-skill-first/SKILL.md` |
256
+ | `prebuild` `copy-presets` `generate-template` `preset:update` `presets/default` `CLAUDE.md.template` `ファイルマッピング` `マーカー仕様` `@einja:excluded` `@einja:managed` `@einja:project-private` `FileCopier` `ビルドパイプライン` `テンプレート仕様` | `.claude/skills/cli-package-specs/SKILL.md` |
243
257
 
244
258
  ### CLIパッケージの二重管理禁止
245
259
 
@@ -249,21 +263,20 @@ Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は
249
263
  |-----|---------|------|
250
264
  | `.claude/agents/einja/` | `presets/default/.claude/agents/einja/` | 単純コピー |
251
265
  | `.claude/commands/einja/` | `presets/default/.claude/commands/einja/` | 単純コピー |
252
- | `.claude/skills/einja-*/` | `presets/default/.claude/skills/einja-*/` | 単純コピー |
266
+ | `.claude/skills/einja-*/` | `presets/default/.claude/skills/` | `einja-*` / `_einja-*` プレフィックスのディレクトリを自動スキャンしてコピー |
253
267
  | `.claude/hooks/einja/` | `presets/default/.claude/hooks/einja/` | 単純コピー |
254
268
  | `.claude/settings.json` | `presets/default/.claude/settings.json` | 単純コピー |
255
269
  | `.vscode/settings.json` | `presets/default/.vscode/settings.json` | 単純コピー |
256
270
  | `docs/einja/` (memory,cli除く) | `presets/default/docs/einja/` | 単純コピー(sync + init対象) |
257
271
  | `CLAUDE.md` | `presets/default/CLAUDE.md.template` | **変換生成** |
258
272
  | `scripts/` (`_`プレフィクス除く) | `presets/default/scripts/` | 単純コピー |
273
+ | `package.json`(ルート) | `presets/default/package.json` | フルコピー |
259
274
 
260
275
  **コピー先のファイルは直接編集禁止**(ビルド時に上書きされる)
261
276
 
262
277
  ### パッケージビルド仕様(テンプレートリポジトリ限定)
263
278
 
264
- `@einja/dev-cli` と `create-einja-app` の2パッケージのビルド・テンプレート仕様については、以下のSkillを参照すること:
265
-
266
- `.claude/skills/cli-package-specs/SKILL.md`
279
+ `@einja/dev-cli` と `create-einja-app` の2パッケージのビルド・テンプレート仕様は、上記キーワードトリガーにより `cli-package-specs` Skillが自動参照される。
267
280
 
268
281
  ### マネージドディレクトリの編集について(テンプレートリポジトリ限定)
269
282
 
@@ -0,0 +1,42 @@
1
+ # Plan: npx コマンドの `@latest` 指定漏れを一括修正
2
+
3
+ ## Context
4
+
5
+ `npx @einja/dev-cli` を `@latest` なしで実行すると、npxキャッシュの古いバージョンが使われる。`einja:einja-sync` コマンドでv0.1.0が使われてしまった。実行されるコマンド/スクリプト定義を修正する。
6
+
7
+ ## 修正対象
8
+
9
+ ### 1. `.claude/commands/einja/einja-sync.md` (6箇所)
10
+
11
+ `npx --yes` で実行するコマンドに `@latest` を追加。`replace_all` で一括置換。
12
+
13
+ | Before | After |
14
+ |--------|-------|
15
+ | `npx --yes @einja/dev-cli sync` (4箇所: 107,159,162,231行) | `npx --yes @einja/dev-cli@latest sync` |
16
+ | `npx --yes create-einja-app sync` (2箇所: 110,165行) | `npx --yes create-einja-app@latest sync` |
17
+
18
+ **修正しない箇所**: Step 1のCLI検出 (19,20行目) は `npx --no` のまま。目的が「CLIが利用可能か」の検出であり、バージョン不問で検出できる方が適切。実際のsync実行 (Step 3,4) では `--yes @latest` で最新版が使われる。
19
+
20
+ ### 2. `docs/einja/cli/preset.yaml` (2箇所)
21
+
22
+ 下流プロジェクトの `package.json` scripts に反映されるため修正必須。
23
+
24
+ | 行 | Before | After |
25
+ |----|--------|-------|
26
+ | 127 | `"task:loop": "npx @einja/dev-cli task:loop"` | `"task:loop": "npx @einja/dev-cli@latest task:loop"` |
27
+ | 128 | `"einja:sync": "npx @einja/dev-cli sync"` | `"einja:sync": "npx @einja/dev-cli@latest sync"` |
28
+
29
+ ## 修正不要
30
+
31
+ | ファイル | 理由 |
32
+ |---------|------|
33
+ | `einja-sync.md` 19,20行 | Step 1のCLI検出。`--no` で検出目的のためバージョン不問 |
34
+ | `package.json` (ルート) | 既に `@latest` 付き |
35
+ | `create-einja-app/src/generators/post-setup.ts` | 既に `@latest` 付き |
36
+ | README.md / docs/plans/ / docs/specs/ 等 | ドキュメント内の説明・例示。直接実行されるコマンドではない |
37
+
38
+ ## 検証
39
+
40
+ 1. grep で `einja-sync.md` 内の `npx --yes` 呼び出しに全て `@latest` が付いていることを確認
41
+ 2. `preset.yaml` のscripts定義に `@latest` が付いていることを確認
42
+ 3. `pnpm build` して `presets/default/` に変更が反映されることを確認