common-qa-mcp 0.11.0 → 0.13.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/dist/adapters/remoteMcp/adapter.js +1 -1
- package/dist/adapters/simplifyqa/adapter.d.ts +42 -1
- package/dist/adapters/simplifyqa/adapter.d.ts.map +1 -1
- package/dist/adapters/simplifyqa/adapter.js +201 -18
- package/dist/adapters/simplifyqa/adapter.js.map +1 -1
- package/dist/adapters/simplifyqa/executionFailures.d.ts +59 -0
- package/dist/adapters/simplifyqa/executionFailures.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/executionFailures.js +638 -0
- package/dist/adapters/simplifyqa/executionFailures.js.map +1 -0
- package/dist/adapters/simplifyqa/failureCategory.d.ts +26 -0
- package/dist/adapters/simplifyqa/failureCategory.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/failureCategory.js +208 -0
- package/dist/adapters/simplifyqa/failureCategory.js.map +1 -0
- package/dist/adapters/simplifyqa/failureReport.d.ts +50 -0
- package/dist/adapters/simplifyqa/failureReport.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/failureReport.js +353 -0
- package/dist/adapters/simplifyqa/failureReport.js.map +1 -0
- package/dist/adapters/simplifyqa/failureTypes.d.ts +193 -0
- package/dist/adapters/simplifyqa/failureTypes.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/failureTypes.js +8 -0
- package/dist/adapters/simplifyqa/failureTypes.js.map +1 -0
- package/dist/adapters/simplifyqa/flow.d.ts +55 -0
- package/dist/adapters/simplifyqa/flow.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/flow.js +325 -0
- package/dist/adapters/simplifyqa/flow.js.map +1 -0
- package/dist/adapters/simplifyqa/mapLimit.d.ts +3 -0
- package/dist/adapters/simplifyqa/mapLimit.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/mapLimit.js +14 -0
- package/dist/adapters/simplifyqa/mapLimit.js.map +1 -0
- package/dist/adapters/simplifyqa/mapper.d.ts +3 -0
- package/dist/adapters/simplifyqa/mapper.d.ts.map +1 -1
- package/dist/adapters/simplifyqa/mapper.js +6 -7
- package/dist/adapters/simplifyqa/mapper.js.map +1 -1
- package/dist/adapters/simplifyqa/planTree.d.ts +31 -0
- package/dist/adapters/simplifyqa/planTree.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/planTree.js +110 -0
- package/dist/adapters/simplifyqa/planTree.js.map +1 -0
- package/dist/adapters/simplifyqa/searchEngine.d.ts +237 -0
- package/dist/adapters/simplifyqa/searchEngine.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/searchEngine.js +1206 -0
- package/dist/adapters/simplifyqa/searchEngine.js.map +1 -0
- package/dist/adapters/simplifyqa/searchRegistry.d.ts +112 -0
- package/dist/adapters/simplifyqa/searchRegistry.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/searchRegistry.js +1413 -0
- package/dist/adapters/simplifyqa/searchRegistry.js.map +1 -0
- package/dist/adapters/simplifyqa/searchResolve.d.ts +84 -0
- package/dist/adapters/simplifyqa/searchResolve.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/searchResolve.js +319 -0
- package/dist/adapters/simplifyqa/searchResolve.js.map +1 -0
- package/dist/adapters/simplifyqa/stepRules.d.ts +91 -0
- package/dist/adapters/simplifyqa/stepRules.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/stepRules.js +228 -0
- package/dist/adapters/simplifyqa/stepRules.js.map +1 -0
- package/dist/adapters/types.d.ts +14 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/domain/types.d.ts +14 -2
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/initAgents.d.ts.map +1 -1
- package/dist/initAgents.js +32 -9
- package/dist/initAgents.js.map +1 -1
- package/dist/mcpResult.d.ts +19 -0
- package/dist/mcpResult.d.ts.map +1 -1
- package/dist/mcpResult.js +11 -0
- package/dist/mcpResult.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +70 -16
- package/dist/server.js.map +1 -1
- package/dist/tools/discovery.tools.d.ts.map +1 -1
- package/dist/tools/discovery.tools.js +36 -10
- package/dist/tools/discovery.tools.js.map +1 -1
- package/dist/tools/failure.tools.d.ts +14 -0
- package/dist/tools/failure.tools.d.ts.map +1 -0
- package/dist/tools/failure.tools.js +65 -0
- package/dist/tools/failure.tools.js.map +1 -0
- package/dist/tools/query.tools.d.ts +20 -0
- package/dist/tools/query.tools.d.ts.map +1 -0
- package/dist/tools/query.tools.js +310 -0
- package/dist/tools/query.tools.js.map +1 -0
- package/dist/tools/testcase.tools.d.ts.map +1 -1
- package/dist/tools/testcase.tools.js +87 -10
- package/dist/tools/testcase.tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The steps leading to a failure, small enough for a model to read — so it can reason like a
|
|
3
|
+
* tester over the whole test case flow, not just the failed step. Ported from ai-assistant
|
|
4
|
+
* `src/tools/_lib/flow.py` (with smaller limits: the MCP shows one FLOW per cause inside one
|
|
5
|
+
* tool result, where the in-app analysis sends one FLOW per model call).
|
|
6
|
+
*
|
|
7
|
+
* One line per step: report number, status, description, the test data it used, engine flags —
|
|
8
|
+
* indented under its function. Control flow is shown as what it is (`[IF → false] … — steps
|
|
9
|
+
* 12–18 skipped`, `[LOOP → 3 iterations]`, `[SWITCH] switch to API`), never as a failure. Steps
|
|
10
|
+
* left out become one `… steps a–b not shown: n steps, all passed …` line, so nothing disappears
|
|
11
|
+
* silently. Pure: raw step-result rows in, lines out.
|
|
12
|
+
*/
|
|
13
|
+
/** A run with this many real steps or fewer is shown whole. */
|
|
14
|
+
export declare const SHOW_ALL = 60;
|
|
15
|
+
/** Real steps kept before / after the main failure in a longer run. */
|
|
16
|
+
export declare const WINDOW_BEFORE = 25;
|
|
17
|
+
export declare const WINDOW_AFTER = 5;
|
|
18
|
+
/** Step lines per FLOW (the "… not shown …" lines are not counted). */
|
|
19
|
+
export declare const MAX_FLOW_LINES = 90;
|
|
20
|
+
/** Warnings from passed steps. */
|
|
21
|
+
export declare const MAX_WARNINGS = 15;
|
|
22
|
+
/** Written steps listed as [not run]. */
|
|
23
|
+
export declare const MAX_NOT_RUN = 8;
|
|
24
|
+
/** HTML descriptions → plain text. */
|
|
25
|
+
export declare const plain: (v: unknown) => string;
|
|
26
|
+
export type FlowOptions = {
|
|
27
|
+
automated: boolean;
|
|
28
|
+
focusId?: unknown;
|
|
29
|
+
};
|
|
30
|
+
/** `name=value; …` — protected values masked, long ones cut. */
|
|
31
|
+
export declare function stepData(r: any): string;
|
|
32
|
+
export type Flow = {
|
|
33
|
+
/** The FLOW lines. */
|
|
34
|
+
lines: string[];
|
|
35
|
+
/** "from step N on, f of t steps failed" — the run broke down at N. */
|
|
36
|
+
breakdown?: string;
|
|
37
|
+
/** ERROR/WARN lines logged by steps that PASSED — clues, not proof. */
|
|
38
|
+
warnings: string[];
|
|
39
|
+
/** The furthest written step the run reached (`seq`), for the [not run] list. */
|
|
40
|
+
furthestStepIds: Set<string>;
|
|
41
|
+
};
|
|
42
|
+
/** The FLOW of one run (rows in report order). */
|
|
43
|
+
export declare function buildFlow(rows: any[], opts: FlowOptions): Flow;
|
|
44
|
+
/**
|
|
45
|
+
* The written steps the run never reached — what the test was going to do next. `written` is the
|
|
46
|
+
* test case's own steps (in `seq` order); the run reached the furthest written step whose id one
|
|
47
|
+
* of its rows carries. Report numbers count every written row but FUNCTION_END.
|
|
48
|
+
*/
|
|
49
|
+
export declare function notRunLines(written: any[], reachedStepIds: Set<string>): string[];
|
|
50
|
+
/**
|
|
51
|
+
* How this call of a function compares with its other calls in the run: earlier calls that passed
|
|
52
|
+
* point at this call's data or state, not at the function itself.
|
|
53
|
+
*/
|
|
54
|
+
export declare function functionCallsLine(rows: any[], callIndex: number): string | undefined;
|
|
55
|
+
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,+DAA+D;AAC/D,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,uEAAuE;AACvE,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,uEAAuE;AACvE,eAAO,MAAM,cAAc,KAAK,CAAC;AAMjC,kCAAkC;AAClC,eAAO,MAAM,YAAY,KAAK,CAAC;AAK/B,yCAAyC;AACzC,eAAO,MAAM,WAAW,IAAI,CAAC;AAQ7B,sCAAsC;AACtC,eAAO,MAAM,KAAK,GAAI,GAAG,OAAO,WAAiG,CAAC;AASlI,MAAM,MAAM,WAAW,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAUpE,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAUvC;AA2HD,MAAM,MAAM,IAAI,GAAG;IACjB,sBAAsB;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iFAAiF;IACjF,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CA6D9D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAmBjF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWpF"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The steps leading to a failure, small enough for a model to read — so it can reason like a
|
|
3
|
+
* tester over the whole test case flow, not just the failed step. Ported from ai-assistant
|
|
4
|
+
* `src/tools/_lib/flow.py` (with smaller limits: the MCP shows one FLOW per cause inside one
|
|
5
|
+
* tool result, where the in-app analysis sends one FLOW per model call).
|
|
6
|
+
*
|
|
7
|
+
* One line per step: report number, status, description, the test data it used, engine flags —
|
|
8
|
+
* indented under its function. Control flow is shown as what it is (`[IF → false] … — steps
|
|
9
|
+
* 12–18 skipped`, `[LOOP → 3 iterations]`, `[SWITCH] switch to API`), never as a failure. Steps
|
|
10
|
+
* left out become one `… steps a–b not shown: n steps, all passed …` line, so nothing disappears
|
|
11
|
+
* silently. Pure: raw step-result rows in, lines out.
|
|
12
|
+
*/
|
|
13
|
+
import { cleanLogLines, isNoiseLine } from './failureCategory.js';
|
|
14
|
+
import { INFO_STEP_TYPES, reportStepLabel, UNREACHED_STATUSES } from './stepRules.js';
|
|
15
|
+
/** A run with this many real steps or fewer is shown whole. */
|
|
16
|
+
export const SHOW_ALL = 60;
|
|
17
|
+
/** Real steps kept before / after the main failure in a longer run. */
|
|
18
|
+
export const WINDOW_BEFORE = 25;
|
|
19
|
+
export const WINDOW_AFTER = 5;
|
|
20
|
+
/** Step lines per FLOW (the "… not shown …" lines are not counted). */
|
|
21
|
+
export const MAX_FLOW_LINES = 90;
|
|
22
|
+
/** Other failures each keep this window (before, after) while there is room. */
|
|
23
|
+
const OTHER_WINDOW = [1, 1];
|
|
24
|
+
/** A test-data value is cut here; parameters shown per step. */
|
|
25
|
+
const VALUE_CHARS = 40;
|
|
26
|
+
const MAX_PARAMS = 6;
|
|
27
|
+
/** Warnings from passed steps. */
|
|
28
|
+
export const MAX_WARNINGS = 15;
|
|
29
|
+
const WARNING_CHARS = 200;
|
|
30
|
+
/** A breakdown: from one failure on, this share of the counted steps failed, at least MIN. */
|
|
31
|
+
const BREAKDOWN_SHARE = 0.8;
|
|
32
|
+
const BREAKDOWN_MIN = 5;
|
|
33
|
+
/** Written steps listed as [not run]. */
|
|
34
|
+
export const MAX_NOT_RUN = 8;
|
|
35
|
+
const CONTROL = new Set(['IF', 'ELSE_IF', 'ELSE', 'WHILE', 'BREAK', 'CONTINUE']);
|
|
36
|
+
const LOOP_STARTS = new Set(['ITERATOR_START', 'FOR_START', 'WHILE_START', 'DO']);
|
|
37
|
+
const up = (v) => String(v ?? '').trim().toUpperCase();
|
|
38
|
+
const typeOf = (r) => up(r?.stepType);
|
|
39
|
+
const statusOf = (r) => up(r?.status) || 'UNKNOWN';
|
|
40
|
+
/** HTML descriptions → plain text. */
|
|
41
|
+
export const plain = (v) => String(v ?? '').replace(/<[^>]*>/g, ' ').replace(/ /g, ' ').replace(/\s+/g, ' ').trim();
|
|
42
|
+
/** A step with an outcome of its own (not INFO). */
|
|
43
|
+
const real = (r) => up(r?.status) !== 'INFO' && !INFO_STEP_TYPES.has(typeOf(r));
|
|
44
|
+
/** A real step the run executed (not left NOTEXECUTED / SKIPPED behind it). */
|
|
45
|
+
const ran = (r) => real(r) && !UNREACHED_STATUSES.has(up(r?.status)) && statusOf(r) !== 'SKIPPED';
|
|
46
|
+
/** A step with a verdict of its own — not INFO, not a FUNCTION heading. */
|
|
47
|
+
const counted = (r) => real(r) && typeOf(r) !== 'FUNCTION';
|
|
48
|
+
function labelOf(r, automated) {
|
|
49
|
+
return reportStepLabel(r ?? {}, automated) ?? '-';
|
|
50
|
+
}
|
|
51
|
+
function indentOf(label) {
|
|
52
|
+
return ' '.repeat((label.match(/\./g) ?? []).length);
|
|
53
|
+
}
|
|
54
|
+
/** `name=value; …` — protected values masked, long ones cut. */
|
|
55
|
+
export function stepData(r) {
|
|
56
|
+
const items = [];
|
|
57
|
+
for (const e of (Array.isArray(r?.testdata) ? r.testdata : []).slice(0, MAX_PARAMS)) {
|
|
58
|
+
if (!e || typeof e !== 'object')
|
|
59
|
+
continue;
|
|
60
|
+
let value = e.protected ? '***' : e.value === null || e.value === undefined ? '' : String(e.value).split(/\s+/).join(' ');
|
|
61
|
+
if (value.length > VALUE_CHARS)
|
|
62
|
+
value = `${value.slice(0, VALUE_CHARS)}…`;
|
|
63
|
+
const name = String(e.paramName ?? e.runtimeKey ?? '').trim();
|
|
64
|
+
items.push(name ? `${name}=${value}` : value);
|
|
65
|
+
}
|
|
66
|
+
return items.join('; ');
|
|
67
|
+
}
|
|
68
|
+
function flags(r) {
|
|
69
|
+
let out = '';
|
|
70
|
+
if (r?.selfHealed)
|
|
71
|
+
out += ' [self-healed]';
|
|
72
|
+
const defects = (Array.isArray(r?.defectIds) ? r.defectIds : []).filter(Boolean);
|
|
73
|
+
if (defects.length)
|
|
74
|
+
out += ` [defects: ${defects.join(', ')}]`;
|
|
75
|
+
const checks = (Array.isArray(r?.apiData?.assertions) ? r.apiData.assertions : []).filter((a) => a && typeof a === 'object');
|
|
76
|
+
if (checks.length) {
|
|
77
|
+
const failed = checks.filter((a) => up(a.status) === 'FAILED' || a.status === false).length;
|
|
78
|
+
out += ` [assertions: ${failed} of ${checks.length} failed]`;
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
function functionName(r) {
|
|
83
|
+
return String(r?.functionData?.functionName ?? r?.functionData?.functionCode ?? '').trim() || plain(r?.description) || 'function';
|
|
84
|
+
}
|
|
85
|
+
/** For a false IF: " — steps A–B skipped", from its matching IF_END. */
|
|
86
|
+
function skipped(rows, index, automated) {
|
|
87
|
+
let depth = 0;
|
|
88
|
+
for (const later of rows.slice(index + 1)) {
|
|
89
|
+
const kind = typeOf(later);
|
|
90
|
+
if (kind === 'IF')
|
|
91
|
+
depth++;
|
|
92
|
+
else if (kind === 'IF_END') {
|
|
93
|
+
if (depth === 0) {
|
|
94
|
+
const [s, e] = [labelOf(rows[index], automated), labelOf(later, automated)];
|
|
95
|
+
if (/^\d+$/.test(s) && /^\d+$/.test(e) && Number(e) > Number(s) + 1) {
|
|
96
|
+
const [a, b] = [Number(s) + 1, Number(e) - 1];
|
|
97
|
+
return ` — ${a === b ? `step ${a}` : `steps ${a}–${b}`} skipped`;
|
|
98
|
+
}
|
|
99
|
+
return ' — its block was skipped';
|
|
100
|
+
}
|
|
101
|
+
depth--;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return '';
|
|
105
|
+
}
|
|
106
|
+
function rowLines(rows, i, automated, tags) {
|
|
107
|
+
const r = rows[i];
|
|
108
|
+
const kind = typeOf(r);
|
|
109
|
+
const label = labelOf(r, automated);
|
|
110
|
+
const ind = indentOf(label);
|
|
111
|
+
if (LOOP_STARTS.has(kind)) {
|
|
112
|
+
const loop = r?.loop ?? {};
|
|
113
|
+
const n = loop.loopIteration;
|
|
114
|
+
const times = typeof n === 'number' && n >= 0 ? `${n} iteration${n === 1 ? '' : 's'}` : 'loop';
|
|
115
|
+
const cond = String(loop.evaluatedConditionString ?? loop.conditionString ?? '').trim();
|
|
116
|
+
return [`${ind}${label} [LOOP → ${times}]${cond ? ` ${cond}` : ''}`];
|
|
117
|
+
}
|
|
118
|
+
if (kind === 'LOOP_ITERATION_START') {
|
|
119
|
+
const n = r?.loop?.iteratorCount;
|
|
120
|
+
return typeof n === 'number' && n > 0 ? [` · iteration ${n}`] : [];
|
|
121
|
+
}
|
|
122
|
+
if (CONTROL.has(kind)) {
|
|
123
|
+
const cond = String(r?.conditions?.evaluatedConditionString ?? plain(r?.description) ?? kind).trim() || kind;
|
|
124
|
+
const outcome = { PASSED: 'true', FAILED: 'false' }[statusOf(r)] ?? statusOf(r).toLowerCase();
|
|
125
|
+
return [`${ind}${label} [${kind} → ${outcome}] ${cond}${outcome === 'false' && kind === 'IF' ? skipped(rows, i, automated) : ''}`];
|
|
126
|
+
}
|
|
127
|
+
if (kind.startsWith('SWITCH_TO_'))
|
|
128
|
+
return [`${ind}${label} [SWITCH] switch to ${kind.slice('SWITCH_TO_'.length)}`];
|
|
129
|
+
if (!real(r))
|
|
130
|
+
return [];
|
|
131
|
+
if (kind === 'FUNCTION')
|
|
132
|
+
return [`${ind}${label} [${statusOf(r)}] function "${functionName(r)}"`];
|
|
133
|
+
const data = stepData(r);
|
|
134
|
+
return [`${ind}${label} [${tags.get(i) ?? statusOf(r)}] ${plain(r?.description)}`.trimEnd() + (data ? ` | ${data}` : '') + flags(r)];
|
|
135
|
+
}
|
|
136
|
+
/** One line for a run of steps left out — nothing when none of them count. */
|
|
137
|
+
function gapLine(rows, automated) {
|
|
138
|
+
const c = rows.filter(counted);
|
|
139
|
+
if (!c.length)
|
|
140
|
+
return [];
|
|
141
|
+
const [first, last] = [labelOf(c[0], automated), labelOf(c[c.length - 1], automated)];
|
|
142
|
+
const tally = new Map();
|
|
143
|
+
for (const r of c)
|
|
144
|
+
tally.set(statusOf(r).toLowerCase(), (tally.get(statusOf(r).toLowerCase()) ?? 0) + 1);
|
|
145
|
+
const how = tally.size === 1 && tally.has('passed') && c.length > 1 ? 'all passed' : [...tally].map(([s, n]) => `${n} ${s}`).join(', ');
|
|
146
|
+
return [`… ${c.length === 1 ? `step ${first}` : `steps ${first}–${last}`} not shown: ${c.length} step${c.length === 1 ? '' : 's'}, ${how} …`];
|
|
147
|
+
}
|
|
148
|
+
/** Row `i` plus `before` real steps ahead of it and `after` behind it. */
|
|
149
|
+
function around(rows, i, before, after) {
|
|
150
|
+
let start = i;
|
|
151
|
+
for (let j = i - 1, n = 0; j >= 0 && n < before; j--) {
|
|
152
|
+
start = j;
|
|
153
|
+
n += real(rows[j]) ? 1 : 0;
|
|
154
|
+
}
|
|
155
|
+
let end = i;
|
|
156
|
+
for (let j = i + 1, n = 0; j < rows.length && n < after; j++) {
|
|
157
|
+
end = j;
|
|
158
|
+
n += real(rows[j]) ? 1 : 0;
|
|
159
|
+
}
|
|
160
|
+
const out = new Set();
|
|
161
|
+
for (let k = start; k <= end; k++)
|
|
162
|
+
out.add(k);
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
/** The failed steps; a FUNCTION heading only when nothing inside it failed. */
|
|
166
|
+
function failedIdx(rows) {
|
|
167
|
+
const failed = rows.map((r, i) => (statusOf(r) === 'FAILED' && real(r) ? i : -1)).filter((i) => i >= 0);
|
|
168
|
+
const work = failed.filter((i) => typeOf(rows[i]) !== 'FUNCTION');
|
|
169
|
+
return work.length ? work : failed;
|
|
170
|
+
}
|
|
171
|
+
/** The rows that open a block the failure at `index` sits inside: its function calls (by label
|
|
172
|
+
* prefix) and the IF / loop rows before it whose block has not closed yet. */
|
|
173
|
+
function enclosing(rows, index, automated) {
|
|
174
|
+
const label = labelOf(rows[index], automated);
|
|
175
|
+
const out = [];
|
|
176
|
+
const parts = label.split('.');
|
|
177
|
+
for (let n = 1; n < parts.length; n++) {
|
|
178
|
+
const prefix = parts.slice(0, n).join('.');
|
|
179
|
+
for (let j = index - 1; j >= 0; j--) {
|
|
180
|
+
if (typeOf(rows[j]) === 'FUNCTION' && labelOf(rows[j], automated) === prefix) {
|
|
181
|
+
out.push(j);
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const open = [];
|
|
187
|
+
const closes = { IF_END: 'IF', FOR_END: 'FOR_START', WHILE_END: 'WHILE_START', ITERATOR_END: 'ITERATOR_START' };
|
|
188
|
+
for (let j = 0; j < index; j++) {
|
|
189
|
+
const kind = typeOf(rows[j]);
|
|
190
|
+
if (kind === 'IF' || LOOP_STARTS.has(kind))
|
|
191
|
+
open.push(j);
|
|
192
|
+
else if (closes[kind]) {
|
|
193
|
+
for (let k = open.length - 1; k >= 0; k--)
|
|
194
|
+
if (typeOf(rows[open[k]]) === closes[kind]) {
|
|
195
|
+
open.splice(k);
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else if (kind === 'WHILE') {
|
|
200
|
+
for (let k = open.length - 1; k >= 0; k--)
|
|
201
|
+
if (typeOf(rows[open[k]]) === 'DO') {
|
|
202
|
+
open.splice(k);
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return [...out, ...open];
|
|
208
|
+
}
|
|
209
|
+
/** The FLOW of one run (rows in report order). */
|
|
210
|
+
export function buildFlow(rows, opts) {
|
|
211
|
+
const automated = opts.automated;
|
|
212
|
+
const failed = failedIdx(rows);
|
|
213
|
+
const lastRan = rows.reduce((m, r, i) => (ran(r) ? i : m), -1);
|
|
214
|
+
const tags = new Map();
|
|
215
|
+
for (const i of failed)
|
|
216
|
+
tags.set(i, `FAILED · ${i < lastRan ? 'continued' : 'stopped the run'}`);
|
|
217
|
+
const focus = rows.findIndex((r) => opts.focusId !== undefined && String(r?.id) === String(opts.focusId));
|
|
218
|
+
const main = focus >= 0 ? focus : failed.find((i) => tags.get(i).endsWith('stopped the run')) ?? failed[0] ?? lastRan;
|
|
219
|
+
const keep = new Set();
|
|
220
|
+
if (rows.filter(real).length <= SHOW_ALL) {
|
|
221
|
+
rows.forEach((_, i) => keep.add(i));
|
|
222
|
+
}
|
|
223
|
+
else if (main >= 0) {
|
|
224
|
+
for (const i of around(rows, main, WINDOW_BEFORE, WINDOW_AFTER))
|
|
225
|
+
keep.add(i);
|
|
226
|
+
for (const i of enclosing(rows, main, automated))
|
|
227
|
+
keep.add(i);
|
|
228
|
+
for (const f of failed) {
|
|
229
|
+
if ([...keep].filter((k) => real(rows[k])).length >= MAX_FLOW_LINES)
|
|
230
|
+
break;
|
|
231
|
+
for (const i of around(rows, f, OTHER_WINDOW[0], OTHER_WINDOW[1]))
|
|
232
|
+
keep.add(i);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const lines = [];
|
|
236
|
+
let gap = [];
|
|
237
|
+
let shown = 0;
|
|
238
|
+
rows.forEach((r, i) => {
|
|
239
|
+
if (keep.has(i) && shown < MAX_FLOW_LINES) {
|
|
240
|
+
lines.push(...gapLine(gap, automated));
|
|
241
|
+
gap = [];
|
|
242
|
+
const out = rowLines(rows, i, automated, tags);
|
|
243
|
+
shown += out.length;
|
|
244
|
+
lines.push(...out);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
gap.push(r);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
lines.push(...gapLine(gap, automated));
|
|
251
|
+
// A breakdown: from one failure on, nearly every counted step failed.
|
|
252
|
+
let breakdown;
|
|
253
|
+
for (const f of failed) {
|
|
254
|
+
const after = rows.slice(f).filter(counted);
|
|
255
|
+
const bad = after.filter((r) => statusOf(r) === 'FAILED').length;
|
|
256
|
+
if (bad >= BREAKDOWN_MIN && bad / after.length >= BREAKDOWN_SHARE) {
|
|
257
|
+
breakdown = `from step ${labelOf(rows[f], automated)} on, ${bad} of ${after.length} steps failed`;
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const warnings = [];
|
|
262
|
+
for (const r of rows) {
|
|
263
|
+
if (warnings.length >= MAX_WARNINGS)
|
|
264
|
+
break;
|
|
265
|
+
if (statusOf(r) !== 'PASSED' || !real(r))
|
|
266
|
+
continue;
|
|
267
|
+
for (const l of (Array.isArray(r?.executionLogData?.executionLogs) ? r.executionLogData.executionLogs : []).flatMap(cleanLogLines)) {
|
|
268
|
+
if (!/\b(ERROR|WARN|WARNING)\b/.test(l) || isNoiseLine(l))
|
|
269
|
+
continue;
|
|
270
|
+
warnings.push(`step ${labelOf(r, automated)}: ${l.slice(0, WARNING_CHARS)}`);
|
|
271
|
+
if (warnings.length >= MAX_WARNINGS)
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const furthestStepIds = new Set(rows.slice(0, lastRan + 1).map((r) => String(r?.stepId ?? '')).filter(Boolean));
|
|
276
|
+
return { lines, ...(breakdown ? { breakdown } : {}), warnings, furthestStepIds };
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The written steps the run never reached — what the test was going to do next. `written` is the
|
|
280
|
+
* test case's own steps (in `seq` order); the run reached the furthest written step whose id one
|
|
281
|
+
* of its rows carries. Report numbers count every written row but FUNCTION_END.
|
|
282
|
+
*/
|
|
283
|
+
export function notRunLines(written, reachedStepIds) {
|
|
284
|
+
let number = 0;
|
|
285
|
+
const numbered = written.map((w) => {
|
|
286
|
+
if (typeOf(w) !== 'FUNCTION_END')
|
|
287
|
+
number++;
|
|
288
|
+
return { w, number };
|
|
289
|
+
});
|
|
290
|
+
let furthest = -1;
|
|
291
|
+
numbered.forEach(({ w }, i) => { if (reachedStepIds.has(String(w?.id ?? '')))
|
|
292
|
+
furthest = i; });
|
|
293
|
+
if (furthest < 0)
|
|
294
|
+
return [];
|
|
295
|
+
const rest = numbered.slice(furthest + 1).filter(({ w }) => !INFO_STEP_TYPES.has(typeOf(w)) || typeOf(w) === 'IF');
|
|
296
|
+
const out = rest.slice(0, MAX_NOT_RUN).map(({ w, number: n }) => {
|
|
297
|
+
const kind = typeOf(w);
|
|
298
|
+
const text = kind === 'IF' || kind === 'ELSE_IF' || kind === 'ELSE'
|
|
299
|
+
? `${kind} ${String(w?.conditions?.ifstring ?? plain(w?.description))}`.trim()
|
|
300
|
+
: kind === 'FUNCTION' ? `function "${functionName(w)}"` : plain(w?.description) || kind.toLowerCase() || 'step';
|
|
301
|
+
return `${n} [not run] ${text}`;
|
|
302
|
+
});
|
|
303
|
+
if (rest.length > MAX_NOT_RUN)
|
|
304
|
+
out.push(`… ${rest.length - MAX_NOT_RUN} more written steps not run …`);
|
|
305
|
+
return out;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* How this call of a function compares with its other calls in the run: earlier calls that passed
|
|
309
|
+
* point at this call's data or state, not at the function itself.
|
|
310
|
+
*/
|
|
311
|
+
export function functionCallsLine(rows, callIndex) {
|
|
312
|
+
const call = rows[callIndex];
|
|
313
|
+
if (!call || typeOf(call) !== 'FUNCTION')
|
|
314
|
+
return undefined;
|
|
315
|
+
const key = String(call?.functionData?.functionId ?? functionName(call));
|
|
316
|
+
const calls = rows.map((r, i) => ({ r, i }))
|
|
317
|
+
.filter(({ r }) => typeOf(r) === 'FUNCTION' && String(r?.functionData?.functionId ?? functionName(r)) === key);
|
|
318
|
+
if (calls.length < 2)
|
|
319
|
+
return undefined;
|
|
320
|
+
const nth = calls.findIndex(({ i }) => i === callIndex) + 1;
|
|
321
|
+
const earlier = calls.filter(({ i }) => i < callIndex).map(({ r }) => statusOf(r).toLowerCase());
|
|
322
|
+
const tally = [...new Set(earlier)].map((s) => `${earlier.filter((x) => x === s).length} ${s}`).join(', ');
|
|
323
|
+
return `function "${functionName(call)}": this is call ${nth} of ${calls.length}${earlier.length ? `; earlier calls: ${tally}` : ' (the first call)'}`;
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapLimit.d.ts","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/mapLimit.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,wBAAsB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAWzG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** `fn` over `items` with at most `limit` calls in flight; results keep the input order. */
|
|
2
|
+
export async function mapLimit(items, limit, fn) {
|
|
3
|
+
const out = new Array(items.length);
|
|
4
|
+
let next = 0;
|
|
5
|
+
const worker = async () => {
|
|
6
|
+
while (next < items.length) {
|
|
7
|
+
const i = next++;
|
|
8
|
+
out[i] = await fn(items[i]);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
|
|
12
|
+
return out;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mapLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapLimit.js","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/mapLimit.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAO,KAAU,EAAE,KAAa,EAAE,EAA2B;IACzF,MAAM,GAAG,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -7,6 +7,9 @@ export declare function withTotal<T>(rows: T[], raw: any): T[] & {
|
|
|
7
7
|
totalCount?: number;
|
|
8
8
|
};
|
|
9
9
|
export declare function str(n: any, ...keys: string[]): string | undefined;
|
|
10
|
+
/** Rows a reader may see: soft-deleted ones (`deleted: true`) dropped — the AI assistant's
|
|
11
|
+
* `deleted ≠ true` rule, for endpoints that return rows without filtering them (reports, steps). */
|
|
12
|
+
export declare function notDeleted<T>(rows: T[]): T[];
|
|
10
13
|
/** Accept a numeric id ("523") or a business code ("TC_523" / "US-897") — SQA REST paths
|
|
11
14
|
* parseInt the segment, so a raw business key yields NaN → 404. Strips to the numeric run. */
|
|
12
15
|
export declare function numericId(id: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EACzD,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EACtG,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAChG,MAAM,uBAAuB,CAAC;AAU/B,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAM1D;AAED;;6FAE6F;AAC7F,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAI/E;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAQjE;AAED;+FAC+F;AAC/F,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED;;oGAEoG;AACpG,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAc3F;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAI5D;AAWD,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAGnD,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAEpD,CAAC;AA4DH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAyG7D;AAUD,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/mapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,11 @@ export function str(n, ...keys) {
|
|
|
34
34
|
}
|
|
35
35
|
return undefined;
|
|
36
36
|
}
|
|
37
|
+
/** Rows a reader may see: soft-deleted ones (`deleted: true`) dropped — the AI assistant's
|
|
38
|
+
* `deleted ≠ true` rule, for endpoints that return rows without filtering them (reports, steps). */
|
|
39
|
+
export function notDeleted(rows) {
|
|
40
|
+
return rows.filter((r) => r?.deleted !== true);
|
|
41
|
+
}
|
|
37
42
|
/** Accept a numeric id ("523") or a business code ("TC_523" / "US-897") — SQA REST paths
|
|
38
43
|
* parseInt the segment, so a raw business key yields NaN → 404. Strips to the numeric run. */
|
|
39
44
|
export function numericId(id) {
|
|
@@ -265,7 +270,6 @@ export function toTestCase(doc) {
|
|
|
265
270
|
const id = str(doc, 'id', '_id', 'testcaseId');
|
|
266
271
|
const execType = str(doc, 'executionType') ?? '';
|
|
267
272
|
const category = execType.toUpperCase() === 'MANUAL' ? 'manual' : 'automated';
|
|
268
|
-
const priority = mapPriority(doc?.priority);
|
|
269
273
|
const description = str(doc, 'description');
|
|
270
274
|
const preconditions = str(doc, 'prerequisite', 'preconditions');
|
|
271
275
|
// storyRef + folderOrModule come off SQA as raw ints (userstoryId / moduleId). Project into
|
|
@@ -299,8 +303,6 @@ export function toTestCase(doc) {
|
|
|
299
303
|
...(id ? { id } : {}),
|
|
300
304
|
title: str(doc, 'name', 'title') ?? '',
|
|
301
305
|
...(description ? { description } : {}),
|
|
302
|
-
priority,
|
|
303
|
-
...(str(doc, 'status') ? { status: str(doc, 'status') } : {}),
|
|
304
306
|
category,
|
|
305
307
|
...(preconditions ? { preconditions } : {}),
|
|
306
308
|
...(userstoryId ? { storyRef: userstoryId } : {}),
|
|
@@ -354,8 +356,7 @@ export function toTcSummary(row) {
|
|
|
354
356
|
const id = str(row, 'id', '_id', 'testcaseId') ?? '';
|
|
355
357
|
const code = str(row, 'code');
|
|
356
358
|
const title = str(row, 'name', 'title') ?? '';
|
|
357
|
-
|
|
358
|
-
const status = str(row, 'status');
|
|
359
|
+
// SQA testcase rows have no priority/status/stepCount columns; do not fabricate defaults.
|
|
359
360
|
const stepCount = typeof row?.stepCount === 'number' ? row.stepCount : undefined;
|
|
360
361
|
const technologyType = str(row, 'tcType');
|
|
361
362
|
const executionType = str(row, 'executionType');
|
|
@@ -364,8 +365,6 @@ export function toTcSummary(row) {
|
|
|
364
365
|
id,
|
|
365
366
|
...(code ? { code } : {}),
|
|
366
367
|
title,
|
|
367
|
-
priority,
|
|
368
|
-
...(status ? { status } : {}),
|
|
369
368
|
...(stepCount !== undefined ? { stepCount } : {}),
|
|
370
369
|
...(technologyType ? { technologyType } : {}),
|
|
371
370
|
...(executionType ? { executionType } : {}),
|