@tungvivas/angular-vibe-kit 0.1.0 → 0.3.0

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.
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: clarify-request
3
+ description: >
4
+ Normalize a vague or underspecified request into a standard brief BEFORE acting on it.
5
+ Use when the user asks for work with missing context — e.g. "fix bug A" (no repro/error),
6
+ "thêm tính năng B" / "add feature B" (no scope), "sửa cho tôi", "thêm trường X vào component Y"
7
+ (no data type / validation / API info), "kiểm tra hiệu suất" / "check performance" (no target or
8
+ symptom), "làm cho tôi cái này" — any coding request where the target, expected behavior, scope,
9
+ or done-criteria are unclear. Do NOT use when the request is already specific, when it is a pure
10
+ question (use explain), or when already inside a /plan, /dev-cycle, or /new-feature flow (those
11
+ have their own clarify phases).
12
+ allowed-tools:
13
+ - Read
14
+ - Glob
15
+ - Grep
16
+ ---
17
+
18
+ # Clarify Request (prompt normalizer)
19
+
20
+ Terse requests like "fix bug A" or "add field X" waste a round-trip when acted on blindly: the
21
+ wrong file gets changed, the wrong shape gets assumed, the fix misses the actual symptom. This
22
+ skill turns such a request into a **standard brief** — filled from the project first, from the
23
+ user only for what the project cannot answer — then routes it to the right workflow.
24
+
25
+ ## When NOT to trigger (check first)
26
+
27
+ Skip this skill entirely when:
28
+ - The request already names the exact target AND the expected outcome AND its constraints.
29
+ - It is a pure question ("why...", "explain...", "how does...") → the **explain** skill owns that.
30
+ - You are already inside `/plan`, `/dev-cycle`, `/new-feature`, or `/init` — their own phases
31
+ (Phase B, Phase 0, Step 1, Stage 1) do the clarifying; do not stack a second layer.
32
+ - The user explicitly says to just do it ("cứ làm đi", "just do it", "no questions") — then fill
33
+ gaps from the project, state your assumptions in one line each, and proceed.
34
+
35
+ ## Step 1 — Classify the intent
36
+
37
+ | Intent | Signals |
38
+ |--------|---------|
39
+ | **bug** | "fix", "lỗi", "bug", "không chạy", "sai", an error message pasted |
40
+ | **feature** | "thêm tính năng", "add feature", an SRS/spec mentioned, a new screen/module |
41
+ | **small-edit** | "thêm trường/cột", "đổi label", "ẩn nút", a single component/file named |
42
+ | **review** | "kiểm tra", "review", "tối ưu chưa", "hiệu suất", "check" |
43
+
44
+ ## Step 2 — Fill from the project BEFORE asking anything
45
+
46
+ Never ask what the project already answers. Look here first:
47
+
48
+ | Missing info | Where to look |
49
+ |--------------|---------------|
50
+ | Which file/component is "X" | `Glob`/`Grep` for the name; feature folders; `docs/ARCHITECTURE.md` |
51
+ | Does the API return that field | `docs/API_CONTRACT.md`, the feature's `services/*.ts` + `models/*.ts` |
52
+ | Which wrapper to use for new UI | `docs/DESIGN_SYSTEM.md` → Wrapped Components table |
53
+ | Project conventions / do-not-touch | `.claude/rules/project-rules.md` (Precedence, Coexistence) |
54
+ | What was recently worked on (bug context) | `docs/PROJECT-STATUS.md`, `git log` if permitted, feature `CONTEXT.md` |
55
+ | Version idioms for the change | `.claude/angular-practices/` |
56
+
57
+ ## Step 3 — Ask ONE batched set of what's still missing
58
+
59
+ Ask only the unfilled fields, all in one message, multiple-choice where possible.
60
+ Required fields by intent:
61
+
62
+ **Common (all intents):** exact target (file/component/feature) · current vs. expected behavior ·
63
+ scope + constraints (what must NOT be touched) · done-criteria (how we know it's right).
64
+
65
+ | Intent | Additional required fields |
66
+ |--------|---------------------------|
67
+ | **bug** | repro steps · error message/log · since when (after which change?) · which screen/module |
68
+ | **feature** | SRS or description · screens in scope · endpoints (already in API_CONTRACT?) · relation to existing features · permissions |
69
+ | **small-edit** | data type of the new field · validation rules · where it shows (form / table / both) · does the API already return it |
70
+ | **review** | which page/component · concrete symptom (slow on load? scroll? typing?) · expected measure |
71
+
72
+ If an answer reveals a new ambiguity, ask that one follow-up — don't guess silently, don't drip
73
+ every question one at a time.
74
+
75
+ ## Step 4 — Print the brief, then route
76
+
77
+ Print the normalized brief so the user can correct it at a glance:
78
+
79
+ ```markdown
80
+ 📋 **Brief**
81
+ - Type: <bug | feature | small-edit | review>
82
+ - Target: <exact file/component/feature path>
83
+ - Current → Expected: <one line>
84
+ - Scope: <in> / NOT: <out>
85
+ - Done when: <criteria>
86
+ - Filled from project: <what you found and where>
87
+ - From user: <their answers>
88
+ ```
89
+
90
+ Then route — do not reinvent workflows this kit already has:
91
+
92
+ | Type | Route |
93
+ |------|-------|
94
+ | **feature** (multi-screen / multi-endpoint) | Suggest `/plan` → `/dev-cycle`; small single-screen feature may go straight to `/new-feature` |
95
+ | **bug** (non-trivial / runtime) | Dispatch the **angular-debugger** agent; trivial one-liners fix directly |
96
+ | **small-edit** | Do it directly, following the brief + `.claude/angular-practices/` + wrapper priority |
97
+ | **review** | Run `/review-pr` inline, or dispatch **angular-reviewer** for a large diff; performance-scoped review states the symptom + target from the brief |
98
+
99
+ One confirmation, not two: if the brief is complete and the route is obvious, state both and
100
+ proceed — don't ask "is the brief OK?" and then "should I start?" as separate gates.
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: component-wrapper-priority
3
+ description: Use before importing a raw UI-library component (p-dropdown, mat-select, nz-*, ng-bootstrap, etc.) when implementing or reviewing a feature — enforces using this project's shared wrapper components from docs/DESIGN_SYSTEM.md instead of bypassing them with a direct library import.
4
+ ---
5
+
6
+ # Component Wrapper Priority
7
+
8
+ Before you write a template or import that uses a UI-library component directly, check whether
9
+ the project already has a **shared wrapper** for that need. Bypassing an existing wrapper with a
10
+ raw library import is a defect, not a shortcut.
11
+
12
+ ## Decision tree
13
+
14
+ 1. **Open `docs/DESIGN_SYSTEM.md` → the Wrapped Components table.**
15
+ 2. **A wrapper exists for the need? → USE IT.** Never bypass:
16
+ - Select / dropdown → use the project wrapper (e.g. `<app-select>`), not raw `p-dropdown` / `mat-select` / `nz-select`.
17
+ - Date input → use the wrapper (e.g. `<app-date-picker>`), not raw `p-calendar` / `mat-datepicker`.
18
+ - Dialog / modal, table, form field, button — use the wrapper if one is listed, not the raw library component.
19
+ - Shared UI states (spinner, empty, error) → use the shared component, don't re-implement inline.
20
+ 3. **No wrapper exists? → use the library component directly AND log a warning:**
21
+ ```
22
+ > ⚠️ No shared wrapper for <X> — using the library directly. Consider adding one to shared/components/.
23
+ ```
24
+ 4. **Unsure whether one exists? → ASK** the team before writing the code
25
+ (search the project's wrapper folder — `shared/components/`, `ui/`, `common/` — first).
26
+
27
+ ## Priority order (must follow)
28
+
29
+ 1. **Wrapper in `shared/components/`** (or the folder recorded in DESIGN_SYSTEM.md) — ALWAYS use it when one exists.
30
+ 2. **Library component direct** — only when no wrapper exists; import the library type + log the warning above.
31
+ 3. **Custom build from scratch** — only when the library has no equivalent.
32
+
33
+ ## Enforcement
34
+
35
+ This rule is enforced by `/review-pr` and the `angular-reviewer` agent: a raw library import when a
36
+ wrapper exists, in **new code**, is a 🔴 BLOCKER. Legacy modules (see Coexistence Strategy in
37
+ `.claude/rules/project-rules.md`) are exempt — do not refactor them just to satisfy this rule.
38
+ Works for any UI library — PrimeNG, Angular Material, ng-zorro, ng-bootstrap, or custom.
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: explain
3
+ description: >
4
+ Explain Angular/TypeScript code, architecture, data flows, or technical decisions for THIS project.
5
+ Use when the user says "explain", "giải thích", "how does this work", "what is", "tại sao", "why",
6
+ "làm thế nào", "hoạt động ra sao", or wants to understand a file, component, service, module, pattern,
7
+ routing, state management, HTTP flow, or an architectural decision.
8
+ argument-hint: "[code|concept|flow|why] [target]"
9
+ allowed-tools:
10
+ - Read
11
+ - Glob
12
+ - Grep
13
+ ---
14
+
15
+ # Explain Code — Angular
16
+
17
+ Explain code, architecture, and technical decisions for the Angular project you are in. This skill is
18
+ **project-agnostic**: it never assumes a version, UI library, state-management approach, or folder
19
+ layout — it reads those from the project's own docs and source before explaining.
20
+
21
+ > **Scope:** a specific file / concept / flow / decision, explained **in-thread**. To map a WHOLE
22
+ > unfamiliar repo (structure inventory, entry points, traced execution paths), use the
23
+ > `angular-onboarding` agent instead — it runs in an isolated context built for repo-wide mapping.
24
+
25
+ ## Language
26
+ Explain in the project's configured language — read `language` from the `## Commit Convention` block in
27
+ `.claude/rules/project-rules.md`. **Default: Vietnamese** (technical terms kept in English), e.g.
28
+ "Component này dùng `@Input()` để nhận data từ parent".
29
+
30
+ ## Load context first (never assume)
31
+ **Always read the project's docs before explaining** — they are the source of truth for how THIS
32
+ codebase works:
33
+ - `CLAUDE.md` — stack summary + entry points + links.
34
+ - `.claude/rules/project-rules.md` — folder structure, naming, conventions, Precedence.
35
+ - `docs/ARCHITECTURE.md` — layers, routing, state approach, HTTP/interceptor flow, auth.
36
+ - `docs/DESIGN_SYSTEM.md` — UI library + shared/wrapped components.
37
+ - `.claude/angular-practices/<version>.md` — the version-matched idioms.
38
+
39
+ Do NOT assume Angular version, UI library (Material/PrimeNG/ng-zorro/…), state management (NgRx/Signals/
40
+ BehaviorSubject/…), base-service patterns, routing strategy, or interceptors. Take them from the docs +
41
+ the actual code.
42
+
43
+ ## Workflow
44
+
45
+ ### 1. Determine mode
46
+ If the user didn't say, infer intent:
47
+ - Asks about a specific file → `code`
48
+ - Asks about a pattern/concept (lazy loading, a state pattern, a base service…) → `concept`
49
+ - Asks "how", "luồng", "flow" → `flow`
50
+ - Asks "why", "tại sao", "lý do" → `why`
51
+
52
+ If still unclear, ask: "Bạn muốn giải thích: code (file cụ thể), concept (khái niệm), flow (luồng xử lý),
53
+ hay why (lý do thiết kế)?"
54
+
55
+ ### 2. Read order by mode
56
+ | Mode | Read in this order |
57
+ |------|--------------------|
58
+ | `code` | CLAUDE.md → project-rules (Folder Structure) → the target file → related files (service/model) |
59
+ | `concept` | CLAUDE.md + ARCHITECTURE.md → a **real example** of the concept from this codebase |
60
+ | `flow` | CLAUDE.md → ARCHITECTURE.md (HTTP/interceptor flow) → component → service → interceptor/state |
61
+ | `why` | ARCHITECTURE.md + project-rules → the relevant file → `docs/decisions/` (ADRs) if present |
62
+
63
+ ### 3. Find the source file
64
+ If given only a name (no path), use `Glob` (e.g. `**/*{name}*`) to locate it. Use the Folder Structure
65
+ in `project-rules.md` / `docs/ARCHITECTURE.md` to navigate — do not rely on a memorized tree.
66
+
67
+ ### 4. Use the templates
68
+ Read `./templates/vi.md` and pick the skeleton for the mode. The templates are structure-only —
69
+ fill every placeholder with facts read from THIS project's code (its UI library, its HTTP/service
70
+ pattern, its interceptors, its state approach), not assumptions.
71
+
72
+ ## Rules
73
+ - **Read real files, never guess** — verify the code still exists and matches before explaining.
74
+ - **Docs are the source of truth** — patterns/conventions come from `project-rules.md` + `docs/`.
75
+ - **Detail level** — beginners: from basics with everyday analogies; intermediate (default): patterns +
76
+ best practices; advanced: trade-offs + architectural decisions. Adjust to the question.
77
+ - **Structure**: (1) short summary (1–2 sentences) → (2) detailed explanation with real code → (3) key
78
+ takeaways → (4) links to related parts of the system.
79
+
80
+ ## Error handling
81
+ | Situation | Handling |
82
+ |-----------|----------|
83
+ | Mode unclear | Infer from the question; if still unclear, ask |
84
+ | File not found | `Glob` with `**/*{name}*` |
85
+ | File too large | Read in parts (offset/limit), focus on the relevant section |
86
+ | Need more context | CLAUDE.md → ARCHITECTURE.md → service → model → component, in order |
87
+ | Concept unclear | Find a real example in the codebase to illustrate |
88
+
89
+ ## Examples
90
+ ```
91
+ User: "Giải thích user-list.component.ts"
92
+ → Mode: code → read CLAUDE.md + project-rules → the component (+ its service/model) → explain structure, data flow
93
+
94
+ User: "State management pattern ở đây là gì?"
95
+ → Mode: concept → read ARCHITECTURE.md (state approach) → a real store/service example → explain the pattern used HERE
96
+
97
+ User: "Luồng đăng nhập chạy thế nào?"
98
+ → Mode: flow → ARCHITECTURE.md (HTTP/interceptor) → login component → auth service → interceptor → render
99
+
100
+ User: "Tại sao module này lazy-load?"
101
+ → Mode: why → ARCHITECTURE.md (routing) + the route config → explain reasons + trade-offs
102
+ ```
@@ -0,0 +1,184 @@
1
+ # Templates Tiếng Việt — Giải thích code Angular (project-agnostic)
2
+
3
+ > Đây là **khung cấu trúc**, không gắn với dự án cụ thể. Điền mọi `{{...}}` bằng thông tin đọc được
4
+ > từ code thật của dự án (version, UI library, state approach, HTTP/service pattern, interceptors...).
5
+ > KHÔNG giả định PrimeNG/Material, NgRx/Signals, hay BaseService — lấy từ `docs/ARCHITECTURE.md`,
6
+ > `docs/DESIGN_SYSTEM.md`, `.claude/rules/project-rules.md` và code.
7
+
8
+ ## Giải thích Code
9
+
10
+ ```markdown
11
+ ## 📁 File: {filename}
12
+
13
+ ### Mục đích
14
+ [1-2 câu: component/service này dùng để làm gì trong hệ thống]
15
+
16
+ ### Phân tích
17
+
18
+ **Decorator / Metadata**
19
+ - `@Component`: selector, templateUrl, styleUrls, `changeDetection` (nếu có)
20
+ - Standalone hay khai báo trong NgModule? → theo đúng cách dự án dùng ({{standalone|NgModule}})
21
+ - `@Injectable`: `providedIn: 'root'` hay scoped
22
+
23
+ **Module / Feature Context** *(nếu có)*
24
+ - Thuộc feature/module: [tên — theo Folder Structure trong project-rules.md]
25
+ - Lazy-loaded: [có/không, qua route nào]
26
+ - Route path: [nếu có]
27
+
28
+ **Inputs / Outputs** *(nếu có)*
29
+ - `@Input()` / `input()`: [ý nghĩa, kiểu, ai truyền vào]
30
+ - `@Output()` / `output()`: [event gì, emit khi nào, payload]
31
+
32
+ **Dependencies (DI)**
33
+ - [Liệt kê service/token được inject — theo đúng pattern DI dự án dùng: `inject()` hay constructor]
34
+ - [Nếu dự án có base-service/abstraction dùng chung → nêu tên thật đọc từ code, không giả định]
35
+
36
+ **Properties chính**
37
+ - `propertyX: Type`: [vai trò, khởi tạo]
38
+
39
+ **Lifecycle Hooks**
40
+ - `ngOnInit()` / `ngOnDestroy()` / khác: [làm gì; teardown subscription thế nào]
41
+
42
+ **Methods quan trọng**
43
+ - [Tên method → nhiệm vụ, luồng xử lý]
44
+
45
+ **Form Handling** *(nếu có)*
46
+ - [Reactive/Template-driven — theo dự án; validators; luồng submit]
47
+
48
+ **UI Components** *(nếu có)*
49
+ - [Component của {{UI library dự án đang dùng}} hoặc wrapper trong shared/ — đọc từ DESIGN_SYSTEM.md]
50
+
51
+ **State Management** *(nếu có)*
52
+ - [Cách quản lý state THẬT của dự án: {{Signals | NgRx | BehaviorSubject | service}} — không giả định]
53
+
54
+ ### 💡 Điểm cần nhớ
55
+ - [Key point về business logic / technical / edge cases]
56
+
57
+ ### 🔗 Liên kết
58
+ - **Gọi service**: [service + methods]
59
+ - **Được dùng bởi**: [parent component / route]
60
+ - **Related files**: [model, service, routing]
61
+ ```
62
+
63
+ ---
64
+
65
+ ## Giải thích Concept
66
+
67
+ ```markdown
68
+ ## 🎯 {Tên Concept}
69
+
70
+ ### Là gì?
71
+ [2-3 câu giải thích đơn giản]
72
+
73
+ ### Ví dụ đời thường
74
+ [So sánh với thứ quen thuộc để dễ hiểu]
75
+
76
+ ### Trong dự án này
77
+ **Vị trí**: `[đường dẫn file thật]`
78
+ ```typescript
79
+ // Ví dụ code THẬT trích từ dự án (không bịa)
80
+ ```
81
+ **Cách dùng**:
82
+ ```typescript
83
+ // Ví dụ sử dụng trong component/service của dự án
84
+ ```
85
+
86
+ ### Tại sao dùng?
87
+ - **Lý do 1..n**: [giải thích]
88
+
89
+ ### Không dùng thì sao?
90
+ - ❌ [Vấn đề sẽ gặp]
91
+
92
+ ### So sánh với cách khác
93
+ | Cách này | Cách khác | Khi nào dùng |
94
+ |----------|-----------|--------------|
95
+ | … | … | … |
96
+
97
+ ### 📚 Tìm hiểu thêm
98
+ - Angular docs / docs của {{UI library / state library dự án dùng}} / related concepts
99
+ ```
100
+
101
+ ---
102
+
103
+ ## Giải thích Flow
104
+
105
+ ```markdown
106
+ ## 🔄 Flow: {Tên tính năng}
107
+
108
+ ### Tổng quan
109
+ [1-2 câu: flow từ đâu đến đâu]
110
+
111
+ ### Sơ đồ
112
+ ```
113
+ [User thao tác]
114
+
115
+
116
+ [Component] ──── bắt event, validate (nếu có), gọi service
117
+
118
+
119
+ [Service / lớp gọi API của dự án] ── chuẩn bị payload, gọi HTTP
120
+
121
+
122
+ [HTTP Interceptor chain của dự án] ── {{liệt kê interceptor THẬT: auth, error, loading...}}
123
+
124
+
125
+ [Backend API]
126
+
127
+
128
+ [Response] ──► [Service] ──► [Component] ── handle success/error
129
+
130
+
131
+ [Template re-render]
132
+ ```
133
+
134
+ ### Chi tiết từng bước
135
+ **Bước 1: User thao tác** — [event handler]
136
+ **Bước 2: Component xử lý** — [validate, gọi service]
137
+ ```typescript
138
+ // code thật/minh họa theo dự án
139
+ ```
140
+ **Bước 3: Service gọi API** — [method, endpoint]
141
+ **Bước 4: Interceptors** — [đọc từ ARCHITECTURE.md: những interceptor dự án thực sự có]
142
+ **Bước 5: Nhận response** — [success/error handling]
143
+ **Bước 6: UI update** — [change detection / component cập nhật]
144
+
145
+ ### 🔍 Mẹo debug
146
+ - Network tab: URL/headers/payload/status đúng không?
147
+ - Console: lỗi từ interceptor? token? validation?
148
+ - Environment/config: đọc từ nơi dự án lưu config (theo ARCHITECTURE.md)
149
+
150
+ ### Common issues
151
+ - ❌ [liệt kê theo pattern thật của dự án]
152
+ ```
153
+
154
+ ---
155
+
156
+ ## Giải thích Why
157
+
158
+ ```markdown
159
+ ## ❓ Tại sao: {Câu hỏi}
160
+
161
+ ### Trả lời ngắn
162
+ [1-2 câu trả lời trực tiếp]
163
+
164
+ ### Giải thích chi tiết
165
+ - **Lý do 1..n**: [giải thích + ví dụ code nếu cần]
166
+
167
+ ### Nếu không làm vậy?
168
+ - ❌ [Vấn đề + impact + mức độ]
169
+
170
+ ### Đánh đổi (Trade-offs)
171
+ | Ưu điểm ✅ | Nhược điểm ❌ |
172
+ |-----------|--------------|
173
+ | … | … |
174
+
175
+ ### Có cách khác không?
176
+ - **Cách 1..n**: [mô tả, khi nào dùng]
177
+
178
+ ### Context trong dự án này
179
+ - [Đọc `docs/decisions/` (ADR) nếu có; nếu không, nêu rõ là suy luận từ code]
180
+
181
+ ### 📌 Kết luận
182
+ **TL;DR**: [2-3 câu]
183
+ **Key takeaways**: 💡 [điểm quan trọng]
184
+ ```
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: git-commit
3
+ description: >
4
+ Write conventional commit messages for this project.
5
+ Use when the user says "commit", "git commit", "save changes",
6
+ "tạo commit", "viết commit message", or finished a task and wants to commit.
7
+ argument-hint: "[type] [message]"
8
+ allowed-tools:
9
+ - Bash
10
+ - Read
11
+ ---
12
+
13
+ # Commit Message Generator
14
+
15
+ Generates conventional commit messages that follow **this project's** convention. It is
16
+ project-agnostic: the prefix, language, and scope source are read at runtime from the project's
17
+ config — nothing is hardcoded.
18
+
19
+ ## Read the project's convention first
20
+ Read the `## Commit Convention` block in `.claude/rules/project-rules.md` (filled by `/init`). It
21
+ defines:
22
+ - **Prefix** — an optional string prepended before `<type>` (e.g. `VIVAS_`). **Default: none.**
23
+ - **Language** — the language for subject/body. **Default: `vi` (Vietnamese).**
24
+ - **Scope source** — the folder level scope is derived from (see below).
25
+
26
+ If that block is missing, fall back to: no prefix, language `vi`, scope derived dynamically.
27
+ Full rules and type/subject conventions: `.claude/skills/git-commit/references/conventions.md`.
28
+ (The `angular-git-workflow` agent reads the same block — keep them consistent.)
29
+
30
+ ## Format
31
+ ```
32
+ <prefix><type>(<scope>): <subject>
33
+ ```
34
+ - `<prefix>` from project-rules (default empty → standard conventional commit).
35
+ - `<type>`: feat, fix, refactor, docs, style, test, chore, perf, ci, build, revert.
36
+ - `<scope>`: derived from changed paths (see Scope Detection); omit if changes span multiple modules.
37
+ - `<subject>`: in the configured language, imperative, ≤50 chars, no trailing period.
38
+
39
+ ## Usage
40
+ ```
41
+ /commit → Auto-detect type + scope from staged changes
42
+ /commit feat add login → Quick commit with type + message
43
+ /commit --amend → Amend last commit message
44
+ ```
45
+
46
+ ## Workflow
47
+ 1. **Stage** (if nothing staged): `git add .`
48
+ 2. **Inspect**: `git diff --staged --stat` then `git diff --staged`.
49
+ 3. **Read convention**: the `## Commit Convention` block (prefix/language/scope source) +
50
+ `references/conventions.md`.
51
+ 4. **Detect type** from changed files/content (see conventions.md table).
52
+ 5. **Derive scope** (see below).
53
+ 6. **Generate message** → show a preview:
54
+ ```
55
+ 📝 COMMIT PREVIEW
56
+
57
+ <prefix><type>(<scope>): <subject in configured language>
58
+
59
+ - <body bullet 1>
60
+ - <body bullet 2>
61
+
62
+ Staged files (N):
63
+ M <path>
64
+ A <path>
65
+
66
+ Commit? (yes/no/edit)
67
+ ```
68
+ 7. **Execute after confirm**: `yes` → `git commit -m "..."`; `edit` → user tweaks then commit;
69
+ `no` → abort (keep staged).
70
+
71
+ ## Scope Detection (dynamic — no hardcoded table)
72
+ Derive `<scope>` from the staged file paths + the project's **Folder Structure** in
73
+ `.claude/rules/project-rules.md` / `docs/ARCHITECTURE.md`:
74
+ - Scope = the top-level feature/module folder the changed files live in (e.g. under
75
+ `src/app/features/<scope>/…` or `src/app/modules/<scope>/…` — use the project's actual layout).
76
+ - Shared/cross-cutting folders map to their own scope (e.g. `shared`, `core`, `layout`).
77
+ - Changes spanning multiple modules → **omit the scope**.
78
+
79
+ ## Quick Commit
80
+ Skip the preview for trivial changes:
81
+ ```
82
+ /commit fix typo in readme
83
+
84
+ git commit -m "<prefix>fix: typo in readme"
85
+ ```
86
+
87
+ ## Rules
88
+ - **Follow the project's convention** — prefix, language, and scope come from project-rules; never
89
+ hardcode a company prefix or module list here.
90
+ - **Language** — subject/body in the configured language (default Vietnamese; imperative: "thêm",
91
+ "sửa", "cập nhật", "xóa").
92
+ - **Lowercase** type and scope. **No trailing period.** **50/72 rule** (subject ≤50, body wrap 72).
93
+ - **No Co-Authored-By** trailer.
94
+
95
+ ## Amend Last Commit
96
+ ```bash
97
+ git commit --amend -m "<prefix><type>(<scope>): new message"
98
+ ```
99
+
100
+ ## Error Handling
101
+ | Issue | Action |
102
+ |-------|--------|
103
+ | No staged changes | Stage with `git add .` or ask the user what to stage |
104
+ | No changes at all | Report "nothing to commit" |
105
+ | User declines | Abort, keep staged |
106
+ | Convention block missing | Fall back to: no prefix, language vi, dynamic scope |
107
+ | Git error | Show error, suggest fix |
@@ -0,0 +1,100 @@
1
+ # Commit Conventions
2
+
3
+ > **This project's prefix, language, and scope source come from the `## Commit Convention` block in
4
+ > `.claude/rules/project-rules.md`** (filled by `/init`). This file defines the generic rules; the
5
+ > project block supplies the project-specific values. Defaults if the block is missing: no prefix,
6
+ > language `vi`, scope derived dynamically from changed paths.
7
+
8
+ ## Format
9
+
10
+ ```
11
+ <prefix><type>(<scope>): <subject>
12
+
13
+ <body>
14
+
15
+ <footer>
16
+ ```
17
+
18
+ - `<prefix>` — optional, from project-rules (e.g. `VIVAS_`). Default: empty.
19
+ - `<subject>`/`<body>`/`<footer>` — in the configured `language` (default Vietnamese).
20
+
21
+ ## Types
22
+
23
+ | Type | When to use | Example change |
24
+ |------|-------------|----------------|
25
+ | `feat` | New feature | New component, endpoint, capability |
26
+ | `fix` | Bug fix | Crash, wrong logic, edge case |
27
+ | `refactor` | Restructure (no behavior change) | Rename, extract, reorganize |
28
+ | `docs` | Documentation | README, comments, CLAUDE.md |
29
+ | `style` | Formatting (no code change) | Lint fixes, whitespace |
30
+ | `test` | Add/update tests | `*.spec.ts` |
31
+ | `chore` | Maintenance | Dependencies, configs, scripts, environments |
32
+ | `perf` | Performance | Optimize query, reduce bundle size |
33
+ | `ci` | CI/CD | GitHub Actions, Docker |
34
+ | `build` | Build system | `angular.json`, `tsconfig`, webpack |
35
+ | `revert` | Revert a commit | Undo a previous commit |
36
+
37
+ ## Auto-detect Type
38
+
39
+ | Changed files / content | Detected type |
40
+ |-------------------------|---------------|
41
+ | `*.spec.ts` only | `test` |
42
+ | `*.md` only | `docs` |
43
+ | `package.json`, `tsconfig*.json`, `.eslintrc*` only | `chore` |
44
+ | `src/environments/*.ts` only | `chore` |
45
+ | `angular.json`, `webpack*.js` | `build` |
46
+ | New files + new exports | `feat` |
47
+ | Fixed logic / error handling in existing files | `fix` |
48
+ | Renamed / moved files, no logic change | `refactor` |
49
+
50
+ ## Scope Detection (dynamic — derive, don't hardcode)
51
+
52
+ Derive `<scope>` from the staged file paths + the project's **Folder Structure** in
53
+ `.claude/rules/project-rules.md` / `docs/ARCHITECTURE.md`:
54
+
55
+ - Scope = the top-level feature/module folder the changed files live in — e.g. under
56
+ `src/app/features/<scope>/…` or `src/app/modules/<scope>/…` (use the project's actual layout).
57
+ - Shared / cross-cutting folders map to their own scope name (e.g. `shared`, `core`, `layout`).
58
+ - Changes spanning multiple modules → **omit the scope**.
59
+
60
+ ## Subject Rules
61
+ - Prepend the configured prefix (if any) before `<type>`.
62
+ - Configured language, concise and clear.
63
+ - No trailing period.
64
+ - ≤ 50 characters.
65
+ - Imperative mood (VI: "thêm", "sửa", "cập nhật", "xóa" / EN: "add", "fix", "update", "remove").
66
+
67
+ ## Body Rules
68
+ - Separate from subject with a blank line.
69
+ - Explain WHAT and WHY, not HOW.
70
+ - Bullet points for multiple changes.
71
+ - Wrap at 72 characters.
72
+
73
+ ## Examples
74
+
75
+ > These show the *shape*. The prefix depends on the project's config — shown both ways.
76
+
77
+ ### No prefix (default conventional commit)
78
+ ```
79
+ fix(users): sửa lỗi null khi load danh sách người dùng
80
+ ```
81
+
82
+ ### With a configured prefix (e.g. project sets Prefix: VIVAS_)
83
+ ```
84
+ VIVAS_feat(reports): thêm chức năng xuất báo cáo PDF
85
+
86
+ - Thêm report-export component
87
+ - Hỗ trợ filter theo thời gian và khu vực
88
+ ```
89
+
90
+ ### Multiple modules → omit scope
91
+ ```
92
+ fix: sửa giao diện và validate ở nhiều module
93
+ ```
94
+
95
+ ### Breaking change
96
+ ```
97
+ feat(api)!: thay đổi cấu trúc response
98
+
99
+ BREAKING CHANGE: Response được bọc trong { success, data, error }.
100
+ ```
@@ -21,7 +21,28 @@
21
21
  | ErrorMessage | Error display |
22
22
  | ConfirmDialog | Confirmation modal |
23
23
 
24
+ ## Wrapped Components
25
+ > If this section is present and non-empty, ALWAYS prefer the wrapper over the
26
+ > raw library component. Add a row only when a shared wrapper exists.
27
+ > `/init` auto-detects these; the team confirms in Stage 1.
28
+
29
+ | Need (library component) | Use this wrapper | Custom additions | Location |
30
+ |---------------------------|------------------|------------------|----------|
31
+ | `{{p-dropdown}}` | `{{<app-select>}}` | {{Loading state, error display, label slot}} | `{{shared/components/select/}}` |
32
+ | `{{p-calendar}}` | `{{<app-date-picker>}}` | {{Min/max date, locale, disabled dates}} | `{{shared/components/date-picker/}}` |
33
+
34
+ ### Priority Order (must follow)
35
+ 1. **Wrapper in `shared/components/`** (or `ui/`, `common/`, `components/` — record actual folder) — ALWAYS use it when one exists
36
+ 2. **Library component direct** — use only when no wrapper exists; import the library type
37
+ 3. **Custom build from scratch** — only when the library has no equivalent
38
+
39
+ ### When you cannot find a wrapper
40
+ - Search the project's wrapper folder first (recorded above)
41
+ - If still unsure, ASK the team: "Có wrapper nào tôi chưa biết không?"
42
+ - NEVER silently import the library and bypass the wrapper
43
+
24
44
  ## Rules
25
45
  - Every page must handle loading / error / empty states
26
46
  - Use design tokens, not hardcoded values
27
47
  - New shared UI goes in `shared/` only if used by 2+ features
48
+ - If a wrapped component exists for a UI need, you MUST use the wrapper — never the raw library component directly