create-einja-app 0.3.2 → 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.
- 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 -4
- package/templates/default/.claude/skills/_einja-general-context-loader/SKILL.md +258 -0
- package/templates/default/.claude/skills/_einja-output-format/SKILL.md +211 -0
- package/templates/default/.claude/skills/_einja-project-overview/SKILL.md +29 -0
- package/templates/default/.claude/skills/_einja-spec-context-loader/SKILL.md +181 -0
- package/templates/default/.claude/skills/cli-package-specs/SKILL.md +294 -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 +50 -10
- 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/glistening-conjuring-cascade.md +42 -0
- package/templates/default/docs/plans/idempotent-wiggling-cherny.md +122 -0
- package/templates/default/docs/plans/linear-gathering-hejlsberg.md +596 -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-glistening-conjuring-cascade.md +20 -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/todo-unified-crafting-valiant.md +23 -0
- package/templates/default/docs/plans/unified-crafting-valiant.md +60 -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 +28 -9
- 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/hooks/einja/validate-git-commit.sh +0 -239
- 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
- package/templates/default/packages/server-core/src/__generated__/fabbrica/index.d.ts +0 -270
- package/templates/default/packages/server-core/src/__generated__/fabbrica/index.js +0 -484
|
@@ -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",
|