@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.
Files changed (98) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/LICENSE +21 -0
  3. package/README.md +636 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +879 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +5 -0
  8. package/dist/config.js +114 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/context.d.ts +1 -0
  11. package/dist/context.js +126 -0
  12. package/dist/context.js.map +1 -0
  13. package/dist/doctor.d.ts +32 -0
  14. package/dist/doctor.js +200 -0
  15. package/dist/doctor.js.map +1 -0
  16. package/dist/domain-language.d.ts +25 -0
  17. package/dist/domain-language.js +655 -0
  18. package/dist/domain-language.js.map +1 -0
  19. package/dist/domains.d.ts +33 -0
  20. package/dist/domains.js +258 -0
  21. package/dist/domains.js.map +1 -0
  22. package/dist/e2e.d.ts +326 -0
  23. package/dist/e2e.js +6869 -0
  24. package/dist/e2e.js.map +1 -0
  25. package/dist/eval.d.ts +40 -0
  26. package/dist/eval.js +374 -0
  27. package/dist/eval.js.map +1 -0
  28. package/dist/flows.d.ts +32 -0
  29. package/dist/flows.js +246 -0
  30. package/dist/flows.js.map +1 -0
  31. package/dist/fs.d.ts +7 -0
  32. package/dist/fs.js +132 -0
  33. package/dist/fs.js.map +1 -0
  34. package/dist/github.d.ts +34 -0
  35. package/dist/github.js +183 -0
  36. package/dist/github.js.map +1 -0
  37. package/dist/history.d.ts +173 -0
  38. package/dist/history.js +247 -0
  39. package/dist/history.js.map +1 -0
  40. package/dist/index.d.ts +35 -0
  41. package/dist/index.js +20 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/manifest-suggestions.d.ts +67 -0
  44. package/dist/manifest-suggestions.js +673 -0
  45. package/dist/manifest-suggestions.js.map +1 -0
  46. package/dist/manifest.d.ts +212 -0
  47. package/dist/manifest.js +1607 -0
  48. package/dist/manifest.js.map +1 -0
  49. package/dist/qa.d.ts +53 -0
  50. package/dist/qa.js +361 -0
  51. package/dist/qa.js.map +1 -0
  52. package/dist/report.d.ts +5 -0
  53. package/dist/report.js +164 -0
  54. package/dist/report.js.map +1 -0
  55. package/dist/review.d.ts +31 -0
  56. package/dist/review.js +383 -0
  57. package/dist/review.js.map +1 -0
  58. package/dist/scanner.d.ts +3 -0
  59. package/dist/scanner.js +797 -0
  60. package/dist/scanner.js.map +1 -0
  61. package/dist/severity.d.ts +3 -0
  62. package/dist/severity.js +9 -0
  63. package/dist/severity.js.map +1 -0
  64. package/dist/test-evidence.d.ts +39 -0
  65. package/dist/test-evidence.js +303 -0
  66. package/dist/test-evidence.js.map +1 -0
  67. package/dist/test-plan.d.ts +35 -0
  68. package/dist/test-plan.js +573 -0
  69. package/dist/test-plan.js.map +1 -0
  70. package/dist/types.d.ts +60 -0
  71. package/dist/types.js +2 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/verify.d.ts +27 -0
  74. package/dist/verify.js +244 -0
  75. package/dist/verify.js.map +1 -0
  76. package/dist/version.d.ts +2 -0
  77. package/dist/version.js +3 -0
  78. package/dist/version.js.map +1 -0
  79. package/docs/adoption.md +166 -0
  80. package/docs/agent-skill.md +94 -0
  81. package/docs/api-contracts.md +30 -0
  82. package/docs/assets/qamap-30s-demo.gif +0 -0
  83. package/docs/configuration.md +277 -0
  84. package/docs/e2e-output-examples.md +464 -0
  85. package/docs/ecosystem.md +41 -0
  86. package/docs/eval.md +52 -0
  87. package/docs/github-action.md +89 -0
  88. package/docs/manifest.md +350 -0
  89. package/docs/quickstart-demo.md +268 -0
  90. package/docs/release-validation.md +247 -0
  91. package/docs/releasing.md +112 -0
  92. package/docs/roadmap.md +67 -0
  93. package/docs/rules.md +28 -0
  94. package/docs/verify.md +44 -0
  95. package/package.json +80 -0
  96. package/schema/qamap-manifest.schema.json +323 -0
  97. package/schema/qamap.schema.json +58 -0
  98. package/skills/qamap-pr-qa/SKILL.md +81 -0
