@ivorycanvas/qamap 0.3.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/CHANGELOG.md +93 -0
- package/LICENSE +21 -0
- package/README.md +636 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +879 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +114 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +1 -0
- package/dist/context.js +126 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +32 -0
- package/dist/doctor.js +200 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain-language.d.ts +25 -0
- package/dist/domain-language.js +655 -0
- package/dist/domain-language.js.map +1 -0
- package/dist/domains.d.ts +33 -0
- package/dist/domains.js +258 -0
- package/dist/domains.js.map +1 -0
- package/dist/e2e.d.ts +326 -0
- package/dist/e2e.js +6869 -0
- package/dist/e2e.js.map +1 -0
- package/dist/eval.d.ts +40 -0
- package/dist/eval.js +374 -0
- package/dist/eval.js.map +1 -0
- package/dist/flows.d.ts +32 -0
- package/dist/flows.js +246 -0
- package/dist/flows.js.map +1 -0
- package/dist/fs.d.ts +7 -0
- package/dist/fs.js +132 -0
- package/dist/fs.js.map +1 -0
- package/dist/github.d.ts +34 -0
- package/dist/github.js +183 -0
- package/dist/github.js.map +1 -0
- package/dist/history.d.ts +173 -0
- package/dist/history.js +247 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest-suggestions.d.ts +67 -0
- package/dist/manifest-suggestions.js +673 -0
- package/dist/manifest-suggestions.js.map +1 -0
- package/dist/manifest.d.ts +212 -0
- package/dist/manifest.js +1607 -0
- package/dist/manifest.js.map +1 -0
- package/dist/qa.d.ts +53 -0
- package/dist/qa.js +361 -0
- package/dist/qa.js.map +1 -0
- package/dist/report.d.ts +5 -0
- package/dist/report.js +164 -0
- package/dist/report.js.map +1 -0
- package/dist/review.d.ts +31 -0
- package/dist/review.js +383 -0
- package/dist/review.js.map +1 -0
- package/dist/scanner.d.ts +3 -0
- package/dist/scanner.js +797 -0
- package/dist/scanner.js.map +1 -0
- package/dist/severity.d.ts +3 -0
- package/dist/severity.js +9 -0
- package/dist/severity.js.map +1 -0
- package/dist/test-evidence.d.ts +39 -0
- package/dist/test-evidence.js +303 -0
- package/dist/test-evidence.js.map +1 -0
- package/dist/test-plan.d.ts +35 -0
- package/dist/test-plan.js +573 -0
- package/dist/test-plan.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +27 -0
- package/dist/verify.js +244 -0
- package/dist/verify.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/docs/adoption.md +166 -0
- package/docs/agent-skill.md +94 -0
- package/docs/api-contracts.md +30 -0
- package/docs/assets/qamap-30s-demo.gif +0 -0
- package/docs/configuration.md +277 -0
- package/docs/e2e-output-examples.md +464 -0
- package/docs/ecosystem.md +41 -0
- package/docs/eval.md +52 -0
- package/docs/github-action.md +89 -0
- package/docs/manifest.md +350 -0
- package/docs/quickstart-demo.md +268 -0
- package/docs/release-validation.md +247 -0
- package/docs/releasing.md +112 -0
- package/docs/roadmap.md +67 -0
- package/docs/rules.md +28 -0
- package/docs/verify.md +44 -0
- package/package.json +80 -0
- package/schema/qamap-manifest.schema.json +323 -0
- package/schema/qamap.schema.json +58 -0
- package/skills/qamap-pr-qa/SKILL.md +81 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TestPlanChangedFile } from "./test-plan.js";
|
|
2
|
+
export declare const defaultDomainManifestPath = ".qamap/domains.yml";
|
|
3
|
+
export interface DomainScenarioDefinition {
|
|
4
|
+
title: string;
|
|
5
|
+
checks: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface DomainDefinition {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
aliases: string[];
|
|
12
|
+
files: string[];
|
|
13
|
+
routes: string[];
|
|
14
|
+
tags: string[];
|
|
15
|
+
scenarios: DomainScenarioDefinition[];
|
|
16
|
+
}
|
|
17
|
+
export interface DomainManifest {
|
|
18
|
+
path?: string;
|
|
19
|
+
domains: DomainDefinition[];
|
|
20
|
+
}
|
|
21
|
+
export interface MatchedDomain {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
reason: string;
|
|
25
|
+
matchedFiles: string[];
|
|
26
|
+
matchedSignals: string[];
|
|
27
|
+
aliases: string[];
|
|
28
|
+
routes: string[];
|
|
29
|
+
scenarios: DomainScenarioDefinition[];
|
|
30
|
+
}
|
|
31
|
+
export declare function loadDomainManifest(rootInput: string): Promise<DomainManifest>;
|
|
32
|
+
export declare function matchDomains(manifest: DomainManifest, changedFiles: TestPlanChangedFile[]): MatchedDomain[];
|
|
33
|
+
export declare function writeDefaultDomainManifest(rootInput: string, fileName?: string, force?: boolean): Promise<string>;
|
package/dist/domains.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { pathExists, toPosixPath } from "./fs.js";
|
|
5
|
+
export const defaultDomainManifestPath = ".qamap/domains.yml";
|
|
6
|
+
const domainManifestCandidates = [
|
|
7
|
+
".qamap/domains.yml",
|
|
8
|
+
".qamap/domains.yaml",
|
|
9
|
+
".qamap/domains.json",
|
|
10
|
+
];
|
|
11
|
+
export async function loadDomainManifest(rootInput) {
|
|
12
|
+
const root = path.resolve(rootInput);
|
|
13
|
+
const manifestPath = await findDomainManifestPath(root);
|
|
14
|
+
if (!manifestPath) {
|
|
15
|
+
return { domains: [] };
|
|
16
|
+
}
|
|
17
|
+
const raw = await fs.readFile(manifestPath, "utf8");
|
|
18
|
+
const parsed = parseDomainManifest(raw, manifestPath);
|
|
19
|
+
return {
|
|
20
|
+
path: toPosixPath(path.relative(root, manifestPath)),
|
|
21
|
+
domains: normalizeDomains(parsed, manifestPath),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function matchDomains(manifest, changedFiles) {
|
|
25
|
+
if (manifest.domains.length === 0 || changedFiles.length === 0) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
const files = changedFiles.map((file) => file.path);
|
|
29
|
+
return manifest.domains
|
|
30
|
+
.map((domain) => matchDomain(domain, files))
|
|
31
|
+
.filter((domain) => Boolean(domain))
|
|
32
|
+
.sort((left, right) => right.matchedFiles.length + right.matchedSignals.length - (left.matchedFiles.length + left.matchedSignals.length))
|
|
33
|
+
.slice(0, 12);
|
|
34
|
+
}
|
|
35
|
+
export async function writeDefaultDomainManifest(rootInput, fileName = defaultDomainManifestPath, force = false) {
|
|
36
|
+
const root = path.resolve(rootInput);
|
|
37
|
+
const outputPath = path.resolve(root, fileName);
|
|
38
|
+
if (!force && (await pathExists(outputPath))) {
|
|
39
|
+
throw new Error(`Refusing to overwrite ${outputPath}. Pass --force to replace it.`);
|
|
40
|
+
}
|
|
41
|
+
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
42
|
+
await fs.writeFile(outputPath, defaultDomainManifestText(), "utf8");
|
|
43
|
+
return outputPath;
|
|
44
|
+
}
|
|
45
|
+
function matchDomain(domain, changedFiles) {
|
|
46
|
+
const matchedFiles = new Set();
|
|
47
|
+
const matchedSignals = new Set();
|
|
48
|
+
const domainTokens = [domain.id, domain.name, ...domain.aliases].map(normalizeToken).filter(Boolean);
|
|
49
|
+
for (const file of changedFiles) {
|
|
50
|
+
if (domain.files.some((pattern) => matchesPathPattern(file, pattern))) {
|
|
51
|
+
matchedFiles.add(file);
|
|
52
|
+
matchedSignals.add("file pattern");
|
|
53
|
+
}
|
|
54
|
+
const fileTokens = pathTokens(file);
|
|
55
|
+
for (const token of domainTokens) {
|
|
56
|
+
if (fileTokens.includes(token)) {
|
|
57
|
+
matchedFiles.add(file);
|
|
58
|
+
matchedSignals.add(`domain:${token}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const route of domain.routes) {
|
|
62
|
+
const routeSignal = normalizeRoute(route);
|
|
63
|
+
if (routeSignal && normalizePathForMatch(file).includes(routeSignal)) {
|
|
64
|
+
matchedFiles.add(file);
|
|
65
|
+
matchedSignals.add(`route:${route}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const tag of domain.tags) {
|
|
69
|
+
const normalizedTag = normalizeToken(tag);
|
|
70
|
+
if (normalizedTag && fileTokens.includes(normalizedTag)) {
|
|
71
|
+
matchedFiles.add(file);
|
|
72
|
+
matchedSignals.add(`tag:${tag}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (matchedFiles.size === 0) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
const signals = [...matchedSignals];
|
|
80
|
+
return {
|
|
81
|
+
id: domain.id,
|
|
82
|
+
name: domain.name,
|
|
83
|
+
reason: `Changed files match ${signals.slice(0, 4).join(", ")} for this declared domain.`,
|
|
84
|
+
matchedFiles: [...matchedFiles].slice(0, 20),
|
|
85
|
+
matchedSignals: signals.slice(0, 12),
|
|
86
|
+
aliases: domain.aliases.slice(0, 10),
|
|
87
|
+
routes: domain.routes.slice(0, 10),
|
|
88
|
+
scenarios: domain.scenarios.slice(0, 6),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function parseDomainManifest(raw, manifestPath) {
|
|
92
|
+
try {
|
|
93
|
+
if (/\.json$/i.test(manifestPath)) {
|
|
94
|
+
return JSON.parse(raw);
|
|
95
|
+
}
|
|
96
|
+
return YAML.parse(raw);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
100
|
+
throw new Error(`Could not parse QAMap domain manifest at ${manifestPath}: ${message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function normalizeDomains(value, manifestPath) {
|
|
104
|
+
const record = asRecord(value, `QAMap domain manifest must be an object: ${manifestPath}`);
|
|
105
|
+
const rawDomains = record.domains;
|
|
106
|
+
if (!Array.isArray(rawDomains)) {
|
|
107
|
+
throw new Error(`QAMap domain manifest domains must be an array: ${manifestPath}`);
|
|
108
|
+
}
|
|
109
|
+
return rawDomains.map((domain, index) => normalizeDomain(domain, manifestPath, index));
|
|
110
|
+
}
|
|
111
|
+
function normalizeDomain(value, manifestPath, index) {
|
|
112
|
+
const record = asRecord(value, `QAMap domain manifest domain at index ${index} must be an object: ${manifestPath}`);
|
|
113
|
+
const id = readRequiredString(record, "id", manifestPath, index);
|
|
114
|
+
const name = readOptionalString(record, "name") ?? readOptionalString(record, "title") ?? id;
|
|
115
|
+
const aliases = readStringArray(record, "aliases");
|
|
116
|
+
const files = readStringArray(record, "files");
|
|
117
|
+
const routes = readStringArray(record, "routes");
|
|
118
|
+
const tags = readStringArray(record, "tags");
|
|
119
|
+
const scenarios = readScenarioArray(record, "scenarios", manifestPath, index);
|
|
120
|
+
if (files.length + aliases.length + routes.length + tags.length === 0) {
|
|
121
|
+
throw new Error(`QAMap domain manifest domain ${id} must include at least one of aliases, files, routes, or tags: ${manifestPath}`);
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
id,
|
|
125
|
+
name,
|
|
126
|
+
description: readOptionalString(record, "description"),
|
|
127
|
+
aliases,
|
|
128
|
+
files,
|
|
129
|
+
routes,
|
|
130
|
+
tags,
|
|
131
|
+
scenarios,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async function findDomainManifestPath(root) {
|
|
135
|
+
for (const candidate of domainManifestCandidates) {
|
|
136
|
+
const absolutePath = path.join(root, candidate);
|
|
137
|
+
if (await pathExists(absolutePath)) {
|
|
138
|
+
return absolutePath;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
function readScenarioArray(record, key, manifestPath, domainIndex) {
|
|
144
|
+
const value = record[key];
|
|
145
|
+
if (value === undefined) {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
if (!Array.isArray(value)) {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
return value
|
|
152
|
+
.map((item, index) => normalizeScenario(item, manifestPath, domainIndex, index))
|
|
153
|
+
.filter((item) => Boolean(item));
|
|
154
|
+
}
|
|
155
|
+
function normalizeScenario(value, manifestPath, domainIndex, scenarioIndex) {
|
|
156
|
+
if (typeof value === "string") {
|
|
157
|
+
const title = value.trim();
|
|
158
|
+
return title ? { title, checks: [] } : undefined;
|
|
159
|
+
}
|
|
160
|
+
const record = asRecord(value, `QAMap domain manifest scenario at domain ${domainIndex}, index ${scenarioIndex} must be a string or object: ${manifestPath}`);
|
|
161
|
+
const title = readOptionalString(record, "title") ?? readOptionalString(record, "name");
|
|
162
|
+
if (!title) {
|
|
163
|
+
throw new Error(`QAMap domain manifest scenario at domain ${domainIndex}, index ${scenarioIndex} is missing title: ${manifestPath}`);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
title,
|
|
167
|
+
checks: readStringArray(record, "checks"),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function matchesPathPattern(file, pattern) {
|
|
171
|
+
const normalizedFile = normalizePathForMatch(file);
|
|
172
|
+
const normalizedPattern = normalizePathForMatch(pattern);
|
|
173
|
+
if (!normalizedPattern) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
if (!normalizedPattern.includes("*")) {
|
|
177
|
+
return normalizedFile === normalizedPattern || normalizedFile.startsWith(`${normalizedPattern}/`);
|
|
178
|
+
}
|
|
179
|
+
const regex = new RegExp(`^${normalizedPattern
|
|
180
|
+
.split("**")
|
|
181
|
+
.map((part) => part.split("*").map(escapeRegex).join("[^/]*"))
|
|
182
|
+
.join(".*")}$`);
|
|
183
|
+
return regex.test(normalizedFile);
|
|
184
|
+
}
|
|
185
|
+
function pathTokens(file) {
|
|
186
|
+
return file
|
|
187
|
+
.replace(/\.[^.\/]+$/g, "")
|
|
188
|
+
.split("/")
|
|
189
|
+
.flatMap((part) => part.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^a-zA-Z0-9]+/))
|
|
190
|
+
.map(normalizeToken)
|
|
191
|
+
.filter(Boolean);
|
|
192
|
+
}
|
|
193
|
+
function normalizeRoute(route) {
|
|
194
|
+
return normalizePathForMatch(route).replace(/^\//, "");
|
|
195
|
+
}
|
|
196
|
+
function normalizePathForMatch(value) {
|
|
197
|
+
return toPosixPath(value).replace(/^\.\/+/, "").replace(/\/+$/g, "").toLowerCase();
|
|
198
|
+
}
|
|
199
|
+
function normalizeToken(value) {
|
|
200
|
+
return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
201
|
+
}
|
|
202
|
+
function escapeRegex(value) {
|
|
203
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
204
|
+
}
|
|
205
|
+
function asRecord(value, message) {
|
|
206
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
207
|
+
throw new Error(message);
|
|
208
|
+
}
|
|
209
|
+
return value;
|
|
210
|
+
}
|
|
211
|
+
function readRequiredString(record, key, manifestPath, index) {
|
|
212
|
+
const value = readOptionalString(record, key);
|
|
213
|
+
if (!value) {
|
|
214
|
+
throw new Error(`QAMap domain manifest domain at index ${index} is missing ${key}: ${manifestPath}`);
|
|
215
|
+
}
|
|
216
|
+
return value;
|
|
217
|
+
}
|
|
218
|
+
function readOptionalString(record, key) {
|
|
219
|
+
const value = record[key];
|
|
220
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
221
|
+
}
|
|
222
|
+
function readStringArray(record, key) {
|
|
223
|
+
const value = record[key];
|
|
224
|
+
if (value === undefined) {
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
if (typeof value === "string" && value.trim().length > 0) {
|
|
228
|
+
return [value.trim()];
|
|
229
|
+
}
|
|
230
|
+
if (!Array.isArray(value)) {
|
|
231
|
+
return [];
|
|
232
|
+
}
|
|
233
|
+
return [...new Set(value.filter((item) => typeof item === "string").map((item) => item.trim()).filter(Boolean))];
|
|
234
|
+
}
|
|
235
|
+
function defaultDomainManifestText() {
|
|
236
|
+
return [
|
|
237
|
+
"# Commit this file when your team wants QAMap to know product/domain language.",
|
|
238
|
+
"domains:",
|
|
239
|
+
" - id: billing",
|
|
240
|
+
" name: Billing",
|
|
241
|
+
" aliases:",
|
|
242
|
+
" - checkout",
|
|
243
|
+
" - subscription",
|
|
244
|
+
" files:",
|
|
245
|
+
" - src/features/billing/**",
|
|
246
|
+
" routes:",
|
|
247
|
+
" - /billing",
|
|
248
|
+
" tags: []",
|
|
249
|
+
" scenarios:",
|
|
250
|
+
" - title: Billing primary journey",
|
|
251
|
+
" checks:",
|
|
252
|
+
" - Start from the normal billing entry point.",
|
|
253
|
+
" - Complete the primary billing action with realistic data.",
|
|
254
|
+
" - Confirm the visible result or saved state.",
|
|
255
|
+
"",
|
|
256
|
+
].join("\n");
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=domains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.js","sourceRoot":"","sources":["../src/domains.ts"],"names":[],"mappings":"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"}
|
package/dist/e2e.d.ts
ADDED
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import type { TestPlanChangedFile, TestPlanOptions } from "./test-plan.js";
|
|
2
|
+
import type { DomainLanguageSummary } from "./domain-language.js";
|
|
3
|
+
import type { MatchedDomain } from "./domains.js";
|
|
4
|
+
import type { MatchedCoreFlow } from "./flows.js";
|
|
5
|
+
import type { VerificationManifestMatch } from "./manifest.js";
|
|
6
|
+
import type { LocalHistoryReference } from "./history.js";
|
|
7
|
+
import type { CoverageEvidence, TestSuiteSummary } from "./test-evidence.js";
|
|
8
|
+
export type E2eProjectType = "expo-react-native" | "react-native" | "web" | "api-service" | "design-tokens" | "data-catalog" | "cli" | "unknown";
|
|
9
|
+
export type E2eRunnerName = "maestro" | "playwright" | "manual";
|
|
10
|
+
export type E2eEntrypointKind = "route" | "screen" | "command";
|
|
11
|
+
export type E2eEntrypointConfidence = "high" | "medium" | "low";
|
|
12
|
+
export type E2eSetupHintKind = "auth" | "network" | "fixture" | "environment" | "payment" | "state";
|
|
13
|
+
export type E2eSetupHintConfidence = "high" | "medium" | "low";
|
|
14
|
+
export type E2eExecutionProfileConfidence = "high" | "medium" | "low";
|
|
15
|
+
export type E2eFixtureReadinessStatus = "ready" | "partial" | "missing" | "not-needed";
|
|
16
|
+
export type E2eValidationMatrixStatus = "ready" | "partial" | "missing";
|
|
17
|
+
export type E2eValidationMatrixCategory = "core-flow" | "coverage" | "fixture" | "testability" | "setup";
|
|
18
|
+
export type E2eBootstrapStepStatus = "required" | "recommended" | "ready";
|
|
19
|
+
export type E2eBootstrapStepCategory = "runner" | "draft" | "workspace" | "domain-language" | "core-flow" | "fixture" | "testability" | "validation" | "history";
|
|
20
|
+
export type E2eSelectorKind = "test-id" | "input-test-id" | "accessibility-label" | "input-accessibility-label" | "visible-text" | "web-test-id" | "input-web-test-id" | "aria-label" | "input-aria-label" | "placeholder" | "role-button" | "role-link";
|
|
21
|
+
export interface E2ePlanOptions extends TestPlanOptions {
|
|
22
|
+
runner?: E2eRunnerName;
|
|
23
|
+
manifestPath?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface E2eDraftOptions extends E2ePlanOptions {
|
|
26
|
+
output?: string;
|
|
27
|
+
force?: boolean;
|
|
28
|
+
maxDrafts?: number;
|
|
29
|
+
dryRun?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface E2eProjectProfile {
|
|
32
|
+
type: E2eProjectType;
|
|
33
|
+
evidence: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface E2eRunnerRecommendation {
|
|
36
|
+
name: E2eRunnerName;
|
|
37
|
+
reason: string;
|
|
38
|
+
}
|
|
39
|
+
export interface E2eExecutionProfile {
|
|
40
|
+
runner: E2eRunnerName;
|
|
41
|
+
confidence: E2eExecutionProfileConfidence;
|
|
42
|
+
startCommand?: string;
|
|
43
|
+
testCommand?: string;
|
|
44
|
+
baseUrl?: string;
|
|
45
|
+
appId?: string;
|
|
46
|
+
configFiles: string[];
|
|
47
|
+
envFiles: string[];
|
|
48
|
+
evidence: string[];
|
|
49
|
+
blockers: string[];
|
|
50
|
+
}
|
|
51
|
+
export interface E2eWorkspaceTarget {
|
|
52
|
+
path: string;
|
|
53
|
+
packageName?: string;
|
|
54
|
+
project: E2eProjectProfile;
|
|
55
|
+
recommendedRunner: E2eRunnerRecommendation;
|
|
56
|
+
changedFiles: string[];
|
|
57
|
+
reason: string;
|
|
58
|
+
suggestedCommand: string;
|
|
59
|
+
}
|
|
60
|
+
export type E2eCoveragePriority = "critical" | "recommended" | "optional";
|
|
61
|
+
export interface E2eCoverageTarget {
|
|
62
|
+
title: string;
|
|
63
|
+
priority: E2eCoveragePriority;
|
|
64
|
+
reason: string;
|
|
65
|
+
checks: string[];
|
|
66
|
+
}
|
|
67
|
+
export interface E2eFlowLanguageBrief {
|
|
68
|
+
actor: string;
|
|
69
|
+
trigger: string;
|
|
70
|
+
goal: string;
|
|
71
|
+
successSignal: string;
|
|
72
|
+
reviewQuestion: string;
|
|
73
|
+
edgeCases: string[];
|
|
74
|
+
}
|
|
75
|
+
export interface E2eFlow {
|
|
76
|
+
title: string;
|
|
77
|
+
reason: string;
|
|
78
|
+
files: string[];
|
|
79
|
+
steps: string[];
|
|
80
|
+
languageBrief: E2eFlowLanguageBrief;
|
|
81
|
+
coverage: E2eCoverageTarget[];
|
|
82
|
+
coverageEvidence: CoverageEvidence[];
|
|
83
|
+
entrypoints: E2eEntrypoint[];
|
|
84
|
+
setupHints: E2eSetupHint[];
|
|
85
|
+
fixtureReadiness: E2eFixtureReadiness;
|
|
86
|
+
selectors: E2eSelector[];
|
|
87
|
+
missingTestability: string[];
|
|
88
|
+
}
|
|
89
|
+
export interface E2eEntrypoint {
|
|
90
|
+
kind: E2eEntrypointKind;
|
|
91
|
+
value: string;
|
|
92
|
+
file: string;
|
|
93
|
+
confidence: E2eEntrypointConfidence;
|
|
94
|
+
}
|
|
95
|
+
export interface E2eSetupHint {
|
|
96
|
+
kind: E2eSetupHintKind;
|
|
97
|
+
title: string;
|
|
98
|
+
detail: string;
|
|
99
|
+
files: string[];
|
|
100
|
+
confidence: E2eSetupHintConfidence;
|
|
101
|
+
}
|
|
102
|
+
export interface E2eSelector {
|
|
103
|
+
kind: E2eSelectorKind;
|
|
104
|
+
value: string;
|
|
105
|
+
file: string;
|
|
106
|
+
}
|
|
107
|
+
export interface E2eFixtureReadiness {
|
|
108
|
+
status: E2eFixtureReadinessStatus;
|
|
109
|
+
reason: string;
|
|
110
|
+
apiSignals: string[];
|
|
111
|
+
apiEndpoints: string[];
|
|
112
|
+
backendSignals: string[];
|
|
113
|
+
mockSignals: string[];
|
|
114
|
+
nextActions: string[];
|
|
115
|
+
}
|
|
116
|
+
export interface E2eValidationMatrixRow {
|
|
117
|
+
area: string;
|
|
118
|
+
category: E2eValidationMatrixCategory;
|
|
119
|
+
requiredEvidence: string;
|
|
120
|
+
currentEvidence: string;
|
|
121
|
+
status: E2eValidationMatrixStatus;
|
|
122
|
+
nextAction: string;
|
|
123
|
+
flowTitle?: string;
|
|
124
|
+
files: string[];
|
|
125
|
+
}
|
|
126
|
+
export interface E2eValidationMatrix {
|
|
127
|
+
rows: E2eValidationMatrixRow[];
|
|
128
|
+
summary: {
|
|
129
|
+
ready: number;
|
|
130
|
+
partial: number;
|
|
131
|
+
missing: number;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export interface E2eBootstrapStep {
|
|
135
|
+
category: E2eBootstrapStepCategory;
|
|
136
|
+
status: E2eBootstrapStepStatus;
|
|
137
|
+
title: string;
|
|
138
|
+
reason: string;
|
|
139
|
+
action: string;
|
|
140
|
+
commands: string[];
|
|
141
|
+
files: string[];
|
|
142
|
+
}
|
|
143
|
+
export interface E2eBootstrapPlan {
|
|
144
|
+
summary: string;
|
|
145
|
+
steps: E2eBootstrapStep[];
|
|
146
|
+
counts: {
|
|
147
|
+
required: number;
|
|
148
|
+
recommended: number;
|
|
149
|
+
ready: number;
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export interface E2ePlanResult {
|
|
153
|
+
tool: {
|
|
154
|
+
name: string;
|
|
155
|
+
version: string;
|
|
156
|
+
};
|
|
157
|
+
root: string;
|
|
158
|
+
workspaceRoot?: string;
|
|
159
|
+
generatedAt: string;
|
|
160
|
+
base: string;
|
|
161
|
+
head: string;
|
|
162
|
+
includeWorkingTree: boolean;
|
|
163
|
+
project: E2eProjectProfile;
|
|
164
|
+
recommendedRunner: E2eRunnerRecommendation;
|
|
165
|
+
executionProfile: E2eExecutionProfile;
|
|
166
|
+
runnerSetup: E2eRunnerSetupProposal;
|
|
167
|
+
testSuite: TestSuiteSummary;
|
|
168
|
+
coreFlowManifestPath?: string;
|
|
169
|
+
coreFlows: MatchedCoreFlow[];
|
|
170
|
+
domainManifestPath?: string;
|
|
171
|
+
domains: MatchedDomain[];
|
|
172
|
+
verificationManifestPath?: string;
|
|
173
|
+
verificationManifestMatches: VerificationManifestMatch[];
|
|
174
|
+
domainLanguage: DomainLanguageSummary;
|
|
175
|
+
changedFiles: TestPlanChangedFile[];
|
|
176
|
+
suggestedCommands: string[];
|
|
177
|
+
localHistory?: LocalHistoryReference;
|
|
178
|
+
workspaceTargets: E2eWorkspaceTarget[];
|
|
179
|
+
flows: E2eFlow[];
|
|
180
|
+
validationMatrix: E2eValidationMatrix;
|
|
181
|
+
bootstrap: E2eBootstrapPlan;
|
|
182
|
+
missingTestability: string[];
|
|
183
|
+
setupNotes: string[];
|
|
184
|
+
}
|
|
185
|
+
export type E2eRunnerSetupStatus = "ready" | "proposed" | "not-applicable";
|
|
186
|
+
export interface E2eRunnerSetupProposal {
|
|
187
|
+
runner: E2eRunnerName;
|
|
188
|
+
status: E2eRunnerSetupStatus;
|
|
189
|
+
title: string;
|
|
190
|
+
reason: string;
|
|
191
|
+
setupCommand?: string;
|
|
192
|
+
installCommands: string[];
|
|
193
|
+
filesToCreate: string[];
|
|
194
|
+
filesToUpdate: string[];
|
|
195
|
+
nextCommands: string[];
|
|
196
|
+
notes: string[];
|
|
197
|
+
}
|
|
198
|
+
export interface E2eDraftFile {
|
|
199
|
+
path: string;
|
|
200
|
+
flowTitle: string;
|
|
201
|
+
runner: E2eRunnerName;
|
|
202
|
+
status: "created" | "skipped" | "preview";
|
|
203
|
+
source?: "verification-manifest" | "domain-language" | "core-flow" | "heuristic";
|
|
204
|
+
changedFiles?: string[];
|
|
205
|
+
draftSteps?: string[];
|
|
206
|
+
entrypointHints?: string[];
|
|
207
|
+
selectorHints?: string[];
|
|
208
|
+
setupHints?: string[];
|
|
209
|
+
coverageTargets?: string[];
|
|
210
|
+
manifestUpdatePath?: string;
|
|
211
|
+
languageBrief?: E2eFlowLanguageBrief;
|
|
212
|
+
actionItems?: E2eDraftActionItem[];
|
|
213
|
+
promotionStatus?: E2eDraftPromotionStatus;
|
|
214
|
+
promotionReason?: string;
|
|
215
|
+
promotionAction?: string;
|
|
216
|
+
stability?: "ready" | "needs-selector" | "needs-setup" | "needs-selector-and-setup";
|
|
217
|
+
runnableStatus?: "runnable-candidate" | "near-runnable" | "review-only";
|
|
218
|
+
executionBlockers?: string[];
|
|
219
|
+
selfCheck?: E2eDraftSelfCheck;
|
|
220
|
+
todoCount?: number;
|
|
221
|
+
entrypointCount?: number;
|
|
222
|
+
primaryEntrypoint?: string;
|
|
223
|
+
setupHintCount?: number;
|
|
224
|
+
fixtureReadinessStatus?: E2eFixtureReadinessStatus;
|
|
225
|
+
inferredSelectorCount?: number;
|
|
226
|
+
coverageTargetCount?: number;
|
|
227
|
+
validationStatus?: E2eValidationMatrixStatus;
|
|
228
|
+
validationGapCount?: number;
|
|
229
|
+
blockingValidationGapCount?: number;
|
|
230
|
+
reason?: string;
|
|
231
|
+
}
|
|
232
|
+
export type E2eDraftActionKind = "assertion" | "fixture" | "manifest" | "runner" | "selector" | "setup" | "validation";
|
|
233
|
+
export type E2eDraftActionPriority = "required" | "recommended";
|
|
234
|
+
export type E2eDraftSelfCheckStatus = "pass" | "warning" | "fail";
|
|
235
|
+
export interface E2eDraftSelfCheckItem {
|
|
236
|
+
name: string;
|
|
237
|
+
status: E2eDraftSelfCheckStatus;
|
|
238
|
+
detail: string;
|
|
239
|
+
}
|
|
240
|
+
export interface E2eDraftSelfCheck {
|
|
241
|
+
status: E2eDraftSelfCheckStatus;
|
|
242
|
+
summary: string;
|
|
243
|
+
command?: string;
|
|
244
|
+
checks: E2eDraftSelfCheckItem[];
|
|
245
|
+
blockers: string[];
|
|
246
|
+
}
|
|
247
|
+
export interface E2eDraftActionItem {
|
|
248
|
+
kind: E2eDraftActionKind;
|
|
249
|
+
priority: E2eDraftActionPriority;
|
|
250
|
+
title: string;
|
|
251
|
+
detail: string;
|
|
252
|
+
}
|
|
253
|
+
export interface E2eDraftActionKindSummary {
|
|
254
|
+
kind: E2eDraftActionKind;
|
|
255
|
+
required: number;
|
|
256
|
+
recommended: number;
|
|
257
|
+
total: number;
|
|
258
|
+
}
|
|
259
|
+
export interface E2eDraftActionSummary {
|
|
260
|
+
required: number;
|
|
261
|
+
recommended: number;
|
|
262
|
+
readyFiles: number;
|
|
263
|
+
filesWithRequiredActions: number;
|
|
264
|
+
filesWithRecommendedActions: number;
|
|
265
|
+
byKind: E2eDraftActionKindSummary[];
|
|
266
|
+
}
|
|
267
|
+
export type E2eDraftPromotionStatus = "commit-candidate" | "needs-review" | "low-signal";
|
|
268
|
+
export type E2eDraftReadinessLevel = "ready" | "near-runnable" | "needs-work" | "blocked";
|
|
269
|
+
export interface E2eDraftReadinessSummary {
|
|
270
|
+
score: number;
|
|
271
|
+
level: E2eDraftReadinessLevel;
|
|
272
|
+
recommendation: string;
|
|
273
|
+
runnableCandidates: number;
|
|
274
|
+
nearRunnable: number;
|
|
275
|
+
reviewOnly: number;
|
|
276
|
+
selfCheckPass: number;
|
|
277
|
+
selfCheckWarning: number;
|
|
278
|
+
selfCheckFail: number;
|
|
279
|
+
filesWithTodos: number;
|
|
280
|
+
totalTodos: number;
|
|
281
|
+
filesWithExecutionBlockers: number;
|
|
282
|
+
totalExecutionBlockers: number;
|
|
283
|
+
topBlockers: string[];
|
|
284
|
+
}
|
|
285
|
+
export interface E2eDraftResult {
|
|
286
|
+
tool: {
|
|
287
|
+
name: string;
|
|
288
|
+
version: string;
|
|
289
|
+
};
|
|
290
|
+
root: string;
|
|
291
|
+
generatedAt: string;
|
|
292
|
+
runner: E2eRunnerName;
|
|
293
|
+
outputDirectory: string;
|
|
294
|
+
dryRun: boolean;
|
|
295
|
+
plan: E2ePlanResult;
|
|
296
|
+
files: E2eDraftFile[];
|
|
297
|
+
actionSummary: E2eDraftActionSummary;
|
|
298
|
+
readinessSummary: E2eDraftReadinessSummary;
|
|
299
|
+
nextSteps: string[];
|
|
300
|
+
}
|
|
301
|
+
export interface E2eSetupOptions extends E2ePlanOptions {
|
|
302
|
+
force?: boolean;
|
|
303
|
+
}
|
|
304
|
+
export interface E2eSetupResult {
|
|
305
|
+
tool: {
|
|
306
|
+
name: string;
|
|
307
|
+
version: string;
|
|
308
|
+
};
|
|
309
|
+
root: string;
|
|
310
|
+
runner: E2eRunnerName;
|
|
311
|
+
proposal: E2eRunnerSetupProposal;
|
|
312
|
+
createdFiles: string[];
|
|
313
|
+
updatedFiles: string[];
|
|
314
|
+
skippedFiles: string[];
|
|
315
|
+
installCommands: string[];
|
|
316
|
+
nextCommands: string[];
|
|
317
|
+
draftOutputDirectory?: string;
|
|
318
|
+
draftFiles: E2eDraftFile[];
|
|
319
|
+
draftReadinessSummary?: E2eDraftReadinessSummary;
|
|
320
|
+
}
|
|
321
|
+
export declare function generateE2ePlan(rootInput: string, options?: E2ePlanOptions): Promise<E2ePlanResult>;
|
|
322
|
+
export declare function generateE2eDraft(rootInput: string, options?: E2eDraftOptions): Promise<E2eDraftResult>;
|
|
323
|
+
export declare function formatMarkdownE2ePlan(result: E2ePlanResult): string;
|
|
324
|
+
export declare function formatMarkdownE2eDraft(result: E2eDraftResult): string;
|
|
325
|
+
export declare function formatMarkdownE2eSetup(result: E2eSetupResult): string;
|
|
326
|
+
export declare function setupE2eRunner(rootInput: string, options?: E2eSetupOptions): Promise<E2eSetupResult>;
|