create-einja-app 0.3.2 → 0.3.3
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.
- package/README.md +33 -0
- package/dist/cli.js +60 -64
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/templates/default/.changeset/config.json +11 -0
- package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +5 -1
- package/templates/default/.claude/settings.json +14 -0
- package/templates/default/.claude/skills/cli-package-specs/SKILL.md +247 -0
- package/templates/default/.einja-sync.json +1 -1
- package/templates/default/.github/release.yml +10 -0
- package/templates/default/.github/workflows/changeset-status.yml +60 -0
- package/templates/default/.github/workflows/deploy-stable-branches.yml +289 -59
- package/templates/default/CLAUDE.md +35 -8
- package/templates/default/README.md +20 -8
- package/templates/default/docs/plans/agile-munching-knuth.md +161 -0
- package/templates/default/docs/plans/agile-riding-nova.md +158 -0
- package/templates/default/docs/plans/agile-wibbling-dusk.md +91 -0
- package/templates/default/docs/plans/ancient-watching-otter.md +152 -0
- package/templates/default/docs/plans/bright-sauteeing-bumblebee.md +30 -0
- package/templates/default/docs/plans/composed-doodling-mountain.md +362 -0
- package/templates/default/docs/plans/dazzling-foraging-cascade.md +32 -0
- package/templates/default/docs/plans/enchanted-wiggling-ember-agent-a5befd57d0ca4c7c7.md +177 -0
- package/templates/default/docs/plans/enchanted-wiggling-ember.md +170 -0
- package/templates/default/docs/plans/federated-questing-kahan.md +47 -0
- package/templates/default/docs/plans/flickering-pondering-hearth.md +26 -0
- package/templates/default/docs/plans/fluttering-snuggling-sprout.md +172 -0
- package/templates/default/docs/plans/generic-sleeping-snowglobe-agent-a41d8da.md +179 -0
- package/templates/default/docs/plans/generic-sleeping-snowglobe.md +108 -0
- package/templates/default/docs/plans/generic-snuggling-pudding.md +57 -0
- package/templates/default/docs/plans/idempotent-wiggling-cherny.md +122 -0
- package/templates/default/docs/plans/recursive-fluttering-mitten.md +176 -0
- package/templates/default/docs/plans/todo-create-einja-app-ux-fix.md +16 -0
- package/templates/default/docs/plans/todo-direnv-hang-fix.md +12 -0
- package/templates/default/docs/plans/todo-github-actions-release-workflow.md +34 -0
- package/templates/default/docs/plans/todo-issue-spec-rename.md +24 -0
- package/templates/default/docs/plans/todo-skill-creator-upgrade.md +18 -0
- package/templates/default/docs/plans/velvety-chasing-spark.md +28 -0
- package/templates/default/docs/plans/wondrous-strolling-crystal-agent-a0615fc.md +215 -0
- package/templates/default/docs/plans/wondrous-strolling-crystal.md +182 -0
- package/templates/default/docs/plans/zesty-roaming-steele.md +74 -0
- package/templates/default/gitignore +6 -2
- package/templates/default/package.json +6 -2
- package/templates/default/pnpm-lock.yaml +547 -0
- package/templates/default/scripts/ensure-serena.sh +2 -2
- package/templates/default/scripts/env-rotate-secrets.ts +66 -6
- package/templates/default/scripts/init-github.ts +363 -0
- package/templates/default/scripts/init.sh +11 -5
- package/templates/default/scripts/setup-dev.ts +16 -1
- package/templates/default/.claude/skills/create-einja-app-release/SKILL.md +0 -186
- package/templates/default/.claude/skills/dev-cli-release/SKILL.md +0 -173
- package/templates/default/.cursor/commands/spec-create.md +0 -227
- package/templates/default/.cursor/commands/task-exec.md +0 -287
- package/templates/default/.cursor/commands/update-docs-by-task-specs.md +0 -448
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Plan Review: einja-sync コマンド自動化改善
|
|
2
|
+
|
|
3
|
+
## レビュー対象
|
|
4
|
+
|
|
5
|
+
`docs/plans/wondrous-strolling-crystal.md`
|
|
6
|
+
|
|
7
|
+
## レビュー観点
|
|
8
|
+
|
|
9
|
+
1. 実現可能性
|
|
10
|
+
2. コンフリクト解消の品質(conflict-resolverスキルとの整合性)
|
|
11
|
+
3. エッジケース
|
|
12
|
+
4. allowed-toolsへの `Edit` 追加の妥当性
|
|
13
|
+
5. `npx --yes` の副作用
|
|
14
|
+
6. 孤児削除の再実行アプローチ
|
|
15
|
+
7. 全体の整合性
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## レビュー結果
|
|
20
|
+
|
|
21
|
+
### ✅ 良い点
|
|
22
|
+
|
|
23
|
+
1. **conflict-resolverとの整合性**: 分析→説明→提案→確認の流れを踏襲
|
|
24
|
+
2. **1ファイルずつ確認**: 複数ファイルをまとめて質問しない、という重要な制約を明記
|
|
25
|
+
3. **マージ案の提示**: ローカル・テンプレート双方の分析とメリット・デメリットの説明
|
|
26
|
+
4. **direnv自動化**: `.envrc` 変更検出と自動 `direnv allow` 実行
|
|
27
|
+
5. **JSON出力の活用**: dev-cliの `--json` 出力を活用してコンフリクト検出
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 🚨 重大な問題
|
|
32
|
+
|
|
33
|
+
### 1. `npx --yes` の副作用(最重要)
|
|
34
|
+
|
|
35
|
+
**問題**: Step 1 の `npx --yes @einja/dev-cli --version` で、`@einja/dev-cli` がインストールされていない場合、**自動的にグローバルキャッシュにインストール**される。
|
|
36
|
+
|
|
37
|
+
**影響**:
|
|
38
|
+
- CLI検出の意図: 「利用可能か確認」→ 実際: 「なければインストール」
|
|
39
|
+
- ユーザーが意図せずパッケージをインストールしてしまう
|
|
40
|
+
- `--version` チェックが純粋な検出ではなくなる
|
|
41
|
+
|
|
42
|
+
**推奨修正**:
|
|
43
|
+
- Step 1 で `npx --yes` は使用しない(検出のみ)
|
|
44
|
+
- `command -v npx` で npx 自体の存在確認
|
|
45
|
+
- `npm list -g @einja/dev-cli` または `pnpm list -g @einja/dev-cli` でグローバルインストール確認
|
|
46
|
+
- ローカルに `node_modules/@einja/dev-cli` が存在するか確認
|
|
47
|
+
|
|
48
|
+
または、より簡潔に:
|
|
49
|
+
```bash
|
|
50
|
+
# npx でキャッシュチェック(インストールなし)
|
|
51
|
+
npx --version @einja/dev-cli 2>/dev/null
|
|
52
|
+
# → 失敗なら未インストール、成功なら利用可能
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
ただし、Step 3, 4 の実際の sync 実行時は `npx --yes` を使用してOK(この時点で実行意図が明確)。
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### 2. 孤児削除の再実行アプローチのリスク
|
|
60
|
+
|
|
61
|
+
**問題**: C. 孤児ファイル自動ハンドリング 4. で `npx --yes @einja/dev-cli sync --only <categories> --clean --yes` を再実行する方式。
|
|
62
|
+
|
|
63
|
+
**リスク**:
|
|
64
|
+
- 再度 sync 処理が走る(差分がないとはいえ、ファイルスキャンやメタデータ処理が重複)
|
|
65
|
+
- `--clean --yes` を別のタイミングで実行するとコンフリクト解消前のファイルを削除する可能性
|
|
66
|
+
- 孤児削除だけを独立して処理できるCLIオプションがないか確認すべき
|
|
67
|
+
|
|
68
|
+
**推奨確認事項**:
|
|
69
|
+
- `sync.ts` を確認したところ、孤児削除は `--clean` フラグで処理される(L179-L239, L632-L682)
|
|
70
|
+
- 既に sync 処理後であれば、メタデータに孤児情報が残っているので、CLI側で孤児削除専用の処理を追加する方が安全
|
|
71
|
+
- または、Bash + Read で孤児ファイルを直接削除する(ただし CLI の責務を侵害する可能性)
|
|
72
|
+
|
|
73
|
+
**代替案**:
|
|
74
|
+
- コマンド側で直接ファイル削除を実装(`rm` / `fs.remove` 相当)
|
|
75
|
+
- ただし、`sync.ts` の孤児削除ロジックを再実装することになり、DRY原則に反する
|
|
76
|
+
|
|
77
|
+
**判断**:
|
|
78
|
+
- 現状のアプローチ(再実行)は許容範囲内だが、CLIに `--clean-only` オプション追加を提案するのが理想的
|
|
79
|
+
- Plan には「再実行は処理が重複するが、現状のCLI仕様上の制約」と明記すべき
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### 3. `Edit` ツール追加のリスク評価
|
|
84
|
+
|
|
85
|
+
**問題**: allowed-tools に `Edit` を追加することの副作用。
|
|
86
|
+
|
|
87
|
+
**リスク分析**:
|
|
88
|
+
- ✅ コンフリクトマーカー除去に必要(`sed` は壊れやすい)
|
|
89
|
+
- ⚠️ 他のファイルも編集可能になる(スコープが広がる)
|
|
90
|
+
- ⚠️ 誤ってsync対象外のファイルを編集するリスク
|
|
91
|
+
|
|
92
|
+
**推奨対策**:
|
|
93
|
+
- Step 5-2.e で「必ずコンフリクトファイルのみを編集すること」を明記
|
|
94
|
+
- 編集対象ファイルパスの検証(sync 対象ファイル一覧に含まれるか確認)
|
|
95
|
+
- 編集後の `Grep` 検証で意図しない変更がないかチェック
|
|
96
|
+
|
|
97
|
+
**判断**: 追加は妥当だが、安全ガードを強化すべき。
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### 4. エッジケースの見落とし
|
|
102
|
+
|
|
103
|
+
| ケース | Plan での対応 | 推奨追加 |
|
|
104
|
+
|--------|-------------|---------|
|
|
105
|
+
| コンフリクトが0件 | 5-1 で「コンフリクトなし → スキップ」 | ✅ 記載あり |
|
|
106
|
+
| 孤児が0件 | 記載なし | ⚠️ C-1 に「空なら skip」を追加すべき |
|
|
107
|
+
| direnv未インストール | D-2 で「なければ skip」 | ✅ 記載あり |
|
|
108
|
+
| `.envrc` が変更されない | D-1 で「変更されたか確認」 | ✅ 記載あり |
|
|
109
|
+
| 複数のコンフリクトマーカーが1ファイルに存在 | 5-2.e 「末尾から処理し行番号ずれ防止」 | ✅ 記載あり |
|
|
110
|
+
| ユーザーが「スキップ」を選択した場合の後続処理 | 5-3 で「スキップされたファイルがあれば一覧を再表示」 | ✅ 記載あり |
|
|
111
|
+
| JSON出力が不正な場合 | 記載なし | ⚠️ JSONパースエラー時のフォールバック処理を追加すべき |
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### 5. allowed-toolsの不足
|
|
116
|
+
|
|
117
|
+
**問題**: コンフリクト解消で `Read` を使用するのに、`allowed-tools` に `Read` が含まれていない(現状は `Bash, AskUserQuestion` のみ)。
|
|
118
|
+
|
|
119
|
+
**推奨修正**:
|
|
120
|
+
```diff
|
|
121
|
+
-allowed-tools: Bash, AskUserQuestion
|
|
122
|
+
+allowed-tools: Bash, AskUserQuestion, Read, Edit, Grep, Glob
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
理由:
|
|
126
|
+
- `Read`: コンフリクトファイルの内容読み込み(5-2.a)
|
|
127
|
+
- `Edit`: マーカー除去(5-2.e)
|
|
128
|
+
- `Grep`: 未解消マーカー検証(5-3)
|
|
129
|
+
- `Glob`: ファイル検索(必要に応じて)
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### 6. create-einja-app の検出・処理
|
|
134
|
+
|
|
135
|
+
**問題**: create-einja-app は JSON出力に対応していない。Plan では「標準出力から「コンフリクト」行をパース」とあるが、実装の詳細が不足。
|
|
136
|
+
|
|
137
|
+
**推奨追加**:
|
|
138
|
+
- Step 4 で create-einja-app の標準出力フォーマットを明記
|
|
139
|
+
- 正規表現パターン例: `⚠️.*コンフリクト.*: (.+)`
|
|
140
|
+
- パース失敗時の処理(エラーメッセージ表示 + 手動解消を促す)
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### 7. 孤児ファイル削除の確認UIの重複
|
|
145
|
+
|
|
146
|
+
**問題**: C-3 で AskUserQuestion、C-4 で `--clean --yes` による自動削除。ユーザー確認が二重になる可能性。
|
|
147
|
+
|
|
148
|
+
**推奨修正**:
|
|
149
|
+
- C-3 の確認で「はい」を選択した場合、C-4 では `--yes` を付けて自動実行
|
|
150
|
+
- C-3 の確認で「いいえ」を選択した場合、C-4 をスキップ
|
|
151
|
+
|
|
152
|
+
現状の記述では「確認 → 再度 --yes で実行」となり、確認の意味がない。
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
### 8. Step 構成の番号ずれ
|
|
157
|
+
|
|
158
|
+
**問題**: 改修後の Step 構成で Step 6, 7 が新規追加されたが、元の Step 6 (結果サマリー) が Step 8 に、Step 7 (結果詳細) が Step 9 に移動。
|
|
159
|
+
|
|
160
|
+
**影響**: 現行の `.claude/commands/einja/einja-sync.md` との対応が不明確。
|
|
161
|
+
|
|
162
|
+
**推奨**: 対応表を追加:
|
|
163
|
+
|
|
164
|
+
| 現行 | 改修後 | 内容 |
|
|
165
|
+
|------|--------|------|
|
|
166
|
+
| Step 1 | Step 1 | CLI検出 |
|
|
167
|
+
| Step 2 | Step 2 | カテゴリ選択 |
|
|
168
|
+
| Step 3 | Step 3 | dry-run |
|
|
169
|
+
| Step 4 | Step 4 | sync実行 |
|
|
170
|
+
| Step 5 | Step 5 | コンフリクト解消 |
|
|
171
|
+
| - | **Step 6** | **孤児ファイル処理(新規)** |
|
|
172
|
+
| - | **Step 7** | **direnv allow(新規)** |
|
|
173
|
+
| Step 6 | Step 8 | 結果サマリー |
|
|
174
|
+
| Step 7 | Step 9 | 結果詳細 |
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 推奨される修正事項(優先順位順)
|
|
179
|
+
|
|
180
|
+
### 🔴 必須(実装前に修正すべき)
|
|
181
|
+
|
|
182
|
+
1. **Step 1 の `npx --yes` 削除**: 検出時はインストールしない方式に変更
|
|
183
|
+
2. **allowed-tools に `Read, Edit, Grep, Glob` 追加**
|
|
184
|
+
3. **C-3 と C-4 の確認UIの整理**: 二重確認を回避
|
|
185
|
+
4. **JSON出力パースエラー時のフォールバック処理追加**
|
|
186
|
+
|
|
187
|
+
### 🟡 推奨(実装時に考慮すべき)
|
|
188
|
+
|
|
189
|
+
5. **孤児削除の再実行リスクを Plan に明記**: 「処理が重複するが、現状のCLI仕様上の制約」
|
|
190
|
+
6. **create-einja-app の出力パースパターンを明記**
|
|
191
|
+
7. **Step 構成の対応表を追加**: 現行との差分を明確化
|
|
192
|
+
8. **エッジケース(孤児0件)の明示**: C-1 に追記
|
|
193
|
+
|
|
194
|
+
### 🟢 改善(あると望ましい)
|
|
195
|
+
|
|
196
|
+
9. **CLI に `--clean-only` オプション追加を提案**: 孤児削除専用処理
|
|
197
|
+
10. **Edit 使用時の安全ガード強化**: 編集対象ファイルの検証ロジック
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 総合評価
|
|
202
|
+
|
|
203
|
+
**実現可能性**: ⭐⭐⭐⭐☆ (4/5)
|
|
204
|
+
- 技術的には実装可能だが、`npx --yes` の副作用と孤児削除の再実行が懸念
|
|
205
|
+
|
|
206
|
+
**品質**: ⭐⭐⭐⭐☆ (4/5)
|
|
207
|
+
- conflict-resolver との整合性は高い
|
|
208
|
+
- エッジケース対応は概ね網羅されているが、一部追加が必要
|
|
209
|
+
|
|
210
|
+
**リスク**: ⭐⭐⭐☆☆ (3/5 - 中程度)
|
|
211
|
+
- `npx --yes` の自動インストール問題(最重要)
|
|
212
|
+
- allowed-tools の不足(実装時にエラーになる可能性)
|
|
213
|
+
- 孤児削除の再実行による処理重複
|
|
214
|
+
|
|
215
|
+
**推奨アクション**: 上記の🔴必須項目を修正してから実装開始すること。
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Plan: NPMリリースSkill統合
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
現在 `dev-cli-release` と `create-einja-app-release` の2つの独立したリリースSkillがあり、パッケージ公開時にどちらのSkillを使うか意識する必要がある。変更があったパッケージを自動検出し、1つのSkillで両方のリリースを処理できるようにする。
|
|
6
|
+
|
|
7
|
+
## 変更対象ファイル
|
|
8
|
+
|
|
9
|
+
| # | ファイル | 変更内容 |
|
|
10
|
+
|---|---------|---------|
|
|
11
|
+
| 1 | `.claude/skills/einja-npm-release/SKILL.md` | **新規作成**: 統合リリースSkill |
|
|
12
|
+
| 2 | `.claude/skills/dev-cli-release/SKILL.md` | **削除** |
|
|
13
|
+
| 3 | `.claude/skills/create-einja-app-release/SKILL.md` | **削除** |
|
|
14
|
+
| 4 | `CLAUDE.md` | キーワードトリガーを統合Skillに変更 |
|
|
15
|
+
|
|
16
|
+
## 統合Skillの設計
|
|
17
|
+
|
|
18
|
+
### パッケージ定義テーブル
|
|
19
|
+
|
|
20
|
+
Skill内でパッケージごとの差分を定数テーブルとして定義:
|
|
21
|
+
|
|
22
|
+
| キー | `@einja/cli` | `create-einja-app` |
|
|
23
|
+
|------|-------------|-------------------|
|
|
24
|
+
| path | `packages/cli` | `packages/create-einja-app` |
|
|
25
|
+
| pnpm filter | `@einja/cli` | `create-einja-app` |
|
|
26
|
+
| workflow | `release-cli.yml` | `release-create-einja-app.yml` |
|
|
27
|
+
| tag prefix | `cli-v` | `create-einja-app-v` |
|
|
28
|
+
| commit scope | `cli` | `create-einja-app` |
|
|
29
|
+
| build/test | build, test, typecheck | build, test, typecheck, lint |
|
|
30
|
+
|
|
31
|
+
### 処理フロー
|
|
32
|
+
|
|
33
|
+
#### Step 1: 前提条件の確認
|
|
34
|
+
- `git branch --show-current` → mainブランチ確認
|
|
35
|
+
- `git status --porcelain` → 未コミット変更の確認
|
|
36
|
+
- 未コミット変更がある場合 → AskUserQuestion(コミットしてから/スタッシュ/そのまま)
|
|
37
|
+
|
|
38
|
+
#### Step 2: 変更パッケージの自動検出
|
|
39
|
+
|
|
40
|
+
各パッケージについて、最新タグからの差分を検出:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# dev-cli: 最新タグ取得
|
|
44
|
+
git tag --list 'cli-v*' --sort=-version:refname | head -1
|
|
45
|
+
|
|
46
|
+
# create-einja-app: 最新タグ取得
|
|
47
|
+
git tag --list 'create-einja-app-v*' --sort=-version:refname | head -1
|
|
48
|
+
|
|
49
|
+
# 各パッケージの差分をチェック
|
|
50
|
+
git diff --name-only {latest_tag}..HEAD -- packages/cli/
|
|
51
|
+
git diff --name-only {latest_tag}..HEAD -- packages/create-einja-app/
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
結果をテーブル表示:
|
|
55
|
+
|
|
56
|
+
```markdown
|
|
57
|
+
| パッケージ | 現バージョン | 最新タグ | 変更ファイル数 |
|
|
58
|
+
|-----------|------------|---------|-------------|
|
|
59
|
+
| @einja/cli | 0.1.41 | cli-v0.1.41 | 3 |
|
|
60
|
+
| create-einja-app | 0.3.2 | create-einja-app-v0.3.2 | 5 |
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
#### Step 3: リリース対象の確認
|
|
64
|
+
|
|
65
|
+
AskUserQuestion で確認:
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
# 両方に変更がある場合
|
|
69
|
+
question: "どのパッケージをリリースしますか?"
|
|
70
|
+
header: "リリース対象"
|
|
71
|
+
options:
|
|
72
|
+
- label: "両方リリース(推奨)"
|
|
73
|
+
description: "@einja/cli (変更N件) と create-einja-app (変更M件) の両方をリリース"
|
|
74
|
+
- label: "@einja/cli のみ"
|
|
75
|
+
description: "@einja/cli のみリリース"
|
|
76
|
+
- label: "create-einja-app のみ"
|
|
77
|
+
description: "create-einja-app のみリリース"
|
|
78
|
+
|
|
79
|
+
# 片方のみ変更がある場合
|
|
80
|
+
question: "{パッケージ名} に変更があります。リリースしますか?"
|
|
81
|
+
header: "リリース確認"
|
|
82
|
+
options:
|
|
83
|
+
- label: "はい"
|
|
84
|
+
- label: "いいえ"
|
|
85
|
+
|
|
86
|
+
# 変更がない場合でもリリースできるように「Other」選択肢で対応
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
#### Step 4: バージョン種別の決定
|
|
90
|
+
|
|
91
|
+
対象パッケージごとにAskUserQuestion:
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
question: "{パッケージ名} のバージョン種別を選択してください(現在: v{current})"
|
|
95
|
+
header: "バージョン"
|
|
96
|
+
options:
|
|
97
|
+
- label: "patch(推奨)"
|
|
98
|
+
- label: "minor"
|
|
99
|
+
- label: "major"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
複数パッケージの場合、1つの AskUserQuestion で同時に聞けないので順番に確認。
|
|
103
|
+
|
|
104
|
+
#### Step 5: ビルド・テスト
|
|
105
|
+
|
|
106
|
+
対象パッケージごとに実行(並列実行可能):
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# dev-cli
|
|
110
|
+
pnpm --filter @einja/cli build && pnpm --filter @einja/cli test && pnpm --filter @einja/cli typecheck
|
|
111
|
+
|
|
112
|
+
# create-einja-app
|
|
113
|
+
pnpm -F create-einja-app build && pnpm -F create-einja-app test && pnpm -F create-einja-app typecheck && pnpm -F create-einja-app lint
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### Step 6: バージョン更新・コミット・プッシュ
|
|
117
|
+
|
|
118
|
+
**順次実行**(gitコミットは直列化が必要)。全パッケージ統一で `--no-git-tag-version` + 手動タグ方式:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# 1. バージョン更新(タグなし)
|
|
122
|
+
npm version {type} --no-git-tag-version --prefix {path}
|
|
123
|
+
|
|
124
|
+
# 2. package.jsonのみコミット
|
|
125
|
+
git add {path}/package.json
|
|
126
|
+
git commit -m "chore({scope}): v{version}にバージョンアップ"
|
|
127
|
+
|
|
128
|
+
# 3. タグ作成
|
|
129
|
+
git tag {tag_prefix}{version}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
全パッケージ分のコミット・タグ作成が完了してから一括プッシュ:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
git push origin main
|
|
136
|
+
git push origin {tag1}
|
|
137
|
+
git push origin {tag2} # 2パッケージの場合
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
#### Step 7: GitHub Actions 監視
|
|
141
|
+
|
|
142
|
+
対象パッケージごとにワークフローを監視(並列監視可能):
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
gh run list --workflow={workflow} --limit=1 --json databaseId,status,conclusion
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
- 30秒間隔でポーリング
|
|
149
|
+
- 失敗時: `gh run view {run_id} --log-failed` で原因特定 → 自律修正 → 再リリース
|
|
150
|
+
- 最大3回リトライ
|
|
151
|
+
|
|
152
|
+
#### Step 8: 完了報告
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
## 📦 NPM パッケージリリース完了
|
|
156
|
+
|
|
157
|
+
| パッケージ | バージョン | タグ | Actions |
|
|
158
|
+
|-----------|----------|-----|---------|
|
|
159
|
+
| @einja/cli | 0.1.41 → 0.1.42 | cli-v0.1.42 | ✅ |
|
|
160
|
+
| create-einja-app | 0.3.2 → 0.3.3 | create-einja-app-v0.3.3 | ✅ |
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## CLAUDE.md キーワードトリガー変更
|
|
164
|
+
|
|
165
|
+
変更前:
|
|
166
|
+
```
|
|
167
|
+
| `einja cli` `@einja/dev-cli` `公開` `リリース` `publish` `release` | `.claude/skills/dev-cli-release/SKILL.md` |
|
|
168
|
+
| `create-einja-app` | `.claude/skills/create-einja-app-release/SKILL.md` |
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
変更後:
|
|
172
|
+
```
|
|
173
|
+
| `einja cli` `@einja/dev-cli` `create-einja-app` `公開` `リリース` `publish` `release` | `.claude/skills/einja-npm-release/SKILL.md` |
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**注**: `create-einja-app` キーワードはリリース以外の文脈(例: sync)でも使われるが、統合Skillは変更検出で自動判別するため問題ない。
|
|
177
|
+
|
|
178
|
+
## 検証方法
|
|
179
|
+
|
|
180
|
+
1. `git diff --stat` で変更ファイルが4つ(新規1、削除2、編集1)であることを確認
|
|
181
|
+
2. Skill内のパッケージ定義テーブルが正しいことを確認
|
|
182
|
+
3. `Grep` で旧Skill名(`dev-cli-release`, `create-einja-app-release`)が残っていないことを確認
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# NPMリリース後の反映遅延修正
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
NPMリリース後、利用者が`npx create-einja-app`や`npx @einja/dev-cli`を実行しても古いバージョンが使われ続ける問題。根本原因は**npxのキャッシュ仕様**(npm 7以降、`@latest`未指定だとキャッシュ内の古いバージョンを無期限に使い続ける)。
|
|
6
|
+
|
|
7
|
+
## 修正箇所
|
|
8
|
+
|
|
9
|
+
### 1. npx呼び出しに`@latest`追加 + エラーメッセージ更新
|
|
10
|
+
|
|
11
|
+
**`packages/create-einja-app/src/generators/post-setup.ts`**
|
|
12
|
+
|
|
13
|
+
| 行 | Before | After |
|
|
14
|
+
|----|--------|-------|
|
|
15
|
+
| 119 | `execa("npx", ["@einja/dev-cli", ...])` | `execa("npx", ["--yes", "@einja/dev-cli@latest", ...])` |
|
|
16
|
+
| 123 | `'npx @einja/dev-cli init'` | `'npx --yes @einja/dev-cli@latest init'` |
|
|
17
|
+
|
|
18
|
+
**`package.json`(ルート・scriptsセクション)**
|
|
19
|
+
|
|
20
|
+
| キー | Before | After |
|
|
21
|
+
|------|--------|-------|
|
|
22
|
+
| `einja:sync` | `npx --yes @einja/dev-cli sync` | `npx --yes @einja/dev-cli@latest sync` |
|
|
23
|
+
| `task:loop` | `npx @einja/dev-cli task:loop` | `npx --yes @einja/dev-cli@latest task:loop` |
|
|
24
|
+
|
|
25
|
+
### 2. テスト期待値の更新
|
|
26
|
+
|
|
27
|
+
**`packages/create-einja-app/tests/unit/generators/post-setup.test.ts`(134行目)**
|
|
28
|
+
- `["@einja/dev-cli", ...]` → `["--yes", "@einja/dev-cli@latest", ...]` に更新
|
|
29
|
+
|
|
30
|
+
**`packages/create-einja-app/tests/integration/create.test.ts`(21行目)**
|
|
31
|
+
- `args?.[0] === "@einja/dev-cli"` → `args?.[1] === "@einja/dev-cli@latest"` に更新(`--yes`が先頭に入るため)
|
|
32
|
+
|
|
33
|
+
### 3. release-cli.ymlにtest/typecheck/lint追加
|
|
34
|
+
|
|
35
|
+
**`.github/workflows/release-cli.yml`** - Buildステップ後に追加:
|
|
36
|
+
```yaml
|
|
37
|
+
- name: Run tests
|
|
38
|
+
run: pnpm --filter @einja/dev-cli test
|
|
39
|
+
|
|
40
|
+
- name: Type check
|
|
41
|
+
run: pnpm --filter @einja/dev-cli typecheck
|
|
42
|
+
|
|
43
|
+
- name: Lint
|
|
44
|
+
run: pnpm --filter @einja/dev-cli lint
|
|
45
|
+
```
|
|
46
|
+
参考: `.github/workflows/release-create-einja-app.yml` に同等のステップあり
|
|
47
|
+
|
|
48
|
+
### 4. パッケージ名の誤記修正
|
|
49
|
+
|
|
50
|
+
**`packages/cli/RELEASING.md`(50, 53行目)**
|
|
51
|
+
- `@einja/cli` → `@einja/dev-cli`
|
|
52
|
+
|
|
53
|
+
**`.claude/skills/einja-npm-release/SKILL.md`(25, 28, 137, 232行目)**
|
|
54
|
+
- `@einja/cli` → `@einja/dev-cli` に統一
|
|
55
|
+
|
|
56
|
+
### 5. フォローアップ(別リポジトリ)
|
|
57
|
+
|
|
58
|
+
**`docs/einja/cli/preset.yaml`(127-128行目)** - 管理対象ディレクトリ(読み取り専用)
|
|
59
|
+
- `npx @einja/dev-cli sync` → `npx --yes @einja/dev-cli@latest sync` 等
|
|
60
|
+
- **CLIソース側(eenchowリポジトリ)で修正し、`einja sync`で反映する必要あり**
|
|
61
|
+
- 本PR完了後にCLI側Issueとして起票
|
|
62
|
+
|
|
63
|
+
## Skill-first評価
|
|
64
|
+
|
|
65
|
+
- npxコマンドの引数修正 + CI設定追加 + 誤記修正という**1回限りの修正**
|
|
66
|
+
- 再現パターンではないためSkill化不要
|
|
67
|
+
|
|
68
|
+
## 検証方法
|
|
69
|
+
|
|
70
|
+
1. `pnpm prepush` でlint/typecheck/testが通ることを確認
|
|
71
|
+
2. `grep -r "@einja/dev-cli@latest" packages/create-einja-app/src/` で`@latest`が含まれることを確認
|
|
72
|
+
3. `grep "@einja/cli[^/]" .claude/skills/einja-npm-release/SKILL.md packages/cli/RELEASING.md` で旧名が残っていないことを確認
|
|
73
|
+
4. `release-cli.yml` にtest/typecheck/lintステップが存在することを確認
|
|
74
|
+
5. `git diff --stat` で意図しない変更がないことを確認
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
2
2
|
|
|
3
3
|
# Python
|
|
4
|
-
**/__pycache__
|
|
4
|
+
**/__pycache__/
|
|
5
|
+
|
|
6
|
+
# auto-generated files
|
|
7
|
+
**/__generated__/
|
|
5
8
|
|
|
6
9
|
# dependencies
|
|
7
10
|
**/node_modules
|
|
@@ -42,7 +45,8 @@ log/*.pid
|
|
|
42
45
|
.env.personal
|
|
43
46
|
.env.keys
|
|
44
47
|
.env.local.tmp
|
|
45
|
-
.env
|
|
48
|
+
.env.*.bak
|
|
49
|
+
.env.keys.bak
|
|
46
50
|
|
|
47
51
|
# dotenvx - 以下は追跡する(暗号化済み)
|
|
48
52
|
# .env.example(テンプレート)
|
|
@@ -45,10 +45,14 @@
|
|
|
45
45
|
"env:encrypt": "dotenvx encrypt",
|
|
46
46
|
"env:show": "tsx scripts/env-show.ts",
|
|
47
47
|
"env:rotate-secrets": "tsx scripts/env-rotate-secrets.ts",
|
|
48
|
-
"einja:sync": "npx @einja/dev-cli sync",
|
|
49
|
-
"
|
|
48
|
+
"einja:sync": "npx --yes @einja/dev-cli@latest sync",
|
|
49
|
+
"init:github": "tsx scripts/init-github.ts",
|
|
50
|
+
"task:loop": "npx --yes @einja/dev-cli@latest task:loop",
|
|
51
|
+
"changeset": "changeset"
|
|
50
52
|
},
|
|
51
53
|
"devDependencies": {
|
|
54
|
+
"@changesets/changelog-github": "^0.5.1",
|
|
55
|
+
"@changesets/cli": "^2.29.0",
|
|
52
56
|
"@clack/prompts": "^0.11.0",
|
|
53
57
|
"@dotenvx/dotenvx": "^1.51.4",
|
|
54
58
|
"@types/node": "^25.0.3",
|