@einja/dev-cli 0.1.6
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 +179 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +243 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +23 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/sync.d.ts +7 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +294 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/sync.test.d.ts +2 -0
- package/dist/commands/sync.test.d.ts.map +1 -0
- package/dist/commands/sync.test.js +593 -0
- package/dist/commands/sync.test.js.map +1 -0
- package/dist/commands/task-loop.d.ts +11 -0
- package/dist/commands/task-loop.d.ts.map +1 -0
- package/dist/commands/task-loop.js +81 -0
- package/dist/commands/task-loop.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/file-system.d.ts +39 -0
- package/dist/lib/file-system.d.ts.map +1 -0
- package/dist/lib/file-system.js +79 -0
- package/dist/lib/file-system.js.map +1 -0
- package/dist/lib/mcp-config.d.ts +43 -0
- package/dist/lib/mcp-config.d.ts.map +1 -0
- package/dist/lib/mcp-config.js +109 -0
- package/dist/lib/mcp-config.js.map +1 -0
- package/dist/lib/mcp-config.test.d.ts +2 -0
- package/dist/lib/mcp-config.test.d.ts.map +1 -0
- package/dist/lib/mcp-config.test.js +285 -0
- package/dist/lib/mcp-config.test.js.map +1 -0
- package/dist/lib/merger.d.ts +41 -0
- package/dist/lib/merger.d.ts.map +1 -0
- package/dist/lib/merger.js +164 -0
- package/dist/lib/merger.js.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.d.ts +35 -0
- package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.js +83 -0
- package/dist/lib/preset-update/cli-repo-detector.js.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.test.d.ts +2 -0
- package/dist/lib/preset-update/cli-repo-detector.test.d.ts.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.test.js +120 -0
- package/dist/lib/preset-update/cli-repo-detector.test.js.map +1 -0
- package/dist/lib/preset-update/file-copier.d.ts +59 -0
- package/dist/lib/preset-update/file-copier.d.ts.map +1 -0
- package/dist/lib/preset-update/file-copier.js +220 -0
- package/dist/lib/preset-update/file-copier.js.map +1 -0
- package/dist/lib/preset-update/file-copier.test.d.ts +2 -0
- package/dist/lib/preset-update/file-copier.test.d.ts.map +1 -0
- package/dist/lib/preset-update/file-copier.test.js +297 -0
- package/dist/lib/preset-update/file-copier.test.js.map +1 -0
- package/dist/lib/preset-update/preset-finder.d.ts +39 -0
- package/dist/lib/preset-update/preset-finder.d.ts.map +1 -0
- package/dist/lib/preset-update/preset-finder.js +92 -0
- package/dist/lib/preset-update/preset-finder.js.map +1 -0
- package/dist/lib/preset-update/preset-finder.test.d.ts +2 -0
- package/dist/lib/preset-update/preset-finder.test.d.ts.map +1 -0
- package/dist/lib/preset-update/preset-finder.test.js +128 -0
- package/dist/lib/preset-update/preset-finder.test.js.map +1 -0
- package/dist/lib/preset.d.ts +14 -0
- package/dist/lib/preset.d.ts.map +1 -0
- package/dist/lib/preset.js +52 -0
- package/dist/lib/preset.js.map +1 -0
- package/dist/lib/sync/backup-manager.d.ts +50 -0
- package/dist/lib/sync/backup-manager.d.ts.map +1 -0
- package/dist/lib/sync/backup-manager.js +117 -0
- package/dist/lib/sync/backup-manager.js.map +1 -0
- package/dist/lib/sync/backup-manager.test.d.ts +2 -0
- package/dist/lib/sync/backup-manager.test.d.ts.map +1 -0
- package/dist/lib/sync/backup-manager.test.js +155 -0
- package/dist/lib/sync/backup-manager.test.js.map +1 -0
- package/dist/lib/sync/batch-processor.d.ts +27 -0
- package/dist/lib/sync/batch-processor.d.ts.map +1 -0
- package/dist/lib/sync/batch-processor.js +46 -0
- package/dist/lib/sync/batch-processor.js.map +1 -0
- package/dist/lib/sync/batch-processor.test.d.ts +2 -0
- package/dist/lib/sync/batch-processor.test.d.ts.map +1 -0
- package/dist/lib/sync/batch-processor.test.js +110 -0
- package/dist/lib/sync/batch-processor.test.js.map +1 -0
- package/dist/lib/sync/category-validator.d.ts +36 -0
- package/dist/lib/sync/category-validator.d.ts.map +1 -0
- package/dist/lib/sync/category-validator.js +46 -0
- package/dist/lib/sync/category-validator.js.map +1 -0
- package/dist/lib/sync/category-validator.test.d.ts +2 -0
- package/dist/lib/sync/category-validator.test.d.ts.map +1 -0
- package/dist/lib/sync/category-validator.test.js +89 -0
- package/dist/lib/sync/category-validator.test.js.map +1 -0
- package/dist/lib/sync/conflict-reporter.d.ts +57 -0
- package/dist/lib/sync/conflict-reporter.d.ts.map +1 -0
- package/dist/lib/sync/conflict-reporter.js +81 -0
- package/dist/lib/sync/conflict-reporter.js.map +1 -0
- package/dist/lib/sync/conflict-reporter.test.d.ts +2 -0
- package/dist/lib/sync/conflict-reporter.test.d.ts.map +1 -0
- package/dist/lib/sync/conflict-reporter.test.js +132 -0
- package/dist/lib/sync/conflict-reporter.test.js.map +1 -0
- package/dist/lib/sync/diff-engine.d.ts +28 -0
- package/dist/lib/sync/diff-engine.d.ts.map +1 -0
- package/dist/lib/sync/diff-engine.js +118 -0
- package/dist/lib/sync/diff-engine.js.map +1 -0
- package/dist/lib/sync/diff-engine.test.d.ts +2 -0
- package/dist/lib/sync/diff-engine.test.d.ts.map +1 -0
- package/dist/lib/sync/diff-engine.test.js +133 -0
- package/dist/lib/sync/diff-engine.test.js.map +1 -0
- package/dist/lib/sync/file-filter.d.ts +40 -0
- package/dist/lib/sync/file-filter.d.ts.map +1 -0
- package/dist/lib/sync/file-filter.js +171 -0
- package/dist/lib/sync/file-filter.js.map +1 -0
- package/dist/lib/sync/file-filter.test.d.ts +2 -0
- package/dist/lib/sync/file-filter.test.d.ts.map +1 -0
- package/dist/lib/sync/file-filter.test.js +179 -0
- package/dist/lib/sync/file-filter.test.js.map +1 -0
- package/dist/lib/sync/hash-cache.d.ts +34 -0
- package/dist/lib/sync/hash-cache.d.ts.map +1 -0
- package/dist/lib/sync/hash-cache.js +51 -0
- package/dist/lib/sync/hash-cache.js.map +1 -0
- package/dist/lib/sync/hash-cache.test.d.ts +2 -0
- package/dist/lib/sync/hash-cache.test.d.ts.map +1 -0
- package/dist/lib/sync/hash-cache.test.js +110 -0
- package/dist/lib/sync/hash-cache.test.js.map +1 -0
- package/dist/lib/sync/integration.test.d.ts +2 -0
- package/dist/lib/sync/integration.test.d.ts.map +1 -0
- package/dist/lib/sync/integration.test.js +317 -0
- package/dist/lib/sync/integration.test.js.map +1 -0
- package/dist/lib/sync/marker-processor.d.ts +54 -0
- package/dist/lib/sync/marker-processor.d.ts.map +1 -0
- package/dist/lib/sync/marker-processor.js +208 -0
- package/dist/lib/sync/marker-processor.js.map +1 -0
- package/dist/lib/sync/marker-processor.test.d.ts +2 -0
- package/dist/lib/sync/marker-processor.test.d.ts.map +1 -0
- package/dist/lib/sync/marker-processor.test.js +245 -0
- package/dist/lib/sync/marker-processor.test.js.map +1 -0
- package/dist/lib/sync/metadata-manager.d.ts +46 -0
- package/dist/lib/sync/metadata-manager.d.ts.map +1 -0
- package/dist/lib/sync/metadata-manager.js +129 -0
- package/dist/lib/sync/metadata-manager.js.map +1 -0
- package/dist/lib/sync/metadata-manager.test.d.ts +2 -0
- package/dist/lib/sync/metadata-manager.test.d.ts.map +1 -0
- package/dist/lib/sync/metadata-manager.test.js +137 -0
- package/dist/lib/sync/metadata-manager.test.js.map +1 -0
- package/dist/lib/sync/performance.test.d.ts +2 -0
- package/dist/lib/sync/performance.test.d.ts.map +1 -0
- package/dist/lib/sync/performance.test.js +126 -0
- package/dist/lib/sync/performance.test.js.map +1 -0
- package/dist/types/index.d.ts +59 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/preset-update.d.ts +106 -0
- package/dist/types/preset-update.d.ts.map +1 -0
- package/dist/types/preset-update.js +5 -0
- package/dist/types/preset-update.js.map +1 -0
- package/dist/types/sync.d.ts +169 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +19 -0
- package/dist/types/sync.js.map +1 -0
- package/package.json +72 -0
- package/presets/minimal/.claude/agents/einja/docs/docs-updater.md +161 -0
- package/presets/minimal/.claude/agents/einja/frontend/design-engineer.md +685 -0
- package/presets/minimal/.claude/agents/einja/frontend/frontend-architect.md +747 -0
- package/presets/minimal/.claude/agents/einja/frontend/frontend-coder.md +441 -0
- package/presets/minimal/.claude/agents/einja/git/conflict-resolver.md +148 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-design-generator.md +462 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-qa-generator.md +466 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-requirements-generator.md +416 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-tasks-generator.md +608 -0
- package/presets/minimal/.claude/agents/einja/task/task-committer.md +82 -0
- package/presets/minimal/.claude/agents/einja/task/task-executer.md +352 -0
- package/presets/minimal/.claude/agents/einja/task/task-modification-analyzer.md +369 -0
- package/presets/minimal/.claude/agents/einja/task/task-qa.md +74 -0
- package/presets/minimal/.claude/agents/einja/task/task-reviewer.md +169 -0
- package/presets/minimal/.claude/commands/einja/frontend-implement.md +322 -0
- package/presets/minimal/.claude/commands/einja/spec-create.md +254 -0
- package/presets/minimal/.claude/commands/einja/start-dev.md +98 -0
- package/presets/minimal/.claude/commands/einja/sync-cursor-commands.md +203 -0
- package/presets/minimal/.claude/commands/einja/task-exec.md +390 -0
- package/presets/minimal/.claude/commands/einja/update-docs-by-task-specs.md +448 -0
- package/presets/minimal/.claude/hooks/einja/biome-format.sh +49 -0
- package/presets/minimal/.claude/hooks/einja/design-doc-check.sh +61 -0
- package/presets/minimal/.claude/hooks/einja/detect-secrets.sh +62 -0
- package/presets/minimal/.claude/hooks/einja/large-file-warning.sh +42 -0
- package/presets/minimal/.claude/hooks/einja/playwright-resize.sh +36 -0
- package/presets/minimal/.claude/hooks/einja/typecheck.sh +37 -0
- package/presets/minimal/.claude/hooks/einja/unset-volta-recursion.sh +32 -0
- package/presets/minimal/.claude/hooks/einja/validate-git-commit.sh +239 -0
- package/presets/minimal/.claude/hooks/einja/warn-index-ts.sh +34 -0
- package/presets/minimal/.claude/hooks/einja/warn-relative-import.sh +48 -0
- package/presets/minimal/.claude/settings.json +174 -0
- package/presets/minimal/.claude/skills/einja/api-development/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/backend-architecture/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/SKILL.md +120 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/naming-conventions.md +107 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/prohibited-patterns.md +169 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/typescript-rules.md +247 -0
- package/presets/minimal/.claude/skills/einja/component-design/SKILL.md +109 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/directory-structure.md +117 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/props-patterns.md +159 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/styling-guide.md +200 -0
- package/presets/minimal/.claude/skills/einja/conflict-resolver/SKILL.md +190 -0
- package/presets/minimal/.claude/skills/einja/frontend-development/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/general-context-loader/SKILL.md +254 -0
- package/presets/minimal/.claude/skills/einja/output-format/SKILL.md +137 -0
- package/presets/minimal/.claude/skills/einja/spec-context-loader/SKILL.md +177 -0
- package/presets/minimal/.claude/skills/einja/task-commit/SKILL.md +269 -0
- package/presets/minimal/.claude/skills/einja/task-qa/SKILL.md +306 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/failure-patterns.md +69 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/troubleshooting.md +65 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/usage-patterns.md +52 -0
- package/presets/minimal/.claude/skills/einja/task-qa/templates/qa-test-template.md +128 -0
- package/presets/minimal/preset.yaml +111 -0
- package/presets/minimal/symlinks.json +45 -0
- package/scaffolds/.mcp.json +45 -0
- package/scaffolds/CLAUDE.md.template +318 -0
- package/scaffolds/steering/README.md +170 -0
- package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +415 -0
- package/scaffolds/steering/architecture.md +481 -0
- package/scaffolds/steering/branch-strategy.md +362 -0
- package/scaffolds/steering/commit-rules.md +217 -0
- package/scaffolds/steering/db-schema-design.md +609 -0
- package/scaffolds/steering/development/api-development.md +783 -0
- package/scaffolds/steering/development/backend-architecture.md +731 -0
- package/scaffolds/steering/development/frontend-development.md +1537 -0
- package/scaffolds/steering/development/review-guidelines.md +365 -0
- package/scaffolds/steering/development/testing-strategy.md +819 -0
- package/scaffolds/steering/development-workflow.md +429 -0
- package/scaffolds/steering/infrastructure/deployment.md +277 -0
- package/scaffolds/steering/infrastructure/environment-variables.md +298 -0
- package/scaffolds/steering/product.md +540 -0
- package/scaffolds/steering/task-management.md +367 -0
- package/templates/README.md +159 -0
- package/templates/design-simple.md.template +172 -0
- package/templates/design.md.template +327 -0
- package/templates/qa-test.md.template +125 -0
- package/templates/requirements.md.template +254 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
# 実装レビューガイドライン
|
|
2
|
+
|
|
3
|
+
このドキュメントは、task-reviewerエージェントおよび開発者が実装レビューを行う際の観点を定義します。
|
|
4
|
+
|
|
5
|
+
## 🚨 レビュー前の必須確認事項
|
|
6
|
+
|
|
7
|
+
すべての実装レビューでは、以下のドキュメントへの準拠を**必ず確認**してください:
|
|
8
|
+
|
|
9
|
+
### フロントエンド実装(tsx, css ファイル)のレビュー時
|
|
10
|
+
|
|
11
|
+
**📘 [フロントエンド開発ガイド](frontend-development.md) への準拠必須**
|
|
12
|
+
|
|
13
|
+
レビュー時に確認すべき主要項目:
|
|
14
|
+
- [ ] **Server Component / Client Componentの適切な使い分け**
|
|
15
|
+
- page.tsxでの`'use client'`使用は禁止
|
|
16
|
+
- インタラクティブ機能のみClient Component化
|
|
17
|
+
- `'use client'`境界が最小限に抑えられているか
|
|
18
|
+
- [ ] **Tanstack Queryの正しい使用**
|
|
19
|
+
- useQuery / useMutationがClient Componentで使用されているか
|
|
20
|
+
- queryKeyが適切に設計されているか
|
|
21
|
+
- データ更新時のキャッシュ無効化が適切に実装されているか
|
|
22
|
+
- [ ] **React Hook Formの正しい使用**
|
|
23
|
+
- Zodスキーマとの統合(zodResolver)
|
|
24
|
+
- フォームバリデーションの実装
|
|
25
|
+
- [ ] **Hono Clientによる型安全なAPI呼び出し**
|
|
26
|
+
- エンドツーエンド型推論が機能しているか
|
|
27
|
+
- 適切なエラーハンドリング
|
|
28
|
+
|
|
29
|
+
### バックエンド実装(API, ビジネスロジック)のレビュー時
|
|
30
|
+
|
|
31
|
+
**📙 [バックエンドアーキテクチャ](backend-architecture.md) への準拠必須**
|
|
32
|
+
|
|
33
|
+
レビュー時に確認すべき主要項目:
|
|
34
|
+
- [ ] **4層レイヤードアーキテクチャの遵守**
|
|
35
|
+
- Presentation層: API Routes(Hono Router)
|
|
36
|
+
- Application層: UseCases(各アプリ内に配置)
|
|
37
|
+
- Domain層: エンティティ、Repository Interface
|
|
38
|
+
- Infrastructure層: Repository実装、Mapper
|
|
39
|
+
- [ ] **Repositoryパターンの正しい実装**
|
|
40
|
+
- Domain層にインターフェース定義
|
|
41
|
+
- Infrastructure層に実装
|
|
42
|
+
- SearchCriteria型の設計(すべてオプショナル)
|
|
43
|
+
- [ ] **Mapperパターンの使用**
|
|
44
|
+
- Prismaモデル ⇔ Domainエンティティの変換
|
|
45
|
+
- Infrastructure層に配置
|
|
46
|
+
- [ ] **Result型パターンの使用**
|
|
47
|
+
- 例外を使わないエラーハンドリング
|
|
48
|
+
- `{ isSuccess: true/false, value/error }` の形式
|
|
49
|
+
- [ ] **UseCase統合パターン**
|
|
50
|
+
- リソース単位で1ファイルに統合
|
|
51
|
+
- オブジェクトリテラル形式(クラスではない)
|
|
52
|
+
- [ ] **パッケージエクスポート**
|
|
53
|
+
- index.ts不使用(直接ファイルパス指定)
|
|
54
|
+
- 絶対パスインポート(`@repo/server-core/...`)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## API開発ガイドへの準拠確認
|
|
59
|
+
|
|
60
|
+
APIエンドポイントやアプリケーション機能の実装レビュー時は、必ず以下を確認:
|
|
61
|
+
|
|
62
|
+
- [ ] **API開発ガイドの実装ルール遵守**
|
|
63
|
+
- UseCaseはオブジェクト形式で実装されているか(クラスではない)
|
|
64
|
+
- Repositoryの型変換でMapperが適切に使用されているか
|
|
65
|
+
- Zodスキーマによるバリデーションが全エンドポイントで実装されているか
|
|
66
|
+
- **🔗 Honoのメソッドチェーン形式が守られているか** - `new Hono().get().post().put().delete()`の形式で実装すること。個別呼び出し形式(`app.get(); app.post();`)では`typeof app`による型推論が損なわれ、Hono Clientでの型安全性が失われる(詳細: [API開発ガイド - メソッドチェーンパターン](./development/api-development.md#メソッドチェーンパターン))
|
|
67
|
+
- **🔗 サブルート内で`.use()`を使っていないか** - ミドルウェアはメインアプリ側で適用すること。サブルート内で`.use()`を使うと型が`ClientRequest<{}>`になり型推論が壊れる(詳細: [API開発ガイド - ミドルウェアと型推論](./development/api-development.md#ミドルウェアと型推論の注意点))
|
|
68
|
+
- エラーハンドリングがApplicationErrorで統一されているか
|
|
69
|
+
- loggerが使用され、console.logが使われていないか
|
|
70
|
+
- **相対パスの使用禁止** - import文、require文、ファイルパス指定で`../`や`./`などの相対パスが使用されていないか。必ずアプリ固有エイリアス(`@web/*`、`@admin/*`等)またはパッケージ名(`@repo/server-core`等)を使用すること
|
|
71
|
+
|
|
72
|
+
## APIクライアント実装ガイドへの準拠確認
|
|
73
|
+
|
|
74
|
+
フロントエンドのAPIクライアント実装レビュー時は、必ず以下を確認:
|
|
75
|
+
|
|
76
|
+
- [ ] **APIクライアント実装ガイドの実装ルール遵守**
|
|
77
|
+
- Tanstack QueryとHonoクライアントを使用した型安全な実装になっているか
|
|
78
|
+
- Zodスキーマによるレスポンス検証が実装されているか
|
|
79
|
+
- apiClientsディレクトリ構成が守られているか(フェッチ関数とhooksの分離)
|
|
80
|
+
- useMutationでのキャッシュ無効化が適切に実装されているか
|
|
81
|
+
- エラーハンドリングが実装されているか
|
|
82
|
+
- 型定義の整合性が保たれているか(バックエンドとフロントエンド間)
|
|
83
|
+
|
|
84
|
+
## 設計原則
|
|
85
|
+
|
|
86
|
+
### 責務と凝集度・結合度
|
|
87
|
+
|
|
88
|
+
- [ ] **単一責任の原則 (SRP)**: クラスやメソッドは一つの明確な責務を持つか
|
|
89
|
+
- [ ] **高凝集・疎結合**: 関連性の高いコードがまとめられ、モジュール間の依存が最小限か
|
|
90
|
+
- [ ] **適切なロジック配置**: ビジネスロジックやデータ操作が適切なクラスに配置されているか
|
|
91
|
+
- [ ] **継承より委譲**: 安易な継承ではなく委譲を優先しているか
|
|
92
|
+
- [ ] **関心の分離 (SoC)**: UI、ビジネスロジック、データアクセスが適切に分離されているか
|
|
93
|
+
- [ ] **インターフェースと実装の分離**: 具象クラスへの直接依存を避けているか
|
|
94
|
+
|
|
95
|
+
### SOLID原則
|
|
96
|
+
|
|
97
|
+
- [ ] **単一責任の原則**: 一つのクラスに一つの変更理由のみ存在するか
|
|
98
|
+
- [ ] **オープン/クローズドの原則**: 拡張に開き、修正に閉じた設計か
|
|
99
|
+
- [ ] **リスコフの置換原則**: 派生クラスは基底クラスと置換可能か
|
|
100
|
+
- [ ] **インターフェース分離の原則**: 使用しないメソッドへの依存を強制していないか
|
|
101
|
+
- [ ] **依存性逆転の原則**: 高レベルモジュールが低レベルモジュールに依存していないか
|
|
102
|
+
|
|
103
|
+
### シンプルさとYAGNI
|
|
104
|
+
|
|
105
|
+
- [ ] **シンプルさ (KISS)**: 必要以上に複雑になっていないか
|
|
106
|
+
- [ ] **YAGNI**: 現時点で不要な機能や汎用化を避けているか
|
|
107
|
+
- [ ] **標準的な方法の利用**: より単純な標準的方法で実装可能か
|
|
108
|
+
|
|
109
|
+
### 抽象化
|
|
110
|
+
|
|
111
|
+
- [ ] **適切な抽象化レベル (SLAP)**: 同じルーチン内で抽象レベルが混在していないか
|
|
112
|
+
- [ ] **重複ロジックの抽出**: 重複するロジックが適切に共通化されているか
|
|
113
|
+
- [ ] **車輪の再発明の回避**: 標準ライブラリや既存ライブラリで実現可能か
|
|
114
|
+
|
|
115
|
+
## コード品質
|
|
116
|
+
|
|
117
|
+
### 可読性・理解可能性
|
|
118
|
+
|
|
119
|
+
- [ ] **明確さと意図**: コードの意図が明確に伝わるか
|
|
120
|
+
- [ ] **ネストの深さ**: 深いネストを避け、ガード節や早期リターンを活用しているか
|
|
121
|
+
- [ ] **論理的な順序**: ステートメントが論理的な順序で記述されているか
|
|
122
|
+
- [ ] **線形原理**: 処理の流れが上から下へ自然に読み進められるか
|
|
123
|
+
|
|
124
|
+
### 命名
|
|
125
|
+
|
|
126
|
+
#### 命名規則一覧
|
|
127
|
+
|
|
128
|
+
プロジェクト全体で以下の命名規則を遵守すること:
|
|
129
|
+
|
|
130
|
+
| 対象 | 命名規則 | 例 |
|
|
131
|
+
|------|----------|-----|
|
|
132
|
+
| Prismaモデル名 | PascalCase | `User`, `MagicLinkToken` |
|
|
133
|
+
| Prismaカラム名 | camelCase | `userId`, `createdAt` |
|
|
134
|
+
| データベーステーブル名 | snake_case | `users`, `magic_link_tokens` |
|
|
135
|
+
| ファイル名 | kebab-case | `user-service.ts`, `magic-link.tsx` |
|
|
136
|
+
| URLパス | kebab-case | `/api/magic-link`, `/user-profile` |
|
|
137
|
+
| TSXコンポーネントファイル | PascalCase | `UserProfile.tsx`, `MagicLinkForm.tsx` |
|
|
138
|
+
| 関数名 | camelCase | `getUserById`, `sendMagicLink` |
|
|
139
|
+
| 変数名 | camelCase | `userData`, `magicLinkToken` |
|
|
140
|
+
| クラス名 | PascalCase | `UserService`, `MagicLinkValidator` |
|
|
141
|
+
| `as const`をつける定数名 | UPPER_SNAKE_CASE | `API_ENDPOINTS`, `DEFAULT_TIMEOUT` |
|
|
142
|
+
|
|
143
|
+
#### 命名の品質チェック
|
|
144
|
+
|
|
145
|
+
- [ ] **明確で具体的**: 変数、メソッド、クラス名が役割を正確に伝えているか
|
|
146
|
+
- [ ] **一貫性**: 上記の命名規則や用語が一貫しているか
|
|
147
|
+
- [ ] **副作用の明示**: 副作用のあるメソッドには動詞を使用しているか
|
|
148
|
+
- [ ] **驚き最小の原則**: 名前から期待される動作と実際の動作が一致しているか
|
|
149
|
+
|
|
150
|
+
### コードの重複回避 (DRY)
|
|
151
|
+
|
|
152
|
+
- [ ] **ロジックの重複**: 同じコードが複数箇所に存在していないか
|
|
153
|
+
- [ ] **設定や定数の重複**: 設定値や定数が一元管理されているか
|
|
154
|
+
|
|
155
|
+
### 複雑性
|
|
156
|
+
|
|
157
|
+
- [ ] **コードの単純さ**: 必要以上に複雑なロジックになっていないか
|
|
158
|
+
- [ ] **早期最適化の回避**: 計測に基づかないパフォーマンスチューニングを避けているか
|
|
159
|
+
|
|
160
|
+
### マジックナンバー/文字列
|
|
161
|
+
|
|
162
|
+
- [ ] **定数化**: 意味のある数値や文字列が定数として定義されているか
|
|
163
|
+
|
|
164
|
+
### 不要なコードの削除
|
|
165
|
+
|
|
166
|
+
- [ ] **未使用コード**: 使用されていない変数、メソッド、クラスが存在しないか
|
|
167
|
+
- [ ] **デッドコード**: 到達不能なコードが存在しないか
|
|
168
|
+
- [ ] **コメントアウトされたコード**: 不要なコメントアウトコードが残っていないか
|
|
169
|
+
|
|
170
|
+
### コメント
|
|
171
|
+
|
|
172
|
+
- [ ] **「なぜ」を説明**: コードの意図や理由を説明しているか
|
|
173
|
+
- [ ] **有益性**: 複雑なアルゴリズムやワークアラウンドを適切に説明しているか
|
|
174
|
+
- [ ] **正確性と最新性**: コメントがコードと一致し最新の状態か
|
|
175
|
+
- [ ] **自己文書化**: コード自体を分かりやすく書くことでコメントを減らしているか
|
|
176
|
+
|
|
177
|
+
### スタイルとフォーマット
|
|
178
|
+
|
|
179
|
+
- [ ] **スタイルガイド準拠**: プロジェクトのスタイルガイドに従っているか
|
|
180
|
+
- [ ] **一貫性**: コーディングスタイルが一貫しているか
|
|
181
|
+
- [ ] **視覚的構造**: インデントや空白行がコードの論理構造を表現しているか
|
|
182
|
+
|
|
183
|
+
### エラーハンドリング
|
|
184
|
+
|
|
185
|
+
- [ ] **予期せぬ入力への対応**: 不正な値に対する考慮がされているか
|
|
186
|
+
- [ ] **適切な例外処理**: 例外を制御フローとして使用していないか
|
|
187
|
+
- [ ] **エラー情報の記録**: 原因究明に必要な情報がログに記録されるか
|
|
188
|
+
- [ ] **リソース解放**: エラー発生時もリソースが確実に解放されるか
|
|
189
|
+
- [ ] **トランザクション管理**: データ更新処理が適切にトランザクション管理されているか
|
|
190
|
+
|
|
191
|
+
### 防御的プログラミング
|
|
192
|
+
|
|
193
|
+
- [ ] **入力値検証**: パラメータが期待される範囲や型であるか検証しているか
|
|
194
|
+
- [ ] **安全原理**: エッジケースや潜在的なエラー条件を考慮しているか
|
|
195
|
+
|
|
196
|
+
### データ型と構造
|
|
197
|
+
|
|
198
|
+
- [ ] **適切なデータ型**: 格納するデータに適した型が選択されているか
|
|
199
|
+
- [ ] **Enumの適切な利用**: Enumの値設定やバリデーションが適切か
|
|
200
|
+
|
|
201
|
+
### パフォーマンス
|
|
202
|
+
|
|
203
|
+
- [ ] **効率的なアルゴリズム**: 処理内容に対して効率的なアルゴリズムが選択されているか
|
|
204
|
+
- [ ] **N+1問題**: ループ内での都度クエリ発行を避けているか
|
|
205
|
+
- [ ] **不要なデータ取得**: 必要なデータのみを取得しているか
|
|
206
|
+
- [ ] **インデックス**: 検索条件となるカラムにインデックスが設定されているか
|
|
207
|
+
|
|
208
|
+
### APIクライアント実装
|
|
209
|
+
|
|
210
|
+
- [ ] **キャッシュ無効化**: 関連するクエリキャッシュが適切に無効化されているか
|
|
211
|
+
- [ ] **キャッシュ戦略の一貫性**: 統一されたキャッシュ無効化パターンが使用されているか
|
|
212
|
+
- [ ] **エラーハンドリング**: APIエラー時の処理が適切に実装されているか
|
|
213
|
+
- [ ] **型安全性**: Zodスキーマと TypeScriptの型が一貫しているか
|
|
214
|
+
|
|
215
|
+
## コードスメル検出
|
|
216
|
+
|
|
217
|
+
以下のコードスメル(改善が必要なコードの兆候)がないか確認します。
|
|
218
|
+
|
|
219
|
+
### 肥大化 (Bloaters)
|
|
220
|
+
|
|
221
|
+
- [ ] **長すぎるメソッド**: メソッドが50行を超えていないか
|
|
222
|
+
- 対策: 小さなメソッドに分割する
|
|
223
|
+
- [ ] **巨大なクラス**: クラスが複数の責任を持っていないか
|
|
224
|
+
- 対策: 責任ごとにクラスを分割する
|
|
225
|
+
- [ ] **長いパラメータリスト**: メソッドのパラメータが3-4個を超えていないか
|
|
226
|
+
- 対策: パラメータオブジェクトを導入する
|
|
227
|
+
- [ ] **データの群れ**: 同じデータ群が複数箇所に出現していないか
|
|
228
|
+
- 対策: データクラスを作成する
|
|
229
|
+
- [ ] **深いネスト**: if/for/while等のネストが3レベル以上になっていないか
|
|
230
|
+
- 対策1: 早期リターン(guard clause)で条件を反転させ平坦化する
|
|
231
|
+
- 対策2: 条件を名前付き変数やヘルパー関数に抽出する
|
|
232
|
+
- 対策3: 三項演算子で設定値を事前に決定し、共通処理をまとめる
|
|
233
|
+
|
|
234
|
+
### 濫用 (Abusers)
|
|
235
|
+
|
|
236
|
+
- [ ] **switch文の濫用**: 同じswitch文が複数箇所に存在しないか
|
|
237
|
+
- 対策: ポリモーフィズムで置き換える
|
|
238
|
+
- [ ] **一時的フィールド**: 特定の状況でのみ使用されるフィールドがないか
|
|
239
|
+
- 対策: Null Objectパターンやクラス抽出を検討する
|
|
240
|
+
- [ ] **拒否された遺贈**: サブクラスが親クラスのメソッドやプロパティを使用していないか
|
|
241
|
+
- 対策: 継承を委譲に置き換える
|
|
242
|
+
|
|
243
|
+
### 変更の障害 (Change Preventers)
|
|
244
|
+
|
|
245
|
+
- [ ] **発散的変更**: 一つのクラスが複数の理由で頻繁に変更されないか
|
|
246
|
+
- 対策: 単一責任の原則に従ってクラスを分割する
|
|
247
|
+
- [ ] **散弾銃手術**: 一つの変更のために多くのクラスを修正する必要がないか
|
|
248
|
+
- 対策: メソッドやフィールドの移動で関連コードを集約する
|
|
249
|
+
|
|
250
|
+
### 不要なもの (Dispensables)
|
|
251
|
+
|
|
252
|
+
- [ ] **コメント過多**: コードの意図が分かりにくく、多くのコメントが必要になっていないか
|
|
253
|
+
- 対策: メソッド抽出やリネーミングでコードを自己文書化する
|
|
254
|
+
- [ ] **重複コード**: 同じコードが複数箇所に存在しないか
|
|
255
|
+
- 対策: メソッド抽出や共通化を実施する
|
|
256
|
+
- [ ] **怠惰なクラス**: ほとんど何もしないクラスが存在しないか
|
|
257
|
+
- 対策: 不要なクラスは削除または統合する
|
|
258
|
+
- [ ] **推測的一般性**: 将来使うかもしれない機能が実装されていないか
|
|
259
|
+
- 対策: YAGNI原則に従い、現時点で不要な機能は削除する
|
|
260
|
+
|
|
261
|
+
### カプセル化の欠如 (Couplers)
|
|
262
|
+
|
|
263
|
+
- [ ] **不適切な親密さ**: クラスが他クラスの内部実装に依存していないか
|
|
264
|
+
- 対策: カプセル化を強化し、適切なインターフェースを提供する
|
|
265
|
+
- [ ] **メッセージの連鎖**: `a.getB().getC().doSomething()` のような呼び出しがないか
|
|
266
|
+
- 対策: デメテルの法則に従い、中間オブジェクトを隠蔽する
|
|
267
|
+
- [ ] **仲介人**: メソッドの大半が他のオブジェクトへの委譲になっていないか
|
|
268
|
+
- 対策: 不要な仲介クラスを削除する
|
|
269
|
+
|
|
270
|
+
### 特有のスメル
|
|
271
|
+
|
|
272
|
+
#### TypeScript/JavaScript特有
|
|
273
|
+
|
|
274
|
+
- [ ] **型アサーション (`as`) の濫用**: 型の安全性を損なう使い方をしていないか
|
|
275
|
+
- [ ] **any型の使用**: any型を避け、適切な型定義を使用しているか
|
|
276
|
+
- [ ] **非同期処理の不適切な扱い**: Promise の適切なエラーハンドリングがされているか
|
|
277
|
+
- [ ] **オプショナルチェーンの過度な使用**: データ構造設計の問題を示していないか
|
|
278
|
+
|
|
279
|
+
#### React特有
|
|
280
|
+
|
|
281
|
+
- [ ] **巨大なコンポーネント**: コンポーネントが複数の責任を持っていないか
|
|
282
|
+
- 対策: プレゼンテーショナルコンポーネントとコンテナコンポーネントに分離
|
|
283
|
+
- [ ] **Prop Drilling**: プロパティを多階層で渡していないか
|
|
284
|
+
- 対策: Context API や状態管理ライブラリを検討
|
|
285
|
+
- [ ] **useEffectの濫用**: 副作用が適切に管理されているか
|
|
286
|
+
- 対策: カスタムフックへの抽出や、副作用の最小化
|
|
287
|
+
|
|
288
|
+
## テスト
|
|
289
|
+
|
|
290
|
+
### テストケースの品質
|
|
291
|
+
|
|
292
|
+
- [ ] **網羅性**: 正常系、異常系、境界値が適切にテストされているか
|
|
293
|
+
- [ ] **独立性**: テストケースが他のテストに依存していないか
|
|
294
|
+
- [ ] **安定性**: 実行ごとに結果が変わらないか
|
|
295
|
+
- [ ] **正確なアサーション**: 適切で明確なアサーションが使われているか
|
|
296
|
+
|
|
297
|
+
### テストコードの可読性
|
|
298
|
+
|
|
299
|
+
- [ ] **構造化**: Arrange/Act/Assertの構造が明確か
|
|
300
|
+
- [ ] **期待値の明確さ**: テストコード単体で期待値の根拠が分かるか
|
|
301
|
+
- [ ] **不要なテストの排除**: フレームワークの標準機能自体をテストしていないか
|
|
302
|
+
|
|
303
|
+
## ドキュメンテーション
|
|
304
|
+
|
|
305
|
+
- [ ] **コードの意図の明確化**: 理解が難しいロジックに適切なコメントがあるか
|
|
306
|
+
- [ ] **関連ドキュメントの更新**: コード変更に伴いドキュメントも更新されているか
|
|
307
|
+
- [ ] **設計と実装の分離**: 設計書に実装コードを書いていないか
|
|
308
|
+
|
|
309
|
+
## 並列レビュー観点
|
|
310
|
+
|
|
311
|
+
task-reviewerエージェントは以下の4観点を**Taskツールで並列にサブエージェントを呼び出して**レビューします。
|
|
312
|
+
|
|
313
|
+
> **注意**: 各観点は独立したExploreエージェントで並列実行されます。
|
|
314
|
+
> task-reviewerは**1つのメッセージで4つのTask tool_use**を同時に呼び出してください。
|
|
315
|
+
|
|
316
|
+
### 1. アーキテクチャ観点
|
|
317
|
+
**対象セクション**: フロントエンド/バックエンド実装レビュー、設計原則、SOLID原則
|
|
318
|
+
- フロントエンド: Server/Client Component使い分け、Tanstack Query、React Hook Form
|
|
319
|
+
- バックエンド: 4層アーキテクチャ、Repositoryパターン、Result型パターン
|
|
320
|
+
- 設計原則: SRP、高凝集・疎結合、関心の分離
|
|
321
|
+
|
|
322
|
+
### 2. コード品質観点
|
|
323
|
+
**対象セクション**: コード品質
|
|
324
|
+
- 可読性・理解可能性
|
|
325
|
+
- 命名規則
|
|
326
|
+
- DRY、複雑性
|
|
327
|
+
- エラーハンドリング、防御的プログラミング
|
|
328
|
+
- パフォーマンス(N+1問題、インデックス)
|
|
329
|
+
|
|
330
|
+
### 3. コードスメル観点
|
|
331
|
+
**対象セクション**: コードスメル検出
|
|
332
|
+
- 肥大化: 長いメソッド、巨大クラス、深いネスト
|
|
333
|
+
- 濫用: switch文濫用、一時的フィールド
|
|
334
|
+
- 変更の障害: 発散的変更、散弾銃手術
|
|
335
|
+
- TypeScript/React特有のスメル
|
|
336
|
+
|
|
337
|
+
### 4. テスト品質観点
|
|
338
|
+
**対象セクション**: テスト
|
|
339
|
+
- 網羅性(正常系、異常系、境界値)
|
|
340
|
+
- 独立性、安定性
|
|
341
|
+
- **Given-When-Then形式**(= Arrange/Act/Assert形式)での構造化
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## レビュー時の注意事項
|
|
346
|
+
|
|
347
|
+
### コミュニケーション
|
|
348
|
+
|
|
349
|
+
- **敬意を持つ**: コードに対してコメントし、開発者を批判しない
|
|
350
|
+
- **明確な指示**: 具体的な改善案や方向性を示す
|
|
351
|
+
- **称賛**: 良いコードや改善は積極的に評価する
|
|
352
|
+
|
|
353
|
+
### レビューの優先順位
|
|
354
|
+
|
|
355
|
+
1. **設計上の問題**: アーキテクチャや責務分離の問題
|
|
356
|
+
2. **機能の正確性**: バグや仕様違反
|
|
357
|
+
3. **テストの品質**: テストカバレッジや品質
|
|
358
|
+
4. **コードスメル**: 保守性を損なう兆候
|
|
359
|
+
5. **命名やスタイル**: コーディング規約
|
|
360
|
+
|
|
361
|
+
### 判断基準
|
|
362
|
+
|
|
363
|
+
- **継続的改善**: 完璧ではなく、システム全体の健全性向上を重視
|
|
364
|
+
- **好みと良し悪しの区別**: 客観的な改善提案と主観的な好みを明確に区別
|
|
365
|
+
- **トレードオフの考慮**: パフォーマンス、可読性、保守性のバランスを考慮
|