@sun-asterisk/sungen 3.2.16-beta.7 → 3.2.17
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/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +13 -197
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/ingest.d.ts.map +1 -1
- package/dist/cli/commands/ingest.js +56 -4
- package/dist/cli/commands/ingest.js.map +1 -1
- package/dist/dashboard/templates/index.html +1 -1
- package/dist/exporters/feature-parser.js +1 -1
- package/dist/exporters/feature-parser.js.map +1 -1
- package/dist/exporters/scenario-merger.js +1 -1
- package/dist/exporters/scenario-merger.js.map +1 -1
- package/dist/exporters/spec-parser.js +1 -1
- package/dist/exporters/spec-parser.js.map +1 -1
- package/dist/exporters/xlsx-report-builder.d.ts +1 -1
- package/dist/exporters/xlsx-report-builder.d.ts.map +1 -1
- package/dist/exporters/xlsx-report-builder.js +3 -3
- package/dist/exporters/xlsx-report-builder.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-element-with-text.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -1
- package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/runtime-data-transformer.js +28 -17
- package/dist/generators/test-generator/utils/runtime-data-transformer.js.map +1 -1
- package/dist/ingest/legacy-parser.d.ts +3 -0
- package/dist/ingest/legacy-parser.d.ts.map +1 -1
- package/dist/ingest/legacy-parser.js +52 -3
- package/dist/ingest/legacy-parser.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/delivery.md +120 -202
- package/dist/orchestrator/templates/ai-src/config/claude.md +1 -1
- package/dist/orchestrator/templates/ai-src/config/copilot.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +6 -92
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +7 -0
- package/package.json +4 -4
- package/src/cli/commands/delivery.ts +15 -227
- package/src/cli/commands/ingest.ts +57 -5
- package/src/dashboard/templates/index.html +1 -1
- package/src/exporters/feature-parser.ts +1 -1
- package/src/exporters/scenario-merger.ts +1 -1
- package/src/exporters/spec-parser.ts +1 -1
- package/src/exporters/xlsx-report-builder.ts +2 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-element-with-text.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -1
- package/src/generators/test-generator/utils/runtime-data-transformer.ts +29 -18
- package/src/ingest/legacy-parser.ts +48 -3
- package/src/orchestrator/templates/ai-src/commands/delivery.md +120 -202
- package/src/orchestrator/templates/ai-src/config/claude.md +1 -1
- package/src/orchestrator/templates/ai-src/config/copilot.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +6 -92
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +7 -0
- package/dist/exporters/matrix/build.d.ts +0 -61
- package/dist/exporters/matrix/build.d.ts.map +0 -1
- package/dist/exporters/matrix/build.js +0 -472
- package/dist/exporters/matrix/build.js.map +0 -1
- package/dist/exporters/matrix/export.d.ts +0 -50
- package/dist/exporters/matrix/export.d.ts.map +0 -1
- package/dist/exporters/matrix/export.js +0 -152
- package/dist/exporters/matrix/export.js.map +0 -1
- package/dist/exporters/matrix/fingerprint.d.ts +0 -20
- package/dist/exporters/matrix/fingerprint.d.ts.map +0 -1
- package/dist/exporters/matrix/fingerprint.js +0 -83
- package/dist/exporters/matrix/fingerprint.js.map +0 -1
- package/dist/exporters/matrix/gates.d.ts +0 -21
- package/dist/exporters/matrix/gates.d.ts.map +0 -1
- package/dist/exporters/matrix/gates.js +0 -358
- package/dist/exporters/matrix/gates.js.map +0 -1
- package/dist/exporters/matrix/map-loader.d.ts +0 -22
- package/dist/exporters/matrix/map-loader.d.ts.map +0 -1
- package/dist/exporters/matrix/map-loader.js +0 -193
- package/dist/exporters/matrix/map-loader.js.map +0 -1
- package/dist/exporters/matrix/render-csv.d.ts +0 -9
- package/dist/exporters/matrix/render-csv.d.ts.map +0 -1
- package/dist/exporters/matrix/render-csv.js +0 -92
- package/dist/exporters/matrix/render-csv.js.map +0 -1
- package/dist/exporters/matrix/render-xlsx.d.ts +0 -41
- package/dist/exporters/matrix/render-xlsx.d.ts.map +0 -1
- package/dist/exporters/matrix/render-xlsx.js +0 -430
- package/dist/exporters/matrix/render-xlsx.js.map +0 -1
- package/dist/exporters/matrix/types.d.ts +0 -196
- package/dist/exporters/matrix/types.d.ts.map +0 -1
- package/dist/exporters/matrix/types.js +0 -15
- package/dist/exporters/matrix/types.js.map +0 -1
- package/dist/exporters/matrix/wording.d.ts +0 -51
- package/dist/exporters/matrix/wording.d.ts.map +0 -1
- package/dist/exporters/matrix/wording.js +0 -169
- package/dist/exporters/matrix/wording.js.map +0 -1
- package/src/exporters/matrix/build.ts +0 -503
- package/src/exporters/matrix/export.ts +0 -149
- package/src/exporters/matrix/fingerprint.ts +0 -49
- package/src/exporters/matrix/gates.ts +0 -391
- package/src/exporters/matrix/map-loader.ts +0 -163
- package/src/exporters/matrix/render-csv.ts +0 -94
- package/src/exporters/matrix/render-xlsx.ts +0 -420
- package/src/exporters/matrix/types.ts +0 -223
- package/src/exporters/matrix/wording.ts +0 -174
|
@@ -82,7 +82,11 @@ function parseCSV(text) {
|
|
|
82
82
|
}
|
|
83
83
|
return rows;
|
|
84
84
|
}
|
|
85
|
-
|
|
85
|
+
// Strip the "required" decoration `(*)` BEFORE stray asterisks: legacy workbooks
|
|
86
|
+
// mark mandatory columns as `Steps (*)` / `TC ID (*)`. Removing only the `*` left
|
|
87
|
+
// `steps ()` — classification regexes still matched (/steps?|expected/), but the
|
|
88
|
+
// exact-key column lookups missed and every mandatory cell came back '' silently.
|
|
89
|
+
const norm = (s) => (s || '').replace(/\(\s*\*\s*\)/g, '').replace(/\*/g, '').trim().toLowerCase();
|
|
86
90
|
function detectSheetType(rows) {
|
|
87
91
|
for (let i = 0; i < Math.min(rows.length, 40); i++) {
|
|
88
92
|
const cells = rows[i].map(norm);
|
|
@@ -144,6 +148,27 @@ function parseTestcaseSheet(rows, headerRow, sheet) {
|
|
|
144
148
|
}
|
|
145
149
|
return out;
|
|
146
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* exceljs's `.text` getter can THROW on a merged cell whose master value is null
|
|
153
|
+
* (MergeValue.toString() on null) — a `cell.text != null` guard never runs because
|
|
154
|
+
* READING the property explodes. Field workbook: 25 such cells across 3 tabs
|
|
155
|
+
* (Google-Sheets-exported merged headers). Guard on `.value` first (safe — merge
|
|
156
|
+
* slaves delegate to the master's value without stringifying), and keep a
|
|
157
|
+
* try/catch backstop for values that are non-null yet still un-stringifiable
|
|
158
|
+
* (e.g. a formula cell whose result is null). Never hand-stringify `.value` —
|
|
159
|
+
* richText/hyperlink objects would become "[object Object]"; exceljs's own
|
|
160
|
+
* `.text` stays the single formatter.
|
|
161
|
+
*/
|
|
162
|
+
function safeCellText(cell) {
|
|
163
|
+
if (cell.value == null)
|
|
164
|
+
return '';
|
|
165
|
+
try {
|
|
166
|
+
return String(cell.text ?? '');
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return '';
|
|
170
|
+
}
|
|
171
|
+
}
|
|
147
172
|
/** Load sheets from one input file: CSV (1 sheet), XLSX (all sheets), or a JSON
|
|
148
173
|
* sheet-bundle (the shape the Google-Sheets/MCP skill produces). */
|
|
149
174
|
async function loadSheets(filePath) {
|
|
@@ -171,7 +196,7 @@ async function loadSheets(filePath) {
|
|
|
171
196
|
const rows = [];
|
|
172
197
|
ws.eachRow((row) => {
|
|
173
198
|
const cells = [];
|
|
174
|
-
row.eachCell({ includeEmpty: true }, (cell) => { cells.push(
|
|
199
|
+
row.eachCell({ includeEmpty: true }, (cell) => { cells.push(safeCellText(cell)); });
|
|
175
200
|
rows.push(cells);
|
|
176
201
|
});
|
|
177
202
|
out.push({ name: ws.name, rows });
|
|
@@ -199,7 +224,7 @@ async function parseLegacyFile(filePaths, onlySheets) {
|
|
|
199
224
|
const want = onlySheets && onlySheets.length ? new Set(onlySheets.map((s) => s.trim().toLowerCase())) : null;
|
|
200
225
|
const inv = {
|
|
201
226
|
source: { file: files.map((f) => path.basename(f)).join(', ') },
|
|
202
|
-
sheets: [], testcases: [],
|
|
227
|
+
sheets: [], testcases: [], warnings: [],
|
|
203
228
|
};
|
|
204
229
|
for (const f of files) {
|
|
205
230
|
for (const s of await loadSheets(f)) {
|
|
@@ -209,6 +234,30 @@ async function parseLegacyFile(filePaths, onlySheets) {
|
|
|
209
234
|
let tcs = [];
|
|
210
235
|
if (type === 'testcase' && headerRow >= 0)
|
|
211
236
|
tcs = parseTestcaseSheet(s.rows, headerRow, s.name);
|
|
237
|
+
// Anti-silence guards — a convention mismatch must SAY so, never quietly drop data:
|
|
238
|
+
// (a) near-miss: a tab that carries a TC-ID-ish header yet classified unknown;
|
|
239
|
+
// (b) a testcase tab whose extraction produced ZERO rows;
|
|
240
|
+
// (c) rows extracted but a mandatory column resolved empty on EVERY row.
|
|
241
|
+
if (type === 'unknown') {
|
|
242
|
+
const loose = (v) => v.replace(/[^a-z0-9]/gi, '').toLowerCase();
|
|
243
|
+
const nearMissRow = s.rows.slice(0, 40).find((r) => r.some((c) => /tcid/.test(loose(c))));
|
|
244
|
+
if (nearMissRow) {
|
|
245
|
+
inv.warnings.push(`sheet "${s.name}": looks like a testcase sheet (TC-ID-like header found) but was NOT classified — header candidates: [${nearMissRow.filter(Boolean).slice(0, 10).join(' | ')}]`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else if (type === 'testcase' && headerRow >= 0) {
|
|
249
|
+
const header = s.rows[headerRow].filter(Boolean).slice(0, 12).join(' | ');
|
|
250
|
+
if (tcs.length === 0) {
|
|
251
|
+
inv.warnings.push(`sheet "${s.name}": classified testcase but 0 rows extracted — column names may not follow the expected convention. Header row: [${header}]`);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
for (const [field, label] of [['steps', 'Steps'], ['expected', 'Expected results']]) {
|
|
255
|
+
if (tcs.every((t) => !t[field])) {
|
|
256
|
+
inv.warnings.push(`sheet "${s.name}": the "${label}" column resolved EMPTY for all ${tcs.length} extracted row(s) — check its header spelling. Header row: [${header}]`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
212
261
|
inv.sheets.push({ name: s.name, type, rows: tcs.length || s.rows.length });
|
|
213
262
|
inv.testcases.push(...tcs);
|
|
214
263
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-parser.js","sourceRoot":"","sources":["../../src/ingest/legacy-parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"legacy-parser.js","sourceRoot":"","sources":["../../src/ingest/legacy-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,228 +1,146 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: delivery
|
|
3
|
-
description: "Export
|
|
4
|
-
argument-hint: "[name...] [--
|
|
3
|
+
description: "Export Gherkin scenarios + Playwright results to CSV test case file for QA delivery."
|
|
4
|
+
argument-hint: "[screen-name...] [--env <locale>] (omit screens for all; --env for locale-specific export)"
|
|
5
5
|
order: 50
|
|
6
|
-
claude-tools: "Bash, Read,
|
|
6
|
+
claude-tools: "Bash, Read, AskUserQuestion"
|
|
7
7
|
copilot-tools: "[read, execute, edit, vscode/askQuestions]"
|
|
8
|
-
codex-trigger: "Run when the user asks to EXPORT or deliver test cases for QA hand-off. Final step. Do NOT use for creating or running tests."
|
|
8
|
+
codex-trigger: "Run when the user asks to EXPORT or deliver test cases to CSV/XLSX for QA hand-off. Final step. Do NOT use for creating or running tests."
|
|
9
9
|
---
|
|
10
10
|
## Role
|
|
11
11
|
|
|
12
|
-
You are a **QA Test Delivery Engineer**.
|
|
13
|
-
gating, and rendering. Your job is (1) invoking it, (2) **proposing the Delivery Map** when a unit
|
|
14
|
-
does not have one yet — the one semantic step the CLI cannot do — and (3) walking the user through
|
|
15
|
-
review → approve → official render.
|
|
16
|
-
|
|
17
|
-
## The two delivery modes
|
|
18
|
-
|
|
19
|
-
- **Matrix (default)** — the Test Case & Coverage Matrix: one row per *delivery item* (one target +
|
|
20
|
-
one test intent + one oracle family), with each Gherkin scenario / `@cases` row preserved as a
|
|
21
|
-
collapsible *coverage variant* sub-row. No numbered step dumps. This is the reviewable /
|
|
22
|
-
manually-executable / customer-facing standard.
|
|
23
|
-
- **Legacy (`--legacy`, alias `--full`)** — the classic per-scenario-steps workbook (BM-2-901-13).
|
|
24
|
-
Use it when the user asks for the old format or a project is mid-engagement on it.
|
|
12
|
+
You are a **QA Test Delivery Engineer**. Your job is to invoke the deterministic `sungen delivery` CLI that performs all parsing and CSV export. Your role is minimal — just run the CLI and help the user if pre-flight checks fail.
|
|
25
13
|
|
|
26
14
|
## Parameters
|
|
27
15
|
|
|
28
16
|
Parse from `$ARGUMENTS`:
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
- **`--
|
|
36
|
-
`--format csv` when the user wants the flat CSV (pipelines/diffing), `--format both` for both.
|
|
37
|
-
- **`--env <locale>`** — sets `SUNGEN_ENV=<locale>` for the run (accept `--locale` as alias).
|
|
38
|
-
- **`--legacy` / `--full`** — pass through to the CLI and skip the map flow entirely.
|
|
39
|
-
|
|
40
|
-
## Steps
|
|
41
|
-
|
|
42
|
-
### 1. Run the CLI once
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
[ -x ./bin/sungen.js ] && ./bin/sungen.js delivery <names> || npx sungen delivery <names>
|
|
46
|
-
```
|
|
47
|
-
(prepend `SUNGEN_ENV=<locale>` when `--env` was given; append `--format <fmt>` when the user asked
|
|
48
|
-
for a non-default format; append `--legacy` when requested — then skip to step 5.)
|
|
49
|
-
|
|
50
|
-
Three outcomes per target:
|
|
51
|
-
- **Rendered** → done, go to step 5.
|
|
52
|
-
- **"no delivery map"** → go to step 2 (propose it).
|
|
53
|
-
- **Gate findings / "not approved"** → go to step 4 (review & approve).
|
|
54
|
-
|
|
55
|
-
On a sweep, read the **"Not exported"** list at the end: units marked *not authored yet* need
|
|
56
|
-
`/sungen:create-test` first, the others each printed their own reason above (missing map, gate
|
|
57
|
-
errors, or awaiting approval). Handle them one unit at a time — do not re-run the sweep expecting
|
|
58
|
-
a different result.
|
|
59
|
-
|
|
60
|
-
### 2. Propose the Delivery Map (only when missing or the user asks to regroup)
|
|
61
|
-
|
|
62
|
-
Read the unit's `.feature` (and `requirements/spec.md` for target naming). Write
|
|
63
|
-
`qa/<screens|flows|api>/<unit>/delivery/<unit>.map.yaml`:
|
|
64
|
-
|
|
65
|
-
```yaml
|
|
66
|
-
version: 1
|
|
67
|
-
unit: <unit>
|
|
68
|
-
groups:
|
|
69
|
-
- id: DI-<TARGET>-<THEME> # stable kebab id, never renumbered
|
|
70
|
-
target: login.email # ONE target: field/component dot-path, flow phrase, or METHOD /path
|
|
71
|
-
intent: <one behavior/rule this item verifies>
|
|
72
|
-
oracle: <the shared observable Pass/Fail statement>
|
|
73
|
-
dimensions: violated rule — required ×3 · format ×10 · full-width ×2 # see below
|
|
74
|
-
category: normal | abnormal | security | nfr # see the rule below
|
|
75
|
-
review: proposed # ALWAYS proposed — only QA approval flips it
|
|
76
|
-
variants: [VP-VAL-001-B, VP-VAL-001-S] # VP-ids; bare id on a @cases scenario = all its rows
|
|
77
|
-
dispositions: # scenarios intentionally NOT delivered as test cases
|
|
78
|
-
VP-DATA-000: { as: excluded, reason: data-setup checklist }
|
|
79
|
-
# as: excluded | blocked | covered_elsewhere | accepted_risk
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
**Grouping rules (the aggregation signature) — group COMPACTLY.** The matrix exists to be
|
|
83
|
-
substantially shorter than the scenario list, so a reviewer can see missing viewpoints at a
|
|
84
|
-
glance. Merge whenever the cases share ALL of: target · test intent/business rule ·
|
|
85
|
-
precondition/condition · trigger or procedure shape · **the way the expected result is
|
|
86
|
-
determined** (its oracle *family*, not its exact message).
|
|
87
|
-
|
|
88
|
-
- **Oracle family = the determination method, parameterized.** All validation branches of ONE
|
|
89
|
-
field belong to ONE item — required, format, length, character-class are *expected branches*
|
|
90
|
-
(parameters) of "the field shows the validation message defined for the violated rule", shown
|
|
91
|
-
per variant, never separate items.
|
|
92
|
-
- MAY vary inside one item (coverage dimensions, visible on the sub-rows): data values, boundary
|
|
93
|
-
points, **account states** (a seeded/locked/deleted account next to a wrong-password case),
|
|
94
|
-
provider/browser/locale, `@cases` rows, a different trigger with the same oracle (blur vs
|
|
95
|
-
submit), **execution mode** (auto + manual mix — the parent shows `Auto n · Manual m`), and
|
|
96
|
-
**priority** (the item takes the highest; per-variant priorities stay visible).
|
|
97
|
-
- MUST split: different target, different intent/business rule, different way of determining the
|
|
98
|
-
expected result (a field-error family ≠ a session-established family), different test layer
|
|
99
|
-
(`@api`/`@query`), materially different precondition, or a different procedure shape —
|
|
100
|
-
sequence-sensitive flows (re-Given/When after a Then) stay solo. **Different risk classes never
|
|
101
|
-
merge**: XSS and SQL injection are separate items (different risk and determination), even on
|
|
102
|
-
the same field.
|
|
103
|
-
- **Look for these families before settling on a grouping** — they are where under-merging happens:
|
|
104
|
-
| Family | Merge into one item |
|
|
105
|
-
|---|---|
|
|
106
|
-
| Static render | every "element X is visible/has its content on load" scenario of the screen — title, instructions, progress step, buttons present, header/footer |
|
|
107
|
-
| Field validation branches | all rules of ONE field (required · format · length · character class · full-width) |
|
|
108
|
-
| Account/entity states | wrong-credentials · locked · deleted · unverified for the same rejection oracle |
|
|
109
|
-
| Provider / surface sets | the 3 OAuth providers, header+footer, the a11y surfaces of one behaviour |
|
|
110
|
-
| Lifetime / mode pairs | checked vs unchecked, mobile vs desktop, when the oracle is one rule with two branches |
|
|
111
|
-
On a 36-scenario screen, four separate one-variant "renders on load" items should have been one.
|
|
112
|
-
- When unsure, keep items separate — the gates and QA decide, never guess-merge.
|
|
113
|
-
- Every scenario must land in exactly one group **or** one disposition (Gate B enforces 100%
|
|
114
|
-
disposition). Data-setup blocks (`@manual:data-setup`) → `excluded`; SPEC-GAP placeholders →
|
|
115
|
-
`blocked`.
|
|
116
|
-
|
|
117
|
-
**`dimensions:` — the compact coverage digest (required for items with >3 variants).**
|
|
118
|
-
This one short line is what the collapsed parent row shows instead of listing every variant, so a
|
|
119
|
-
reviewer sees *which dimensions* the item covers without expanding it. Name the dimension, then the
|
|
120
|
-
branches with counts:
|
|
121
|
-
- `violated rule — required ×3 · format ×10 · full-width ×2`
|
|
122
|
-
- `account state — wrong password · unregistered · locked · soft-deleted`
|
|
123
|
-
- `submission method — Login button · Enter in Password · Enter in Email`
|
|
124
|
-
|
|
125
|
-
Keep it ≤120 chars (Gate W warns). **YAML caveat:** a bare `: ` inside the value breaks the parse —
|
|
126
|
-
use ` — ` as the label separator (as above) or quote the whole string.
|
|
127
|
-
|
|
128
|
-
**`category` is not free choice for two classes (Gate K checks it):** a group whose variants are
|
|
129
|
-
`VP-SEC-*` MUST be `category: security`, and `VP-NFR-*` MUST be `nfr` — otherwise the Coverage
|
|
130
|
-
sheet's security/nfr column renders empty and the grid reports a gap the unit does not have while
|
|
131
|
-
hiding the work it does have. `normal` vs `abnormal` stays your judgement.
|
|
132
|
-
|
|
133
|
-
**Wording rules for `intent`/`oracle` (customer-facing — Gate W lints these):**
|
|
134
|
-
- Plain product language, present simple, ~10–20 words, one behavior:
|
|
135
|
-
"A user can sign in with valid credentials and is redirected to the Jobs page."
|
|
136
|
-
- Oracle = the observable outcome as a definite assertion ("The Jobs page is displayed and the
|
|
137
|
-
Logout link is visible.") — no `should`, no tester actions.
|
|
138
|
-
- NEVER: `{{tokens}}`, `[Selector]` references, DSL phrasing (`User fill/click/see`), generator
|
|
139
|
-
labels (`Setup:`/`Observable:`/`Oracle:`), or vague verbs (`handles`, `surfaces`) when a precise
|
|
140
|
-
behavior exists. Use the visible UI label (the Login button, the Email field).
|
|
141
|
-
- **Preserve the source meaning exactly** — never strengthen, weaken, or reinterpret an oracle
|
|
142
|
-
(a security assertion especially: if the source says "the password appears ONLY in the HTTPS
|
|
143
|
-
POST body", do not write "no plaintext password on the network").
|
|
144
|
-
|
|
145
|
-
**Requirement coverage (`requirements:` section, optional):** `sungen delivery` scans
|
|
146
|
-
`requirements/spec.md` for FR-/TR-/NFR- ids; ids traced by `@spec:` tags are `covered`, the rest
|
|
147
|
-
are `gap` (Gate R warning). Record the reviewed status for genuine non-gaps:
|
|
148
|
-
|
|
149
|
-
```yaml
|
|
150
|
-
requirements:
|
|
151
|
-
TR-007: { status: planned, note: Performance needs Lighthouse-style tooling }
|
|
152
|
-
TR-004: { status: partially_covered, note: client-side covered by VP-SEC-003; hashing needs DB verify }
|
|
153
|
-
# status: covered | partially_covered | covered_elsewhere | planned | gap | not_applicable
|
|
154
|
-
```
|
|
17
|
+
{{#cap parallel-subagents}}
|
|
18
|
+
- **screens** — zero or more screen/flow names. Empty → CLI processes all targets in `qa/screens/` + `qa/flows/`.
|
|
19
|
+
{{/cap}}
|
|
20
|
+
{{^cap parallel-subagents}}
|
|
21
|
+
- **names** — zero or more screen/flow names. Empty → CLI processes all targets in `qa/screens/` + `qa/flows/`.
|
|
22
|
+
{{/cap}}
|
|
23
|
+
- **`--env <locale>`** — optional. Sets `SUNGEN_ENV=<locale>` for the run so the CLI merges `<name>.<locale>.yaml` over the base test-data and writes `<name>-testcases.<locale>.csv` / `.xlsx`. Accept `--locale <locale>` as an alias.
|
|
155
24
|
|
|
156
|
-
|
|
157
|
-
saying "proven by DI-SEC-CSRF" is prose — nothing detects it when that scenario later changes. If a
|
|
158
|
-
scenario in THIS feature proves the requirement, **add `@spec:<id>` to that scenario** so the trace
|
|
159
|
-
is real, then drop the override (it derives as `covered` on its own). Use `covered_elsewhere` only
|
|
160
|
-
when another suite proves it, and name that suite; `not_applicable` when the spec itself excludes
|
|
161
|
-
the requirement.
|
|
25
|
+
If `--env` is passed but no value follows, ask the user which locale to use.
|
|
162
26
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
[ -x ./bin/sungen.js ] && ./bin/sungen.js delivery <unit> --check || npx sungen delivery <unit> --check
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### 3. Present the grouping for review
|
|
170
|
-
|
|
171
|
-
Show the user a compact summary: item count vs variant count, the groups (id · target · intent ·
|
|
172
|
-
variant count), dispositions, and every remaining `review`-level finding (oracle-shape /
|
|
173
|
-
precondition heuristics — these are exactly what QA must confirm). Then `AskUserQuestion`:
|
|
27
|
+
## Steps
|
|
174
28
|
|
|
175
|
-
|
|
176
|
-
- **Adjust the grouping** — user names the groups to change; edit the map, re-run `--check`, re-present.
|
|
177
|
-
- **Preview draft first** — `sungen delivery <unit> --preview` (DRAFT watermark), then re-ask.
|
|
178
|
-
- **Cancel**
|
|
29
|
+
### 1. Invoke the CLI
|
|
179
30
|
|
|
180
|
-
|
|
31
|
+
{{#cap parallel-subagents}}
|
|
32
|
+
Run via Bash (single command, no extra parsing). Prefer the local `./bin/sungen.js` when it exists — the sungen monorepo ships local-only features the global npm package doesn't have yet (multi-sheet locale aggregation, `.<env>` filename suffix, locale-aware step rendering). Fall back to `npx sungen` in downstream projects.
|
|
33
|
+
{{/cap}}
|
|
34
|
+
{{^cap parallel-subagents}}
|
|
35
|
+
Run via Bash (single command, no extra parsing):
|
|
36
|
+
{{/cap}}
|
|
181
37
|
|
|
182
38
|
```bash
|
|
183
|
-
|
|
184
|
-
|
|
39
|
+
# No env — local-first dispatcher:
|
|
40
|
+
{{#cap parallel-subagents}}
|
|
41
|
+
[ -x ./bin/sungen.js ] && ./bin/sungen.js delivery <screens> || npx sungen delivery <screens>
|
|
42
|
+
{{/cap}}
|
|
43
|
+
{{^cap parallel-subagents}}
|
|
44
|
+
[ -x ./bin/sungen.js ] && ./bin/sungen.js delivery <names> || npx sungen delivery <names>
|
|
45
|
+
{{/cap}}
|
|
46
|
+
|
|
47
|
+
# Locale-specific:
|
|
48
|
+
{{#cap parallel-subagents}}
|
|
49
|
+
[ -x ./bin/sungen.js ] && SUNGEN_ENV=<locale> ./bin/sungen.js delivery <screens> || SUNGEN_ENV=<locale> npx sungen delivery <screens>
|
|
50
|
+
{{/cap}}
|
|
51
|
+
{{^cap parallel-subagents}}
|
|
52
|
+
[ -x ./bin/sungen.js ] && SUNGEN_ENV=<locale> ./bin/sungen.js delivery <names> || SUNGEN_ENV=<locale> npx sungen delivery <names>
|
|
53
|
+
{{/cap}}
|
|
185
54
|
```
|
|
186
55
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
201
|
-
-
|
|
56
|
+
{{#cap parallel-subagents}}
|
|
57
|
+
- If no screen args → omit `<screens>` (CLI processes all targets).
|
|
58
|
+
{{/cap}}
|
|
59
|
+
{{^cap parallel-subagents}}
|
|
60
|
+
- If no name args → omit `<names>` (CLI processes all targets).
|
|
61
|
+
{{/cap}}
|
|
62
|
+
- If `--env <locale>` was provided → prepend `SUNGEN_ENV=<locale>` to the command. Do NOT pass `--env` to the CLI itself — it's not a CLI flag, only a slash-command convenience.
|
|
63
|
+
|
|
64
|
+
The CLI handles:
|
|
65
|
+
{{#cap parallel-subagents}}
|
|
66
|
+
- Scope detection (all screens + flows vs specific)
|
|
67
|
+
{{/cap}}
|
|
68
|
+
{{^cap parallel-subagents}}
|
|
69
|
+
- Scope detection (all screens + flows vs specific names)
|
|
70
|
+
- Auto-detect: `qa/flows/<name>/` → flow, `qa/screens/<name>/` → screen
|
|
71
|
+
{{/cap}}
|
|
72
|
+
- Pre-flight source checks with colorful output
|
|
73
|
+
- Parsing `.feature`, `.spec.ts`, `test-data.yaml` (+ `<name>.<env>.yaml` overlay when `SUNGEN_ENV` is set), and per-target `<name>-test-result[.<env>].json`
|
|
74
|
+
- Generating CSV/XLSX at `qa/deliverables/<name>-testcases[.<env>].csv` / `.xlsx`
|
|
75
|
+
- Printing summary table
|
|
76
|
+
|
|
77
|
+
### 2. Handle pre-flight failures (if CLI exits non-zero)
|
|
78
|
+
|
|
79
|
+
{{#cap parallel-subagents}}
|
|
80
|
+
If the CLI exits with blocking issues, it will have already printed a clear table showing exactly what's missing per screen.
|
|
81
|
+
{{/cap}}
|
|
82
|
+
{{^cap parallel-subagents}}
|
|
83
|
+
If the CLI exits with blocking issues, it will have already printed a clear table showing exactly what's missing per target.
|
|
84
|
+
{{/cap}}
|
|
85
|
+
|
|
86
|
+
Use `AskUserQuestion` to offer next steps:
|
|
87
|
+
|
|
88
|
+
**Options:**
|
|
89
|
+
- **Fix missing sources** (Recommended) — Print the suggested commands from CLI output and stop. User will run those commands manually, then re-invoke `/sungen:delivery`.
|
|
90
|
+
{{#cap parallel-subagents}}
|
|
91
|
+
- **Continue with available screens** — Re-run as `npx sungen delivery <screens> --continue-on-missing` to skip screens with blocking issues.
|
|
92
|
+
{{/cap}}
|
|
93
|
+
{{^cap parallel-subagents}}
|
|
94
|
+
- **Continue with available targets** — Re-run as `npx sungen delivery <names> --continue-on-missing` to skip targets with blocking issues.
|
|
95
|
+
{{/cap}}
|
|
96
|
+
- **Cancel** — Exit.
|
|
97
|
+
|
|
98
|
+
### 3. Show summary + offer next steps (on success)
|
|
99
|
+
|
|
100
|
+
Forward the CLI's summary table to the user verbatim. Then use `AskUserQuestion`:
|
|
101
|
+
|
|
102
|
+
- **Open a specific CSV** — Help user inspect one of the exported files with Read tool.
|
|
103
|
+
{{#cap parallel-subagents}}
|
|
104
|
+
- **Run tests to refresh results** — Suggest `/sungen:run-test <screen>` to update `test-results/results.json`, then re-run delivery.
|
|
105
|
+
- **Export another screen** — User can run `/sungen:delivery <other-screen>`.
|
|
106
|
+
{{/cap}}
|
|
107
|
+
{{^cap parallel-subagents}}
|
|
108
|
+
- **Run tests to refresh results** — Suggest `/sungen-run-test <name>` to update test results, then re-run delivery.
|
|
109
|
+
- **Export another target** — User can run `/sungen-delivery <other-name>`.
|
|
110
|
+
{{/cap}}
|
|
111
|
+
- **Done** — Exit.
|
|
202
112
|
|
|
203
113
|
## Important notes
|
|
204
114
|
|
|
205
|
-
- **Do NOT parse
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
- **
|
|
209
|
-
with `review: approved` defeats the QA review this format exists for.
|
|
210
|
-
- **Do NOT modify feature/test-data files during delivery** — read-only except the map file.
|
|
211
|
-
- The map is committed and stable: adding a group never renumbers others; deleting scenarios →
|
|
212
|
-
update the map (Gate B lists exactly what's unmapped/stale).
|
|
115
|
+
- **Do NOT parse files yourself** — the CLI is the source of truth for parsing logic. Your job is orchestration + user interaction.
|
|
116
|
+
- **Do NOT modify feature/spec.ts/test-data files** — the delivery is read-only.
|
|
117
|
+
- **The CLI already respects `@manual` tags, skips `@steps:` base scenarios, groups by Category 2, and generates UTF-8 BOM CSV for Excel compatibility with Vietnamese.**
|
|
118
|
+
- **Pre-flight check is built into the CLI** — use `--skip-preflight` only in CI/automated pipelines where checks are done externally.
|
|
213
119
|
|
|
214
|
-
## CLI
|
|
120
|
+
## CLI Reference
|
|
215
121
|
|
|
216
122
|
```
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
--skip-preflight
|
|
123
|
+
{{#cap parallel-subagents}}
|
|
124
|
+
sungen delivery [screens...]
|
|
125
|
+
{{/cap}}
|
|
126
|
+
{{^cap parallel-subagents}}
|
|
127
|
+
sungen delivery [names...]
|
|
128
|
+
{{/cap}}
|
|
129
|
+
[--skip-preflight] Skip pre-flight checks (not recommended)
|
|
130
|
+
{{#cap parallel-subagents}}
|
|
131
|
+
[--continue-on-missing] Skip screens with blocking misses
|
|
132
|
+
{{/cap}}
|
|
133
|
+
{{^cap parallel-subagents}}
|
|
134
|
+
[--continue-on-missing] Skip targets with blocking misses
|
|
135
|
+
{{/cap}}
|
|
136
|
+
|
|
137
|
+
# Locale-aware export (env var, not a CLI flag):
|
|
138
|
+
{{#cap parallel-subagents}}
|
|
139
|
+
SUNGEN_ENV=<locale> sungen delivery [screens...]
|
|
140
|
+
{{/cap}}
|
|
141
|
+
{{^cap parallel-subagents}}
|
|
142
|
+
SUNGEN_ENV=<locale> sungen delivery [names...]
|
|
143
|
+
{{/cap}}
|
|
144
|
+
→ reads <name>.<locale>.yaml overlay, picks <name>-test-result.<locale>.json,
|
|
145
|
+
writes <name>-testcases.<locale>.csv / .xlsx
|
|
224
146
|
```
|
|
225
|
-
|
|
226
|
-
Outputs: `qa/deliverables/<unit>-testcases.xlsx` (Testcases + Coverage sheets) by default;
|
|
227
|
-
`--format csv` writes `<unit>-testcases.csv` instead (flat, `Level` column `item|variant`),
|
|
228
|
-
`--format both` writes both. Legacy mode writes the classic files instead.
|
|
@@ -30,7 +30,7 @@ You generate 3 files for sungen — a Gherkin compiler that produces Playwright
|
|
|
30
30
|
| `/sungen:create-data-test <name>` | Generate standardized test-data (valid/boundary/invalid + CHK trace) from the Data Factory catalog; no name = all units (asks to confirm) |
|
|
31
31
|
| `/sungen:review <name>` | Score syntax, coverage, viewpoint quality (auto-detects screen or flow) |
|
|
32
32
|
| `/sungen:run-test <name>` | Generate `selectors.yaml`, compile, run, auto-fix (auto-detects screen or flow) |
|
|
33
|
-
| `/sungen:delivery [name...]` | Export
|
|
33
|
+
| `/sungen:delivery [name...]` | Export test cases → CSV for QA delivery (all screens if no arg) |
|
|
34
34
|
| `/sungen:locale <name> <locale>` | Bootstrap i18n for a screen — audit selectors, detect locale switch, generate overlay (run before `/sungen:run-test --env <locale>`) |
|
|
35
35
|
|
|
36
36
|
**Screen path:** add-screen → create-test → review → run-test → delivery.
|
|
@@ -30,7 +30,7 @@ You generate 3 files for sungen — a Gherkin compiler that produces Playwright
|
|
|
30
30
|
| `/sungen-create-data-test <name>` | Generate standardized test-data (valid/boundary/invalid + CHK trace) from the Data Factory catalog; no name = all units (asks to confirm) |
|
|
31
31
|
| `/sungen-review <name>` | Score syntax, coverage, viewpoint quality (auto-detects screen or flow) |
|
|
32
32
|
| `/sungen-run-test <name>` | Generate `selectors.yaml`, compile, run, auto-fix (auto-detects screen or flow) |
|
|
33
|
-
| `/sungen-delivery [name...]` | Export
|
|
33
|
+
| `/sungen-delivery [name...]` | Export test cases → CSV for QA delivery (all screens if no arg) |
|
|
34
34
|
| `/sungen-locale <name> <locale>` | Bootstrap i18n for a screen — audit selectors, detect locale switch, generate overlay (run before `/sungen-run-test --env <locale>`) |
|
|
35
35
|
|
|
36
36
|
**Screen path:** add-screen → create-test → review → run-test → delivery.
|
|
@@ -1,107 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sungen-delivery
|
|
3
|
-
description: 'Export
|
|
3
|
+
description: 'Export Gherkin scenarios + Playwright results → CSV test case deliverable. Auto-loaded by delivery command.'
|
|
4
4
|
user-invocable: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## Purpose
|
|
8
8
|
|
|
9
|
-
Export test cases from Sungen
|
|
9
|
+
Export test cases from Sungen screens and flows to a standardized CSV file (format BM-2-901-13) for QA delivery.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
target + one test intent + one oracle family); scenarios / `@cases` rows stay as collapsible
|
|
13
|
-
*coverage variant* sub-rows. Built for review, manual execution, customer hand-off, and
|
|
14
|
-
reporting — no numbered step dumps.
|
|
15
|
-
- **Legacy (`--legacy`/`--full`)** — the classic per-scenario BM-2-901-13 workbook (documented
|
|
16
|
-
in the second half of this skill; unchanged).
|
|
11
|
+
**This skill delegates all heavy work to the `sungen delivery` CLI.** The CLI is the single source of truth for parsing logic — do NOT re-parse files in AI. Your role is only to:
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
1. Invoke the CLI
|
|
14
|
+
2. Show its output verbatim
|
|
15
|
+
3. Help the user react to pre-flight failures
|
|
21
16
|
|
|
22
17
|
---
|
|
23
18
|
|
|
24
|
-
## Matrix mode — the Delivery Map
|
|
25
|
-
|
|
26
|
-
`qa/<screens|flows|api>/<unit>/delivery/<unit>.map.yaml` — committed, AI-proposed
|
|
27
|
-
(`review: proposed`), gate-validated, QA-approved (`sungen delivery --approve` stamps scenario
|
|
28
|
-
fingerprints). Schema + grouping rules live in the delivery command instructions; the normative
|
|
29
|
-
spec is `docs/spec/delivery-coverage-matrix-spec.md`.
|
|
30
|
-
|
|
31
|
-
**Gates** (CLI `--check`): A source (VP-ids unique, oracle present, Background setup-only) ·
|
|
32
|
-
B mapping (every scenario in exactly one group XOR one disposition) · C aggregation (test layer
|
|
33
|
-
recomputed and equal within a group — **execution mode and priority are coverage dimensions, not
|
|
34
|
-
splits**: mixed items show `Auto n · Manual m` and take the highest variant priority; heuristic
|
|
35
|
-
oracle-shape/precondition mismatches are review-level, silenced once approved and unchanged) ·
|
|
36
|
-
D executability (precondition · condition+
|
|
37
|
-
data · trigger · oracle all renderable; every `{{var}}` resolves; **no template token may survive
|
|
38
|
-
into a rendered cell** — test-data cross-references are resolved for display) · E drift
|
|
39
|
-
(scenario fingerprint mismatch → back to review; the map's OWN reviewed
|
|
40
|
-
wording/grouping is fingerprinted as `__map__` too, so post-approval edits re-open review) · G review state (proposed groups block the official
|
|
41
|
-
render; `--preview` renders a DRAFT watermark) · K category class (a `VP-SEC-*` variant outside
|
|
42
|
-
`category: security`, or `VP-NFR-*` outside `nfr` → warning: the Coverage grid's column would render
|
|
43
|
-
empty and report a false gap) · R requirement coverage (spec FR/TR/NFR ids with no trace and no
|
|
44
|
-
`requirements:` status → warning; **and a `status: covered` override that no variant traces to** →
|
|
45
|
-
warning: tag the proving scenario `@spec:<id>` instead of asserting it in prose) · W wording lint (map intent/oracle containing
|
|
46
|
-
tokens, `[Selector]` refs, DSL phrasing, or generator labels → warning).
|
|
47
|
-
|
|
48
|
-
**Wording normalization (deterministic, after semantic normalization):** DSL steps render as
|
|
49
|
-
controlled manual-test English without changing meaning — actions in the imperative (`User fill
|
|
50
|
-
[Email] field with X` → `Enter X in the Email field.`), expected results as observable assertions
|
|
51
|
-
(`User see [Jobs] page` → `The Jobs page is displayed.`), preconditions as states (`The user is
|
|
52
|
-
signed out.`). Manual `# Tester verifies:` labels become structured fields: `Setup:` →
|
|
53
|
-
Precondition, `Action:` → Action, `Observable:` → Expected Result, `Oracle:` → a separate
|
|
54
|
-
`Verification method:` line. Sequence-sensitive flows keep event order: actions numbered with
|
|
55
|
-
mid-flow assertions inline as `Verify: …`; only the final Then block is the Expected Result.
|
|
56
|
-
Empty test values render as `(empty)`.
|
|
57
|
-
|
|
58
|
-
**Output format**: **XLSX only by default** (one artifact). `--format csv` writes the flat CSV
|
|
59
|
-
instead; `--format both` writes both.
|
|
60
|
-
|
|
61
|
-
**Scope decides strictness**: a **named** unit that is not ready aborts with exit 1 (pass
|
|
62
|
-
`--continue-on-missing` to tolerate it); a **no-argument sweep** exports every ready unit, lists
|
|
63
|
-
every unit it did not export with the reason, and exits 0 as long as it wrote something — a
|
|
64
|
-
scaffolded unit never blocks the ready ones.
|
|
65
|
-
|
|
66
|
-
**Workbook**: `Testcases` sheet — parent rows + outline-level-1 variant sub-rows for **every**
|
|
67
|
-
item (single-variant included: the sub-row carries the source VP-id, resolved data, and the
|
|
68
|
-
result/evidence entry). Sub-rows are **delta-only**: knowledge common to the whole item
|
|
69
|
-
(precondition, trigger) is written ONCE on the parent; a child repeats only what distinguishes it
|
|
70
|
-
(condition/data, precondition delta, trigger when it differs) plus its own precise oracle and
|
|
71
|
-
execution fields. The parent never carries placeholder text — when triggers differ the cell is
|
|
72
|
-
simply empty and the sub-rows carry them.
|
|
73
|
-
|
|
74
|
-
Parent preconditions are the **intersection** of the variants' and the parent's Action holds the
|
|
75
|
-
**shared leading steps**; each variant renders only its remaining steps, numbered to continue the
|
|
76
|
-
parent's list — so a shared prefix is written once, not repeated on every child. The parent's
|
|
77
|
-
Coverage cell is the map's short `dimensions:` digest (or the variant refs when none is declared),
|
|
78
|
-
never a concatenation of variant titles.
|
|
79
|
-
|
|
80
|
-
Variant Result cells hold exactly one of `Passed`/`Failed`/`Blocked`/`Pending`/`N/A` (dropdown) —
|
|
81
|
-
that vocabulary is the contract: the parent Result and the summary band are **live Excel formulas**
|
|
82
|
-
counting those words, so a parent label is always a composed `n/m Passed …` string (`All N/A` when
|
|
83
|
-
every variant is N/A) and never a bare state word. **`N/A` leaves the denominator.** Evidence and
|
|
84
|
-
Defect ID are separate columns; ID + Target frozen; ISO dates; landscape print with repeated
|
|
85
|
-
header rows.
|
|
86
|
-
|
|
87
|
-
`Coverage` sheet — requirement coverage table (every FR/TR/NFR id with an explicit status),
|
|
88
|
-
target × category grid with explicit `—` gaps, dispositions, manifest. CSV mirrors the same model
|
|
89
|
-
flat with a `Level` column (`item`/`variant`) + a requirement-coverage appendix.
|
|
90
|
-
`delivery_item_count` ≠ progress — variants are the execution metric.
|
|
91
|
-
|
|
92
|
-
**Data fidelity**: invisible test data is made visible, never normalized — `''` → `(empty)`,
|
|
93
|
-
whitespace-only → `(5 spaces)`, padded → `" value "` quoted verbatim. A trim/collapse here would
|
|
94
|
-
silently break the whitespace tests it describes.
|
|
95
|
-
|
|
96
|
-
**Authoring guidance the matrix rewards** (create-test side): payload/provider matrices (SQLi
|
|
97
|
-
payload lists, OAuth provider sets) belong in `@cases` datasets so each case is an atomic,
|
|
98
|
-
independently-reportable variant; keep dataset `case:` labels short and stable (`CHK-EMAIL-I1`),
|
|
99
|
-
with descriptions in other columns — the label is part of the variant's identity.
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Legacy mode (--legacy / --full)
|
|
104
|
-
|
|
105
19
|
## Architecture
|
|
106
20
|
|
|
107
21
|
```
|