@@ -0,0 +1,573 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promises as fs } from "node:fs";
3
+ import path from "node:path";
4
+ import { promisify } from "node:util";
5
+ import { TOOL_NAME, VERSION } from "./version.js";
6
+ const execFileAsync = promisify(execFile);
7
+ const maxFilesPerItem = 6;
8
+ export async function generateTestPlan(rootInput, options = {}) {
9
+ const root = path.resolve(rootInput);
10
+ const workspaceRoot = options.workspaceRoot ? path.resolve(options.workspaceRoot) : undefined;
11
+ const gitRoot = workspaceRoot ?? root;
12
+ const relativeRoot = workspaceRoot ? toPosixPath(path.relative(workspaceRoot, root)) : "";
13
+ if (workspaceRoot && (relativeRoot.startsWith("..") || path.isAbsolute(relativeRoot))) {
14
+ throw new Error(`Test plan path must be inside workspace root: ${root}`);
15
+ }
16
+ const base = options.base ?? (await defaultBaseRef(gitRoot));
17
+ const head = options.head ?? "HEAD";
18
+ const includeWorkingTree = options.includeWorkingTree ?? false;
19
+ const changedFiles = scopeChangedFiles(await getChangedFiles(gitRoot, base, head, includeWorkingTree), relativeRoot);
20
+ const suggestedCommands = uniqueCommands([
21
+ ...normalizeValidationCommands(options.validationCommands),
22
+ ...(await discoverSuggestedCommands(root, workspaceRoot)),
23
+ ]);
24
+ const items = buildPlanItems(changedFiles);
25
+ return {
26
+ tool: {
27
+ name: TOOL_NAME,
28
+ version: VERSION,
29
+ },
30
+ root,
31
+ workspaceRoot,
32
+ generatedAt: new Date().toISOString(),
33
+ base,
34
+ head,
35
+ includeWorkingTree,
36
+ changedFiles,
37
+ suggestedCommands,
38
+ items,
39
+ };
40
+ }
41
+ export function formatMarkdownTestPlan(result) {
42
+ const lines = [];
43
+ lines.push("# QAMap Test Plan");
44
+ lines.push("");
45
+ lines.push(`- Root: \`${escapeMarkdownInline(result.root)}\``);
46
+ if (result.workspaceRoot) {
47
+ lines.push(`- Workspace root: \`${escapeMarkdownInline(result.workspaceRoot)}\``);
48
+ }
49
+ lines.push(`- Base: \`${escapeMarkdownInline(result.base)}\``);
50
+ lines.push(`- Head: \`${escapeMarkdownInline(result.head)}\``);
51
+ if (result.includeWorkingTree) {
52
+ lines.push("- Includes working tree changes: yes");
53
+ }
54
+ lines.push(`- Changed files considered: ${result.changedFiles.length}`);
55
+ lines.push("");
56
+ if (result.suggestedCommands.length > 0) {
57
+ lines.push("## Suggested Commands");
58
+ lines.push("");
59
+ for (const command of result.suggestedCommands) {
60
+ lines.push(`- \`${escapeMarkdownInline(command)}\``);
61
+ }
62
+ lines.push("");
63
+ }
64
+ lines.push("## Suggested Domain Tests");
65
+ lines.push("");
66
+ if (result.items.length === 0) {
67
+ lines.push("No changed files were detected for a domain test plan.");
68
+ lines.push("");
69
+ return lines.join("\n");
70
+ }
71
+ for (const [index, item] of result.items.entries()) {
72
+ lines.push(`### ${index + 1}. ${escapeMarkdownInline(item.title)}`);
73
+ lines.push("");
74
+ lines.push(item.reason);
75
+ lines.push("");
76
+ lines.push("Files:");
77
+ for (const file of item.files.slice(0, maxFilesPerItem)) {
78
+ lines.push(`- \`${escapeMarkdownInline(file)}\``);
79
+ }
80
+ if (item.files.length > maxFilesPerItem) {
81
+ lines.push(`- ... ${item.files.length - maxFilesPerItem} more`);
82
+ }
83
+ lines.push("");
84
+ lines.push("Checks:");
85
+ for (const check of item.checks) {
86
+ lines.push(`- ${check}`);
87
+ }
88
+ lines.push("");
89
+ }
90
+ lines.push("## Changed Files");
91
+ lines.push("");
92
+ for (const file of result.changedFiles.slice(0, 30)) {
93
+ const renameSuffix = file.previousPath ? ` from \`${escapeMarkdownInline(file.previousPath)}\`` : "";
94
+ lines.push(`- \`${file.status}\` \`${escapeMarkdownInline(file.path)}\`${renameSuffix}`);
95
+ }
96
+ if (result.changedFiles.length > 30) {
97
+ lines.push(`- ... ${result.changedFiles.length - 30} more`);
98
+ }
99
+ lines.push("");
100
+ return lines.join("\n");
101
+ }
102
+ function buildPlanItems(changedFiles) {
103
+ const files = changedFiles.map((file) => file.path);
104
+ const items = [
105
+ buildWorkflowItem(files),
106
+ buildUiItem(files),
107
+ buildApiItem(files),
108
+ buildDomainConfigItem(files),
109
+ buildStateItem(files),
110
+ buildConfigItem(files),
111
+ buildTestCoverageItem(files),
112
+ ].filter((item) => Boolean(item));
113
+ if (items.length > 0) {
114
+ return items;
115
+ }
116
+ if (changedFiles.length === 0) {
117
+ return [];
118
+ }
119
+ return [
120
+ {
121
+ title: "Changed-file smoke path",
122
+ reason: "The branch changes files that do not match a specialized domain pattern.",
123
+ files: files.slice(0, maxFilesPerItem),
124
+ checks: [
125
+ "Run the nearest automated test command for the touched package.",
126
+ "Exercise the primary user or maintainer workflow that imports the changed files.",
127
+ "Check error, empty, and permission-denied states if the changed code is user-facing.",
128
+ ],
129
+ },
130
+ ];
131
+ }
132
+ function buildWorkflowItem(files) {
133
+ const matched = files.filter((file) => /(?:^|\/)(features|domains|modules|services)\/[^/]+/i.test(file));
134
+ if (matched.length === 0) {
135
+ return undefined;
136
+ }
137
+ const domains = summarizeDomains(matched);
138
+ return {
139
+ title: `${domains} workflow regression`,
140
+ reason: "Feature or domain-owned files changed, so reviewers should verify the end-to-end business path.",
141
+ files: matched,
142
+ checks: [
143
+ "Verify the happy path for the affected domain from entry point to completion.",
144
+ "Verify at least one blocked, rejected, or invalid-state path.",
145
+ "Verify persistence or navigation after refresh, back navigation, or re-entry.",
146
+ ],
147
+ };
148
+ }
149
+ function buildUiItem(files) {
150
+ const matched = files.filter((file) => /(?:^|\/)(pages|app|routes|screens|components|navigations?)\//i.test(file) || /\.(tsx|jsx|vue|svelte)$/i.test(file));
151
+ if (matched.length === 0) {
152
+ return undefined;
153
+ }
154
+ return {
155
+ title: "User-facing UI states",
156
+ reason: "User-facing route, screen, navigation, or component files changed.",
157
+ files: matched,
158
+ checks: [
159
+ "Render the affected view with realistic production-like data.",
160
+ "Verify loading, empty, error, and success states.",
161
+ "Check the smallest supported viewport and the primary desktop viewport for layout regressions.",
162
+ ],
163
+ };
164
+ }
165
+ function buildApiItem(files) {
166
+ const matched = files.filter((file) => /(?:api|apis|client|clients|queries|mutations|graphql|trpc|rpc|proto|openapi|swagger|endpoint|request|response)/i.test(file));
167
+ if (matched.length === 0) {
168
+ return undefined;
169
+ }
170
+ return {
171
+ title: "API contract and failure handling",
172
+ reason: "API client, schema, request, response, or endpoint-related files changed.",
173
+ files: matched,
174
+ checks: [
175
+ "Verify request parameters, response shape, and type generation or parsing.",
176
+ "Verify 4xx, 5xx, timeout, and network-failure handling.",
177
+ "Check backward compatibility for existing callers or clients.",
178
+ ],
179
+ };
180
+ }
181
+ function buildDomainConfigItem(files) {
182
+ const matched = files.filter((file) => /(?:^|\/)(features|domains|modules|services)\/[^/]+\/(?:config|configs)\//i.test(file));
183
+ if (matched.length === 0) {
184
+ return undefined;
185
+ }
186
+ return {
187
+ title: "Domain configuration and variants",
188
+ reason: "Domain-owned configuration files changed, so variant-specific behavior should be verified.",
189
+ files: matched,
190
+ checks: [
191
+ "Verify each new or changed configuration branch maps to the expected domain variant.",
192
+ "Verify fallback behavior when the configuration key is absent, disabled, or unknown.",
193
+ "Check copy, visibility, analytics, and navigation that depend on the configuration.",
194
+ ],
195
+ };
196
+ }
197
+ function buildStateItem(files) {
198
+ const matched = files.filter((file) => /(?:^|\/)(stores?|states?|reducers?|atoms?|selectors?|contexts?|providers?|cache|session|auth|permissions?|guards?)\//i.test(file) || /(?:^|\/)[^/]*(?:auth|permission|session|cache|guard)[^/]*\.[cm]?[jt]sx?$/i.test(file));
199
+ if (matched.length === 0) {
200
+ return undefined;
201
+ }
202
+ return {
203
+ title: "State, auth, and permission transitions",
204
+ reason: "State management, auth, permission, cache, or provider files changed.",
205
+ files: matched,
206
+ checks: [
207
+ "Verify state transitions before and after the changed action.",
208
+ "Verify unauthorized, expired-session, and permission-denied behavior.",
209
+ "Verify cached data is invalidated or preserved intentionally.",
210
+ ],
211
+ };
212
+ }
213
+ function buildConfigItem(files) {
214
+ const matched = files.filter((file) => /(?:package\.json|pnpm-lock\.yaml|yarn\.lock|package-lock\.json|pyproject\.toml|requirements\.txt|go\.mod|go\.sum|Cargo\.toml|Cargo\.lock|pom\.xml|build\.gradle|gradle\.properties|vite|webpack|babel|tsconfig|next\.config|app\.config|eas\.json|docker|env)/i.test(file));
215
+ if (matched.length === 0) {
216
+ return undefined;
217
+ }
218
+ return {
219
+ title: "Build, runtime, and environment configuration",
220
+ reason: "Dependency, build, runtime, or environment configuration changed.",
221
+ files: matched,
222
+ checks: [
223
+ "Run install or lockfile validation in a clean checkout.",
224
+ "Run build and typecheck for the affected package.",
225
+ "Verify required environment variables and defaults for local, staging, and production-like runs.",
226
+ ],
227
+ };
228
+ }
229
+ function buildTestCoverageItem(files) {
230
+ const matched = files.filter((file) => isTestLikeFile(file));
231
+ if (matched.length === 0) {
232
+ return undefined;
233
+ }
234
+ return {
235
+ title: "Test coverage integrity",
236
+ reason: "Test files changed, so the test suite itself needs a sanity check.",
237
+ files: matched,
238
+ checks: [
239
+ "Run the changed tests alone and as part of the nearest suite.",
240
+ "Check that assertions fail for the right reason by reviewing the behavior under test.",
241
+ "Avoid snapshot-only coverage for new domain behavior unless paired with explicit assertions.",
242
+ ],
243
+ };
244
+ }
245
+ async function discoverSuggestedCommands(root, workspaceRoot) {
246
+ const commandGroups = await Promise.all([
247
+ discoverJavaScriptCommands(root, workspaceRoot),
248
+ discoverPythonCommands(root),
249
+ discoverGoCommands(root),
250
+ discoverRustCommands(root),
251
+ discoverJvmCommands(root),
252
+ ]);
253
+ return uniqueCommands(commandGroups.flat());
254
+ }
255
+ async function discoverJavaScriptCommands(root, workspaceRoot) {
256
+ const packageJsonPath = path.join(root, "package.json");
257
+ let parsed;
258
+ try {
259
+ parsed = JSON.parse(await fs.readFile(packageJsonPath, "utf8"));
260
+ }
261
+ catch {
262
+ return [];
263
+ }
264
+ const packageManager = await detectPackageManager(root, parsed.packageManager, workspaceRoot);
265
+ const preferredScripts = ["test", "typecheck", "lint", "build", "test:e2e", "e2e"];
266
+ return preferredScripts
267
+ .filter((script) => isUsableScript(parsed.scripts?.[script]))
268
+ .map((script) => (script === "test" ? `${packageManager} test` : `${packageManager} run ${script}`));
269
+ }
270
+ async function discoverPythonCommands(root) {
271
+ const pyproject = await readTextIfExists(path.join(root, "pyproject.toml"));
272
+ const hasPythonMarker = Boolean(pyproject) ||
273
+ (await hasAnyFile(root, [
274
+ "requirements.txt",
275
+ "setup.py",
276
+ "setup.cfg",
277
+ "tox.ini",
278
+ "pytest.ini",
279
+ "uv.lock",
280
+ "poetry.lock",
281
+ "Pipfile",
282
+ ]));
283
+ if (!hasPythonMarker) {
284
+ return [];
285
+ }
286
+ const runner = await detectPythonRunner(root, pyproject);
287
+ const commands = [];
288
+ const hasToxSignal = await exists(path.join(root, "tox.ini"));
289
+ const hasPytestSignal = /\bpytest\b|\[tool\.pytest/i.test(pyproject ?? "") ||
290
+ (await exists(path.join(root, "pytest.ini"))) ||
291
+ (await hasDirectory(path.join(root, "tests")));
292
+ const hasRuffSignal = /\[tool\.ruff/i.test(pyproject ?? "") || (await hasAnyFile(root, ["ruff.toml", ".ruff.toml"]));
293
+ const hasMypySignal = /\[tool\.mypy/i.test(pyproject ?? "") || (await hasAnyFile(root, ["mypy.ini", ".mypy.ini"]));
294
+ if (hasToxSignal) {
295
+ commands.push(withRunner(runner, "tox"));
296
+ }
297
+ if (hasPytestSignal) {
298
+ commands.push(withRunner(runner, "pytest"));
299
+ }
300
+ if (hasRuffSignal) {
301
+ commands.push(withRunner(runner, "ruff check ."));
302
+ }
303
+ if (hasMypySignal) {
304
+ commands.push(withRunner(runner, "mypy ."));
305
+ }
306
+ return commands;
307
+ }
308
+ async function detectPythonRunner(root, pyproject) {
309
+ if (await exists(path.join(root, "uv.lock"))) {
310
+ return "uv run";
311
+ }
312
+ if (/\[tool\.poetry/i.test(pyproject ?? "") || (await exists(path.join(root, "poetry.lock")))) {
313
+ return "poetry run";
314
+ }
315
+ return undefined;
316
+ }
317
+ async function discoverGoCommands(root) {
318
+ if (!(await exists(path.join(root, "go.mod")))) {
319
+ return [];
320
+ }
321
+ const commands = ["go test ./...", "go vet ./..."];
322
+ if (await hasAnyFile(root, [".golangci.yml", ".golangci.yaml", "golangci.yml", "golangci.yaml"])) {
323
+ commands.push("golangci-lint run");
324
+ }
325
+ return commands;
326
+ }
327
+ async function discoverRustCommands(root) {
328
+ if (!(await exists(path.join(root, "Cargo.toml")))) {
329
+ return [];
330
+ }
331
+ return ["cargo test", "cargo clippy --all-targets --all-features", "cargo build"];
332
+ }
333
+ async function discoverJvmCommands(root) {
334
+ if (await exists(path.join(root, "gradlew"))) {
335
+ return ["./gradlew test", "./gradlew build"];
336
+ }
337
+ if (await hasAnyFile(root, ["build.gradle", "build.gradle.kts", "settings.gradle", "settings.gradle.kts"])) {
338
+ return ["gradle test", "gradle build"];
339
+ }
340
+ if (await exists(path.join(root, "pom.xml"))) {
341
+ return ["mvn test", "mvn verify"];
342
+ }
343
+ return [];
344
+ }
345
+ async function detectPackageManager(root, packageManager, workspaceRoot) {
346
+ const workspacePackageManager = workspaceRoot && workspaceRoot !== root ? await readPackageManager(workspaceRoot) : undefined;
347
+ const declaredPackageManager = packageManager ?? workspacePackageManager;
348
+ if (declaredPackageManager?.startsWith("pnpm@")) {
349
+ return "pnpm";
350
+ }
351
+ if (declaredPackageManager?.startsWith("yarn@")) {
352
+ return "yarn";
353
+ }
354
+ if (declaredPackageManager?.startsWith("bun@")) {
355
+ return "bun";
356
+ }
357
+ if (await existsInRoots("pnpm-lock.yaml", root, workspaceRoot)) {
358
+ return "pnpm";
359
+ }
360
+ if (await existsInRoots("yarn.lock", root, workspaceRoot)) {
361
+ return "yarn";
362
+ }
363
+ if (await existsInRoots("bun.lockb", root, workspaceRoot)) {
364
+ return "bun";
365
+ }
366
+ return "npm";
367
+ }
368
+ async function readPackageManager(root) {
369
+ try {
370
+ const parsed = JSON.parse(await fs.readFile(path.join(root, "package.json"), "utf8"));
371
+ return parsed.packageManager;
372
+ }
373
+ catch {
374
+ return undefined;
375
+ }
376
+ }
377
+ async function existsInRoots(fileName, root, workspaceRoot) {
378
+ if (await exists(path.join(root, fileName))) {
379
+ return true;
380
+ }
381
+ return Boolean(workspaceRoot && workspaceRoot !== root && (await exists(path.join(workspaceRoot, fileName))));
382
+ }
383
+ function isUsableScript(script) {
384
+ return Boolean(script && !/no test specified|exit\s+1/i.test(script));
385
+ }
386
+ async function hasAnyFile(root, fileNames) {
387
+ for (const fileName of fileNames) {
388
+ if (await exists(path.join(root, fileName))) {
389
+ return true;
390
+ }
391
+ }
392
+ return false;
393
+ }
394
+ async function hasDirectory(directoryPath) {
395
+ try {
396
+ const stat = await fs.stat(directoryPath);
397
+ return stat.isDirectory();
398
+ }
399
+ catch {
400
+ return false;
401
+ }
402
+ }
403
+ async function readTextIfExists(filePath) {
404
+ try {
405
+ return await fs.readFile(filePath, "utf8");
406
+ }
407
+ catch {
408
+ return undefined;
409
+ }
410
+ }
411
+ function withRunner(runner, command) {
412
+ return runner ? `${runner} ${command}` : command;
413
+ }
414
+ function uniqueCommands(commands) {
415
+ return commands.filter((command, index) => commands.indexOf(command) === index);
416
+ }
417
+ function normalizeValidationCommands(commands) {
418
+ return (commands ?? []).map((command) => command.trim()).filter(Boolean);
419
+ }
420
+ function isTestLikeFile(filePath) {
421
+ return (/(?:^|\/)(__tests__|tests?|specs?|e2e)\//i.test(filePath) ||
422
+ /(\.|-)(test|spec)\.[cm]?[jt]sx?$/i.test(filePath) ||
423
+ /(?:^|\/)test_[^/]+\.py$/i.test(filePath) ||
424
+ /(?:^|\/)[^/]+_test\.(?:py|go)$/i.test(filePath) ||
425
+ /(?:^|\/)[^/]+(?:Test|Tests|Spec)\.(?:java|kt|cs|swift)$/i.test(filePath) ||
426
+ /(?:^|\/)[^/]+_(?:test|spec)\.rs$/i.test(filePath));
427
+ }
428
+ async function exists(filePath) {
429
+ try {
430
+ await fs.access(filePath);
431
+ return true;
432
+ }
433
+ catch {
434
+ return false;
435
+ }
436
+ }
437
+ function summarizeDomains(files) {
438
+ const domains = [...new Set(files.map(domainFromPath).filter((domain) => Boolean(domain)))];
439
+ if (domains.length === 0) {
440
+ return "Domain";
441
+ }
442
+ return domains.slice(0, 3).map(titleCase).join(" / ");
443
+ }
444
+ function domainFromPath(file) {
445
+ const segments = file.split("/");
446
+ for (const key of ["features", "domains", "modules", "services"]) {
447
+ const index = segments.indexOf(key);
448
+ if (index >= 0 && segments[index + 1]) {
449
+ return segments[index + 1];
450
+ }
451
+ }
452
+ return undefined;
453
+ }
454
+ function titleCase(value) {
455
+ return value
456
+ .split(/[-_\s]+/)
457
+ .filter(Boolean)
458
+ .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)
459
+ .join(" ");
460
+ }
461
+ function scopeChangedFiles(changedFiles, relativeRoot) {
462
+ if (!relativeRoot) {
463
+ return changedFiles;
464
+ }
465
+ const prefix = `${relativeRoot}/`;
466
+ return changedFiles
467
+ .flatMap((file) => {
468
+ const scopedPath = stripScopedPath(file.path, relativeRoot, prefix);
469
+ if (!scopedPath) {
470
+ return [];
471
+ }
472
+ const previousPath = file.previousPath
473
+ ? stripScopedPath(file.previousPath, relativeRoot, prefix) ?? file.previousPath
474
+ : undefined;
475
+ return [
476
+ {
477
+ ...file,
478
+ path: scopedPath,
479
+ previousPath,
480
+ },
481
+ ];
482
+ });
483
+ }
484
+ function stripScopedPath(filePath, relativeRoot, prefix) {
485
+ if (filePath === relativeRoot) {
486
+ return ".";
487
+ }
488
+ if (filePath.startsWith(prefix)) {
489
+ return filePath.slice(prefix.length);
490
+ }
491
+ return undefined;
492
+ }
493
+ async function defaultBaseRef(root) {
494
+ for (const candidate of ["origin/main", "main", "origin/master", "master"]) {
495
+ try {
496
+ await git(root, ["rev-parse", "--verify", "--quiet", candidate]);
497
+ return candidate;
498
+ }
499
+ catch {
500
+ // Try the next common default branch name.
501
+ }
502
+ }
503
+ throw new Error("Could not infer a base ref. Pass --base <ref>.");
504
+ }
505
+ async function getChangedFiles(root, base, head, includeWorkingTree) {
506
+ const { stdout } = await git(root, ["diff", "--name-status", "--diff-filter=ACMRTUXB", `${base}...${head}`]);
507
+ const committedChanges = parseChangedFiles(stdout);
508
+ if (!includeWorkingTree) {
509
+ return committedChanges;
510
+ }
511
+ return mergeChangedFiles(committedChanges, await getWorkingTreeChangedFiles(root));
512
+ }
513
+ async function getWorkingTreeChangedFiles(root) {
514
+ const { stdout: trackedStdout } = await git(root, ["diff", "--name-status", "--diff-filter=ACMRTUXB", "HEAD"]);
515
+ const { stdout: untrackedStdout } = await git(root, ["ls-files", "--others", "--exclude-standard"]);
516
+ return [
517
+ ...parseChangedFiles(trackedStdout),
518
+ ...untrackedStdout
519
+ .split(/\r?\n/)
520
+ .map((line) => line.trim())
521
+ .filter(Boolean)
522
+ .map((filePath) => ({ status: "A", path: filePath })),
523
+ ];
524
+ }
525
+ function parseChangedFiles(stdout) {
526
+ return stdout
527
+ .split(/\r?\n/)
528
+ .map((line) => line.trim())
529
+ .filter(Boolean)
530
+ .map(parseChangedFile);
531
+ }
532
+ function mergeChangedFiles(...groups) {
533
+ const filesByPath = new Map();
534
+ for (const group of groups) {
535
+ for (const file of group) {
536
+ filesByPath.set(file.path, file);
537
+ }
538
+ }
539
+ return [...filesByPath.values()];
540
+ }
541
+ function parseChangedFile(line) {
542
+ const [status, firstPath, secondPath] = line.split(/\t+/);
543
+ if (!status || !firstPath) {
544
+ throw new Error(`Could not parse git diff entry: ${line}`);
545
+ }
546
+ if (status.startsWith("R") || status.startsWith("C")) {
547
+ return {
548
+ status,
549
+ previousPath: firstPath,
550
+ path: secondPath ?? firstPath,
551
+ };
552
+ }
553
+ return {
554
+ status,
555
+ path: firstPath,
556
+ };
557
+ }
558
+ async function git(root, args) {
559
+ try {
560
+ return await execFileAsync("git", args, { cwd: root, maxBuffer: 10 * 1024 * 1024 });
561
+ }
562
+ catch (error) {
563
+ const message = error instanceof Error ? error.message : String(error);
564
+ throw new Error(`git ${args.join(" ")} failed: ${message}`);
565
+ }
566
+ }
567
+ function toPosixPath(value) {
568
+ return value.split(path.sep).join("/");
569
+ }
570
+ function escapeMarkdownInline(value) {
571
+ return value.replaceAll("`", "'");
572
+ }
573
+ //# sourceMappingURL=test-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-plan.js","sourceRoot":"","sources":["../src/test-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export declare const severities: readonly ["info", "low", "medium", "high"];
2
+ export type Severity = (typeof severities)[number];
3
+ export interface Finding {
4
+ id: string;
5
+ title: string;
6
+ severity: Severity;
7
+ originalSeverity?: Severity;
8
+ message: string;
9
+ recommendation: string;
10
+ file?: string;
11
+ evidence?: string;
12
+ }
13
+ export interface ScanCounts {
14
+ info: number;
15
+ low: number;
16
+ medium: number;
17
+ high: number;
18
+ }
19
+ export interface ScanResult {
20
+ tool: {
21
+ name: string;
22
+ version: string;
23
+ };
24
+ root: string;
25
+ workspaceRoot?: string;
26
+ scannedAt: string;
27
+ filesInspected: number;
28
+ config?: {
29
+ path?: string;
30
+ ignoredRules: string[];
31
+ severityOverrides: Record<string, Severity>;
32
+ };
33
+ findings: Finding[];
34
+ counts: ScanCounts;
35
+ }
36
+ export interface ScanOptions {
37
+ maxFiles?: number;
38
+ workspaceRoot?: string;
39
+ configPath?: string;
40
+ ignoreRules?: string[];
41
+ severityOverrides?: Record<string, Severity>;
42
+ }
43
+ export interface ProjectFile {
44
+ path: string;
45
+ absolutePath: string;
46
+ size: number;
47
+ text?: string;
48
+ }
49
+ export interface QAMapConfig {
50
+ $schema?: string;
51
+ failOn?: Severity;
52
+ ignoreRules?: string[];
53
+ maxFiles?: number;
54
+ severity?: Record<string, Severity>;
55
+ validationCommands?: string[];
56
+ }
57
+ export interface ResolvedQAMapConfig {
58
+ path?: string;
59
+ config: QAMapConfig;
60
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export const severities = ["info", "low", "medium", "high"];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC"}