@educa-corp/sdd-framework 0.7.4 → 0.8.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.
package/bin/gate-trace.js CHANGED
@@ -63,6 +63,18 @@ const NO_RECONCILE = argv.includes('--no-reconcile');
63
63
  const TRACE_DIRS = flag('--trace', '.trace').split(',').map(s => s.trim()).filter(Boolean);
64
64
  const REPORT_ARG = flag('--report', null);
65
65
 
66
+ // Version của framework — IN RA MỌI LẦN CHẠY.
67
+ //
68
+ // Vì sao (báo cáo từ project thật): người dùng chạy `npx …@${SDD_VERSION} --lint-trace`
69
+ // trong CI và KHÔNG có cách nào biết bản nào thật sự chạy. `npx` cache theo version, biến
70
+ // CI có thể rỗng, và `.agent/FRAMEWORK_VERSION` chỉ nói bản ĐÃ CÀI chứ không nói bản đang
71
+ // KIỂM. Nên câu "lỗi này sửa chưa?" không trả lời được từ log — đúng lúc cần nhất.
72
+ // Một cổng quyết định PR nào được merge thì phải nói nó là ai.
73
+ const FW_VERSION = (() => {
74
+ try { return require(path.join(__dirname, '..', 'package.json')).version; }
75
+ catch { return '?'; }
76
+ })();
77
+
66
78
  const fails = [];
67
79
  const warns = [];
68
80
  const oks = [];
@@ -434,7 +446,7 @@ if (AS_JSON) {
434
446
  }
435
447
 
436
448
  console.log('');
437
- console.log('Trace gate (bin/trace-schema.json → gate) ...');
449
+ console.log(`Trace gate v${FW_VERSION} (bin/trace-schema.json → gate) ...`);
438
450
  console.log('');
439
451
 
440
452
  for (const o of oks) console.log(` ✅ ${o}`);
package/bin/index.js CHANGED
@@ -45,6 +45,10 @@ const isInit = args.includes('--init');
45
45
  const isProject = args.includes('--project');
46
46
  const installHooks = args.includes('--hooks');
47
47
  const showHelp = args.includes('--help') || args.includes('-h');
48
+ // `--version` / `-v` — trả lời "bản nào đang chạy?" bằng MỘT lệnh, không cần đoán.
49
+ // Cần thiết vì `npx` cache theo version và biến CI có thể rỗng: `npx pkg@${VAR}` với VAR
50
+ // rỗng thành `pkg@` ⇒ npm resolve về latest, và log không nói gì về việc đó.
51
+ const showVersion = args.includes('--version') || args.includes('-v');
48
52
 
49
53
  // --module <name> flag
50
54
  const moduleIdx = args.indexOf('--module');
@@ -97,8 +101,21 @@ const MODULE_STACK = {
97
101
  'phaser-game': { language: 'TypeScript', framework: 'Phaser 3' },
98
102
  };
99
103
 
