@sun-asterisk/sungen 3.2.16 → 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.
Files changed (22) hide show
  1. package/dist/cli/commands/ingest.d.ts.map +1 -1
  2. package/dist/cli/commands/ingest.js +56 -4
  3. package/dist/cli/commands/ingest.js.map +1 -1
  4. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -1
  5. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-element-with-text.hbs +1 -1
  6. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -1
  7. package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts.map +1 -1
  8. package/dist/generators/test-generator/utils/runtime-data-transformer.js +28 -17
  9. package/dist/generators/test-generator/utils/runtime-data-transformer.js.map +1 -1
  10. package/dist/ingest/legacy-parser.d.ts +3 -0
  11. package/dist/ingest/legacy-parser.d.ts.map +1 -1
  12. package/dist/ingest/legacy-parser.js +52 -3
  13. package/dist/ingest/legacy-parser.js.map +1 -1
  14. package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +7 -0
  15. package/package.json +4 -4
  16. package/src/cli/commands/ingest.ts +57 -5
  17. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -1
  18. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-element-with-text.hbs +1 -1
  19. package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -1
  20. package/src/generators/test-generator/utils/runtime-data-transformer.ts +29 -18
  21. package/src/ingest/legacy-parser.ts +48 -3
  22. package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +7 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+CpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6F5D"}
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoI5D"}
@@ -37,13 +37,23 @@ exports.registerIngestCommand = registerIngestCommand;
37
37
  const path = __importStar(require("path"));
38
38
  const fs = __importStar(require("fs"));
39
39
  const ingest_1 = require("../../ingest");
