@maind-dev/cli 0.4.0 → 0.6.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 +50 -0
- package/build/ci-report.js +17 -1
- package/build/ci-report.js.map +1 -1
- package/build/git-context.js +2 -0
- package/build/git-context.js.map +1 -1
- package/build/git.js +5 -34
- package/build/git.js.map +1 -1
- package/build/index-cmd.js +245 -0
- package/build/index-cmd.js.map +1 -0
- package/build/index.js +74 -2
- package/build/index.js.map +1 -1
- package/build/mcp-client.js +4 -0
- package/build/mcp-client.js.map +1 -1
- package/build/review-render.js +231 -0
- package/build/review-render.js.map +1 -0
- package/build/review.js +296 -0
- package/build/review.js.map +1 -0
- package/build/sync-cmd.js +140 -0
- package/build/sync-cmd.js.map +1 -0
- package/package.json +14 -10
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,EAAE;AACF,gCAAgC;AAChC,EAAE;AACF,uEAAuE;AACvE,2EAA2E;AAC3E,gFAAgF;AAChF,sEAAsE;AACtE,EAAE;AACF,yEAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/mcp-client.js
CHANGED
|
@@ -22,6 +22,7 @@ export class McpClient {
|
|
|
22
22
|
apiKey;
|
|
23
23
|
deviceId;
|
|
24
24
|
clientVersion;
|
|
25
|
+
projectKey;
|
|
25
26
|
sessionId = null;
|
|
26
27
|
nextId = 1;
|
|
27
28
|
initialized = false;
|
|
@@ -29,6 +30,7 @@ export class McpClient {
|
|
|
29
30
|
this.apiKey = cfg.apiKey;
|
|
30
31
|
this.deviceId = cfg.deviceId;
|
|
31
32
|
this.clientVersion = cfg.clientVersion;
|
|
33
|
+
this.projectKey = cfg.projectKey ?? null;
|
|
32
34
|
this.mcpUrl = cfg.mcpUrl ?? process.env.MAIND_MCP_URL ?? DEFAULT_MCP_URL;
|
|
33
35
|
}
|
|
34
36
|
headers() {
|
|
@@ -41,6 +43,8 @@ export class McpClient {
|
|
|
41
43
|
};
|
|
42
44
|
if (this.deviceId)
|
|
43
45
|
h["x-maind-device-id"] = this.deviceId;
|
|
46
|
+
if (this.projectKey)
|
|
47
|
+
h["x-maind-project-key"] = this.projectKey;
|
|
44
48
|
if (this.sessionId)
|
|
45
49
|
h["mcp-session-id"] = this.sessionId;
|
|
46
50
|
return h;
|
package/build/mcp-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAE1E,MAAM,eAAe,GAAG,2BAA2B,CAAC;AACpD,MAAM,aAAa,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// Rendering of the `maind review` artifacts (ADR-228, Review-Layer M2):
|
|
2
|
+
// - review.md — full findings report for the human/agent (always written)
|
|
3
|
+
// - review manifest — machine-facing JSON (schema maind.review.manifest/v1),
|
|
4
|
+
// the attribution backbone analog to buildManifest()
|
|
5
|
+
// - PR comment — provider-neutral markdown the CI workflow posts via
|
|
6
|
+
// `gh api`; line 1 carries the idempotency marker so the
|
|
7
|
+
// workflow can update-instead-of-duplicate
|
|
8
|
+
//
|
|
9
|
+
// Binding format decisions (HANDOFF 2026-07-14 M2):
|
|
10
|
+
// - severities as text badges (`**[required]**`), no images/emoji
|
|
11
|
+
// - conventions cited as `id@version` WITHOUT links (no public convention page
|
|
12
|
+
// exists — don't invent 404s); lesson hints unlinked for the same reason
|
|
13
|
+
// - coverage_note verbatim as blockquote
|
|
14
|
+
// - comment capped at ~30 findings + pointer to the report artifact
|
|
15
|
+
// - footer "maind review · deterministic, provenance-backed"
|
|
16
|
+
const COMMENT_MARKER = "<!-- maind-review -->";
|
|
17
|
+
const COMMENT_FINDINGS_CAP = 30;
|
|
18
|
+
const FOOTER = "maind review · deterministic, provenance-backed";
|
|
19
|
+
export function buildReviewManifest(data, verdict, meta) {
|
|
20
|
+
const review = data.review;
|
|
21
|
+
return {
|
|
22
|
+
schema: "maind.review.manifest/v1",
|
|
23
|
+
generated_at: meta.generatedAt,
|
|
24
|
+
key_prefix: meta.keyPrefix,
|
|
25
|
+
run_ref: meta.runRef,
|
|
26
|
+
base: meta.base,
|
|
27
|
+
diff_stats: meta.diffStats,
|
|
28
|
+
symbol_count: meta.symbolCount,
|
|
29
|
+
risk_flags: review?.risk_flags ?? [],
|
|
30
|
+
findings: (review?.convention_findings ?? []).map((f) => ({
|
|
31
|
+
convention_id: f.convention_id,
|
|
32
|
+
version: f.convention_version,
|
|
33
|
+
severity: f.severity,
|
|
34
|
+
grade: f.grade,
|
|
35
|
+
matched_symbol_count: f.matched_symbols.length,
|
|
36
|
+
matched_changed_symbol_count: f.matched_changed_symbols?.length ?? 0,
|
|
37
|
+
})),
|
|
38
|
+
served: (review?.lesson_hints ?? []).map((l) => ({
|
|
39
|
+
id: l.id,
|
|
40
|
+
version: typeof l.version === "number" ? l.version : null,
|
|
41
|
+
tier: l.tier ?? null,
|
|
42
|
+
})),
|
|
43
|
+
verdict: verdict?.ok === true && typeof verdict.verdict === "string"
|
|
44
|
+
? {
|
|
45
|
+
verdict: verdict.verdict,
|
|
46
|
+
counts: {
|
|
47
|
+
block: verdict.counts?.block ?? 0,
|
|
48
|
+
warn: verdict.counts?.warn ?? 0,
|
|
49
|
+
note: verdict.counts?.note ?? 0,
|
|
50
|
+
},
|
|
51
|
+
fail_on: meta.failOn,
|
|
52
|
+
}
|
|
53
|
+
: null,
|
|
54
|
+
coverage_note: review?.coverage_note ?? null,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function severityBadge(f) {
|
|
58
|
+
return `**[${f.severity}]**`;
|
|
59
|
+
}
|
|
60
|
+
function findingLine(f) {
|
|
61
|
+
const cite = `\`${f.convention_id}@v${f.convention_version}\``;
|
|
62
|
+
const grade = f.grade === "verdict" ? " · verdict-grade" : "";
|
|
63
|
+
const changed = f.matched_changed_symbols?.length ?? 0;
|
|
64
|
+
const matchInfo = changed > 0
|
|
65
|
+
? `matched on changed symbols: ${formatSymbols(f.matched_changed_symbols ?? [])}`
|
|
66
|
+
: `matched (co-located): ${formatSymbols(f.matched_symbols)}`;
|
|
67
|
+
const summary = f.summary?.trim() ? ` — ${f.summary.trim()}` : "";
|
|
68
|
+
return `- ${severityBadge(f)} ${cite}${summary}${grade}\n ${matchInfo}`;
|
|
69
|
+
}
|
|
70
|
+
function formatSymbols(symbols, max = 4) {
|
|
71
|
+
const shown = symbols.slice(0, max).map((s) => `\`${s}\``);
|
|
72
|
+
const rest = symbols.length - shown.length;
|
|
73
|
+
return shown.join(", ") + (rest > 0 ? ` (+${rest} more)` : "");
|
|
74
|
+
}
|
|
75
|
+
function verdictLabel(verdict) {
|
|
76
|
+
const counts = verdict.counts ?? {};
|
|
77
|
+
return (`**Verdict: ${(verdict.verdict ?? "?").toUpperCase()}** ` +
|
|
78
|
+
`(block: ${counts.block ?? 0} · warn: ${counts.warn ?? 0} · note: ${counts.note ?? 0})`);
|
|
79
|
+
}
|
|
80
|
+
function baseLabel(meta) {
|
|
81
|
+
return meta.base ? `against \`${meta.base}\`` : "uncommitted work";
|
|
82
|
+
}
|
|
83
|
+
/** The full report artifact (`--out`, default .maind/review.md). */
|
|
84
|
+
export function renderReviewMarkdown(data, verdict, meta) {
|
|
85
|
+
const review = data.review;
|
|
86
|
+
const findings = review?.convention_findings ?? [];
|
|
87
|
+
const hints = review?.lesson_hints ?? [];
|
|
88
|
+
const riskFlags = review?.risk_flags ?? [];
|
|
89
|
+
const lines = [];
|
|
90
|
+
lines.push("<!-- Generated by `maind review` — do not edit by hand. -->");
|
|
91
|
+
lines.push(`<!-- generated_at: ${meta.generatedAt} | key: ${meta.keyPrefix}${meta.runRef ? ` | run: ${meta.runRef}` : ""} -->`);
|
|
92
|
+
lines.push("");
|
|
93
|
+
lines.push("# maind review");
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push(`Reviewed ${baseLabel(meta)}: ${meta.symbolCount} changed symbol(s) across ` +
|
|
96
|
+
`${meta.diffStats?.changed_file_count ?? 0} file(s) · findings: ${findings.length} · ` +
|
|
97
|
+
`risk flags: ${riskFlags.length} · lesson hints: ${hints.length}`);
|
|
98
|
+
lines.push("");
|
|
99
|
+
if (verdict?.ok === true && verdict.verdict) {
|
|
100
|
+
lines.push(verdictLabel(verdict));
|
|
101
|
+
if (verdict.trust_note) {
|
|
102
|
+
lines.push("");
|
|
103
|
+
lines.push(`_${verdict.trust_note}_`);
|
|
104
|
+
}
|
|
105
|
+
lines.push("");
|
|
106
|
+
}
|
|
107
|
+
if (findings.length > 0) {
|
|
108
|
+
lines.push("## Convention findings");
|
|
109
|
+
lines.push("");
|
|
110
|
+
for (const f of findings)
|
|
111
|
+
lines.push(findingLine(f));
|
|
112
|
+
lines.push("");
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
lines.push("## Convention findings");
|
|
116
|
+
lines.push("");
|
|
117
|
+
lines.push("_No convention findings for this change set._");
|
|
118
|
+
lines.push("");
|
|
119
|
+
}
|
|
120
|
+
if (riskFlags.length > 0) {
|
|
121
|
+
lines.push("## Risk flags");
|
|
122
|
+
lines.push("");
|
|
123
|
+
lines.push("_Path heuristics from the local diff — informational, they never block._");
|
|
124
|
+
lines.push("");
|
|
125
|
+
for (const flag of riskFlags)
|
|
126
|
+
lines.push(`- \`${flag}\``);
|
|
127
|
+
lines.push("");
|
|
128
|
+
}
|
|
129
|
+
if (hints.length > 0) {
|
|
130
|
+
lines.push("## Lesson hints");
|
|
131
|
+
lines.push("");
|
|
132
|
+
lines.push("_Semantic suggestions — advisory, never part of a verdict._");
|
|
133
|
+
lines.push("");
|
|
134
|
+
for (const h of hints) {
|
|
135
|
+
const parts = [`\`${h.id}\``];
|
|
136
|
+
if (h.tier)
|
|
137
|
+
parts.push(h.tier);
|
|
138
|
+
if (h.match_reason)
|
|
139
|
+
parts.push(h.match_reason);
|
|
140
|
+
lines.push(`- **${h.title}** (${parts.join(" · ")})`);
|
|
141
|
+
}
|
|
142
|
+
lines.push("");
|
|
143
|
+
}
|
|
144
|
+
if (review?.coverage_note) {
|
|
145
|
+
lines.push("## Coverage");
|
|
146
|
+
lines.push("");
|
|
147
|
+
lines.push(`> ${review.coverage_note}`);
|
|
148
|
+
lines.push("");
|
|
149
|
+
}
|
|
150
|
+
lines.push("---");
|
|
151
|
+
lines.push(FOOTER);
|
|
152
|
+
lines.push("");
|
|
153
|
+
return lines.join("\n");
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The PR comment artifact (`--comment`). Line 1 is the idempotency marker the
|
|
157
|
+
* workflow greps for to update the existing comment instead of stacking a new
|
|
158
|
+
* one. The CLI never posts this itself — provider tokens stay in the workflow.
|
|
159
|
+
*/
|
|
160
|
+
export function renderReviewComment(data, verdict, meta, reportPath) {
|
|
161
|
+
const review = data.review;
|
|
162
|
+
const findings = review?.convention_findings ?? [];
|
|
163
|
+
const riskFlags = review?.risk_flags ?? [];
|
|
164
|
+
const hints = review?.lesson_hints ?? [];
|
|
165
|
+
const lines = [];
|
|
166
|
+
lines.push(COMMENT_MARKER);
|
|
167
|
+
lines.push("## maind review");
|
|
168
|
+
lines.push("");
|
|
169
|
+
if (verdict?.ok === true && verdict.verdict) {
|
|
170
|
+
lines.push(verdictLabel(verdict));
|
|
171
|
+
lines.push("");
|
|
172
|
+
}
|
|
173
|
+
if (findings.length === 0) {
|
|
174
|
+
lines.push(`No convention findings for this change set (${meta.symbolCount} changed symbol(s) reviewed ${baseLabel(meta)}).`);
|
|
175
|
+
lines.push("");
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const shown = findings.slice(0, COMMENT_FINDINGS_CAP);
|
|
179
|
+
for (const f of shown)
|
|
180
|
+
lines.push(findingLine(f));
|
|
181
|
+
if (findings.length > shown.length) {
|
|
182
|
+
lines.push("");
|
|
183
|
+
lines.push(`…and ${findings.length - shown.length} more finding(s) — see the \`${reportPath}\` build artifact.`);
|
|
184
|
+
}
|
|
185
|
+
lines.push("");
|
|
186
|
+
}
|
|
187
|
+
if (riskFlags.length > 0) {
|
|
188
|
+
lines.push(`**Risk flags:** ${riskFlags.map((f) => `\`${f}\``).join(" · ")} _(heuristics, never blocking)_`);
|
|
189
|
+
lines.push("");
|
|
190
|
+
}
|
|
191
|
+
if (hints.length > 0) {
|
|
192
|
+
lines.push("**Related lessons:** " + hints.map((h) => `\`${h.id}\``).join(" · "));
|
|
193
|
+
lines.push("");
|
|
194
|
+
}
|
|
195
|
+
if (review?.coverage_note) {
|
|
196
|
+
lines.push(`> ${review.coverage_note}`);
|
|
197
|
+
lines.push("");
|
|
198
|
+
}
|
|
199
|
+
lines.push("---");
|
|
200
|
+
lines.push(`_${FOOTER}_`);
|
|
201
|
+
lines.push("");
|
|
202
|
+
return lines.join("\n");
|
|
203
|
+
}
|
|
204
|
+
/** Fail-open report — written so the artifact path always exists (CI-stable). */
|
|
205
|
+
export function renderFailOpenReview(meta, reason) {
|
|
206
|
+
return [
|
|
207
|
+
"<!-- Generated by `maind review` (fail-open path). -->",
|
|
208
|
+
`<!-- generated_at: ${meta.generatedAt} -->`,
|
|
209
|
+
"",
|
|
210
|
+
"# maind review",
|
|
211
|
+
"",
|
|
212
|
+
`_maind review was unavailable for this run: ${reason}_`,
|
|
213
|
+
"",
|
|
214
|
+
"The build can proceed normally — this file is informational only.",
|
|
215
|
+
"",
|
|
216
|
+
].join("\n");
|
|
217
|
+
}
|
|
218
|
+
/** Fail-open PR comment — keeps the marker so a later fixed run replaces it. */
|
|
219
|
+
export function renderFailOpenComment(meta, reason) {
|
|
220
|
+
return [
|
|
221
|
+
COMMENT_MARKER,
|
|
222
|
+
"## maind review",
|
|
223
|
+
"",
|
|
224
|
+
`_maind review was unavailable for this run: ${reason}_`,
|
|
225
|
+
"",
|
|
226
|
+
"---",
|
|
227
|
+
`_${FOOTER}_`,
|
|
228
|
+
"",
|
|
229
|
+
].join("\n");
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=review-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-render.js","sourceRoot":"","sources":["../src/review-render.ts"],"names":[],"mappings":"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"}
|
package/build/review.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
// `maind review` — provenance-backed review findings for a change set (ADR-228,
|
|
2
|
+
// Review-Layer M2). Links the engine DIRECTLY (@maind/code-index/node — no bridge
|
|
3
|
+
// in CI): enumerates hunk-graded symbols + risk flags locally, sends the path-free
|
|
4
|
+
// review_args equivalent to the cloud tool review_changes, and renders the
|
|
5
|
+
// findings as a report artifact + optional PR-comment markdown.
|
|
6
|
+
//
|
|
7
|
+
// The CLI never posts the PR comment itself — provider tokens (GITHUB_TOKEN) stay
|
|
8
|
+
// in the workflow; the comment file carries the idempotency marker in line 1.
|
|
9
|
+
//
|
|
10
|
+
// Exit semantics (binding, HANDOFF 2026-07-14 M2):
|
|
11
|
+
// 0 advisory/pass — the default, fail-open like `context`/`ci-*`: findings,
|
|
12
|
+
// quota limits, plan gates, and infra errors all exit 0 so CI proceeds
|
|
13
|
+
// 1 ONLY a server verdict crossing `--fail-on` (requires `--gate`)
|
|
14
|
+
// 2 infra errors ONLY under `--strict`
|
|
15
|
+
// Plan-gate on `--gate` (no Team plan) = config hint + exit 0, findings still
|
|
16
|
+
// rendered — the advisory half never degrades because the gate half is gated.
|
|
17
|
+
import { execFileSync } from "node:child_process";
|
|
18
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
19
|
+
import { dirname } from "node:path";
|
|
20
|
+
import { createNodeCodeIndex } from "@maind/code-index/node";
|
|
21
|
+
import { MissingApiKeyError, resolveAuth } from "./auth.js";
|
|
22
|
+
import { gatherGitState } from "./git.js";
|
|
23
|
+
import { McpClient } from "./mcp-client.js";
|
|
24
|
+
import { buildReviewManifest, renderFailOpenComment, renderFailOpenReview, renderReviewComment, renderReviewMarkdown, } from "./review-render.js";
|
|
25
|
+
const PROJECT_KEY_RE = /^[a-f0-9]{64}$/;
|
|
26
|
+
const CLI_CLIENT_VERSION = "0.6.0";
|
|
27
|
+
const DEFAULT_COMMENT_PATH = ".maind/review-comment.md";
|
|
28
|
+
// review_changes caps changed_symbols at 64 server-side; the engine truncates
|
|
29
|
+
// co_located first, so the cap keeps the gating-relevant symbols.
|
|
30
|
+
const SYMBOL_CAP = 64;
|
|
31
|
+
/** Parses the `review` subcommand flags. Unknown flags are ignored (forward-compat). */
|
|
32
|
+
export function parseReviewArgs(argv) {
|
|
33
|
+
const get = (name) => {
|
|
34
|
+
const i = argv.indexOf(name);
|
|
35
|
+
if (i === -1 || i + 1 >= argv.length)
|
|
36
|
+
return undefined;
|
|
37
|
+
return argv[i + 1];
|
|
38
|
+
};
|
|
39
|
+
const has = (name) => argv.includes(name);
|
|
40
|
+
// `--comment [<path>]`: value is optional — a following token that looks like
|
|
41
|
+
// a flag means the default path is wanted.
|
|
42
|
+
let comment = null;
|
|
43
|
+
const ci = argv.indexOf("--comment");
|
|
44
|
+
if (ci !== -1) {
|
|
45
|
+
const next = argv[ci + 1];
|
|
46
|
+
comment = next && !next.startsWith("--") ? next : DEFAULT_COMMENT_PATH;
|
|
47
|
+
}
|
|
48
|
+
const failOnRaw = get("--fail-on");
|
|
49
|
+
const failOn = failOnRaw === "block" || failOnRaw === "warn" ? failOnRaw : null;
|
|
50
|
+
return {
|
|
51
|
+
base: get("--base") ?? null,
|
|
52
|
+
uncommitted: has("--uncommitted"),
|
|
53
|
+
summary: get("--summary") ?? null,
|
|
54
|
+
json: has("--json"),
|
|
55
|
+
out: get("--out") ?? ".maind/review.md",
|
|
56
|
+
comment,
|
|
57
|
+
gate: has("--gate"),
|
|
58
|
+
failOn,
|
|
59
|
+
strict: has("--strict"),
|
|
60
|
+
noReport: has("--no-report"),
|
|
61
|
+
projectKey: get("--project-key") ?? null,
|
|
62
|
+
mcpUrl: get("--mcp-url") ?? null,
|
|
63
|
+
runRef: get("--run-ref") ?? process.env.GITHUB_RUN_ID ?? null,
|
|
64
|
+
clientVersion: CLI_CLIENT_VERSION,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function nowIso() {
|
|
68
|
+
return new Date().toISOString();
|
|
69
|
+
}
|
|
70
|
+
function writeArtifact(path, content) {
|
|
71
|
+
const dir = dirname(path);
|
|
72
|
+
if (dir && dir !== ".")
|
|
73
|
+
mkdirSync(dir, { recursive: true });
|
|
74
|
+
writeFileSync(path, content, "utf8");
|
|
75
|
+
}
|
|
76
|
+
/** Manifest path derived from the report path (review.md → review.json). */
|
|
77
|
+
export function manifestPathFor(out) {
|
|
78
|
+
return out.endsWith(".md") ? out.slice(0, -3) + ".json" : out + ".json";
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Exit-1 decision (binding matrix): `--fail-on block` fails only on block,
|
|
82
|
+
* `--fail-on warn` on warn or block. Pure so the matrix is unit-testable.
|
|
83
|
+
*/
|
|
84
|
+
export function verdictCrossesFailOn(verdict, failOn) {
|
|
85
|
+
return failOn === "block" ? verdict === "block" : verdict === "block" || verdict === "warn";
|
|
86
|
+
}
|
|
87
|
+
/** git repo top-level, or null when not in a repo (review is git-based). */
|
|
88
|
+
function resolveRepoRoot() {
|
|
89
|
+
try {
|
|
90
|
+
return execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
91
|
+
encoding: "utf8",
|
|
92
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
93
|
+
}).trim();
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Runs the review. See the exit-semantics contract at the top of this file. */
|
|
100
|
+
export async function runReview(opts) {
|
|
101
|
+
const meta = {
|
|
102
|
+
generatedAt: nowIso(),
|
|
103
|
+
keyPrefix: "unknown",
|
|
104
|
+
runRef: opts.runRef,
|
|
105
|
+
base: opts.base,
|
|
106
|
+
mcpUrl: opts.mcpUrl ?? process.env.MAIND_MCP_URL ?? "https://mcp.maind.dev/mcp",
|
|
107
|
+
symbolCount: 0,
|
|
108
|
+
diffStats: null,
|
|
109
|
+
gate: opts.gate,
|
|
110
|
+
failOn: opts.gate ? opts.failOn : null,
|
|
111
|
+
};
|
|
112
|
+
if (opts.failOn && !opts.gate) {
|
|
113
|
+
warn("--fail-on has no effect without --gate (advisory runs always exit 0).");
|
|
114
|
+
}
|
|
115
|
+
const failOpen = (reason) => {
|
|
116
|
+
warn(`review unavailable, ${opts.strict ? "failing (--strict)" : "continuing"}: ${reason}`);
|
|
117
|
+
try {
|
|
118
|
+
writeArtifact(opts.out, renderFailOpenReview(meta, reason));
|
|
119
|
+
const manifest = buildReviewManifest({}, null, meta);
|
|
120
|
+
manifest.error = reason;
|
|
121
|
+
writeArtifact(manifestPathFor(opts.out), JSON.stringify(manifest, null, 2) + "\n");
|
|
122
|
+
if (opts.comment)
|
|
123
|
+
writeArtifact(opts.comment, renderFailOpenComment(meta, reason));
|
|
124
|
+
if (opts.json)
|
|
125
|
+
process.stdout.write(JSON.stringify(manifest, null, 2) + "\n");
|
|
126
|
+
}
|
|
127
|
+
catch (writeErr) {
|
|
128
|
+
warn(`could not write fail-open artifacts: ${msg(writeErr)}`);
|
|
129
|
+
return opts.strict ? 2 : 1; // truly unwritable output path
|
|
130
|
+
}
|
|
131
|
+
return opts.strict ? 2 : 0;
|
|
132
|
+
};
|
|
133
|
+
try {
|
|
134
|
+
// ── 1. Local engine: hunk-graded symbols + risk flags (nothing uploaded) ──
|
|
135
|
+
const root = resolveRepoRoot();
|
|
136
|
+
if (!root) {
|
|
137
|
+
return failOpen("not a git repository — review is diff-based.");
|
|
138
|
+
}
|
|
139
|
+
const engine = createNodeCodeIndex({ repoRoot: root });
|
|
140
|
+
let result;
|
|
141
|
+
try {
|
|
142
|
+
const status = await engine.status();
|
|
143
|
+
if (!status.indexed || status.fileCount === 0) {
|
|
144
|
+
// Fresh CI checkout: no local index yet. v1 = full index run (fast on
|
|
145
|
+
// repo-scale; scoped indexPaths() is a later optimization).
|
|
146
|
+
warn("no local index found — building it now (first run in this checkout)…");
|
|
147
|
+
const stats = await engine.indexRepository();
|
|
148
|
+
warn(`indexed ${stats.filesParsed} file(s) in ${Math.round(stats.durationMs / 1000)}s.`);
|
|
149
|
+
}
|
|
150
|
+
result = await engine.reviewChanges({
|
|
151
|
+
since: opts.base ?? undefined,
|
|
152
|
+
includeUncommitted: opts.base ? opts.uncommitted : true,
|
|
153
|
+
limit: SYMBOL_CAP,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
await engine.close().catch(() => undefined);
|
|
158
|
+
}
|
|
159
|
+
const diffStats = {
|
|
160
|
+
changed_file_count: result.changedFiles,
|
|
161
|
+
unindexed_file_count: result.changedFiles - result.indexedFiles,
|
|
162
|
+
stale_file_count: result.staleFiles,
|
|
163
|
+
truncated: result.truncated,
|
|
164
|
+
hunk_coverage: result.hunkCoverage,
|
|
165
|
+
base_kind: result.baseKind,
|
|
166
|
+
};
|
|
167
|
+
meta.diffStats = diffStats;
|
|
168
|
+
meta.symbolCount = result.symbols.length;
|
|
169
|
+
const summary = opts.summary?.trim() || undefined;
|
|
170
|
+
if (result.symbols.length === 0 && result.riskFlags.length === 0 && !summary) {
|
|
171
|
+
// Nothing to review — write honest empty artifacts, no server round-trip.
|
|
172
|
+
const empty = {
|
|
173
|
+
ok: true,
|
|
174
|
+
review: {
|
|
175
|
+
convention_findings: [],
|
|
176
|
+
lesson_hints: [],
|
|
177
|
+
risk_flags: [],
|
|
178
|
+
coverage_note: result.changedFiles === 0
|
|
179
|
+
? "No changed files detected."
|
|
180
|
+
: "Changed files found but no indexed symbols — nothing reviewable at symbol level.",
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
writeAll(empty, null, meta, opts);
|
|
184
|
+
process.stderr.write(`maind review: no reviewable changes (${result.changedFiles} changed file(s)) → ${opts.out}\n`);
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
// ── 2. Cloud: review_changes with the path-free review_args equivalent ──
|
|
188
|
+
// Same shaping as the bridge tool codebase_review_changes: symbol names /
|
|
189
|
+
// kinds / change grades + closed-enum risk flags — paths, lines, node keys
|
|
190
|
+
// and diff content never leave the machine.
|
|
191
|
+
const auth = resolveAuth();
|
|
192
|
+
meta.keyPrefix = auth.keyPrefix;
|
|
193
|
+
const overrideKey = opts.projectKey?.trim().toLowerCase();
|
|
194
|
+
const projectKey = overrideKey && PROJECT_KEY_RE.test(overrideKey)
|
|
195
|
+
? overrideKey
|
|
196
|
+
: gatherGitState().projectKey;
|
|
197
|
+
const client = new McpClient({
|
|
198
|
+
apiKey: auth.apiKey,
|
|
199
|
+
deviceId: auth.deviceId,
|
|
200
|
+
clientVersion: opts.clientVersion,
|
|
201
|
+
mcpUrl: opts.mcpUrl ?? undefined,
|
|
202
|
+
projectKey,
|
|
203
|
+
});
|
|
204
|
+
const reviewArgs = {
|
|
205
|
+
changed_symbols: result.symbols.map((s) => ({
|
|
206
|
+
name: s.name,
|
|
207
|
+
qualified_name: s.qualifiedName,
|
|
208
|
+
kind: s.kind,
|
|
209
|
+
language: s.language,
|
|
210
|
+
change: s.change,
|
|
211
|
+
changed_line_count: s.changedLineCount,
|
|
212
|
+
})),
|
|
213
|
+
risk_flags: result.riskFlags,
|
|
214
|
+
diff_stats: diffStats,
|
|
215
|
+
...(summary ? { change_summary: summary } : {}),
|
|
216
|
+
...(projectKey ? { project_key: projectKey } : {}),
|
|
217
|
+
};
|
|
218
|
+
const review = await client.callTool("review_changes", reviewArgs);
|
|
219
|
+
if (review.ok !== true || !review.review) {
|
|
220
|
+
return failOpen(`review_changes rejected: ${review.error ?? "unknown_error"}${review.message ? ` — ${review.message}` : ""}`);
|
|
221
|
+
}
|
|
222
|
+
// ── 3. Optional gate: server-side verdict (Team plan) ──
|
|
223
|
+
let verdict = null;
|
|
224
|
+
if (opts.gate) {
|
|
225
|
+
const findings = review.review.convention_findings ?? [];
|
|
226
|
+
try {
|
|
227
|
+
verdict = await client.callTool("review_verdict", {
|
|
228
|
+
findings: findings.map((f) => ({
|
|
229
|
+
convention_id: f.convention_id,
|
|
230
|
+
convention_version: f.convention_version,
|
|
231
|
+
matched_symbols: f.matched_symbols,
|
|
232
|
+
matched_changed_symbols: f.matched_changed_symbols ?? [],
|
|
233
|
+
})),
|
|
234
|
+
risk_flags: review.review.risk_flags ?? [],
|
|
235
|
+
...(projectKey ? { project_key: projectKey } : {}),
|
|
236
|
+
});
|
|
237
|
+
if (verdict.ok !== true) {
|
|
238
|
+
if (verdict.error === "requires_team" || verdict.error === "requires_enterprise") {
|
|
239
|
+
// Config situation, not a failure: advisory findings stand, gate is a
|
|
240
|
+
// paid feature. Deliberately exit 0 (binding decision).
|
|
241
|
+
warn("gate skipped: review_verdict is a Team-plan feature — findings below are advisory. " +
|
|
242
|
+
(verdict.message ?? "Upgrade at https://maind.dev/pricing."));
|
|
243
|
+
verdict = null;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
if (opts.strict) {
|
|
247
|
+
return failOpen(`review_verdict failed: ${verdict.error ?? "unknown_error"}${verdict.message ? ` — ${verdict.message}` : ""}`);
|
|
248
|
+
}
|
|
249
|
+
warn(`gate unavailable (continuing advisory): ${verdict.error ?? "unknown_error"}`);
|
|
250
|
+
verdict = null;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
if (opts.strict)
|
|
256
|
+
return failOpen(`review_verdict failed: ${msg(err)}`);
|
|
257
|
+
warn(`gate unavailable (continuing advisory): ${msg(err)}`);
|
|
258
|
+
verdict = null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// ── 4. Artifacts + exit code ──
|
|
262
|
+
writeAll(review, verdict, meta, opts);
|
|
263
|
+
const findingCount = review.review.convention_findings?.length ?? 0;
|
|
264
|
+
const verdictNote = verdict?.verdict ? ` · verdict: ${verdict.verdict}` : "";
|
|
265
|
+
process.stderr.write(`maind review: ${findingCount} finding(s), ${review.review.risk_flags?.length ?? 0} risk flag(s)` +
|
|
266
|
+
`${verdictNote} → ${opts.out}\n`);
|
|
267
|
+
if (opts.gate && opts.failOn && verdict?.verdict) {
|
|
268
|
+
if (verdictCrossesFailOn(verdict.verdict, opts.failOn)) {
|
|
269
|
+
warn(`verdict '${verdict.verdict}' crossed --fail-on ${opts.failOn} — failing the check.`);
|
|
270
|
+
return 1;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return 0;
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
const reason = err instanceof MissingApiKeyError ? err.message : msg(err);
|
|
277
|
+
return failOpen(reason);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
function writeAll(review, verdict, meta, opts) {
|
|
281
|
+
writeArtifact(opts.out, renderReviewMarkdown(review, verdict, meta));
|
|
282
|
+
const manifest = buildReviewManifest(review, verdict, meta);
|
|
283
|
+
writeArtifact(manifestPathFor(opts.out), JSON.stringify(manifest, null, 2) + "\n");
|
|
284
|
+
if (opts.comment) {
|
|
285
|
+
writeArtifact(opts.comment, renderReviewComment(review, verdict, meta, opts.out));
|
|
286
|
+
}
|
|
287
|
+
if (opts.json)
|
|
288
|
+
process.stdout.write(JSON.stringify(manifest, null, 2) + "\n");
|
|
289
|
+
}
|
|
290
|
+
function msg(err) {
|
|
291
|
+
return err instanceof Error ? err.message : String(err);
|
|
292
|
+
}
|
|
293
|
+
function warn(line) {
|
|
294
|
+
process.stderr.write(`maind review: ${line}\n`);
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
|