@einja/dev-cli 0.1.40 → 0.1.44

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 (207) hide show
  1. package/README.md +89 -1
  2. package/dist/cli.js +1 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +71 -1
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/list.js.map +1 -1
  8. package/dist/commands/sync.d.ts.map +1 -1
  9. package/dist/commands/sync.js +187 -13
  10. package/dist/commands/sync.js.map +1 -1
  11. package/dist/commands/task-loop/lib/github-client.test.js.map +1 -1
  12. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js +2 -2
  13. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js.map +1 -1
  14. package/dist/lib/dependency-checker.d.ts.map +1 -1
  15. package/dist/lib/merger.d.ts +12 -0
  16. package/dist/lib/merger.d.ts.map +1 -1
  17. package/dist/lib/merger.js +28 -0
  18. package/dist/lib/merger.js.map +1 -1
  19. package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -1
  20. package/dist/lib/preset-update/file-copier.d.ts.map +1 -1
  21. package/dist/lib/preset-update/file-copier.js +3 -3
  22. package/dist/lib/preset-update/file-copier.js.map +1 -1
  23. package/dist/lib/preset-update/preset-finder.d.ts.map +1 -1
  24. package/dist/lib/preset.d.ts.map +1 -1
  25. package/dist/lib/sync/category-validator.d.ts +1 -1
  26. package/dist/lib/sync/category-validator.d.ts.map +1 -1
  27. package/dist/lib/sync/category-validator.js +2 -1
  28. package/dist/lib/sync/category-validator.js.map +1 -1
  29. package/dist/lib/sync/category-validator.test.js +3 -1
  30. package/dist/lib/sync/category-validator.test.js.map +1 -1
  31. package/dist/lib/sync/conflict-reporter.d.ts.map +1 -1
  32. package/dist/lib/sync/diff-engine.d.ts.map +1 -1
  33. package/dist/lib/sync/file-filter.d.ts.map +1 -1
  34. package/dist/lib/sync/file-filter.js +1 -0
  35. package/dist/lib/sync/file-filter.js.map +1 -1
  36. package/dist/lib/sync/integration.test.js +255 -69
  37. package/dist/lib/sync/integration.test.js.map +1 -1
  38. package/dist/lib/sync/json-processor.d.ts +4 -4
  39. package/dist/lib/sync/json-processor.d.ts.map +1 -1
  40. package/dist/lib/sync/json-processor.js +11 -11
  41. package/dist/lib/sync/json-processor.js.map +1 -1
  42. package/dist/lib/sync/marker-processor.d.ts +60 -8
  43. package/dist/lib/sync/marker-processor.d.ts.map +1 -1
  44. package/dist/lib/sync/marker-processor.js +117 -26
  45. package/dist/lib/sync/marker-processor.js.map +1 -1
  46. package/dist/lib/sync/marker-processor.test.js +261 -40
  47. package/dist/lib/sync/marker-processor.test.js.map +1 -1
  48. package/dist/lib/sync/metadata-manager.d.ts +4 -0
  49. package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
  50. package/dist/lib/sync/metadata-manager.js +15 -0
  51. package/dist/lib/sync/metadata-manager.js.map +1 -1
  52. package/dist/lib/sync/metadata-manager.test.js +69 -0
  53. package/dist/lib/sync/metadata-manager.test.js.map +1 -1
  54. package/dist/lib/sync/orphan-cleaner.d.ts +29 -0
  55. package/dist/lib/sync/orphan-cleaner.d.ts.map +1 -0
  56. package/dist/lib/sync/orphan-cleaner.js +80 -0
  57. package/dist/lib/sync/orphan-cleaner.js.map +1 -0
  58. package/dist/lib/sync/orphan-cleaner.test.d.ts +2 -0
  59. package/dist/lib/sync/orphan-cleaner.test.d.ts.map +1 -0
  60. package/dist/lib/sync/orphan-cleaner.test.js +169 -0
  61. package/dist/lib/sync/orphan-cleaner.test.js.map +1 -0
  62. package/dist/lib/sync/project-private-synchronizer.d.ts +52 -0
  63. package/dist/lib/sync/project-private-synchronizer.d.ts.map +1 -0
  64. package/dist/lib/sync/project-private-synchronizer.js +110 -0
  65. package/dist/lib/sync/project-private-synchronizer.js.map +1 -0
  66. package/dist/lib/sync/project-private-synchronizer.test.d.ts +2 -0
  67. package/dist/lib/sync/project-private-synchronizer.test.d.ts.map +1 -0
  68. package/dist/lib/sync/project-private-synchronizer.test.js +348 -0
  69. package/dist/lib/sync/project-private-synchronizer.test.js.map +1 -0
  70. package/dist/types/index.d.ts +1 -0
  71. package/dist/types/index.d.ts.map +1 -1
  72. package/dist/types/sync.d.ts +36 -6
  73. package/dist/types/sync.d.ts.map +1 -1
  74. package/dist/types/sync.js +2 -2
  75. package/dist/types/sync.js.map +1 -1
  76. package/package.json +5 -4
  77. package/presets/default/.claude/agents/einja/Explore.md +140 -0
  78. package/presets/default/.claude/agents/einja/backend-architect.md +21 -1
  79. package/presets/default/.claude/agents/einja/codex-agent.md +5 -1
  80. package/presets/default/.claude/agents/einja/design-engineer.md +5 -1
  81. package/presets/default/.claude/agents/einja/docs/docs-updater.md +7 -93
  82. package/presets/default/.claude/agents/einja/frontend-architect.md +21 -1
  83. package/presets/default/.claude/agents/einja/frontend-coder.md +5 -1
  84. package/presets/default/.claude/agents/einja/{specs/spec-design-generator.md → issue-specs/design-generator.md} +16 -8
  85. package/presets/default/.claude/agents/einja/{specs/spec-qa-generator.md → issue-specs/qa-generator.md} +10 -4
  86. package/presets/default/.claude/agents/einja/{specs/spec-requirements-generator.md → issue-specs/requirements-generator.md} +9 -6
  87. package/presets/default/.claude/agents/einja/{specs/spec-tasks-generator.md → issue-specs/tasks-generator.md} +19 -16
  88. package/presets/default/.claude/agents/einja/{specs/spec-tasks-validator.md → issue-specs/tasks-validator.md} +13 -9
  89. package/presets/default/.claude/agents/einja/issue-specs/ui-design-generator.md +114 -0
  90. package/presets/default/.claude/agents/einja/task/task-executer.md +64 -116
  91. package/presets/default/.claude/agents/einja/task/task-modification-analyzer.md +6 -2
  92. package/presets/default/.claude/agents/einja/task/task-qa.md +7 -3
  93. package/presets/default/.claude/agents/einja/task/task-reviewer.md +17 -1
  94. package/presets/default/.claude/commands/einja/einja-sync.md +124 -45
  95. package/presets/default/.claude/commands/einja/frontend-implement.md +3 -1
  96. package/presets/default/.claude/commands/einja/issue-exec.md +413 -0
  97. package/presets/default/.claude/commands/einja/start-dev.md +4 -0
  98. package/presets/default/.claude/commands/einja/sync-cursor-commands.md +10 -6
  99. package/presets/default/.claude/commands/einja/{update-docs-by-task-specs.md → update-docs-by-issue-specs.md} +61 -57
  100. package/presets/default/.claude/hooks/einja/plan-mode-skill-loader.sh +27 -0
  101. package/presets/default/.claude/settings.json +29 -5
  102. package/presets/default/.claude/skills/{einja-general-context-loader → _einja-general-context-loader}/SKILL.md +6 -2
  103. package/presets/default/.claude/skills/{einja-output-format → _einja-output-format}/SKILL.md +5 -1
  104. package/presets/default/.claude/skills/_einja-project-overview/SKILL.md +29 -0
  105. package/presets/default/.claude/skills/{einja-spec-context-loader → _einja-spec-context-loader}/SKILL.md +9 -5
  106. package/presets/default/.claude/skills/einja-coding-standards/references/testing-strategy.md +899 -0
  107. package/presets/default/.claude/skills/einja-conflict-resolver/SKILL.md +5 -1
  108. package/presets/default/.claude/skills/einja-create-pr/SKILL.md +138 -0
  109. package/presets/default/.claude/skills/einja-infra-maintenance/SKILL.md +779 -0
  110. package/presets/default/.claude/{commands/einja/spec-create.md → skills/einja-issue-spec-create/SKILL.md} +60 -23
  111. package/presets/default/.claude/skills/einja-issue-spec-generator/SKILL.md +105 -0
  112. package/presets/default/.claude/skills/einja-issue-spec-generator/references/format-rules.md +35 -0
  113. package/presets/default/.claude/skills/einja-issue-spec-validator/SKILL.md +130 -0
  114. package/presets/default/.claude/skills/einja-issue-spec-validator/references/validation-rules.md +52 -0
  115. package/presets/default/.claude/skills/einja-npm-release/SKILL.md +242 -0
  116. package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +311 -263
  117. package/presets/default/.claude/skills/einja-skill-creator/agents/analyzer.md +274 -0
  118. package/presets/default/.claude/skills/einja-skill-creator/agents/comparator.md +202 -0
  119. package/presets/default/.claude/skills/einja-skill-creator/agents/grader.md +195 -0
  120. package/presets/default/.claude/skills/einja-skill-creator/assets/eval_review.html +146 -0
  121. package/presets/default/.claude/skills/einja-skill-creator/eval-viewer/generate_review.py +471 -0
  122. package/presets/default/.claude/skills/einja-skill-creator/eval-viewer/viewer.html +1325 -0
  123. package/presets/default/.claude/skills/einja-skill-creator/references/schemas.md +430 -0
  124. package/presets/default/.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py +401 -0
  125. package/presets/default/.claude/skills/einja-skill-creator/scripts/compare_runs.py +154 -0
  126. package/presets/default/.claude/skills/einja-skill-creator/scripts/generate_report.py +272 -0
  127. package/presets/default/.claude/skills/einja-skill-creator/scripts/improve_description.py +247 -0
  128. package/presets/default/.claude/skills/einja-skill-creator/scripts/init_skill.py +13 -19
  129. package/presets/default/.claude/skills/einja-skill-creator/scripts/package_skill.py +36 -7
  130. package/presets/default/.claude/skills/einja-skill-creator/scripts/run_eval.py +310 -0
  131. package/presets/default/.claude/skills/einja-skill-creator/scripts/run_loop.py +375 -0
  132. package/presets/default/.claude/skills/einja-skill-creator/scripts/utils.py +48 -0
  133. package/presets/default/.claude/skills/einja-skill-first/SKILL.md +265 -0
  134. package/presets/default/.claude/skills/einja-subagent-question-protocol/SKILL.md +98 -0
  135. package/presets/default/.claude/skills/einja-task-commit/SKILL.md +11 -7
  136. package/presets/default/.claude/{commands/einja/task-exec.md → skills/einja-task-exec/SKILL.md} +106 -89
  137. package/presets/default/.claude/skills/einja-task-qa/SKILL.md +8 -4
  138. package/presets/default/.claude/skills/einja-task-qa/references/troubleshooting.md +1 -1
  139. package/presets/default/.claude/skills/einja-task-qa/references/usage-patterns.md +2 -2
  140. package/presets/default/.claude/skills/einja-team-exec/SKILL.md +165 -0
  141. package/presets/default/.envrc +5 -0
  142. package/presets/default/.mcp.json +2 -12
  143. package/presets/default/CLAUDE.md.template +45 -8
  144. package/presets/default/docs/einja/example/specs/issues/issue999-example-task/tasks.md +1 -1
  145. package/presets/default/docs/einja/instructions/deployment-setup.md +4 -9
  146. package/presets/default/docs/einja/instructions/environment-setup.md +3 -8
  147. package/presets/default/docs/einja/instructions/issue-exec-workflow.md +276 -0
  148. package/presets/default/docs/einja/instructions/local-server-environment-and-worktree.md +71 -9
  149. package/presets/default/docs/einja/instructions/neon-cli-reference.md +3 -8
  150. package/presets/default/docs/einja/instructions/setup-flow.md +279 -0
  151. package/presets/default/docs/einja/instructions/task-execute.md +63 -68
  152. package/presets/default/docs/einja/instructions/vercel-cli-reference.md +17 -10
  153. package/presets/default/docs/einja/steering/README.md +11 -11
  154. package/presets/default/docs/einja/steering/acceptance-criteria-and-qa-guide.md +4 -9
  155. package/presets/default/docs/einja/steering/architecture.md +3 -8
  156. package/presets/default/docs/einja/steering/branch-strategy.md +63 -70
  157. package/presets/default/docs/einja/steering/commit-rules.md +3 -8
  158. package/presets/default/docs/einja/steering/db-schema-design.md +3 -8
  159. package/presets/default/docs/einja/steering/development/api-development.md +3 -8
  160. package/presets/default/docs/einja/steering/development/backend-architecture.md +3 -8
  161. package/presets/default/docs/einja/steering/development/coding-standards.md +723 -0
  162. package/presets/default/docs/einja/steering/development/component-design.md +502 -0
  163. package/presets/default/docs/einja/steering/development/database-guidelines.md +2 -2
  164. package/presets/default/docs/einja/steering/development/frontend-development.md +3 -8
  165. package/presets/default/docs/einja/steering/development/playwright-guidelines.md +59 -0
  166. package/presets/default/docs/einja/steering/development/review-guidelines.md +3 -8
  167. package/presets/default/docs/einja/steering/development/testing-strategy.md +3 -8
  168. package/presets/default/docs/einja/steering/development-workflow.md +155 -140
  169. package/presets/default/docs/einja/steering/infrastructure/deployment.md +156 -55
  170. package/presets/default/docs/einja/steering/infrastructure/environment-variables.md +4 -8
  171. package/presets/default/docs/einja/steering/product.md +3 -8
  172. package/presets/default/docs/einja/steering/task-management.md +22 -110
  173. package/presets/default/scripts/ensure-serena.sh +75 -0
  174. package/presets/default/scripts/env-rotate-secrets.ts +396 -0
  175. package/presets/default/scripts/env-show.ts +130 -0
  176. package/presets/default/scripts/env.ts +479 -0
  177. package/presets/default/scripts/init-github.ts +363 -0
  178. package/presets/default/scripts/init.sh +98 -0
  179. package/presets/default/scripts/lib/env-common.ts +108 -0
  180. package/presets/default/scripts/lib/worktree-config.ts +64 -0
  181. package/presets/default/scripts/setup-dev.ts +655 -0
  182. package/presets/default/scripts/stop-serena.sh +25 -0
  183. package/presets/default/scripts/worktree/dev.ts +872 -0
  184. package/dist/lib/sync/seed-synchronizer.d.ts +0 -27
  185. package/dist/lib/sync/seed-synchronizer.d.ts.map +0 -1
  186. package/dist/lib/sync/seed-synchronizer.js +0 -72
  187. package/dist/lib/sync/seed-synchronizer.js.map +0 -1
  188. package/dist/lib/sync/seed-synchronizer.test.d.ts +0 -2
  189. package/dist/lib/sync/seed-synchronizer.test.d.ts.map +0 -1
  190. package/dist/lib/sync/seed-synchronizer.test.js +0 -147
  191. package/dist/lib/sync/seed-synchronizer.test.js.map +0 -1
  192. package/presets/default/.claude/agents/einja/git/conflict-resolver.md +0 -148
  193. package/presets/default/.claude/hooks/einja/validate-git-commit.sh +0 -239
  194. package/presets/default/.claude/skills/einja-api-development/SKILL.md +0 -14
  195. package/presets/default/.claude/skills/einja-backend-architecture/SKILL.md +0 -18
  196. package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +0 -132
  197. package/presets/default/.claude/skills/einja-coding-standards/references/import-conventions.md +0 -69
  198. package/presets/default/.claude/skills/einja-coding-standards/references/naming-conventions.md +0 -107
  199. package/presets/default/.claude/skills/einja-coding-standards/references/prohibited-patterns.md +0 -169
  200. package/presets/default/.claude/skills/einja-coding-standards/references/typescript-rules.md +0 -247
  201. package/presets/default/.claude/skills/einja-component-design/SKILL.md +0 -109
  202. package/presets/default/.claude/skills/einja-component-design/references/directory-structure.md +0 -117
  203. package/presets/default/.claude/skills/einja-component-design/references/props-patterns.md +0 -159
  204. package/presets/default/.claude/skills/einja-component-design/references/styling-guide.md +0 -122
  205. package/presets/default/.claude/skills/einja-frontend-development/SKILL.md +0 -14
  206. package/presets/default/.claude/skills/einja-project-overview/SKILL.md +0 -35
  207. package/presets/default/docs/einja/instructions/task-vibe-kanban-loop.md +0 -565
