@ia-qa/self-healing 1.7.2 → 1.7.4
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 +256 -819
- package/SPEC-selector-resolution.md +310 -0
- package/dist/cli/fix.js +28 -1
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli/map.js +39 -0
- package/dist/cli/map.js.map +1 -1
- package/dist/resolution.d.ts +30 -0
- package/dist/resolution.js +69 -0
- package/dist/resolution.js.map +1 -1
- package/package.json +3 -2
- package/skills/ia-qa-heal/SKILL.md +7 -0
package/dist/resolution.d.ts
CHANGED
|
@@ -79,6 +79,36 @@ export declare function loadResolution(page: string, dir?: string): PageResoluti
|
|
|
79
79
|
* moments: an anchor is a selector, and the next run simply resolves it like the rest.
|
|
80
80
|
*/
|
|
81
81
|
export declare function anchorsIn(resolution: PageResolution | null): string[];
|
|
82
|
+
export interface BindingTotals {
|
|
83
|
+
/** Reaches a contracted element, or an identity anchor: a repair path exists. */
|
|
84
|
+
repairable: number;
|
|
85
|
+
/** Reaches something real that carries no stable identity. Works; not repairable. */
|
|
86
|
+
working: number;
|
|
87
|
+
/** Matches several elements somewhere, and nothing conclusive anywhere. */
|
|
88
|
+
ambiguous: number;
|
|
89
|
+
/** Never seen on any page that was mapped. NOT the same as absent. */
|
|
90
|
+
unseen: number;
|
|
91
|
+
/** Everything the inventory holds. */
|
|
92
|
+
inventoried: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The one number two field evaluations tried to compute by hand and got wrong.
|
|
96
|
+
*
|
|
97
|
+
* Both derived it from `audit`'s "N of M not judged" line, which counts something else
|
|
98
|
+
* entirely (locators that do not state a role) — and concluded the tool reached 4% of
|
|
99
|
+
* their suite. The per-page line `map` prints cannot be added up either: the same string
|
|
100
|
+
* appears on several pages. So the total has to be computed here, over the union.
|
|
101
|
+
*
|
|
102
|
+
* Aggregated per *selector*, not per page: the question is "does a repair path exist for
|
|
103
|
+
* this string anywhere?", so binding on one page and being absent on five is repairable.
|
|
104
|
+
* That is deliberately **not** `mergeBinding`, which answers a different question (is this
|
|
105
|
+
* binding safe to rewrite from, within one moment) and would call the same string
|
|
106
|
+
* ambiguous across two pages. Two questions, two functions — the same distinction that
|
|
107
|
+
* keeps `mergeBinding` apart from `unionElements`.
|
|
108
|
+
*/
|
|
109
|
+
export declare function bindingTotals(resolutions: PageResolution[], inventoried: number): BindingTotals;
|
|
110
|
+
/** Every page resolution on disk, for the totals above. */
|
|
111
|
+
export declare function loadAllResolutions(dir?: string): PageResolution[];
|
|
82
112
|
/** How many selectors were observed, and how many actually bound. Never a coverage claim. */
|
|
83
113
|
export declare function countBindings(resolution: PageResolution | null): {
|
|
84
114
|
bound: number;
|
package/dist/resolution.js
CHANGED
|
@@ -39,6 +39,8 @@ exports.resolutionPath = resolutionPath;
|
|
|
39
39
|
exports.saveResolution = saveResolution;
|
|
40
40
|
exports.loadResolution = loadResolution;
|
|
41
41
|
exports.anchorsIn = anchorsIn;
|
|
42
|
+
exports.bindingTotals = bindingTotals;
|
|
43
|
+
exports.loadAllResolutions = loadAllResolutions;
|
|
42
44
|
exports.countBindings = countBindings;
|
|
43
45
|
exports.diffBindings = diffBindings;
|
|
44
46
|
const fs = __importStar(require("fs"));
|
|
@@ -151,6 +153,73 @@ function anchorsIn(resolution) {
|
|
|
151
153
|
.filter((b) => b.status === 'anchored' && b.selector)
|
|
152
154
|
.map((b) => b.selector);
|
|
153
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* The one number two field evaluations tried to compute by hand and got wrong.
|
|
158
|
+
*
|
|
159
|
+
* Both derived it from `audit`'s "N of M not judged" line, which counts something else
|
|
160
|
+
* entirely (locators that do not state a role) — and concluded the tool reached 4% of
|
|
161
|
+
* their suite. The per-page line `map` prints cannot be added up either: the same string
|
|
162
|
+
* appears on several pages. So the total has to be computed here, over the union.
|
|
163
|
+
*
|
|
164
|
+
* Aggregated per *selector*, not per page: the question is "does a repair path exist for
|
|
165
|
+
* this string anywhere?", so binding on one page and being absent on five is repairable.
|
|
166
|
+
* That is deliberately **not** `mergeBinding`, which answers a different question (is this
|
|
167
|
+
* binding safe to rewrite from, within one moment) and would call the same string
|
|
168
|
+
* ambiguous across two pages. Two questions, two functions — the same distinction that
|
|
169
|
+
* keeps `mergeBinding` apart from `unionElements`.
|
|
170
|
+
*/
|
|
171
|
+
function bindingTotals(resolutions, inventoried) {
|
|
172
|
+
const best = new Map();
|
|
173
|
+
for (const resolution of resolutions) {
|
|
174
|
+
for (const [selector, binding] of Object.entries(resolution.bindings)) {
|
|
175
|
+
if (binding.status === 'unresolved' || binding.status === 'invalid')
|
|
176
|
+
continue;
|
|
177
|
+
const rank = binding.status === 'bound' || binding.status === 'anchored'
|
|
178
|
+
? 'repairable'
|
|
179
|
+
: binding.status === 'outside'
|
|
180
|
+
? 'working'
|
|
181
|
+
: 'ambiguous';
|
|
182
|
+
const current = best.get(selector);
|
|
183
|
+
if (current === 'repairable')
|
|
184
|
+
continue;
|
|
185
|
+
if (current === 'working' && rank !== 'repairable')
|
|
186
|
+
continue;
|
|
187
|
+
best.set(selector, rank);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
let repairable = 0;
|
|
191
|
+
let working = 0;
|
|
192
|
+
let ambiguous = 0;
|
|
193
|
+
for (const rank of best.values()) {
|
|
194
|
+
if (rank === 'repairable')
|
|
195
|
+
repairable++;
|
|
196
|
+
else if (rank === 'working')
|
|
197
|
+
working++;
|
|
198
|
+
else
|
|
199
|
+
ambiguous++;
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
repairable,
|
|
203
|
+
working,
|
|
204
|
+
ambiguous,
|
|
205
|
+
unseen: Math.max(0, inventoried - best.size),
|
|
206
|
+
inventoried,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/** Every page resolution on disk, for the totals above. */
|
|
210
|
+
function loadAllResolutions(dir = (0, config_1.resolvedDir)()) {
|
|
211
|
+
if (!fs.existsSync(dir))
|
|
212
|
+
return [];
|
|
213
|
+
const out = [];
|
|
214
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
215
|
+
if (!entry.endsWith('.json'))
|
|
216
|
+
continue;
|
|
217
|
+
const loaded = loadResolution(entry.replace(/.json$/, ''), dir);
|
|
218
|
+
if (loaded)
|
|
219
|
+
out.push(loaded);
|
|
220
|
+
}
|
|
221
|
+
return out;
|
|
222
|
+
}
|
|
154
223
|
/** How many selectors were observed, and how many actually bound. Never a coverage claim. */
|
|
155
224
|
function countBindings(resolution) {
|
|
156
225
|
if (!resolution)
|
package/dist/resolution.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolution.js","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,oCA0BC;AAGD,4CAeC;AAED,wCAGC;AAgBD,wCAKC;AAED,wCAUC;AAQD,8BAKC;AAGD,sCAOC;AA0ED,oCAoDC;
|
|
1
|
+
{"version":3,"file":"resolution.js","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ia-qa/self-healing",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.4",
|
|
4
4
|
"description": "Local-first self-healing for UI tests: a local MCP server + CLI that map your app's pages to a role/name/selector contract, diff selector drift (PASS/FIX/BLOCK), and apply deterministic fixes to Cypress/Playwright/Selenium tests. Runs on your machine — your app, your tests and your results never leave it.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"self-healing",
|
|
@@ -56,7 +56,8 @@
|
|
|
56
56
|
"assets",
|
|
57
57
|
"README.md",
|
|
58
58
|
"TUTORIAL.md",
|
|
59
|
-
"ROADMAP.md"
|
|
59
|
+
"ROADMAP.md",
|
|
60
|
+
"SPEC-selector-resolution.md"
|
|
60
61
|
],
|
|
61
62
|
"scripts": {
|
|
62
63
|
"build": "tsc -p tsconfig.json",
|
|
@@ -151,6 +151,13 @@ clicking the wrong thing), or a name-drift finding that is not attributable.
|
|
|
151
151
|
contract does not hold (a row, a cell, a container) is **not** a finding — it is most
|
|
152
152
|
of a real Page Object, and it is proof the selector works.
|
|
153
153
|
|
|
154
|
+
14. **Never read `audit`'s "N of M not judged" as coverage of the repair loop.** It counts
|
|
155
|
+
locators that do not state a role — a property of *how the suite is written*, not of what
|
|
156
|
+
this tool can reach. Two field evaluations made exactly this inference and reported ~4%
|
|
157
|
+
coverage from it. The real number is the four-class total `map` prints at the end
|
|
158
|
+
(`repairable` / `working` / `ambiguous` / `not seen`), and it is only meaningful next to
|
|
159
|
+
the page coverage: `not seen` over 6 mapped pages out of 163 says nothing about the suite.
|
|
160
|
+
|
|
154
161
|
## 5. What leaves the machine
|
|
155
162
|
|
|
156
163
|
Nothing, except: requests to the user's **own** `baseUrl` (`check`'s link half, `discover --crawl`
|