104
+ if (showVersion) {
105
+ // In cả hai: version package VÀ version của core/ dựng sẵn. Lệch nhau nghĩa là bản cài
106
+ // hỏng (index.js §corePrebuilt sẽ xử) — thấy được ở đây thì đỡ một vòng chẩn đoán.
107
+ let coreV = '(không có core/)';
108
+ try { coreV = fs.readFileSync(path.join(ROOT, 'core', 'FRAMEWORK_VERSION'), 'utf8').trim(); } catch {}
109
+ console.log(`@educa-corp/sdd-framework ${VERSION}`);
110
+ console.log(` core/FRAMEWORK_VERSION : ${coreV}${coreV === VERSION ? '' : ' ⚠️ LỆCH — bản cài hỏng'}`);
111
+ process.exit(0);
112
+ }
113
+
100
114
  if (showHelp) {
101
- console.log('Usage: npx @educa-corp/sdd-framework [options]');
115
+ console.log(`Usage: npx @educa-corp/sdd-framework [options] (v${VERSION})`);
116
+ console.log('');
117
+ console.log('');
118
+ console.log(' --version, -v In version đang chạy (package + core/). Dùng để chắc `npx` không lấy bản cache.');
102
119
  console.log('');
103
120
  console.log('Install modes:');
104
121
  console.log(' --init Install framework to .agent/ + create shortcuts in .claude/commands/');
package/bin/lint-trace.js CHANGED
@@ -53,6 +53,18 @@ const flag = (name, def) => {
53
53
  const i = argv.indexOf(name);
54
54
  return i !== -1 && argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : def;
55
55
  };
56
+ // Version của framework — IN RA MỌI LẦN CHẠY.
57
+ //
58
+ // Vì sao (báo cáo từ project thật): người dùng chạy `npx …@${SDD_VERSION} --lint-trace`
59
+ // trong CI và KHÔNG có cách nào biết bản nào thật sự chạy. `npx` cache theo version, biến
60
+ // CI có thể rỗng, và `.agent/FRAMEWORK_VERSION` chỉ nói bản ĐÃ CÀI chứ không nói bản đang
61
+ // KIỂM. Nên câu "lỗi này sửa chưa?" không trả lời được từ log — đúng lúc cần nhất.
62
+ // Một cổng quyết định PR nào được merge thì phải nói nó là ai.
63
+ const FW_VERSION = (() => {
64
+ try { return require(path.join(__dirname, '..', 'package.json')).version; }
65
+ catch { return '?'; }
66
+ })();
67
+
56
68
  const WARN_ONLY = argv.includes('--warn-only');
57
69
  const AS_JSON = argv.includes('--json');
58
70
  const TRACE_DIRS = flag('--trace', '.trace').split(',').map(s => s.trim()).filter(Boolean);
@@ -657,13 +669,14 @@ for (const dir of TRACE_DIRS) {
657
669
  if (AS_JSON) {
658
670
  console.log(JSON.stringify({
659
671
  ok: errors.length === 0,
672
+ framework_version: FW_VERSION,
660
673
  scanned, trace_dirs: foundDirs, git_state: _gitState, errors, warns, infos,
661
674
  }, null, 2));
662
675
  process.exit(errors.length && !WARN_ONLY ? 1 : 0);
663
676
  }
664
677
 
665
678
  console.log('');
666
- console.log('Lint trace (bin/trace-schema.json) ...');
679
+ console.log(`Lint trace v${FW_VERSION} (bin/trace-schema.json) ...`);
667
680
  console.log('');
668
681
 
669
682
  if (!foundDirs.length) {
@@ -1 +1 @@
1
- 0.7.4
1
+ 0.8.0
@@ -75,9 +75,15 @@ variables:
75
75
  - CHANGE_ME
76
76
 
77
77
  before_script:
78
- # Hai dòng này tồn tại để bẫy 2 4 lộ ra NGAY, chứ không lộ ra dưới dạng dấu xanh sai.
78
+ # Ba dòng này tồn tại để bẫy 2, 4 "npx lấy bản cache" lộ ra NGAY đầu log, chứ không
79
+ # lộ ra dưới dạng một dấu xanh sai.
79
80
  - node -v
80
81
  - git --version
82
+ # CHỨNG MINH version đã pin. `npx` cache theo version, và một biến CI rỗng làm
83
+ # `pkg@${SDD_VERSION}` thành `pkg@` ⇒ npm resolve về latest mà log không nói gì.
84
+ # Dòng này in ra version THẬT sẽ chạy — nếu nó khác SDD_VERSION thì bạn thấy ngay.
85
+ - echo "SDD_VERSION=${SDD_VERSION}"
86
+ - npx -y @educa-corp/sdd-framework@${SDD_VERSION} --version
81
87
 
82
88
  # ── 1+2. Cấu trúc sổ + cổng chặn cờ 🔴 ───────────────────────────────────────
83
89
  # Sổ trace 24 cột do LLM ghi tay: một dấu tab thiếu dồn mọi ô sang trái, ô `status`
@@ -1,86 +1,86 @@
1
- [← /extend-prd](02b-extend-prd.md) · [Explain Home](README.md) · [Next: /review-context →](04-review-context.md)
2
-
3
- # 03 · `/refine-prd` — Tinh chỉnh PRD qua 3 lăng kính
4
-
5
- > **Một câu.** Fan-out review PRD qua **3 lăng kính DEV / SA / PO**, chạy **vòng lặp completeness-critic** để hội tụ đầy đủ trong một lần, rồi sinh file findings cho PO accept/reject ở Review Board.
6
-
7
- ---
8
-
9
- ## Vấn đề giải quyết
10
-
11
- Một lượt review đơn không bao giờ liệt kê hết vấn đề — model dừng ở mức "đủ", nên mỗi vòng sau lại lòi lỗi mới (**đập chuột chũi**). `/refine-prd` ép review **hội tụ trong một lần chạy**, bắt lỗi nghiệp vụ *trước* khi truyền xuống BDD, giữ altitude & ngôn ngữ nghiệp vụ.
12
-
13
- ---
14
-
15
- ## Vị trí & tiền đề
16
-
17
- - **Vị trí:** Phase Specification (sau `/generate-prd`).
18
- - **Tiền đề:** có PRD draft.
19
- - **Đặc biệt:** có **Resume Mode** (`--resume`) áp findings đã accept và bump version PRD.
20
-
21
- ---
22
-
23
- ## Input / Output
24
-
25
- **Input:** PRD + core-entities + business-dictionary.
26
-
27
- **Output:** `{refinement_dir}/{prd-slug}-findings.yaml` — findings với `lens` (DEV/SA/PO), severity, `quote`+`uc_id` (để Review Board jump-to-source), `suggestion`, `resolution_edge_cases`, `status`.
28
-
29
- ---
30
-
31
- ## Các bước xử lý (chi tiết)
32
-
33
- Chạy qua step **review-fanout** với tham số `GRANULARITY = per-uc`:
34
-
35
- ### Phase 1 — Fan-out song song theo dimension
36
- - **DIMENSIONS = 3 lăng kính** (mỗi lăng kính một sub-agent, context window mới, quét toàn PRD chỉ qua lăng kính đó):
37
- | Lăng kính | Soi gì |
38
- |-----------|--------|
39
- | **DEV** (cơ chế nghiệp vụ) | BR + Business Logic đã đủ & không mơ hồ để build không phải đoán chưa? Nhánh nghiệp vụ thiếu, điều kiện biên, đường lỗi bỏ ngỏ |
40
- | **SA** (thông suốt & nhất quán) | Luồng nghiệp vụ thông suốt trên cả feature/domain? Tương tác UC, quan hệ entity, vòng đời trạng thái, ai-làm-gì |
41
- | **PO** | Scope khoanh vùng? Priority? Success metric? Rủi ro scope creep? |
42
- - ⚠️ **Nguyên tắc DEV & SA: đọc bằng mắt kỹ thuật, VIẾT bằng lời nghiệp vụ** — chỉ nêu *cái nghiệp vụ còn thiếu/mơ hồ* + đặt câu hỏi làm rõ; KHÔNG đề xuất cơ chế kỹ thuật.
43
- - `GRANULARITY = per-uc` → luôn fan-out `DIMENSION × UC` (+ phạm vi PRD-global), bỏ ngưỡng cả-file → **lần đầu quét sâu**. Agent cap = 12/wave, gom batch UC nếu vượt.
44
-
45
- ### Phase 2 — Vòng lặp completeness-critic
46
- - Spawn một critic đọc **toàn PRD** + danh sách findings đã có (slim) → liệt kê **chỉ vấn đề mới** (gap, mâu thuẫn, edge/negative path thiếu, **vi phạm altitude/role-boundary**: cơ chế nằm trong AC, AC lặp lại BR…).
47
- - Lặp tới khi **2 vòng liên tiếp 0 finding mới** hoặc cap **3 vòng**. Ghi `convergence_rounds`.
48
-
49
- ### Phase 3 — Dedup / xung đột / merge
50
- - Khử trùng (giữ suggestion phong phú hơn, severity cao hơn); merge được thì merge, loại trừ nhau → một finding `needs_discussion`; sắp theo severity; gán ID `F001…`; map dimension → `lens`; ghi **một** file findings.
51
-
52
- ### Full vs Delta
53
- - Lần đầu (chưa có findings file) → **FULL**. Lần sau so `prd_version`: chưa đổi → DỪNG; đổi do chính resume này (`applied_to_version` khớp) → **DELTA** (chỉ UC đã đổi + UC mới); đổi bởi actor khác → **FULL** + cảnh báo.
54
-
55
- ### Resume Mode (`--resume`)
56
- - Áp finding theo `status` (`accepted`/`modified`), bump version PRD, ghi `applied_to_version`. `needs_discussion` chặn resume tới khi người quyết.
57
-
58
- ---
59
-
60
- ## Checkpoint & Gate
61
-
62
- - 🛑 **Review Board** — PO accept/reject/modify **từng** finding (không auto-apply). Finding lifecycle: `pending → accepted|modified|rejected|needs_discussion|deferred → applied`.
63
- - `recommendation`: critical≥1 → `BLOCKED`; major≥1 → `NEEDS_REVISION`; else `APPROVED_WITH_MINOR_CHANGES`.
64
-
65
- ---
66
-
67
- ## Cơ chế đặc biệt
68
-
69
- - **Không có `--fix` mode** (khác `/review-context`) — finding 3 lăng kính là phán đoán DEV/SA/PO, **bắt buộc qua người** ở Board; `auto_fixable` chỉ là gợi ý quick-accept.
70
- - **`resolution_edge_cases`** — phân tích bậc-hai (chỉ critical/major): "nếu chốt phương án này thì đẻ ra edge case gì?" → PO thấy trước khi accept (advisory, không chặn).
71
- - **QA lens đang DISABLED** (comment trong file) — có hướng dẫn bật lại nếu cần.
72
-
73
- ---
74
-
75
- ## 👓 Góc nhìn tối ưu
76
-
77
- - **Đây là command tốn agent/token nhất phía thượng nguồn** — `per-uc` × 3 lăng kính × (UC+1) + tới 3 vòng critic. `AGENT_CAP=12` là núm chỉnh chính. Với PRD lớn, đây là điểm cần cân đối chi phí ↔ độ đầy đủ.
78
- - **Completeness-critic tới 3 vòng** — điểm đáng đo: thực tế hội tụ ở vòng mấy? Nếu thường 1–2 vòng thì cap 3 hợp lý.
79
- - **Full/delta logic phức tạp** (`applied_to_version` tracking) — mạnh nhưng nhiều nhánh; dễ rơi về FULL khi có actor khác sửa PRD (vd `/review-context` xen giữa).
80
- - **Ranh giới với `/review-context`** — cả hai đều review PRD, dùng chung review-fanout. `/refine-prd` = phán đoán chất lượng nghiệp vụ (3 lăng kính); `/review-context` = check có mã P0–P5 + auto-fix. Chồng lấn có chủ đích hay có thể gộp?
81
-
82
- ---
83
-
84
- ## Kết nối
85
-
86
- **Trước:** [`/generate-prd`](02-generate-prd.md) hoặc [`/extend-prd`](02b-extend-prd.md) · **Sau:** mở Review Board → cập nhật PRD → [`/review-context`](04-review-context.md).
1
+ [← /extend-prd](02b-extend-prd.md) · [Explain Home](README.md) · [Next: /review-context →](04-review-context.md)
2
+
3
+ # 03 · `/refine-prd` — Tinh chỉnh PRD qua 3 lăng kính
4
+
5
+ > **Một câu.** Fan-out review PRD qua **3 lăng kính DEV / SA / PO**, chạy **vòng lặp completeness-critic** để hội tụ đầy đủ trong một lần, rồi sinh file findings cho PO accept/reject ở Review Board.
6
+
7
+ ---
8
+
9
+ ## Vấn đề giải quyết
10
+
11
+ Một lượt review đơn không bao giờ liệt kê hết vấn đề — model dừng ở mức "đủ", nên mỗi vòng sau lại lòi lỗi mới (**đập chuột chũi**). `/refine-prd` ép review **hội tụ trong một lần chạy**, bắt lỗi nghiệp vụ *trước* khi truyền xuống BDD, giữ altitude & ngôn ngữ nghiệp vụ.
12
+
13
+ ---
14
+
15
+ ## Vị trí & tiền đề
16
+
17
+ - **Vị trí:** Phase Specification (sau `/generate-prd`).
18
+ - **Tiền đề:** có PRD draft.
19
+ - **Đặc biệt:** có **Resume Mode** (`--resume`) áp findings đã accept và bump version PRD.
20
+
21
+ ---
22
+
23
+ ## Input / Output
24
+
25
+ **Input:** PRD + core-entities + business-dictionary.
26
+
27
+ **Output:** `{refinement_dir}/{prd-slug}-findings.yaml` — findings với `lens` (DEV/SA/PO), severity, `quote`+`uc_id` (để Review Board jump-to-source), `suggestion`, `resolution_edge_cases`, `status`.
28
+
29
+ ---
30
+
31
+ ## Các bước xử lý (chi tiết)
32
+
33
+ Chạy qua step **review-fanout** với tham số `GRANULARITY = per-uc`:
34
+
35
+ ### Phase 1 — Fan-out song song theo dimension
36
+ - **DIMENSIONS = 3 lăng kính** (mỗi lăng kính một sub-agent, context window mới, quét toàn PRD chỉ qua lăng kính đó):
37
+ | Lăng kính | Soi gì |
38
+ |-----------|--------|
39
+ | **DEV** (cơ chế nghiệp vụ) | BR + Business Logic đã đủ & không mơ hồ để build không phải đoán chưa? Nhánh nghiệp vụ thiếu, điều kiện biên, đường lỗi bỏ ngỏ |
40
+ | **SA** (thông suốt & nhất quán) | Luồng nghiệp vụ thông suốt trên cả feature/domain? Tương tác UC, quan hệ entity, vòng đời trạng thái, ai-làm-gì |
41
+ | **PO** | Scope khoanh vùng? Priority? Success metric? Rủi ro scope creep? |
42
+ - ⚠️ **Nguyên tắc DEV & SA: đọc bằng mắt kỹ thuật, VIẾT bằng lời nghiệp vụ** — chỉ nêu *cái nghiệp vụ còn thiếu/mơ hồ* + đặt câu hỏi làm rõ; KHÔNG đề xuất cơ chế kỹ thuật.
43
+ - `GRANULARITY = per-uc` → luôn fan-out `DIMENSION × UC` (+ phạm vi PRD-global), bỏ ngưỡng cả-file → **lần đầu quét sâu**. Agent cap = 12/wave, gom batch UC nếu vượt.
44
+
45
+ ### Phase 2 — Vòng lặp completeness-critic
46
+ - Spawn một critic đọc **toàn PRD** + danh sách findings đã có (slim) → liệt kê **chỉ vấn đề mới** (gap, mâu thuẫn, edge/negative path thiếu, **vi phạm altitude/role-boundary**: cơ chế nằm trong AC, AC lặp lại BR…).
47
+ - Lặp tới khi **2 vòng liên tiếp 0 finding mới** hoặc cap **3 vòng**. Ghi `convergence_rounds`.
48
+
49
+ ### Phase 3 — Dedup / xung đột / merge
50
+ - Khử trùng (giữ suggestion phong phú hơn, severity cao hơn); merge được thì merge, loại trừ nhau → một finding `needs_discussion`; sắp theo severity; gán ID `F001…`; map dimension → `lens`; ghi **một** file findings.
51
+
52
+ ### Full vs Delta
53
+ - Lần đầu (chưa có findings file) → **FULL**. Lần sau so `prd_version`: chưa đổi → DỪNG; đổi do chính resume này (`applied_to_version` khớp) → **DELTA** (chỉ UC đã đổi + UC mới); đổi bởi actor khác → **FULL** + cảnh báo.
54
+
55
+ ### Resume Mode (`--resume`)
56
+ - Áp finding theo `status` (`accepted`/`modified`), bump version PRD, ghi `applied_to_version`. `needs_discussion` chặn resume tới khi người quyết.
57
+
58
+ ---
59
+
60
+ ## Checkpoint & Gate
61
+
62
+ - 🛑 **Review Board** — PO accept/reject/modify **từng** finding (không auto-apply). Finding lifecycle: `pending → accepted|modified|rejected|needs_discussion|deferred → applied`.
63
+ - `recommendation`: critical≥1 → `BLOCKED`; major≥1 → `NEEDS_REVISION`; else `APPROVED_WITH_MINOR_CHANGES`.
64
+
65
+ ---
66
+
67
+ ## Cơ chế đặc biệt
68
+
69
+ - **Không có `--fix` mode** (khác `/review-context`) — finding 3 lăng kính là phán đoán DEV/SA/PO, **bắt buộc qua người** ở Board; `auto_fixable` chỉ là gợi ý quick-accept.
70
+ - **`resolution_edge_cases`** — phân tích bậc-hai (chỉ critical/major): "nếu chốt phương án này thì đẻ ra edge case gì?" → PO thấy trước khi accept (advisory, không chặn).
71
+ - **QA lens đang DISABLED** (comment trong file) — có hướng dẫn bật lại nếu cần.
72
+
73
+ ---
74
+
75
+ ## 👓 Góc nhìn tối ưu
76
+
77
+ - **Đây là command tốn agent/token nhất phía thượng nguồn** — `per-uc` × 3 lăng kính × (UC+1) + tới 3 vòng critic. `AGENT_CAP=12` là núm chỉnh chính. Với PRD lớn, đây là điểm cần cân đối chi phí ↔ độ đầy đủ.
78
+ - **Completeness-critic tới 3 vòng** — điểm đáng đo: thực tế hội tụ ở vòng mấy? Nếu thường 1–2 vòng thì cap 3 hợp lý.
79
+ - **Full/delta logic phức tạp** (`applied_to_version` tracking) — mạnh nhưng nhiều nhánh; dễ rơi về FULL khi có actor khác sửa PRD (vd `/review-context` xen giữa).
80
+ - **Ranh giới với `/review-context`** — cả hai đều review PRD, dùng chung review-fanout. `/refine-prd` = phán đoán chất lượng nghiệp vụ (3 lăng kính); `/review-context` = check có mã P0–P5 + auto-fix. Chồng lấn có chủ đích hay có thể gộp?
81
+
82
+ ---
83
+
84
+ ## Kết nối
85
+
86
+ **Trước:** [`/generate-prd`](02-generate-prd.md) hoặc [`/extend-prd`](02b-extend-prd.md) · **Sau:** mở Review Board → cập nhật PRD → [`/review-context`](04-review-context.md).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@educa-corp/sdd-framework",
3
- "version": "0.7.4",
3
+ "version": "0.8.0",
4
4
  "description": "Spec Driven Development workflow framework for Claude Code",
5
5
  "bin": {
6
6
  "sdd-framework": "./bin/index.js"