40
+ // A tab name that contains commas must round-trip through the quote-aware
41
+ // --sheets parser — wrap it in doubled quotes inside the single-quoted shell arg.
42
+ const quoteTab = (name) => (name.includes(',') ? `""${name}""` : name);
40
43
  function renderInventoryMd(inv, r) {
41
44
  const lines = [];
42
45
  lines.push(`# Legacy Testcase Inventory — ${inv.source.file}`, '');
43
46
  lines.push(`Total testcases: **${r.total}**`, '');
44
47
  lines.push('## Sheets', '', '| Sheet | Type | Rows |', '|---|---|---|');
48
+ // Non-testcase tabs (Overview/SQL/review notes…) are classified but NEVER read —
49
+ // say so, or the listing reads as if their content was ingested.
45
50
  for (const s of r.sheets)
46
- lines.push(`| ${s.name} | ${s.type} | ${s.rows} |`);
51
+ lines.push(s.type === 'testcase'
52
+ ? `| ${s.name} | ${s.type} | ${s.rows} |`
53
+ : `| ${s.name} | ${s.type} | — (skipped) |`);
54
+ const skipped = r.sheets.filter((s) => s.type !== 'testcase').length;
55
+ if (skipped)
56
+ lines.push('', `_${skipped} non-testcase tab(s) skipped — no content read._`);
47
57
  lines.push('', '## By category', '');
48
58
  for (const [k, v] of Object.entries(r.byCategory).sort((a, b) => b[1] - a[1]))
49
59
  lines.push(`- ${k}: ${v}`);
@@ -58,7 +68,10 @@ function render(inv, r) {
58
68
  L('');
59
69
  L(` Sheets:`);
60
70
  for (const s of r.sheets)
61
- L(` • ${s.name} — ${s.type} (${s.rows})`);
71
+ L(` • ${s.name} — ${s.type}${s.type === 'testcase' ? ` (${s.rows})` : ' → skipped (no content read)'}`);
72
+ const skipped = r.sheets.filter((s) => s.type !== 'testcase').length;
73
+ if (skipped)
74
+ L(` (${skipped} non-testcase tab(s) skipped)`);
62
75
  L('');
63
76
  L(` TOTAL testcases: ${r.total}`);
64
77
  L('');
@@ -125,12 +138,51 @@ function registerIngestCommand(program) {
125
138
  for (const s of sheets)
126
139
  console.log(` • ${s.name} — ${s.type} (${s.rows} rows)`);
127
140
  console.log('');
128
- console.log(` Ingest the testcase tab(s) with: --sheets "${sheets.filter((s) => s.type === 'testcase').map((s) => s.name).join(',')}"`);
141
+ const quoted = sheets.filter((s) => s.type === 'testcase').map((s) => quoteTab(s.name)).join(',');
142
+ console.log(` Ingest the testcase tab(s) with: --sheets '${quoted}'`);
129
143
  console.log('');
130
144
  return;
131
145
  }
132
- const onlySheets = options.sheets ? String(options.sheets).split(',') : undefined;
146
+ // --sheets: legacy tab names may CONTAIN commas (field workbook:
147
+ // "EX-0403,0404,0405,0407-SearchRe"), so a bare split(',') shredded them and
148
+ // silently ingested nothing. Resolution order:
149
+ // 1. the WHOLE string equals one real tab name → that single tab;
150
+ // 2. else parse as a quote-aware CSV line ("Tab, with commas",Other);
151
+ // 3. any part matching NO real tab → exit non-zero listing the tabs —
152
+ // an empty inventory must never be produced silently.
153
+ let onlySheets;
154
+ if (options.sheets) {
155
+ const raw = String(options.sheets);
156
+ const available = (await (0, ingest_1.listSheets)(files)).map((sh) => sh.name);
157
+ const byLower = new Map(available.map((n) => [n.trim().toLowerCase(), n]));
158
+ const whole = byLower.get(raw.trim().toLowerCase());
159
+ if (whole) {
160
+ onlySheets = [whole];
161
+ }
162
+ else {
163
+ const parts = ((0, ingest_1.parseCSV)(raw)[0] || []).map((p) => p.trim()).filter(Boolean);
164
+ const misses = parts.filter((pt) => !byLower.has(pt.toLowerCase()));
165
+ if (misses.length) {
166
+ throw new Error(`--sheets: no tab named ${misses.map((m) => `"${m}"`).join(', ')}.\n` +
167
+ ` Available tabs:\n${available.map((n) => ` • ${n}`).join('\n')}\n` +
168
+ ` Tip: quote a tab name that contains commas: --sheets '"${available[0] || 'Tab, name'}"'`);
169
+ }
170
+ onlySheets = parts.map((pt) => byLower.get(pt.toLowerCase()));
171
+ }
172
+ }
133
173
  const inv = await (0, ingest_1.parseLegacyFile)(files, onlySheets);
174
+ for (const w of inv.warnings ?? [])
175
+ console.warn(` \u26a0 ${w}`);
176
+ // Merge guard: without --sheets, EVERY tab that classifies as testcase is merged
177
+ // into one inventory. Field workbooks carry tabs for several screens (plus
178
+ // deprecated "Old\u2026" copies) \u2014 merging them silently poisons a per-screen
179
+ // inventory, so say it loudly and hand over the ready-made --sheets line.
180
+ if (!options.sheets) {
181
+ const tcTabs = inv.sheets.filter((sh) => sh.type === 'testcase');
182
+ if (tcTabs.length > 1) {
183
+ console.warn(` \u26a0 ${tcTabs.length} testcase tabs merged into ONE inventory \u2014 if they belong to different screens, scope with: --sheets '${tcTabs.map((sh) => quoteTab(sh.name)).join(',')}'`);
184
+ }
185
+ }
134
186
  const report = (0, ingest_1.baselineAudit)(inv);
135
187
  fs.writeFileSync(path.join(outDir, 'inventory.json'), JSON.stringify({ inventory: inv, baseline: report }, null, 2));
136
188
  fs.writeFileSync(path.join(outDir, 'inventory.md'), renderInventoryMd(inv, report));
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../../src/cli/commands/ingest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../../src/cli/commands/ingest.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- await {{> locator}}.click();
1
+ await {{> locator}}.click({{#if force}}{ force: true }{{/if}});
@@ -1 +1 @@
1
- await {{> locator-base}}.filter({ hasText: {{> has-text-value dataValue=dataValue exact=exact legacyTail=(and (eq strategy "text") (eq value ""))}} }){{> locator-nth}}.click();
1
+ await {{> locator-base}}.filter({ hasText: {{> has-text-value dataValue=dataValue exact=exact legacyTail=(and (eq strategy "text") (eq value ""))}} }){{> locator-nth}}.click({{#if force}}{ force: true }{{/if}});
@@ -1 +1 @@
1
- await page.waitForLoadState('networkidle');
1
+ await page.waitForTimeout({{duration}});
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-data-transformer.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/runtime-data-transformer.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAmB,GAAG,MAAM,CAkD1F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D"}
1
+ {"version":3,"file":"runtime-data-transformer.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/runtime-data-transformer.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAmB,GAAG,MAAM,CAwD1F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D"}
@@ -17,25 +17,32 @@ function transformToRuntimeData(code, accessor = 'testData') {
17
17
  // testData.get() (silent: `toHaveAttribute('href', 'official_site_url')`). Generated
18
18
  // comments are always full-line, so anchoring loses nothing.
19
19
  code = code.replace(/^(\s*)\/\/(.*)__SUNGEN_TD_([A-Za-z0-9_]+)__(.*)$/gm, (_, indent, before, enc, after) => `${indent}//${before}${decodeKey(enc)}${after}`);
20
- // Pass 1: String literal context — handles both whole-string and embedded markers
21
- // 'marker' testData.get('key')
22
- // 'prefix__marker__suffix' → `prefix${testData.get('key')}suffix`
23
- code = code.replace(/(['"])((?:(?!\1).)*?)__SUNGEN_TD_([A-Za-z0-9_]+)__((?:(?!\1).)*?)\1/g, (_, _quote, prefix, enc, suffix) => {
24
- const key = decodeKey(enc);
25
- if (!prefix && !suffix) {
26
- return `${accessor}.get('${key}')`;
27
- }
28
- return `\`${prefix}\${${accessor}.get('${key}')}${suffix}\``;
20
+ // Pass 1: String literal context — a literal may carry SEVERAL markers
21
+ // ('/{{code}}/car-search?{{prefill}}' compiles to two markers in ONE literal).
22
+ // Match the whole quoted literal that contains at least one marker, then
23
+ // interpolate EVERY marker inside it. The old shape (one marker + lazy
24
+ // prefix/suffix) swallowed trailing markers into its suffix verbatim; they
25
+ // escaped the quote context (the literal had become a backtick template) and
26
+ // Pass 3's numeric catch-all emitted them as literal
27
+ // `Number(testData.get(...))` TEXT inside the template — a compiling spec
28
+ // navigating to a garbage URL.
29
+ // 'marker' → testData.get('key')
30
+ // 'a__m1__b__m2__c' → `a${testData.get('k1')}b${testData.get('k2')}c`
31
+ code = code.replace(/(['"])((?:(?!\1).)*?__SUNGEN_TD_[A-Za-z0-9_]+__(?:(?!\1).)*)\1/g, (_, _quote, body) => {
32
+ const whole = /^__SUNGEN_TD_([A-Za-z0-9_]+)__$/.exec(body);
33
+ if (whole)
34
+ return `${accessor}.get('${decodeKey(whole[1])}')`;
35
+ return `\`${interpolateMarkers(body, accessor)}\``;
29
36
  });
30
- // Pass 2: Regex literal context — /prefix__marker__suffix/ → new RegExp(`...`)
31
- // Only matches within a single line (no newlines in prefix/suffix)
32
- code = code.replace(/\/((?:[^/\\\n]|\\.)*?)__SUNGEN_TD_([A-Za-z0-9_]+)__((?:[^/\\\n]|\\.)*?)\/([gimsuy]*)/g, (_, prefix, enc, suffix, flags) => {
33
- const key = decodeKey(enc);
34
- const ref = `${accessor}.get('${key}')`;
37
+ // Pass 2: Regex literal context — /…__marker__…/ → new RegExp(`…`). Same
38
+ // several-markers-per-literal rule as Pass 1 (/{{min}}-{{max}} items/).
39
+ // Only matches within a single line (no newlines in the body).
40
+ code = code.replace(/\/((?:[^/\\\n]|\\.)*?__SUNGEN_TD_[A-Za-z0-9_]+__(?:[^/\\\n]|\\.)*)\/([gimsuy]*)/g, (_, body, flags) => {
35
41
  const flagStr = flags ? `, '${flags}'` : '';
36
- if (!prefix && !suffix)
37
- return `new RegExp(${ref}${flagStr})`;
38
- return `new RegExp(\`${prefix}\${${ref}}${suffix}\`${flagStr})`;
42
+ const whole = /^__SUNGEN_TD_([A-Za-z0-9_]+)__$/.exec(body);
43
+ if (whole)
44
+ return `new RegExp(${accessor}.get('${decodeKey(whole[1])}')${flagStr})`;
45
+ return `new RegExp(\`${interpolateMarkers(body, accessor)}\`${flagStr})`;
39
46
  });
40
47
  // Pass 3: Bare-identifier context — any marker left after the string/regex passes
41
48
  // sits as a bare token in a numeric position (e.g. `toHaveCount(__marker__)` from the
@@ -49,4 +56,8 @@ function hasRuntimeDataMarkers(code) {
49
56
  function decodeKey(encoded) {
50
57
  return encoded.replace(/_D_/g, '.');
51
58
  }
59
+ /** Replace every marker in a literal's body with a `${accessor.get('key')}` interpolation. */
60
+ function interpolateMarkers(body, accessor) {
61
+ return body.replace(/__SUNGEN_TD_([A-Za-z0-9_]+)__/g, (_, enc) => `\${${accessor}.get('${decodeKey(enc)}')}`);
62
+ }
52
63
  //# sourceMappingURL=runtime-data-transformer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-data-transformer.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/runtime-data-transformer.ts"],"names":[],"mappings":";;AAMA,wDAkDC;AAED,sDAEC;AA5DD,MAAM,cAAc,GAAG,+BAA+B,CAAC;AAEvD;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,IAAY,EAAE,WAAmB,UAAU;IAChF,2EAA2E;IAC3E,+EAA+E;IAC/E,mFAAmF;IACnF,sFAAsF;IACtF,oFAAoF;IACpF,8EAA8E;IAC9E,qFAAqF;IACrF,6DAA6D;IAC7D,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,oDAAoD,EACpD,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CACnF,CAAC;IAEF,kFAAkF;IAClF,oDAAoD;IACpD,qEAAqE;IACrE,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,sEAAsE,EACtE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,GAAG,QAAQ,SAAS,GAAG,IAAI,CAAC;QACrC,CAAC;QACD,OAAO,KAAK,MAAM,MAAM,QAAQ,SAAS,GAAG,MAAM,MAAM,IAAI,CAAC;IAC/D,CAAC,CACF,CAAC;IAEF,+EAA+E;IAC/E,mEAAmE;IACnE,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,uFAAuF,EACvF,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,QAAQ,SAAS,GAAG,IAAI,CAAC;QACxC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;YAAE,OAAO,cAAc,GAAG,GAAG,OAAO,GAAG,CAAC;QAC9D,OAAO,gBAAgB,MAAM,MAAM,GAAG,IAAI,MAAM,KAAK,OAAO,GAAG,CAAC;IAClE,CAAC,CACF,CAAC;IAEF,kFAAkF;IAClF,sFAAsF;IACtF,yFAAyF;IACzF,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,gCAAgC,EAChC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,QAAQ,SAAS,SAAS,CAAC,GAAG,CAAC,KAAK,CAC3D,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"runtime-data-transformer.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/utils/runtime-data-transformer.ts"],"names":[],"mappings":";;AAMA,wDAwDC;AAED,sDAEC;AAlED,MAAM,cAAc,GAAG,+BAA+B,CAAC;AAEvD;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,IAAY,EAAE,WAAmB,UAAU;IAChF,2EAA2E;IAC3E,+EAA+E;IAC/E,mFAAmF;IACnF,sFAAsF;IACtF,oFAAoF;IACpF,8EAA8E;IAC9E,qFAAqF;IACrF,6DAA6D;IAC7D,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,oDAAoD,EACpD,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CACnF,CAAC;IAEF,uEAAuE;IACvE,+EAA+E;IAC/E,yEAAyE;IACzE,uEAAuE;IACvE,2EAA2E;IAC3E,6EAA6E;IAC7E,qDAAqD;IACrD,0EAA0E;IAC1E,+BAA+B;IAC/B,0CAA0C;IAC1C,sEAAsE;IACtE,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,iEAAiE,EACjE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,KAAK,GAAG,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,KAAK;YAAE,OAAO,GAAG,QAAQ,SAAS,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,OAAO,KAAK,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,yEAAyE;IACzE,wEAAwE;IACxE,+DAA+D;IAC/D,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,kFAAkF,EAClF,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,KAAK;YAAE,OAAO,cAAc,QAAQ,SAAS,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC;QACpF,OAAO,gBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,OAAO,GAAG,CAAC;IAC3E,CAAC,CACF,CAAC;IAEF,kFAAkF;IAClF,sFAAsF;IACtF,yFAAyF;IACzF,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,gCAAgC,EAChC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,QAAQ,SAAS,SAAS,CAAC,GAAG,CAAC,KAAK,CAC3D,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,8FAA8F;AAC9F,SAAS,kBAAkB,CAAC,IAAY,EAAE,QAAgB;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,gCAAgC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,QAAQ,SAAS,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChH,CAAC"}
@@ -25,6 +25,9 @@ export interface LegacyInventory {
25
25
  };
26
26
  sheets: SheetInfo[];
27
27
  testcases: LegacyTestcase[];
28
+ /** Anti-silence guards: convention mismatches that would otherwise drop data quietly
29
+ * (near-miss headers, testcase tab with 0 rows, mandatory column empty on every row). */
30
+ warnings?: string[];
28
31
  }
29
32
  export declare function parseCSV(text: string): string[][];
30
33
  export interface RawSheet {
@@ -1 +1 @@
1
- {"version":3,"file":"legacy-parser.d.ts","sourceRoot":"","sources":["../../src/ingest/legacy-parser.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,kBAAkB,GAAG,cAAc,GAAG,SAAS,CAAC;AACrF,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAE1E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAGD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAcjD;AA8DD,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;CAAE;AAsC5D,uEAAuE;AACvE,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAUnF;AAED;gFACgF;AAChF,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAmBnH"}
1
+ {"version":3,"file":"legacy-parser.d.ts","sourceRoot":"","sources":["../../src/ingest/legacy-parser.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,kBAAkB,GAAG,cAAc,GAAG,SAAS,CAAC;AACrF,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAE1E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B;8FAC0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAGD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAcjD;AAkFD,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;CAAE;AAsC5D,uEAAuE;AACvE,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAUnF;AAED;gFACgF;AAChF,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAyCnH"}
@@ -82,7 +82,11 @@ function parseCSV(text) {
82
82
  }
83
83
  return rows;
84
84
  }
85
- const norm = (s) => (s || '').replace(/\*/g, '').trim().toLowerCase();
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(cell.text != null ? String(cell.text) : ''); });
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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"}
@@ -39,6 +39,7 @@ User uncheck [T] checkbox | toggle
39
39
  User select [T] dropdown with {{v}}
40
40
  User click [T] button | tab | column | breadcrumb
41
41
  User click [T] row with {{v}}
42
+ User try to click [T] button | link # DISABLED element only — see rule below (v3.3)
42
43
  User double click [T] element
43
44
  User hover [T] icon | row
44
45
  User drag [T] to [T2]
@@ -47,6 +48,12 @@ User expand | collapse [T] row
47
48
 
48
49
  **click + with {{Value}} rule**: NO value for static (`button`, `link`, `icon`, `tab`). WITH value only for dynamic lists (`row`, `item`, `card`, `option`).
49
50
 
51
+ **try to click rule** (v3.3, web only): use ONLY when the element is expected to be DISABLED and the
52
+ scenario asserts nothing happens (cooldown re-send, submit before the form is valid). `click` waits for
53
+ `enabled` → it can only time out there; `try to click` compiles to `.click({ force: true })`. Always
54
+ pair it with the proof: `Then User see [T] TYPE is disabled` + an assertion that the effect did NOT occur.
55
+ NEVER use it for a click that is supposed to work — it deletes the actionability wait.
56
+
50
57
  ### Alert / Keyboard / Wait / Scroll
51
58
 
52
59
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sun-asterisk/sungen",
3
- "version": "3.2.16",
3
+ "version": "3.2.17",
4
4
  "description": "Deterministic E2E Test Compiler - Gherkin + Selectors → Playwright tests",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
@@ -12,7 +12,7 @@
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/ && mkdir -p dist/generators/test-generator/adapters/appium/templates/steps && cp -r src/generators/test-generator/adapters/appium/templates/*.hbs dist/generators/test-generator/adapters/appium/templates/ 2>/dev/null || true && cp -r src/generators/test-generator/adapters/appium/templates/steps dist/generators/test-generator/adapters/appium/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 && tsx tests/ingest/run.ts && tsx tests/eval/run.ts && tsx tests/exporter/run.ts && tsx tests/exporter/feature-parser-category.run.ts && tsx tests/exporter/api-detail-sheet.run.ts && tsx tests/exporter/overview-sheet.run.ts && tsx tests/exporter/delivery-divider-tcid.run.ts && tsx tests/exporter/note-expected-actual.run.ts && tsx tests/exporter/test-data-vars.run.ts && tsx tests/exporter/mobile-app-id.run.ts && tsx tests/exporter/api-testcase-cells.run.ts && tsx tests/exporter/delivery-cases-result.run.ts && tsx tests/exporter/precondition-auth-role.run.ts && tsx tests/exporter/report-builder-parity.run.ts && tsx tests/exporter/delivery-preflight-testdata.run.ts && tsx tests/exporter/delivery-preflight-selectors.run.ts && tsx tests/exporter/delivery-prerun-overview.run.ts && tsx tests/exporter/delivery-locale-env-discovery.run.ts && tsx tests/exporter/manual-testcase-testdata.run.ts && tsx tests/dashboard/api-flows-discovery.run.ts && tsx tests/dashboard/status-results-fallback.run.ts && tsx tests/codegen/verb-ref-masking.run.ts && tsx tests/codegen/table-aria-hidden-locators.run.ts && tsx tests/codegen/steps-base-not-compiled.run.ts && tsx tests/codegen/manual-oracle-gate.run.ts && tsx tests/codegen/locator-value-qualified-assertions.run.ts && tsx tests/codegen/table-match-data-column-mapping.run.ts && tsx tests/codegen/param-binding-native-type.run.ts && tsx tests/codegen/table-row-scope-redeclaration.run.ts && tsx tests/codegen/table-row-label-resolution.run.ts && tsx tests/api-runtime/base-path-url-join.run.ts && tsx tests/api-runtime/file-upload-multipart.run.ts && tsx tests/api-runtime/schema-assertion.run.ts && tsx tests/runtime/test-data-cross-ref.run.ts && tsx tests/runtime/test-data-array-projection.run.ts && tsx tests/runtime/env-secret-interpolation.run.ts && tsx tests/capabilities/run.ts && tsx tests/openapi/run.ts && tsx tests/api-field-coverage/run.ts && tsx tests/packaging/run.ts && tsx tests/generate-hint/run.ts && tsx tests/template-assertion/run.ts && tsx tests/journey/run.ts && tsx tests/harness/serial-cascade.run.ts && tsx tests/ai-skills/cross-assistant-orphan.run.ts && tsx tests/init/codex-mcp-config.run.ts && tsx src/orchestrator/ai-skills/golden-skills.test.ts && tsx tests/db-runtime/sql-placeholder-rewrite.run.ts && tsx tests/db-runtime/fallback-flow-codified.run.ts && tsx tests/db-runtime/cosmos-engine.run.ts && tsx tests/db-runtime/mongodb-engine.run.ts && tsx tests/db-runtime/dynamodb-engine.run.ts && tsx tests/db-runtime/mysql-integration.opt-in.run.ts && tsx tests/db-runtime/mongodb-integration.opt-in.run.ts && tsx tests/db-runtime/dynamodb-integration.opt-in.run.ts",
15
+ "test": "tsx tests/run-all.ts",
16
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
  },
@@ -39,8 +39,8 @@
39
39
  "@babel/types": "^7.28.5",
40
40
  "@cucumber/gherkin": "^37.0.0",
41
41
  "@cucumber/messages": "^31.0.0",
42
- "@sungen/driver-data-factory": "3.2.16",
43
- "@sungen/driver-ui": "3.2.16",
42
+ "@sungen/driver-data-factory": "3.2.17",
43
+ "@sungen/driver-ui": "3.2.17",
44
44
  "chalk": "^5.6.2",
45
45
  "commander": "^14.0.2",
46
46
  "dotenv": "^17.2.3",
@@ -1,14 +1,24 @@
1
1
  import { Command } from 'commander';
2
2
  import * as path from 'path';
3
3
  import * as fs from 'fs';
4
- import { parseLegacyFile, listSheets, baselineAudit, BaselineReport, LegacyInventory, inventoryToGherkin, reconcileViewpoints, renderViewpointOverview, fetchGoogleSheet } from '../../ingest';
4
+ import { parseLegacyFile, listSheets, baselineAudit, BaselineReport, LegacyInventory, inventoryToGherkin, reconcileViewpoints, renderViewpointOverview, fetchGoogleSheet, parseCSV } from '../../ingest';
5
+
6
+ // A tab name that contains commas must round-trip through the quote-aware
7
+ // --sheets parser — wrap it in doubled quotes inside the single-quoted shell arg.
8
+ const quoteTab = (name: string) => (name.includes(',') ? `""${name}""` : name);
5
9
 
6
10
  function renderInventoryMd(inv: LegacyInventory, r: BaselineReport): string {
7
11
  const lines: string[] = [];
8
12
  lines.push(`# Legacy Testcase Inventory — ${inv.source.file}`, '');
9
13
  lines.push(`Total testcases: **${r.total}**`, '');
10
14
  lines.push('## Sheets', '', '| Sheet | Type | Rows |', '|---|---|---|');
11
- for (const s of r.sheets) lines.push(`| ${s.name} | ${s.type} | ${s.rows} |`);
15
+ // Non-testcase tabs (Overview/SQL/review notes…) are classified but NEVER read
16
+ // say so, or the listing reads as if their content was ingested.
17
+ for (const s of r.sheets) lines.push(s.type === 'testcase'
18
+ ? `| ${s.name} | ${s.type} | ${s.rows} |`
19
+ : `| ${s.name} | ${s.type} | — (skipped) |`);
20
+ const skipped = r.sheets.filter((s) => s.type !== 'testcase').length;
21
+ if (skipped) lines.push('', `_${skipped} non-testcase tab(s) skipped — no content read._`);
12
22
  lines.push('', '## By category', '');
13
23
  for (const [k, v] of Object.entries(r.byCategory).sort((a, b) => b[1] - a[1])) lines.push(`- ${k}: ${v}`);
14
24
  lines.push('', `Depth: **${(r.depthRatio * 100).toFixed(0)}%** (${r.deepCount}/${r.total} assert a concrete expected value)`, '');
@@ -22,7 +32,10 @@ function render(inv: LegacyInventory, r: BaselineReport): void {
22
32
  L(`━━━ Legacy Ingest — ${inv.source.file} ━━━`);
23
33
  L('');
24
34
  L(` Sheets:`);
25
- for (const s of r.sheets) L(` • ${s.name} — ${s.type} (${s.rows})`);
35
+ for (const s of r.sheets)
36
+ L(` • ${s.name} — ${s.type}${s.type === 'testcase' ? ` (${s.rows})` : ' → skipped (no content read)'}`);
37
+ const skipped = r.sheets.filter((s) => s.type !== 'testcase').length;
38
+ if (skipped) L(` (${skipped} non-testcase tab(s) skipped)`);
26
39
  L('');
27
40
  L(` TOTAL testcases: ${r.total}`);
28
41
  L('');
@@ -88,13 +101,52 @@ export function registerIngestCommand(program: Command): void {
88
101
  console.log(' Tabs found:');
89
102
  for (const s of sheets) console.log(` • ${s.name} — ${s.type} (${s.rows} rows)`);
90
103
  console.log('');
91
- console.log(` Ingest the testcase tab(s) with: --sheets "${sheets.filter((s) => s.type === 'testcase').map((s) => s.name).join(',')}"`);
104
+ const quoted = sheets.filter((s) => s.type === 'testcase').map((s) => quoteTab(s.name)).join(',');
105
+ console.log(` Ingest the testcase tab(s) with: --sheets '${quoted}'`);
92
106
  console.log('');
93
107
  return;
94
108
  }
95
109
 
96
- const onlySheets: string[] | undefined = options.sheets ? String(options.sheets).split(',') : undefined;
110
+ // --sheets: legacy tab names may CONTAIN commas (field workbook:
111
+ // "EX-0403,0404,0405,0407-SearchRe"), so a bare split(',') shredded them and
112
+ // silently ingested nothing. Resolution order:
113
+ // 1. the WHOLE string equals one real tab name → that single tab;
114
+ // 2. else parse as a quote-aware CSV line ("Tab, with commas",Other);
115
+ // 3. any part matching NO real tab → exit non-zero listing the tabs —
116
+ // an empty inventory must never be produced silently.
117
+ let onlySheets: string[] | undefined;
118
+ if (options.sheets) {
119
+ const raw = String(options.sheets);
120
+ const available = (await listSheets(files)).map((sh) => sh.name);
121
+ const byLower = new Map(available.map((n) => [n.trim().toLowerCase(), n]));
122
+ const whole = byLower.get(raw.trim().toLowerCase());
123
+ if (whole) {
124
+ onlySheets = [whole];
125
+ } else {
126
+ const parts = (parseCSV(raw)[0] || []).map((p) => p.trim()).filter(Boolean);
127
+ const misses = parts.filter((pt) => !byLower.has(pt.toLowerCase()));
128
+ if (misses.length) {
129
+ throw new Error(
130
+ `--sheets: no tab named ${misses.map((m) => `"${m}"`).join(', ')}.\n` +
131
+ ` Available tabs:\n${available.map((n) => ` • ${n}`).join('\n')}\n` +
132
+ ` Tip: quote a tab name that contains commas: --sheets '"${available[0] || 'Tab, name'}"'`
133
+ );
134
+ }
135
+ onlySheets = parts.map((pt) => byLower.get(pt.toLowerCase())!);
136
+ }
137
+ }
97
138
  const inv = await parseLegacyFile(files, onlySheets);
139
+ for (const w of inv.warnings ?? []) console.warn(` \u26a0 ${w}`);
140
+ // Merge guard: without --sheets, EVERY tab that classifies as testcase is merged
141
+ // into one inventory. Field workbooks carry tabs for several screens (plus
142
+ // deprecated "Old\u2026" copies) \u2014 merging them silently poisons a per-screen
143
+ // inventory, so say it loudly and hand over the ready-made --sheets line.
144
+ if (!options.sheets) {
145
+ const tcTabs = inv.sheets.filter((sh) => sh.type === 'testcase');
146
+ if (tcTabs.length > 1) {
147
+ console.warn(` \u26a0 ${tcTabs.length} testcase tabs merged into ONE inventory \u2014 if they belong to different screens, scope with: --sheets '${tcTabs.map((sh) => quoteTab(sh.name)).join(',')}'`);
148
+ }
149
+ }
98
150
  const report = baselineAudit(inv);
99
151
  fs.writeFileSync(path.join(outDir, 'inventory.json'), JSON.stringify({ inventory: inv, baseline: report }, null, 2));
100
152
  fs.writeFileSync(path.join(outDir, 'inventory.md'), renderInventoryMd(inv, report));
@@ -1 +1 @@
1
- await {{> locator}}.click();
1
+ await {{> locator}}.click({{#if force}}{ force: true }{{/if}});
@@ -1 +1 @@
1
- await {{> locator-base}}.filter({ hasText: {{> has-text-value dataValue=dataValue exact=exact legacyTail=(and (eq strategy "text") (eq value ""))}} }){{> locator-nth}}.click();
1
+ await {{> locator-base}}.filter({ hasText: {{> has-text-value dataValue=dataValue exact=exact legacyTail=(and (eq strategy "text") (eq value ""))}} }){{> locator-nth}}.click({{#if force}}{ force: true }{{/if}});
@@ -1 +1 @@
1
- await page.waitForLoadState('networkidle');
1
+ await page.waitForTimeout({{duration}});
@@ -18,30 +18,36 @@ export function transformToRuntimeData(code: string, accessor: string = 'testDat
18
18
  (_, indent, before, enc, after) => `${indent}//${before}${decodeKey(enc)}${after}`
19
19
  );
20
20
 
21
- // Pass 1: String literal context — handles both whole-string and embedded markers
22
- // 'marker' testData.get('key')
23
- // 'prefix__marker__suffix' → `prefix${testData.get('key')}suffix`
21
+ // Pass 1: String literal context — a literal may carry SEVERAL markers
22
+ // ('/{{code}}/car-search?{{prefill}}' compiles to two markers in ONE literal).
23
+ // Match the whole quoted literal that contains at least one marker, then
24
+ // interpolate EVERY marker inside it. The old shape (one marker + lazy
25
+ // prefix/suffix) swallowed trailing markers into its suffix verbatim; they
26
+ // escaped the quote context (the literal had become a backtick template) and
27
+ // Pass 3's numeric catch-all emitted them as literal
28
+ // `Number(testData.get(...))` TEXT inside the template — a compiling spec
29
+ // navigating to a garbage URL.
30
+ // 'marker' → testData.get('key')
31
+ // 'a__m1__b__m2__c' → `a${testData.get('k1')}b${testData.get('k2')}c`
24
32
  code = code.replace(
25
- /(['"])((?:(?!\1).)*?)__SUNGEN_TD_([A-Za-z0-9_]+)__((?:(?!\1).)*?)\1/g,
26
- (_, _quote, prefix, enc, suffix) => {
27
- const key = decodeKey(enc);
28
- if (!prefix && !suffix) {
29
- return `${accessor}.get('${key}')`;
30
- }
31
- return `\`${prefix}\${${accessor}.get('${key}')}${suffix}\``;
33
+ /(['"])((?:(?!\1).)*?__SUNGEN_TD_[A-Za-z0-9_]+__(?:(?!\1).)*)\1/g,
34
+ (_, _quote, body) => {
35
+ const whole = /^__SUNGEN_TD_([A-Za-z0-9_]+)__$/.exec(body);
36
+ if (whole) return `${accessor}.get('${decodeKey(whole[1])}')`;
37
+ return `\`${interpolateMarkers(body, accessor)}\``;
32
38
  }
33
39
  );
34
40
 
35
- // Pass 2: Regex literal context — /prefix__marker__suffix/ → new RegExp(`...`)
36
- // Only matches within a single line (no newlines in prefix/suffix)
41
+ // Pass 2: Regex literal context — /…__marker__…/ → new RegExp(`…`). Same
42
+ // several-markers-per-literal rule as Pass 1 (/{{min}}-{{max}} items/).
43
+ // Only matches within a single line (no newlines in the body).
37
44
  code = code.replace(
38
- /\/((?:[^/\\\n]|\\.)*?)__SUNGEN_TD_([A-Za-z0-9_]+)__((?:[^/\\\n]|\\.)*?)\/([gimsuy]*)/g,
39
- (_, prefix, enc, suffix, flags) => {
40
- const key = decodeKey(enc);
41
- const ref = `${accessor}.get('${key}')`;
45
+ /\/((?:[^/\\\n]|\\.)*?__SUNGEN_TD_[A-Za-z0-9_]+__(?:[^/\\\n]|\\.)*)\/([gimsuy]*)/g,
46
+ (_, body, flags) => {
42
47
  const flagStr = flags ? `, '${flags}'` : '';
43
- if (!prefix && !suffix) return `new RegExp(${ref}${flagStr})`;
44
- return `new RegExp(\`${prefix}\${${ref}}${suffix}\`${flagStr})`;
48
+ const whole = /^__SUNGEN_TD_([A-Za-z0-9_]+)__$/.exec(body);
49
+ if (whole) return `new RegExp(${accessor}.get('${decodeKey(whole[1])}')${flagStr})`;
50
+ return `new RegExp(\`${interpolateMarkers(body, accessor)}\`${flagStr})`;
45
51
  }
46
52
  );
47
53
 
@@ -63,3 +69,8 @@ export function hasRuntimeDataMarkers(code: string): boolean {
63
69
  function decodeKey(encoded: string): string {
64
70
  return encoded.replace(/_D_/g, '.');
65
71
  }
72
+
73
+ /** Replace every marker in a literal's body with a `${accessor.get('key')}` interpolation. */
74
+ function interpolateMarkers(body: string, accessor: string): string {
75
+ return body.replace(/__SUNGEN_TD_([A-Za-z0-9_]+)__/g, (_, enc) => `\${${accessor}.get('${decodeKey(enc)}')}`);
76
+ }
@@ -30,6 +30,9 @@ export interface LegacyInventory {
30
30
  source: { file: string };
31
31
  sheets: SheetInfo[];
32
32
  testcases: LegacyTestcase[];
33
+ /** Anti-silence guards: convention mismatches that would otherwise drop data quietly
34
+ * (near-miss headers, testcase tab with 0 rows, mandatory column empty on every row). */
35
+ warnings?: string[];
33
36
  }
34
37
 
35
38
  // ---- quote-aware CSV parser (embedded commas + newlines) ----
@@ -49,7 +52,11 @@ export function parseCSV(text: string): string[][] {
49
52
  return rows;
50
53
  }
51
54
 
52
- const norm = (s: string | undefined) => (s || '').replace(/\*/g, '').trim().toLowerCase();
55
+ // Strip the "required" decoration `(*)` BEFORE stray asterisks: legacy workbooks
56
+ // mark mandatory columns as `Steps (*)` / `TC ID (*)`. Removing only the `*` left
57
+ // `steps ()` — classification regexes still matched (/steps?|expected/), but the
58
+ // exact-key column lookups missed and every mandatory cell came back '' silently.
59
+ const norm = (s: string | undefined) => (s || '').replace(/\(\s*\*\s*\)/g, '').replace(/\*/g, '').trim().toLowerCase();
53
60
 
54
61
  function detectSheetType(rows: string[][]): { type: SheetType; headerRow: number } {
55
62
  for (let i = 0; i < Math.min(rows.length, 40); i++) {
@@ -109,6 +116,22 @@ function parseTestcaseSheet(rows: string[][], headerRow: number, sheet: string):
109
116
  return out;
110
117
  }
111
118
 
119
+ /**
120
+ * exceljs's `.text` getter can THROW on a merged cell whose master value is null
121
+ * (MergeValue.toString() on null) — a `cell.text != null` guard never runs because
122
+ * READING the property explodes. Field workbook: 25 such cells across 3 tabs
123
+ * (Google-Sheets-exported merged headers). Guard on `.value` first (safe — merge
124
+ * slaves delegate to the master's value without stringifying), and keep a
125
+ * try/catch backstop for values that are non-null yet still un-stringifiable
126
+ * (e.g. a formula cell whose result is null). Never hand-stringify `.value` —
127
+ * richText/hyperlink objects would become "[object Object]"; exceljs's own
128
+ * `.text` stays the single formatter.
129
+ */
130
+ function safeCellText(cell: any): string {
131
+ if (cell.value == null) return '';
132
+ try { return String(cell.text ?? ''); } catch { return ''; }
133
+ }
134
+
112
135
  export interface RawSheet { name: string; rows: string[][] }
113
136
 
114
137
  /** Load sheets from one input file: CSV (1 sheet), XLSX (all sheets), or a JSON
@@ -137,7 +160,7 @@ async function loadSheets(filePath: string): Promise<RawSheet[]> {
137
160
  const rows: string[][] = [];
138
161
  ws.eachRow((row: any) => {
139
162
  const cells: string[] = [];
140
- row.eachCell({ includeEmpty: true }, (cell: any) => { cells.push(cell.text != null ? String(cell.text) : ''); });
163
+ row.eachCell({ includeEmpty: true }, (cell: any) => { cells.push(safeCellText(cell)); });
141
164
  rows.push(cells);
142
165
  });
143
166
  out.push({ name: ws.name, rows });
@@ -168,7 +191,7 @@ export async function parseLegacyFile(filePaths: string | string[], onlySheets?:
168
191
 
169
192
  const inv: LegacyInventory = {
170
193
  source: { file: files.map((f) => path.basename(f)).join(', ') },
171
- sheets: [], testcases: [],
194
+ sheets: [], testcases: [], warnings: [],
172
195
  };
173
196
  for (const f of files) {
174
197
  for (const s of await loadSheets(f)) {
@@ -176,6 +199,28 @@ export async function parseLegacyFile(filePaths: string | string[], onlySheets?:
176
199
  const { type, headerRow } = detectSheetType(s.rows);
177
200
  let tcs: LegacyTestcase[] = [];
178
201
  if (type === 'testcase' && headerRow >= 0) tcs = parseTestcaseSheet(s.rows, headerRow, s.name);
202
+ // Anti-silence guards — a convention mismatch must SAY so, never quietly drop data:
203
+ // (a) near-miss: a tab that carries a TC-ID-ish header yet classified unknown;
204
+ // (b) a testcase tab whose extraction produced ZERO rows;
205
+ // (c) rows extracted but a mandatory column resolved empty on EVERY row.
206
+ if (type === 'unknown') {
207
+ const loose = (v: string) => v.replace(/[^a-z0-9]/gi, '').toLowerCase();
208
+ const nearMissRow = s.rows.slice(0, 40).find((r) => r.some((c) => /tcid/.test(loose(c))));
209
+ if (nearMissRow) {
210
+ 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(' | ')}]`);
211
+ }
212
+ } else if (type === 'testcase' && headerRow >= 0) {
213
+ const header = s.rows[headerRow].filter(Boolean).slice(0, 12).join(' | ');
214
+ if (tcs.length === 0) {
215
+ inv.warnings!.push(`sheet "${s.name}": classified testcase but 0 rows extracted — column names may not follow the expected convention. Header row: [${header}]`);
216
+ } else {
217
+ for (const [field, label] of [['steps', 'Steps'], ['expected', 'Expected results']] as const) {
218
+ if (tcs.every((t) => !(t as any)[field])) {
219
+ 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}]`);
220
+ }
221
+ }
222
+ }
223
+ }
179
224
  inv.sheets.push({ name: s.name, type, rows: tcs.length || s.rows.length });
180
225
  inv.testcases.push(...tcs);
181
226
  }
@@ -39,6 +39,7 @@ User uncheck [T] checkbox | toggle
39
39
  User select [T] dropdown with {{v}}
40
40
  User click [T] button | tab | column | breadcrumb
41
41
  User click [T] row with {{v}}
42
+ User try to click [T] button | link # DISABLED element only — see rule below (v3.3)
42
43
  User double click [T] element
43
44
  User hover [T] icon | row
44
45
  User drag [T] to [T2]
@@ -47,6 +48,12 @@ User expand | collapse [T] row
47
48
 
48
49
  **click + with {{Value}} rule**: NO value for static (`button`, `link`, `icon`, `tab`). WITH value only for dynamic lists (`row`, `item`, `card`, `option`).
49
50
 
51
+ **try to click rule** (v3.3, web only): use ONLY when the element is expected to be DISABLED and the
52
+ scenario asserts nothing happens (cooldown re-send, submit before the form is valid). `click` waits for
53
+ `enabled` → it can only time out there; `try to click` compiles to `.click({ force: true })`. Always
54
+ pair it with the proof: `Then User see [T] TYPE is disabled` + an assertion that the effect did NOT occur.
55
+ NEVER use it for a click that is supposed to work — it deletes the actionability wait.
56
+
50
57
  ### Alert / Keyboard / Wait / Scroll
51
58
 
52
59
  ```