@einja/dev-cli 0.1.21 → 0.1.24

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 (66) hide show
  1. package/README.md +54 -30
  2. package/dist/cli.js +3 -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 +10 -46
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/sync.d.ts.map +1 -1
  8. package/dist/commands/sync.js +21 -0
  9. package/dist/commands/sync.js.map +1 -1
  10. package/dist/commands/task-loop/index.js +15 -15
  11. package/dist/commands/task-loop/index.js.map +1 -1
  12. package/dist/commands/task-loop/lib/branch-manager.d.ts +2 -2
  13. package/dist/commands/task-loop/lib/branch-manager.d.ts.map +1 -1
  14. package/dist/commands/task-loop/lib/branch-manager.js +133 -28
  15. package/dist/commands/task-loop/lib/branch-manager.js.map +1 -1
  16. package/dist/commands/task-loop/lib/branch-manager.test.js +186 -161
  17. package/dist/commands/task-loop/lib/branch-manager.test.js.map +1 -1
  18. package/dist/commands/task-loop/lib/branch-selector.d.ts.map +1 -1
  19. package/dist/commands/task-loop/lib/branch-selector.js +28 -69
  20. package/dist/commands/task-loop/lib/branch-selector.js.map +1 -1
  21. package/dist/commands/task-loop/lib/horizontal-split-detector.d.ts +25 -0
  22. package/dist/commands/task-loop/lib/horizontal-split-detector.d.ts.map +1 -0
  23. package/dist/commands/task-loop/lib/horizontal-split-detector.js +72 -0
  24. package/dist/commands/task-loop/lib/horizontal-split-detector.js.map +1 -0
  25. package/dist/commands/task-loop/lib/horizontal-split-detector.test.d.ts +2 -0
  26. package/dist/commands/task-loop/lib/horizontal-split-detector.test.d.ts.map +1 -0
  27. package/dist/commands/task-loop/lib/horizontal-split-detector.test.js +177 -0
  28. package/dist/commands/task-loop/lib/horizontal-split-detector.test.js.map +1 -0
  29. package/dist/commands/task-loop/lib/issue-validator.d.ts.map +1 -1
  30. package/dist/commands/task-loop/lib/issue-validator.js +37 -4
  31. package/dist/commands/task-loop/lib/issue-validator.js.map +1 -1
  32. package/dist/commands/task-loop/lib/pull-request-manager.d.ts +26 -0
  33. package/dist/commands/task-loop/lib/pull-request-manager.d.ts.map +1 -1
  34. package/dist/commands/task-loop/lib/pull-request-manager.js +121 -1
  35. package/dist/commands/task-loop/lib/pull-request-manager.js.map +1 -1
  36. package/dist/commands/task-loop/lib/types.d.ts +2 -2
  37. package/dist/commands/task-loop/lib/types.d.ts.map +1 -1
  38. package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts +15 -11
  39. package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts.map +1 -1
  40. package/dist/commands/task-loop/lib/vibe-kanban-client.js +42 -29
  41. package/dist/commands/task-loop/lib/vibe-kanban-client.js.map +1 -1
  42. package/dist/lib/dependency-checker.d.ts +31 -0
  43. package/dist/lib/dependency-checker.d.ts.map +1 -0
  44. package/dist/lib/dependency-checker.js +259 -0
  45. package/dist/lib/dependency-checker.js.map +1 -0
  46. package/dist/lib/package-manager.d.ts +15 -0
  47. package/dist/lib/package-manager.d.ts.map +1 -0
  48. package/dist/lib/package-manager.js +71 -0
  49. package/dist/lib/package-manager.js.map +1 -0
  50. package/dist/types/index.d.ts +20 -0
  51. package/dist/types/index.d.ts.map +1 -1
  52. package/package.json +1 -1
  53. package/presets/default/.claude/agents/einja/design-engineer.md +252 -434
  54. package/presets/default/.claude/agents/einja/frontend-architect.md +11 -11
  55. package/presets/default/.claude/agents/einja/frontend-coder.md +33 -21
  56. package/presets/default/.claude/agents/einja/specs/spec-tasks-generator.md +39 -0
  57. package/presets/default/.claude/commands/einja/task-exec.md +7 -7
  58. package/presets/default/.claude/hooks/einja/biome-format.sh +2 -2
  59. package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +27 -16
  60. package/presets/default/.claude/skills/einja-component-design/SKILL.md +4 -4
  61. package/presets/default/.claude/skills/einja-component-design/reference/styling-guide.md +53 -131
  62. package/presets/default/preset.yaml +27 -0
  63. package/scaffolds/cli/preset.yaml +27 -0
  64. package/scaffolds/instructions/deployment-setup.md +40 -41
  65. package/scaffolds/steering/infrastructure/deployment.md +459 -66
  66. package/presets/default/.claude/agents/einja/task/task-committer.md +0 -88
