@einja/dev-cli 0.1.13 → 0.1.15

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.
@@ -1,12 +1,21 @@
1
1
  ---
2
- description: ".claude/commands配下のコマンドを.cursor/commands用に自動変換"
2
+ description: ".claude/commands配下のコマンドを.cursor/rules用に自動変換(Cursor 2.2+対応)"
3
3
  ---
4
4
 
5
- # Cursor コマンド同期ツール
5
+ # Cursor ルール同期ツール(v2)
6
6
 
7
7
  ## あなたの役割
8
8
 
9
- あなたは Claude Code のカスタムコマンドを Cursor 互換形式に自動変換する専門家です。`.claude/commands/` 配下の全コマンドファイルをスキャンし、Cursor で動作する形式に変換して `.cursor/commands/` に保存します。
9
+ あなたは Claude Code のカスタムコマンドを **Cursor 2.2+ 互換のルール形式**に自動変換する専門家です。
10
+
11
+ `.claude/commands/` 配下の全コマンドファイルをスキャンし、Cursor の**新しいルール形式**(`.cursor/rules/{rule-name}/RULE.md`)に変換します。
12
+
13
+ > **⚠️ 重要:Cursor のルール形式変更について**
14
+ >
15
+ > Cursor 2.2 以降、コマンド/ルールの構成が変更されました:
16
+ > - ❌ `.cursor/commands/*.md` → **廃止**(レガシー)
17
+ > - ❌ `.cursor/rules/*.mdc` → **非推奨**(既存は動作するが新規作成は非推奨)
18
+ > - ✅ `.cursor/rules/{rule-name}/RULE.md` → **推奨形式**
10
19
 
11
20
  ## 処理フロー
12
21
 
@@ -14,8 +23,8 @@ description: ".claude/commands配下のコマンドを.cursor/commands用に自
14
23
 
15
24
  **実行手順**:
16
25
  ```bash
17
- # .claude/commands 配下の全 .md ファイルを検索
18
- Glob: .claude/commands/*.md
26
+ # .claude/commands 配下の全 .md ファイルを再帰的に検索
27
+ Glob: .claude/commands/**/*.md
19
28
  ```
20
29
 
21
30
  各ファイルを Read で読み込み、変換対象として処理します。
