@zigrivers/mmr 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +422 -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 +457 -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 +66 -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 +869 -53
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +151 -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 +65 -2
- package/dist/core/auth.js.map +1 -1
- package/dist/core/compensator.d.ts +32 -4
- package/dist/core/compensator.d.ts.map +1 -1
- package/dist/core/compensator.js +118 -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 +7 -0
- package/dist/core/dispatcher.d.ts.map +1 -1
- package/dist/core/dispatcher.js +21 -3
- 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/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,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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AA6BzC,+EAA+E;AAC/E,+EAA+E;AAC/E,oBAAoB;AACpB,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAA;AACtG,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ;IACf,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAA;IACzB,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC5F,OAAO,OAAO,CACZ,OAAO,CAAC,GAAG,CAAC,cAAc;QACxB,OAAO,CAAC,GAAG,CAAC,SAAS;QACrB,OAAO,CAAC,GAAG,CAAC,SAAS;QACrB,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,kBAAkB;QAC1C,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAC/B,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,qEAAqE;IACrE,+CAA+C;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;YACtE,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QACF,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;IACD,yEAAyE;IACzE,2EAA2E;IAC3E,8EAA8E;IAC9E,6EAA6E;IAC7E,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAU,EAAE,GAAW;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE;YAClF,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,KAAK;SACf,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAA;QAC1D,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,WAAW,CAAA;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;IAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,oBAAoB,CAAA;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAA;IAEpC,0CAA0C;IAC1C,IAAI,IAAI,CAAC,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAEtE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAA;IAErD,6EAA6E;IAC7E,qEAAqE;IACrE,2EAA2E;IAC3E,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QAC5C,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAA;IAC1E,CAAC;IAED,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE1C,2EAA2E;IAC3E,4EAA4E;IAC5E,6CAA6C;IAC7C,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAEnF,2EAA2E;IAC3E,yEAAyE;IACzE,uEAAuE;IACvE,4EAA4E;IAC5E,kEAAkE;IAClE,2EAA2E;IAC3E,iEAAiE;IACjE,sCAAsC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI;QAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAA;IAC5E,OAAO,SAAS,CAAC,MAAM,CAAC,CAAA;AAC1B,CAAC"}
|
|
@@ -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":"AAEA,SAAS,YAAY,CAAC,OAAqC;IACzD,QAAQ,OAAO,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAA;QAC5B,KAAK,eAAe,CAAC,CAAC,OAAO,QAAQ,CAAA;QACrC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAA;QAChC,KAAK,qBAAqB,CAAC,CAAC,OAAO,gBAAgB,CAAA;QACnD,OAAO,CAAC,CAAC,OAAO,SAAS,CAAA;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA0B;IACvD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1C,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,MAAM,QAAQ,GAAG;QACf,YAAY,OAAO,CAAC,MAAM,EAAE;QAC5B,kBAAkB,OAAO,CAAC,aAAa,EAAE;KAC1C,CAAA;IACD,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IAC1D,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAA;IAC/D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,IAAI,OAAO,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;QACtF,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;QACtF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC5E,MAAM,GAAG,GAAG;gBACV,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;gBAC1C,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS;aACpC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;QACxB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,OAAO,GAAG,CAAC,CAAA;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAEA,SAAS,YAAY,CAAC,OAAqC;IACzD,QAAQ,OAAO,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAA;QAC5B,KAAK,eAAe,CAAC,CAAC,OAAO,QAAQ,CAAA;QACrC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAA;QAChC,KAAK,qBAAqB,CAAC,CAAC,OAAO,gBAAgB,CAAA;QACnD,OAAO,CAAC,CAAC,OAAO,SAAS,CAAA;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA0B;IACvD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1C,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,MAAM,QAAQ,GAAG;QACf,YAAY,OAAO,CAAC,MAAM,EAAE;QAC5B,kBAAkB,OAAO,CAAC,aAAa,EAAE;KAC1C,CAAA;IACD,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IAC1D,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAA;IAC/D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChC,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,CAAC,cAAc,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;QAClD,IAAI,OAAO,CAAC,sBAAsB;YAAE,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QAC7E,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;QAC9D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,IAAI,OAAO,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;QACtF,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;QACtF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC5E,MAAM,GAAG,GAAG;gBACV,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;gBAC1C,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS;aACpC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;QACxB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,OAAO,GAAG,CAAC,CAAA;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -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}):`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"AAEA,SAAS,YAAY,CAAC,OAAqC;IACzD,QAAQ,OAAO,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAA;QAC5B,KAAK,eAAe,CAAC,CAAC,OAAO,QAAQ,CAAA;QACrC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAA;QAChC,KAAK,qBAAqB,CAAC,CAAC,OAAO,gBAAgB,CAAA;QACnD,OAAO,CAAC,CAAC,OAAO,SAAS,CAAA;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1C,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAA;IAChG,MAAM,QAAQ,GAAG;QACf,cAAc,OAAO,CAAC,aAAa,EAAE;KACtC,CAAA;IACD,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,QAAQ,CAAC,IAAI,CACX,aAAa,OAAO,EAAE,EACtB,YAAY,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,CAC7C,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,IAAI,OAAO,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,mBAAmB,CAAC,MAAM,IAAI,CAAC,CAAA;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC7C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;YAClC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;YAC/C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAA;YACnE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACvB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,OAAO,GAAG,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { OutputParserConfig } from './config/schema.js';
|
|
1
2
|
export type Severity = 'P0' | 'P1' | 'P2' | 'P3';
|
|
2
3
|
export declare const SEVERITY_ORDER: Record<Severity, number>;
|
|
3
4
|
export type ChannelStatus = 'dispatched' | 'running' | 'completed' | 'timeout' | 'failed' | 'auth_failed' | 'not_installed' | 'skipped';
|
|
@@ -7,6 +8,13 @@ export type Verdict = 'pass' | 'degraded-pass' | 'blocked' | 'needs-user-decisio
|
|
|
7
8
|
export type Agreement = 'consensus' | 'majority' | 'unique';
|
|
8
9
|
export type Confidence = 'high' | 'medium' | 'low';
|
|
9
10
|
export type OutputFormat = 'json' | 'text' | 'markdown';
|
|
11
|
+
export interface ReviewControls {
|
|
12
|
+
max_rounds?: number;
|
|
13
|
+
accept_new_acks: boolean;
|
|
14
|
+
trust_project_acks: boolean;
|
|
15
|
+
trust_project_config: boolean;
|
|
16
|
+
config_base_ref?: string;
|
|
17
|
+
}
|
|
10
18
|
export declare const TERMINAL_STATUSES: ReadonlySet<ChannelStatus>;
|
|
11
19
|
export interface Finding {
|
|
12
20
|
id?: string;
|
|
@@ -20,6 +28,21 @@ export interface ReconciledFinding extends Finding {
|
|
|
20
28
|
confidence: Confidence;
|
|
21
29
|
sources: string[];
|
|
22
30
|
agreement: Agreement;
|
|
31
|
+
/** Stable content-hashed identity (T2-A, §5 decision 2). */
|
|
32
|
+
finding_key?: string;
|
|
33
|
+
/** Char-5-gram set of normalized description for cross-round fuzzy match. */
|
|
34
|
+
description_shingle?: string[];
|
|
35
|
+
/** True when this finding has been silenced via `mmr ack` (T2-D). */
|
|
36
|
+
acknowledged?: boolean;
|
|
37
|
+
ack_reason?: string;
|
|
38
|
+
/** How the ack was resolved: exact key match or location-anchored Jaccard fallback. */
|
|
39
|
+
ack_match?: 'exact' | 'fuzzy';
|
|
40
|
+
/** Reserved for T2-C (v3.31): finding was auto-downgraded after repeat threshold. */
|
|
41
|
+
auto_downgraded?: boolean;
|
|
42
|
+
/** Reserved for T2-C (v3.31): finding was auto-suppressed after repeat threshold. */
|
|
43
|
+
auto_suppressed?: boolean;
|
|
44
|
+
/** Reserved for T2-C: how the cross-round repeat was matched. */
|
|
45
|
+
repeat_match?: 'exact' | 'fuzzy';
|
|
23
46
|
}
|
|
24
47
|
export interface ChannelResult {
|
|
25
48
|
status: ChannelStatus;
|
|
@@ -35,6 +58,20 @@ export interface JobMetadata {
|
|
|
35
58
|
format: OutputFormat;
|
|
36
59
|
created_at: string;
|
|
37
60
|
channels: Record<string, ChannelJobEntry>;
|
|
61
|
+
/** Session linkage (T2-B). Optional; absent in legacy jobs. */
|
|
62
|
+
session_id?: string;
|
|
63
|
+
/** One-based round counter within a session (T2-B). */
|
|
64
|
+
round?: number;
|
|
65
|
+
/** Parsed review loop/security controls used for this invocation. */
|
|
66
|
+
review_controls?: ReviewControls;
|
|
67
|
+
/**
|
|
68
|
+
* Trust context captured at review time (§5 decision 1), persisted so the
|
|
69
|
+
* results pipeline re-surfaces it on every run (review --sync, results,
|
|
70
|
+
* reconcile) rather than only the original stdout.
|
|
71
|
+
*/
|
|
72
|
+
trust_mode?: 'base-ref' | 'untrusted-head' | 'non-git';
|
|
73
|
+
proposed_acks?: string[];
|
|
74
|
+
proposed_config_change?: boolean;
|
|
38
75
|
}
|
|
39
76
|
export interface ChannelJobEntry {
|
|
40
77
|
status: ChannelStatus;
|
|
@@ -45,7 +82,7 @@ export interface ChannelJobEntry {
|
|
|
45
82
|
completed_at?: string;
|
|
46
83
|
elapsed?: string;
|
|
47
84
|
findings_count?: number;
|
|
48
|
-
output_parser?: string;
|
|
85
|
+
output_parser?: string | OutputParserConfig;
|
|
49
86
|
}
|
|
50
87
|
export interface ReconciledResults {
|
|
51
88
|
job_id: string;
|
|
@@ -62,6 +99,12 @@ export interface ReconciledResults {
|
|
|
62
99
|
channels_partial: number;
|
|
63
100
|
total_elapsed: string;
|
|
64
101
|
};
|
|
102
|
+
/** Trust mode under which this review ran (§5 decision 1). */
|
|
103
|
+
trust_mode?: 'base-ref' | 'untrusted-head' | 'non-git';
|
|
104
|
+
/** Ack-file paths added/modified by the diff under review. */
|
|
105
|
+
proposed_acks?: string[];
|
|
106
|
+
/** True when `.mmr.yaml` was added/modified by the diff under review. */
|
|
107
|
+
proposed_config_change?: boolean;
|
|
65
108
|
}
|
|
66
109
|
export type { MmrConfigParsed as MmrConfig, ChannelConfigParsed as ChannelConfig } from './config/schema.js';
|
|
67
110
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAKnD,CAAA;AAED,MAAM,MAAM,aAAa,GACrB,YAAY,GACZ,SAAS,GACT,WAAW,GACX,SAAS,GACT,QAAQ,GACR,aAAa,GACb,eAAe,GACf,SAAS,CAAA;AAEb,8GAA8G;AAC9G,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,CAAA;AAE9D,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,qBAAqB,CAAA;AAElF,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAA;AAE3D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;AAElD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAA;AAEvD,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,aAAa,CAEvD,CAAA;AAEF,MAAM,WAAW,OAAO;IACtB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,OAAO;IAChD,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAKnD,CAAA;AAED,MAAM,MAAM,aAAa,GACrB,YAAY,GACZ,SAAS,GACT,WAAW,GACX,SAAS,GACT,QAAQ,GACR,aAAa,GACb,eAAe,GACf,SAAS,CAAA;AAEb,8GAA8G;AAC9G,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,CAAA;AAE9D,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,qBAAqB,CAAA;AAElF,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAA;AAE3D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;AAElD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,OAAO,CAAA;IACxB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,oBAAoB,EAAE,OAAO,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,aAAa,CAEvD,CAAA;AAEF,MAAM,WAAW,OAAO;IACtB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,OAAO;IAChD,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,SAAS,CAAA;IACpB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uFAAuF;IACvF,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;IAC7B,qFAAqF;IACrF,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,qFAAqF;IACrF,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iEAAiE;IACjE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,SAAS,CAAA;IACjB,aAAa,EAAE,QAAQ,CAAA;IACvB,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACzC,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC;;;;OAIG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAAA;IACtD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAA;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,QAAQ,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB,EAAE,iBAAiB,EAAE,CAAA;IACxC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC1C,QAAQ,EAAE;QACR,mBAAmB,EAAE,MAAM,CAAA;QAC3B,kBAAkB,EAAE,MAAM,CAAA;QAC1B,gBAAgB,EAAE,MAAM,CAAA;QACxB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;IACD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAAA;IACtD,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,yEAAyE;IACzE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AAID,YAAY,EAAE,eAAe,IAAI,SAAS,EAAE,mBAAmB,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,cAAc,GAA6B;IACtD,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;CACN,CAAA;AA+BD,MAAM,CAAC,MAAM,iBAAiB,GAA+B,IAAI,GAAG,CAAC;IACnE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS;CAC5E,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zigrivers/mmr",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Multi-model code review CLI — async dispatch, reconciliation, and severity gating",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"test": "vitest run",
|
|
33
33
|
"test:coverage": "vitest run --coverage",
|
|
34
34
|
"lint": "eslint src/",
|
|
35
|
-
"type-check": "tsc
|
|
35
|
+
"type-check": "tsc -p tsconfig.check.json",
|
|
36
36
|
"check": "npm run lint && npm run type-check && npm test"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|