@@ -1,247 +0,0 @@
1
- # TypeScript 規約
2
-
3
- ## 型安全性
4
-
5
- ### ❌ any型の使用禁止
6
-
7
- ```typescript
8
- // ❌ 禁止
9
- function processData(data: any) {
10
- return data.someProperty;
11
- }
12
-
13
- const user: any = getUser();
14
-
15
- // ✅ 推奨
16
- interface User {
17
- id: string;
18
- name: string;
19
- email: string;
20
- }
21
-
22
- function processData(data: User) {
23
- return data.name;
24
- }
25
-
26
- const user: User = getUser();
27
- ```
28
-
29
- **any型が絶対に禁止される理由:**
30
- - TypeScriptの型チェック機能を無効化
31
- - ランタイムエラーの原因となる
32
- - IDEの自動補完・リファクタリング機能が働かない
33
- - コードの可読性・保守性が著しく低下
34
-
35
- ### 型定義のベストプラクティス
36
-
37
- ```typescript
38
- // ✅ 明確な型定義
39
- interface ApiResponse<T> {
40
- data: T;
41
- status: 'success' | 'error';
42
- message?: string;
43
- }
44
-
45
- // ✅ Union型の活用
46
- type ButtonVariant = 'primary' | 'secondary' | 'danger';
47
-
48
- // ✅ Generic型の活用
49
- function createApiCall<T>(endpoint: string): Promise<ApiResponse<T>> {
50
- // 実装
51
- }
52
-
53
- // ✅ 型ガードの使用
54
- function isUser(obj: unknown): obj is User {
55
- return (
56
- typeof obj === 'object' &&
57
- obj !== null &&
58
- typeof (obj as User).id === 'string'
59
- );
60
- }
61
- ```
62
-
63
- ### unknown型の活用
64
-
65
- ```typescript
66
- // ✅ anyの代わりにunknownを使用
67
- function parseJson(json: string): unknown {
68
- return JSON.parse(json);
69
- }
70
-
71
- // ✅ 型ガードと組み合わせて安全に使用
72
- const data = parseJson(jsonString);
73
- if (isUser(data)) {
74
- console.log(data.name); // 型安全
75
- }
76
- ```
77
-
78
- ## 厳格な型チェック設定
79
-
80
- `tsconfig.json`で以下の設定を必須とする:
81
-
82
- ```json
83
- {
84
- "compilerOptions": {
85
- "strict": true,
86
- "noImplicitAny": true,
87
- "noImplicitReturns": true,
88
- "noImplicitThis": true,
89
- "noUnusedLocals": true,
90
- "noUnusedParameters": true
91
- }
92
- }
93
- ```
94
-
95
- ## React / Next.js での型安全性
96
-
97
- ### Props型定義
98
-
99
- ```typescript
100
- // ✅ 明確なProps型定義(any型禁止)
101
- interface ComponentProps {
102
- data: UserData; // 具体的な型を指定
103
- onAction: (id: string) => void; // 関数型も明確に
104
- }
105
-
106
- // ❌ any型の使用禁止
107
- interface BadProps {
108
- data: any; // 絶対禁止
109
- callback: any; // 絶対禁止
110
- }
111
- ```
112
-
113
- ## コード構造・パターン
114
-
115
- ### エクスポート規約
116
-
117
- ```typescript
118
- // ✅ 名前付きエクスポート(推奨)
119
- export function Button() { }
120
- export { Button };
121
-
122
- // ✅ デフォルトエクスポート(Pageコンポーネントのみ)
123
- export default function HomePage() { }
124
-
125
- // ❌ 混在は避ける
126
- export function Button() { }
127
- export default Button; // 避ける
128
- ```
129
-
130
- ### 条件分岐
131
-
132
- #### 早期リターン
133
-
134
- ```typescript
135
- // ✅ 早期リターンパターン
136
- function processUser(user: User | null): string {
137
- if (!user) {
138
- return 'User not found';
139
- }
140
-
141
- if (!user.isActive) {
142
- return 'User is inactive';
143
- }
144
-
145
- return `Welcome, ${user.name}!`;
146
- }
147
-
148
- // ❌ ネストの深い条件分岐
149
- function processUser(user: User | null): string {
150
- if (user) {
151
- if (user.isActive) {
152
- return `Welcome, ${user.name}!`;
153
- } else {
154
- return 'User is inactive';
155
- }
156
- } else {
157
- return 'User not found';
158
- }
159
- }
160
- ```
161
-
162
- #### Optional Chaining の活用
163
-
164
- ```typescript
165
- // ✅ Optional Chaining
166
- const userName = user?.profile?.name ?? 'Anonymous';
167
- const hasAdminRole = user?.roles?.includes('admin') ?? false;
168
-
169
- // ✅ Nullish Coalescing
170
- const config = userConfig ?? defaultConfig;
171
- const port = process.env.PORT ?? 3000;
172
- ```
173
-
174
- ## エラーハンドリング
175
-
176
- ### エラー型の定義
177
-
178
- ```typescript
179
- // ✅ カスタムエラークラス
180
- class ApiError extends Error {
181
- constructor(
182
- message: string,
183
- public statusCode: number,
184
- public code: string
185
- ) {
186
- super(message);
187
- this.name = 'ApiError';
188
- }
189
- }
190
-
191
- // ✅ Result型パターン
192
- type Result<T, E = Error> =
193
- | { success: true; data: T }
194
- | { success: false; error: E };
195
-
196
- function safeApiCall<T>(fn: () => Promise<T>): Promise<Result<T>> {
197
- return fn()
198
- .then(data => ({ success: true as const, data }))
199
- .catch(error => ({ success: false as const, error }));
200
- }
201
- ```
202
-
203
- ### エラーハンドリングパターン
204
-
205
- ```typescript
206
- // ✅ try-catch の適切な使用
207
- async function fetchUser(id: string): Promise<User | null> {
208
- try {
209
- const response = await api.get(`/users/${id}`);
210
- return response.data;
211
- } catch (error) {
212
- if (error instanceof ApiError && error.statusCode === 404) {
213
- return null;
214
- }
215
- throw error; // 予期しないエラーは再スロー
216
- }
217
- }
218
-
219
- // ✅ Error Boundary での エラーキャッチ
220
- export function ErrorBoundary({ children }: { children: React.ReactNode }) {
221
- return (
222
- <ErrorBoundaryComponent
223
- fallback={<ErrorFallback />}
224
- onError={(error, errorInfo) => {
225
- console.error('Error caught by boundary:', error, errorInfo);
226
- }}
227
- >
228
- {children}
229
- </ErrorBoundaryComponent>
230
- );
231
- }
232
- ```
233
-
234
- ## テストでの型安全性
235
-
236
- ```typescript
237
- // ✅ テストでもany型禁止
238
- interface MockUser {
239
- id: string;
240
- name: string;
241
- }
242
-
243
- const mockUser: MockUser = { id: '1', name: 'Test User' };
244
-
245
- // ❌ テストでもany型は使用禁止
246
- const badMockData: any = { /* データ */ }; // 禁止
247
- ```
@@ -1,109 +0,0 @@
1
- ---
2
- name: component-design
3
- description: "Reactコンポーネントの設計原則と実装ガイドライン"
4
- ---
5
-
6
- # Component Design Skill
7
-
8
- ## 概要
9
-
10
- このSkillは、プロジェクトにおけるReactコンポーネントの設計原則と実装ガイドラインを提供します。
11
-
12
- ## 基本原則
13
-
14
- ### 1. 単一責任の原則
15
- - 各コンポーネントは単一の機能・責任を持つ
16
- - 複数の機能が必要な場合は、複数のコンポーネントに分割する
17
-
18
- ### 2. 再利用可能性
19
- - プロジェクト全体で再利用可能なコンポーネントを作成する
20
- - プロパティ(props)による柔軟なカスタマイズを可能にする
21
-
22
- ### 3. 型安全性
23
- - TypeScriptの型定義を必須とする
24
- - プロパティ、状態、イベントハンドラーは全て型定義する
25
-
26
- ### 4. Co-location(共存配置)
27
- - 機能固有のコンポーネントは関連するページの近くに配置する
28
- - `_components` ディレクトリを使用してページ固有のコンポーネントを管理する
29
- - 複数のページで共有されるコンポーネントのみ `src/components/` に配置する
30
-
31
- ## 詳細ドキュメント
32
-
33
- 各カテゴリの詳細な規約は以下を参照してください:
34
-
35
- - [ディレクトリ構造](./references/directory-structure.md) - ファイル配置とディレクトリ設計
36
- - [Props設計パターン](./references/props-patterns.md) - Props設計とイベントハンドリング
37
- - [スタイリングガイド](./references/styling-guide.md) - Tailwind CSSを使用したスタイリング規約
38
-
39
- ## クイックリファレンス
40
-
41
- ### ディレクトリ構造
42
-
43
- ```
44
- src/
45
- ├── components/
46
- │ ├── ui/ # 基本的なUIコンポーネント
47
- │ │ ├── Button/
48
- │ │ ├── Input/
49
- │ │ └── ...
50
- │ └── shared/ # 共通コンポーネント(レイアウト含む)
51
- │ ├── Header/
52
- │ ├── Footer/
53
- │ └── ...
54
- └── app/
55
- ├── dashboard/
56
- │ ├── page.tsx
57
- │ └── _components/ # ページ固有のコンポーネント
58
- │ ├── DashboardChart/
59
- │ └── StatsCard/
60
- └── ...
61
- ```
62
-
63
- ### コンポーネント命名規則
64
-
65
- - **ファイル名**: PascalCase(例: `Button.tsx`, `UserProfile.tsx`)
66
- - **例外**: shadcn/uiコンポーネントはkebab-case(例: `button.tsx`)
67
-
68
- ### コンポーネントディレクトリ構造
69
-
70
- ```
71
- ComponentName/
72
- ├── index.tsx # コンポーネント本体
73
- └── variants.ts # cvaバリアント定義(必要に応じて)
74
- ```
75
-
76
- ### 基本的な型定義
77
-
78
- ```typescript
79
- interface ButtonProps {
80
- children: React.ReactNode;
81
- variant?: "primary" | "secondary" | "danger";
82
- size?: "sm" | "md" | "lg";
83
- disabled?: boolean;
84
- onClick?: () => void;
85
- }
86
- ```
87
-
88
- ## チェックリスト
89
-
90
- 新しいコンポーネントを作成する際の確認事項:
91
-
92
- - [ ] 適切なディレクトリに配置されている
93
- - [ ] TypeScript の型定義が完全
94
- - [ ] Tailwind CSS でスタイリングされている
95
- - [ ] プロパティのデフォルト値が設定されている
96
- - [ ] アクセシビリティが考慮されている
97
- - [ ] 単体テストが実装されている
98
-
99
- ## 関連Skill・ドキュメント
100
-
101
- - [coding-standards](../einja-coding-standards/SKILL.md) - コーディング規約
102
- - `docs/einja/steering/development/testing-strategy.md` - テスト戦略
103
- - `docs/einja/steering/development/frontend-development.md` - フロントエンド開発ガイド
104
-
105
- ## 参考資料
106
-
107
- - [React 公式ドキュメント](https://react.dev)
108
- - [TypeScript 公式ドキュメント](https://www.typescriptlang.org)
109
- - [Tailwind CSS ドキュメント](https://tailwindcss.com)
@@ -1,117 +0,0 @@
1
- # ディレクトリ構造
2
-
3
- ## プロジェクト全体のコンポーネント配置
4
-
5
- ```
6
- src/
7
- ├── components/
8
- │ ├── ui/ # 基本的なUIコンポーネント
9
- │ │ ├── Button/
10
- │ │ ├── Input/
11
- │ │ ├── Dialog/
12
- │ │ └── ...
13
- │ └── shared/ # 共通コンポーネント(レイアウト含む)
14
- │ ├── Header/
15
- │ ├── Footer/
16
- │ ├── Sidebar/
17
- │ ├── LoadingSpinner/
18
- │ ├── ErrorBoundary/
19
- │ └── ...
20
- └── app/
21
- ├── dashboard/
22
- │ ├── page.tsx
23
- │ └── _components/ # ページ固有のコンポーネント (co-location)
24
- │ ├── DashboardChart/
25
- │ ├── StatsCard/
26
- │ └── ...
27
- ├── auth/
28
- │ ├── login/
29
- │ │ ├── page.tsx
30
- │ │ └── _components/
31
- │ │ ├── LoginForm/
32
- │ │ └── ...
33
- │ └── register/
34
- │ ├── page.tsx
35
- │ └── _components/
36
- │ ├── RegisterForm/
37
- │ └── ...
38
- └── ...
39
- ```
40
-
41
- ## コンポーネント配置のルール
42
-
43
- ### `src/components/ui/`
44
- - shadcn/uiなどの基本的なUIコンポーネント
45
- - 複数ページで使用される汎用コンポーネント
46
- - Button、Input、Dialog、Cardなど
47
-
48
- ### `src/components/shared/`
49
- - レイアウトコンポーネント(Header、Footer、Sidebar)
50
- - 共通のユーティリティコンポーネント(LoadingSpinner、ErrorBoundary)
51
- - 複数の機能領域で共有されるコンポーネント
52
-
53
- ### `app/*/page/_components/`
54
- - ページ固有のコンポーネント
55
- - Co-locationパターンに従った配置
56
- - 他のページでは使用しないコンポーネント
57
-
58
- ## コンポーネントディレクトリ構造
59
-
60
- ### 基本構造
61
-
62
- ```
63
- ComponentName/
64
- ├── index.tsx # コンポーネント本体
65
- └── styles.ts # Panda CSS スタイル定義(必要に応じて)
66
- ```
67
-
68
- ### 複雑なコンポーネントの場合
69
-
70
- ```
71
- ComponentName/
72
- ├── index.tsx # メインエクスポート
73
- ├── ComponentName.tsx # コンポーネント本体
74
- ├── styles.ts # Panda CSS スタイル定義
75
- ├── types.ts # 型定義
76
- ├── hooks.ts # カスタムフック
77
- └── ComponentName.test.tsx # テスト(co-location)
78
- ```
79
-
80
- ## 命名規則
81
-
82
- ### ファイル名
83
- - **PascalCase を使用**: `Button.tsx`, `UserProfile.tsx`
84
- - **コンポーネント名とファイル名を一致させる**
85
-
86
- ### 例外:shadcn/ui
87
- - shadcn/uiで生成されたコンポーネントはkebab-caseファイル名
88
- - 例: `button.tsx`, `input.tsx`
89
- - これらはそのまま使用し、新規作成するカスタムコンポーネントのみPascalCaseを適用
90
-
91
- ## Co-location パターン
92
-
93
- ### メリット
94
- - 関連するコードが近くにある
95
- - ファイルの検索が容易
96
- - 機能削除時のクリーンアップが簡単
97
-
98
- ### 実践例
99
-
100
- ```
101
- app/
102
- └── users/
103
- ├── page.tsx
104
- ├── loading.tsx
105
- ├── error.tsx
106
- └── _components/
107
- ├── UserList/
108
- │ ├── index.tsx
109
- │ └── UserListItem.tsx
110
- └── UserSearchForm/
111
- └── index.tsx
112
- ```
113
-
114
- ### `_components` の役割
115
- - アンダースコアプレフィックスはNext.jsのルーティングから除外される
116
- - ページ固有のコンポーネントを整理する場所
117
- - 他のページでは使用しないコンポーネントを格納
@@ -1,159 +0,0 @@
1
- # Props設計パターン
2
-
3
- ## 型定義
4
-
5
- ### Props インターフェース
6
-
7
- ```typescript
8
- interface ButtonProps {
9
- children: React.ReactNode;
10
- variant?: "primary" | "secondary" | "danger";
11
- size?: "sm" | "md" | "lg";
12
- disabled?: boolean;
13
- onClick?: () => void;
14
- }
15
- ```
16
-
17
- ### デフォルトProps
18
-
19
- ```typescript
20
- const defaultProps: Partial<ButtonProps> = {
21
- variant: "primary",
22
- size: "md",
23
- disabled: false,
24
- };
25
- ```
26
-
27
- ## イベントハンドリング
28
-
29
- ### 命名規則
30
- - `on` + 動詞の命名規則を使用
31
- - 例: `onClick`, `onSubmit`, `onChange`
32
-
33
- ### 型定義
34
-
35
- ```typescript
36
- interface FormProps {
37
- onSubmit: (data: FormData) => void;
38
- onChange: (field: string, value: string) => void;
39
- }
40
- ```
41
-
42
- ## 状態管理
43
-
44
- ### ローカル状態
45
- - `useState` でローカル状態を管理
46
- - 複雑な状態は `useReducer` を検討
47
-
48
- ```typescript
49
- const [isOpen, setIsOpen] = useState(false);
50
-
51
- // 複雑な状態の場合
52
- const [state, dispatch] = useReducer(reducer, initialState);
53
- ```
54
-
55
- ## エラーハンドリング
56
-
57
- ### Error Boundary
58
- - 予期しないエラーをキャッチ
59
- - ユーザーフレンドリーなエラー表示
60
-
61
- ### バリデーション
62
- - フォーム入力のバリデーション
63
- - 適切なエラーメッセージの表示
64
-
65
- ## 実装例
66
-
67
- ### 基本的なButtonコンポーネント
68
-
69
- ```typescript
70
- // index.tsx
71
- export interface ButtonProps {
72
- children: React.ReactNode;
73
- variant?: "primary" | "secondary" | "danger";
74
- size?: "sm" | "md" | "lg";
75
- disabled?: boolean;
76
- onClick?: () => void;
77
- }
78
-
79
- import { button } from "styled-system/recipes";
80
- import type { ButtonProps } from "./types";
81
-
82
- export const Button: React.FC<ButtonProps> = ({
83
- children,
84
- variant = "primary",
85
- size = "md",
86
- disabled = false,
87
- onClick,
88
- }) => {
89
- return (
90
- <button
91
- className={button({ variant, size })}
92
- disabled={disabled}
93
- onClick={onClick}
94
- >
95
- {children}
96
- </button>
97
- );
98
- };
99
- ```
100
-
101
- ## パフォーマンス
102
-
103
- ### メモ化
104
- - `React.memo` で不要な再レンダリングを防止
105
- - `useMemo`, `useCallback` で計算結果をキャッシュ
106
-
107
- ```typescript
108
- const MemoizedComponent = React.memo(({ data, onClick }) => {
109
- return <div onClick={onClick}>{data.name}</div>;
110
- });
111
-
112
- // useCallbackでコールバックをメモ化
113
- const handleClick = useCallback(() => {
114
- // 処理
115
- }, [dependency]);
116
- ```
117
-
118
- ### 遅延読み込み
119
- - `React.lazy` で大きなコンポーネントの遅延読み込み
120
- - `Suspense` で読み込み状態を表示
121
-
122
- ```typescript
123
- const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
124
-
125
- function App() {
126
- return (
127
- <Suspense fallback={<Loading />}>
128
- <HeavyComponent />
129
- </Suspense>
130
- );
131
- }
132
- ```
133
-
134
- ## アクセシビリティ
135
-
136
- ### セマンティックHTML
137
- - 適切なHTMLタグを使用
138
- - `aria-*` 属性の適切な使用
139
-
140
- ```typescript
141
- <button
142
- aria-label="メニューを開く"
143
- aria-expanded={isOpen}
144
- >
145
- <MenuIcon />
146
- </button>
147
- ```
148
-
149
- ### キーボード操作
150
- - キーボードのみでの操作を可能にする
151
- - フォーカス管理の実装
152
-
153
- ```typescript
154
- const handleKeyDown = (e: React.KeyboardEvent) => {
155
- if (e.key === 'Enter' || e.key === ' ') {
156
- handleClick();
157
- }
158
- };
159
- ```