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,176 @@
1
+ # einja-issue-spec-createにui-designステップを追加 + Pencil MCP設定
2
+
3
+ ## Context
4
+
5
+ einja-issue-spec-create Skillは仕様書を段階的に作成するワークフローだが、現在はUI設計がdesign.md内のmermaid/表形式のみ。
6
+ Pencil MCPを活用してビジュアルなUIモックアップ(.penファイル)を生成するステップを追加し、UXの合意形成を効率化する。
7
+
8
+ ## Skill-first評価
9
+
10
+ **スキップ**: 既存のeinja-issue-spec-create Skillへの機能追加であり、新規Skill作成の対象外。
11
+
12
+ ## 変更対象ファイル
13
+
14
+ | # | ファイル | 操作 | 概要 |
15
+ |---|---------|------|------|
16
+ | 1 | `~/.claude/settings.json` | 変更 | Pencil MCP mcpServers設定追加 |
17
+ | 2 | `.claude/settings.json` | 変更 | Pencil MCP permissions追加 |
18
+ | 3 | `.claude/agents/einja/issue-specs/ui-design-generator.md` | **新規** | UIデザイン生成エージェント |
19
+ | 4 | `.claude/skills/einja-issue-spec-create/SKILL.md` | 変更 | ui-designステップ挿入 + Phase再番号付け |
20
+ | 5 | `.claude/agents/einja/issue-specs/design-generator.md` | 変更 | ui-design.pen参照追加 |
21
+
22
+ **注意**: `.claude/agents/einja/` および `.claude/skills/einja-*/` 配下のファイルは `presets/default/` に自動コピーされる。直接編集は不要。
23
+
24
+ ## 実装手順
25
+
26
+ ### Step 1: Pencil MCP設定追加(並行可)
27
+
28
+ #### 1a. `~/.claude/settings.json`(グローバル)にmcpServers追加
29
+
30
+ MCPサーバー定義はグローバル設定に配置(下流プロジェクトへの影響を防ぐため):
31
+
32
+ ```json
33
+ "mcpServers": {
34
+ "pencil": {
35
+ "transport": "stdio",
36
+ "command": "/Applications/Pencil.app/Contents/Resources/app.asar.unpacked/out/mcp-server-darwin-arm64",
37
+ "args": ["--app", "desktop"],
38
+ "env": {}
39
+ }
40
+ }
41
+ ```
42
+
43
+ #### 1b. `.claude/settings.json`(プロジェクト)にpermissions追加
44
+
45
+ `permissions.allow`に以下を追加:
46
+
47
+ ```
48
+ mcp__pencil__batch_design
49
+ mcp__pencil__batch_get
50
+ mcp__pencil__find_empty_space_on_canvas
51
+ mcp__pencil__get_editor_state
52
+ mcp__pencil__get_guidelines
53
+ mcp__pencil__get_screenshot
54
+ mcp__pencil__get_style_guide
55
+ mcp__pencil__get_style_guide_tags
56
+ mcp__pencil__get_variables
57
+ mcp__pencil__open_document
58
+ mcp__pencil__replace_all_matching_properties
59
+ mcp__pencil__search_all_unique_properties
60
+ mcp__pencil__set_variables
61
+ mcp__pencil__snapshot_layout
62
+ ```
63
+
64
+ ### Step 2: `ui-design-generator.md` 新規作成(並行可)
65
+
66
+ **パス**: `.claude/agents/einja/issue-specs/ui-design-generator.md`
67
+
68
+ **構造**(既存エージェントパターンに準拠 - `design-generator.md`等と同じ形式):
69
+ - **frontmatter**: name, description, tools(Pencil MCP + Playwright MCP読み取り用), model: sonnet, color: purple
70
+ - **ペルソナ**: UIデザイナー/UXエンジニアリング専門家
71
+ - **ワークフロー**:
72
+ 1. ステップ0: requirements.md読み込み + 既存画面判定
73
+ 2. ステップ1: Pencil MCP環境準備(open_document → get_guidelines → get_style_guide)
74
+ 3. ステップ2: 画面設計(find_empty_space_on_canvas → batch_design)
75
+ - `get_guidelines` でPencil MCPの操作ルール・構文仕様を取得してから実行
76
+ 4. ステップ3: ビジュアル確認(get_screenshot)と修正
77
+ 5. ステップ4: 既存画面改修時のPlaywright連携(スクリーンショット取得 → 参考にデザイン作成)
78
+ - **複数画面管理**: 1つの.penファイル内に複数フレーム。横方向(right)に自動配置、padding: 100px
79
+ - **既存画面改修**: Playwright MCPでスクショ取得 → 参考にしてデザイン作成
80
+ - **出力**: `{仕様書ディレクトリ}/ui-design.pen`(gitコミット対象)
81
+
82
+ ### Step 3: `einja-issue-spec-create/SKILL.md` 更新(Step 1,2に依存)
83
+
84
+ #### 変更1: allowed-tools に `mcp__pencil__*`, `mcp__playwright__*` 追加
85
+
86
+ #### 変更2: Phase構成の再番号付け
87
+
88
+ ```
89
+ Phase 1: requirements.md(要件定義書) ← 変更なし
90
+ Phase 2: ui-design.pen(UIデザイン) ← 新規
91
+ Phase 3: design.md(設計書) ← 旧Phase 2
92
+ Phase 4: QAテスト仕様生成 ← 旧Phase 3
93
+ Phase 5: GitHub Issueへのタスク記述 ← 旧Phase 4
94
+ ```
95
+
96
+ #### 変更3: Phase 2 ui-design ステップの挿入
97
+
98
+ Phase 1の後に以下を挿入:
99
+ - **スキップ判定**: requirements.mdに画面・UI・フォーム関連の要件がない場合はスキップ
100
+ - 明示的な判定基準: requirements.md内に「画面」「UI」「フォーム」「ダッシュボード」「表示」等のキーワードが含まれるか確認
101
+ - 判断が曖昧な場合はAskUserQuestionでユーザーに確認
102
+ - **既存画面確認**: 改修の場合はPlaywright MCPでスクリーンショット取得
103
+ - **エージェント呼び出し**: `ui-design-generator`で.pen生成
104
+ - **ユーザー確認**: get_screenshotで各画面プレビューを提示
105
+ - **承認後**: ui-design.penをコミット&プッシュ
106
+ - コミットメッセージ: `docs: {機能名}のUIデザインを追加`
107
+
108
+ #### 変更4: 旧Phase 2→3, 3→4, 4→5 の番号修正
109
+
110
+ 全てのPhase参照・セクション番号・サブセクション(4.1→5.1, 4.2→5.2等)を更新。
111
+
112
+ #### 変更5: Phase 3(旧Phase 2)design.mdセクションに ui-design.pen参照追加
113
+
114
+ ```
115
+ - **ui-design.penが存在する場合、Pencil MCPでビジュアルモックアップを参照してUI関連セクション(9-11)を作成**
116
+ ```
117
+
118
+ #### 変更6: 成果物ディレクトリ構成に `ui-design.pen` 追加
119
+
120
+ ```
121
+ /docs/specs/issues/{機能カテゴリ名}/issue{N}-{機能名}/
122
+ ├── requirements.md # Phase 1
123
+ ├── ui-design.pen # Phase 2(UI関連のみ)
124
+ ├── design.md # Phase 3
125
+ └── qa-tests/ # Phase 4
126
+ ```
127
+
128
+ #### 変更7: Phase 5 Issue説明文にUIデザインへのリンク追加
129
+
130
+ ### Step 4: `design-generator.md` 更新(Step 2に依存)
131
+
132
+ **パス**: `.claude/agents/einja/issue-specs/design-generator.md`
133
+
134
+ - ステップ0: ui-design.penの存在確認を追加
135
+ - ステップ1: 優先読み込みリストにui-design.penを追加
136
+ - セクション10(画面設計): ui-design.pen存在時はPencil MCPで参照(batch_get + get_screenshot)
137
+ - tools: `mcp__pencil__batch_get`, `mcp__pencil__get_screenshot` を追加(読み取り専用)
138
+
139
+ ## ui-design.pen と design.md の関係
140
+
141
+ | 観点 | ui-design.pen (Phase 2) | design.md (Phase 3) |
142
+ |------|------------------------|---------------------|
143
+ | 形式 | ビジュアル(.penファイル) | テキスト(mermaid/表) |
144
+ | 目的 | UX検証・デザイン合意 | 実装仕様の定義 |
145
+ | git管理 | .penファイルをコミット | 通常のmdファイル |
146
+ | セクション10 画面設計 | 各画面のビジュアルモックアップ | mermaid図(Pencil MCPで.penを参照して作成) |
147
+
148
+ **補完関係**: ui-design.pen=「何をどう見せるか」、design.md=「どう実装するか」
149
+
150
+ ## 実行順序
151
+
152
+ ```
153
+ Step 1 ─┐
154
+ ├─→ Step 3 ─→ 完了
155
+ Step 2 ─┤
156
+ └─→ Step 4
157
+ ```
158
+
159
+ Step 1とStep 2は並行実行可能。Step 3はStep 1,2完了後、Step 4はStep 2完了後。
160
+
161
+ ## Codexレビュー指摘事項への対応
162
+
163
+ | 指摘 | 対応 |
164
+ |------|------|
165
+ | mcpServersが下流プロジェクトにコピーされる | グローバル設定に配置、プロジェクトはpermissionsのみ |
166
+ | .penファイルのgit管理 | .penファイルをそのままgitコミット |
167
+ | batch_designのAPI仕様未記載 | エージェント内でget_guidelinesで仕様を取得してから実行 |
168
+ | Phase 2スキップ基準が曖昧 | キーワードベースの判定基準を明示 |
169
+ | allowed-tools更新の必要性 | Skillからサブエージェント経由で使うため追加 |
170
+
171
+ ## 検証方法
172
+
173
+ 1. **Pencil MCP接続テスト**: `mcp__pencil__get_editor_state` が応答するか確認
174
+ 2. **SKILL.md全体フロー確認**: Phase番号の整合性、次ステップへの参照が正しいか目視確認
175
+ 3. **新規エージェント構文確認**: frontmatterの形式が既存エージェント(design-generator.md等)と一致するか確認
176
+ 4. **CLIビルドへの影響確認**: agents/、skills/配下の新ファイルが`presets/default/`に自動コピーされることを確認
@@ -0,0 +1,16 @@
1
+ # TODO: create-einja-app 利用者体験の改善
2
+
3
+ ## 進捗
4
+
5
+ | # | タスク | 状態 | 担当 |
6
+ |---|--------|------|------|
7
+ | 1 | template.ts に `.sh` ファイルの実行権限付与処理を追加 | ✅ 完了 | sub-agent-1 |
8
+ | 2 | init.sh から `pnpm install` を削除(2ファイル) | ✅ 完了 | sub-agent-2 |
9
+ | 3 | README にトラブルシューティング項目を追加 | ✅ 完了 | sub-agent-3 |
10
+ | 4 | テストのモック順修正 | ✅ 完了 | sub-agent-4 |
11
+ | 5 | 検証(テスト・lint・typecheck) | ✅ 完了 | 親エージェント |
12
+
13
+ ## 検証結果
14
+ - `pnpm -F create-einja-app test`: 108テスト全パス
15
+ - `pnpm prepush`: lint + typecheck + test 全7タスク成功
16
+ - テンプレート `templates/default/` は `.gitignore` 管理。ビルド時に `scripts/init.sh` から自動生成
@@ -0,0 +1,12 @@
1
+ # TODO: direnvハング修正 + 秘密鍵ローテーション自動化
2
+
3
+ ## 進捗
4
+
5
+ | TODO | 内容 | 担当 | 状態 |
6
+ |------|------|------|------|
7
+ | TODO-1 | ensure-serena.sh: lsof → nc -z | Agent-A | ✅ 完了 |
8
+ | TODO-2 | env-rotate-secrets.ts: 非対話モード追加 | Agent-B | ✅ 完了 |
9
+ | TODO-3 | post-setup.ts: 処理順序変更 + 自動ローテーション | Agent-C | ✅ 完了 |
10
+ | TODO-4 | .gitignore: .bak パターン追加 | Agent-C | ✅ 完了 |
11
+ | 検証 | prepush (lint + typecheck + test) | 親 | ✅ 全パス |
12
+ | 検証 | git diff 確認 | 親 | ✅ 意図通り |
@@ -0,0 +1,34 @@
1
+ # TODO: GitHub Actions リリースワークフロー + 承認フロー
2
+
3
+ ## Phase 1: changesets基盤導入
4
+ - [x] `package.json` に devDependencies + scripts 追加
5
+ - [x] `.changeset/config.json` 新規作成
6
+ - [x] `pnpm install` で依存関係インストール
7
+
8
+ ## Phase 3: deploy-stable-branches.yml 大規模改修
9
+ - [x] ワークフロー全体ガード(無限ループ防止)追加
10
+ - [x] `permissions: contents: write` 追加
11
+ - [x] migrate ジョブをブランチ別に分割
12
+ - [x] deploy ジョブをブランチ別に分割(develop/staging/production)
13
+ - [x] release-staging ジョブ追加(PreRelease作成)
14
+ - [x] release-production ジョブ追加(changeset消費 + Release作成)
15
+
16
+ ## Phase 4: .github/release.yml
17
+ - [x] リリースノート設定ファイル新規作成
18
+
19
+ ## Phase 5: changeset-status.yml
20
+ - [x] PR上のchangesetステータス表示ワークフロー新規作成
21
+
22
+ ## Phase 6: einja-create-pr Skill
23
+ - [x] `.claude/skills/einja-create-pr/SKILL.md` 新規作成
24
+ - [x] `.claude/commands/einja/issue-exec.md` のPR作成部分をeinja-create-pr呼び出しに変更
25
+
26
+ ## Phase 7: ドキュメント追記
27
+ - [x] `docs/einja/steering/infrastructure/deployment.md` にリリース管理セクション追記
28
+ - [x] `docs/einja/steering/development-workflow.md` にchangeset運用フロー追記
29
+
30
+ ## 検証
31
+ - [x] YAML構文検証(deploy-stable-branches.yml, changeset-status.yml)
32
+ - [x] JSON構文検証(.changeset/config.json)
33
+ - [x] ワークフロージョブ構造確認(9ジョブ、ブランチ別分岐、環境設定)
34
+ - [x] `pnpm prepush` 通過(lint + typecheck + test)
@@ -0,0 +1,20 @@
1
+ # TODO: JSON 配布メカニズムの統一実装
2
+
3
+ ## Phase 1(並列実行)
4
+
5
+ - [x] **TG-A**: コアSync Engine(Steps 0+2+4: 型定義 + JsonProcessor全面改修 + MetadataManager更新)
6
+ - [x] **TG-B**: copy-presets.mjs(Step 5: package.jsonフルコピー + テンプレートscripts同期)
7
+ - [x] **TG-C**: file-filter.ts(Step 6: root-config + claude-configカテゴリ追加)
8
+
9
+ ## Phase 2(TG-A完了後)
10
+
11
+ - [x] **TG-D**: sync.ts変更(Steps 1+3: fileName→フルパス + JSON処理フロー変更)
12
+
13
+ ## Phase 3(コード変更完了後、並列)
14
+
15
+ - [x] **TG-E**: ドキュメント更新(Step 7: setup-flow.md, SKILL.md, CLAUDE.md)
16
+ - [x] **TG-F**: JsonProcessorユニットテスト作成(バグ修正含む)
17
+
18
+ ## Phase 4
19
+
20
+ - [x] **検証**: ビルド・テスト・prepush(全パス: 607 tests, 29 files, 7 turbo tasks)
@@ -0,0 +1,24 @@
1
+ # TODO: task-spec → issue-spec リネーム + コマンド→Skill移行
2
+
3
+ ## Phase 1: ファイル移動・作成
4
+
5
+ - [x] TG-1.1: エージェントディレクトリ移動+ファイルリネーム
6
+ - [x] TG-1.2: スキルディレクトリリネーム
7
+ - [x] TG-1.3: spec-create → einja-issue-spec-create Skill移行
8
+ - [x] TG-1.4: task-exec → einja-task-exec Skill移行
9
+ - [x] TG-1.5: update-docs-by-task-specs リネーム
10
+
11
+ ## Phase 2: 参照更新
12
+
13
+ - [x] TG-2.1: エージェント内部参照更新(10ファイル)
14
+ - [x] TG-2.2: スキル内部参照更新(9ファイル)
15
+ - [x] TG-2.3: コマンド/設定ファイル参照更新(4ファイル)
16
+ - [x] TG-2.4: docs/einja/ 参照更新(5ファイル)
17
+ - [x] TG-2.5: CLAUDE.md + README.md 更新
18
+
19
+ ## Phase 3: 検証
20
+
21
+ - [x] TG-3.1: 参照整合性チェック(旧パス残存ゼロ確認、1箇所修正)
22
+ - [x] TG-3.2: pnpm prepush 通過確認
23
+ - [x] TG-3.2: .cursor/commands/ 旧ファイル手動削除
24
+ - [ ] TG-3.2: sync-cursor-commands 再生成(コミット後に実行推奨)
@@ -0,0 +1,18 @@
1
+ # TODO: einja-skill-creator 公式版追従改善
2
+
3
+ ## Phase 0: plan-mode-skill-loader.sh hook修正
4
+ - [x] hookのデバッグ・修正(`hookSpecificOutput`内に`additionalContext`を配置)
5
+
6
+ ## Phase 1: スクリプト互換性修正
7
+ - [x] 1-a. run_loop.py を公式版ベースに再構築(holdout float化、並列バッチ評価、blinded_history、ブラウザ自動起動、results-dir)
8
+ - [x] 1-b. improve_description.py のblinded_history対応(test_results引数削除)
9
+ - [x] 1-c. aggregate_benchmark.py を公式版に差し替え(旧版→compare_runs.py)
10
+
11
+ ## Phase 2: SKILL.md内容補完
12
+ - [x] 2-a. Phase 1連動のコマンド例更新(holdout 0.4、improve-model、results-dir記載)
13
+ - [x] 2-b. 公式版の重要な詳細を追記(#5 grading.jsonフィールド警告, #6 eval query Good/Bad例, #7 タイミング即時処理, #8 コアループ再掲+TodoList, #9 Claude.ai制限拡充, #12 feedback.jsonスキーマ, #13 Coworkアクセス注記)
14
+ - [x] 2-c. compare_runs.py の説明追加
15
+
16
+ ## Phase 3: UX改善
17
+ - [x] generate_report.py のstdin対応追加(位置引数、-o省略可、stdoutデフォルト)
18
+ - [x] 回帰テスト(init_skill.py, quick_validate.py構文チェック・import確認)
@@ -0,0 +1,23 @@
1
+ # TODO: Skill命名規則の文書化 + 配布制御のプレフィックスベース化
2
+
3
+ ## 進捗
4
+
5
+ | # | タスク | 担当 | 状態 |
6
+ |---|--------|------|------|
7
+ | 1 | einja-skill-creator/SKILL.md に命名規則セクション追加 | Agent-1 | ✅ |
8
+ | 2 | CLAUDE.md 更新(命名規則追加 + L139参照パス + L252注釈更新) | Agent-2 | ✅ |
9
+ | 3 | Skill name フィールド統一 + ディレクトリリネーム + 参照パス更新 | Agent-3 | ✅ |
10
+ | 4 | copy-presets.mjs + file-copier.ts のプレフィックスベース改修 | Agent-4 | ✅ |
11
+ | 5 | ビルド検証(`pnpm --filter @einja/dev-cli build`) | 親 | ✅ |
12
+ | 6 | 全体検証(`pnpm prepush`) | 親 | ✅ |
13
+ | + | 既存バグ修正: setup-flow.md マーカーバリデーションエラー | 親 | ✅ |
14
+ | 7 | Codexレビュー | codex-agent | ⏳ |
15
+
16
+ ## 検証結果
17
+
18
+ - ビルド成功(`pnpm --filter @einja/dev-cli build`)
19
+ - `presets/default/.claude/skills/` に `_einja-*` 4個 + `einja-*` 15個が配布 ✅
20
+ - `cli-package-specs` は配布されていない ✅
21
+ - 旧ディレクトリ名の残留なし ✅
22
+ - `pnpm prepush` 全パス(lint + typecheck + test: 7 tasks successful)✅
23
+ - 参照パスの漏れなし ✅
@@ -0,0 +1,60 @@
1
+ # Plan: ensure-serena.sh の既存インスタンス判定を厳密化
2
+
3
+ ## Context
4
+
5
+ `ensure-serena.sh` の既存インスタンスチェック(L11-16)は `.serena-port` に記録されたPIDの生存のみを `kill -0` で確認している。
6
+ しかし以下のケースで **別プロジェクトのSerenaに誤接続** する問題がある:
7
+
8
+ 1. 自プロジェクトのSerenaがクラッシュ(PID死亡)
9
+ 2. 別プロジェクトのSerenaが同じポートを取得
10
+ 3. 次回 `direnv reload` 時、PIDリサイクルで `kill -0` が成功 → 別プロジェクトのSerenaに接続
11
+
12
+ **根本原因**: PID生存だけでは「そのPIDが記録されたポートを実際にLISTENしているか」が判定できない。
13
+
14
+ ## 変更内容
15
+
16
+ ### TODO-1: 既存インスタンスチェックに PID×ポート検証を追加
17
+
18
+ **ファイル**: `scripts/ensure-serena.sh` L11-16
19
+
20
+ **現在のコード**:
21
+ ```bash
22
+ if [ -f "$_SERENA_PORT_FILE" ]; then
23
+ read -r _saved_port _saved_pid < "$_SERENA_PORT_FILE"
24
+ if [ -n "$_saved_pid" ] && kill -0 "$_saved_pid" 2>/dev/null; then
25
+ # PIDが生存 → 自プロジェクトのSerena
26
+ export SERENA_PORT="$_saved_port"
27
+ return 0 2>/dev/null || true
28
+ fi
29
+ # PID死亡 → クリーンアップ
30
+ rm -f "$_SERENA_PORT_FILE"
31
+ fi
32
+ ```
33
+
34
+ **修正後**:
35
+ ```bash
36
+ if [ -f "$_SERENA_PORT_FILE" ]; then
37
+ read -r _saved_port _saved_pid < "$_SERENA_PORT_FILE"
38
+ if [ -n "$_saved_pid" ] && kill -0 "$_saved_pid" 2>/dev/null \
39
+ && ps -ww -o command= -p "$_saved_pid" 2>/dev/null | grep -q "serena start-mcp-server.*--project ${_SERENA_BASE}"; then
40
+ # PIDが生存 かつ 自プロジェクトのSerenaプロセス → 再利用
41
+ export SERENA_PORT="$_saved_port"
42
+ return 0 2>/dev/null || true
43
+ fi
44
+ # PID死亡 or 別プロセス/別プロジェクトのSerena → クリーンアップ
45
+ rm -f "$_SERENA_PORT_FILE"
46
+ fi
47
+ ```
48
+
49
+ **判定ロジック**: `kill -0`(PID生存) AND `ps`(そのPIDのコマンドラインに `serena start-mcp-server` + `--project <自プロジェクトパス>` が含まれる)の両方を満たす場合のみ、自プロジェクトのSerenaと判定する。
50
+
51
+ **`lsof` ではなく `ps` を採用した理由**(Codexレビュー指摘):
52
+ - `lsof` はLinuxで未導入のディストロがある。フォールバックが必要になり複雑化する
53
+ - `ps` はPOSIX標準でmacOS/Linux両方で利用可能
54
+ - `ps` ならプロセス名だけでなく `--project` 引数まで確認でき、「自プロジェクトのSerenaか」を厳密に判定できる
55
+
56
+ ## 検証
57
+
58
+ 1. `source scripts/ensure-serena.sh` で正常起動を確認
59
+ 2. 再度 `source` して既存インスタンスが再利用されることを確認
60
+ 3. `.serena-port` のPIDを偽の値に書き換え → 再起動が走ることを確認
@@ -0,0 +1,28 @@
1
+ # Plan: einja-project-overview SKILL.md の参照先再定義
2
+
3
+ ## Context
4
+
5
+ 「プロジェクト概要」Skillが関心事の異なるドキュメント(コーディング規約、インフラ管理Skill等)を参照していた。「このプロジェクトは何か?どういう構造か?」に答えるハブとして、適切な参照先のみに絞る。
6
+
7
+ ## 変更内容
8
+
9
+ **対象ファイル**: `.claude/skills/einja-project-overview/SKILL.md`
10
+
11
+ ### 参照すべきドキュメント(3つ)
12
+
13
+ | 参照 | 目的 |
14
+ |------|------|
15
+ | `docs/einja/steering/README.md` | 全ドキュメントへのナビゲーションハブ |
16
+ | `docs/einja/steering/product.md` | 何のためのプロジェクトか(製品ビジョン) |
17
+ | `docs/einja/steering/architecture.md` | どういう技術構成か |
18
+
19
+ ### 除外するもの
20
+
21
+ - `infra-maintenance` Skillリンク → インフラ運用は別の関心事
22
+ - コーディング規約・コンポーネント設計 → 開発ガイドラインの関心事
23
+ - `db-schema-design.md` → スキーマ詳細設計であり概要ではない
24
+ - `backend-architecture.md` → 4層設計の実装詳細
25
+
26
+ ## 検証
27
+
28
+ - SKILL.md の内容を `Read` で確認
@@ -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
+ **推奨アクション**: 上記の🔴必須項目を修正してから実装開始すること。