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.
Files changed (65) hide show
  1. package/README.md +33 -0
  2. package/dist/cli.js +60 -64
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +1 -1
  5. package/templates/default/.changeset/config.json +11 -0
  6. package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +5 -1
  7. package/templates/default/.claude/settings.json +14 -4
  8. package/templates/default/.claude/skills/_einja-general-context-loader/SKILL.md +258 -0
  9. package/templates/default/.claude/skills/_einja-output-format/SKILL.md +211 -0
  10. package/templates/default/.claude/skills/_einja-project-overview/SKILL.md +29 -0
  11. package/templates/default/.claude/skills/_einja-spec-context-loader/SKILL.md +181 -0
  12. package/templates/default/.claude/skills/cli-package-specs/SKILL.md +294 -0
  13. package/templates/default/.einja-sync.json +1 -1
  14. package/templates/default/.github/release.yml +10 -0
  15. package/templates/default/.github/workflows/changeset-status.yml +60 -0
  16. package/templates/default/.github/workflows/deploy-stable-branches.yml +289 -59
  17. package/templates/default/CLAUDE.md +50 -10
  18. package/templates/default/README.md +20 -8
  19. package/templates/default/docs/plans/agile-munching-knuth.md +161 -0
  20. package/templates/default/docs/plans/agile-riding-nova.md +158 -0
  21. package/templates/default/docs/plans/agile-wibbling-dusk.md +91 -0
  22. package/templates/default/docs/plans/ancient-watching-otter.md +152 -0
  23. package/templates/default/docs/plans/bright-sauteeing-bumblebee.md +30 -0
  24. package/templates/default/docs/plans/composed-doodling-mountain.md +362 -0
  25. package/templates/default/docs/plans/dazzling-foraging-cascade.md +32 -0
  26. package/templates/default/docs/plans/enchanted-wiggling-ember-agent-a5befd57d0ca4c7c7.md +177 -0
  27. package/templates/default/docs/plans/enchanted-wiggling-ember.md +170 -0
  28. package/templates/default/docs/plans/federated-questing-kahan.md +47 -0
  29. package/templates/default/docs/plans/flickering-pondering-hearth.md +26 -0
  30. package/templates/default/docs/plans/fluttering-snuggling-sprout.md +172 -0
  31. package/templates/default/docs/plans/generic-sleeping-snowglobe-agent-a41d8da.md +179 -0
  32. package/templates/default/docs/plans/generic-sleeping-snowglobe.md +108 -0
  33. package/templates/default/docs/plans/generic-snuggling-pudding.md +57 -0
  34. package/templates/default/docs/plans/glistening-conjuring-cascade.md +42 -0
  35. package/templates/default/docs/plans/idempotent-wiggling-cherny.md +122 -0
  36. package/templates/default/docs/plans/linear-gathering-hejlsberg.md +596 -0
  37. package/templates/default/docs/plans/recursive-fluttering-mitten.md +176 -0
  38. package/templates/default/docs/plans/todo-create-einja-app-ux-fix.md +16 -0
  39. package/templates/default/docs/plans/todo-direnv-hang-fix.md +12 -0
  40. package/templates/default/docs/plans/todo-github-actions-release-workflow.md +34 -0
  41. package/templates/default/docs/plans/todo-glistening-conjuring-cascade.md +20 -0
  42. package/templates/default/docs/plans/todo-issue-spec-rename.md +24 -0
  43. package/templates/default/docs/plans/todo-skill-creator-upgrade.md +18 -0
  44. package/templates/default/docs/plans/todo-unified-crafting-valiant.md +23 -0
  45. package/templates/default/docs/plans/unified-crafting-valiant.md +60 -0
  46. package/templates/default/docs/plans/velvety-chasing-spark.md +28 -0
  47. package/templates/default/docs/plans/wondrous-strolling-crystal-agent-a0615fc.md +215 -0
  48. package/templates/default/docs/plans/wondrous-strolling-crystal.md +182 -0
  49. package/templates/default/docs/plans/zesty-roaming-steele.md +74 -0
  50. package/templates/default/gitignore +6 -2
  51. package/templates/default/package.json +6 -2
  52. package/templates/default/pnpm-lock.yaml +547 -0
  53. package/templates/default/scripts/ensure-serena.sh +28 -9
  54. package/templates/default/scripts/env-rotate-secrets.ts +66 -6
  55. package/templates/default/scripts/init-github.ts +363 -0
  56. package/templates/default/scripts/init.sh +11 -5
  57. package/templates/default/scripts/setup-dev.ts +16 -1
  58. package/templates/default/.claude/hooks/einja/validate-git-commit.sh +0 -239
  59. package/templates/default/.claude/skills/create-einja-app-release/SKILL.md +0 -186
  60. package/templates/default/.claude/skills/dev-cli-release/SKILL.md +0 -173
  61. package/templates/default/.cursor/commands/spec-create.md +0 -227
  62. package/templates/default/.cursor/commands/task-exec.md +0 -287
  63. package/templates/default/.cursor/commands/update-docs-by-task-specs.md +0 -448
  64. package/templates/default/packages/server-core/src/__generated__/fabbrica/index.d.ts +0 -270
  65. 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.local.bak
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
- "task:loop": "npx @einja/dev-cli task:loop"
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",