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,161 @@
|
|
|
1
|
+
# Plan: create-einja-app を Claude Code から実行可能にする
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
`create-einja-app` CLI は inquirer v12 による対話的プロンプトを使用しているため、Claude Code の Bash ツール(非対話実行のみ)からは実行できない。AskUserQuestion で回答を収集し、CLI 引数として渡す方式で解決する。
|
|
6
|
+
|
|
7
|
+
**2段階の実装:**
|
|
8
|
+
1. CLI に非対話モード(全パラメータの CLI 引数化)を追加
|
|
9
|
+
2. Claude Code コマンドを作成し、AskUserQuestion → CLI 引数変換の仲介を行う
|
|
10
|
+
|
|
11
|
+
## スコープ
|
|
12
|
+
|
|
13
|
+
- `create` コマンドのみ(`sync` コマンドは対象外 — 既に `einja:einja-sync` Skill が存在)
|
|
14
|
+
- 既存の対話モードは完全に維持(後方互換)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Step 1: `CliConfigOverrides` 型の追加
|
|
19
|
+
|
|
20
|
+
**ファイル:** `packages/create-einja-app/src/types/index.ts`
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
export type CliConfigOverrides = {
|
|
24
|
+
packageScope?: string;
|
|
25
|
+
authMethod?: "default" | "none";
|
|
26
|
+
setupEinjaCli?: boolean;
|
|
27
|
+
useCurrentDir?: boolean;
|
|
28
|
+
postgresPort?: number;
|
|
29
|
+
containerName?: string;
|
|
30
|
+
appId?: string;
|
|
31
|
+
portRangeStart?: number;
|
|
32
|
+
rangeSize?: number;
|
|
33
|
+
};
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Step 2: commander オプション追加
|
|
37
|
+
|
|
38
|
+
**ファイル:** `packages/create-einja-app/src/cli.ts`
|
|
39
|
+
|
|
40
|
+
既存の `--skip-git`, `--skip-install` に加えて以下を追加:
|
|
41
|
+
|
|
42
|
+
| フラグ | 説明 |
|
|
43
|
+
|--------|------|
|
|
44
|
+
| `-y, --yes` | 非対話モード(デフォルト値使用) |
|
|
45
|
+
| `--scope <scope>` | パッケージスコープ |
|
|
46
|
+
| `--auth <method>` | 認証方式: `default` \| `none` |
|
|
47
|
+
| `--no-einja-cli` | einja CLI セットアップをスキップ |
|
|
48
|
+
| `--use-current-dir` | カレントディレクトリに展開 |
|
|
49
|
+
| `--postgres-port <port>` | PostgreSQL ポート |
|
|
50
|
+
| `--container-name <name>` | Docker コンテナ名 |
|
|
51
|
+
| `--app-id <id>` | アプリ ID |
|
|
52
|
+
| `--port-range-start <port>` | ポート範囲開始 |
|
|
53
|
+
| `--range-size <size>` | ポート範囲サイズ |
|
|
54
|
+
|
|
55
|
+
## Step 3: `create.ts` の 3 パターン分岐
|
|
56
|
+
|
|
57
|
+
**ファイル:** `packages/create-einja-app/src/commands/create.ts`
|
|
58
|
+
|
|
59
|
+
### 3.1 `CreateOptions` 拡張
|
|
60
|
+
|
|
61
|
+
CLI引数の全フィールドを受け取れるよう拡張。
|
|
62
|
+
|
|
63
|
+
### 3.2 `validateCliOverrides()` 追加
|
|
64
|
+
|
|
65
|
+
CLI 引数のバリデーション(scope 正規表現、auth 値チェック、ポート番号範囲)。エラー時は `process.exit(1)`。
|
|
66
|
+
|
|
67
|
+
### 3.3 メインフロー変更
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
options.yes → パターンA: 完全非対話(デフォルト + overrides)
|
|
71
|
+
overrides あり → パターンB: 部分指定(未指定フィールドのみ対話)
|
|
72
|
+
それ以外 → パターンC: 完全対話(従来通り)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 3.4 `buildConfigWithDefaults()` 追加
|
|
76
|
+
|
|
77
|
+
`--yes` 時にデフォルト値 + overrides から `ProjectConfig` を構築。既存の L80-95 のハードコード部分をこの関数に統合。
|
|
78
|
+
|
|
79
|
+
## Step 4: `project.ts` の overrides 対応
|
|
80
|
+
|
|
81
|
+
**ファイル:** `packages/create-einja-app/src/prompts/project.ts`
|
|
82
|
+
|
|
83
|
+
- `promptProjectConfig(defaultProjectName?, overrides?)` にシグネチャ変更
|
|
84
|
+
- 各質問に `when: () => overrides?.xxx === undefined` を追加し、CLI 引数で指定済みの項目をスキップ
|
|
85
|
+
- worktree 関連 overrides が 1 つでもある場合、`customizeWorktree` 質問をスキップ(カスタマイズ済みとみなす)
|
|
86
|
+
- 最終的な return で `overrides?.xxx ?? answers.xxx` のマージ
|
|
87
|
+
|
|
88
|
+
## Step 5: `post-setup.ts` の非対話対応
|
|
89
|
+
|
|
90
|
+
**ファイル:** `packages/create-einja-app/src/generators/post-setup.ts`
|
|
91
|
+
|
|
92
|
+
- `PostSetupOptions` に `yes?: boolean` を追加
|
|
93
|
+
- `yes === true` 時は `promptAndExecuteDirenvAllow` の inquirer をスキップし、デフォルト動作(direnv allow 実行)
|
|
94
|
+
|
|
95
|
+
## Step 6: Claude Code コマンド作成
|
|
96
|
+
|
|
97
|
+
**ファイル:** `.claude/commands/einja/create-app.md`
|
|
98
|
+
|
|
99
|
+
AskUserQuestion で回答を収集し、CLI 引数に変換して実行するコマンド。
|
|
100
|
+
|
|
101
|
+
### フロー
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
1. AskUserQuestion: プロジェクト名(テキスト入力)
|
|
105
|
+
2. AskUserQuestion: 基本設定 3問同時
|
|
106
|
+
- パッケージスコープ(@repo / @{プロジェクト名} / カスタム)
|
|
107
|
+
- 認証方式(NextAuth.js / なし)
|
|
108
|
+
- einja CLI セットアップ(はい / いいえ)
|
|
109
|
+
3. AskUserQuestion: Worktree カスタマイズ(はい / いいえ)
|
|
110
|
+
4. (条件付き) AskUserQuestion: Worktree 詳細設定
|
|
111
|
+
5. ビルド + CLI 実行:
|
|
112
|
+
pnpm -F create-einja-app build
|
|
113
|
+
node packages/create-einja-app/dist/cli.js <name> --yes \
|
|
114
|
+
--scope <scope> --auth <auth> [--no-einja-cli] [worktree flags] \
|
|
115
|
+
--skip-install
|
|
116
|
+
6. 結果報告
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**注意:** `--skip-install` をデフォルトで付与(Claude Code 内でのインストールは別途制御)
|
|
120
|
+
|
|
121
|
+
## Step 7: テスト
|
|
122
|
+
|
|
123
|
+
### ユニットテスト
|
|
124
|
+
- `overrides` マージの正確性
|
|
125
|
+
- CLI 引数バリデーションのエラーケース
|
|
126
|
+
|
|
127
|
+
### 統合テスト
|
|
128
|
+
- `--yes` でデフォルト生成
|
|
129
|
+
- `--yes --scope @custom --auth none` でカスタム生成
|
|
130
|
+
- 部分指定(`--scope` のみ)で残りが対話入力されること
|
|
131
|
+
|
|
132
|
+
### 手動検証
|
|
133
|
+
```bash
|
|
134
|
+
# 非対話モード
|
|
135
|
+
node packages/create-einja-app/dist/cli.js test-proj --yes --skip-git --skip-install
|
|
136
|
+
|
|
137
|
+
# 部分指定
|
|
138
|
+
node packages/create-einja-app/dist/cli.js test-proj --scope @test --skip-git --skip-install
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 変更ファイル一覧
|
|
144
|
+
|
|
145
|
+
| ファイル | 変更内容 |
|
|
146
|
+
|---------|---------|
|
|
147
|
+
| `packages/create-einja-app/src/types/index.ts` | `CliConfigOverrides` 型追加 |
|
|
148
|
+
| `packages/create-einja-app/src/cli.ts` | commander オプション追加 |
|
|
149
|
+
| `packages/create-einja-app/src/commands/create.ts` | 3パターン分岐、バリデーション、デフォルト構築 |
|
|
150
|
+
| `packages/create-einja-app/src/prompts/project.ts` | overrides 対応、`when` 条件追加 |
|
|
151
|
+
| `packages/create-einja-app/src/generators/post-setup.ts` | `yes` オプション追加 |
|
|
152
|
+
| `.claude/commands/einja/create-app.md` | 新規: AskUserQuestion 仲介コマンド |
|
|
153
|
+
| テストファイル(既存 + 新規) | 非対話モードのテストケース追加 |
|
|
154
|
+
|
|
155
|
+
## 検証方法
|
|
156
|
+
|
|
157
|
+
1. `pnpm -F create-einja-app build` が成功すること
|
|
158
|
+
2. `pnpm -F create-einja-app typecheck` が成功すること
|
|
159
|
+
3. `pnpm -F create-einja-app test` が成功すること
|
|
160
|
+
4. 手動で `--yes` モード実行し、プロジェクトが正しく生成されること
|
|
161
|
+
5. Claude Code から `/einja:create-app` で実行できること
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Plan: セットアップフロー統合ドキュメント作成
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
`scripts/init.sh`、`post-setup.ts`、`setup-dev.ts` など複数のセットアップ関連ファイルがあるが、
|
|
6
|
+
**どの操作でどのファイルが呼ばれ何が起きるか**を横断的にまとめたドキュメントが存在しない。
|
|
7
|
+
3つのシナリオ(create-einja-app初回 / einja sync / clone後セットアップ)ごとのフローを
|
|
8
|
+
mermaid図 + テーブルで整理したドキュメントを作成する。
|
|
9
|
+
|
|
10
|
+
## 変更ファイル
|
|
11
|
+
|
|
12
|
+
| ファイル | 変更内容 |
|
|
13
|
+
|---------|---------|
|
|
14
|
+
| `docs/einja/instructions/setup-flow.md` | **新規作成** セットアップフロー統合ドキュメント |
|
|
15
|
+
| `README.md` | 「パッケージ利用者向け」+「開発環境セットアップ」にドキュメント参照リンクを追加 |
|
|
16
|
+
|
|
17
|
+
> **NOTE**: `docs/einja/instructions/` はこのリポジトリが原本。ビルド時に `presets/default/` へ自動コピーされ、`einja sync` で各プロジェクトに配布される。直接 `presets/default/` を編集する必要はない。
|
|
18
|
+
|
|
19
|
+
## TODO
|
|
20
|
+
|
|
21
|
+
### TODO-1: `docs/einja/instructions/setup-flow.md` 新規作成
|
|
22
|
+
|
|
23
|
+
3シナリオのセットアップフローを網羅するドキュメントを作成する。
|
|
24
|
+
|
|
25
|
+
#### ドキュメント構成
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
# セットアップフローガイド
|
|
29
|
+
|
|
30
|
+
## 概要
|
|
31
|
+
- 3つのシナリオの簡潔な説明
|
|
32
|
+
|
|
33
|
+
## シナリオ別フロー
|
|
34
|
+
|
|
35
|
+
### 1. npx create-einja-app(新規プロジェクト作成)
|
|
36
|
+
- mermaid シーケンス図
|
|
37
|
+
- 処理テーブル(ファイル → 処理内容)
|
|
38
|
+
|
|
39
|
+
### 2. git clone 後の環境構築(既存プロジェクトへの参加)
|
|
40
|
+
- mermaid シーケンス図
|
|
41
|
+
- 処理テーブル
|
|
42
|
+
|
|
43
|
+
### 3. einja sync(テンプレート同期)
|
|
44
|
+
- mermaid シーケンス図
|
|
45
|
+
- 処理テーブル(dev-cli sync / create-einja-app sync)
|
|
46
|
+
|
|
47
|
+
## ファイル別リファレンス
|
|
48
|
+
- 各スクリプト/ファイルの役割と呼び出し元の逆引きテーブル
|
|
49
|
+
|
|
50
|
+
## 処理の重複と設計意図
|
|
51
|
+
- init.sh と dev:setup の重複箇所の説明(冪等性の意図)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### シナリオ1: `npx create-einja-app` フロー
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
ユーザー: npx create-einja-app my-app
|
|
58
|
+
│
|
|
59
|
+
├── cli.ts → createCommand()
|
|
60
|
+
│ ├── 対話プロンプト(プロジェクト名、スコープ、認証方式等)
|
|
61
|
+
│ ├── generateTemplate() ← generators/template.ts
|
|
62
|
+
│ │ └── テンプレートコピー + 変数置換 + リネーム
|
|
63
|
+
│ └── execPostSetup() ← generators/post-setup.ts
|
|
64
|
+
│ ├── Step 0: bash scripts/init.sh (stdio: inherit)
|
|
65
|
+
│ │ ├── Step 1: Volta インストール(未導入時のみ)
|
|
66
|
+
│ │ ├── Step 2: シェル設定(VOLTA_FEATURE_PNPM)
|
|
67
|
+
│ │ ├── Step 3: Node.js / pnpm インストール
|
|
68
|
+
│ │ ├── Step 4: pnpm install
|
|
69
|
+
│ │ └── Step 5: direnv allow(direnv存在時のみ)
|
|
70
|
+
│ ├── PATH補完(~/.volta/bin を process.env.PATH に追加)
|
|
71
|
+
│ ├── Step 1: pnpm install + pnpm db:generate
|
|
72
|
+
│ ├── Step 2: pnpm env:rotate-secrets --all --non-interactive
|
|
73
|
+
│ ├── Step 3: git init + git add . + git commit
|
|
74
|
+
│ ├── Step 4: npx @einja/dev-cli init(setupEinjaCli=true時のみ)
|
|
75
|
+
│ └── 完了メッセージ表示
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
#### シナリオ2: clone後の環境構築フロー
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
開発者: git clone → cd project
|
|
82
|
+
│
|
|
83
|
+
├── ./scripts/init.sh(手動実行・初回のみ)
|
|
84
|
+
│ ├── Step 1: Volta インストール
|
|
85
|
+
│ ├── Step 2: シェル設定
|
|
86
|
+
│ ├── Step 3: Node.js / pnpm インストール
|
|
87
|
+
│ ├── Step 4: pnpm install
|
|
88
|
+
│ └── Step 5: direnv allow
|
|
89
|
+
│
|
|
90
|
+
├── exec $SHELL(ターミナル再起動)
|
|
91
|
+
│
|
|
92
|
+
├── pnpm dev:setup(= tsx scripts/setup-dev.ts)
|
|
93
|
+
│ ├── Step 1-3: Volta確認 / シェル設定 / Node.js・pnpm インストール
|
|
94
|
+
│ ├── Step 4: direnv インストール(macOS: brew install direnv)
|
|
95
|
+
│ ├── Step 5: direnv hook シェル追記
|
|
96
|
+
│ ├── Step 6: dotenvx インストール
|
|
97
|
+
│ ├── Step 7: .env 作成(.env.local + .env.keys で復号)
|
|
98
|
+
│ ├── Step 8: .env.personal 作成 + GITHUB_TOKEN(対話入力)
|
|
99
|
+
│ ├── Step 9: direnv allow → .envrc評価(Serena MCP自動起動含む)
|
|
100
|
+
│ ├── Step 10: PostgreSQL 起動(docker-compose up -d postgres)
|
|
101
|
+
│ └── Step 11: pnpm db:generate + pnpm db:push
|
|
102
|
+
│
|
|
103
|
+
└── pnpm dev:bg(開発サーバー起動)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### シナリオ3: einja sync フロー
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
開発者: einja sync(Claude Code Skill経由)
|
|
110
|
+
│
|
|
111
|
+
├── dev-cli sync
|
|
112
|
+
│ ├── 同期対象:
|
|
113
|
+
│ │ ├── .claude/commands/einja/, .claude/agents/einja/
|
|
114
|
+
│ │ ├── .claude/skills/einja-*/, .claude/hooks/
|
|
115
|
+
│ │ ├── docs/einja/, scripts/
|
|
116
|
+
│ │ ├── .envrc(envカテゴリ, 単一ファイル)
|
|
117
|
+
│ │ └── .vscode/settings.json(toolsカテゴリ, 単一ファイル)
|
|
118
|
+
│ ├── マージ: 3方向マージ + マーカーベース
|
|
119
|
+
│ ├── コンフリクト解消(対話式)
|
|
120
|
+
│ └── 依存関係チェック + インストール
|
|
121
|
+
│
|
|
122
|
+
└── create-einja-app sync
|
|
123
|
+
├── 同期対象: CI/CD, docker, monorepo設定, root config, scripts/
|
|
124
|
+
├── テンプレート変数置換あり
|
|
125
|
+
└── バックアップ作成 + マージ
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### ファイル別リファレンステーブル
|
|
129
|
+
|
|
130
|
+
| ファイル | 役割 | 呼び出し元 |
|
|
131
|
+
|---------|------|-----------|
|
|
132
|
+
| `scripts/init.sh` | Volta/Node/pnpm/direnv 初期導入 | create-einja-app (post-setup.ts) / 手動実行 |
|
|
133
|
+
| `scripts/setup-dev.ts` | 環境構築一式(.env, DB, direnv等) | `pnpm dev:setup` |
|
|
134
|
+
| `scripts/ensure-serena.sh` | Serena MCP サーバー起動 | `.envrc` (direnv) |
|
|
135
|
+
| `scripts/env-rotate-secrets.ts` | 秘密鍵ローテーション | create-einja-app (post-setup.ts) / `pnpm env:rotate-secrets` |
|
|
136
|
+
| `.envrc` | dotenv読み込み + worktree間.env.personal共有 + Serena MCP起動 | direnv(シェルディレクトリ進入時に自動評価) |
|
|
137
|
+
| `generators/post-setup.ts` | プロジェクト作成後のセットアップ | create-einja-app create コマンド |
|
|
138
|
+
| `generators/template.ts` | テンプレート展開・変数置換 | create-einja-app create コマンド |
|
|
139
|
+
| `generators/sync.ts` | テンプレート同期 | create-einja-app sync コマンド |
|
|
140
|
+
| `packages/cli/src/commands/sync.ts` | Claude Code関連ファイル同期 | dev-cli sync コマンド |
|
|
141
|
+
|
|
142
|
+
### TODO-2: README.md に参照リンク追加
|
|
143
|
+
|
|
144
|
+
**対象**: `README.md` の「パッケージ利用者向け」セクション(L8付近)
|
|
145
|
+
|
|
146
|
+
「使い分けガイド」の後に、セットアップフローガイドへの参照を1行追加:
|
|
147
|
+
|
|
148
|
+
```markdown
|
|
149
|
+
> 📖 各シナリオのセットアップで何が実行されるかの詳細は [セットアップフローガイド](docs/einja/instructions/setup-flow.md) を参照してください。
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
また「パッケージ開発者向け > 開発環境セットアップ」セクション(L158付近)にも同様のリンクを追加。
|
|
153
|
+
|
|
154
|
+
## 検証
|
|
155
|
+
|
|
156
|
+
1. ドキュメントのmermaid図がGitHubで正しくレンダリングされるか確認
|
|
157
|
+
2. README.mdのリンクが正しいパスを指しているか確認
|
|
158
|
+
3. `git diff --stat` で意図しないファイルが含まれていないこと
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Plan: create-einja-app 利用者体験の改善(3問題の修正)
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
create-einja-appの利用者がプロジェクト作成〜起動までの過程で3つの問題に遭遇している:
|
|
6
|
+
1. `scripts/init.sh` が Permission Denied(実行権限なし)
|
|
7
|
+
2. `pnpm install` が `init.sh` と `post-setup.ts` で二重実行される
|
|
8
|
+
3. READMEにトラブルシューティング情報が不足
|
|
9
|
+
|
|
10
|
+
## 修正内容
|
|
11
|
+
|
|
12
|
+
### TODO-1: template.ts に `.sh` ファイルの実行権限付与処理を追加
|
|
13
|
+
|
|
14
|
+
**対象**: `packages/create-einja-app/src/generators/template.ts`
|
|
15
|
+
|
|
16
|
+
`generateTemplate()` 関数の末尾(変数置換ループ後、L279付近)に `.sh` ファイルへの `chmod +x` 処理を追加:
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { chmodSync } from "node:fs";
|
|
20
|
+
// ...
|
|
21
|
+
// シェルスクリプトに実行権限を付与
|
|
22
|
+
const shFiles = glob.sync("**/*.sh", {
|
|
23
|
+
cwd: targetPath,
|
|
24
|
+
absolute: true,
|
|
25
|
+
dot: true,
|
|
26
|
+
});
|
|
27
|
+
for (const file of shFiles) {
|
|
28
|
+
chmodSync(file, 0o755);
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- `node:fs` から `chmodSync` をインポート
|
|
33
|
+
- テンプレートは `.gitignore` で git 管理外のため、ソース権限でなくコピー後に明示付与する方式
|
|
34
|
+
- `fs-extra` の `copySync` はパーミッションを保持するが、ソース自体が 644 のため chmod が必要
|
|
35
|
+
|
|
36
|
+
### TODO-2: init.sh から `pnpm install` を削除(2ファイル)
|
|
37
|
+
|
|
38
|
+
**対象**:
|
|
39
|
+
- `scripts/init.sh` (L77-81) — 原本
|
|
40
|
+
- `packages/create-einja-app/templates/default/scripts/init.sh` (同箇所) — テンプレート配布物
|
|
41
|
+
|
|
42
|
+
両ファイルからStep 4(依存関係インストール)を削除する。理由:
|
|
43
|
+
- `post-setup.ts` の Step 1 で `pnpm install` を spinner付きで実行済み
|
|
44
|
+
- init.sh は「ツール導入」(Volta/Node/pnpm バイナリのインストール)に専念させる
|
|
45
|
+
- 二重実行の排除 + Volta PATH未反映でのインストール失敗を回避
|
|
46
|
+
|
|
47
|
+
Step 4 を削除し、旧Step 5(direnv設定)を Step 4 に繰り上げ。完了メッセージの「次のステップ」に `pnpm install` を追記。
|
|
48
|
+
|
|
49
|
+
※ `presets/default/scripts/init.sh` はビルド時に自動コピーされるため直接編集不要
|
|
50
|
+
|
|
51
|
+
### TODO-3: README にトラブルシューティング項目を追加
|
|
52
|
+
|
|
53
|
+
**対象**: `packages/create-einja-app/README.md` (L333付近、既存トラブルシューティングセクション末尾)
|
|
54
|
+
|
|
55
|
+
追加する項目:
|
|
56
|
+
1. **`scripts/init.sh` が Permission Denied** — `bash scripts/init.sh` で実行するか、`chmod +x scripts/*.sh` で権限付与
|
|
57
|
+
2. **Volta環境でpnpmが見つからない** — `npm install -g pnpm@latest-10` で手動インストール、またはターミナル再起動
|
|
58
|
+
|
|
59
|
+
### TODO-4: テストのモック順修正
|
|
60
|
+
|
|
61
|
+
**対象**: `packages/create-einja-app/tests/unit/generators/post-setup.test.ts`
|
|
62
|
+
|
|
63
|
+
`post-setup.ts` の実際の実行順序:
|
|
64
|
+
```
|
|
65
|
+
Step 0: init.sh
|
|
66
|
+
Step 1: pnpm install → pnpm db:generate
|
|
67
|
+
Step 2: pnpm env:rotate-secrets
|
|
68
|
+
Step 3: git init → git add → git commit
|
|
69
|
+
Step 4: npx @einja/dev-cli init(条件付き)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
現在のテストでモック順が実行順序と不一致のケース(L193-240)を修正:
|
|
73
|
+
- 「pnpm installに失敗した場合」(L193): `init.sh成功 → pnpm install失敗` に修正
|
|
74
|
+
- 「Prismaクライアント生成に失敗した場合」(L206): `init.sh成功 → pnpm install成功 → pnpm db:generate失敗` に修正
|
|
75
|
+
- 「@einja/dev-cli initに失敗した場合」(L222): 正しい順序に修正
|
|
76
|
+
|
|
77
|
+
## 対象ファイル一覧
|
|
78
|
+
|
|
79
|
+
| ファイル | 変更 |
|
|
80
|
+
|---------|------|
|
|
81
|
+
| `packages/create-einja-app/src/generators/template.ts` | `chmodSync` 追加 |
|
|
82
|
+
| `scripts/init.sh` | Step 4 (pnpm install) 削除 |
|
|
83
|
+
| `packages/create-einja-app/templates/default/scripts/init.sh` | 同上 |
|
|
84
|
+
| `packages/create-einja-app/README.md` | トラブルシューティング追記 |
|
|
85
|
+
| `packages/create-einja-app/tests/unit/generators/post-setup.test.ts` | モック順修正 |
|
|
86
|
+
|
|
87
|
+
## 検証方法
|
|
88
|
+
|
|
89
|
+
1. `pnpm -F create-einja-app test` でユニットテスト通過を確認
|
|
90
|
+
2. `pnpm prepush` (lint + typecheck + test) で全体通過を確認
|
|
91
|
+
3. テンプレートからプロジェクト生成し、`./scripts/init.sh` が直接実行できることを確認
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Plan: OrbStack推奨統一 + CLAUDE.md修正 + GitHub自動セットアップ + パッケージ仕様Skill
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
1. `create-einja-app` がGitHubリポジトリの作成・設定を行っていない
|
|
6
|
+
2. Docker環境でOrbStackを推奨に統一したい
|
|
7
|
+
3. CLAUDE.mdの「マネージドディレクトリ(編集禁止)」は下流リポジトリ向けルールであり、このテンプレートリポジトリ(原本)では `docs/einja/` は編集可能
|
|
8
|
+
4. 2パッケージ(`@einja/dev-cli`, `create-einja-app`)のビルド仕様を毎回確認するのが手間なので、Skillとして参照できるようにする
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## TODO-0: パッケージ仕様参照Skill作成
|
|
13
|
+
|
|
14
|
+
### 目的
|
|
15
|
+
`@einja/dev-cli` と `create-einja-app` の2パッケージのビルド・テンプレート仕様を、既存ドキュメント・コードへの参照として1箇所にまとめる。配布しない(このリポジトリ専用)。
|
|
16
|
+
|
|
17
|
+
### 作成ファイル
|
|
18
|
+
- `.claude/skills/cli-package-specs/SKILL.md`
|
|
19
|
+
|
|
20
|
+
### 命名理由
|
|
21
|
+
`einja-` プレフィックスなし → `file-copier.ts:195` のフィルタにより `presets/default/` にコピーされない
|
|
22
|
+
|
|
23
|
+
### 内容(参照ベース)
|
|
24
|
+
- 2パッケージの概要と役割
|
|
25
|
+
- ビルドパイプライン
|
|
26
|
+
- `packages/cli/scripts/generate-template.mjs`: CLAUDE.md → CLAUDE.md.template(`@einja:excluded` 除去 + プレースホルダー変換)
|
|
27
|
+
- `packages/create-einja-app/scripts/template-update.ts`: テンプレートファイルコピー(CLAUDE.mdは無変換でコピー)
|
|
28
|
+
- `scripts/_cli-template-update.ts`: CLIプリセット更新(`FileCopier` 経由、CLAUDE.mdは対象外)
|
|
29
|
+
- `scripts/_template-update.ts`: create-einja-appテンプレート更新(README.mdのみexcluded除去)
|
|
30
|
+
- ファイルマッピング(CLAUDE.md「CLIパッケージの二重管理禁止」テーブル参照)
|
|
31
|
+
- コピー対象フィルタ: `.claude/skills/einja-*/` のみ配布(`file-copier.ts:195`)
|
|
32
|
+
- マーカー仕様: `@einja:excluded`, `@einja:project-private`, `@einja:managed`
|
|
33
|
+
- `post-setup.ts` の処理フロー参照
|
|
34
|
+
- `setup-dev.ts` の処理フロー参照
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## TODO-1: CLAUDE.md excludedセクション修正
|
|
39
|
+
|
|
40
|
+
### 変更方針
|
|
41
|
+
マネージドディレクトリセクション自体は残す(下流リポジトリ向けに正しいルール)。`@einja:excluded` ブロック内に以下2点を追加。
|
|
42
|
+
|
|
43
|
+
### 変更内容(`CLAUDE.md` excludedセクション内)
|
|
44
|
+
|
|
45
|
+
#### 1. パッケージ仕様Skillの参照指示を追加
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
### パッケージビルド仕様(テンプレートリポジトリ限定)
|
|
49
|
+
|
|
50
|
+
`@einja/dev-cli` と `create-einja-app` の2パッケージのビルド・テンプレート仕様については、以下のSkillを参照すること:
|
|
51
|
+
|
|
52
|
+
`.claude/skills/cli-package-specs/SKILL.md`
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
#### 2. マネージドディレクトリのオーバーライド注記を追加
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
### マネージドディレクトリの編集について(テンプレートリポジトリ限定)
|
|
59
|
+
|
|
60
|
+
このリポジトリは `docs/einja/` の**原本(Single Source of Truth)**である。
|
|
61
|
+
上記「マネージドディレクトリ(編集禁止)」ルールは下流リポジトリ(create-einja-appで生成されたプロジェクト)向けであり、
|
|
62
|
+
**このリポジトリでは `docs/einja/` 配下の全ファイルを編集してよい**。
|
|
63
|
+
変更はビルド時に `presets/default/` へ自動コピーされる。
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 対象ファイル
|
|
67
|
+
- `CLAUDE.md`(excludedセクション内 L218付近)
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## TODO-2: OrbStack推奨に統一
|
|
72
|
+
|
|
73
|
+
### 2-1. `scripts/setup-dev.ts` 修正(L621-625)
|
|
74
|
+
|
|
75
|
+
Docker未インストール時のメッセージをOS別に分岐し、macOSではOrbStack推奨:
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
} else {
|
|
79
|
+
warn("Dockerがインストールされていません");
|
|
80
|
+
const platform = getPlatform();
|
|
81
|
+
if (platform === "macos") {
|
|
82
|
+
console.log(colors.yellow(" OrbStack(Docker互換の軽量ツール)のインストールを推奨します:"));
|
|
83
|
+
console.log(colors.cyan(" brew install orbstack"));
|
|
84
|
+
console.log(colors.gray(" または: https://orbstack.dev/"));
|
|
85
|
+
} else if (platform === "windows") {
|
|
86
|
+
console.log(colors.yellow(" Dockerをインストールしてください:"));
|
|
87
|
+
console.log(colors.gray(" https://docs.docker.com/desktop/install/windows-install/"));
|
|
88
|
+
} else {
|
|
89
|
+
console.log(colors.yellow(" Docker Engineをインストールしてください:"));
|
|
90
|
+
console.log(colors.gray(" https://docs.docker.com/engine/install/"));
|
|
91
|
+
}
|
|
92
|
+
console.log(colors.gray(" インストール後、以下を実行してください:"));
|
|
93
|
+
console.log(colors.gray(" docker-compose up -d postgres"));
|
|
94
|
+
console.log(colors.gray(" pnpm db:generate && pnpm db:push"));
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 2-2. `docs/einja/instructions/deployment-setup.md` 修正(L38)
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
Before: | Docker | [Docker Desktop](https://www.docker.com/products/docker-desktop/) | PostgreSQL実行 |
|
|
102
|
+
After: | Docker | macOS: [OrbStack](https://orbstack.dev/)(推奨)/ その他: [Docker Engine](https://docs.docker.com/engine/install/) | PostgreSQL実行 |
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 2-3. `docs/einja/instructions/local-server-environment-and-worktree.md` 修正(L62-63)
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
Before:
|
|
109
|
+
- macOS: [Docker Desktop for Mac](https://docs.docker.com/desktop/install/mac-install/)
|
|
110
|
+
- Windows: [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/)
|
|
111
|
+
|
|
112
|
+
After:
|
|
113
|
+
- macOS: [OrbStack](https://orbstack.dev/)(推奨。`brew install orbstack`)
|
|
114
|
+
- Windows: [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 対象ファイル
|
|
118
|
+
- `scripts/setup-dev.ts` (L596-625)
|
|
119
|
+
- `docs/einja/instructions/deployment-setup.md` (L38)
|
|
120
|
+
- `docs/einja/instructions/local-server-environment-and-worktree.md` (L62-63)
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## TODO-3: GitHub自動セットアップスクリプト作成
|
|
125
|
+
|
|
126
|
+
### 概要
|
|
127
|
+
`scripts/init-github.ts` を新規作成。`pnpm init:github` で実行。
|
|
128
|
+
|
|
129
|
+
### 処理フロー
|
|
130
|
+
1. `gh` CLIの存在確認(なければインストール案内して終了)
|
|
131
|
+
2. `gh auth status` で認証確認
|
|
132
|
+
3. `git remote get-url origin` でリモート有無確認
|
|
133
|
+
4. リモートなし → org/repo名を対話入力(デフォルト: ディレクトリ名)→ `gh repo create`
|
|
134
|
+
5. `git push -u origin main`
|
|
135
|
+
6. Branch Protection設定(`gh api`)
|
|
136
|
+
7. GitHub Secrets設定(`.env.keys` から読み取り → `gh secret set`)
|
|
137
|
+
8. Environments作成(production, preview)
|
|
138
|
+
|
|
139
|
+
### 対象ファイル
|
|
140
|
+
- `scripts/init-github.ts`(新規)
|
|
141
|
+
- `package.json`(`"init:github"` スクリプト追加)
|
|
142
|
+
- `scripts/setup-dev.ts`(完了メッセージに `pnpm init:github` 案内追加)
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 検証方法
|
|
147
|
+
|
|
148
|
+
1. **Skill**: `.claude/skills/cli-package-specs/SKILL.md` が存在し、参照先のファイルパスが正しいこと
|
|
149
|
+
2. **CLAUDE.md**: excludedセクション内にオーバーライド注記があること
|
|
150
|
+
3. **OrbStack**: `grep -r "Docker Desktop"` でsetup-dev.tsとdocs 2ファイルに残っていないこと
|
|
151
|
+
4. **init-github.ts**: `pnpm init:github --help` が動作すること
|
|
152
|
+
5. `pnpm prepush` が通ること
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Plan: AskUserQuestion の選択肢に description 必須記載ルールを追加
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
AskUserQuestionの選択肢を提示する際、`label` だけでは判断材料が不足する。`description` フィールドに詳細説明・注意点・トレードオフを必ず記載するルールをCLAUDE.mdに追加し、パッケージ利用者全体に適用する。
|
|
5
|
+
|
|
6
|
+
**仕様確認結果**: AskUserQuestionの選択肢フィールドは `label`(必須)、`description`(必須)、`markdown`(任意)の3つ。`note` フィールドは存在しない。
|
|
7
|
+
|
|
8
|
+
## 変更内容
|
|
9
|
+
|
|
10
|
+
### 対象ファイル
|
|
11
|
+
- `CLAUDE.md` L163-166「提示形式」セクション
|
|
12
|
+
|
|
13
|
+
### 修正内容
|
|
14
|
+
「提示形式」セクションを以下に書き換え:
|
|
15
|
+
|
|
16
|
+
```markdown
|
|
17
|
+
### 提示形式
|
|
18
|
+
- テーブル形式: 複数項目の比較
|
|
19
|
+
- 番号付きリスト: 詳細説明が必要な場合
|
|
20
|
+
- 推奨オプションには `(推奨)` と理由を付記
|
|
21
|
+
|
|
22
|
+
### 選択肢の記述ルール
|
|
23
|
+
- 各選択肢の `description` に**必ず詳細説明・注意点・補足**を記載する
|
|
24
|
+
- トレードオフ、影響範囲、前提条件など判断に必要な情報を含める
|
|
25
|
+
- ラベルだけで選択させない。ユーザーが十分な情報に基づいて判断できるようにする
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 検証
|
|
29
|
+
- CLAUDE.mdの変更箇所をReadで確認
|
|
30
|
+
- `presets/default/CLAUDE.md.template` はビルド時に自動生成されるため手動更新不要
|