@@ -23,6 +32,7 @@ Glob: .claude/commands/*.md
23
32
  **除外対象**:
24
33
  以下のファイルは変換対象から除外します:
25
34
  - `sync-cursor-commands.md`(このファイル自体。Claude Code専用機能のため)
35
+ - `sync-cursor-rules.md`(同上)
26
36
 
27
37
  ### 2. 変換処理
28
38
 
@@ -65,18 +75,42 @@ Glob: .claude/commands/*.md
65
75
  - 報告内容は構造化マークダウン(絵文字付き見出し使用)
66
76
  ```
67
77
 
68
- #### 2.2 Cursor 用の注意書きを追加
78
+ #### 2.2 RULE.md フォーマットへの変換
79
+
80
+ **Cursor の新ルール形式**:
81
+
82
+ 各コマンドを以下のフォルダ構造に変換します:
83
+
84
+ ```
85
+ .cursor/rules/
86
+ {command-name}/
87
+ RULE.md
88
+ ```
69
89
 
70
- ファイルの冒頭(YAML フロントマターの直後)に以下のセクションを追加:
90
+ **RULE.md のフロントマター形式**:
71
91
 
72
92
  ```markdown
73
93
  ---
74
- [既存のYAMLフロントマター]
94
+ description: "{元のdescriptionを使用}"
95
+ globs:
96
+ alwaysApply: false
75
97
  ---
98
+ ```
99
+
100
+ - `description`: 元のコマンドの description をそのまま使用
101
+ - `globs`: 空のまま(手動呼び出し用 = `@{command-name}` で呼び出し)
102
+ - `alwaysApply: false`: 手動呼び出し専用(Apply Manually タイプ)
103
+
104
+ **注意**: `allowed-tools` は Cursor では使用しないため削除
105
+
106
+ #### 2.3 Cursor 用の注意書きを追加
76
107
 
77
- > **⚠️ Cursor での動作について**
108
+ ルール本文の冒頭(フロントマター直後)に以下のセクションを追加:
109
+
110
+ ```markdown
111
+ > **⚠️ Cursor での実行について**
78
112
  >
79
- > このコマンドは `.claude/agents/` 配下のサブエージェント定義ファイルを参照します。
113
+ > このルールは `.claude/agents/` 配下のサブエージェント定義ファイルを参照します。
80
114
  > サブエージェント呼び出し箇所では、該当する `.md` ファイルを Read で読み込み、
81
115
  > そのプロンプト内容に従って処理を実行してください。
82
116
  >
@@ -85,61 +119,74 @@ Glob: .claude/commands/*.md
85
119
  > 2. YAML フロントマターを除外し、本文プロンプトを取得
86
120
  > 3. プロンプトの指示に従って処理を実行
87
121
  > 4. プロンプト内の「出力形式」に従った報告を生成
122
+ >
123
+ > **使い方**: チャットで `@{rule-name}` を入力して呼び出してください
88
124
 
89
125
  [既存のコマンド内容]
90
126
  ```
91
127
 
92
128
  ### 3. ファイルの出力
93
129
 
94
- 変換後のファイルを `.cursor/commands/` に Write します:
130
+ 変換後のファイルを `.cursor/rules/{command-name}/RULE.md` に Write します:
95
131
 
96
132
  ```bash
97
- #
98
- .claude/commands/task-exec.md → .cursor/commands/task-exec.md
99
- .claude/commands/spec-create.md → .cursor/commands/spec-create.md
133
+ # 例(フォルダ形式)
134
+ .claude/commands/task-exec.md → .cursor/rules/task-exec/RULE.md
135
+ .claude/commands/spec-create.md → .cursor/rules/spec-create/RULE.md
136
+ .claude/commands/einja/start-dev.md → .cursor/rules/start-dev/RULE.md
100
137
  ```
101
138
 
102
- ### 4. 変更サマリーの表示
139
+ **ディレクトリ作成**:
140
+ 出力前に対象ディレクトリが存在しない場合は作成してください。
141
+
142
+ ### 4. レガシーファイルのクリーンアップ(オプション)
143
+
144
+ 古い形式のファイルが存在する場合、削除を提案します:
145
+
146
+ ```bash
147
+ # 削除対象(ユーザーに確認後)
148
+ .cursor/commands/*.md # 旧コマンド形式
149
+ ```
150
+
151
+ ### 5. 変更サマリーの表示
103
152
 
104
153
  処理完了後、以下の形式で報告を出力してください:
105
154
 
106
155
  ```markdown
107
- ## 🎉 Cursor コマンド同期完了
156
+ ## 🎉 Cursor ルール同期完了(v2 形式)
108
157
 
109
158
  ### 処理サマリー
110
159
  - **変換元ディレクトリ**: `.claude/commands/`
111
- - **変換先ディレクトリ**: `.cursor/commands/`
160
+ - **変換先ディレクトリ**: `.cursor/rules/` (フォルダ形式)
112
161
  - **処理ファイル数**: N個
113
162
 
114
- ### 変換済みファイル一覧
115
- 1. spec-create.md
116
- - サブエージェント参照: 3箇所変換
117
-
118
- 2. task-exec.md
119
- - サブエージェント参照: 4箇所変換
120
-
121
- 3. ✅ start-dev.md
122
- - 変換不要(サブエージェント参照なし)
123
-
124
- 4. ✅ update-docs-by-task-specs.md
125
- - 変換不要(サブエージェント参照なし)
163
+ ### 変換済みルール一覧
164
+ | ルール名 | 出力先 | サブエージェント参照 |
165
+ |---------|--------|-------------------|
166
+ | spec-create | `.cursor/rules/spec-create/RULE.md` | 3箇所変換 |
167
+ | task-exec | `.cursor/rules/task-exec/RULE.md` | 4箇所変換 |
168
+ | start-dev | `.cursor/rules/start-dev/RULE.md` | なし |
126
169
 
127
170
  ### 除外されたファイル
128
171
  - ⏭️ sync-cursor-commands.md(Claude Code専用機能のため除外)
129
172
 
130
- ### 次のステップ
131
- Cursor で以下のコマンドが利用可能になりました:
132
- - `/spec-create`
133
- - `/task-exec`
134
- - `/start-dev`
135
- - `/update-docs-by-task-specs`
173
+ ### 使い方
174
+ Cursor で以下のルールが利用可能になりました:
175
+ - チャットで `@spec-create` と入力して呼び出し
176
+ - チャットで `@task-exec` と入力して呼び出し
177
+ - チャットで `@start-dev` と入力して呼び出し
178
+
179
+ ### レガシーファイル
180
+ 以下の古い形式のファイルが検出されました(削除推奨):
181
+ - `.cursor/commands/task-exec.md`
182
+ - `.cursor/commands/spec-create.md`
136
183
  ```
137
184
 
138
185
 
139
186
  ## 変換時の注意事項
140
187
 
141
188
  ### 保持すべき内容
142
- - YAML フロントマター(description など)
189
+ - YAML フロントマター(description
143
190
  - コマンドの基本的なロジックと手順
144
191
  - ユーザー向けの説明文
145
192
  - 実行例とサンプルコード
@@ -148,24 +195,28 @@ Cursor で以下のコマンドが利用可能になりました:
148
195
  - `Task` ツール呼び出し → サブエージェントファイル読み込み形式
149
196
  - サブエージェント参照の説明
150
197
  - Cursor 固有の注意書き追加
198
+ - フロントマター形式(`alwaysApply`, `globs` を追加)
151
199
 
152
200
  ### 削除すべき内容
153
201
  - Claude Code 固有のツール説明(Task ツールの使い方など)
202
+ - `allowed-tools` ヘッダー(Cursor では使用しない)
154
203
  - サブエージェント実行の内部実装詳細
155
204
 
156
205
 
157
206
  ## 使用例
158
207
 
159
208
  ```bash
160
- # コマンド実行
209
+ # コマンド実行(Claude Code から)
161
210
  /sync-cursor-commands
162
211
 
163
212
  # 実行結果
164
- ✅ 4個のコマンドファイルを変換しました
165
- - spec-create.md: 3箇所のサブエージェント参照を変換
166
- - task-exec.md: 4箇所のサブエージェント参照を変換
167
- - start-dev.md: 変換不要
168
- - update-docs-by-task-specs.md: 変換不要
213
+ ✅ 4個のルールを .cursor/rules/ に変換しました
214
+
215
+ 変換結果:
216
+ ├── .cursor/rules/spec-create/RULE.md (3箇所のサブエージェント参照を変換)
217
+ ├── .cursor/rules/task-exec/RULE.md (4箇所のサブエージェント参照を変換)
218
+ ├── .cursor/rules/start-dev/RULE.md (変換不要)
219
+ └── .cursor/rules/update-docs-by-task-specs/RULE.md (変換不要)
169
220
  ```
170
221
 
171
222
  ## エラー処理
@@ -181,9 +232,32 @@ Cursor で以下のコマンドが利用可能になりました:
181
232
  - 警告を表示し、該当箇所をスキップ
182
233
 
183
234
  3. **書き込み権限エラー**
184
- - `.cursor/commands/` ディレクトリが書き込み不可の場合
235
+ - `.cursor/rules/` ディレクトリが書き込み不可の場合
185
236
  - エラーメッセージを表示して終了
186
237
 
238
+ ## Cursor ルールのベストプラクティス
239
+
240
+ 以下は Cursor 公式ドキュメントから抽出したベストプラクティスです:
241
+
242
+ ### ルール設計の原則
243
+ - ✅ **500行以内**に収める
244
+ - ✅ 大きなルールは**複数の組み合わせ可能なルール**に分割
245
+ - ✅ **具体的な例や参照ファイル**を提示する
246
+ - ✅ **曖昧な指示を避け**、社内ドキュメントのように明確に記述
247
+ - ✅ 同じプロンプトを繰り返す場合は**ルールとして再利用**
248
+
249
+ ### ルールタイプの選択
250
+ | タイプ | 用途 | 設定 |
251
+ |--------|------|------|
252
+ | Always Apply | 全チャットに適用 | `alwaysApply: true`, `globs:` なし |
253
+ | Apply Intelligently | 自動判断で適用 | `alwaysApply: false`, `description` 必須 |
254
+ | Apply to Specific Files | 特定ファイルに適用 | `globs: ["**/*.ts"]` |
255
+ | Apply Manually | 手動呼び出し専用 | `alwaysApply: false`, `globs:` 空 |
256
+
257
+ ### コマンドからの変換推奨設定
258
+ - **Apply Manually**(手動呼び出し)を使用
259
+ - `@{rule-name}` でチャットから呼び出し
260
+
187
261
  ## 拡張性
