@sun-asterisk/sungen 3.0.0-beta.75 → 3.0.0-beta.78
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/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +10 -0
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +30 -14
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/ingest.d.ts +3 -0
- package/dist/cli/commands/ingest.d.ts.map +1 -0
- package/dist/cli/commands/ingest.js +179 -0
- package/dist/cli/commands/ingest.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/templates/index.html +54 -54
- package/dist/harness/audit.d.ts +2 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +15 -4
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/capability-plan.d.ts +6 -0
- package/dist/harness/capability-plan.d.ts.map +1 -1
- package/dist/harness/capability-plan.js +13 -0
- package/dist/harness/capability-plan.js.map +1 -1
- package/dist/harness/spec-coverage.d.ts +37 -0
- package/dist/harness/spec-coverage.d.ts.map +1 -0
- package/dist/harness/spec-coverage.js +159 -0
- package/dist/harness/spec-coverage.js.map +1 -0
- package/dist/ingest/baseline-audit.d.ts +38 -0
- package/dist/ingest/baseline-audit.d.ts.map +1 -0
- package/dist/ingest/baseline-audit.js +85 -0
- package/dist/ingest/baseline-audit.js.map +1 -0
- package/dist/ingest/gsheet-fetch.d.ts +9 -0
- package/dist/ingest/gsheet-fetch.d.ts.map +1 -0
- package/dist/ingest/gsheet-fetch.js +180 -0
- package/dist/ingest/gsheet-fetch.js.map +1 -0
- package/dist/ingest/index.d.ts +6 -0
- package/dist/ingest/index.d.ts.map +1 -0
- package/dist/ingest/index.js +22 -0
- package/dist/ingest/index.js.map +1 -0
- package/dist/ingest/legacy-parser.d.ts +39 -0
- package/dist/ingest/legacy-parser.d.ts.map +1 -0
- package/dist/ingest/legacy-parser.js +218 -0
- package/dist/ingest/legacy-parser.js.map +1 -0
- package/dist/ingest/reconcile.d.ts +30 -0
- package/dist/ingest/reconcile.d.ts.map +1 -0
- package/dist/ingest/reconcile.js +65 -0
- package/dist/ingest/reconcile.js.map +1 -0
- package/dist/ingest/to-gherkin.d.ts +33 -0
- package/dist/ingest/to-gherkin.d.ts.map +1 -0
- package/dist/ingest/to-gherkin.js +93 -0
- package/dist/ingest/to-gherkin.js.map +1 -0
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +2 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/templates/ai-instructions/claude-skill-delivery.md +10 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-ingest-legacy.md +79 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +10 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-ingest-legacy.md +79 -0
- package/package.json +3 -3
- package/src/cli/commands/audit.ts +7 -0
- package/src/cli/commands/delivery.ts +31 -15
- package/src/cli/commands/ingest.ts +141 -0
- package/src/cli/index.ts +2 -0
- package/src/dashboard/templates/index.html +54 -54
- package/src/harness/audit.ts +17 -4
- package/src/harness/capability-plan.ts +11 -0
- package/src/harness/spec-coverage.ts +139 -0
- package/src/ingest/baseline-audit.ts +100 -0
- package/src/ingest/gsheet-fetch.ts +152 -0
- package/src/ingest/index.ts +5 -0
- package/src/ingest/legacy-parser.ts +184 -0
- package/src/ingest/reconcile.ts +80 -0
- package/src/ingest/to-gherkin.ts +108 -0
- package/src/orchestrator/ai-rules-updater.ts +2 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-delivery.md +10 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-ingest-legacy.md +79 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +10 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-ingest-legacy.md +79 -0
|
@@ -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,
|
|
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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"}
|
|
@@ -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
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sungen-ingest-legacy
|
|
3
|
+
description: 'Import a legacy manual testcase suite from Google Sheets (multi-tab) or a local file into Sungen — fetch via MCP, then sungen ingest. Use when the user wants to convert/evaluate an existing manual testcase spreadsheet.'
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# sungen-ingest-legacy
|
|
8
|
+
|
|
9
|
+
Bring an existing **manual testcase workbook** into Sungen for evaluation + conversion. The
|
|
10
|
+
fetch (Google login + pick file) is done here via MCP; the parsing/audit is deterministic
|
|
11
|
+
(`sungen ingest`). **Security:** the workbook is the user's project data — read it on
|
|
12
|
+
consent, keep the output in their project, never upload or commit the content.
|
|
13
|
+
|
|
14
|
+
## Flow
|
|
15
|
+
|
|
16
|
+
1. **Locate the source.**
|
|
17
|
+
- **Google Sheets (recommended):** use the Google Drive MCP. Authenticate if needed, then
|
|
18
|
+
`search_files` / list to find the workbook; confirm the file with the user.
|
|
19
|
+
- **Local:** if the user points to a `.xlsx`/`.csv`, skip to step 4.
|
|
20
|
+
|
|
21
|
+
2. **List the tabs.** Read the workbook's sheet/tab names (Drive MCP file metadata or a values
|
|
22
|
+
read). A legacy workbook usually has **many** tabs — some are testcases, some are
|
|
23
|
+
viewpoint/UI matrices.
|
|
24
|
+
|
|
25
|
+
3. **Assemble a JSON sheet-bundle.** For each tab, read its cell values (a 2-D array of
|
|
26
|
+
strings) and write a local bundle in the user project (e.g.
|
|
27
|
+
`qa/screens/<screen>/requirements/legacy/bundle.json`):
|
|
28
|
+
```json
|
|
29
|
+
{ "source": "<workbook name>", "sheets": [ { "name": "<tab>", "rows": [["TC ID","Page",…],["TC-01",…]] } ] }
|
|
30
|
+
```
|
|
31
|
+
Record only the **source link** in `requirements/legacy/source.yaml` — never the content.
|
|
32
|
+
|
|
33
|
+
4. **Classify the tabs.** Run:
|
|
34
|
+
```bash
|
|
35
|
+
sungen ingest --legacy <bundle.json|file.xlsx|file.csv> --list-sheets
|
|
36
|
+
```
|
|
37
|
+
It prints each tab + detected type (`testcase` / `viewpoint-matrix` / `ui-checklist`).
|
|
38
|
+
|
|
39
|
+
5. **Confirm which tabs to ingest.** Use `AskUserQuestion` to let the user pick the
|
|
40
|
+
**testcase** tabs (matrix/UI tabs feed the viewpoint layer later, not the inventory).
|
|
41
|
+
|
|
42
|
+
6. **Ingest + reconcile.**
|
|
43
|
+
```bash
|
|
44
|
+
sungen ingest --legacy <source> --screen <screen> --sheets "<Tab A>,<Tab B>" --emit-gherkin
|
|
45
|
+
```
|
|
46
|
+
Produces: `inventory.json` (+ baseline audit), `*.legacy-draft.feature` + `legacy-trace.json`
|
|
47
|
+
(parity: `@legacy:<id>` per scenario), and `test-viewpoint.draft.md` with **blind-spots**
|
|
48
|
+
(catalog-expected viewpoints the legacy suite lacks).
|
|
49
|
+
|
|
50
|
+
7. **Hand off to quality.** Tell the user the next step is `/sungen:create-test <screen>` —
|
|
51
|
+
it discovers + refines the draft into real `[Reference]` steps and fills the blind-spots;
|
|
52
|
+
then `sungen audit <screen>` gates quality. A 1:1 convert is NOT the deliverable; the
|
|
53
|
+
harness raises the legacy floor to catalog quality.
|
|
54
|
+
|
|
55
|
+
## Governance block (important)
|
|
56
|
+
|
|
57
|
+
Many orgs mark confidential files as **"ineligible for generative AI contexts"** — the
|
|
58
|
+
Google Drive MCP will then **refuse** to read the file (metadata + download both error).
|
|
59
|
+
This is the org's DLP policy, not a bug, and it is the *expected* outcome for a
|
|
60
|
+
confidential testcase suite. When you hit it, **do not retry** — fall back:
|
|
61
|
+
|
|
62
|
+
> "This sheet is restricted by your org's data policy, so I can't read it through the
|
|
63
|
+
> AI connector. Two ways to proceed, both running as **you**, not AI:
|
|
64
|
+
> (1) `sungen ingest --gsheet <url>` — fetches under your own Google identity
|
|
65
|
+
> (read-only; Viewer/Commenter is enough). It offers to install `googleapis`
|
|
66
|
+
> and to open the Google login in your browser (pick your account), then
|
|
67
|
+
> retries automatically. Needs the gcloud SDK for the browser login.
|
|
68
|
+
> (2) Export it manually (**File → Download → Microsoft Excel `.xlsx`**) and I'll run
|
|
69
|
+
> `sungen ingest --legacy <file>.xlsx`."
|
|
70
|
+
|
|
71
|
+
The local-file path is deterministic and **never sends the content through AI** — the
|
|
72
|
+
correct, governance-compliant channel for confidential data. The MCP auto-pick is only
|
|
73
|
+
for files the org does *not* restrict.
|
|
74
|
+
|
|
75
|
+
## Notes
|
|
76
|
+
- Multiple local CSVs (one per tab) also work: `--legacy tab1.csv tab2.csv …`.
|
|
77
|
+
- Re-run only re-fetches when the user asks; otherwise reuse the saved bundle.
|
|
78
|
+
- Do not invent testcases. Only ingest what the workbook contains; the *augmentation*
|
|
79
|
+
(blind-spots) happens in `/sungen:create-test`, flagged for human review.
|
|
@@ -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
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sungen-ingest-legacy
|
|
3
|
+
description: 'Import a legacy manual testcase suite from Google Sheets (multi-tab) or a local file into Sungen — fetch via MCP, then sungen ingest. Use when the user wants to convert/evaluate an existing manual testcase spreadsheet.'
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# sungen-ingest-legacy
|
|
8
|
+
|
|
9
|
+
Bring an existing **manual testcase workbook** into Sungen for evaluation + conversion. The
|
|
10
|
+
fetch (Google login + pick file) is done here via MCP; the parsing/audit is deterministic
|
|
11
|
+
(`sungen ingest`). **Security:** the workbook is the user's project data — read it on
|
|
12
|
+
consent, keep the output in their project, never upload or commit the content.
|
|
13
|
+
|
|
14
|
+
## Flow
|
|
15
|
+
|
|
16
|
+
1. **Locate the source.**
|
|
17
|
+
- **Google Sheets (recommended):** use the Google Drive MCP. Authenticate if needed, then
|
|
18
|
+
`search_files` / list to find the workbook; confirm the file with the user.
|
|
19
|
+
- **Local:** if the user points to a `.xlsx`/`.csv`, skip to step 4.
|
|
20
|
+
|
|
21
|
+
2. **List the tabs.** Read the workbook's sheet/tab names (Drive MCP file metadata or a values
|
|
22
|
+
read). A legacy workbook usually has **many** tabs — some are testcases, some are
|
|
23
|
+
viewpoint/UI matrices.
|
|
24
|
+
|
|
25
|
+
3. **Assemble a JSON sheet-bundle.** For each tab, read its cell values (a 2-D array of
|
|
26
|
+
strings) and write a local bundle in the user project (e.g.
|
|
27
|
+
`qa/screens/<screen>/requirements/legacy/bundle.json`):
|
|
28
|
+
```json
|
|
29
|
+
{ "source": "<workbook name>", "sheets": [ { "name": "<tab>", "rows": [["TC ID","Page",…],["TC-01",…]] } ] }
|
|
30
|
+
```
|
|
31
|
+
Record only the **source link** in `requirements/legacy/source.yaml` — never the content.
|
|
32
|
+
|
|
33
|
+
4. **Classify the tabs.** Run:
|
|
34
|
+
```bash
|
|
35
|
+
sungen ingest --legacy <bundle.json|file.xlsx|file.csv> --list-sheets
|
|
36
|
+
```
|
|
37
|
+
It prints each tab + detected type (`testcase` / `viewpoint-matrix` / `ui-checklist`).
|
|
38
|
+
|
|
39
|
+
5. **Confirm which tabs to ingest.** Use `AskUserQuestion` to let the user pick the
|
|
40
|
+
**testcase** tabs (matrix/UI tabs feed the viewpoint layer later, not the inventory).
|
|
41
|
+
|
|
42
|
+
6. **Ingest + reconcile.**
|
|
43
|
+
```bash
|
|
44
|
+
sungen ingest --legacy <source> --screen <screen> --sheets "<Tab A>,<Tab B>" --emit-gherkin
|
|
45
|
+
```
|
|
46
|
+
Produces: `inventory.json` (+ baseline audit), `*.legacy-draft.feature` + `legacy-trace.json`
|
|
47
|
+
(parity: `@legacy:<id>` per scenario), and `test-viewpoint.draft.md` with **blind-spots**
|
|
48
|
+
(catalog-expected viewpoints the legacy suite lacks).
|
|
49
|
+
|
|
50
|
+
7. **Hand off to quality.** Tell the user the next step is `/sungen:create-test <screen>` —
|
|
51
|
+
it discovers + refines the draft into real `[Reference]` steps and fills the blind-spots;
|
|
52
|
+
then `sungen audit <screen>` gates quality. A 1:1 convert is NOT the deliverable; the
|
|
53
|
+
harness raises the legacy floor to catalog quality.
|
|
54
|
+
|
|
55
|
+
## Governance block (important)
|
|
56
|
+
|
|
57
|
+
Many orgs mark confidential files as **"ineligible for generative AI contexts"** — the
|
|
58
|
+
Google Drive MCP will then **refuse** to read the file (metadata + download both error).
|
|
59
|
+
This is the org's DLP policy, not a bug, and it is the *expected* outcome for a
|
|
60
|
+
confidential testcase suite. When you hit it, **do not retry** — fall back:
|
|
61
|
+
|
|
62
|
+
> "This sheet is restricted by your org's data policy, so I can't read it through the
|
|
63
|
+
> AI connector. Two ways to proceed, both running as **you**, not AI:
|
|
64
|
+
> (1) `sungen ingest --gsheet <url>` — fetches under your own Google identity
|
|
65
|
+
> (read-only; Viewer/Commenter is enough). It offers to install `googleapis`
|
|
66
|
+
> and to open the Google login in your browser (pick your account), then
|
|
67
|
+
> retries automatically. Needs the gcloud SDK for the browser login.
|
|
68
|
+
> (2) Export it manually (**File → Download → Microsoft Excel `.xlsx`**) and I'll run
|
|
69
|
+
> `sungen ingest --legacy <file>.xlsx`."
|
|
70
|
+
|
|
71
|
+
The local-file path is deterministic and **never sends the content through AI** — the
|
|
72
|
+
correct, governance-compliant channel for confidential data. The MCP auto-pick is only
|
|
73
|
+
for files the org does *not* restrict.
|
|
74
|
+
|
|
75
|
+
## Notes
|
|
76
|
+
- Multiple local CSVs (one per tab) also work: `--legacy tab1.csv tab2.csv …`.
|
|
77
|
+
- Re-run only re-fetches when the user asks; otherwise reuse the saved bundle.
|
|
78
|
+
- Do not invent testcases. Only ingest what the workbook contains; the *augmentation*
|
|
79
|
+
(blind-spots) happens in `/sungen:create-test`, flagged for human review.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sun-asterisk/sungen",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.78",
|
|
4
4
|
"description": "Deterministic E2E Test Compiler - Gherkin + Selectors → Playwright tests",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"copy-templates": "mkdir -p dist/generators/test-generator/adapters/playwright/templates/steps && mkdir -p dist/generators/test-generator/templates && mkdir -p dist/orchestrator/templates && mkdir -p dist/dashboard/templates && cp -r src/generators/test-generator/adapters/playwright/templates/*.hbs dist/generators/test-generator/adapters/playwright/templates/ 2>/dev/null || true && cp -r src/generators/test-generator/adapters/playwright/templates/steps dist/generators/test-generator/adapters/playwright/templates/ && cp src/generators/test-generator/templates/*.hbs dist/generators/test-generator/templates/ 2>/dev/null || true && cp -r src/orchestrator/templates/* dist/orchestrator/templates/ && cp src/dashboard/templates/index.html dist/dashboard/templates/index.html && mkdir -p dist/harness/catalog && cp src/harness/catalog/*.yaml dist/harness/catalog/",
|
|
13
13
|
"build:dashboard": "cd dashboard && npm install --silent && npm run build && cd .. && cp dashboard/dist/index.html src/dashboard/templates/index.html",
|
|
14
14
|
"dev": "tsx src/cli/index.ts",
|
|
15
|
-
"test": "tsx tests/golden/run.ts && tsx tests/audit/run.ts",
|
|
16
|
-
"test:update": "tsx tests/golden/run.ts --update && tsx tests/audit/run.ts --update",
|
|
15
|
+
"test": "tsx tests/golden/run.ts && tsx tests/audit/run.ts && tsx tests/ingest/run.ts",
|
|
16
|
+
"test:update": "tsx tests/golden/run.ts --update && tsx tests/audit/run.ts --update && tsx tests/ingest/run.ts --update",
|
|
17
17
|
"prepublishOnly": "npm run build:dashboard && npm run build"
|
|
18
18
|
},
|
|
19
19
|
"keywords": [
|
|
@@ -58,6 +58,13 @@ function render(r: AuditReport): void {
|
|
|
58
58
|
L(` ⑥ Traceability — ${(r.trace.mappedRatio * 100).toFixed(0)}% scenarios linked to viewpoint-overview`);
|
|
59
59
|
L(` ${r.trace.note}`);
|
|
60
60
|
L('');
|
|
61
|
+
if (r.spec.hasSpec && (r.spec.frTotal > 0 || r.spec.triggerGaps.length > 0 || r.spec.verdict !== 'pass')) {
|
|
62
|
+
L(` ⑦ Spec coverage — FR ${r.spec.frCovered}/${r.spec.frTotal} covered [${r.spec.verdict.toUpperCase()}]`);
|
|
63
|
+
for (const g of r.spec.triggerGaps) L(` ✗ TRIGGER-UNCOVERED: "${g.constraint}"${g.code ? ` (${g.code})` : ''} mandated on [${g.required.join(', ')}], only tested on [${g.found.join(', ') || 'none'}] → missing ${g.missing.join(', ')}`);
|
|
64
|
+
for (const u of r.spec.uncoveredMust.slice(0, 6)) L(` ✗ SPEC-UNCOVERED: ${u.id} (MUST) — "${u.text}"`);
|
|
65
|
+
if (!r.spec.triggerGaps.length && !r.spec.uncoveredMust.length) L(' ✓ every MUST FR + per-constraint trigger covered');
|
|
66
|
+
L('');
|
|
67
|
+
}
|
|
61
68
|
L(' ── Findings (Repair targets) ──');
|
|
62
69
|
if (r.findings.length === 0) L(' ✓ none — output passes the harness');
|
|
63
70
|
for (const f of r.findings) L(` • ${f}`);
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
renderCsv,
|
|
21
21
|
writeCsv,
|
|
22
22
|
} from '../../exporters/csv-exporter';
|
|
23
|
-
import {
|
|
23
|
+
import { renderXlsxMultiSheet, writeXlsx } from '../../exporters/xlsx-exporter';
|
|
24
24
|
import { EnvironmentInfo, PreflightCheck, ScreenSummary, TestCaseRow } from '../../exporters/types';
|
|
25
25
|
|
|
26
26
|
const COLOR = {
|
|
@@ -421,7 +421,14 @@ async function exportTarget(
|
|
|
421
421
|
const tempSummary = buildSummary(label, rows, '');
|
|
422
422
|
const csv = renderCsv(tempSummary, rows, specLink);
|
|
423
423
|
const csvPath = writeCsv(cwd, target.featureBaseName, csv);
|
|
424
|
-
|
|
424
|
+
// XLSX: two sheets — "Auto" (automatable: Auto + Not compiled) and "Manual" (@manual) —
|
|
425
|
+
// so QA manages the automated vs manual test-case sets separately. (CSV keeps every row.)
|
|
426
|
+
const autoRows = rows.filter((r) => r.testcaseType !== 'Manual');
|
|
427
|
+
const manualRows = rows.filter((r) => r.testcaseType === 'Manual');
|
|
428
|
+
const wb = renderXlsxMultiSheet([
|
|
429
|
+
{ sheetName: 'Auto', summary: buildSummary(label, autoRows, ''), rows: autoRows, specLink },
|
|
430
|
+
{ sheetName: 'Manual', summary: buildSummary(label, manualRows, ''), rows: manualRows, specLink },
|
|
431
|
+
]);
|
|
425
432
|
await writeXlsx(cwd, target.featureBaseName, wb);
|
|
426
433
|
return buildSummary(label, rows, path.relative(cwd, csvPath));
|
|
427
434
|
}
|
|
@@ -429,7 +436,12 @@ async function exportTarget(
|
|
|
429
436
|
const variants = discoverLocaleVariants(cwd, target);
|
|
430
437
|
let primarySummary: ScreenSummary | null = null;
|
|
431
438
|
let primaryCsvPath = '';
|
|
432
|
-
|
|
439
|
+
// XLSX is split by automation type: an "Auto" sheet (automatable TCs, results differ per
|
|
440
|
+
// locale) and a single shared "Manual" sheet (@manual TCs don't execute and are the same
|
|
441
|
+
// across locales). With multiple locales, Auto sheets are prefixed by locale code.
|
|
442
|
+
const autoSheets: { sheetName: string; summary: ScreenSummary; rows: TestCaseRow[]; specLink: string }[] = [];
|
|
443
|
+
let manualRows: TestCaseRow[] = [];
|
|
444
|
+
const multiLocale = variants.length > 1;
|
|
433
445
|
|
|
434
446
|
for (const variant of variants) {
|
|
435
447
|
// For the base variant the overlay merge is skipped (`locale: null`);
|
|
@@ -446,33 +458,37 @@ async function exportTarget(
|
|
|
446
458
|
env,
|
|
447
459
|
selectorKeyMap,
|
|
448
460
|
});
|
|
449
|
-
const variantSummary = buildSummary(label, variantRows, '');
|
|
450
461
|
|
|
451
|
-
// CSV: always one file per locale (CSV has no sheet concept).
|
|
462
|
+
// CSV: always one file per locale, every row (CSV has no sheet concept).
|
|
452
463
|
const csvLocale = variant.locale || null; // '' or 'en' → '' / 'en'
|
|
453
|
-
const csv = renderCsv(
|
|
464
|
+
const csv = renderCsv(buildSummary(label, variantRows, ''), variantRows, specLink);
|
|
454
465
|
const csvPath = writeCsv(cwd, target.featureBaseName, csv, csvLocale);
|
|
455
466
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
467
|
+
const autoRows = variantRows.filter((r) => r.testcaseType !== 'Manual');
|
|
468
|
+
autoSheets.push({
|
|
469
|
+
sheetName: multiLocale ? `${variant.displayCode} Auto` : 'Auto',
|
|
470
|
+
summary: buildSummary(label, autoRows, ''),
|
|
471
|
+
rows: autoRows,
|
|
460
472
|
specLink,
|
|
461
473
|
});
|
|
462
474
|
|
|
463
|
-
// Use the base variant
|
|
464
|
-
// top-level reporter rolls up base-locale numbers.
|
|
475
|
+
// Use the base variant for the shared Manual sheet + the rolled-up "primary" summary.
|
|
465
476
|
if (variant.locale === '') {
|
|
477
|
+
manualRows = variantRows.filter((r) => r.testcaseType === 'Manual');
|
|
466
478
|
primarySummary = buildSummary(label, variantRows, path.relative(cwd, csvPath));
|
|
467
479
|
primaryCsvPath = csvPath;
|
|
468
480
|
}
|
|
469
481
|
}
|
|
470
482
|
|
|
471
|
-
//
|
|
472
|
-
const
|
|
483
|
+
// All Auto sheets, then one "Manual" sheet — always present for a predictable structure.
|
|
484
|
+
const sheets = [
|
|
485
|
+
...autoSheets,
|
|
486
|
+
{ sheetName: 'Manual', summary: buildSummary(label, manualRows, ''), rows: manualRows, specLink },
|
|
487
|
+
];
|
|
488
|
+
const wb = renderXlsxMultiSheet(sheets);
|
|
473
489
|
await writeXlsx(cwd, target.featureBaseName, wb);
|
|
474
490
|
|
|
475
|
-
return primarySummary ?? buildSummary(label,
|
|
491
|
+
return primarySummary ?? buildSummary(label, (autoSheets[0]?.rows ?? []).concat(manualRows), primaryCsvPath);
|
|
476
492
|
} catch (err) {
|
|
477
493
|
console.error(`${COLOR.red}Error exporting ${label}:${COLOR.reset} ${err instanceof Error ? err.message : err}`);
|
|
478
494
|
return null;
|