@ia-qa/pal 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -2
- package/TUTORIAL.md +76 -14
- package/dist/accept.d.ts +20 -0
- package/dist/accept.js +119 -0
- package/dist/accept.js.map +1 -0
- package/dist/cli/index.js +62 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/history.d.ts +23 -0
- package/dist/history.js +108 -0
- package/dist/history.js.map +1 -0
- package/dist/htmlReport.d.ts +15 -0
- package/dist/htmlReport.js +368 -0
- package/dist/htmlReport.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.js +3 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/plan.d.ts +58 -1
- package/dist/plan.js +57 -1
- package/dist/plan.js.map +1 -1
- package/dist/report.js +43 -8
- package/dist/report.js.map +1 -1
- package/dist/run.d.ts +1 -0
- package/dist/run.js +57 -6
- package/dist/run.js.map +1 -1
- package/dist/tour.d.ts +27 -1
- package/dist/tour.js +38 -9
- package/dist/tour.js.map +1 -1
- package/package.json +2 -2
package/dist/plan.d.ts
CHANGED
|
@@ -47,6 +47,60 @@ export interface CheckSplit {
|
|
|
47
47
|
* broken link is still broken the second time — and only their "already reported" count moves.
|
|
48
48
|
*/
|
|
49
49
|
export declare function splitFindings(report: CheckReport, known: ReadonlySet<string>): CheckSplit;
|
|
50
|
+
/**
|
|
51
|
+
* The findings the next tour treats as already reported. A source that gave no answer this tour
|
|
52
|
+
* (null) keeps what it had reported before: "no answer" is not "nothing found", and dropping them
|
|
53
|
+
* would re-announce every known warning as new on the tour after.
|
|
54
|
+
*/
|
|
55
|
+
export declare function carryKnown(previous: string[], checkKeys: string[] | null, deadNameKeys: string[] | null): string[];
|
|
56
|
+
export interface DriftRowLike {
|
|
57
|
+
status: string;
|
|
58
|
+
role: string;
|
|
59
|
+
name: string;
|
|
60
|
+
selector: string;
|
|
61
|
+
rebound?: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface DriftFinding {
|
|
64
|
+
page: string;
|
|
65
|
+
role: string;
|
|
66
|
+
name: string;
|
|
67
|
+
status: 'lost' | 'ambiguous' | 'rebound';
|
|
68
|
+
/** The clicks that reached it in the baseline. Absent: visible on load. */
|
|
69
|
+
via?: string[];
|
|
70
|
+
}
|
|
71
|
+
export interface DriftClass {
|
|
72
|
+
/** Whether this drift fails the tour. */
|
|
73
|
+
gating: boolean;
|
|
74
|
+
onLoad: DriftFinding[];
|
|
75
|
+
behindInteraction: DriftFinding[];
|
|
76
|
+
/** Drift on pages this tour could not re-capture: it describes an older moment, so it never fails the tour. */
|
|
77
|
+
olderCapture: DriftFinding[];
|
|
78
|
+
/** Pages held at BLOCK by the suite (a renamed label it locates by name, a selector now reaching another element) with no blocking row of their own. */
|
|
79
|
+
suitePages: string[];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Which drift fails the tour. The statuses are the ones `ia-qa-heal diff` gave; this only decides
|
|
83
|
+
* what a person must act on today.
|
|
84
|
+
*
|
|
85
|
+
* An element visible on load that is lost, ambiguous or now reached by another selector is a fact
|
|
86
|
+
* about the page, and fails. One reached only by clicking — a profile opened from a ranking, a
|
|
87
|
+
* button present in one state of a game — may be there or not depending on the data the click
|
|
88
|
+
* lands on: measured on a live app, two tours five minutes apart disagreed about exactly those.
|
|
89
|
+
* They are reported, and fail only under `strict`. A page the suite holds at BLOCK always fails:
|
|
90
|
+
* that is a test about to act on the wrong thing.
|
|
91
|
+
*
|
|
92
|
+
* A page this tour could not re-capture keeps its previous contract, so its "drift" compares the
|
|
93
|
+
* baseline with an older moment — possibly a change already reported and fixed since. It is
|
|
94
|
+
* listed apart and never fails the tour, whatever its status: the page is in "Not seen" already.
|
|
95
|
+
*/
|
|
96
|
+
export declare function classifyDrift(reports: Array<{
|
|
97
|
+
name: string;
|
|
98
|
+
isLayout: boolean;
|
|
99
|
+
report: {
|
|
100
|
+
verdict: string;
|
|
101
|
+
rows: DriftRowLike[];
|
|
102
|
+
};
|
|
103
|
+
}>, viaOf: (page: string, row: DriftRowLike) => string[] | undefined, strict?: boolean, notRecaptured?: ReadonlySet<string>): DriftClass;
|
|
50
104
|
/**
|
|
51
105
|
* 0 nothing to decide · 1 something broke or needs a decision · 2 could not answer.
|
|
52
106
|
* The same contract as `ia-qa-heal`: a warning never fails a build, and "could not answer" is
|
|
@@ -54,7 +108,10 @@ export declare function splitFindings(report: CheckReport, known: ReadonlySet<st
|
|
|
54
108
|
*/
|
|
55
109
|
export declare function exitCodeFor(input: {
|
|
56
110
|
measured: number;
|
|
57
|
-
|
|
111
|
+
/** `gating` from `classifyDrift`; without it, a BLOCK verdict gates. */
|
|
112
|
+
drift?: (Pick<DirReport, 'verdict'> & {
|
|
113
|
+
gating?: boolean;
|
|
114
|
+
}) | null;
|
|
58
115
|
deadLinks: number;
|
|
59
116
|
/** The suite ran during this tour and exited non-zero. */
|
|
60
117
|
suiteFailed?: boolean;
|
package/dist/plan.js
CHANGED
|
@@ -5,6 +5,8 @@ exports.selectBatch = selectBatch;
|
|
|
5
5
|
exports.needingDepth = needingDepth;
|
|
6
6
|
exports.estimate = estimate;
|
|
7
7
|
exports.splitFindings = splitFindings;
|
|
8
|
+
exports.carryKnown = carryKnown;
|
|
9
|
+
exports.classifyDrift = classifyDrift;
|
|
8
10
|
exports.exitCodeFor = exitCodeFor;
|
|
9
11
|
/**
|
|
10
12
|
* The decisions a tour makes, kept free of I/O so each one is tested without a browser.
|
|
@@ -66,6 +68,59 @@ function splitFindings(report, known) {
|
|
|
66
68
|
keys: [...dead, ...warnings].map((x) => x.key),
|
|
67
69
|
};
|
|
68
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* The findings the next tour treats as already reported. A source that gave no answer this tour
|
|
73
|
+
* (null) keeps what it had reported before: "no answer" is not "nothing found", and dropping them
|
|
74
|
+
* would re-announce every known warning as new on the tour after.
|
|
75
|
+
*/
|
|
76
|
+
function carryKnown(previous, checkKeys, deadNameKeys) {
|
|
77
|
+
const isDeadName = (k) => k.startsWith('deadname ');
|
|
78
|
+
return [...(checkKeys ?? previous.filter((k) => !isDeadName(k))), ...(deadNameKeys ?? previous.filter(isDeadName))];
|
|
79
|
+
}
|
|
80
|
+
const blockingStatus = (row) => row.rebound ? 'rebound' : row.status === 'lost' || row.status === 'ambiguous' ? row.status : null;
|
|
81
|
+
/**
|
|
82
|
+
* Which drift fails the tour. The statuses are the ones `ia-qa-heal diff` gave; this only decides
|
|
83
|
+
* what a person must act on today.
|
|
84
|
+
*
|
|
85
|
+
* An element visible on load that is lost, ambiguous or now reached by another selector is a fact
|
|
86
|
+
* about the page, and fails. One reached only by clicking — a profile opened from a ranking, a
|
|
87
|
+
* button present in one state of a game — may be there or not depending on the data the click
|
|
88
|
+
* lands on: measured on a live app, two tours five minutes apart disagreed about exactly those.
|
|
89
|
+
* They are reported, and fail only under `strict`. A page the suite holds at BLOCK always fails:
|
|
90
|
+
* that is a test about to act on the wrong thing.
|
|
91
|
+
*
|
|
92
|
+
* A page this tour could not re-capture keeps its previous contract, so its "drift" compares the
|
|
93
|
+
* baseline with an older moment — possibly a change already reported and fixed since. It is
|
|
94
|
+
* listed apart and never fails the tour, whatever its status: the page is in "Not seen" already.
|
|
95
|
+
*/
|
|
96
|
+
function classifyDrift(reports, viaOf, strict = false, notRecaptured = new Set()) {
|
|
97
|
+
const onLoad = [];
|
|
98
|
+
const behindInteraction = [];
|
|
99
|
+
const olderCapture = [];
|
|
100
|
+
const suitePages = [];
|
|
101
|
+
for (const { name, isLayout, report } of reports) {
|
|
102
|
+
const stale = notRecaptured.has(name);
|
|
103
|
+
let blockingHere = 0;
|
|
104
|
+
for (const row of report.rows) {
|
|
105
|
+
const status = blockingStatus(row);
|
|
106
|
+
if (!status)
|
|
107
|
+
continue;
|
|
108
|
+
blockingHere++;
|
|
109
|
+
const via = isLayout ? undefined : viaOf(name, row);
|
|
110
|
+
const finding = { page: name, role: row.role, name: row.name, status, ...(via && via.length > 0 ? { via } : {}) };
|
|
111
|
+
(stale ? olderCapture : finding.via ? behindInteraction : onLoad).push(finding);
|
|
112
|
+
}
|
|
113
|
+
if (report.verdict === 'BLOCK' && blockingHere === 0 && !stale)
|
|
114
|
+
suitePages.push(name);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
gating: onLoad.length > 0 || suitePages.length > 0 || (strict && behindInteraction.length > 0),
|
|
118
|
+
onLoad,
|
|
119
|
+
behindInteraction,
|
|
120
|
+
olderCapture,
|
|
121
|
+
suitePages,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
69
124
|
/**
|
|
70
125
|
* 0 nothing to decide · 1 something broke or needs a decision · 2 could not answer.
|
|
71
126
|
* The same contract as `ia-qa-heal`: a warning never fails a build, and "could not answer" is
|
|
@@ -78,7 +133,8 @@ function exitCodeFor(input) {
|
|
|
78
133
|
return 1;
|
|
79
134
|
if (input.suiteFailed)
|
|
80
135
|
return 1;
|
|
81
|
-
|
|
136
|
+
const drift = input.drift;
|
|
137
|
+
if (drift && (drift.gating ?? drift.verdict === 'BLOCK'))
|
|
82
138
|
return 1;
|
|
83
139
|
return 0;
|
|
84
140
|
}
|
package/dist/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":";;;AAeA,kCAOC;AAED,oCAMC;AAqBD,4BAeC;AAmBD,sCAmBC;AAOD,
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
|
package/dist/report.js
CHANGED
|
@@ -33,8 +33,12 @@ function headline(r) {
|
|
|
33
33
|
if (!r.drift)
|
|
34
34
|
return '⏸ No page could be compared with the baseline this tour.';
|
|
35
35
|
const t = r.drift.totals;
|
|
36
|
+
const counts = `${t.ok} ok · ${t.renamed} renamed · ${t.lost} lost · ${t.ambiguous} ambiguous · ${t.rebound} rebound`;
|
|
37
|
+
if (r.drift.verdict === 'BLOCK' && !r.drift.gating) {
|
|
38
|
+
return `⚠️ Drift only behind interaction — not failing the tour (--strict would) · ${counts}`;
|
|
39
|
+
}
|
|
36
40
|
const word = r.drift.verdict === 'PASS' ? '✅ PASS' : r.drift.verdict === 'FIX' ? '🔧 FIX' : '⛔ BLOCK';
|
|
37
|
-
return `${word} · ${
|
|
41
|
+
return `${word} · ${counts}`;
|
|
38
42
|
}
|
|
39
43
|
function renderReport(r) {
|
|
40
44
|
const out = [];
|
|
@@ -64,10 +68,25 @@ function renderReport(r) {
|
|
|
64
68
|
if (broken.length > 0)
|
|
65
69
|
out.push('', `🔴 Broken`, ...broken);
|
|
66
70
|
const decide = [];
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
+
const d = r.drift;
|
|
72
|
+
if (d) {
|
|
73
|
+
const onLoad = d.onLoad.slice(0, 8);
|
|
74
|
+
for (const f of onLoad)
|
|
75
|
+
decide.push(` drift ${f.page}: ${f.role} "${f.name}" ${f.status}`);
|
|
76
|
+
if (d.onLoad.length > onLoad.length)
|
|
77
|
+
decide.push(` …and ${d.onLoad.length - onLoad.length} more on load`);
|
|
78
|
+
for (const page of d.suitePages)
|
|
79
|
+
decide.push(` drift ${page}: your tests would act on the wrong element — details: ia-qa-heal diff`);
|
|
80
|
+
if (d.behindInteraction.length > 0) {
|
|
81
|
+
decide.push(` behind ${plural(d.behindInteraction.length, 'element')} reached only by clicking changed — they may depend on the data the click lands on${d.gating ? '' : ' (not failing the tour)'}:`);
|
|
82
|
+
for (const f of d.behindInteraction.slice(0, 6))
|
|
83
|
+
decide.push(` ${f.page}: ${f.role} "${f.name}" ${f.status}, after ${f.via.map((v) => `"${v}"`).join(' → ')}`);
|
|
84
|
+
if (d.behindInteraction.length > 6)
|
|
85
|
+
decide.push(` …and ${d.behindInteraction.length - 6} more`);
|
|
86
|
+
}
|
|
87
|
+
const pages = [...new Set([...d.onLoad, ...d.behindInteraction].map((f) => f.page).concat(d.suitePages))];
|
|
88
|
+
if (pages.length > 0)
|
|
89
|
+
decide.push(` If these changes are intended: ia-qa-pal accept ${pages.slice(0, 4).join(' ')}${pages.length > 4 ? ' …' : ''}`);
|
|
71
90
|
}
|
|
72
91
|
const sf = r.drift?.suiteFindings;
|
|
73
92
|
if (sf && sf.names + sf.bindings > 0) {
|
|
@@ -102,6 +121,11 @@ function renderReport(r) {
|
|
|
102
121
|
const knownWarnings = (r.check?.knownWarnings ?? 0) + (s?.knownDeadNames ?? 0);
|
|
103
122
|
if (knownWarnings > 0)
|
|
104
123
|
out.push(` ${plural(knownWarnings, 'warning')} already reported — not listed again.`);
|
|
124
|
+
const masks = (d?.maskSuggestions ?? []).filter((m) => m.pattern);
|
|
125
|
+
if (masks.length > 0) {
|
|
126
|
+
const n = masks.reduce((sum, m) => sum + m.count, 0);
|
|
127
|
+
out.push('', `💡 ${n === 1 ? '1 label differs' : `${n} labels differ`} only by a number — a counter or a clock that changes on its own${masks.some((m) => m.blocking > 0) ? ', and it is holding the verdict' : ''}.`, ` e.g. "${masks[0].example.from}" → "${masks[0].example.to}". To stop comparing those labels (the element stays under contract), add to .ia-qa/config.json:`, ` "nameMask": ${JSON.stringify(masks.map((m) => m.pattern))}`);
|
|
128
|
+
}
|
|
105
129
|
const repairs = s?.repairs;
|
|
106
130
|
if (repairs && repairs.total > 0) {
|
|
107
131
|
out.push('', `🔧 Ready to repair (${plural(repairs.total, 'replacement')} in ${plural(repairs.files.length, 'file')})`);
|
|
@@ -127,10 +151,21 @@ function renderReport(r) {
|
|
|
127
151
|
(e ? ` — about ${duration(e.seconds)} (${e.clicks} controls × ${e.secondsPerClick} s, pace measured on ${e.measuredClicks} clicks)` : ''));
|
|
128
152
|
unseen.push(' ia-qa-pal tour --more explores the next batch');
|
|
129
153
|
}
|
|
130
|
-
|
|
154
|
+
const walled = p.notMapped.filter((m) => m.loginWall);
|
|
155
|
+
if (walled.length > 0) {
|
|
156
|
+
unseen.push(` ${plural(walled.length, 'page')} landed on a login page instead — the session expired or never took: ${walled.slice(0, 5).map((m) => m.page).join(', ')}${walled.length > 5 ? ', …' : ''}`, ` log in again (a person, at a browser): npx -p @ia-qa/self-healing ia-qa-heal login — then run the tour again`);
|
|
157
|
+
}
|
|
158
|
+
const otherFailures = p.notMapped.filter((m) => !m.loginWall);
|
|
159
|
+
for (const m of otherFailures.slice(0, 10))
|
|
131
160
|
unseen.push(` not mapped ${m.page} — ${m.reason}`);
|
|
132
|
-
if (
|
|
133
|
-
unseen.push(` …and ${
|
|
161
|
+
if (otherFailures.length > 10)
|
|
162
|
+
unseen.push(` …and ${otherFailures.length - 10} more pages not mapped`);
|
|
163
|
+
for (const u of p.unreadable ?? [])
|
|
164
|
+
unseen.push(` not compared ${u.page} — its contract file cannot be read: ${u.reason.replace(/^❌\s*/, '')}`);
|
|
165
|
+
if (d && d.olderCapture.length > 0) {
|
|
166
|
+
const pages = [...new Set(d.olderCapture.map((f) => f.page))];
|
|
167
|
+
unseen.push(` drift on ${plural(pages.length, 'page')} not re-captured this tour is from an older capture and not counted: ${pages.join(', ')}`);
|
|
168
|
+
}
|
|
134
169
|
if (p.partlyExplored.length > 0)
|
|
135
170
|
unseen.push(` partly explored (click budget reached): ${p.partlyExplored.join(', ')}`);
|
|
136
171
|
if (p.notInBaseline.length > 0)
|
package/dist/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts
CHANGED
package/dist/run.js
CHANGED
|
@@ -43,6 +43,7 @@ const fs = __importStar(require("fs"));
|
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
44
|
const child_process_1 = require("child_process");
|
|
45
45
|
const tour_1 = require("./tour");
|
|
46
|
+
const history_1 = require("./history");
|
|
46
47
|
const runDir = (dir) => path.join(dir, '.ia-qa', 'pal');
|
|
47
48
|
exports.runDir = runDir;
|
|
48
49
|
const runFile = (dir) => path.join((0, exports.runDir)(dir), 'run.json');
|
|
@@ -58,20 +59,66 @@ function isAlive(pid) {
|
|
|
58
59
|
return err.code === 'EPERM';
|
|
59
60
|
}
|
|
60
61
|
}
|
|
62
|
+
const pause = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
63
|
+
/**
|
|
64
|
+
* Atomic when it can be. On Windows a rename over a file another process is reading fails with
|
|
65
|
+
* EPERM/EBUSY — and something is always reading this one: `status`, or an agent polling
|
|
66
|
+
* `pal_status`. Measured: that failure, thrown from a progress write, killed the tour it was
|
|
67
|
+
* reporting on. So the rename is retried, and a direct write is the last resort.
|
|
68
|
+
*/
|
|
61
69
|
function write(dir, record) {
|
|
62
70
|
fs.mkdirSync((0, exports.runDir)(dir), { recursive: true });
|
|
71
|
+
const body = JSON.stringify(record, null, 2);
|
|
63
72
|
const tmp = `${(0, exports.runFile)(dir)}.${process.pid}.tmp`;
|
|
64
|
-
fs.writeFileSync(tmp,
|
|
65
|
-
|
|
73
|
+
fs.writeFileSync(tmp, body);
|
|
74
|
+
for (let attempt = 0; attempt < 20; attempt++) {
|
|
75
|
+
try {
|
|
76
|
+
fs.renameSync(tmp, (0, exports.runFile)(dir));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
const code = err.code;
|
|
81
|
+
if (code !== 'EPERM' && code !== 'EBUSY' && code !== 'EACCES')
|
|
82
|
+
throw err;
|
|
83
|
+
pause(25);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
fs.writeFileSync((0, exports.runFile)(dir), body);
|
|
87
|
+
fs.rmSync(tmp, { force: true });
|
|
66
88
|
}
|
|
67
|
-
|
|
68
|
-
|
|
89
|
+
/** Progress is a courtesy to whoever is watching; it must never cost the tour. */
|
|
90
|
+
function tryWrite(dir, record) {
|
|
69
91
|
try {
|
|
70
|
-
|
|
92
|
+
write(dir, record);
|
|
71
93
|
}
|
|
72
94
|
catch {
|
|
95
|
+
/* the next event, or the final record, writes it */
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** A report written by an earlier pal lacks the lists added since; empty is what those versions measured. */
|
|
99
|
+
function withLaterFields(report) {
|
|
100
|
+
return {
|
|
101
|
+
...report,
|
|
102
|
+
pages: { ...report.pages, unreadable: report.pages.unreadable ?? [] },
|
|
103
|
+
drift: report.drift ? { ...report.drift, olderCapture: report.drift.olderCapture ?? [], suitePages: report.drift.suitePages ?? [], maskSuggestions: report.drift.maskSuggestions ?? [] } : report.drift,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function readRun(dir) {
|
|
107
|
+
if (!fs.existsSync((0, exports.runFile)(dir)))
|
|
73
108
|
return null;
|
|
109
|
+
let record = null;
|
|
110
|
+
for (let attempt = 0; attempt < 10 && !record; attempt++) {
|
|
111
|
+
try {
|
|
112
|
+
record = JSON.parse(fs.readFileSync((0, exports.runFile)(dir), 'utf8'));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
pause(20);
|
|
116
|
+
}
|
|
74
117
|
}
|
|
118
|
+
if (!record)
|
|
119
|
+
return null;
|
|
120
|
+
if (record.report)
|
|
121
|
+
record.report = withLaterFields(record.report);
|
|
75
122
|
if (record.status === 'running' && !isAlive(record.pid)) {
|
|
76
123
|
return { ...record, status: 'interrupted', interrupted: true };
|
|
77
124
|
}
|
|
@@ -117,11 +164,13 @@ async function trackedTour(opts) {
|
|
|
117
164
|
record.progress = event;
|
|
118
165
|
record.updatedAt = now();
|
|
119
166
|
if (fs.existsSync((0, exports.runDir)(dir)))
|
|
120
|
-
|
|
167
|
+
tryWrite(dir, record);
|
|
121
168
|
},
|
|
122
169
|
});
|
|
123
170
|
if (fs.existsSync((0, exports.runDir)(dir))) {
|
|
124
171
|
write(dir, { ...record, status: 'done', finishedAt: now(), updatedAt: now(), exitCode: report.exitCode, report });
|
|
172
|
+
if (!report.refused)
|
|
173
|
+
(0, history_1.appendHistory)(dir, report);
|
|
125
174
|
}
|
|
126
175
|
return report;
|
|
127
176
|
}
|
|
@@ -149,6 +198,8 @@ function startBackground(dir, opts, entry = path.join(__dirname, 'cli', 'index.j
|
|
|
149
198
|
args.push('--more');
|
|
150
199
|
if (opts.suite)
|
|
151
200
|
args.push('--suite');
|
|
201
|
+
if (opts.strict)
|
|
202
|
+
args.push('--strict');
|
|
152
203
|
if (opts.batch)
|
|
153
204
|
args.push('--batch', String(opts.batch));
|
|
154
205
|
if (opts.session)
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
package/dist/tour.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DirReport } from '@ia-qa/self-healing';
|
|
2
|
-
import type { Estimate, CheckSplit } from './plan';
|
|
2
|
+
import type { Estimate, CheckSplit, DriftFinding } from './plan';
|
|
3
3
|
import { CAPTURE_IMPORT } from './suite';
|
|
4
4
|
import type { SuiteInventory, RepairPlan, SuiteRun } from './suite';
|
|
5
5
|
export interface TourOptions {
|
|
@@ -11,6 +11,8 @@ export interface TourOptions {
|
|
|
11
11
|
more?: boolean;
|
|
12
12
|
/** Run the test suite from config.json with the capture hook, to learn which pages it visits. */
|
|
13
13
|
suite?: boolean;
|
|
14
|
+
/** Also fail on drift behind interaction (elements reached only by clicking). */
|
|
15
|
+
strict?: boolean;
|
|
14
16
|
session?: string;
|
|
15
17
|
/** Where progress goes. Never stdout: stdout is the report. */
|
|
16
18
|
onProgress?: (line: string) => void;
|
|
@@ -38,12 +40,19 @@ export interface TourResult {
|
|
|
38
40
|
/** Pages explored in depth by this tour. */
|
|
39
41
|
exploredThisTour: string[];
|
|
40
42
|
partlyExplored: string[];
|
|
43
|
+
/** `loginWall`: the page landed on a login form — the session expired or never took. */
|
|
41
44
|
notMapped: Array<{
|
|
42
45
|
page: string;
|
|
43
46
|
url: string;
|
|
44
47
|
reason: string;
|
|
48
|
+
loginWall?: boolean;
|
|
45
49
|
}>;
|
|
46
50
|
notInBaseline: string[];
|
|
51
|
+
/** Contract files that could not be read: those pages were not compared. */
|
|
52
|
+
unreadable: Array<{
|
|
53
|
+
page: string;
|
|
54
|
+
reason: string;
|
|
55
|
+
}>;
|
|
47
56
|
};
|
|
48
57
|
drift: null | {
|
|
49
58
|
verdict: DirReport['verdict'];
|
|
@@ -61,6 +70,23 @@ export interface TourResult {
|
|
|
61
70
|
names: number;
|
|
62
71
|
bindings: number;
|
|
63
72
|
};
|
|
73
|
+
/** Whether this drift fails the tour — see `classifyDrift`. */
|
|
74
|
+
gating: boolean;
|
|
75
|
+
onLoad: DriftFinding[];
|
|
76
|
+
behindInteraction: DriftFinding[];
|
|
77
|
+
/** Drift on pages this tour could not re-capture — an older moment, never failing the tour. */
|
|
78
|
+
olderCapture: DriftFinding[];
|
|
79
|
+
suitePages: string[];
|
|
80
|
+
/** Labels that differ only by a number, with the nameMask that stops comparing them. */
|
|
81
|
+
maskSuggestions: Array<{
|
|
82
|
+
pattern: string | null;
|
|
83
|
+
count: number;
|
|
84
|
+
blocking: number;
|
|
85
|
+
example: {
|
|
86
|
+
from: string;
|
|
87
|
+
to: string;
|
|
88
|
+
};
|
|
89
|
+
}>;
|
|
64
90
|
};
|
|
65
91
|
check: null | Omit<CheckSplit, 'keys'>;
|
|
66
92
|
suite: null | {
|
package/dist/tour.js
CHANGED
|
@@ -109,7 +109,7 @@ function notSetUp(started) {
|
|
|
109
109
|
mode: 'first',
|
|
110
110
|
baseUrl: '',
|
|
111
111
|
level: 0,
|
|
112
|
-
pages: { configured: 0, underContract: 0, explored: 0, notExplored: [], exploredThisTour: [], partlyExplored: [], notMapped: [], notInBaseline: [] },
|
|
112
|
+
pages: { configured: 0, underContract: 0, explored: 0, notExplored: [], exploredThisTour: [], partlyExplored: [], notMapped: [], notInBaseline: [], unreadable: [] },
|
|
113
113
|
drift: null,
|
|
114
114
|
check: null,
|
|
115
115
|
suite: null,
|
|
@@ -149,7 +149,7 @@ async function runTour(opts = {}) {
|
|
|
149
149
|
mode,
|
|
150
150
|
baseUrl: config.baseUrl,
|
|
151
151
|
level: hasSuite ? 2 : hasLogin(config, session, dir) ? 1 : 0,
|
|
152
|
-
pages: { configured: names.length, underContract: 0, explored: 0, notExplored: [], exploredThisTour: [], partlyExplored: [], notMapped: [], notInBaseline: [] },
|
|
152
|
+
pages: { configured: names.length, underContract: 0, explored: 0, notExplored: [], exploredThisTour: [], partlyExplored: [], notMapped: [], notInBaseline: [], unreadable: [] },
|
|
153
153
|
drift: null,
|
|
154
154
|
check: null,
|
|
155
155
|
suite: null,
|
|
@@ -215,8 +215,24 @@ async function runTour(opts = {}) {
|
|
|
215
215
|
measured += run.mapped;
|
|
216
216
|
}
|
|
217
217
|
recordPages(state, runs);
|
|
218
|
-
const { aggregate, reports } = (0, self_healing_1.dirDiffAggregate)((0, self_healing_1.baselineDir)(), (0, self_healing_1.mappingDir)());
|
|
218
|
+
const { aggregate, reports, unreadable } = (0, self_healing_1.dirDiffAggregate)((0, self_healing_1.baselineDir)(), (0, self_healing_1.mappingDir)());
|
|
219
|
+
result.pages.unreadable = unreadable.map((u) => ({ page: u.page, reason: u.reason }));
|
|
220
|
+
const notRecaptured = new Set(runs.flatMap((r) => r.failed).map((f) => f.page));
|
|
219
221
|
if (reports.length > 0) {
|
|
222
|
+
const baselines = new Map();
|
|
223
|
+
const viaOf = (page, row) => {
|
|
224
|
+
if (!baselines.has(page)) {
|
|
225
|
+
try {
|
|
226
|
+
baselines.set(page, (0, self_healing_1.loadMapping)(page, (0, self_healing_1.baselineDir)()));
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
baselines.set(page, null);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return baselines.get(page)?.elements.find((e) => e.selector === row.selector && e.role === row.role && e.name === row.name)?.via;
|
|
233
|
+
};
|
|
234
|
+
const drift = (0, plan_1.classifyDrift)(reports, viaOf, !!opts.strict, notRecaptured);
|
|
235
|
+
const rows = reports.filter((r) => !r.isLayout).flatMap((r) => r.report.rows);
|
|
220
236
|
result.drift = {
|
|
221
237
|
verdict: aggregate.verdict,
|
|
222
238
|
totals: aggregate.totals,
|
|
@@ -226,8 +242,19 @@ async function runTour(opts = {}) {
|
|
|
226
242
|
staleExcluded: aggregate.staleExcluded ?? [],
|
|
227
243
|
...(aggregate.depthMismatch ? { depthMismatch: aggregate.depthMismatch.why } : {}),
|
|
228
244
|
...(suiteInventory ? { suiteFindings: { names: aggregate.nameDrift?.length ?? 0, bindings: aggregate.bindingDrift?.length ?? 0 } } : {}),
|
|
245
|
+
gating: drift.gating,
|
|
246
|
+
onLoad: drift.onLoad,
|
|
247
|
+
behindInteraction: drift.behindInteraction,
|
|
248
|
+
olderCapture: drift.olderCapture,
|
|
249
|
+
suitePages: drift.suitePages,
|
|
250
|
+
maskSuggestions: (0, self_healing_1.groupNumericLabelDrift)(rows).map((g) => ({
|
|
251
|
+
pattern: g.pattern,
|
|
252
|
+
count: g.count,
|
|
253
|
+
blocking: g.blocking,
|
|
254
|
+
example: { from: g.examples[0]?.from ?? '', to: g.examples[0]?.to ?? '' },
|
|
255
|
+
})),
|
|
229
256
|
};
|
|
230
|
-
state.lastVerdict = aggregate.verdict;
|
|
257
|
+
state.lastVerdict = drift.gating ? 'BLOCK' : aggregate.verdict === 'BLOCK' ? 'FIX' : aggregate.verdict;
|
|
231
258
|
}
|
|
232
259
|
}
|
|
233
260
|
else {
|
|
@@ -246,14 +273,15 @@ async function runTour(opts = {}) {
|
|
|
246
273
|
}
|
|
247
274
|
}
|
|
248
275
|
const known = new Set(state.knownFindings);
|
|
249
|
-
|
|
276
|
+
let checkKeys = null;
|
|
277
|
+
let deadNameKeys = null;
|
|
250
278
|
if (mode !== 'explore') {
|
|
251
279
|
emit({ phase: 'check' });
|
|
252
280
|
const outcome = await toStderr(() => (0, self_healing_1.checkProject)({ onNotice: progress }));
|
|
253
281
|
if (outcome.ok) {
|
|
254
282
|
const { keys, ...split } = (0, plan_1.splitFindings)(outcome.report, known);
|
|
255
283
|
result.check = split;
|
|
256
|
-
|
|
284
|
+
checkKeys = keys;
|
|
257
285
|
}
|
|
258
286
|
}
|
|
259
287
|
if (suiteInventory) {
|
|
@@ -281,7 +309,8 @@ async function runTour(opts = {}) {
|
|
|
281
309
|
const audit = await toStderr(() => (0, suite_1.auditSuite)(dir, config));
|
|
282
310
|
const dead = audit?.deadNames ?? [];
|
|
283
311
|
const key = (name) => `deadname ${name.trim().toLowerCase()}`;
|
|
284
|
-
|
|
312
|
+
if (audit)
|
|
313
|
+
deadNameKeys = dead.map((d) => key(d.name));
|
|
285
314
|
result.suite = {
|
|
286
315
|
inventory: suiteInventory,
|
|
287
316
|
repairs,
|
|
@@ -293,7 +322,7 @@ async function runTour(opts = {}) {
|
|
|
293
322
|
};
|
|
294
323
|
}
|
|
295
324
|
if (mode !== 'explore')
|
|
296
|
-
state.knownFindings =
|
|
325
|
+
state.knownFindings = (0, plan_1.carryKnown)(state.knownFindings, checkKeys, deadNameKeys);
|
|
297
326
|
const after = baselineDepths(names);
|
|
298
327
|
const exploredNow = new Set([...after.entries()].filter(([, d]) => d > 0).map(([n]) => n));
|
|
299
328
|
result.pages.underContract = after.size;
|
|
@@ -302,7 +331,7 @@ async function runTour(opts = {}) {
|
|
|
302
331
|
result.pages.notExplored = (0, plan_1.needingDepth)(names.filter((n) => after.has(n)), exploredNow, state.openables);
|
|
303
332
|
result.pages.exploredThisTour = names.filter((n) => exploredNow.has(n) && !((before.get(n) ?? 0) > 0));
|
|
304
333
|
result.pages.partlyExplored = runs.flatMap((r) => r.pages).filter((p) => p.truncated).map((p) => p.page);
|
|
305
|
-
result.pages.notMapped = runs.flatMap((r) => r.failed).map((f) => ({ page: f.page, url: f.url, reason: f.error }));
|
|
334
|
+
result.pages.notMapped = runs.flatMap((r) => r.failed).map((f) => ({ page: f.page, url: f.url, reason: f.error, ...(f.kind === 'login-wall' ? { loginWall: true } : {}) }));
|
|
306
335
|
result.estimate = (0, plan_1.estimate)(result.pages.notExplored, state.openables, state.pace);
|
|
307
336
|
result.exitCode = (0, plan_1.exitCodeFor)({
|
|
308
337
|
measured,
|