@audit-tools/shared 0.1.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/git.d.ts +18 -0
  2. package/dist/git.d.ts.map +1 -0
  3. package/dist/git.js +63 -0
  4. package/dist/git.js.map +1 -0
  5. package/dist/index.d.ts +17 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +9 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/observability/runLog.d.ts +31 -0
  10. package/dist/observability/runLog.d.ts.map +1 -0
  11. package/dist/observability/runLog.js +40 -0
  12. package/dist/observability/runLog.js.map +1 -0
  13. package/dist/quota/errorParsing.d.ts.map +1 -1
  14. package/dist/quota/errorParsing.js +13 -1
  15. package/dist/quota/errorParsing.js.map +1 -1
  16. package/dist/quota/limits.d.ts.map +1 -1
  17. package/dist/quota/limits.js +2 -13
  18. package/dist/quota/limits.js.map +1 -1
  19. package/dist/tokens.d.ts +29 -0
  20. package/dist/tokens.d.ts.map +1 -0
  21. package/dist/tokens.js +59 -0
  22. package/dist/tokens.js.map +1 -0
  23. package/dist/tooling/analyzerDeps.d.ts +43 -0
  24. package/dist/tooling/analyzerDeps.d.ts.map +1 -0
  25. package/dist/tooling/analyzerDeps.js +112 -0
  26. package/dist/tooling/analyzerDeps.js.map +1 -0
  27. package/dist/tooling/exec.d.ts +48 -0
  28. package/dist/tooling/exec.d.ts.map +1 -0
  29. package/dist/tooling/exec.js +108 -0
  30. package/dist/tooling/exec.js.map +1 -0
  31. package/dist/tooling/repoConventions.d.ts +21 -0
  32. package/dist/tooling/repoConventions.d.ts.map +1 -0
  33. package/dist/tooling/repoConventions.js +162 -0
  34. package/dist/tooling/repoConventions.js.map +1 -0
  35. package/dist/tooling/testCommand.d.ts +17 -0
  36. package/dist/tooling/testCommand.d.ts.map +1 -0
  37. package/dist/tooling/testCommand.js +78 -0
  38. package/dist/tooling/testCommand.js.map +1 -0
  39. package/dist/types/finding.d.ts +80 -0
  40. package/dist/types/finding.d.ts.map +1 -0
  41. package/dist/types/finding.js +8 -0
  42. package/dist/types/finding.js.map +1 -0
  43. package/dist/types/graph.d.ts +6 -0
  44. package/dist/types/graph.d.ts.map +1 -1
  45. package/dist/types/remediationOutcome.d.ts +21 -0
  46. package/dist/types/remediationOutcome.d.ts.map +1 -0
  47. package/dist/types/remediationOutcome.js +7 -0
  48. package/dist/types/remediationOutcome.js.map +1 -0
  49. package/dist/types/sessionConfig.d.ts +46 -0
  50. package/dist/types/sessionConfig.d.ts.map +1 -1
  51. package/dist/types/sessionConfig.js +22 -0
  52. package/dist/types/sessionConfig.js.map +1 -1
  53. package/package.json +41 -29
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzerDeps.js","sourceRoot":"","sources":["../../src/tooling/analyzerDeps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { type StdioOptions } from "node:child_process";
2
+ export interface RunTrackedOptions {
3
+ cwd?: string;
4
+ env?: NodeJS.ProcessEnv;
5
+ encoding?: BufferEncoding;
6
+ timeout?: number;
7
+ input?: string;
8
+ maxBuffer?: number;
9
+ windowsHide?: boolean;
10
+ stdio?: StdioOptions;
11
+ /**
12
+ * Wrap the command as `<opentoken> wrap <argv>`. Pass the opentoken binary
13
+ * name or path. When unset, no wrapping is applied.
14
+ */
15
+ opentoken?: string;
16
+ /** Override the platform; for tests. Defaults to `process.platform`. */
17
+ platform?: NodeJS.Platform;
18
+ }
19
+ export interface RunTrackedResult {
20
+ status: number | null;
21
+ stdout: string;
22
+ stderr: string;
23
+ /** The argv actually spawned, after platform/opentoken wrapping. */
24
+ argv: string[];
25
+ error?: Error;
26
+ }
27
+ /** Quote a single argv token for a `cmd.exe /c "..."` command line. */
28
+ export declare function quoteForCmd(arg: string): string;
29
+ /**
30
+ * On Windows, package-manager shims (`npm`/`npx`/`pnpm`/`yarn`) are `.cmd`
31
+ * batch files that `spawn` cannot launch without a shell. Map them to their
32
+ * `.cmd` form so the batch-wrapping path below applies. Anything already
33
+ * carrying an executable extension is returned unchanged.
34
+ */
35
+ export declare function platformCommand(command: string, platform?: NodeJS.Platform): string;
36
+ /**
37
+ * Resolve a logical argv into the concrete `[command, ...args]` that should be
38
+ * spawned on this platform, applying package-manager shim mapping, optional
39
+ * opentoken wrapping, and Windows batch wrapping. Exposed for callers that
40
+ * spawn asynchronously and only need the resolved argv.
41
+ */
42
+ export declare function resolveExecArgv(argv: string[], options?: {
43
+ opentoken?: string;
44
+ platform?: NodeJS.Platform;
45
+ }): string[];
46
+ /** Run a command synchronously. argv[0] is the command, the rest are args. */
47
+ export declare function runTracked(argv: string[], options?: RunTrackedOptions): RunTrackedResult;
48
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/tooling/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlE,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAID,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAKR;AAqCD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;CAAO,GAC/D,MAAM,EAAE,CAWV;AAOD,8EAA8E;AAC9E,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAgClB"}
@@ -0,0 +1,108 @@
1
+ import { spawnSync } from "node:child_process";
2
+ const SHELL_SHIM_COMMANDS = new Set(["npm", "npx", "pnpm", "yarn"]);
3
+ /** Quote a single argv token for a `cmd.exe /c "..."` command line. */
4
+ export function quoteForCmd(arg) {
5
+ if (arg.length === 0)
6
+ return '""';
7
+ if (!/[\s"]/u.test(arg))
8
+ return arg;
9
+ return `"${arg.replace(/"/g, '""')}"`;
10
+ }
11
+ /**
12
+ * On Windows, package-manager shims (`npm`/`npx`/`pnpm`/`yarn`) are `.cmd`
13
+ * batch files that `spawn` cannot launch without a shell. Map them to their
14
+ * `.cmd` form so the batch-wrapping path below applies. Anything already
15
+ * carrying an executable extension is returned unchanged.
16
+ */
17
+ export function platformCommand(command, platform = process.platform) {
18
+ if (platform !== "win32")
19
+ return command;
20
+ if (/\.(?:cmd|bat|com|exe)$/iu.test(command))
21
+ return command;
22
+ if (SHELL_SHIM_COMMANDS.has(command))
23
+ return `${command}.cmd`;
24
+ return command;
25
+ }
26
+ function isWindowsBatch(command, platform) {
27
+ return platform === "win32" && /\.(cmd|bat)$/iu.test(command);
28
+ }
29
+ function wrapForWindowsBatch(command, args, platform) {
30
+ if (!isWindowsBatch(command, platform))
31
+ return { command, args };
32
+ return {
33
+ command: process.env.ComSpec ?? "cmd.exe",
34
+ args: ["/d", "/s", "/c", [command, ...args].map(quoteForCmd).join(" ")],
35
+ };
36
+ }
37
+ function quoteForOpenTokenCmd(value) {
38
+ if (/^[A-Za-z0-9_./:=@+-]+$/u.test(value))
39
+ return value;
40
+ return `"${value.replace(/(["^&|<>%])/g, "^$1")}"`;
41
+ }
42
+ function wrapForOpenToken(command, args, opentoken, platform) {
43
+ if (platform === "win32") {
44
+ const shell = process.env.ComSpec ?? "cmd.exe";
45
+ const inner = [command, ...args].map(quoteForOpenTokenCmd).join(" ");
46
+ return { command: shell, args: ["/d", "/s", "/c", `${opentoken} wrap ${inner}`] };
47
+ }
48
+ return { command: opentoken, args: ["wrap", command, ...args] };
49
+ }
50
+ /**
51
+ * Resolve a logical argv into the concrete `[command, ...args]` that should be
52
+ * spawned on this platform, applying package-manager shim mapping, optional
53
+ * opentoken wrapping, and Windows batch wrapping. Exposed for callers that
54
+ * spawn asynchronously and only need the resolved argv.
55
+ */
56
+ export function resolveExecArgv(argv, options = {}) {
57
+ if (argv.length === 0)
58
+ return [];
59
+ const platform = options.platform ?? process.platform;
60
+ const command = platformCommand(argv[0], platform);
61
+ const args = argv.slice(1);
62
+ if (options.opentoken) {
63
+ const wrapped = wrapForOpenToken(command, args, options.opentoken, platform);
64
+ return [wrapped.command, ...wrapped.args];
65
+ }
66
+ const wrapped = wrapForWindowsBatch(command, args, platform);
67
+ return [wrapped.command, ...wrapped.args];
68
+ }
69
+ function toText(value) {
70
+ if (value == null)
71
+ return "";
72
+ return typeof value === "string" ? value : value.toString();
73
+ }
74
+ /** Run a command synchronously. argv[0] is the command, the rest are args. */
75
+ export function runTracked(argv, options = {}) {
76
+ if (argv.length === 0) {
77
+ return {
78
+ status: null,
79
+ stdout: "",
80
+ stderr: "",
81
+ argv: [],
82
+ error: new Error("runTracked requires a non-empty argv"),
83
+ };
84
+ }
85
+ const resolved = resolveExecArgv(argv, {
86
+ opentoken: options.opentoken,
87
+ platform: options.platform,
88
+ });
89
+ const result = spawnSync(resolved[0], resolved.slice(1), {
90
+ cwd: options.cwd,
91
+ env: options.env,
92
+ encoding: options.encoding ?? "utf8",
93
+ timeout: options.timeout,
94
+ input: options.input,
95
+ maxBuffer: options.maxBuffer,
96
+ windowsHide: options.windowsHide ?? true,
97
+ stdio: options.stdio,
98
+ shell: false,
99
+ });
100
+ return {
101
+ status: result.status,
102
+ stdout: toText(result.stdout),
103
+ stderr: toText(result.stderr),
104
+ argv: resolved,
105
+ error: result.error,
106
+ };
107
+ }
108
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/tooling/exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Lightweight, deterministic detection of a repository's house style so the
3
+ * remediator's worker prompts can say "match the surrounding code" with
4
+ * specifics (formatter, linter, test framework, module style, and a sampled
5
+ * snippet). Best-effort and side-effect-free: every probe is guarded and an
6
+ * undetected field is simply omitted. Phase 7A.
7
+ */
8
+ export interface RepoConventions {
9
+ formatter?: string;
10
+ linter?: string;
11
+ test_framework?: string;
12
+ module_style?: "esm" | "commonjs";
13
+ indentation?: string;
14
+ quote_style?: "single" | "double";
15
+ /** A short excerpt from a representative source file. */
16
+ sample_snippet?: string;
17
+ }
18
+ export declare function detectRepoConventions(root: string): RepoConventions;
19
+ /** Render a prompt block from detected conventions, or "" if nothing detected. */
20
+ export declare function formatRepoConventions(conventions: RepoConventions): string;
21
+ //# sourceMappingURL=repoConventions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoConventions.d.ts","sourceRoot":"","sources":["../../src/tooling/repoConventions.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAClC,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA4ID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAqBnE;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,CAuB1E"}
@@ -0,0 +1,162 @@
1
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const SAMPLE_DIRECTORIES = ["src", "lib", "app", "."];
4
+ const SAMPLE_EXTENSIONS = [".ts", ".tsx", ".js", ".mjs", ".py", ".go"];
5
+ const SAMPLE_MAX_LINES = 24;
6
+ function readJson(path) {
7
+ try {
8
+ return JSON.parse(readFileSync(path, "utf8"));
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
14
+ function readText(path) {
15
+ try {
16
+ return readFileSync(path, "utf8");
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ }
22
+ function hasDependency(pkg, name) {
23
+ if (!pkg)
24
+ return false;
25
+ for (const field of ["dependencies", "devDependencies", "peerDependencies"]) {
26
+ const deps = pkg[field];
27
+ if (deps && typeof deps === "object" && name in deps) {
28
+ return true;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ function detectNodeConventions(root, pkg, conventions) {
34
+ conventions.module_style = pkg.type === "module" ? "esm" : "commonjs";
35
+ if (hasDependency(pkg, "prettier") ||
36
+ ["", ".json", ".js", ".cjs", ".yaml", ".yml"].some((extension) => existsSync(join(root, `.prettierrc${extension}`)))) {
37
+ conventions.formatter = "prettier";
38
+ }
39
+ if (hasDependency(pkg, "eslint") ||
40
+ [".eslintrc", ".eslintrc.json", ".eslintrc.cjs", ".eslintrc.js", "eslint.config.js", "eslint.config.mjs"].some((file) => existsSync(join(root, file)))) {
41
+ conventions.linter = "eslint";
42
+ }
43
+ else if (hasDependency(pkg, "biome") || hasDependency(pkg, "@biomejs/biome")) {
44
+ conventions.linter = "biome";
45
+ }
46
+ for (const framework of ["vitest", "jest", "mocha", "ava"]) {
47
+ if (hasDependency(pkg, framework)) {
48
+ conventions.test_framework = framework;
49
+ break;
50
+ }
51
+ }
52
+ const scripts = pkg.scripts;
53
+ const testScript = typeof scripts?.test === "string" ? scripts.test : "";
54
+ if (!conventions.test_framework && /node\s+--test|node:test/.test(testScript)) {
55
+ conventions.test_framework = "node:test";
56
+ }
57
+ }
58
+ function detectPythonConventions(root, conventions) {
59
+ const pyproject = readText(join(root, "pyproject.toml")) ?? "";
60
+ if (/\[tool\.black\]/.test(pyproject))
61
+ conventions.formatter = "black";
62
+ else if (/\[tool\.ruff(?:\.format)?\]/.test(pyproject))
63
+ conventions.formatter = "ruff";
64
+ if (/\[tool\.ruff\b/.test(pyproject))
65
+ conventions.linter = "ruff";
66
+ else if (existsSync(join(root, ".flake8")) || /\[tool\.flake8\]/.test(pyproject))
67
+ conventions.linter = "flake8";
68
+ if (/\[tool\.pytest/.test(pyproject) ||
69
+ existsSync(join(root, "pytest.ini")) ||
70
+ existsSync(join(root, "conftest.py"))) {
71
+ conventions.test_framework = "pytest";
72
+ }
73
+ }
74
+ /** Find one representative source file and sample its leading lines. */
75
+ function sampleSourceFile(root) {
76
+ for (const directory of SAMPLE_DIRECTORIES) {
77
+ const absolute = directory === "." ? root : join(root, directory);
78
+ let entries;
79
+ try {
80
+ entries = readdirSync(absolute);
81
+ }
82
+ catch {
83
+ continue;
84
+ }
85
+ const match = entries
86
+ .filter((name) => SAMPLE_EXTENSIONS.some((extension) => name.endsWith(extension)))
87
+ .filter((name) => !/\.(test|spec|d)\./.test(name))
88
+ .sort()[0];
89
+ if (match) {
90
+ const content = readText(join(absolute, match));
91
+ if (content) {
92
+ return content.split(/\r?\n/).slice(0, SAMPLE_MAX_LINES).join("\n");
93
+ }
94
+ }
95
+ }
96
+ return undefined;
97
+ }
98
+ function detectStyleFromSnippet(snippet, conventions) {
99
+ const lines = snippet.split(/\r?\n/);
100
+ const indented = lines.filter((line) => /^\s+\S/.test(line));
101
+ if (indented.some((line) => line.startsWith("\t"))) {
102
+ conventions.indentation = "tabs";
103
+ }
104
+ else {
105
+ const widths = indented
106
+ .map((line) => line.match(/^ +/)?.[0].length ?? 0)
107
+ .filter((width) => width > 0);
108
+ if (widths.length > 0) {
109
+ conventions.indentation = `${Math.min(...widths)} spaces`;
110
+ }
111
+ }
112
+ const single = (snippet.match(/'/g) ?? []).length;
113
+ const double = (snippet.match(/"/g) ?? []).length;
114
+ if (single > 0 || double > 0) {
115
+ conventions.quote_style = single >= double ? "single" : "double";
116
+ }
117
+ }
118
+ export function detectRepoConventions(root) {
119
+ const conventions = {};
120
+ const pkg = readJson(join(root, "package.json"));
121
+ if (pkg) {
122
+ detectNodeConventions(root, pkg, conventions);
123
+ }
124
+ if (existsSync(join(root, "pyproject.toml")) ||
125
+ existsSync(join(root, "pytest.ini")) ||
126
+ existsSync(join(root, "setup.py"))) {
127
+ detectPythonConventions(root, conventions);
128
+ }
129
+ const snippet = sampleSourceFile(root);
130
+ if (snippet) {
131
+ conventions.sample_snippet = snippet;
132
+ detectStyleFromSnippet(snippet, conventions);
133
+ }
134
+ return conventions;
135
+ }
136
+ /** Render a prompt block from detected conventions, or "" if nothing detected. */
137
+ export function formatRepoConventions(conventions) {
138
+ const lines = [];
139
+ if (conventions.formatter)
140
+ lines.push(`- Formatter: ${conventions.formatter}`);
141
+ if (conventions.linter)
142
+ lines.push(`- Linter: ${conventions.linter}`);
143
+ if (conventions.test_framework)
144
+ lines.push(`- Test framework: ${conventions.test_framework}`);
145
+ if (conventions.module_style)
146
+ lines.push(`- Module style: ${conventions.module_style}`);
147
+ if (conventions.indentation)
148
+ lines.push(`- Indentation: ${conventions.indentation}`);
149
+ if (conventions.quote_style)
150
+ lines.push(`- String quotes: ${conventions.quote_style}`);
151
+ if (lines.length === 0 && !conventions.sample_snippet) {
152
+ return "";
153
+ }
154
+ let block = "REPOSITORY CONVENTIONS (match the surrounding code):\n";
155
+ if (lines.length > 0)
156
+ block += `${lines.join("\n")}\n`;
157
+ if (conventions.sample_snippet) {
158
+ block += `\nRepresentative house-style snippet:\n\`\`\`\n${conventions.sample_snippet}\n\`\`\`\n`;
159
+ }
160
+ return block.trim();
161
+ }
162
+ //# sourceMappingURL=repoConventions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoConventions.js","sourceRoot":"","sources":["../../src/tooling/repoConventions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqBjC,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAU,CAAC;AAC/D,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAChF,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAwC,EAAE,IAAY;IAC3E,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,KAAK,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAK,IAAe,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAY,EACZ,GAA4B,EAC5B,WAA4B;IAE5B,WAAW,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAEtE,IACE,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC;QAC9B,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAC/D,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,SAAS,EAAE,CAAC,CAAC,CAClD,EACD,CAAC;QACD,WAAW,CAAC,SAAS,GAAG,UAAU,CAAC;IACrC,CAAC;IACD,IACE,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC;QAC5B,CAAC,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAC5G,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CACvC,EACD,CAAC;QACD,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC;IAChC,CAAC;SAAM,IAAI,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC/E,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3D,IAAI,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,cAAc,GAAG,SAAS,CAAC;YACvC,MAAM;QACR,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAA8C,CAAC;IACnE,MAAM,UAAU,GAAG,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,IAAI,CAAC,WAAW,CAAC,cAAc,IAAI,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9E,WAAW,CAAC,cAAc,GAAG,WAAW,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAY,EACZ,WAA4B;IAE5B,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,WAAW,CAAC,SAAS,GAAG,OAAO,CAAC;SAClE,IAAI,6BAA6B,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC;IAEvF,IAAI,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;SAC7D,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9E,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC;IAEhC,IACE,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,EACrC,CAAC;QACD,WAAW,CAAC,cAAc,GAAG,QAAQ,CAAC;IACxC,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,SAAS,gBAAgB,CAAC,IAAY;IACpC,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClE,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,OAAO;aAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACf,iBAAiB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAChE;aACA,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACjD,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe,EAAE,WAA4B;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnD,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,QAAQ;aACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;aACjD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,WAAW,CAAC,WAAW,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAClD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAClD,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,WAAW,CAAC,WAAW,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,WAAW,GAAoB,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACjD,IAAI,GAAG,EAAE,CAAC;QACR,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IACD,IACE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QACxC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAClC,CAAC;QACD,uBAAuB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,cAAc,GAAG,OAAO,CAAC;QACrC,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,qBAAqB,CAAC,WAA4B;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/E,IAAI,WAAW,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,IAAI,WAAW,CAAC,cAAc;QAC5B,KAAK,CAAC,IAAI,CAAC,qBAAqB,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC;IAChE,IAAI,WAAW,CAAC,YAAY;QAC1B,KAAK,CAAC,IAAI,CAAC,mBAAmB,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,IAAI,WAAW,CAAC,WAAW;QACzB,KAAK,CAAC,IAAI,CAAC,kBAAkB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,IAAI,WAAW,CAAC,WAAW;QACzB,KAAK,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAE5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;QACtD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,GAAG,wDAAwD,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACvD,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;QAC/B,KAAK,IAAI,kDAAkD,WAAW,CAAC,cAAc,YAAY,CAAC;IACpG,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface ProjectCommands {
2
+ test?: string[];
3
+ e2e?: string[];
4
+ build?: string[];
5
+ lint?: string[];
6
+ }
7
+ /**
8
+ * Discover the test/e2e/build/lint commands for a repository as argv arrays.
9
+ *
10
+ * Node detection (package.json) takes precedence for e2e/build/lint. The test
11
+ * command prefers `npm test`, but — matching the auditor's prior behavior —
12
+ * falls through to Go (`go test ./...`) then Python (`python -m pytest`) when
13
+ * package.json has no usable `test` script or is absent. Absent roles are
14
+ * omitted from the result.
15
+ */
16
+ export declare function discoverProjectCommands(root: string): ProjectCommands;
17
+ //# sourceMappingURL=testCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testCommand.d.ts","sourceRoot":"","sources":["../../src/tooling/testCommand.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AA2CD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CA8BrE"}
@@ -0,0 +1,78 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ // npm script names, in preference order, for each command role.
4
+ const E2E_SCRIPT_NAMES = [
5
+ "e2e",
6
+ "test:e2e",
7
+ "test:e2e:run",
8
+ "test:integration",
9
+ "cypress:run",
10
+ "playwright",
11
+ "playwright:test",
12
+ ];
13
+ const BUILD_SCRIPT_NAMES = ["build"];
14
+ const LINT_SCRIPT_NAMES = ["lint", "lint:check"];
15
+ function readPackageScripts(root) {
16
+ const packageJsonPath = join(root, "package.json");
17
+ if (!existsSync(packageJsonPath))
18
+ return null;
19
+ try {
20
+ const parsed = JSON.parse(readFileSync(packageJsonPath, "utf8"));
21
+ return parsed && typeof parsed === "object" && parsed.scripts
22
+ ? parsed.scripts
23
+ : {};
24
+ }
25
+ catch {
26
+ // Unreadable / malformed package.json: treat as a non-Node project.
27
+ return null;
28
+ }
29
+ }
30
+ function pickScript(scripts, names) {
31
+ for (const name of names) {
32
+ if (scripts[name] && scripts[name].trim().length > 0) {
33
+ return ["npm", "run", name];
34
+ }
35
+ }
36
+ return undefined;
37
+ }
38
+ /**
39
+ * Discover the test/e2e/build/lint commands for a repository as argv arrays.
40
+ *
41
+ * Node detection (package.json) takes precedence for e2e/build/lint. The test
42
+ * command prefers `npm test`, but — matching the auditor's prior behavior —
43
+ * falls through to Go (`go test ./...`) then Python (`python -m pytest`) when
44
+ * package.json has no usable `test` script or is absent. Absent roles are
45
+ * omitted from the result.
46
+ */
47
+ export function discoverProjectCommands(root) {
48
+ const result = {};
49
+ const scripts = readPackageScripts(root);
50
+ if (scripts) {
51
+ const testScript = scripts.test?.trim();
52
+ if (testScript && !/no test specified/i.test(testScript)) {
53
+ result.test = ["npm", "test"];
54
+ }
55
+ const e2e = pickScript(scripts, E2E_SCRIPT_NAMES);
56
+ if (e2e)
57
+ result.e2e = e2e;
58
+ const build = pickScript(scripts, BUILD_SCRIPT_NAMES);
59
+ if (build)
60
+ result.build = build;
61
+ const lint = pickScript(scripts, LINT_SCRIPT_NAMES);
62
+ if (lint)
63
+ result.lint = lint;
64
+ }
65
+ if (!result.test) {
66
+ if (existsSync(join(root, "go.mod"))) {
67
+ result.test = ["go", "test", "./..."];
68
+ if (!result.build)
69
+ result.build = ["go", "build", "./..."];
70
+ }
71
+ else if (existsSync(join(root, "pyproject.toml")) ||
72
+ existsSync(join(root, "pytest.ini"))) {
73
+ result.test = ["python", "-m", "pytest"];
74
+ }
75
+ }
76
+ return result;
77
+ }
78
+ //# sourceMappingURL=testCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testCommand.js","sourceRoot":"","sources":["../../src/tooling/testCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export type FindingSeverity = "critical" | "high" | "medium" | "low" | "info";
2
+ export type FindingConfidence = "high" | "medium" | "low";
3
+ export interface FindingLocation {
4
+ path: string;
5
+ line_start?: number;
6
+ line_end?: number;
7
+ symbol?: string;
8
+ /** Content hash of the file when the finding was planned (remediator). */
9
+ hash_at_plan_time?: string;
10
+ }
11
+ export interface Finding {
12
+ id: string;
13
+ title: string;
14
+ category: string;
15
+ severity: FindingSeverity;
16
+ confidence: FindingConfidence;
17
+ /** Audit lens; the auditor narrows this to its `Lens` union. */
18
+ lens: string;
19
+ summary: string;
20
+ affected_files: FindingLocation[];
21
+ impact?: string;
22
+ likelihood?: string;
23
+ evidence?: string[];
24
+ reproduction?: string[];
25
+ systemic?: boolean;
26
+ related_findings?: string[];
27
+ /** Synthesis theme this finding belongs to (Phase 6). */
28
+ theme_id?: string;
29
+ }
30
+ /** Report-level grouping of findings into parallelizable units of work. */
31
+ export interface WorkBlock {
32
+ id: string;
33
+ finding_ids: string[];
34
+ unit_ids: string[];
35
+ owned_files: string[];
36
+ max_severity: FindingSeverity;
37
+ rationale: string;
38
+ depends_on: string[];
39
+ }
40
+ /** A synthesis theme: a root cause spanning several findings (Phase 6). */
41
+ export interface FindingTheme {
42
+ theme_id: string;
43
+ title: string;
44
+ root_cause: string;
45
+ finding_ids: string[];
46
+ suggested_fix_pattern: string;
47
+ }
48
+ /**
49
+ * The optional LLM synthesis-narrative payload (Phase 6). Produced by a single
50
+ * cached host/provider pass over the deterministic findings and merged into
51
+ * `audit-findings.json`. Omitted entirely when no provider is available.
52
+ */
53
+ export interface SynthesisNarrative {
54
+ themes: FindingTheme[];
55
+ executive_summary?: string;
56
+ top_risks?: string[];
57
+ }
58
+ export interface AuditFindingsSummary {
59
+ finding_count: number;
60
+ work_block_count: number;
61
+ severity_breakdown: Record<string, number>;
62
+ audited_file_count: number;
63
+ excluded_file_count: number;
64
+ runtime_validation_status_breakdown: Record<string, number>;
65
+ }
66
+ /**
67
+ * The canonical `audit-findings.json` contract. Deterministic fields are always
68
+ * present; narrative fields (themes/executive_summary/top_risks) are added by
69
+ * the optional Phase 6 synthesis-narrative pass and omitted without a provider.
70
+ */
71
+ export interface AuditFindingsReport {
72
+ contract_version: string;
73
+ summary: AuditFindingsSummary;
74
+ findings: Finding[];
75
+ work_blocks: WorkBlock[];
76
+ themes?: FindingTheme[];
77
+ executive_summary?: string;
78
+ top_risks?: string[];
79
+ }
80
+ //# sourceMappingURL=finding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding.d.ts","sourceRoot":"","sources":["../../src/types/finding.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAC9E,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2EAA2E;AAC3E,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,eAAe,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mCAAmC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7D;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB"}
@@ -0,0 +1,8 @@
1
+ // Canonical machine contract for audit findings — the shape that flows from the
2
+ // auditor's `audit-findings.json` into the remediator. Before Phase 0 `Finding`
3
+ // was redefined in each package; this is the single source of truth. The
4
+ // auditor narrows `lens` to its `Lens` union (via Omit) and the remediator uses
5
+ // `Finding` directly. New optional fields (e.g. `theme_id`, added in Phase 6)
6
+ // land here and propagate to both.
7
+ export {};
8
+ //# sourceMappingURL=finding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding.js","sourceRoot":"","sources":["../../src/types/finding.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,yEAAyE;AACzE,gFAAgF;AAChF,8EAA8E;AAC9E,mCAAmC"}
@@ -19,5 +19,11 @@ export interface GraphBundle {
19
19
  routes?: RouteEdge[];
20
20
  [key: string]: unknown;
21
21
  };
22
+ /**
23
+ * Provenance for the optional graph-enrichment pass: the ids of the language
24
+ * analyzers whose edges were merged into this bundle (empty/absent when only
25
+ * the deterministic regex floor was used). See Phase 5 analyzer seam.
26
+ */
27
+ analyzers_used?: string[];
22
28
  }
23
29
  //# sourceMappingURL=graph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/types/graph.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QACN,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;QACpB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH"}
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/types/graph.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QACN,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;QACpB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B"}
@@ -0,0 +1,21 @@
1
+ export type RemediationOutcomeStatus = "resolved" | "verified_no_change" | "inappropriate" | "ignored" | "blocked";
2
+ export interface RemediationOutcome {
3
+ finding_id: string;
4
+ /** Audit lens the finding came from (free string in the wire contract). */
5
+ lens: string;
6
+ /** Distinct file extensions of the finding's affected files (e.g. [".ts"]). */
7
+ file_exts: string[];
8
+ outcome: RemediationOutcomeStatus;
9
+ /** How many times the item was sent back for rework before this outcome. */
10
+ rework_count: number;
11
+ /** The run's closing-action status (e.g. "success", "failed"). */
12
+ closing_status: string;
13
+ }
14
+ export interface RemediationOutcomesReport {
15
+ contract_version: string;
16
+ total: number;
17
+ by_outcome: Record<RemediationOutcomeStatus, number>;
18
+ by_lens: Record<string, Partial<Record<RemediationOutcomeStatus, number>>>;
19
+ outcomes: RemediationOutcome[];
20
+ }
21
+ //# sourceMappingURL=remediationOutcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remediationOutcome.d.ts","sourceRoot":"","sources":["../../src/types/remediationOutcome.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,wBAAwB,GAChC,UAAU,GACV,oBAAoB,GACpB,eAAe,GACf,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,wBAAwB,CAAC;IAClC,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3E,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC"}
@@ -0,0 +1,7 @@
1
+ // Phase 7B — per-finding remediation outcome capture. The remediator emits one
2
+ // of these per finding into `remediation-outcomes.json` at close time. This is
3
+ // capture/surface only: it records what happened so a human (or a later
4
+ // calibration pass) can see how findings of each lens / file type fared. The
5
+ // auditor does not consume it automatically.
6
+ export {};
7
+ //# sourceMappingURL=remediationOutcome.js.map