@sun-asterisk/sungen 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/cli/commands/audit.d.ts.map +1 -1
  2. package/dist/cli/commands/audit.js +24 -0
  3. package/dist/cli/commands/audit.js.map +1 -1
  4. package/dist/cli/commands/delivery.d.ts.map +1 -1
  5. package/dist/cli/commands/delivery.js +30 -14
  6. package/dist/cli/commands/delivery.js.map +1 -1
  7. package/dist/cli/commands/eval.d.ts +3 -0
  8. package/dist/cli/commands/eval.d.ts.map +1 -0
  9. package/dist/cli/commands/eval.js +37 -0
  10. package/dist/cli/commands/eval.js.map +1 -0
  11. package/dist/cli/commands/ingest.d.ts +3 -0
  12. package/dist/cli/commands/ingest.d.ts.map +1 -0
  13. package/dist/cli/commands/ingest.js +179 -0
  14. package/dist/cli/commands/ingest.js.map +1 -0
  15. package/dist/cli/index.js +4 -0
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/dashboard/templates/index.html +108 -194
  18. package/dist/harness/audit.d.ts +16 -0
  19. package/dist/harness/audit.d.ts.map +1 -1
  20. package/dist/harness/audit.js +68 -4
  21. package/dist/harness/audit.js.map +1 -1
  22. package/dist/harness/capability-plan.d.ts +6 -0
  23. package/dist/harness/capability-plan.d.ts.map +1 -1
  24. package/dist/harness/capability-plan.js +13 -0
  25. package/dist/harness/capability-plan.js.map +1 -1
  26. package/dist/harness/eval/skill-lint.d.ts +16 -0
  27. package/dist/harness/eval/skill-lint.d.ts.map +1 -0
  28. package/dist/harness/eval/skill-lint.js +129 -0
  29. package/dist/harness/eval/skill-lint.js.map +1 -0
  30. package/dist/harness/parse.d.ts +6 -0
  31. package/dist/harness/parse.d.ts.map +1 -1
  32. package/dist/harness/parse.js +18 -3
  33. package/dist/harness/parse.js.map +1 -1
  34. package/dist/harness/quality-gates.d.ts +29 -0
  35. package/dist/harness/quality-gates.d.ts.map +1 -0
  36. package/dist/harness/quality-gates.js +183 -0
  37. package/dist/harness/quality-gates.js.map +1 -0
  38. package/dist/harness/sensors.d.ts.map +1 -1
  39. package/dist/harness/sensors.js +85 -6
  40. package/dist/harness/sensors.js.map +1 -1
  41. package/dist/harness/spec-coverage.d.ts +37 -0
  42. package/dist/harness/spec-coverage.d.ts.map +1 -0
  43. package/dist/harness/spec-coverage.js +159 -0
  44. package/dist/harness/spec-coverage.js.map +1 -0
  45. package/dist/harness/viewpoint-ledger.d.ts +23 -0
  46. package/dist/harness/viewpoint-ledger.d.ts.map +1 -0
  47. package/dist/harness/viewpoint-ledger.js +118 -0
  48. package/dist/harness/viewpoint-ledger.js.map +1 -0
  49. package/dist/ingest/baseline-audit.d.ts +38 -0
  50. package/dist/ingest/baseline-audit.d.ts.map +1 -0
  51. package/dist/ingest/baseline-audit.js +85 -0
  52. package/dist/ingest/baseline-audit.js.map +1 -0
  53. package/dist/ingest/gsheet-fetch.d.ts +9 -0
  54. package/dist/ingest/gsheet-fetch.d.ts.map +1 -0
  55. package/dist/ingest/gsheet-fetch.js +180 -0
  56. package/dist/ingest/gsheet-fetch.js.map +1 -0
  57. package/dist/ingest/index.d.ts +6 -0
  58. package/dist/ingest/index.d.ts.map +1 -0
  59. package/dist/ingest/index.js +22 -0
  60. package/dist/ingest/index.js.map +1 -0
  61. package/dist/ingest/legacy-parser.d.ts +39 -0
  62. package/dist/ingest/legacy-parser.d.ts.map +1 -0
  63. package/dist/ingest/legacy-parser.js +218 -0
  64. package/dist/ingest/legacy-parser.js.map +1 -0
  65. package/dist/ingest/reconcile.d.ts +30 -0
  66. package/dist/ingest/reconcile.d.ts.map +1 -0
  67. package/dist/ingest/reconcile.js +65 -0
  68. package/dist/ingest/reconcile.js.map +1 -0
  69. package/dist/ingest/to-gherkin.d.ts +33 -0
  70. package/dist/ingest/to-gherkin.d.ts.map +1 -0
  71. package/dist/ingest/to-gherkin.js +93 -0
  72. package/dist/ingest/to-gherkin.js.map +1 -0
  73. package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
  74. package/dist/orchestrator/ai-rules-updater.js +2 -0
  75. package/dist/orchestrator/ai-rules-updater.js.map +1 -1
  76. package/dist/orchestrator/templates/ai-instructions/claude-agent-reviewer.md +1 -0
  77. package/dist/orchestrator/templates/ai-instructions/claude-skill-delivery.md +10 -0
  78. package/dist/orchestrator/templates/ai-instructions/claude-skill-ingest-legacy.md +79 -0
  79. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +25 -1
  80. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +10 -0
  81. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-ingest-legacy.md +79 -0
  82. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +44 -7
  83. package/package.json +3 -3
  84. package/src/cli/commands/audit.ts +19 -0
  85. package/src/cli/commands/delivery.ts +31 -15
  86. package/src/cli/commands/eval.ts +28 -0
  87. package/src/cli/commands/ingest.ts +141 -0
  88. package/src/cli/index.ts +4 -0
  89. package/src/dashboard/templates/index.html +108 -194
  90. package/src/harness/audit.ts +81 -4
  91. package/src/harness/capability-plan.ts +11 -0
  92. package/src/harness/eval/skill-lint.ts +87 -0
  93. package/src/harness/parse.ts +19 -3
  94. package/src/harness/quality-gates.ts +152 -0
  95. package/src/harness/sensors.ts +84 -7
  96. package/src/harness/spec-coverage.ts +139 -0
  97. package/src/harness/viewpoint-ledger.ts +80 -0
  98. package/src/ingest/baseline-audit.ts +100 -0
  99. package/src/ingest/gsheet-fetch.ts +152 -0
  100. package/src/ingest/index.ts +5 -0
  101. package/src/ingest/legacy-parser.ts +184 -0
  102. package/src/ingest/reconcile.ts +80 -0
  103. package/src/ingest/to-gherkin.ts +108 -0
  104. package/src/orchestrator/ai-rules-updater.ts +2 -0
  105. package/src/orchestrator/templates/ai-instructions/claude-agent-reviewer.md +1 -0
  106. package/src/orchestrator/templates/ai-instructions/claude-skill-delivery.md +10 -0
  107. package/src/orchestrator/templates/ai-instructions/claude-skill-ingest-legacy.md +79 -0
  108. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +25 -1
  109. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +10 -0
  110. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-ingest-legacy.md +79 -0
  111. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +44 -7
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseCSV = parseCSV;
37
+ exports.listSheets = listSheets;
38
+ exports.parseLegacyFile = parseLegacyFile;
39
+ /**
40
+ * Legacy testcase ingest (P-A) — parse a manual testcase workbook (CSV or XLSX)
41
+ * into a normalized inventory. Deterministic: pure function of the input file
42
+ * (no network, no MCP). The AI skill handles the Google-Sheets/MCP fetch upstream.
43
+ */
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ // ---- quote-aware CSV parser (embedded commas + newlines) ----
47
+ function parseCSV(text) {
48
+ const rows = [];
49
+ let row = [], field = '', q = false;
50
+ for (let i = 0; i < text.length; i++) {
51
+ const c = text[i];
52
+ if (q) {
53
+ if (c === '"') {
54
+ if (text[i + 1] === '"') {
55
+ field += '"';
56
+ i++;
57
+ }
58
+ else
59
+ q = false;
60
+ }
61
+ else
62
+ field += c;
63
+ }
64
+ else if (c === '"')
65
+ q = true;
66
+ else if (c === ',') {
67
+ row.push(field);
68
+ field = '';
69
+ }
70
+ else if (c === '\n') {
71
+ row.push(field);
72
+ rows.push(row);
73
+ row = [];
74
+ field = '';
75
+ }
76
+ else if (c !== '\r')
77
+ field += c;
78
+ }
79
+ if (field.length || row.length) {
80
+ row.push(field);
81
+ rows.push(row);
82
+ }
83
+ return rows;
84
+ }
85
+ const norm = (s) => (s || '').replace(/\*/g, '').trim().toLowerCase();
86
+ function detectSheetType(rows) {
87
+ for (let i = 0; i < Math.min(rows.length, 40); i++) {
88
+ const cells = rows[i].map(norm);
89
+ if (cells.some((c) => /^tc\s*id$/.test(c)) && cells.some((c) => /steps?|expected/.test(c)))
90
+ return { type: 'testcase', headerRow: i };
91
+ if (cells.some((c) => /item type/.test(c)) || (cells[0] === 'id' && cells.some((c) => /^item/.test(c))))
92
+ return { type: 'ui-checklist', headerRow: i };
93
+ if (cells.some((c) => /^id\/function$/.test(c)) || cells.some((c) => /viewpoint/.test(c)))
94
+ return { type: 'viewpoint-matrix', headerRow: i };
95
+ }
96
+ return { type: 'unknown', headerRow: -1 };
97
+ }
98
+ function colMap(header) {
99
+ const m = {};
100
+ header.forEach((h, i) => { const k = norm(h); if (k && !(k in m))
101
+ m[k] = i; });
102
+ return m;
103
+ }
104
+ function toPriority(raw) {
105
+ const p = (raw || '').toLowerCase();
106
+ if (/high|cao/.test(p))
107
+ return 'high';
108
+ if (/low|thấp/.test(p))
109
+ return 'low';
110
+ if (/medium|normal|trung/.test(p))
111
+ return 'normal';
112
+ return 'unknown';
113
+ }
114
+ function parseTestcaseSheet(rows, headerRow, sheet) {
115
+ const cm = colMap(rows[headerRow]);
116
+ if (cm['tc id'] == null)
117
+ return [];
118
+ const col = (r, key) => (cm[key] != null ? (r[cm[key]] || '').trim() : '');
119
+ const out = [];
120
+ // Fill-down ONLY the grouping columns (genuinely merged across rows). Precondition is
121
+ // kept PER-ROW: filling it down would bleed one row's "needs API/DB/login" into unrelated
122
+ // rows and falsely inflate the capability/driver signal.
123
+ const fd = { page: '', category: '', sub: '' };
124
+ for (let i = headerRow + 1; i < rows.length; i++) {
125
+ const r = rows[i];
126
+ const id = col(r, 'tc id');
127
+ if (!id || /^(total|module|test environment)/i.test(id))
128
+ continue;
129
+ fd.page = col(r, 'page name') || fd.page;
130
+ fd.category = col(r, 'category') || fd.category;
131
+ fd.sub = col(r, 'sub-category') || fd.sub;
132
+ const steps = col(r, 'steps');
133
+ const expected = col(r, 'expected results') || col(r, 'expected result');
134
+ if (!steps && !expected)
135
+ continue; // skip noise / spacer rows
136
+ out.push({
137
+ id, sheet, page: fd.page, category: fd.category || '(uncategorized)',
138
+ subCategory: fd.sub || undefined, precondition: col(r, 'pre-condition') || undefined,
139
+ testData: col(r, 'test data') || undefined, steps, expected,
140
+ priority: toPriority(col(r, 'priority')),
141
+ type: col(r, 'testcase type') || undefined,
142
+ result: col(r, 'test result') || col(r, 'test result\nchrome (100%)') || undefined,
143
+ });
144
+ }
145
+ return out;
146
+ }
147
+ /** Load sheets from one input file: CSV (1 sheet), XLSX (all sheets), or a JSON
148
+ * sheet-bundle (the shape the Google-Sheets/MCP skill produces). */
149
+ async function loadSheets(filePath) {
150
+ const ext = path.extname(filePath).toLowerCase();
151
+ if (ext === '.csv') {
152
+ return [{ name: path.basename(filePath, '.csv'), rows: parseCSV(fs.readFileSync(filePath, 'utf8')) }];
153
+ }
154
+ if (ext === '.json') {
155
+ // Bundle shapes: { sheets: [{name, rows}] } | [{name, rows}] | { "<tab>": [[..]] }
156
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
157
+ const arr = Array.isArray(data) ? data : Array.isArray(data.sheets) ? data.sheets : null;
158
+ if (arr)
159
+ return arr.map((s) => ({ name: String(s.name), rows: s.rows }));
160
+ if (data && typeof data === 'object')
161
+ return Object.entries(data).map(([name, rows]) => ({ name, rows: rows }));
162
+ throw new Error('Invalid JSON sheet-bundle: expected { sheets: [{name, rows}] }');
163
+ }
164
+ if (ext === '.xlsx') {
165
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
166
+ const ExcelJS = require('exceljs');
167
+ const wb = new ExcelJS.Workbook();
168
+ await wb.xlsx.readFile(filePath);
169
+ const out = [];
170
+ wb.eachSheet((ws) => {
171
+ const rows = [];
172
+ ws.eachRow((row) => {
173
+ const cells = [];
174
+ row.eachCell({ includeEmpty: true }, (cell) => { cells.push(cell.text != null ? String(cell.text) : ''); });
175
+ rows.push(cells);
176
+ });
177
+ out.push({ name: ws.name, rows });
178
+ });
179
+ return out;
180
+ }
181
+ throw new Error(`Unsupported file type: ${ext} (use .csv, .xlsx, or a .json sheet-bundle)`);
182
+ }
183
+ /** Classify sheets without parsing testcases — for `--list-sheets`. */
184
+ async function listSheets(filePaths) {
185
+ const files = Array.isArray(filePaths) ? filePaths : [filePaths];
186
+ const out = [];
187
+ for (const f of files) {
188
+ for (const s of await loadSheets(f)) {
189
+ const { type } = detectSheetType(s.rows);
190
+ out.push({ name: s.name, type, rows: s.rows.length });
191
+ }
192
+ }
193
+ return out;
194
+ }
195
+ /** Parse one or more inputs (CSV/XLSX/JSON-bundle) into an inventory. Optionally
196
+ * restrict to a set of tab names (`onlySheets`) — workbooks carry many tabs. */
197
+ async function parseLegacyFile(filePaths, onlySheets) {
198
+ const files = Array.isArray(filePaths) ? filePaths : [filePaths];
199
+ const want = onlySheets && onlySheets.length ? new Set(onlySheets.map((s) => s.trim().toLowerCase())) : null;
200
+ const inv = {
201
+ source: { file: files.map((f) => path.basename(f)).join(', ') },
202
+ sheets: [], testcases: [],
203
+ };
204
+ for (const f of files) {
205
+ for (const s of await loadSheets(f)) {
206
+ if (want && !want.has(s.name.trim().toLowerCase()))
207
+ continue;
208
+ const { type, headerRow } = detectSheetType(s.rows);
209
+ let tcs = [];
210
+ if (type === 'testcase' && headerRow >= 0)
211
+ tcs = parseTestcaseSheet(s.rows, headerRow, s.name);
212
+ inv.sheets.push({ name: s.name, type, rows: tcs.length || s.rows.length });
213
+ inv.testcases.push(...tcs);
214
+ }
215
+ }
216
+ return inv;
217
+ }
218
+ //# sourceMappingURL=legacy-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-parser.js","sourceRoot":"","sources":["../../src/ingest/legacy-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Viewpoint Reconciliation (P-C) — the link between a legacy suite and the Harness.
3
+ *
4
+ * A 1:1 convert reproduces the legacy suite's blind spots. Reconciliation runs the
5
+ * harness viewpoint-gate over the legacy-derived scenarios to answer: which catalog-
6
+ * expected viewpoints does the legacy suite ALREADY cover, and which are MISSING
7
+ * (blind spots the old QA never wrote)? It emits a draft viewpoint overview that
8
+ * seeds `/sungen:create-test` + the harness coverage-gate, so the generated suite is
9
+ * raised to catalog quality instead of merely mirroring the legacy.
10
+ */
11
+ import { LegacyInventory } from './legacy-parser';
12
+ export interface Reconciliation {
13
+ pageType: string | null;
14
+ coverageRatio: number;
15
+ themesCovered: number;
16
+ themesTotal: number;
17
+ blindSpots: {
18
+ theme: string;
19
+ status: 'missing' | 'shallow';
20
+ }[];
21
+ universalGaps: string[];
22
+ legacyViewpoints: {
23
+ vpGroup: string;
24
+ count: number;
25
+ }[];
26
+ }
27
+ export declare function reconcileViewpoints(inv: LegacyInventory): Reconciliation;
28
+ /** A draft test-viewpoint.md: legacy-derived viewpoints + catalog blind-spots to fill. */
29
+ export declare function renderViewpointOverview(featureName: string, r: Reconciliation): string;
30
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/ingest/reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;KAAE,EAAE,CAAC;IAC/D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACxD;AAaD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,cAAc,CAqBxE;AAED,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,MAAM,CAoBtF"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reconcileViewpoints = reconcileViewpoints;
4
+ exports.renderViewpointOverview = renderViewpointOverview;
5
+ const baseline_audit_1 = require("./baseline-audit");
6
+ const sensors_1 = require("../harness/sensors");
7
+ function vpGroupOf(category) {
8
+ const c = (category || '').toLowerCase();
9
+ if (/search|filter|điều kiện|条件/.test(c))
10
+ return 'SEARCH';
11
+ if (/input|validation|nhập|入力/.test(c))
12
+ return 'VAL';
13
+ if (/display|hiển thị|表示|data/.test(c))
14
+ return 'DISPLAY';
15
+ if (/layout|responsive|tab order|ui|giao diện/.test(c))
16
+ return 'UI';
17
+ if (/flow|navigation|遷移|chuyển|event/.test(c))
18
+ return 'NAV';
19
+ if (/paging|sort|phân trang/.test(c))
20
+ return 'LIST';
21
+ return (c.replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').toUpperCase().slice(0, 8)) || 'GEN';
22
+ }
23
+ function reconcileViewpoints(inv) {
24
+ const scenarios = inv.testcases.map(baseline_audit_1.legacyToScenarioInfo);
25
+ const catalog = (0, sensors_1.loadCatalog)();
26
+ const gate = (0, sensors_1.viewpointGate)(scenarios, [], catalog);
27
+ const groups = {};
28
+ for (const tc of inv.testcases) {
29
+ const g = vpGroupOf(tc.category);
30
+ groups[g] = (groups[g] || 0) + 1;
31
+ }
32
+ return {
33
+ pageType: gate.pageType,
34
+ coverageRatio: gate.coverageRatio,
35
+ themesCovered: gate.themesCovered,
36
+ themesTotal: gate.themesTotal,
37
+ blindSpots: gate.gaps.map((g) => ({ theme: g.theme, status: g.status })),
38
+ universalGaps: gate.universalGaps,
39
+ legacyViewpoints: Object.entries(groups).map(([vpGroup, count]) => ({ vpGroup, count }))
40
+ .sort((a, b) => b.count - a.count),
41
+ };
42
+ }
43
+ /** A draft test-viewpoint.md: legacy-derived viewpoints + catalog blind-spots to fill. */
44
+ function renderViewpointOverview(featureName, r) {
45
+ const L = [];
46
+ L.push(`# Test Viewpoint — ${featureName} (drafted from legacy + reconciled with the catalog)`, '');
47
+ L.push('> Auto-drafted by `sungen ingest`. Rows from the legacy suite are listed first;');
48
+ L.push('> rows marked **⚠ BLIND-SPOT** are catalog-expected viewpoints the legacy suite does');
49
+ L.push('> NOT cover — add scenarios for them via `/sungen:create-test`. Refine before use.', '');
50
+ L.push(`Detected page-type: \`${r.pageType ?? 'unknown'}\` · legacy covers ${r.themesCovered}/${r.themesTotal} catalog themes (${(r.coverageRatio * 100).toFixed(0)}%)`, '');
51
+ L.push('## Priority Viewpoints', '', '| VP | Priority | Reason |', '|---|---|---|');
52
+ let n = 1;
53
+ for (const v of r.legacyViewpoints) {
54
+ L.push(`| VP-${v.vpGroup}-${String(n).padStart(3, '0')} | Medium | legacy suite: ${v.count} testcase(s) |`);
55
+ n++;
56
+ }
57
+ for (const b of r.blindSpots) {
58
+ L.push(`| VP-GAP-${String(n).padStart(3, '0')} | High | ⚠ BLIND-SPOT — catalog expects "${b.theme}" (${b.status}); legacy has none |`);
59
+ n++;
60
+ }
61
+ if (r.universalGaps.length)
62
+ L.push('', `> Universal reminders not covered: ${r.universalGaps.join(', ')}`);
63
+ return L.join('\n') + '\n';
64
+ }
65
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/ingest/reconcile.ts"],"names":[],"mappings":";;AAmCA,kDAqBC;AAGD,0DAoBC;AApED,qDAAwD;AACxD,gDAAgE;AAYhE,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1D,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,IAAI,0CAA0C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACpD,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AAClG,CAAC;AAED,SAAgB,mBAAmB,CAAC,GAAoB;IACtD,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,qCAAoB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAA,qBAAW,GAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAEnD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;aACrF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,SAAgB,uBAAuB,CAAC,WAAmB,EAAE,CAAiB;IAC5E,MAAM,CAAC,GAAa,EAAE,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,sBAAsB,WAAW,sDAAsD,EAAE,EAAE,CAAC,CAAC;IACpG,CAAC,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAC1F,CAAC,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;IAC/F,CAAC,CAAC,IAAI,CAAC,oFAAoF,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,QAAQ,IAAI,SAAS,sBAAsB,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,WAAW,oBAAoB,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7K,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,EAAE,4BAA4B,EAAE,eAAe,CAAC,CAAC;IACpF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,6BAA6B,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC;QAC5G,CAAC,EAAE,CAAC;IACN,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAC7B,CAAC,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,6CAA6C,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,sBAAsB,CAAC,CAAC;QACvI,CAAC,EAAE,CAAC;IACN,CAAC;IACD,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM;QACxB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,sCAAsC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Legacy inventory → Gherkin DRAFT + traceability + gap report (P-B).
3
+ *
4
+ * Deterministic SCAFFOLDING only: it preserves every legacy testcase as a scenario
5
+ * with its source (TC id + verbatim Steps/Expected as comments), the right priority +
6
+ * @manual tags (from the capability classifier), and a Given seeded from the
7
+ * precondition. The free-text → real `[Reference] type` step mapping is a SEMANTIC step
8
+ * done by the AI layer (`/sungen:create-test`) on top of this draft — the draft makes
9
+ * that refinement traceable and correctly scoped, it is not final runnable Gherkin.
10
+ */
11
+ import { LegacyInventory } from './legacy-parser';
12
+ export interface TraceEntry {
13
+ tcId: string;
14
+ scenario: string;
15
+ vpGroup: string;
16
+ mode: 'ui' | 'cross-screen' | 'manual-capability' | 'manual-keep';
17
+ reasonCode: string;
18
+ drivers: string[];
19
+ }
20
+ export interface ConvertResult {
21
+ feature: string;
22
+ trace: TraceEntry[];
23
+ gap: {
24
+ total: number;
25
+ ui: number;
26
+ crossScreen: number;
27
+ manualCapability: number;
28
+ manualKeep: number;
29
+ noExpected: number;
30
+ };
31
+ }
32
+ export declare function inventoryToGherkin(inv: LegacyInventory, featureName: string): ConvertResult;
33
+ //# sourceMappingURL=to-gherkin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-gherkin.d.ts","sourceRoot":"","sources":["../../src/ingest/to-gherkin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,eAAe,EAAkB,MAAM,iBAAiB,CAAC;AAGlE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG,cAAc,GAAG,mBAAmB,GAAG,aAAa,CAAC;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAC/C,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;KAClE,CAAC;CACH;AA4BD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAkD3F"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inventoryToGherkin = inventoryToGherkin;
4
+ const capability_plan_1 = require("../harness/capability-plan");
5
+ // Map a legacy category phrase → a VP group code (best-effort; falls back to a slug).
6
+ function vpGroupOf(category) {
7
+ const c = (category || '').toLowerCase();
8
+ if (/search|filter|điều kiện|条件/.test(c))
9
+ return 'SEARCH';
10
+ if (/input|validation|nhập|入力/.test(c))
11
+ return 'VAL';
12
+ if (/display|hiển thị|表示|data/.test(c))
13
+ return 'DISPLAY';
14
+ if (/layout|responsive|tab order|ui|giao diện/.test(c))
15
+ return 'UI';
16
+ if (/flow|navigation|遷移|chuyển|event/.test(c))
17
+ return 'NAV';
18
+ if (/paging|sort|phân trang/.test(c))
19
+ return 'LIST';
20
+ const slug = c.replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').toUpperCase().slice(0, 8);
21
+ return slug || 'GEN';
22
+ }
23
+ function oneLine(s, max = 60) {
24
+ return (s || '').replace(/\s+/g, ' ').trim().slice(0, max);
25
+ }
26
+ function classify(tc) {
27
+ const code = (0, capability_plan_1.classifyReason)(`${tc.precondition || ''} ${tc.steps} ${tc.expected} ${tc.testData || ''}`);
28
+ if (!code)
29
+ return { mode: 'ui', code: '', drivers: [] };
30
+ if (code === 'XS')
31
+ return { mode: 'cross-screen', code, drivers: [] };
32
+ const def = capability_plan_1.MANUAL_REASONS[code];
33
+ if (def?.cls === 'keep')
34
+ return { mode: 'manual-keep', code, drivers: [] };
35
+ return { mode: 'manual-capability', code, drivers: def?.drivers || [] };
36
+ }
37
+ function inventoryToGherkin(inv, featureName) {
38
+ const tcs = inv.testcases;
39
+ const trace = [];
40
+ const gap = { total: tcs.length, ui: 0, crossScreen: 0, manualCapability: 0, manualKeep: 0, noExpected: 0 };
41
+ const seq = {};
42
+ const lines = [];
43
+ lines.push('@legacy');
44
+ lines.push(`Feature: ${featureName} (drafted from legacy testcases: ${inv.source.file})`);
45
+ lines.push('');
46
+ lines.push(' # Auto-drafted by `sungen ingest --emit-gherkin` from a legacy manual testcase suite.');
47
+ lines.push(' # Each scenario carries its source TC id (@legacy:<id>) + the original');
48
+ lines.push(' # precondition/steps/expected as comments. REFINE the When/Then into real');
49
+ lines.push(' # [Reference] type steps with /sungen:create-test — the free-text → step');
50
+ lines.push(' # mapping is an AI step; this draft only fixes structure + traceability.');
51
+ lines.push('');
52
+ for (const tc of tcs) {
53
+ const vp = vpGroupOf(tc.category);
54
+ seq[vp] = (seq[vp] || 0) + 1;
55
+ const code = `VP-${vp}-${String(seq[vp]).padStart(3, '0')}`;
56
+ const desc = oneLine(tc.subCategory || tc.steps) || tc.id;
57
+ const title = `${code} ${desc}`;
58
+ const { mode, code: reason, drivers } = classify(tc);
59
+ if (!tc.expected)
60
+ gap.noExpected++;
61
+ if (mode === 'ui')
62
+ gap.ui++;
63
+ else if (mode === 'cross-screen')
64
+ gap.crossScreen++;
65
+ else if (mode === 'manual-capability')
66
+ gap.manualCapability++;
67
+ else
68
+ gap.manualKeep++;
69
+ const tags = [`@${tc.priority === 'unknown' ? 'normal' : tc.priority}`];
70
+ if (mode !== 'ui')
71
+ tags.push('@manual');
72
+ tags.push(`@legacy:${tc.id}`);
73
+ lines.push(` ${tags.join(' ')}`);
74
+ lines.push(` Scenario: ${title}`);
75
+ if (mode === 'manual-capability')
76
+ lines.push(` # @manual:${reason} — needs ${drivers.join('/') || 'capability'} (driver candidate)`);
77
+ else if (mode === 'manual-keep')
78
+ lines.push(` # @manual:${reason} — judgment floor, keep manual`);
79
+ else if (mode === 'cross-screen')
80
+ lines.push(` # cross-screen → model as a flow (/sungen:add-flow)`);
81
+ if (tc.precondition)
82
+ lines.push(` # precondition: ${oneLine(tc.precondition, 120)}`);
83
+ lines.push(` # steps: ${oneLine(tc.steps, 160)}`);
84
+ lines.push(` # expected: ${oneLine(tc.expected, 160)}`);
85
+ if (tc.precondition)
86
+ lines.push(` Given User is on [${featureName}] page`);
87
+ lines.push(' # TODO(create-test): map the steps above to real When/Then [Reference] steps');
88
+ lines.push('');
89
+ trace.push({ tcId: tc.id, scenario: title, vpGroup: vp, mode, reasonCode: reason, drivers });
90
+ }
91
+ return { feature: lines.join('\n'), trace, gap };
92
+ }
93
+ //# sourceMappingURL=to-gherkin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-gherkin.js","sourceRoot":"","sources":["../../src/ingest/to-gherkin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ai-rules-updater.d.ts","sourceRoot":"","sources":["../../src/orchestrator/ai-rules-updater.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,eAAO,MAAM,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAmFnD,CAAC;AAKF,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAUxC,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,aAAa,CAAS;gBAElB,GAAG,EAAE,MAAM;IAKjB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA4G7C"}
1
+ {"version":3,"file":"ai-rules-updater.d.ts","sourceRoot":"","sources":["../../src/orchestrator/ai-rules-updater.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,eAAO,MAAM,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAqFnD,CAAC;AAKF,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAUxC,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,aAAa,CAAS;gBAElB,GAAG,EAAE,MAAM;IAKjB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA4G7C"}
@@ -78,6 +78,7 @@ exports.AI_RULES_FILE_MAPPING = [
78
78
  ['claude-skill-selector-fix.md', '.claude/skills/sungen-selector-fix/SKILL.md'],
79
79
  ['claude-skill-tc-review.md', '.claude/skills/sungen-tc-review/SKILL.md'],
80
80
  ['claude-skill-harness-audit.md', '.claude/skills/sungen-harness-audit/SKILL.md'],
81
+ ['claude-skill-ingest-legacy.md', '.claude/skills/sungen-ingest-legacy/SKILL.md'],
81
82
  ['claude-skill-viewpoint.md', '.claude/skills/sungen-viewpoint/SKILL.md'],
82
83
  ['claude-skill-viewpoint-group-a-data-entry.md', '.claude/skills/sungen-viewpoint/group-a-data-entry.md'],
83
84
  ['claude-skill-viewpoint-group-b-data-ops.md', '.claude/skills/sungen-viewpoint/group-b-data-ops.md'],
@@ -107,6 +108,7 @@ exports.AI_RULES_FILE_MAPPING = [
107
108
  ['github-skill-sungen-selector-fix.md', '.github/skills/sungen-selector-fix/SKILL.md'],
108
109
  ['github-skill-sungen-tc-review.md', '.github/skills/sungen-tc-review/SKILL.md'],
109
110
  ['github-skill-sungen-harness-audit.md', '.github/skills/sungen-harness-audit/SKILL.md'],
111
+ ['github-skill-sungen-ingest-legacy.md', '.github/skills/sungen-ingest-legacy/SKILL.md'],
110
112
  ['github-skill-sungen-viewpoint.md', '.github/skills/sungen-viewpoint/SKILL.md'],
111
113
  ['github-skill-sungen-viewpoint-group-a-data-entry.md', '.github/skills/sungen-viewpoint/group-a-data-entry.md'],
112
114
  ['github-skill-sungen-viewpoint-group-b-data-ops.md', '.github/skills/sungen-viewpoint/group-b-data-ops.md'],
@@ -1 +1 @@
1
- {"version":3,"file":"ai-rules-updater.js","sourceRoot":"","sources":["../../src/orchestrator/ai-rules-updater.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-rules-updater.js","sourceRoot":"","sources":["../../src/orchestrator/ai-rules-updater.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ You are an **independent Senior QA Reviewer**. You did **not** write these tests
14
14
 
15
15
  ## What to judge (semantic — the gate misses these)
16
16
  1. **Title ↔ steps proof.** For every scenario, do the **steps actually prove the title/viewpoint**? Flag "title claims X but steps only assert Y". (e.g. title "adds the selected product, not a random one" but Then only `see [Added] modal`.)
17
+ - **Negative / "does-not-happen" claims** (any language — "does not", "no", "prevents", "không", "chưa"): the proof must be a step whose result **differs** between the claim holding and not holding. Ask: *would this `Then` still pass if the bad thing happened?* If yes, it proves nothing. The classic trap: title "browser back does **not** re-submit" with `Then see [sent] page` — that page is identical whether or not the request re-fired. Demand a **contrast/count** proof (record count unchanged, state hidden/empty, error shown) or a justified `@manual` with a setup→action→assert-absence oracle. This generalises to every side-effect (re-charge, duplicate order, resend OTP, data leak), not just re-submit.
17
18
  2. **Observable Then.** Is each `Then` an **observable outcome**, not a restated action or a tautology (e.g. `Then User see [Carousel] section` after clicking next — proves nothing changed)?
18
19
  3. **Business-critical depth.** For cart / product-detail / filter / list viewpoints, do steps assert **DATA** (name, price, quantity, all-items-belong) — not just page/modal visibility? Recommend the concrete deep step: `User remember [X] text as {{v}}` + `... with {{v}}`, or `User see all [X] contain {{v}}`.
19
20
  4. **@manual justification.** Is each `@manual` genuinely unautomatable (cross-screen/external/visual) — or a cop-out to dodge the gate? Cross-screen → should be a flow.
@@ -78,6 +78,16 @@ The CLI reads the **per-target result file first** (co-located with `.spec.ts`),
78
78
 
79
79
  ---
80
80
 
81
+ ## XLSX sheets — Auto / Manual split
82
+
83
+ The `.xlsx` is split into two sheets so QA manages the sets separately:
84
+ - **`Auto`** — automatable test cases (`Auto` + `Not compiled`).
85
+ - **`Manual`** — `@manual` test cases (always present, header-only when there are none).
86
+
87
+ Multi-locale (no `SUNGEN_ENV`): one **`<LOCALE> Auto`** sheet per locale + a single shared **`Manual`** sheet (manual TCs are locale-invariant). The **CSV stays one file with every row** — the `Testcase type` column distinguishes Auto vs Manual.
88
+
89
+ ---
90
+
81
91
  ## Excluded from CSV
82
92
 
83
93
  - `@steps:<name>` **base** scenarios — these are setup-only, inlined into `@extend:...` scenarios at compile time