@educa-corp/sdd-framework 0.2.1 → 0.2.3
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/bin/index.js +59 -29
- package/commands/debug.md +21 -8
- package/commands/define-product.md +21 -8
- package/commands/dev-gen-test.md +21 -8
- package/commands/dev-run-test.md +21 -8
- package/commands/dev-smoke-test.md +21 -8
- package/commands/fix-bug.md +21 -8
- package/commands/generate-bdd.md +24 -10
- package/commands/generate-bdd.tmpl +3 -2
- package/commands/generate-code.md +21 -8
- package/commands/generate-design-spec.md +21 -8
- package/commands/generate-prd.md +21 -8
- package/commands/generate-spec-manifest.md +21 -8
- package/commands/generate-tech-docs.md +21 -8
- package/commands/learn.md +21 -8
- package/commands/map-testids.md +21 -8
- package/commands/propose-scenario.md +21 -8
- package/commands/qc-analyze.md +21 -8
- package/commands/qc-design-test.md +21 -8
- package/commands/qc-plan.md +21 -8
- package/commands/qc-report.md +21 -8
- package/commands/qc-review.md +21 -8
- package/commands/qc-run-test.md +21 -8
- package/commands/refine-prd.md +21 -8
- package/commands/report-bug.md +21 -8
- package/commands/review-code.md +21 -8
- package/commands/review-context.md +21 -8
- package/commands/review-tech-docs.md +21 -8
- package/commands/setup-ai-first.md +14 -7
- package/commands/setup-ai-first.tmpl +14 -7
- package/commands/validate-traces.md +21 -8
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +21 -8
- package/core/commands/define-product.md +21 -8
- package/core/commands/dev-gen-test.md +21 -8
- package/core/commands/dev-run-test.md +21 -8
- package/core/commands/dev-smoke-test.md +21 -8
- package/core/commands/fix-bug.md +21 -8
- package/core/commands/generate-bdd.md +24 -10
- package/core/commands/generate-code.md +21 -8
- package/core/commands/generate-design-spec.md +21 -8
- package/core/commands/generate-prd.md +21 -8
- package/core/commands/generate-spec-manifest.md +21 -8
- package/core/commands/generate-tech-docs.md +21 -8
- package/core/commands/learn.md +21 -8
- package/core/commands/map-testids.md +21 -8
- package/core/commands/propose-scenario.md +21 -8
- package/core/commands/qc-analyze.md +21 -8
- package/core/commands/qc-design-test.md +21 -8
- package/core/commands/qc-plan.md +21 -8
- package/core/commands/qc-report.md +21 -8
- package/core/commands/qc-review.md +21 -8
- package/core/commands/qc-run-test.md +21 -8
- package/core/commands/refine-prd.md +21 -8
- package/core/commands/report-bug.md +21 -8
- package/core/commands/review-code.md +21 -8
- package/core/commands/review-context.md +21 -8
- package/core/commands/review-tech-docs.md +21 -8
- package/core/commands/setup-ai-first.md +14 -7
- package/core/commands/validate-traces.md +21 -8
- package/core/steps/context-loader.md +21 -8
- package/core/templates/project-context.yaml +23 -10
- package/package.json +1 -1
- package/steps/context-loader.md +21 -8
- package/templates/project-context.yaml +23 -10
|
@@ -183,16 +183,28 @@ Nếu có section `services`:
|
|
|
183
183
|
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
184
184
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
185
185
|
|
|
186
|
-
**
|
|
187
|
-
-
|
|
188
|
-
-
|
|
186
|
+
**1b. Phát hiện active platform** (chỉ cần khi service ở dạng map-theo-platform — bước 2b):
|
|
187
|
+
- Đọc `@trace.platform` từ header của target `.feature` (`system` | `web` | `app`) — Gate đã resolve target trước bước này.
|
|
188
|
+
- Nếu target không mang `@trace.platform` (vd target là PRD `.md`), thử suy từ segment `bdd/{platform}/` trong path target.
|
|
189
|
+
- Nếu vẫn không xác định được → `active_platform = null`.
|
|
190
|
+
|
|
191
|
+
**2. Route tới service** — nếu active domain khớp một key trong `services`. Giá trị `services.{domain}` có **hai dạng**; nhận dạng bằng việc có `path` trực tiếp hay không:
|
|
192
|
+
|
|
193
|
+
**2a. Dạng phẳng** — `services.{domain}` có **trực tiếp** `path`/`module` (một domain ↔ một service, mọi platform về cùng submodule). Route như cũ:
|
|
189
194
|
- Lưu `active_service` = `services.{domain}.path`
|
|
190
195
|
- Lưu `active_service_module` = `services.{domain}.module`
|
|
191
196
|
- Nếu service có `module` riêng → dùng nó làm `active_module` (override `tech_stack.module`)
|
|
192
197
|
|
|
193
|
-
**
|
|
194
|
-
-
|
|
195
|
-
-
|
|
198
|
+
**2b. Dạng map-theo-platform** — `services.{domain}` **KHÔNG** có `path` trực tiếp mà chứa các sub-key platform (`system` / `web` / `app`), mỗi cái là `{ path, module }` (một business-domain trải trên nhiều platform/submodule). Route theo `active_platform` (bước 1b):
|
|
199
|
+
- Nếu `active_platform` khớp một sub-key → `entry = services.{domain}.{active_platform}`; lưu `active_service = entry.path`, `active_service_module = entry.module` (→ `active_module`, override `tech_stack.module`).
|
|
200
|
+
- Nếu `active_platform = null` (chưa xác định platform, vd đang thao tác cấp PRD) → **KHÔNG** chốt một service; đặt `active_service = multi` và lưu `service_candidates = services.{domain}` (toàn map platform→{path,module}). Lệnh cần một service cụ thể (`/generate-code`, `/dev-*`, `/fix-bug`) luôn chạy trên target `.feature` có platform nên sẽ resolve được ở lần chạy đó; lệnh cấp PRD (`/generate-prd`, `/refine-prd`) không cần service cụ thể.
|
|
201
|
+
- Nếu `active_platform` xác định nhưng không có sub-key tương ứng → `active_service = unresolved` (xem Fallback) với lý do "domain `{domain}` chưa cấu hình platform `{active_platform}`".
|
|
202
|
+
|
|
203
|
+
*(Cả 2a/2b: override `paths.specs_dir`/`paths.tech_docs_dir` per-service CHỈ khi `setup.spec_source` KHÔNG được đặt. Khi `spec_source` ĐƯỢC đặt, MỌI BDD/tech-doc là artifact liên team → để bước 4 route sang spec repo; KHÔNG pin per-service ở đây.)*
|
|
204
|
+
|
|
205
|
+
**3. Fallback**:
|
|
206
|
+
- Không phát hiện được domain, hoặc domain không khớp key nào trong `services` → giữ path mặc định từ Bước 1, đặt `active_service = unresolved`.
|
|
207
|
+
- Domain khớp một map-theo-platform (2b) nhưng `active_platform` xác định mà thiếu sub-key tương ứng → `active_service = unresolved`, ghi lý do rõ để lệnh DỪNG báo lỗi cấu hình (không tự đoán platform).
|
|
196
208
|
|
|
197
209
|
**4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt VÀ path tương ứng chưa được set tường minh trong `paths:`:
|
|
198
210
|
- Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không có `spec_source`.)*
|
|
@@ -212,7 +224,7 @@ Nếu có section `services`:
|
|
|
212
224
|
|
|
213
225
|
## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
|
|
214
226
|
|
|
215
|
-
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc context ở chế độ single-service.*
|
|
227
|
+
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc `"multi"` (chưa chốt một service — dạng map-theo-platform ở cấp PRD) hoặc context ở chế độ single-service.*
|
|
216
228
|
|
|
217
229
|
Khi `active_service` đã được phân giải thành một path thật ở Bước 1.5 (vd: `user-service/`):
|
|
218
230
|
|
|
@@ -388,7 +400,8 @@ Ticket : {ticket_prefix}-
|
|
|
388
400
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
389
401
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
390
402
|
Lessons : {loaded — N guardrails | chưa có}
|
|
391
|
-
|
|
403
|
+
Platform : {active_platform: system | web | app | — nếu chưa xác định}
|
|
404
|
+
Service : {active_service} ({active_service_module}) | multi (map-theo-platform, chốt khi target có platform) | single-service
|
|
392
405
|
Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
|
|
393
406
|
Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
394
407
|
```
|
|
@@ -122,18 +122,25 @@ Dựa trên câu trả lời:
|
|
|
122
122
|
|
|
123
123
|
**project_type = 1 (Single-service):** Tiếp tục setup chuẩn bên dưới.
|
|
124
124
|
|
|
125
|
-
**project_type = 2 (Umbrella):** Hỏi
|
|
126
|
-
- "Path tới spec submodule (vd `free-trial-
|
|
127
|
-
- "
|
|
128
|
-
(
|
|
125
|
+
**project_type = 2 (Umbrella):** Hỏi các câu follow-up:
|
|
126
|
+
- "Path tới spec submodule (vd `free-trial-spec`)? Nhấn Enter để skip."
|
|
127
|
+
- "Một business-domain được triển khai trên NHIỀU platform (BE + Web + App) không? (Y/N)"
|
|
128
|
+
- **N → dạng phẳng (FORM A):** "Liệt kê service dạng cặp `domain:module`, ngăn cách bởi dấu phẩy
|
|
129
|
+
(vd `user:java-spring,order:java-spring`). Nhấn Enter để skip."
|
|
130
|
+
- **Y → dạng map-theo-platform (FORM B):** "Liệt kê dạng bộ ba `domain:platform:module`
|
|
131
|
+
(platform ∈ system|web|app), ngăn cách bởi dấu phẩy — lặp lại domain cho từng platform
|
|
132
|
+
(vd `onboarding:system:java-spring,onboarding:web:nextjs,onboarding:app:flutter`). Nhấn Enter để skip."
|
|
133
|
+
context-loader route theo `@trace.platform` của target `.feature` → chọn đúng submodule.
|
|
134
|
+
**Giữ `@trace.domain` là business-domain** (KHÔNG bịa `onboarding-web`).
|
|
129
135
|
|
|
130
136
|
Rồi:
|
|
131
137
|
- Skip tạo bất kỳ artifact `specs/` nào (mọi spec — PRD, BDD, tech-docs, design-spec — sống trong spec submodule theo bố cục feature-package `specs/{domain}/{prd-slug}/`)
|
|
132
138
|
- Chỉ tạo: `.trace/`, `.agent/review/` ở cấp umbrella
|
|
133
139
|
*(Trừ khi user yêu cầu rõ tạo cấu trúc đầy đủ)*
|
|
134
|
-
- Sinh `.agent/project-context.yaml` ở umbrella mode với services và spec_source đã cung cấp
|
|
135
|
-
|
|
136
|
-
-
|
|
140
|
+
- Sinh `.agent/project-context.yaml` ở umbrella mode với services (FORM A hoặc B) và spec_source đã cung cấp.
|
|
141
|
+
**Sau khi sinh, MỞ file kiểm tra:** mỗi `services.{domain}.path` (hoặc `.{platform}.path`) phải trỏ **đúng tên thư mục submodule thật** — generator để placeholder `TODO-…` vì tên dir thường khác tên domain. Sửa cho khớp trước khi chạy lệnh generate.
|
|
142
|
+
- Skip tạo `CLAUDE.md` root (umbrella không có một tech stack đơn) — nhưng nhắc mỗi submodule code cần overlay `{path}/CLAUDE.md` riêng (thiếu thì code-gen fallback về default + cờ ⚠️, có thể sai coding-standards).
|
|
143
|
+
- Sau setup, nhắc: "Mở từng service submodule riêng trong Claude Code để cài framework/overlay ở đó nếu cần."
|
|
137
144
|
|
|
138
145
|
**project_type = 3 (PO Spec repo):**
|
|
139
146
|
- Tạo base dir: `specs/product-definition/`, `specs/domain-knowledge/`, `feedback/`, `.agent/review/`
|
|
@@ -34,18 +34,25 @@ Dựa trên câu trả lời:
|
|
|
34
34
|
|
|
35
35
|
**project_type = 1 (Single-service):** Tiếp tục setup chuẩn bên dưới.
|
|
36
36
|
|
|
37
|
-
**project_type = 2 (Umbrella):** Hỏi
|
|
38
|
-
- "Path tới spec submodule (vd `free-trial-
|
|
39
|
-
- "
|
|
40
|
-
(
|
|
37
|
+
**project_type = 2 (Umbrella):** Hỏi các câu follow-up:
|
|
38
|
+
- "Path tới spec submodule (vd `free-trial-spec`)? Nhấn Enter để skip."
|
|
39
|
+
- "Một business-domain được triển khai trên NHIỀU platform (BE + Web + App) không? (Y/N)"
|
|
40
|
+
- **N → dạng phẳng (FORM A):** "Liệt kê service dạng cặp `domain:module`, ngăn cách bởi dấu phẩy
|
|
41
|
+
(vd `user:java-spring,order:java-spring`). Nhấn Enter để skip."
|
|
42
|
+
- **Y → dạng map-theo-platform (FORM B):** "Liệt kê dạng bộ ba `domain:platform:module`
|
|
43
|
+
(platform ∈ system|web|app), ngăn cách bởi dấu phẩy — lặp lại domain cho từng platform
|
|
44
|
+
(vd `onboarding:system:java-spring,onboarding:web:nextjs,onboarding:app:flutter`). Nhấn Enter để skip."
|
|
45
|
+
context-loader route theo `@trace.platform` của target `.feature` → chọn đúng submodule.
|
|
46
|
+
**Giữ `@trace.domain` là business-domain** (KHÔNG bịa `onboarding-web`).
|
|
41
47
|
|
|
42
48
|
Rồi:
|
|
43
49
|
- Skip tạo bất kỳ artifact `specs/` nào (mọi spec — PRD, BDD, tech-docs, design-spec — sống trong spec submodule theo bố cục feature-package `specs/{domain}/{prd-slug}/`)
|
|
44
50
|
- Chỉ tạo: `.trace/`, `.agent/review/` ở cấp umbrella
|
|
45
51
|
*(Trừ khi user yêu cầu rõ tạo cấu trúc đầy đủ)*
|
|
46
|
-
- Sinh `.agent/project-context.yaml` ở umbrella mode với services và spec_source đã cung cấp
|
|
47
|
-
|
|
48
|
-
-
|
|
52
|
+
- Sinh `.agent/project-context.yaml` ở umbrella mode với services (FORM A hoặc B) và spec_source đã cung cấp.
|
|
53
|
+
**Sau khi sinh, MỞ file kiểm tra:** mỗi `services.{domain}.path` (hoặc `.{platform}.path`) phải trỏ **đúng tên thư mục submodule thật** — generator để placeholder `TODO-…` vì tên dir thường khác tên domain. Sửa cho khớp trước khi chạy lệnh generate.
|
|
54
|
+
- Skip tạo `CLAUDE.md` root (umbrella không có một tech stack đơn) — nhưng nhắc mỗi submodule code cần overlay `{path}/CLAUDE.md` riêng (thiếu thì code-gen fallback về default + cờ ⚠️, có thể sai coding-standards).
|
|
55
|
+
- Sau setup, nhắc: "Mở từng service submodule riêng trong Claude Code để cài framework/overlay ở đó nếu cần."
|
|
49
56
|
|
|
50
57
|
**project_type = 3 (PO Spec repo):**
|
|
51
58
|
- Tạo base dir: `specs/product-definition/`, `specs/domain-knowledge/`, `feedback/`, `.agent/review/`
|
|
@@ -181,16 +181,28 @@ Nếu có section `services`:
|
|
|
181
181
|
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
182
182
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
183
183
|
|
|
184
|
-
**
|
|
185
|
-
-
|
|
186
|
-
-
|
|
184
|
+
**1b. Phát hiện active platform** (chỉ cần khi service ở dạng map-theo-platform — bước 2b):
|
|
185
|
+
- Đọc `@trace.platform` từ header của target `.feature` (`system` | `web` | `app`) — Gate đã resolve target trước bước này.
|
|
186
|
+
- Nếu target không mang `@trace.platform` (vd target là PRD `.md`), thử suy từ segment `bdd/{platform}/` trong path target.
|
|
187
|
+
- Nếu vẫn không xác định được → `active_platform = null`.
|
|
188
|
+
|
|
189
|
+
**2. Route tới service** — nếu active domain khớp một key trong `services`. Giá trị `services.{domain}` có **hai dạng**; nhận dạng bằng việc có `path` trực tiếp hay không:
|
|
190
|
+
|
|
191
|
+
**2a. Dạng phẳng** — `services.{domain}` có **trực tiếp** `path`/`module` (một domain ↔ một service, mọi platform về cùng submodule). Route như cũ:
|
|
187
192
|
- Lưu `active_service` = `services.{domain}.path`
|
|
188
193
|
- Lưu `active_service_module` = `services.{domain}.module`
|
|
189
194
|
- Nếu service có `module` riêng → dùng nó làm `active_module` (override `tech_stack.module`)
|
|
190
195
|
|
|
191
|
-
**
|
|
192
|
-
-
|
|
193
|
-
-
|
|
196
|
+
**2b. Dạng map-theo-platform** — `services.{domain}` **KHÔNG** có `path` trực tiếp mà chứa các sub-key platform (`system` / `web` / `app`), mỗi cái là `{ path, module }` (một business-domain trải trên nhiều platform/submodule). Route theo `active_platform` (bước 1b):
|
|
197
|
+
- Nếu `active_platform` khớp một sub-key → `entry = services.{domain}.{active_platform}`; lưu `active_service = entry.path`, `active_service_module = entry.module` (→ `active_module`, override `tech_stack.module`).
|
|
198
|
+
- Nếu `active_platform = null` (chưa xác định platform, vd đang thao tác cấp PRD) → **KHÔNG** chốt một service; đặt `active_service = multi` và lưu `service_candidates = services.{domain}` (toàn map platform→{path,module}). Lệnh cần một service cụ thể (`/generate-code`, `/dev-*`, `/fix-bug`) luôn chạy trên target `.feature` có platform nên sẽ resolve được ở lần chạy đó; lệnh cấp PRD (`/generate-prd`, `/refine-prd`) không cần service cụ thể.
|
|
199
|
+
- Nếu `active_platform` xác định nhưng không có sub-key tương ứng → `active_service = unresolved` (xem Fallback) với lý do "domain `{domain}` chưa cấu hình platform `{active_platform}`".
|
|
200
|
+
|
|
201
|
+
*(Cả 2a/2b: override `paths.specs_dir`/`paths.tech_docs_dir` per-service CHỈ khi `setup.spec_source` KHÔNG được đặt. Khi `spec_source` ĐƯỢC đặt, MỌI BDD/tech-doc là artifact liên team → để bước 4 route sang spec repo; KHÔNG pin per-service ở đây.)*
|
|
202
|
+
|
|
203
|
+
**3. Fallback**:
|
|
204
|
+
- Không phát hiện được domain, hoặc domain không khớp key nào trong `services` → giữ path mặc định từ Bước 1, đặt `active_service = unresolved`.
|
|
205
|
+
- Domain khớp một map-theo-platform (2b) nhưng `active_platform` xác định mà thiếu sub-key tương ứng → `active_service = unresolved`, ghi lý do rõ để lệnh DỪNG báo lỗi cấu hình (không tự đoán platform).
|
|
194
206
|
|
|
195
207
|
**4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt VÀ path tương ứng chưa được set tường minh trong `paths:`:
|
|
196
208
|
- Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không có `spec_source`.)*
|
|
@@ -210,7 +222,7 @@ Nếu có section `services`:
|
|
|
210
222
|
|
|
211
223
|
## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
|
|
212
224
|
|
|
213
|
-
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc context ở chế độ single-service.*
|
|
225
|
+
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc `"multi"` (chưa chốt một service — dạng map-theo-platform ở cấp PRD) hoặc context ở chế độ single-service.*
|
|
214
226
|
|
|
215
227
|
Khi `active_service` đã được phân giải thành một path thật ở Bước 1.5 (vd: `user-service/`):
|
|
216
228
|
|
|
@@ -386,7 +398,8 @@ Ticket : {ticket_prefix}-
|
|
|
386
398
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
387
399
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
388
400
|
Lessons : {loaded — N guardrails | chưa có}
|
|
389
|
-
|
|
401
|
+
Platform : {active_platform: system | web | app | — nếu chưa xác định}
|
|
402
|
+
Service : {active_service} ({active_service_module}) | multi (map-theo-platform, chốt khi target có platform) | single-service
|
|
390
403
|
Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
|
|
391
404
|
Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
392
405
|
```
|
package/core/FRAMEWORK_VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.2.
|
|
1
|
+
0.2.3
|
package/core/commands/debug.md
CHANGED
|
@@ -182,16 +182,28 @@ Nếu có section `services`:
|
|
|
182
182
|
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
183
183
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
184
184
|
|
|
185
|
-
**
|
|
186
|
-
-
|
|
187
|
-
-
|
|
185
|
+
**1b. Phát hiện active platform** (chỉ cần khi service ở dạng map-theo-platform — bước 2b):
|
|
186
|
+
- Đọc `@trace.platform` từ header của target `.feature` (`system` | `web` | `app`) — Gate đã resolve target trước bước này.
|
|
187
|
+
- Nếu target không mang `@trace.platform` (vd target là PRD `.md`), thử suy từ segment `bdd/{platform}/` trong path target.
|
|
188
|
+
- Nếu vẫn không xác định được → `active_platform = null`.
|
|
189
|
+
|
|
190
|
+
**2. Route tới service** — nếu active domain khớp một key trong `services`. Giá trị `services.{domain}` có **hai dạng**; nhận dạng bằng việc có `path` trực tiếp hay không:
|
|
191
|
+
|
|
192
|
+
**2a. Dạng phẳng** — `services.{domain}` có **trực tiếp** `path`/`module` (một domain ↔ một service, mọi platform về cùng submodule). Route như cũ:
|
|
188
193
|
- Lưu `active_service` = `services.{domain}.path`
|
|
189
194
|
- Lưu `active_service_module` = `services.{domain}.module`
|
|
190
195
|
- Nếu service có `module` riêng → dùng nó làm `active_module` (override `tech_stack.module`)
|
|
191
196
|
|
|
192
|
-
**
|
|
193
|
-
-
|
|
194
|
-
-
|
|
197
|
+
**2b. Dạng map-theo-platform** — `services.{domain}` **KHÔNG** có `path` trực tiếp mà chứa các sub-key platform (`system` / `web` / `app`), mỗi cái là `{ path, module }` (một business-domain trải trên nhiều platform/submodule). Route theo `active_platform` (bước 1b):
|
|
198
|
+
- Nếu `active_platform` khớp một sub-key → `entry = services.{domain}.{active_platform}`; lưu `active_service = entry.path`, `active_service_module = entry.module` (→ `active_module`, override `tech_stack.module`).
|
|
199
|
+
- Nếu `active_platform = null` (chưa xác định platform, vd đang thao tác cấp PRD) → **KHÔNG** chốt một service; đặt `active_service = multi` và lưu `service_candidates = services.{domain}` (toàn map platform→{path,module}). Lệnh cần một service cụ thể (`/generate-code`, `/dev-*`, `/fix-bug`) luôn chạy trên target `.feature` có platform nên sẽ resolve được ở lần chạy đó; lệnh cấp PRD (`/generate-prd`, `/refine-prd`) không cần service cụ thể.
|
|
200
|
+
- Nếu `active_platform` xác định nhưng không có sub-key tương ứng → `active_service = unresolved` (xem Fallback) với lý do "domain `{domain}` chưa cấu hình platform `{active_platform}`".
|
|
201
|
+
|
|
202
|
+
*(Cả 2a/2b: override `paths.specs_dir`/`paths.tech_docs_dir` per-service CHỈ khi `setup.spec_source` KHÔNG được đặt. Khi `spec_source` ĐƯỢC đặt, MỌI BDD/tech-doc là artifact liên team → để bước 4 route sang spec repo; KHÔNG pin per-service ở đây.)*
|
|
203
|
+
|
|
204
|
+
**3. Fallback**:
|
|
205
|
+
- Không phát hiện được domain, hoặc domain không khớp key nào trong `services` → giữ path mặc định từ Bước 1, đặt `active_service = unresolved`.
|
|
206
|
+
- Domain khớp một map-theo-platform (2b) nhưng `active_platform` xác định mà thiếu sub-key tương ứng → `active_service = unresolved`, ghi lý do rõ để lệnh DỪNG báo lỗi cấu hình (không tự đoán platform).
|
|
195
207
|
|
|
196
208
|
**4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt VÀ path tương ứng chưa được set tường minh trong `paths:`:
|
|
197
209
|
- Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không có `spec_source`.)*
|
|
@@ -211,7 +223,7 @@ Nếu có section `services`:
|
|
|
211
223
|
|
|
212
224
|
## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
|
|
213
225
|
|
|
214
|
-
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc context ở chế độ single-service.*
|
|
226
|
+
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc `"multi"` (chưa chốt một service — dạng map-theo-platform ở cấp PRD) hoặc context ở chế độ single-service.*
|
|
215
227
|
|
|
216
228
|
Khi `active_service` đã được phân giải thành một path thật ở Bước 1.5 (vd: `user-service/`):
|
|
217
229
|
|
|
@@ -387,7 +399,8 @@ Ticket : {ticket_prefix}-
|
|
|
387
399
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
388
400
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
389
401
|
Lessons : {loaded — N guardrails | chưa có}
|
|
390
|
-
|
|
402
|
+
Platform : {active_platform: system | web | app | — nếu chưa xác định}
|
|
403
|
+
Service : {active_service} ({active_service_module}) | multi (map-theo-platform, chốt khi target có platform) | single-service
|
|
391
404
|
Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
|
|
392
405
|
Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
393
406
|
```
|
|
@@ -179,16 +179,28 @@ Nếu có section `services`:
|
|
|
179
179
|
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
180
180
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
181
181
|
|
|
182
|
-
**
|
|
183
|
-
-
|
|
184
|
-
-
|
|
182
|
+
**1b. Phát hiện active platform** (chỉ cần khi service ở dạng map-theo-platform — bước 2b):
|
|
183
|
+
- Đọc `@trace.platform` từ header của target `.feature` (`system` | `web` | `app`) — Gate đã resolve target trước bước này.
|
|
184
|
+
- Nếu target không mang `@trace.platform` (vd target là PRD `.md`), thử suy từ segment `bdd/{platform}/` trong path target.
|
|
185
|
+
- Nếu vẫn không xác định được → `active_platform = null`.
|
|
186
|
+
|
|
187
|
+
**2. Route tới service** — nếu active domain khớp một key trong `services`. Giá trị `services.{domain}` có **hai dạng**; nhận dạng bằng việc có `path` trực tiếp hay không:
|
|
188
|
+
|
|
189
|
+
**2a. Dạng phẳng** — `services.{domain}` có **trực tiếp** `path`/`module` (một domain ↔ một service, mọi platform về cùng submodule). Route như cũ:
|
|
185
190
|
- Lưu `active_service` = `services.{domain}.path`
|
|
186
191
|
- Lưu `active_service_module` = `services.{domain}.module`
|
|
187
192
|
- Nếu service có `module` riêng → dùng nó làm `active_module` (override `tech_stack.module`)
|
|
188
193
|
|
|
189
|
-
**
|
|
190
|
-
-
|
|
191
|
-
-
|
|
194
|
+
**2b. Dạng map-theo-platform** — `services.{domain}` **KHÔNG** có `path` trực tiếp mà chứa các sub-key platform (`system` / `web` / `app`), mỗi cái là `{ path, module }` (một business-domain trải trên nhiều platform/submodule). Route theo `active_platform` (bước 1b):
|
|
195
|
+
- Nếu `active_platform` khớp một sub-key → `entry = services.{domain}.{active_platform}`; lưu `active_service = entry.path`, `active_service_module = entry.module` (→ `active_module`, override `tech_stack.module`).
|
|
196
|
+
- Nếu `active_platform = null` (chưa xác định platform, vd đang thao tác cấp PRD) → **KHÔNG** chốt một service; đặt `active_service = multi` và lưu `service_candidates = services.{domain}` (toàn map platform→{path,module}). Lệnh cần một service cụ thể (`/generate-code`, `/dev-*`, `/fix-bug`) luôn chạy trên target `.feature` có platform nên sẽ resolve được ở lần chạy đó; lệnh cấp PRD (`/generate-prd`, `/refine-prd`) không cần service cụ thể.
|
|
197
|
+
- Nếu `active_platform` xác định nhưng không có sub-key tương ứng → `active_service = unresolved` (xem Fallback) với lý do "domain `{domain}` chưa cấu hình platform `{active_platform}`".
|
|
198
|
+
|
|
199
|
+
*(Cả 2a/2b: override `paths.specs_dir`/`paths.tech_docs_dir` per-service CHỈ khi `setup.spec_source` KHÔNG được đặt. Khi `spec_source` ĐƯỢC đặt, MỌI BDD/tech-doc là artifact liên team → để bước 4 route sang spec repo; KHÔNG pin per-service ở đây.)*
|
|
200
|
+
|
|
201
|
+
**3. Fallback**:
|
|
202
|
+
- Không phát hiện được domain, hoặc domain không khớp key nào trong `services` → giữ path mặc định từ Bước 1, đặt `active_service = unresolved`.
|
|
203
|
+
- Domain khớp một map-theo-platform (2b) nhưng `active_platform` xác định mà thiếu sub-key tương ứng → `active_service = unresolved`, ghi lý do rõ để lệnh DỪNG báo lỗi cấu hình (không tự đoán platform).
|
|
192
204
|
|
|
193
205
|
**4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt VÀ path tương ứng chưa được set tường minh trong `paths:`:
|
|
194
206
|
- Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không có `spec_source`.)*
|
|
@@ -208,7 +220,7 @@ Nếu có section `services`:
|
|
|
208
220
|
|
|
209
221
|
## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
|
|
210
222
|
|
|
211
|
-
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc context ở chế độ single-service.*
|
|
223
|
+
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc `"multi"` (chưa chốt một service — dạng map-theo-platform ở cấp PRD) hoặc context ở chế độ single-service.*
|
|
212
224
|
|
|
213
225
|
Khi `active_service` đã được phân giải thành một path thật ở Bước 1.5 (vd: `user-service/`):
|
|
214
226
|
|
|
@@ -384,7 +396,8 @@ Ticket : {ticket_prefix}-
|
|
|
384
396
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
385
397
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
386
398
|
Lessons : {loaded — N guardrails | chưa có}
|
|
387
|
-
|
|
399
|
+
Platform : {active_platform: system | web | app | — nếu chưa xác định}
|
|
400
|
+
Service : {active_service} ({active_service_module}) | multi (map-theo-platform, chốt khi target có platform) | single-service
|
|
388
401
|
Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
|
|
389
402
|
Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
390
403
|
```
|
|
@@ -185,16 +185,28 @@ Nếu có section `services`:
|
|
|
185
185
|
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
186
186
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
187
187
|
|
|
188
|
-
**
|
|
189
|
-
-
|
|
190
|
-
-
|
|
188
|
+
**1b. Phát hiện active platform** (chỉ cần khi service ở dạng map-theo-platform — bước 2b):
|
|
189
|
+
- Đọc `@trace.platform` từ header của target `.feature` (`system` | `web` | `app`) — Gate đã resolve target trước bước này.
|
|
190
|
+
- Nếu target không mang `@trace.platform` (vd target là PRD `.md`), thử suy từ segment `bdd/{platform}/` trong path target.
|
|
191
|
+
- Nếu vẫn không xác định được → `active_platform = null`.
|
|
192
|
+
|
|
193
|
+
**2. Route tới service** — nếu active domain khớp một key trong `services`. Giá trị `services.{domain}` có **hai dạng**; nhận dạng bằng việc có `path` trực tiếp hay không:
|
|
194
|
+
|
|
195
|
+
**2a. Dạng phẳng** — `services.{domain}` có **trực tiếp** `path`/`module` (một domain ↔ một service, mọi platform về cùng submodule). Route như cũ:
|
|
191
196
|
- Lưu `active_service` = `services.{domain}.path`
|
|
192
197
|
- Lưu `active_service_module` = `services.{domain}.module`
|
|
193
198
|
- Nếu service có `module` riêng → dùng nó làm `active_module` (override `tech_stack.module`)
|
|
194
199
|
|
|
195
|
-
**
|
|
196
|
-
-
|
|
197
|
-
-
|
|
200
|
+
**2b. Dạng map-theo-platform** — `services.{domain}` **KHÔNG** có `path` trực tiếp mà chứa các sub-key platform (`system` / `web` / `app`), mỗi cái là `{ path, module }` (một business-domain trải trên nhiều platform/submodule). Route theo `active_platform` (bước 1b):
|
|
201
|
+
- Nếu `active_platform` khớp một sub-key → `entry = services.{domain}.{active_platform}`; lưu `active_service = entry.path`, `active_service_module = entry.module` (→ `active_module`, override `tech_stack.module`).
|
|
202
|
+
- Nếu `active_platform = null` (chưa xác định platform, vd đang thao tác cấp PRD) → **KHÔNG** chốt một service; đặt `active_service = multi` và lưu `service_candidates = services.{domain}` (toàn map platform→{path,module}). Lệnh cần một service cụ thể (`/generate-code`, `/dev-*`, `/fix-bug`) luôn chạy trên target `.feature` có platform nên sẽ resolve được ở lần chạy đó; lệnh cấp PRD (`/generate-prd`, `/refine-prd`) không cần service cụ thể.
|
|
203
|
+
- Nếu `active_platform` xác định nhưng không có sub-key tương ứng → `active_service = unresolved` (xem Fallback) với lý do "domain `{domain}` chưa cấu hình platform `{active_platform}`".
|
|
204
|
+
|
|
205
|
+
*(Cả 2a/2b: override `paths.specs_dir`/`paths.tech_docs_dir` per-service CHỈ khi `setup.spec_source` KHÔNG được đặt. Khi `spec_source` ĐƯỢC đặt, MỌI BDD/tech-doc là artifact liên team → để bước 4 route sang spec repo; KHÔNG pin per-service ở đây.)*
|
|
206
|
+
|
|
207
|
+
**3. Fallback**:
|
|
208
|
+
- Không phát hiện được domain, hoặc domain không khớp key nào trong `services` → giữ path mặc định từ Bước 1, đặt `active_service = unresolved`.
|
|
209
|
+
- Domain khớp một map-theo-platform (2b) nhưng `active_platform` xác định mà thiếu sub-key tương ứng → `active_service = unresolved`, ghi lý do rõ để lệnh DỪNG báo lỗi cấu hình (không tự đoán platform).
|
|
198
210
|
|
|
199
211
|
**4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt VÀ path tương ứng chưa được set tường minh trong `paths:`:
|
|
200
212
|
- Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không có `spec_source`.)*
|
|
@@ -214,7 +226,7 @@ Nếu có section `services`:
|
|
|
214
226
|
|
|
215
227
|
## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
|
|
216
228
|
|
|
217
|
-
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc context ở chế độ single-service.*
|
|
229
|
+
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc `"multi"` (chưa chốt một service — dạng map-theo-platform ở cấp PRD) hoặc context ở chế độ single-service.*
|
|
218
230
|
|
|
219
231
|
Khi `active_service` đã được phân giải thành một path thật ở Bước 1.5 (vd: `user-service/`):
|
|
220
232
|
|
|
@@ -390,7 +402,8 @@ Ticket : {ticket_prefix}-
|
|
|
390
402
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
391
403
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
392
404
|
Lessons : {loaded — N guardrails | chưa có}
|
|
393
|
-
|
|
405
|
+
Platform : {active_platform: system | web | app | — nếu chưa xác định}
|
|
406
|
+
Service : {active_service} ({active_service_module}) | multi (map-theo-platform, chốt khi target có platform) | single-service
|
|
394
407
|
Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
|
|
395
408
|
Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
396
409
|
```
|
|
@@ -185,16 +185,28 @@ Nếu có section `services`:
|
|
|
185
185
|
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
186
186
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
187
187
|
|
|
188
|
-
**
|
|
189
|
-
-
|
|
190
|
-
-
|
|
188
|
+
**1b. Phát hiện active platform** (chỉ cần khi service ở dạng map-theo-platform — bước 2b):
|
|
189
|
+
- Đọc `@trace.platform` từ header của target `.feature` (`system` | `web` | `app`) — Gate đã resolve target trước bước này.
|
|
190
|
+
- Nếu target không mang `@trace.platform` (vd target là PRD `.md`), thử suy từ segment `bdd/{platform}/` trong path target.
|
|
191
|
+
- Nếu vẫn không xác định được → `active_platform = null`.
|
|
192
|
+
|
|
193
|
+
**2. Route tới service** — nếu active domain khớp một key trong `services`. Giá trị `services.{domain}` có **hai dạng**; nhận dạng bằng việc có `path` trực tiếp hay không:
|
|
194
|
+
|
|
195
|
+
**2a. Dạng phẳng** — `services.{domain}` có **trực tiếp** `path`/`module` (một domain ↔ một service, mọi platform về cùng submodule). Route như cũ:
|
|
191
196
|
- Lưu `active_service` = `services.{domain}.path`
|
|
192
197
|
- Lưu `active_service_module` = `services.{domain}.module`
|
|
193
198
|
- Nếu service có `module` riêng → dùng nó làm `active_module` (override `tech_stack.module`)
|
|
194
199
|
|
|
195
|
-
**
|
|
196
|
-
-
|
|
197
|
-
-
|
|
200
|
+
**2b. Dạng map-theo-platform** — `services.{domain}` **KHÔNG** có `path` trực tiếp mà chứa các sub-key platform (`system` / `web` / `app`), mỗi cái là `{ path, module }` (một business-domain trải trên nhiều platform/submodule). Route theo `active_platform` (bước 1b):
|
|
201
|
+
- Nếu `active_platform` khớp một sub-key → `entry = services.{domain}.{active_platform}`; lưu `active_service = entry.path`, `active_service_module = entry.module` (→ `active_module`, override `tech_stack.module`).
|
|
202
|
+
- Nếu `active_platform = null` (chưa xác định platform, vd đang thao tác cấp PRD) → **KHÔNG** chốt một service; đặt `active_service = multi` và lưu `service_candidates = services.{domain}` (toàn map platform→{path,module}). Lệnh cần một service cụ thể (`/generate-code`, `/dev-*`, `/fix-bug`) luôn chạy trên target `.feature` có platform nên sẽ resolve được ở lần chạy đó; lệnh cấp PRD (`/generate-prd`, `/refine-prd`) không cần service cụ thể.
|
|
203
|
+
- Nếu `active_platform` xác định nhưng không có sub-key tương ứng → `active_service = unresolved` (xem Fallback) với lý do "domain `{domain}` chưa cấu hình platform `{active_platform}`".
|
|
204
|
+
|
|
205
|
+
*(Cả 2a/2b: override `paths.specs_dir`/`paths.tech_docs_dir` per-service CHỈ khi `setup.spec_source` KHÔNG được đặt. Khi `spec_source` ĐƯỢC đặt, MỌI BDD/tech-doc là artifact liên team → để bước 4 route sang spec repo; KHÔNG pin per-service ở đây.)*
|
|
206
|
+
|
|
207
|
+
**3. Fallback**:
|
|
208
|
+
- Không phát hiện được domain, hoặc domain không khớp key nào trong `services` → giữ path mặc định từ Bước 1, đặt `active_service = unresolved`.
|
|
209
|
+
- Domain khớp một map-theo-platform (2b) nhưng `active_platform` xác định mà thiếu sub-key tương ứng → `active_service = unresolved`, ghi lý do rõ để lệnh DỪNG báo lỗi cấu hình (không tự đoán platform).
|
|
198
210
|
|
|
199
211
|
**4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt VÀ path tương ứng chưa được set tường minh trong `paths:`:
|
|
200
212
|
- Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không có `spec_source`.)*
|
|
@@ -214,7 +226,7 @@ Nếu có section `services`:
|
|
|
214
226
|
|
|
215
227
|
## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
|
|
216
228
|
|
|
217
|
-
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc context ở chế độ single-service.*
|
|
229
|
+
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc `"multi"` (chưa chốt một service — dạng map-theo-platform ở cấp PRD) hoặc context ở chế độ single-service.*
|
|
218
230
|
|
|
219
231
|
Khi `active_service` đã được phân giải thành một path thật ở Bước 1.5 (vd: `user-service/`):
|
|
220
232
|
|
|
@@ -390,7 +402,8 @@ Ticket : {ticket_prefix}-
|
|
|
390
402
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
391
403
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
392
404
|
Lessons : {loaded — N guardrails | chưa có}
|
|
393
|
-
|
|
405
|
+
Platform : {active_platform: system | web | app | — nếu chưa xác định}
|
|
406
|
+
Service : {active_service} ({active_service_module}) | multi (map-theo-platform, chốt khi target có platform) | single-service
|
|
394
407
|
Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
|
|
395
408
|
Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
396
409
|
```
|
|
@@ -181,16 +181,28 @@ Nếu có section `services`:
|
|
|
181
181
|
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
182
182
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
183
183
|
|
|
184
|
-
**
|
|
185
|
-
-
|
|
186
|
-
-
|
|
184
|
+
**1b. Phát hiện active platform** (chỉ cần khi service ở dạng map-theo-platform — bước 2b):
|
|
185
|
+
- Đọc `@trace.platform` từ header của target `.feature` (`system` | `web` | `app`) — Gate đã resolve target trước bước này.
|
|
186
|
+
- Nếu target không mang `@trace.platform` (vd target là PRD `.md`), thử suy từ segment `bdd/{platform}/` trong path target.
|
|
187
|
+
- Nếu vẫn không xác định được → `active_platform = null`.
|
|
188
|
+
|
|
189
|
+
**2. Route tới service** — nếu active domain khớp một key trong `services`. Giá trị `services.{domain}` có **hai dạng**; nhận dạng bằng việc có `path` trực tiếp hay không:
|
|
190
|
+
|
|
191
|
+
**2a. Dạng phẳng** — `services.{domain}` có **trực tiếp** `path`/`module` (một domain ↔ một service, mọi platform về cùng submodule). Route như cũ:
|
|
187
192
|
- Lưu `active_service` = `services.{domain}.path`
|
|
188
193
|
- Lưu `active_service_module` = `services.{domain}.module`
|
|
189
194
|
- Nếu service có `module` riêng → dùng nó làm `active_module` (override `tech_stack.module`)
|
|
190
195
|
|
|
191
|
-
**
|
|
192
|
-
-
|
|
193
|
-
-
|
|
196
|
+
**2b. Dạng map-theo-platform** — `services.{domain}` **KHÔNG** có `path` trực tiếp mà chứa các sub-key platform (`system` / `web` / `app`), mỗi cái là `{ path, module }` (một business-domain trải trên nhiều platform/submodule). Route theo `active_platform` (bước 1b):
|
|
197
|
+
- Nếu `active_platform` khớp một sub-key → `entry = services.{domain}.{active_platform}`; lưu `active_service = entry.path`, `active_service_module = entry.module` (→ `active_module`, override `tech_stack.module`).
|
|
198
|
+
- Nếu `active_platform = null` (chưa xác định platform, vd đang thao tác cấp PRD) → **KHÔNG** chốt một service; đặt `active_service = multi` và lưu `service_candidates = services.{domain}` (toàn map platform→{path,module}). Lệnh cần một service cụ thể (`/generate-code`, `/dev-*`, `/fix-bug`) luôn chạy trên target `.feature` có platform nên sẽ resolve được ở lần chạy đó; lệnh cấp PRD (`/generate-prd`, `/refine-prd`) không cần service cụ thể.
|
|
199
|
+
- Nếu `active_platform` xác định nhưng không có sub-key tương ứng → `active_service = unresolved` (xem Fallback) với lý do "domain `{domain}` chưa cấu hình platform `{active_platform}`".
|
|
200
|
+
|
|
201
|
+
*(Cả 2a/2b: override `paths.specs_dir`/`paths.tech_docs_dir` per-service CHỈ khi `setup.spec_source` KHÔNG được đặt. Khi `spec_source` ĐƯỢC đặt, MỌI BDD/tech-doc là artifact liên team → để bước 4 route sang spec repo; KHÔNG pin per-service ở đây.)*
|
|
202
|
+
|
|
203
|
+
**3. Fallback**:
|
|
204
|
+
- Không phát hiện được domain, hoặc domain không khớp key nào trong `services` → giữ path mặc định từ Bước 1, đặt `active_service = unresolved`.
|
|
205
|
+
- Domain khớp một map-theo-platform (2b) nhưng `active_platform` xác định mà thiếu sub-key tương ứng → `active_service = unresolved`, ghi lý do rõ để lệnh DỪNG báo lỗi cấu hình (không tự đoán platform).
|
|
194
206
|
|
|
195
207
|
**4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt VÀ path tương ứng chưa được set tường minh trong `paths:`:
|
|
196
208
|
- Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không có `spec_source`.)*
|
|
@@ -210,7 +222,7 @@ Nếu có section `services`:
|
|
|
210
222
|
|
|
211
223
|
## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
|
|
212
224
|
|
|
213
|
-
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc context ở chế độ single-service.*
|
|
225
|
+
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc `"multi"` (chưa chốt một service — dạng map-theo-platform ở cấp PRD) hoặc context ở chế độ single-service.*
|
|
214
226
|
|
|
215
227
|
Khi `active_service` đã được phân giải thành một path thật ở Bước 1.5 (vd: `user-service/`):
|
|
216
228
|
|
|
@@ -386,7 +398,8 @@ Ticket : {ticket_prefix}-
|
|
|
386
398
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
387
399
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
388
400
|
Lessons : {loaded — N guardrails | chưa có}
|
|
389
|
-
|
|
401
|
+
Platform : {active_platform: system | web | app | — nếu chưa xác định}
|
|
402
|
+
Service : {active_service} ({active_service_module}) | multi (map-theo-platform, chốt khi target có platform) | single-service
|
|
390
403
|
Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
|
|
391
404
|
Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
392
405
|
```
|
package/core/commands/fix-bug.md
CHANGED
|
@@ -179,16 +179,28 @@ Nếu có section `services`:
|
|
|
179
179
|
*(vd: `specs/user/create-account/USR01-create-account.md` **và** `specs/user/create-account/bdd/system/UC1.feature` đều → domain = `user`, prd_slug = `create-account`)*
|
|
180
180
|
- Nếu `$ARGUMENTS` chứa một path, trích xuất segment domain sau `specs_dir`
|
|
181
181
|
|
|
182
|
-
**
|
|
183
|
-
-
|
|
184
|
-
-
|
|
182
|
+
**1b. Phát hiện active platform** (chỉ cần khi service ở dạng map-theo-platform — bước 2b):
|
|
183
|
+
- Đọc `@trace.platform` từ header của target `.feature` (`system` | `web` | `app`) — Gate đã resolve target trước bước này.
|
|
184
|
+
- Nếu target không mang `@trace.platform` (vd target là PRD `.md`), thử suy từ segment `bdd/{platform}/` trong path target.
|
|
185
|
+
- Nếu vẫn không xác định được → `active_platform = null`.
|
|
186
|
+
|
|
187
|
+
**2. Route tới service** — nếu active domain khớp một key trong `services`. Giá trị `services.{domain}` có **hai dạng**; nhận dạng bằng việc có `path` trực tiếp hay không:
|
|
188
|
+
|
|
189
|
+
**2a. Dạng phẳng** — `services.{domain}` có **trực tiếp** `path`/`module` (một domain ↔ một service, mọi platform về cùng submodule). Route như cũ:
|
|
185
190
|
- Lưu `active_service` = `services.{domain}.path`
|
|
186
191
|
- Lưu `active_service_module` = `services.{domain}.module`
|
|
187
192
|
- Nếu service có `module` riêng → dùng nó làm `active_module` (override `tech_stack.module`)
|
|
188
193
|
|
|
189
|
-
**
|
|
190
|
-
-
|
|
191
|
-
-
|
|
194
|
+
**2b. Dạng map-theo-platform** — `services.{domain}` **KHÔNG** có `path` trực tiếp mà chứa các sub-key platform (`system` / `web` / `app`), mỗi cái là `{ path, module }` (một business-domain trải trên nhiều platform/submodule). Route theo `active_platform` (bước 1b):
|
|
195
|
+
- Nếu `active_platform` khớp một sub-key → `entry = services.{domain}.{active_platform}`; lưu `active_service = entry.path`, `active_service_module = entry.module` (→ `active_module`, override `tech_stack.module`).
|
|
196
|
+
- Nếu `active_platform = null` (chưa xác định platform, vd đang thao tác cấp PRD) → **KHÔNG** chốt một service; đặt `active_service = multi` và lưu `service_candidates = services.{domain}` (toàn map platform→{path,module}). Lệnh cần một service cụ thể (`/generate-code`, `/dev-*`, `/fix-bug`) luôn chạy trên target `.feature` có platform nên sẽ resolve được ở lần chạy đó; lệnh cấp PRD (`/generate-prd`, `/refine-prd`) không cần service cụ thể.
|
|
197
|
+
- Nếu `active_platform` xác định nhưng không có sub-key tương ứng → `active_service = unresolved` (xem Fallback) với lý do "domain `{domain}` chưa cấu hình platform `{active_platform}`".
|
|
198
|
+
|
|
199
|
+
*(Cả 2a/2b: override `paths.specs_dir`/`paths.tech_docs_dir` per-service CHỈ khi `setup.spec_source` KHÔNG được đặt. Khi `spec_source` ĐƯỢC đặt, MỌI BDD/tech-doc là artifact liên team → để bước 4 route sang spec repo; KHÔNG pin per-service ở đây.)*
|
|
200
|
+
|
|
201
|
+
**3. Fallback**:
|
|
202
|
+
- Không phát hiện được domain, hoặc domain không khớp key nào trong `services` → giữ path mặc định từ Bước 1, đặt `active_service = unresolved`.
|
|
203
|
+
- Domain khớp một map-theo-platform (2b) nhưng `active_platform` xác định mà thiếu sub-key tương ứng → `active_service = unresolved`, ghi lý do rõ để lệnh DỪNG báo lỗi cấu hình (không tự đoán platform).
|
|
192
204
|
|
|
193
205
|
**4. Tự động override theo spec source** — nếu `setup.spec_source` được đặt VÀ path tương ứng chưa được set tường minh trong `paths:`:
|
|
194
206
|
- Override `paths.specs_dir` → `{spec_source}/specs` — **luôn khi `spec_source` được đặt.** Mọi spec artifact (PRD, BDD, tech-docs, design-spec) nằm dưới gốc spec thống nhất trong spec repo dùng chung theo bố cục feature-package: `{spec_source}/specs/{domain}/{prd-slug}/`. Mọi umbrella (FE/App/BE) đều đọc từ đây. *(`specs/` theo service chỉ khi không có `spec_source`.)*
|
|
@@ -208,7 +220,7 @@ Nếu có section `services`:
|
|
|
208
220
|
|
|
209
221
|
## Bước 1.6 — [SERVICE CONVENTIONS] Nạp convention riêng của service (chế độ umbrella)
|
|
210
222
|
|
|
211
|
-
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc context ở chế độ single-service.*
|
|
223
|
+
*Bỏ qua hoàn toàn bước này nếu `active_service` là `"unresolved"` hoặc `"multi"` (chưa chốt một service — dạng map-theo-platform ở cấp PRD) hoặc context ở chế độ single-service.*
|
|
212
224
|
|
|
213
225
|
Khi `active_service` đã được phân giải thành một path thật ở Bước 1.5 (vd: `user-service/`):
|
|
214
226
|
|
|
@@ -384,7 +396,8 @@ Ticket : {ticket_prefix}-
|
|
|
384
396
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
385
397
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
386
398
|
Lessons : {loaded — N guardrails | chưa có}
|
|
387
|
-
|
|
399
|
+
Platform : {active_platform: system | web | app | — nếu chưa xác định}
|
|
400
|
+
Service : {active_service} ({active_service_module}) | multi (map-theo-platform, chốt khi target có platform) | single-service
|
|
388
401
|
Svc Root : {service_root} — đã nạp conventions + trace_dir từ config service | —
|
|
389
402
|
Status : {FULL | PARTIAL — thiếu: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
390
403
|
```
|