188
262
 
189
263
  ### 新しいサブエージェントの追加
@@ -201,3 +275,4 @@ Cursor で以下のコマンドが利用可能になりました:
201
275
  - 変換テンプレートの形式
202
276
  - 注意書きの内容
203
277
  - エラーハンドリングの詳細度
278
+ - ルールタイプ(`alwaysApply` / `globs`)の設定
@@ -89,15 +89,15 @@ const app = new Hono()
89
89
 
90
90
  ### basePathとHono Clientの関係
91
91
 
92
- `basePath("/api")` を使用する場合、クライアント側も `api` を含めてアクセスする。
92
+ `basePath("/api/rpc")` を使用する場合、クライアント側も `api.rpc` を含めてアクセスする。
93
93
 
94
94
  ```typescript
95
- // サーバー: basePath("/api") を設定
96
- const app = new Hono().basePath("/api").route("/posts", postRoutes)
95
+ // サーバー: basePath("/api/rpc") を設定
96
+ const app = new Hono().basePath("/api/rpc").route("/users", userRoutes)
97
97
 
98
- // クライアント: api を含める
99
- apiClient.api.posts.$get() // ✅ OK
100
- apiClient.posts.$get() // ❌ NG(型エラー)
98
+ // クライアント: api.rpc を含める
99
+ apiClient.api.rpc.users.$get() // ✅ OK
100
+ apiClient.users.$get() // ❌ NG(型エラー)
101
101
  ```
