@zigrivers/mmr 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +444 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/ack.d.ts +11 -0
- package/dist/commands/ack.d.ts.map +1 -0
- package/dist/commands/ack.js +123 -0
- package/dist/commands/ack.js.map +1 -0
- package/dist/commands/config.d.ts +5 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +248 -14
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/jobs.d.ts.map +1 -1
- package/dist/commands/jobs.js +3 -4
- package/dist/commands/jobs.js.map +1 -1
- package/dist/commands/reconcile.d.ts.map +1 -1
- package/dist/commands/reconcile.js +12 -5
- package/dist/commands/reconcile.js.map +1 -1
- package/dist/commands/results.d.ts.map +1 -1
- package/dist/commands/results.js +13 -5
- package/dist/commands/results.js.map +1 -1
- package/dist/commands/review.d.ts +25 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +459 -44
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/sessions.d.ts +58 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +266 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/config/defaults.d.ts +2 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +76 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +22 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +279 -36
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +897 -53
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +155 -4
- package/dist/config/schema.js.map +1 -1
- package/dist/core/ack-store.d.ts +109 -0
- package/dist/core/ack-store.d.ts.map +1 -0
- package/dist/core/ack-store.js +363 -0
- package/dist/core/ack-store.js.map +1 -0
- package/dist/core/auth.d.ts +10 -1
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +106 -35
- package/dist/core/auth.js.map +1 -1
- package/dist/core/compensator.d.ts +33 -4
- package/dist/core/compensator.d.ts.map +1 -1
- package/dist/core/compensator.js +120 -15
- package/dist/core/compensator.js.map +1 -1
- package/dist/core/diff-introspect.d.ts +21 -0
- package/dist/core/diff-introspect.d.ts.map +1 -0
- package/dist/core/diff-introspect.js +42 -0
- package/dist/core/diff-introspect.js.map +1 -0
- package/dist/core/dispatcher.d.ts +10 -0
- package/dist/core/dispatcher.d.ts.map +1 -1
- package/dist/core/dispatcher.js +91 -20
- package/dist/core/dispatcher.js.map +1 -1
- package/dist/core/git-show.d.ts +31 -0
- package/dist/core/git-show.d.ts.map +1 -0
- package/dist/core/git-show.js +72 -0
- package/dist/core/git-show.js.map +1 -0
- package/dist/core/host-isolation.d.ts +24 -0
- package/dist/core/host-isolation.d.ts.map +1 -0
- package/dist/core/host-isolation.js +107 -0
- package/dist/core/host-isolation.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +20 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +125 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/job-store.d.ts +7 -1
- package/dist/core/job-store.d.ts.map +1 -1
- package/dist/core/job-store.js +21 -1
- package/dist/core/job-store.js.map +1 -1
- package/dist/core/jsonpath.d.ts +15 -0
- package/dist/core/jsonpath.d.ts.map +1 -0
- package/dist/core/jsonpath.js +63 -0
- package/dist/core/jsonpath.js.map +1 -0
- package/dist/core/oss-examples.d.ts +18 -0
- package/dist/core/oss-examples.d.ts.map +1 -0
- package/dist/core/oss-examples.js +66 -0
- package/dist/core/oss-examples.js.map +1 -0
- package/dist/core/parser.d.ts +8 -3
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +157 -6
- package/dist/core/parser.js.map +1 -1
- package/dist/core/project-root.d.ts +10 -0
- package/dist/core/project-root.d.ts.map +1 -0
- package/dist/core/project-root.js +23 -0
- package/dist/core/project-root.js.map +1 -0
- package/dist/core/reconciler.d.ts +1 -1
- package/dist/core/reconciler.d.ts.map +1 -1
- package/dist/core/reconciler.js +100 -18
- package/dist/core/reconciler.js.map +1 -1
- package/dist/core/redact.d.ts +17 -0
- package/dist/core/redact.d.ts.map +1 -0
- package/dist/core/redact.js +140 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/results-pipeline.d.ts +8 -2
- package/dist/core/results-pipeline.d.ts.map +1 -1
- package/dist/core/results-pipeline.js +50 -3
- package/dist/core/results-pipeline.js.map +1 -1
- package/dist/core/runtime-probe.d.ts +14 -0
- package/dist/core/runtime-probe.d.ts.map +1 -0
- package/dist/core/runtime-probe.js +57 -0
- package/dist/core/runtime-probe.js.map +1 -0
- package/dist/core/stable-id.d.ts +19 -0
- package/dist/core/stable-id.d.ts.map +1 -0
- package/dist/core/stable-id.js +148 -0
- package/dist/core/stable-id.js.map +1 -0
- package/dist/core/trust-mode.d.ts +29 -0
- package/dist/core/trust-mode.d.ts.map +1 -0
- package/dist/core/trust-mode.js +103 -0
- package/dist/core/trust-mode.js.map +1 -0
- package/dist/formatters/markdown.d.ts.map +1 -1
- package/dist/formatters/markdown.js +9 -0
- package/dist/formatters/markdown.js.map +1 -1
- package/dist/formatters/text.d.ts.map +1 -1
- package/dist/formatters/text.js +9 -0
- package/dist/formatters/text.js.map +1 -1
- package/dist/types.d.ts +44 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/core/redact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
import type { JobMetadata, OutputFormat, ReconciledResults } from '../types.js';
|
|
1
|
+
import type { JobMetadata, Severity, OutputFormat, ReconciledResults, ReconciledFinding } from '../types.js';
|
|
2
2
|
import type { JobStore } from './job-store.js';
|
|
3
|
+
import type { AckStore } from './ack-store.js';
|
|
3
4
|
export interface PipelineResult {
|
|
4
5
|
results: ReconciledResults;
|
|
5
6
|
formatted: string;
|
|
6
7
|
exitCode: number;
|
|
7
8
|
}
|
|
9
|
+
export interface PipelineOptions {
|
|
10
|
+
ackStore?: AckStore;
|
|
11
|
+
}
|
|
12
|
+
export declare function isBlockingFinding(finding: ReconciledFinding, threshold: Severity): boolean;
|
|
13
|
+
export declare function isAdvisoryFinding(finding: ReconciledFinding, threshold: Severity): boolean;
|
|
8
14
|
/**
|
|
9
15
|
* Run the full results pipeline: parse channel outputs, reconcile findings,
|
|
10
16
|
* derive verdict, format output.
|
|
11
17
|
*/
|
|
12
|
-
export declare function runResultsPipeline(store: JobStore, job: JobMetadata, outputFormat: OutputFormat, includeRaw?: boolean): PipelineResult;
|
|
18
|
+
export declare function runResultsPipeline(store: JobStore, job: JobMetadata, outputFormat: OutputFormat, includeRaw?: boolean, opts?: PipelineOptions): PipelineResult;
|
|
13
19
|
//# sourceMappingURL=results-pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results-pipeline.d.ts","sourceRoot":"","sources":["../../src/core/results-pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,
|
|
1
|
+
{"version":3,"file":"results-pipeline.d.ts","sourceRoot":"","sources":["../../src/core/results-pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EAEZ,iBAAiB,EACjB,iBAAiB,EAGlB,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAG9C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,iBAAiB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,CAG1F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,CAG1F;AAkCD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,YAAY,EAC1B,UAAU,UAAQ,EAClB,IAAI,GAAE,eAAoB,GACzB,cAAc,CAsKhB"}
|
|
@@ -4,6 +4,15 @@ import { formatJson } from '../formatters/json.js';
|
|
|
4
4
|
import { formatText } from '../formatters/text.js';
|
|
5
5
|
import { formatMarkdown } from '../formatters/markdown.js';
|
|
6
6
|
import { SEVERITY_ORDER } from '../types.js';
|
|
7
|
+
import { normalizeLocationForKey } from './stable-id.js';
|
|
8
|
+
export function isBlockingFinding(finding, threshold) {
|
|
9
|
+
return finding.acknowledged !== true &&
|
|
10
|
+
SEVERITY_ORDER[finding.severity] <= SEVERITY_ORDER[threshold];
|
|
11
|
+
}
|
|
12
|
+
export function isAdvisoryFinding(finding, threshold) {
|
|
13
|
+
return finding.acknowledged === true ||
|
|
14
|
+
SEVERITY_ORDER[finding.severity] > SEVERITY_ORDER[threshold];
|
|
15
|
+
}
|
|
7
16
|
/** Maximum chars of channel-log detail to embed in the per-channel error
|
|
8
17
|
* field. Keeps JSON output readable while preserving the head of any
|
|
9
18
|
* stderr / spawn-error message captured by the dispatcher. */
|
|
@@ -36,7 +45,7 @@ function appendLogDetail(baseMsg, store, jobId, channel) {
|
|
|
36
45
|
* Run the full results pipeline: parse channel outputs, reconcile findings,
|
|
37
46
|
* derive verdict, format output.
|
|
38
47
|
*/
|
|
39
|
-
export function runResultsPipeline(store, job, outputFormat, includeRaw = false) {
|
|
48
|
+
export function runResultsPipeline(store, job, outputFormat, includeRaw = false, opts = {}) {
|
|
40
49
|
const channelFindings = {};
|
|
41
50
|
const perChannel = {};
|
|
42
51
|
const startTimes = [];
|
|
@@ -99,6 +108,36 @@ export function runResultsPipeline(store, job, outputFormat, includeRaw = false)
|
|
|
99
108
|
};
|
|
100
109
|
}
|
|
101
110
|
const reconciledFindings = reconcile(channelFindings);
|
|
111
|
+
// Apply ack lookup (T2-D): stamp acknowledged/ack_match/ack_reason on matched
|
|
112
|
+
// findings, preserving agreement/confidence/sources. isBlockingFinding and
|
|
113
|
+
// isAdvisoryFinding already treat acknowledged findings as advisory-only, so
|
|
114
|
+
// the gate (evaluateGate) skips them when computing the verdict.
|
|
115
|
+
if (opts.ackStore) {
|
|
116
|
+
try {
|
|
117
|
+
for (const f of reconciledFindings) {
|
|
118
|
+
// Only finding_key is required: AckStore.lookup's exact path is
|
|
119
|
+
// key-only; the fuzzy fallback early-returns on an empty shingle.
|
|
120
|
+
if (f.finding_key === undefined)
|
|
121
|
+
continue;
|
|
122
|
+
const match = opts.ackStore.lookup({
|
|
123
|
+
finding_key: f.finding_key,
|
|
124
|
+
normalized_location: normalizeLocationForKey(f.location),
|
|
125
|
+
shingle: f.description_shingle ?? [],
|
|
126
|
+
});
|
|
127
|
+
if (match) {
|
|
128
|
+
f.acknowledged = true;
|
|
129
|
+
f.ack_match = match.match;
|
|
130
|
+
if (match.record.reason !== undefined)
|
|
131
|
+
f.ack_reason = match.record.reason;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Fail safe: if the ack store can't be read (e.g. a poisoned or
|
|
137
|
+
// symlinked .mmr/acks tree makes lookup throw), apply no suppression.
|
|
138
|
+
// Findings stay blocking, which is the safe direction for a gate.
|
|
139
|
+
}
|
|
140
|
+
}
|
|
102
141
|
const fixThreshold = job.fix_threshold;
|
|
103
142
|
const completedChannels = Object.values(job.channels)
|
|
104
143
|
.filter((ch) => ch.status === 'completed').length;
|
|
@@ -116,10 +155,10 @@ export function runResultsPipeline(store, job, outputFormat, includeRaw = false)
|
|
|
116
155
|
: verdict === 'needs-user-decision'
|
|
117
156
|
? 'No channels completed — manual review needed'
|
|
118
157
|
: (() => {
|
|
119
|
-
const blockingCount = reconciledFindings.filter((f) =>
|
|
158
|
+
const blockingCount = reconciledFindings.filter((f) => isBlockingFinding(f, fixThreshold)).length;
|
|
120
159
|
return `Review blocked — ${blockingCount} finding(s) at or above ${fixThreshold}`;
|
|
121
160
|
})();
|
|
122
|
-
const advisoryCount = reconciledFindings.filter((f) =>
|
|
161
|
+
const advisoryCount = reconciledFindings.filter((f) => isAdvisoryFinding(f, fixThreshold)).length;
|
|
123
162
|
const results = {
|
|
124
163
|
job_id: job.job_id,
|
|
125
164
|
verdict,
|
|
@@ -137,6 +176,14 @@ export function runResultsPipeline(store, job, outputFormat, includeRaw = false)
|
|
|
137
176
|
total_elapsed: totalElapsed,
|
|
138
177
|
},
|
|
139
178
|
};
|
|
179
|
+
// Re-surface trust context persisted on the job at review time (§5 decision
|
|
180
|
+
// 1), so review --sync, `mmr results`, and `mmr reconcile` all carry it.
|
|
181
|
+
if (job.trust_mode !== undefined)
|
|
182
|
+
results.trust_mode = job.trust_mode;
|
|
183
|
+
if (job.proposed_acks !== undefined)
|
|
184
|
+
results.proposed_acks = job.proposed_acks;
|
|
185
|
+
if (job.proposed_config_change !== undefined)
|
|
186
|
+
results.proposed_config_change = job.proposed_config_change;
|
|
140
187
|
let formatted;
|
|
141
188
|
switch (outputFormat) {
|
|
142
189
|
case 'text':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results-pipeline.js","sourceRoot":"","sources":["../../src/core/results-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"results-pipeline.js","sourceRoot":"","sources":["../../src/core/results-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAW1D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAG5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAYxD,MAAM,UAAU,iBAAiB,CAAC,OAA0B,EAAE,SAAmB;IAC/E,OAAO,OAAO,CAAC,YAAY,KAAK,IAAI;QAClC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA0B,EAAE,SAAmB;IAC/E,OAAO,OAAO,CAAC,YAAY,KAAK,IAAI;QAClC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;AAChE,CAAC;AAED;;+DAE+D;AAC/D,MAAM,sBAAsB,GAAG,KAAK,CAAA;AAEpC;;;;;GAKG;AACH,SAAS,eAAe,CACtB,OAAe,EACf,KAAe,EACf,KAAa,EACb,OAAe;IAEf,IAAI,GAAG,GAAkB,IAAI,CAAA;IAC7B,IAAI,CAAC;QACH,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAA;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,sBAAsB;QACpD,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,GAAG;QAChD,CAAC,CAAC,OAAO,CAAA;IACX,OAAO,GAAG,OAAO,KAAK,MAAM,EAAE,CAAA;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAe,EACf,GAAgB,EAChB,YAA0B,EAC1B,UAAU,GAAG,KAAK,EAClB,OAAwB,EAAE;IAE1B,MAAM,eAAe,GAA8B,EAAE,CAAA;IACrD,MAAM,UAAU,GAAkC,EAAE,CAAA;IACpD,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB;gBAC1D,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB;oBAChD,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,mBAAmB;wBACpD,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,uBAAuB;4BAC1D,CAAC,CAAC,SAAS,CAAA;YACnB,iEAAiE;YACjE,gEAAgE;YAChE,kEAAkE;YAClE,MAAM,QAAQ,GAAG,OAAO,KAAK,SAAS;gBACpC,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;gBACnD,CAAC,CAAC,SAAS,CAAA;YACb,UAAU,CAAC,IAAI,CAAC,GAAG;gBACjB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;gBAC9B,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,QAAQ;aAChB,CAAA;YACD,SAAQ;QACV,CAAC;QAED,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,QAAQ,GAAc,EAAE,CAAA;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACxD,iEAAiE;YACjE,kDAAkD;YAClD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAClC,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,GAAG,MAAM,CAAA;YACd,CAAC;YACD,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,IAAI,SAAS,CAAA;YACnD,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;YAClD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;QAEhC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY;YACpD,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;YAC3G,CAAC,CAAC,IAAI,CAAA;QAER,IAAI,KAAK,CAAC,UAAU;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3E,IAAI,KAAK,CAAC,YAAY;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAE7E,UAAU,CAAC,IAAI,CAAC,GAAG;YACjB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO;YACP,QAAQ;YACR,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;YACxC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,SAAS;SACzE,CAAA;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,SAAS,CAAC,eAAe,CAAC,CAAA;IAErD,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,iEAAiE;IACjE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;gBACnC,gEAAgE;gBAChE,kEAAkE;gBAClE,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS;oBAAE,SAAQ;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACjC,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,mBAAmB,EAAE,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACxD,OAAO,EAAE,CAAC,CAAC,mBAAmB,IAAI,EAAE;iBACrC,CAAC,CAAA;gBACF,IAAI,KAAK,EAAE,CAAC;oBACV,CAAC,CAAC,YAAY,GAAG,IAAI,CAAA;oBACrB,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;oBACzB,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;wBAAE,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAA;gBAC3E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;YAChE,sEAAsE;YACtE,kEAAkE;QACpE,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,aAAyB,CAAA;IAClD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;SAClD,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAA;IACnD,MAAM,UAAU,GAAG,iBAAiB,GAAG,CAAC;QACtC,CAAC,CAAC,YAAY,CAAC,kBAAkB,EAAE,YAAY,CAAC;QAChD,CAAC,CAAC,KAAK,CAAA;IAET,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CACxC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAC7B,CAAA;IAClC,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;IAE1D,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC/D,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC7E,CAAC,CAAC,IAAI,CAAA;IAER,MAAM,QAAQ,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,eAAe,CAAA;IAClE,MAAM,OAAO,GAAG,QAAQ;QACtB,CAAC,CAAC,gBAAgB,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,EAAE,EAAE;QAChG,CAAC,CAAC,OAAO,KAAK,qBAAqB;YACjC,CAAC,CAAC,8CAA8C;YAChD,CAAC,CAAC,CAAC,GAAG,EAAE;gBACN,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAA;gBACjG,OAAO,oBAAoB,aAAa,2BAA2B,YAAY,EAAE,CAAA;YACnF,CAAC,CAAC,EAAE,CAAA;IAER,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAA;IAEjG,MAAM,OAAO,GAAsB;QACjC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO;QACP,aAAa,EAAE,YAAY;QAC3B,cAAc,EAAE,aAAa;QAC7B,QAAQ;QACR,OAAO;QACP,mBAAmB,EAAE,kBAAkB;QACvC,WAAW,EAAE,UAAU;QACvB,QAAQ,EAAE;YACR,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM;YACrD,kBAAkB,EAAE,iBAAiB;YACrC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;iBAC1C,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACnE,aAAa,EAAE,YAAY;SAC5B;KACF,CAAA;IAED,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAA;IACrE,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS;QAAE,OAAO,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAA;IAC9E,IAAI,GAAG,CAAC,sBAAsB,KAAK,SAAS;QAAE,OAAO,CAAC,sBAAsB,GAAG,GAAG,CAAC,sBAAsB,CAAA;IAEzG,IAAI,SAAiB,CAAA;IACrB,QAAQ,YAAY,EAAE,CAAC;QACvB,KAAK,MAAM;YACT,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAC/B,MAAK;QACP,KAAK,UAAU;YACb,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;YACnC,MAAK;QACP,KAAK,MAAM,CAAC;QACZ;YACE,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAC/B,MAAK;IACP,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,OAAO,KAAK,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC,CAAA;IAEP,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ProbeResult {
|
|
2
|
+
detected: boolean;
|
|
3
|
+
reason?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Probe for a local runtime by running `<command> <args>` with the given
|
|
7
|
+
* timeout (ms). Returns detected=true if the process exits 0 within the
|
|
8
|
+
* timeout.
|
|
9
|
+
*
|
|
10
|
+
* The command name is validated against a strict character set before
|
|
11
|
+
* spawn to prevent shell injection from a hardcoded probe list.
|
|
12
|
+
*/
|
|
13
|
+
export declare function probeRuntime(command: string, args: string[], timeoutMs: number): Promise<ProbeResult>;
|
|
14
|
+
//# sourceMappingURL=runtime-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-probe.d.ts","sourceRoot":"","sources":["../../src/core/runtime-probe.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CA+CtB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
const MAX_TIMEOUT_MS = 2_147_483_647;
|
|
3
|
+
/**
|
|
4
|
+
* Probe for a local runtime by running `<command> <args>` with the given
|
|
5
|
+
* timeout (ms). Returns detected=true if the process exits 0 within the
|
|
6
|
+
* timeout.
|
|
7
|
+
*
|
|
8
|
+
* The command name is validated against a strict character set before
|
|
9
|
+
* spawn to prevent shell injection from a hardcoded probe list.
|
|
10
|
+
*/
|
|
11
|
+
export async function probeRuntime(command, args, timeoutMs) {
|
|
12
|
+
if (!/^[a-zA-Z0-9._/\\: ()@+~-]+$/.test(command)) {
|
|
13
|
+
return { detected: false, reason: 'invalid command name' };
|
|
14
|
+
}
|
|
15
|
+
if (!Number.isInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_TIMEOUT_MS) {
|
|
16
|
+
return { detected: false, reason: 'invalid timeout' };
|
|
17
|
+
}
|
|
18
|
+
for (const arg of args) {
|
|
19
|
+
if (arg.includes('\0')) {
|
|
20
|
+
return { detected: false, reason: 'invalid argument' };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
let settled = false;
|
|
25
|
+
let timedOut = false;
|
|
26
|
+
let killTimer;
|
|
27
|
+
const child = spawn(command, args, { stdio: 'ignore' });
|
|
28
|
+
const timer = setTimeout(() => {
|
|
29
|
+
timedOut = true;
|
|
30
|
+
child.kill('SIGTERM');
|
|
31
|
+
killTimer = setTimeout(() => {
|
|
32
|
+
child.kill('SIGKILL');
|
|
33
|
+
}, 250);
|
|
34
|
+
}, timeoutMs);
|
|
35
|
+
function finish(result) {
|
|
36
|
+
if (settled)
|
|
37
|
+
return;
|
|
38
|
+
settled = true;
|
|
39
|
+
clearTimeout(timer);
|
|
40
|
+
if (killTimer)
|
|
41
|
+
clearTimeout(killTimer);
|
|
42
|
+
resolve(result);
|
|
43
|
+
}
|
|
44
|
+
child.on('close', (code, signal) => {
|
|
45
|
+
if (timedOut) {
|
|
46
|
+
finish({ detected: false, reason: 'timeout' });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const reason = code === 0 ? undefined : signal ? `signal ${signal}` : `exit ${code}`;
|
|
50
|
+
finish({ detected: code === 0, reason });
|
|
51
|
+
});
|
|
52
|
+
child.on('error', (err) => {
|
|
53
|
+
finish({ detected: false, reason: err.message });
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=runtime-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-probe.js","sourceRoot":"","sources":["../../src/core/runtime-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAO1C,MAAM,cAAc,GAAG,aAAa,CAAA;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,IAAc,EACd,SAAiB;IAEjB,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAA;IAC5D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,cAAc,EAAE,CAAC;QAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;IACvD,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;QACxD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;QAC1C,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,SAAoD,CAAA;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEvD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAA;YACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACvB,CAAC,EAAE,GAAG,CAAC,CAAA;QACT,CAAC,EAAE,SAAS,CAAC,CAAA;QAEb,SAAS,MAAM,CAAC,MAAmB;YACjC,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAA;YACtC,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACjC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC9C,OAAM;YACR,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAA;YACpF,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Finding } from '../types.js';
|
|
2
|
+
export declare function normalizeLocationForKey(location: string): string;
|
|
3
|
+
export declare function normalizeDescriptionForKey(description: string): string;
|
|
4
|
+
export declare function normalizeSuggestionForKey(suggestion: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Compute the stable identity key per §5 decision 2:
|
|
7
|
+
* finding_key = sha1(
|
|
8
|
+
* normalized_location + "|" + (category ?? "") + "|" +
|
|
9
|
+
* sha1(description_normalized) + "|" + sha1(suggestion_normalized)
|
|
10
|
+
* )
|
|
11
|
+
*
|
|
12
|
+
* Severity is intentionally excluded — the same underlying issue surfacing at
|
|
13
|
+
* P1 vs P2 across channels should still reconcile to one key.
|
|
14
|
+
*/
|
|
15
|
+
export declare function computeFindingKey(finding: Finding): string;
|
|
16
|
+
export declare function descriptionShingle(description: string): string[];
|
|
17
|
+
export declare function jaccardSimilarity(a: readonly string[] | ReadonlySet<string>, b: readonly string[] | ReadonlySet<string>): number;
|
|
18
|
+
export declare function shingleSize(shingle: readonly string[] | ReadonlySet<string>): number;
|
|
19
|
+
//# sourceMappingURL=stable-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stable-id.d.ts","sourceRoot":"","sources":["../../src/core/stable-id.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAY1C,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AAwCD,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtE;AAQD,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIpE;AAmCD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAM1D;AAMD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAUhE;AAED,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAC1C,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,GACzC,MAAM,CAWR;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAEpF"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Strip end-of-string line/column spans from a location string.
|
|
4
|
+
* Patterns matched (all anchored to end-of-string):
|
|
5
|
+
* - `:N` - trailing single line number
|
|
6
|
+
* - `:N-M` - trailing line range
|
|
7
|
+
* - `:N:M` - trailing line:column
|
|
8
|
+
* - `(line N)` (with optional leading whitespace) - prose-style line ref
|
|
9
|
+
*/
|
|
10
|
+
const LOCATION_SPAN_RE = /(?::\d+(?::\d+)?(?:-\d+)?|\s*\(line \d+\))$/;
|
|
11
|
+
export function normalizeLocationForKey(location) {
|
|
12
|
+
return location.toLowerCase().trim().replace(LOCATION_SPAN_RE, '');
|
|
13
|
+
}
|
|
14
|
+
const LINE_MENTION_RE = /\b(?:at\s+)?line \d+\b/gi;
|
|
15
|
+
const VALUE_AFTER_AT_UNITS = [
|
|
16
|
+
'seconds?',
|
|
17
|
+
'minutes?',
|
|
18
|
+
'hours?',
|
|
19
|
+
'items?',
|
|
20
|
+
'bytes?',
|
|
21
|
+
'kb',
|
|
22
|
+
'mb',
|
|
23
|
+
'gb',
|
|
24
|
+
'pixels?',
|
|
25
|
+
'elements?',
|
|
26
|
+
'chars?',
|
|
27
|
+
'characters?',
|
|
28
|
+
'ms',
|
|
29
|
+
's',
|
|
30
|
+
].join('|');
|
|
31
|
+
const AT_INTEGER_MENTION_RE = /\bat \d+(?!\.\d)(?!\d)\b\.?/gi;
|
|
32
|
+
const AT_INTEGER_VALUE_AFTER_RE = new RegExp(String.raw `^\s*(?:%|\b(?:${VALUE_AFTER_AT_UNITS})\b)`, 'i');
|
|
33
|
+
const AT_LOCATION_CONTEXT_BEFORE_RE = /\b(?:found|reported|detected|raised|located|declared|defined)\s+$/;
|
|
34
|
+
const SEVERITY_PREFIX_RE = /^\s*(?:p[0-3]|critical|high|medium|low|info)\s*:\s*/i;
|
|
35
|
+
const CODE_SPAN_RE = /`([^`]*)`/g;
|
|
36
|
+
function normalizeNonCodeSegment(s) {
|
|
37
|
+
return s
|
|
38
|
+
.toLowerCase()
|
|
39
|
+
.replace(LINE_MENTION_RE, '')
|
|
40
|
+
.replace(AT_INTEGER_MENTION_RE, (match, offset, full) => {
|
|
41
|
+
const after = full.slice(offset + match.length);
|
|
42
|
+
if (AT_INTEGER_VALUE_AFTER_RE.test(after))
|
|
43
|
+
return match;
|
|
44
|
+
const before = full.slice(0, offset);
|
|
45
|
+
return AT_LOCATION_CONTEXT_BEFORE_RE.test(before) ? '' : match;
|
|
46
|
+
})
|
|
47
|
+
.replace(SEVERITY_PREFIX_RE, '')
|
|
48
|
+
.replace(/\s+/g, ' ')
|
|
49
|
+
.trim();
|
|
50
|
+
}
|
|
51
|
+
export function normalizeDescriptionForKey(description) {
|
|
52
|
+
return normalizeWithCodeSpans(description, normalizeNonCodeSegment);
|
|
53
|
+
}
|
|
54
|
+
function appendNormalizedPart(out, part, spaceBefore) {
|
|
55
|
+
if (part === '')
|
|
56
|
+
return;
|
|
57
|
+
if (out.length > 0 && spaceBefore)
|
|
58
|
+
out.push(' ');
|
|
59
|
+
out.push(part);
|
|
60
|
+
}
|
|
61
|
+
export function normalizeSuggestionForKey(suggestion) {
|
|
62
|
+
// Suggestions are intentionally distinguished by their full short text.
|
|
63
|
+
// Do not apply description noise stripping here.
|
|
64
|
+
return normalizeWithCodeSpans(suggestion, normalizeSuggestionSegment);
|
|
65
|
+
}
|
|
66
|
+
function normalizeWithCodeSpans(input, normalizeProse) {
|
|
67
|
+
if (input === '')
|
|
68
|
+
return '';
|
|
69
|
+
const out = [];
|
|
70
|
+
let cursor = 0;
|
|
71
|
+
for (const match of input.matchAll(CODE_SPAN_RE)) {
|
|
72
|
+
const index = match.index ?? 0;
|
|
73
|
+
const before = input.slice(cursor, index);
|
|
74
|
+
appendNormalizedPart(out, normalizeProse(before), /^\s/.test(before));
|
|
75
|
+
appendNormalizedPart(out, '`' + match[1] + '`', /\s$/.test(before));
|
|
76
|
+
cursor = index + match[0].length;
|
|
77
|
+
}
|
|
78
|
+
const tail = input.slice(cursor);
|
|
79
|
+
appendNormalizedPart(out, normalizeProse(tail), /^\s/.test(tail));
|
|
80
|
+
return out.join('').trim();
|
|
81
|
+
}
|
|
82
|
+
function normalizeSuggestionSegment(s) {
|
|
83
|
+
return s
|
|
84
|
+
.replace(/[A-Za-z][A-Za-z0-9_]*/g, (token) => (isMixedCaseIdentifier(token) ? token : token.toLowerCase()))
|
|
85
|
+
.replace(/\s+/g, ' ')
|
|
86
|
+
.trim();
|
|
87
|
+
}
|
|
88
|
+
function isMixedCaseIdentifier(token) {
|
|
89
|
+
return /[a-z][A-Z]|[A-Z][a-z]+[A-Z]|[A-Z]{2,}[a-z]|^[A-Z0-9_]{3,}$/.test(token);
|
|
90
|
+
}
|
|
91
|
+
function sha1(input) {
|
|
92
|
+
return createHash('sha1').update(input).digest('hex');
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Compute the stable identity key per §5 decision 2:
|
|
96
|
+
* finding_key = sha1(
|
|
97
|
+
* normalized_location + "|" + (category ?? "") + "|" +
|
|
98
|
+
* sha1(description_normalized) + "|" + sha1(suggestion_normalized)
|
|
99
|
+
* )
|
|
100
|
+
*
|
|
101
|
+
* Severity is intentionally excluded — the same underlying issue surfacing at
|
|
102
|
+
* P1 vs P2 across channels should still reconcile to one key.
|
|
103
|
+
*/
|
|
104
|
+
export function computeFindingKey(finding) {
|
|
105
|
+
const loc = normalizeLocationForKey(finding.location);
|
|
106
|
+
const cat = (finding.category ?? '').toLowerCase();
|
|
107
|
+
const descHash = sha1(normalizeDescriptionForKey(finding.description));
|
|
108
|
+
const sugHash = sha1(normalizeSuggestionForKey(finding.suggestion));
|
|
109
|
+
return sha1(`${escapeKeyPart(loc)}|${escapeKeyPart(cat)}|${descHash}|${sugHash}`);
|
|
110
|
+
}
|
|
111
|
+
function escapeKeyPart(part) {
|
|
112
|
+
return part.replace(/\\/g, '\\\\').replace(/\|/g, '\\|');
|
|
113
|
+
}
|
|
114
|
+
export function descriptionShingle(description) {
|
|
115
|
+
const normalized = normalizeDescriptionForKey(description);
|
|
116
|
+
if (normalized.length < 5)
|
|
117
|
+
return [];
|
|
118
|
+
const shingleText = normalizeModalVerbsInProse(normalized);
|
|
119
|
+
const grams = new Set();
|
|
120
|
+
for (let i = 0; i <= shingleText.length - 5; i += 1) {
|
|
121
|
+
grams.add(shingleText.slice(i, i + 5));
|
|
122
|
+
}
|
|
123
|
+
return [...grams];
|
|
124
|
+
}
|
|
125
|
+
export function jaccardSimilarity(a, b) {
|
|
126
|
+
const left = isShingleSet(a) ? a : new Set(a);
|
|
127
|
+
const right = isShingleSet(b) ? b : new Set(b);
|
|
128
|
+
let intersection = 0;
|
|
129
|
+
for (const item of left) {
|
|
130
|
+
if (right.has(item))
|
|
131
|
+
intersection += 1;
|
|
132
|
+
}
|
|
133
|
+
const unionSize = left.size + right.size - intersection;
|
|
134
|
+
return unionSize === 0 ? 1 : intersection / unionSize;
|
|
135
|
+
}
|
|
136
|
+
export function shingleSize(shingle) {
|
|
137
|
+
return isShingleSet(shingle) ? shingle.size : shingle.length;
|
|
138
|
+
}
|
|
139
|
+
function normalizeModalVerbsInProse(description) {
|
|
140
|
+
return normalizeWithCodeSpans(description, normalizeModalVerbs);
|
|
141
|
+
}
|
|
142
|
+
function normalizeModalVerbs(description) {
|
|
143
|
+
return description.replace(/\b(?:must|should)\b/g, 'should');
|
|
144
|
+
}
|
|
145
|
+
function isShingleSet(value) {
|
|
146
|
+
return 'size' in value && 'has' in value;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=stable-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stable-id.js","sourceRoot":"","sources":["../../src/core/stable-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type TrustMode = 'base-ref' | 'untrusted-head' | 'non-git';
|
|
2
|
+
export interface TrustModeArgs {
|
|
3
|
+
diff?: string;
|
|
4
|
+
pr?: number;
|
|
5
|
+
staged?: boolean;
|
|
6
|
+
base?: string;
|
|
7
|
+
'config-base-ref'?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ClassifyOptions {
|
|
10
|
+
cwd: string;
|
|
11
|
+
args: TrustModeArgs;
|
|
12
|
+
/** Hook for tests to stub gh; defaults to live gh CLI. */
|
|
13
|
+
resolvePrBase?: (pr: number, cwd: string) => string | undefined;
|
|
14
|
+
/** Whether we're in CI; defaults to env detection. Injectable for tests. */
|
|
15
|
+
isCI?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Discriminated so a `base-ref` result always carries a `base_ref` and the
|
|
19
|
+
* other modes never do — consumers get this for free from the union.
|
|
20
|
+
*/
|
|
21
|
+
export type ClassifyResult = {
|
|
22
|
+
trust_mode: 'base-ref';
|
|
23
|
+
base_ref: string;
|
|
24
|
+
} | {
|
|
25
|
+
trust_mode: 'untrusted-head' | 'non-git';
|
|
26
|
+
base_ref?: undefined;
|
|
27
|
+
};
|
|
28
|
+
export declare function classifyTrustMode(opts: ClassifyOptions): ClassifyResult;
|
|
29
|
+
//# sourceMappingURL=trust-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-mode.d.ts","sourceRoot":"","sources":["../../src/core/trust-mode.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAAA;AAEjE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,aAAa,CAAA;IACnB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IAC/D,4EAA4E;IAC5E,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAA;AAiEtE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAmCvE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import { findProjectRoot } from './project-root.js';
|
|
5
|
+
import { isSafeRef } from './git-show.js';
|
|
6
|
+
// Ref-name validation is shared with the git-show helper (the trust boundary):
|
|
7
|
+
// an unsafe ref fails closed to untrusted-head here, and readFileAtRef refuses
|
|
8
|
+
// to read it there.
|
|
9
|
+
function asBaseRef(ref) {
|
|
10
|
+
return isSafeRef(ref) ? { trust_mode: 'base-ref', base_ref: ref } : { trust_mode: 'untrusted-head' };
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Broad CI detection — must err toward "yes" because misdetecting CI as local
|
|
14
|
+
* re-opens the self-trust hole. Almost every CI sets CI to a truthy value
|
|
15
|
+
* (GitHub/GitLab/CircleCI/Travis/Buildkite/Vercel/Netlify set CI=true; some use
|
|
16
|
+
* CI=1); a few that don't are covered by their own markers.
|
|
17
|
+
*/
|
|
18
|
+
function detectCI() {
|
|
19
|
+
const ci = process.env.CI;
|
|
20
|
+
if (ci !== undefined && ci !== '' && ci.toLowerCase() !== 'false' && ci !== '0')
|
|
21
|
+
return true;
|
|
22
|
+
return Boolean(process.env.GITHUB_ACTIONS ||
|
|
23
|
+
process.env.GITLAB_CI ||
|
|
24
|
+
process.env.BUILDKITE ||
|
|
25
|
+
process.env.TF_BUILD || // Azure Pipelines
|
|
26
|
+
process.env.JENKINS_URL ||
|
|
27
|
+
process.env.TEAMCITY_VERSION);
|
|
28
|
+
}
|
|
29
|
+
function isGitRepo(cwd) {
|
|
30
|
+
// Authoritative check first: handles worktrees, submodules, monorepo
|
|
31
|
+
// subdirs, and bare-repo edge cases correctly.
|
|
32
|
+
try {
|
|
33
|
+
const out = execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {
|
|
34
|
+
cwd,
|
|
35
|
+
encoding: 'utf-8',
|
|
36
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
37
|
+
timeout: 5000,
|
|
38
|
+
});
|
|
39
|
+
if (out.trim() === 'true')
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// git missing or not a work tree → fall through to the advisory FS check.
|
|
44
|
+
}
|
|
45
|
+
// Advisory fallback (also what the .git-fixture tests exercise). NOT the
|
|
46
|
+
// security boundary: a git repo with no explicit trusted ref classifies as
|
|
47
|
+
// 'untrusted-head', and base-ref modes resolve through real git/gh which fail
|
|
48
|
+
// on a planted/fake .git — so a forged .git only ever yields untrusted-head.
|
|
49
|
+
return fs.existsSync(path.join(findProjectRoot(cwd), '.git'));
|
|
50
|
+
}
|
|
51
|
+
function defaultResolvePrBase(pr, cwd) {
|
|
52
|
+
try {
|
|
53
|
+
const raw = execFileSync('gh', ['pr', 'view', String(pr), '--json', 'baseRefName'], {
|
|
54
|
+
cwd,
|
|
55
|
+
encoding: 'utf-8',
|
|
56
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
57
|
+
timeout: 10000,
|
|
58
|
+
});
|
|
59
|
+
const parsed = JSON.parse(raw);
|
|
60
|
+
if (parsed.baseRefName && parsed.baseRefName.length > 0)
|
|
61
|
+
return parsed.baseRefName;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
export function classifyTrustMode(opts) {
|
|
69
|
+
const { cwd, args } = opts;
|
|
70
|
+
const resolvePrBase = opts.resolvePrBase ?? defaultResolvePrBase;
|
|
71
|
+
const isCI = opts.isCI ?? detectCI();
|
|
72
|
+
// Explicit operator override always wins.
|
|
73
|
+
if (args['config-base-ref'])
|
|
74
|
+
return asBaseRef(args['config-base-ref']);
|
|
75
|
+
if (!isGitRepo(cwd))
|
|
76
|
+
return { trust_mode: 'non-git' };
|
|
77
|
+
// --pr resolves the PR's UPSTREAM base branch via gh, so it determines trust
|
|
78
|
+
// even when a (possibly malicious) --base is also present — matching
|
|
79
|
+
// resolveDiff, which reviews the PR diff. Resolution failure fails closed.
|
|
80
|
+
if (args.pr !== undefined) {
|
|
81
|
+
const resolved = resolvePrBase(args.pr, cwd);
|
|
82
|
+
return resolved ? asBaseRef(resolved) : { trust_mode: 'untrusted-head' };
|
|
83
|
+
}
|
|
84
|
+
if (args.base)
|
|
85
|
+
return asBaseRef(args.base);
|
|
86
|
+
// --staged reviews the index against HEAD. HEAD is a trusted base locally,
|
|
87
|
+
// but in CI it may be an attacker's PR checkout, so fail closed there too —
|
|
88
|
+
// consistent with the no-flag default below.
|
|
89
|
+
if (args.staged)
|
|
90
|
+
return isCI ? { trust_mode: 'untrusted-head' } : asBaseRef('HEAD');
|
|
91
|
+
// Default (plain `mmr review` working tree, or `--diff`): trusting HEAD is
|
|
92
|
+
// safe locally (HEAD is your committed history) but NOT in CI, where the
|
|
93
|
+
// working tree may be an attacker's PR checkout. So `--diff` is always
|
|
94
|
+
// untrusted, and the no-flags default trusts HEAD only outside CI; in CI it
|
|
95
|
+
// fails closed and requires an explicit trusted ref (--pr/--base/
|
|
96
|
+
// --config-base-ref). NOTE: this is stricter than the original plan, which
|
|
97
|
+
// returned base-ref:HEAD unconditionally — changed to close a CI
|
|
98
|
+
// self-trust hole (see Group H note).
|
|
99
|
+
if (args.diff !== undefined || isCI)
|
|
100
|
+
return { trust_mode: 'untrusted-head' };
|
|
101
|
+
return asBaseRef('HEAD');
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=trust-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-mode.js","sourceRoot":"","sources":["../../src/core/trust-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAYpD,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAYpD,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAoDjE"}
|
|
@@ -21,6 +21,15 @@ export function formatMarkdown(results) {
|
|
|
21
21
|
}
|
|
22
22
|
segments.push(`**Elapsed:** ${results.metadata.total_elapsed}`);
|
|
23
23
|
lines.push(segments.join(' | '));
|
|
24
|
+
if (results.trust_mode !== undefined) {
|
|
25
|
+
const trust = [`**Trust:** ${results.trust_mode}`];
|
|
26
|
+
if (results.proposed_config_change)
|
|
27
|
+
trust.push('proposed `.mmr.yaml` change');
|
|
28
|
+
if (results.proposed_acks && results.proposed_acks.length > 0) {
|
|
29
|
+
trust.push(`proposed acks: ${results.proposed_acks.length}`);
|
|
30
|
+
}
|
|
31
|
+
lines.push(trust.join(' | '));
|
|
32
|
+
}
|
|
24
33
|
lines.push('');
|
|
25
34
|
if (results.reconciled_findings.length > 0) {
|
|
26
35
|
lines.push('### Findings');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAYpD,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAYpD,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAiD7D"}
|
package/dist/formatters/text.js
CHANGED
|
@@ -20,6 +20,15 @@ export function formatText(results) {
|
|
|
20
20
|
}
|
|
21
21
|
segments.push(`Channels: ${chCount}`, `Elapsed: ${results.metadata.total_elapsed}`);
|
|
22
22
|
lines.push(segments.join(' | '));
|
|
23
|
+
if (results.trust_mode !== undefined) {
|
|
24
|
+
const trust = [`Trust: ${results.trust_mode}`];
|
|
25
|
+
if (results.proposed_config_change)
|
|
26
|
+
trust.push('proposed .mmr.yaml change');
|
|
27
|
+
if (results.proposed_acks && results.proposed_acks.length > 0) {
|
|
28
|
+
trust.push(`proposed acks: ${results.proposed_acks.length}`);
|
|
29
|
+
}
|
|
30
|
+
lines.push(trust.join(' | '));
|
|
31
|
+
}
|
|
23
32
|
lines.push('');
|
|
24
33
|
if (results.reconciled_findings.length > 0) {
|
|
25
34
|
lines.push(`Findings (${results.reconciled_findings.length}):`);
|