@@ -487,19 +487,19 @@ const { users, pagination } = await getUsers({
487
487
  - Redux: サーバー状態管理にはオーバースペック
488
488
  ```
489
489
 
490
- #### ADR-002: Panda CSSを採用
490
+ #### ADR-002: Tailwind CSSを採用
491
491
  ```markdown
492
492
  ## 決定
493
- スタイリングにPanda CSSを使用
493
+ スタイリングにTailwind CSS v4を使用
494
494
 
495
495
  ## 根拠
496
- - 型安全なスタイル定義
497
- - ゼロランタイム(ビルド時生成)
498
- - デザイントークンとの統合
499
- - Next.jsとの親和性
496
+ - ユーティリティファーストでの高速開発
497
+ - shadcn/uiとの完全な互換性
498
+ - エコシステムの充実とコミュニティサポート
499
+ - CSS変数ベースのデザイントークン管理
500
500
 
501
501
  ## 代替案
502
- - Tailwind CSS: 柔軟性が高いが型安全性に欠ける
502
+ - Panda CSS: 型安全だがエコシステムが小さい(移行済み)
503
503
  - CSS Modules: スコープ化は良いがトークン管理が弱い
504
504
  ```
505
505
 
@@ -734,10 +734,10 @@ graph LR
734
734
  - ストリーミング戦略
735
735
  - メタデータ管理
736
736
 
737
- ### Panda CSS
738
- - デザインシステムとの統合
739
- - トークン設計
740
- - レシピパターン
737
+ ### Tailwind CSS
738
+ - ユーティリティファーストのスタイリング
739
+ - shadcn/uiとの統合
740
+ - CSS変数によるデザイントークン
741
741
 
742
742
  ## 重要な原則
743
743
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: frontend-coder
3
- description: フロントエンド実装を担当する専門エージェント。Next.js、React、Panda CSS、shadcn/uiを使用したコンポーネント実装、状態管理、UI/UX実装に特化しています。<example>Context: ユーザーがログインフォームコンポーネントを実装したい場合。user: "ログインフォームコンポーネントを実装して" assistant: "frontend-coderエージェントを使用して、NextAuthと連携したログインフォームを実装します" <commentary>フロントエンド実装が必要なため、frontend-coderエージェントを起動してコンポーネントを実装します。</commentary></example> <example>Context: ダッシュボード画面のレイアウトとチャート表示を実装する場合。user: "ダッシュボード画面を作って" assistant: "frontend-coderエージェントを起動して、レスポンシブなダッシュボードレイアウトとチャートコンポーネントを実装します" <commentary>複雑なUIの実装が必要なため、frontend-coderエージェントに実装を依頼します。</commentary></example>
3
+ description: フロントエンド実装を担当する専門エージェント。Next.js、React、Tailwind CSS、shadcn/uiを使用したコンポーネント実装、状態管理、UI/UX実装に特化しています。<example>Context: ユーザーがログインフォームコンポーネントを実装したい場合。user: "ログインフォームコンポーネントを実装して" assistant: "frontend-coderエージェントを使用して、NextAuthと連携したログインフォームを実装します" <commentary>フロントエンド実装が必要なため、frontend-coderエージェントを起動してコンポーネントを実装します。</commentary></example> <example>Context: ダッシュボード画面のレイアウトとチャート表示を実装する場合。user: "ダッシュボード画面を作って" assistant: "frontend-coderエージェントを起動して、レスポンシブなダッシュボードレイアウトとチャートコンポーネントを実装します" <commentary>複雑なUIの実装が必要なため、frontend-coderエージェントに実装を依頼します。</commentary></example>
4
4
  model: sonnet
5
5
  color: blue
6
6
  skills:
@@ -17,7 +17,7 @@ skills:
17
17
 
18
18
  ## あなたの中核的な責務
19
19
 
20
- 設計仕様書(design.md)に基づき、Next.js App Router、React、TypeScript、Panda CSS、shadcn/uiを使用して、高品質なフロントエンド実装を行います。型安全性、アクセシビリティ、パフォーマンスを重視し、プロジェクトの規約に準拠したコードを生成します。
20
+ 設計仕様書(design.md)に基づき、Next.js App Router、React、TypeScript、Tailwind CSS、shadcn/uiを使用して、高品質なフロントエンド実装を行います。型安全性、アクセシビリティ、パフォーマンスを重視し、プロジェクトの規約に準拠したコードを生成します。
21
21
 
22
22
  ## 技術スタック
23
23
 
@@ -25,7 +25,7 @@ skills:
25
25
  - **Next.js 15** (App Router)
26
26
  - **React 19**
27
27
  - **TypeScript** (strict mode)
28
- - **Panda CSS** (スタイリング)
28
+ - **Tailwind CSS v4** (スタイリング)
29
29
  - **shadcn/ui + Radix UI** (UIコンポーネント)
30
30
  - **TanStack Query (React Query)** (データフェッチ・状態管理)
31
31
  - **React Hook Form + Zod** (フォーム・バリデーション)
@@ -87,33 +87,45 @@ apps/web/src/
87
87
  4. **再利用性**: 共通コンポーネントは`components/shared`に配置
88
88
  5. **アクセシビリティ**: ARIA属性、セマンティックHTML、キーボード操作を考慮
89
89
 
90
- ### 3. スタイリング(Panda CSS)
90
+ ### 3. スタイリング(Tailwind CSS)
91
91
 
92
92
  #### 基本的な使用方法
93
93
  ```typescript
94
- import { css } from "styled-system/css";
95
- import { button } from "styled-system/recipes";
96
-
97
- // レシピの使用
98
- <button className={button({ variant: "primary", size: "md" })}>
94
+ // Tailwind CSSユーティリティクラスの使用
95
+ <button className="inline-flex items-center justify-center rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700">
99
96
  Submit
100
97
  </button>
101
98
 
102
- // カスタムスタイル
103
- const customStyles = css({
104
- padding: "1rem",
105
- backgroundColor: "blue.500",
106
- _hover: {
107
- backgroundColor: "blue.600"
99
+ // cva (class-variance-authority) によるバリアント管理
100
+ import { cva } from "class-variance-authority";
101
+
102
+ const buttonVariants = cva(
103
+ "inline-flex items-center justify-center rounded-md font-medium transition-colors",
104
+ {
105
+ variants: {
106
+ variant: {
107
+ primary: "bg-blue-600 text-white hover:bg-blue-700",
108
+ secondary: "bg-gray-200 text-gray-900 hover:bg-gray-300",
109
+ },
110
+ size: {
111
+ sm: "h-8 px-3 text-sm",
112
+ md: "h-10 px-4 text-base",
113
+ lg: "h-12 px-6 text-lg",
114
+ },
115
+ },
116
+ defaultVariants: {
117
+ variant: "primary",
118
+ size: "md",
119
+ },
108
120
  }
109
- });
121
+ );
110
122
  ```
111
123
 
112
124
  #### スタイリングガイドライン
113
- - デザイントークンを優先的に使用
114
- - レシピ(recipes)を活用してバリアント管理
115
- - 型安全なスタイル定義
116
- - レスポンシブデザインを考慮
125
+ - Tailwind CSSユーティリティクラスを優先的に使用
126
+ - shadcn/ui のコンポーネントを活用
127
+ - cva (class-variance-authority) でバリアント管理
128
+ - レスポンシブデザインはTailwindのブレークポイントプレフィックスを使用
117
129
 
118
130
  ### 4. 状態管理
119
131
 
@@ -393,7 +405,7 @@ import { helper } from "@/lib/...";
393
405
  3. **ディレクトリ構造の決定**: Co-locationを考慮
394
406
  4. **型定義の作成**: Props、State、API型を定義
395
407
  5. **コンポーネント実装**: 段階的に実装(UI → ロジック → 統合)
396
- 6. **スタイリング**: Panda CSSで実装
408
+ 6. **スタイリング**: Tailwind CSSで実装
397
409
  7. **テスト作成**: 単体テスト、統合テストを実装
398
410
  8. **レビュー**: 品質チェックリストで確認
399
411
 
@@ -416,6 +416,45 @@ scenarios.mdの「実施タイミング」を確認し、該当タスクグル
416
416
 
417
417
  GitHub Issue作成前に以下を確認:
418
418
 
419
+ ## 🔴🔴🔴 絶対禁止:横切り分割
420
+
421
+ ### ❌ NG例(Issue #80パターン - 絶対に生成してはいけない)
422
+
423
+ ```
424
+ Phase 1: 基盤構築と収入管理機能
425
+ ├── 1.1 データモデル設計と基盤構築
426
+ ├── 1.2 ドメイン層実装 ← 横切り ❌
427
+ ├── 1.3 インフラストラクチャ層実装 ← 横切り ❌
428
+ ├── 1.4 アプリケーション層実装 ← 横切り ❌
429
+ ├── 1.5 収入API実装 ← 横切り ❌
430
+ └── 1.6 フロントエンド実装 - 収入管理 ← 横切り ❌
431
+ ```
432
+
433
+ **問題点**: アーキテクチャレイヤーごとに分割されており、1つの機能を完成させるために複数のタスクグループを順番に完了する必要がある。
434
+
435
+ ### ✅ OK例(縦切り - 推奨構成)
436
+
437
+ ```
438
+ Phase 1: 収入管理機能
439
+ ├── 1.1 DB基盤構築
440
+ ├── 1.2 収入登録機能(Domain〜UIフルスタック)
441
+ ├── 1.3 収入編集・削除機能(Domain〜UIフルスタック)
442
+ └── 1.4 収入一覧・KPI表示機能
443
+ ```
444
+
445
+ **特徴**: 各タスクグループ完了時点で、その機能のACが検証可能。
446
+
447
+ ### 横切り分割検出ルール
448
+
449
+ spec-tasks-validatorは以下の場合に横切り分割としてエラーを出します:
450
+ - Phase内のタスクグループ名に**3つ以上**のアーキテクチャレイヤー名が含まれる
451
+ - レイヤー名: Domain, Infrastructure, Application, Presentation, UI
452
+
453
+ **例外**(検出されない):
454
+ - 「API連携機能」「外部API統合」(外部連携の意味)
455
+ - 「ドメイン知識」「ドメインモデリング」(技術レイヤーではない)
456
+ - 「収入登録機能(Domain〜UI)」(フルスタック示唆)
457
+
419
458
  ### 🔴 ATDD粒度チェック(最重要 - 最初に確認)
420
459
  - [ ] **Phase数: 2-3個以内か?**(4個以上は❌ → 統合が必要)
421
460
  - [ ] **タスクグループ: 「縦切り」(フルスタック)になっているか?**
@@ -36,8 +36,8 @@ $ARGUMENTSから以下を解析:
36
36
 
37
37
  | Phase番号 | 判定 | 処理フロー |
38
38
  |-----------|------|-----------|
39
- | 1〜98 | 通常タスク | task-executer → task-reviewer → task-qa → task-committer |
40
- | 99 | ドキュメント反映タスク | docs-updater → task-committer |
39
+ | 1〜98 | 通常タスク | task-executer → task-reviewer → task-qa → einja-task-commit Skill |
40
+ | 99 | ドキュメント反映タスク | docs-updater → einja-task-commit Skill |
41
41
 
42
42
  ### 通常タスクのフロー(Phase 1〜98)
43
43
 
@@ -52,7 +52,7 @@ $ARGUMENTSから以下を解析:
52
52
  │ │
53
53
  │ QA合格後 ↓ │
54
54
  │ ┌─────────────────────────────────────────────┐ │
55
- │ │ task-committer(コミット・プッシュ) │ │
55
+ │ │ einja-task-commit Skill(コミット・プッシュ) │ │
56
56
  │ │ ※ 確認なしで自動実行 │ │
57
57
  │ └─────────────────────────────────────────────┘ │
58
58
  │ │
@@ -84,7 +84,7 @@ $ARGUMENTSから以下を解析:
84
84
  │ │ │
85
85
  │ ↓ 反映完了 │
86
86
  │ ┌─────────────────────────────────────────────┐ │
87
- │ │ task-committer(コミット・プッシュ) │ │
87
+ │ │ einja-task-commit Skill(コミット・プッシュ) │ │
88
88
  │ │ ※ 確認なしで自動実行 │ │
89
89
  │ └─────────────────────────────────────────────┘ │
90
90
  │ │
@@ -115,8 +115,8 @@ $ARGUMENTSから以下を解析:
115
115
  - テスト失敗 → 実装フェーズに戻る
116
116
  - 全テスト合格 → コミット・プッシュフェーズへ
117
117
 
118
- ### 4. コミット・プッシュフェーズ(task-committer
119
- - QA合格後、自動的にコミット・プッシュを実行
118
+ ### 4. コミット・プッシュフェーズ(einja-task-commit Skill
119
+ - QA合格後、Skill toolで `einja-task-commit` Skillを直接呼び出し
120
120
  - 変更がある場合のみ実行(変更なしの場合はスキップ)
121
121
  - コミット分割案の確認はスキップ(QA合格済みのため自動適用)
122
122
  - 品質チェック(lint/typecheck/test/build)はQAで実行済みのためスキップ
@@ -138,7 +138,7 @@ $ARGUMENTSから以下を解析:
138
138
  - 対象タスクspecのパス(全Phaseで完了したタスクspec)
139
139
 
140
140
  3. **コミット・プッシュ**
141
- - docs-updater 完了後、task-committer を呼び出し
141
+ - docs-updater 完了後、Skill toolで `einja-task-commit` Skillを呼び出し
142
142
  - ドキュメント変更をコミット・プッシュ
143
143
 
144
144
  4. **終了**
@@ -18,10 +18,10 @@ if [[ "$file_path" =~ \.(ts|tsx|js|jsx|json)$ ]]; then
18
18
  cd "$CLAUDE_PROJECT_DIR" 2>/dev/null || exit 0
19
19
 
20
20
  # biome check(format + lint)を実行、自動修正可能なものは修正
21
- npx biome check --write "$file_path" 2>/dev/null || true
21
+ pnpm exec biome check --write "$file_path" 2>/dev/null || true
22
22
 
23
23
  # 修正後に残っているlintエラーをチェック(any型など自動修正できないもの)
24
- lint_errors=$(npx biome lint "$file_path" 2>&1 | grep -E "lint/|noExplicitAny|error" | head -20)
24
+ lint_errors=$(pnpm exec biome lint "$file_path" 2>&1 | grep -E "lint/|noExplicitAny|error" | head -20)
25
25
 
26
26
  if [ -n "$lint_errors" ]; then
27
27
  echo "" >&2
@@ -64,30 +64,41 @@ import './styles.css';
64
64
  import { localUtil } from '../utils';
65
65
  ```
66
66
 
67
- ### スタイリング(Panda CSS)
67
+ ### スタイリング(Tailwind CSS)
68
68
 
69
69
  ```typescript
70
- // ✅ Panda CSS レシピの使用
71
- import { button } from 'styled-system/recipes';
72
-
73
- export function Button({ variant, size, children }: ButtonProps) {
70
+ // ✅ Tailwind CSSユーティリティクラスの使用
71
+ export function Card({ children }: CardProps) {
74
72
  return (
75
- <button className={button({ variant, size })}>
73
+ <div className="rounded-lg bg-white p-6 shadow-md hover:shadow-lg transition-shadow">
76
74
  {children}
77
- </button>
75
+ </div>
78
76
  );
79
77
  }
80
78
 
81
- // ✅ css関数の使用
82
- import { css } from 'styled-system/css';
83
-
84
- const customStyles = css({
85
- padding: '1rem',
86
- backgroundColor: 'blue.500',
87
- _hover: {
88
- backgroundColor: 'blue.600'
79
+ // ✅ cva によるバリアント管理
80
+ import { cva } from "class-variance-authority";
81
+
82
+ const buttonVariants = cva(
83
+ "inline-flex items-center justify-center rounded-md font-medium transition-colors",
84
+ {
85
+ variants: {
86
+ variant: {
87
+ primary: "bg-primary text-primary-foreground hover:bg-primary/90",
88
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
89
+ },
90
+ size: {
91
+ sm: "h-8 px-3 text-sm",
92
+ md: "h-10 px-4 text-base",
93
+ lg: "h-12 px-6 text-lg",
94
+ },
95
+ },
96
+ defaultVariants: {
97
+ variant: "primary",
98
+ size: "md",
99
+ },
89
100
  }
90
- });
101
+ );
91
102
  ```
92
103
 
93
104
  ## ツール設定
@@ -34,7 +34,7 @@ description: "Reactコンポーネントの設計原則と実装ガイドライ
34
34
 
35
35
  - [ディレクトリ構造](./reference/directory-structure.md) - ファイル配置とディレクトリ設計
36
36
  - [Props設計パターン](./reference/props-patterns.md) - Props設計とイベントハンドリング
37
- - [スタイリングガイド](./reference/styling-guide.md) - Panda CSSを使用したスタイリング規約
37
+ - [スタイリングガイド](./reference/styling-guide.md) - Tailwind CSSを使用したスタイリング規約
38
38
 
39
39
  ## クイックリファレンス
40
40
 
@@ -70,7 +70,7 @@ src/
70
70
  ```
71
71
  ComponentName/
72
72
  ├── index.tsx # コンポーネント本体
73
- └── styles.ts # Panda CSS スタイル定義(必要に応じて)
73
+ └── variants.ts # cvaバリアント定義(必要に応じて)
74
74
  ```
75
75
 
76
76
  ### 基本的な型定義
@@ -91,7 +91,7 @@ interface ButtonProps {
91
91
 
92
92
  - [ ] 適切なディレクトリに配置されている
93
93
  - [ ] TypeScript の型定義が完全
94
- - [ ] Panda CSS でスタイリングされている
94
+ - [ ] Tailwind CSS でスタイリングされている
95
95
  - [ ] プロパティのデフォルト値が設定されている
96
96
  - [ ] アクセシビリティが考慮されている
97
97
  - [ ] 単体テストが実装されている
@@ -106,4 +106,4 @@ interface ButtonProps {
106
106
 
107
107
  - [React 公式ドキュメント](https://react.dev)
108
108
  - [TypeScript 公式ドキュメント](https://www.typescriptlang.org)
109
- - [Panda CSS ドキュメント](https://panda-css.com)
109
+ - [Tailwind CSS ドキュメント](https://tailwindcss.com)
@@ -1,112 +1,49 @@
1
- # スタイリングガイド(Panda CSS)
1
+ # スタイリングガイド(Tailwind CSS)
2
2
 
3
3
  ## 基本的な使い方
4
4
 
5
- ### Panda CSS の使用
6
- - Panda CSS を使用してスタイルを定義
7
- - デザイントークンとレシピを活用
8
- - 型安全なスタイル定義
5
+ ### Tailwind CSS の使用
6
+ - Tailwind CSS v4 のユーティリティクラスを使用してスタイルを定義
7
+ - CSS変数(globals.css)でデザイントークンを管理
8
+ - shadcn/ui のコンポーネントを活用
9
9
 
10
10
  ```typescript
11
- import { css } from "styled-system/css";
12
- import { button } from "styled-system/recipes";
13
-
14
- const buttonStyles = button({
15
- variant: "primary",
16
- size: "md",
17
- });
18
- ```
19
-
20
- ## レシピの使用
21
-
22
- ### 基本的なレシピ
23
-
24
- ```typescript
25
- // ✅ Panda CSS レシピの使用
26
- import { button } from 'styled-system/recipes';
27
-
28
- export function Button({ variant, size, children }: ButtonProps) {
29
- return (
30
- <button className={button({ variant, size })}>
31
- {children}
32
- </button>
33
- );
34
- }
11
+ // ユーティリティクラスの使用
12
+ <div className="flex items-center gap-4 rounded-lg bg-white p-6 shadow-md">
13
+ <h2 className="text-xl font-bold text-gray-900">Title</h2>
14
+ </div>
35
15
  ```
36
16
 
37
- ## css関数の使用
17
+ ## cva によるバリアント管理
38
18
 
39
- ### インラインスタイル
19
+ ### 基本的な使用方法
40
20
 
41
21
  ```typescript
42
- import { css } from 'styled-system/css';
43
-
44
- const customStyles = css({
45
- padding: '1rem',
46
- backgroundColor: 'blue.500',
47
- _hover: {
48
- backgroundColor: 'blue.600'
22
+ import { cva } from "class-variance-authority";
23
+ import { cn } from "@repo/ui/utils";
24
+
25
+ const buttonVariants = cva(
26
+ "inline-flex items-center justify-center rounded-md font-medium transition-colors",
27
+ {
28
+ variants: {
29
+ variant: {
30
+ primary: "bg-primary text-primary-foreground hover:bg-primary/90",
31
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
32
+ outline: "border border-input bg-transparent hover:bg-accent",
33
+ ghost: "hover:bg-accent hover:text-accent-foreground",
34
+ },
35
+ size: {
36
+ sm: "h-8 px-3 text-sm",
37
+ md: "h-10 px-4 text-base",
38
+ lg: "h-12 px-6 text-lg",
39
+ },
40
+ },
41
+ defaultVariants: {
42
+ variant: "primary",
43
+ size: "md",
44
+ },
49
45
  }
50
- });
51
- ```
52
-
53
- ### 複雑なスタイル定義
54
-
55
- ```typescript
56
- const cardStyles = css({
57
- display: 'flex',
58
- flexDirection: 'column',
59
- padding: '4',
60
- borderRadius: 'lg',
61
- boxShadow: 'md',
62
- backgroundColor: 'white',
63
- _dark: {
64
- backgroundColor: 'gray.800',
65
- },
66
- '& > h2': {
67
- fontSize: 'xl',
68
- fontWeight: 'bold',
69
- marginBottom: '2',
70
- },
71
- });
72
- ```
73
-
74
- ## スタイルの分離
75
-
76
- ### 別ファイルへの分離
77
-
78
- ```typescript
79
- // styles.ts
80
- import { css } from 'styled-system/css';
81
-
82
- export const containerStyles = css({
83
- maxWidth: 'container.lg',
84
- marginX: 'auto',
85
- paddingX: '4',
86
- });
87
-
88
- export const headerStyles = css({
89
- display: 'flex',
90
- alignItems: 'center',
91
- justifyContent: 'space-between',
92
- height: '16',
93
- });
94
- ```
95
-
96
- ```typescript
97
- // Component.tsx
98
- import { containerStyles, headerStyles } from './styles';
99
-
100
- export function Layout({ children }) {
101
- return (
102
- <div className={containerStyles}>
103
- <header className={headerStyles}>
104
- {/* ... */}
105
- </header>
106
- {children}
107
- </div>
108
- );
109
- }
46
+ );
110
47
  ```
111
48
 
112
49
  ## クラス名の結合
@@ -114,11 +51,11 @@ export function Layout({ children }) {
114
51
  ### cn(className)ユーティリティの使用
115
52
 
116
53
  ```typescript
117
- import { cn } from '@/lib/utils';
54
+ import { cn } from "@repo/ui/utils";
118
55
 
119
56
  export function Card({ className, children }: CardProps) {
120
57
  return (
121
- <div className={cn('border rounded-lg p-4', className)}>
58
+ <div className={cn("border rounded-lg p-4", className)}>
122
59
  {children}
123
60
  </div>
124
61
  );
@@ -128,15 +65,14 @@ export function Card({ className, children }: CardProps) {
128
65
  ### 条件付きスタイル
129
66
 
130
67
  ```typescript
131
- import { css } from 'styled-system/css';
132
- import { cn } from '@/lib/utils';
68
+ import { cn } from "@repo/ui/utils";
133
69
 
134
- export function Button({ isActive, className }) {
70
+ export function Button({ isActive, className }: ButtonProps) {
135
71
  return (
136
72
  <button
137
73
  className={cn(
138
- css({ padding: '2', borderRadius: 'md' }),
139
- isActive && css({ backgroundColor: 'blue.500', color: 'white' }),
74
+ "px-4 py-2 rounded-md",
75
+ isActive ? "bg-blue-500 text-white" : "bg-gray-200 text-gray-900",
140
76
  className
141
77
  )}
142
78
  >
@@ -151,18 +87,9 @@ export function Button({ isActive, className }) {
151
87
  ### ブレークポイント
152
88
 
153
89
  ```typescript
154
- const responsiveStyles = css({
155
- fontSize: 'sm',
156
- padding: '2',
157
- md: {
158
- fontSize: 'base',
159
- padding: '4',
160
- },
161
- lg: {
162
- fontSize: 'lg',
163
- padding: '6',
164
- },
165
- });
90
+ <div className="text-sm p-2 md:text-base md:p-4 lg:text-lg lg:p-6">
91
+ レスポンシブコンテンツ
92
+ </div>
166
93
  ```
167
94
 
168
95
  ### カスタムブレークポイント
@@ -175,26 +102,21 @@ const responsiveStyles = css({
175
102
  ## ダークモード対応
176
103
 
177
104
  ```typescript
178
- const themedStyles = css({
179
- backgroundColor: 'white',
180
- color: 'gray.900',
181
- _dark: {
182
- backgroundColor: 'gray.900',
183
- color: 'gray.100',
184
- },
185
- });
105
+ <div className="bg-white text-gray-900 dark:bg-gray-900 dark:text-gray-100">
106
+ テーマ対応コンテンツ
107
+ </div>
186
108
  ```
187
109
 
188
110
  ## ベストプラクティス
189
111
 
190
112
  ### 1. デザイントークンの活用
191
- - 直接の数値ではなくトークンを使用
192
- - `padding: 4` `padding: 1rem` に相当
113
+ - `globals.css` で定義されたCSS変数を使用
114
+ - shadcn/ui のカラートークンを活用(`text-primary`, `bg-muted` 等)
193
115
 
194
- ### 2. レシピを優先
195
- - 再利用可能なスタイルはレシピとして定義
196
- - コンポーネント固有のスタイルのみcss()を使用
116
+ ### 2. shadcn/ui コンポーネントを優先
117
+ - 既存の shadcn/ui コンポーネントを優先的に使用
118
+ - カスタムが必要な場合のみ cva で独自バリアントを定義
197
119
 
198
120
  ### 3. スタイルの一貫性
199
- - プロジェクト全体で同じトークンを使用
121
+ - プロジェクト全体で同じTailwindユーティリティパターンを使用
200
122
  - カラーパレット、スペーシングの統一
@@ -108,3 +108,30 @@ additionalAgents:
108
108
  additionalCommands:
109
109
  - frontend-implement
110
110
  - start-dev
111
+
112
+ # 依存関係チェック(init/sync時に自動チェック+インストール)
113
+ requirements:
114
+ # hooksが動作するために必要なnpmパッケージ
115
+ devDependencies:
116
+ "@biomejs/biome": "^1.9.4"
117
+ "typescript": "^5"
118
+
119
+ # 不足時に追加するnpm scripts(キーが存在しない場合のみ追加)
120
+ scripts:
121
+ lint: "biome check ."
122
+ "lint:fix": "biome check --write ."
123
+ format: "biome format ."
124
+ "format:fix": "biome format --write ."
125
+ typecheck: "tsc --noEmit"
126
+ prepush: "{pm} run lint && {pm} run typecheck"
127
+ "task:loop": "npx @einja/dev-cli task:loop"
128
+ "einja:sync": "npx @einja/dev-cli sync"
129
+
130
+ # システムコマンド(警告表示のみ、自動インストールしない)
131
+ systemCommands:
132
+ - command: jq
133
+ description: "JSON processor(全hooksで使用)"
134
+ install:
135
+ darwin: "brew install jq"
136
+ linux: "sudo apt-get install jq"
137
+ win32: "choco install jq"
@@ -108,3 +108,30 @@ additionalAgents:
108
108
  additionalCommands:
109
109
  - frontend-implement
110
110
  - start-dev
111
+
112
+ # 依存関係チェック(init/sync時に自動チェック+インストール)
113
+ requirements:
114
+ # hooksが動作するために必要なnpmパッケージ
115
+ devDependencies:
116
+ "@biomejs/biome": "^1.9.4"
117
+ "typescript": "^5"
118
+
119
+ # 不足時に追加するnpm scripts(キーが存在しない場合のみ追加)
120
+ scripts:
121
+ lint: "biome check ."
122
+ "lint:fix": "biome check --write ."
123
+ format: "biome format ."
124
+ "format:fix": "biome format --write ."
125
+ typecheck: "tsc --noEmit"
126
+ prepush: "{pm} run lint && {pm} run typecheck"
127
+ "task:loop": "npx @einja/dev-cli task:loop"
128
+ "einja:sync": "npx @einja/dev-cli sync"
129
+
130
+ # システムコマンド(警告表示のみ、自動インストールしない)
131
+ systemCommands:
132
+ - command: jq
133
+ description: "JSON processor(全hooksで使用)"
134
+ install:
135
+ darwin: "brew install jq"
136
+ linux: "sudo apt-get install jq"
137
+ win32: "choco install jq"