102
102
 
103
103
  **使用例**:
@@ -544,6 +544,52 @@ export function PostCreateForm() {
544
544
  - セクション5: Tanstack Query
545
545
  - セクション6: React Hook Form
546
546
 
547
+ #### スキーマ配置の設計方針
548
+
549
+ スキーマはリクエスト/レスポンスで配置場所を分離します。
550
+
551
+ | スキーマ種別 | 配置場所 | 用途 |
552
+ |-------------|---------|------|
553
+ | **リクエストスキーマ** | `@repo/server-core/domain/validators/` | APIリクエストのバリデーション(バックエンド) |
554
+ | **レスポンススキーマ** | `apps/*/src/shared/schemas/` | APIレスポンスの型検証(フロントエンド固有) |
555
+
556
+ **理由**:
557
+ - レスポンス形式はフロントエンドが消費するものなので、フロントエンド側で定義すべき
558
+ - apps間で異なるレスポンス形式を持つ可能性がある(webとadminで異なるレスポンス)
559
+ - フロント固有のバリデーションルール(例: 日付フォーマット)を追加しやすい
560
+
561
+ #### parseResponseパターン
562
+
563
+ Hono Client + Tanstack Queryでは、`parseResponse`関数を使用してレスポンスをパースし、Zodスキーマで型検証を行います。
564
+
565
+ ```typescript
566
+ // カスタムフック例
567
+ import { useQuery } from "@tanstack/react-query";
568
+ import { parseResponse } from "@/lib/api/parse-response";
569
+ import { paginatedPostListSchema } from "@/shared/schemas/post";
570
+ import { apiClient } from "@/lib/api/client";
571
+
572
+ export function usePostList(page: number, limit: number) {
573
+ return useQuery({
574
+ queryKey: ["posts", page, limit],
575
+ queryFn: async () => {
576
+ const response = await apiClient.api.rpc.posts.$get({
577
+ query: { page: String(page), limit: String(limit) },
578
+ });
579
+ return parseResponse(response, paginatedPostListSchema);
580
+ },
581
+ });
582
+ }
583
+ ```
584
+
585
+ **メリット**:
586
+ - レスポンス形式の型安全性を保証
587
+ - フロント固有のバリデーションルールを適用可能
588
+ - エラーハンドリングの一元化(`ApiError`クラス)
589
+ - APIエラーとバリデーションエラーの明確な区別
590
+
591
+ 詳細は **[フロントエンド開発ガイド セクション3](frontend-development.md#apiレスポンスパース処理)** を参照してください。
592
+
547
593
  ### 推奨パターン早見表
548
594
 
549
595
  | ユースケース | 推奨パターン |
@@ -746,21 +792,21 @@ export default app
746
792
  **エントリーポイント**:
747
793
 
748
794
  ```typescript
749
- // apps/web/app/api/[[...route]]/route.ts
795
+ // apps/web/src/app/api/rpc/[[...route]]/route.ts
750
796
  import { Hono } from 'hono'
751
797
  import { handle } from 'hono/vercel'
752
- import postRoutes from '@/server/routes/postRoutes'
798
+ import { userRoutes } from '@web/server/presentation/routes/userRoutes'
753
799
 
754
- const app = new Hono().basePath('/api')
800
+ const app = new Hono().basePath('/api/rpc')
755
801
 
756
- app.route('/', postRoutes)
802
+ const routes = app.route('/users', userRoutes)
757
803
 
758
804
  export const GET = handle(app)
759
805
  export const POST = handle(app)
760
806
  export const PUT = handle(app)
761
807
  export const DELETE = handle(app)
762
808
 
763
- export type AppType = typeof app
809
+ export type AppType = typeof routes
764
810
  ```
765
811
 
766
812
  **フロントエンドでの使用**: