@maind-dev/cli 0.3.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 CHANGED
@@ -55,11 +55,61 @@ Writes two artifacts (defaults shown):
55
55
  | `--run-ref <id>` | `$GITHUB_RUN_ID` | Build identifier stored in the manifest |
56
56
  | `--mcp-url <url>` | `$MAIND_MCP_URL` or prod | MCP endpoint override |
57
57
 
58
+ ## Review (`maind review`)
59
+
60
+ Provenance-backed review findings for a change set (ADR-228). The CLI links the
61
+ code-index engine directly — no bridge needed in CI: it enumerates hunk-graded
62
+ changed symbols + closed-enum risk flags **locally**, sends only symbol names and
63
+ counts to the maind `review_changes` tool (paths, lines, and diff content never
64
+ leave the machine), and renders the citable findings (convention id + version +
65
+ matched symbols).
66
+
67
+ ```bash
68
+ maind review --base origin/main --comment
69
+ ```
70
+
71
+ Artifacts (defaults shown):
72
+
73
+ | File | Purpose |
74
+ |---|---|
75
+ | `.maind/review.md` | Full findings report — always written, even fail-open |
76
+ | `.maind/review.json` | Review manifest (`maind.review.manifest/v1`) — counts, citations, served attribution |
77
+ | `.maind/review-comment.md` | With `--comment`: PR-comment markdown; line 1 carries the `<!-- maind-review -->` idempotency marker |
78
+
79
+ The CLI never posts the comment itself — your workflow posts the file via
80
+ `gh api`, so provider tokens stay outside the CLI.
81
+
82
+ ### Review options
83
+
84
+ | Flag | Default | Meaning |
85
+ |---|---|---|
86
+ | `--base <ref>` | — | Review the diff against this ref; without it, uncommitted work |
87
+ | `--uncommitted` | off | With `--base`: also include uncommitted changes |
88
+ | `--summary <text>` | — | Prose change summary (enables index-less review) |
89
+ | `--out <path>` | `.maind/review.md` | Report path (manifest lands next to it as `.json`) |
90
+ | `--comment [<path>]` | off | Also write PR-comment markdown |
91
+ | `--json` | off | Print the review manifest JSON to stdout |
92
+ | `--gate` | off | Server-side `pass\|warn\|block` verdict (Team plan) |
93
+ | `--fail-on block\|warn` | — | With `--gate`: exit `1` when the verdict crosses the threshold |
94
+ | `--strict` | off | Infra errors exit `2` instead of failing open |
95
+ | `--project-key <hex>` | auto | Repo `project_key` override |
96
+ | `--mcp-url <url>` | `$MAIND_MCP_URL` or prod | MCP endpoint override |
97
+
98
+ ### Exit codes
99
+
100
+ | Code | Meaning |
101
+ |---|---|
102
+ | `0` | Advisory run (default) — findings never fail a build; plan-gate on `--gate` also exits `0` with a hint |
103
+ | `1` | Only a server verdict crossing `--fail-on` (requires `--gate`) |
104
+ | `2` | Infra error, only under `--strict` |
105
+
58
106
  ## Fail-open contract
59
107
 
60
108
  A context pull must never fail a build. On any error (missing key, network,
61
109
  auth) the CLI still writes explanatory artifacts (the manifest carries an
62
110
  `error` field) and exits `0`. The agent simply runs without extra context.
111
+ `maind review` follows the same contract: advisory runs exit `0` no matter
112
+ what; only the explicit `--gate` + `--fail-on` combination is fail-closed.
63
113
 
64
114
  ## Example: GitHub Actions
65
115
 
@@ -10,7 +10,9 @@
10
10
  import { createHash } from "node:crypto";
11
11
  import { readFileSync } from "node:fs";
12
12
  import { MissingApiKeyError, resolveAuth } from "./auth.js";
13
+ import { gatherGitState } from "./git.js";
13
14
  const DEFAULT_REPORT_URL = "https://app.maind.dev/api/ci/report";
15
+ const PROJECT_KEY_RE = /^[a-f0-9]{64}$/;
14
16
  export function parseCiReportArgs(argv) {
15
17
  const get = (name) => {
16
18
  const i = argv.indexOf(name);
@@ -28,6 +30,7 @@ export function parseCiReportArgs(argv) {
28
30
  logsPath: get("--logs") ?? null,
29
31
  remediation: get("--remediation") ?? null,
30
32
  reportUrl: get("--report-url") ?? process.env.MAIND_REPORT_URL ?? DEFAULT_REPORT_URL,
33
+ projectKey: get("--project-key") ?? null,
31
34
  };
32
35
  }
33
36
  /** Collects CI run metadata from the runner environment (GitHub Actions today). */
@@ -93,11 +96,19 @@ export async function runCiReport(opts) {
93
96
  // logs are best-effort
94
97
  }
95
98
  }
99
+ // Repo scope (ADR-212 B4): explicit --project-key wins (validated 64-hex),
100
+ // else auto-detect from the repo's git remote. Fail-soft: null → the server
101
+ // routes the draft public (fallback), exactly as before B4.
102
+ const overrideKey = opts.projectKey?.trim().toLowerCase();
103
+ const projectKey = overrideKey && PROJECT_KEY_RE.test(overrideKey)
104
+ ? overrideKey
105
+ : gatherGitState().projectKey;
96
106
  const auth = resolveAuth();
97
107
  const body = JSON.stringify({
98
108
  lesson,
99
109
  content_hash: sha256(lesson),
100
110
  ci_provenance: provenance,
111
+ ...(projectKey ? { project_key: projectKey } : {}),
101
112
  });
102
113
  let res;
103
114
  try {
@@ -126,7 +137,12 @@ export async function runCiReport(opts) {
126
137
  catch {
127
138
  // non-JSON 200 — treat as success but unparseable
128
139
  }
129
- process.stderr.write(`maind ci-report: ${parsed.deduplicated ? "deduplicated" : "filed"} draft ${parsed.draft_id ?? "?"}` +
140
+ const scope = parsed.routing_decision === "org_private"
141
+ ? parsed.repo_scoped
142
+ ? " [org-private, repo-scoped]"
143
+ : " [org-private]"
144
+ : "";
145
+ process.stderr.write(`maind ci-report: ${parsed.deduplicated ? "deduplicated" : "filed"} draft ${parsed.draft_id ?? "?"}${scope}` +
130
146
  (parsed.review_url ? ` → ${parsed.review_url}` : "") +
131
147
  "\n");
132
148
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"ci-report.js","sourceRoot":"","sources":["../src/ci-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ci-report.js","sourceRoot":"","sources":["../src/ci-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ // `maind git-context` — a session-start briefing of the LOCAL git state, enriched
2
+ // with maind's parallel-session coordination (ADR-188) and state-relevant git
3
+ // lessons (ADR-212 v2 / B1). Run it before an agent starts work so it begins
4
+ // informed ("you're on feat/x, 3 ahead, CI red, a peer is editing src/auth.ts")
5
+ // instead of blind.
6
+ //
7
+ // Fail-open + fail-soft: local git state always renders; the MCP enrichment
8
+ // (peer conflicts, lessons) is best-effort and each piece degrades independently.
9
+ // No git remote, no API key, no network, no `gh` → you still get what's available.
10
+ // The remote URL never leaves the machine — only the project_key (sha256) does.
11
+ import { mkdirSync, writeFileSync } from "node:fs";
12
+ import { dirname } from "node:path";
13
+ import { resolveAuth } from "./auth.js";
14
+ import { McpClient } from "./mcp-client.js";
15
+ import { gatherGitState, gatherOpenPrs } from "./git.js";
16
+ export function parseGitContextArgs(argv) {
17
+ const get = (name) => {
18
+ const i = argv.indexOf(name);
19
+ if (i === -1 || i + 1 >= argv.length)
20
+ return undefined;
21
+ return argv[i + 1];
22
+ };
23
+ return {
24
+ out: get("--out") ?? ".maind/git-context.md",
25
+ manifest: get("--manifest") ?? null,
26
+ mcpUrl: get("--mcp-url") ?? null,
27
+ noMcp: argv.includes("--no-mcp"),
28
+ clientVersion: "0.4.0",
29
+ };
30
+ }
31
+ function nowIso() {
32
+ return new Date().toISOString();
33
+ }
34
+ function writeArtifact(path, content) {
35
+ const dir = dirname(path);
36
+ if (dir && dir !== ".")
37
+ mkdirSync(dir, { recursive: true });
38
+ writeFileSync(path, content, "utf8");
39
+ }
40
+ /** A state-aware query so the pulled lessons match the current situation. */
41
+ function stateQuery(git, prs) {
42
+ if (prs.some((p) => p.isCurrentBranch && p.ci === "failure"))
43
+ return "ci failure red build fix";
44
+ if ((git.behind ?? 0) > 0 && (git.ahead ?? 0) > 0)
45
+ return "rebase merge integration diverged branch";
46
+ if ((git.behind ?? 0) > 0)
47
+ return "branch behind main pull rebase update";
48
+ if (prs.some((p) => p.isCurrentBranch))
49
+ return "pull request review merge workflow";
50
+ if ((git.ahead ?? 0) > 0)
51
+ return "open pull request commit message branch";
52
+ return "git branch commit pull request workflow";
53
+ }
54
+ export async function runGitContext(opts) {
55
+ const git = gatherGitState();
56
+ // gh is optional; only probe when we're in a repo.
57
+ const prResult = git.isRepo ? gatherOpenPrs(git.branch) : { available: false, prs: [] };
58
+ let peer = null;
59
+ let lessons = [];
60
+ let lessonsAvailable = false;
61
+ if (!opts.noMcp && git.isRepo) {
62
+ try {
63
+ const auth = resolveAuth();
64
+ const client = new McpClient({
65
+ apiKey: auth.apiKey,
66
+ deviceId: auth.deviceId,
67
+ clientVersion: opts.clientVersion,
68
+ mcpUrl: opts.mcpUrl ?? undefined,
69
+ // ADR-212 B2: scope repo-specific content to this repo (sha256 only).
70
+ projectKey: git.projectKey,
71
+ });
72
+ // Peer/conflict check — READ-ONLY (no announce → no phantom session).
73
+ if (git.projectKey && git.workingPaths.length > 0) {
74
+ try {
75
+ const c = await client.callTool("check_path_conflicts", {
76
+ project_key: git.projectKey,
77
+ paths: git.workingPaths,
78
+ });
79
+ peer = {
80
+ peersActive: c.peers_active ?? 0,
81
+ conflicts: (c.conflicts ?? [])
82
+ .filter((x) => x.path)
83
+ .map((x) => ({ path: x.path, focus: x.focus })),
84
+ recommendation: c.recommendation ?? null,
85
+ checked: true,
86
+ };
87
+ }
88
+ catch (err) {
89
+ warn(`peer check unavailable: ${msg(err)}`);
90
+ }
91
+ }
92
+ // State-relevant git lessons.
93
+ try {
94
+ const res = await client.callTool("search_lessons", {
95
+ query: stateQuery(git, prResult.prs),
96
+ platforms: ["git", "github"],
97
+ limit: 3,
98
+ });
99
+ lessons = Array.isArray(res.lessons) ? res.lessons : [];
100
+ lessonsAvailable = true;
101
+ }
102
+ catch (err) {
103
+ warn(`git lessons unavailable: ${msg(err)}`);
104
+ }
105
+ }
106
+ catch (err) {
107
+ // No API key / auth failure → local-only briefing, still useful.
108
+ warn(`maind enrichment skipped (${msg(err)}); rendering local git state only.`);
109
+ }
110
+ }
111
+ writeArtifact(opts.out, renderMarkdown(git, prResult, peer, lessons, lessonsAvailable));
112
+ if (opts.manifest) {
113
+ writeArtifact(opts.manifest, JSON.stringify(buildManifest(git, prResult.prs, peer), null, 2) + "\n");
114
+ }
115
+ process.stderr.write(`maind git-context: ${git.isRepo ? `${git.branch ?? "?"} (+${git.ahead ?? "?"}/-${git.behind ?? "?"})` : "not a git repo"}` +
116
+ (peer?.conflicts.length ? `, ${peer.conflicts.length} peer conflict(s)` : "") +
117
+ ` → ${opts.out}\n`);
118
+ return 0;
119
+ }
120
+ function ciIcon(ci) {
121
+ return ci === "success" ? "🟢" : ci === "failure" ? "🔴" : ci === "pending" ? "🟡" : "⚪";
122
+ }
123
+ function renderMarkdown(git, prResult, peer, lessons, lessonsAvailable) {
124
+ const L = [];
125
+ L.push("<!-- Generated by `maind git-context` — local git state for the agent. -->");
126
+ L.push(`<!-- generated_at: ${nowIso()} -->`);
127
+ L.push("");
128
+ L.push("# maind git-context");
129
+ L.push("");
130
+ if (!git.isRepo) {
131
+ L.push("_Not inside a git work tree — no git context to report._");
132
+ L.push("");
133
+ return L.join("\n");
134
+ }
135
+ const aheadBehind = git.defaultBranch != null
136
+ ? `${git.ahead ?? "?"} ahead, ${git.behind ?? "?"} behind \`${git.defaultBranch}\``
137
+ : "no upstream default branch resolved";
138
+ L.push(`**Branch:** \`${git.branch ?? "?"}\` — ${aheadBehind}`);
139
+ L.push(`**Working tree:** ${git.uncommitted} uncommitted change${git.uncommitted === 1 ? "" : "s"}`);
140
+ if (git.projectKey)
141
+ L.push(`**Project:** \`${git.projectKey.slice(0, 12)}…\` (sha256 of remote — URL never sent)`);
142
+ L.push("");
143
+ // Open PRs
144
+ if (prResult.available) {
145
+ if (prResult.prs.length === 0) {
146
+ L.push("**Open PRs:** none");
147
+ }
148
+ else {
149
+ L.push("**Open PRs:**");
150
+ for (const p of prResult.prs) {
151
+ const tag = p.isCurrentBranch ? ` ${ciIcon(p.ci)} CI:${p.ci} · this branch` : "";
152
+ L.push(`- #${p.number} ${p.title}${tag}`);
153
+ }
154
+ }
155
+ }
156
+ else {
157
+ L.push("**Open PRs:** _unavailable (`gh` not installed / not authenticated)_");
158
+ }
159
+ L.push("");
160
+ // Peers (ADR-188 coordination)
161
+ if (peer?.checked) {
162
+ if (peer.conflicts.length > 0) {
163
+ L.push(`**⚠ Parallel sessions on this repo:** ${peer.peersActive} active — path conflicts:`);
164
+ for (const c of peer.conflicts) {
165
+ L.push(`- \`${c.path}\`${c.focus ? ` — peer focus: ${c.focus}` : ""}`);
166
+ }
167
+ if (peer.recommendation)
168
+ L.push(`- _${peer.recommendation}_`);
169
+ }
170
+ else if (peer.peersActive > 0) {
171
+ L.push(`**Parallel sessions on this repo:** ${peer.peersActive} active — no conflict on your changed paths.`);
172
+ }
173
+ else {
174
+ L.push("**Parallel sessions on this repo:** none.");
175
+ }
176
+ }
177
+ else {
178
+ L.push("**Parallel sessions:** _not checked (no key / no changed paths / offline)._");
179
+ }
180
+ L.push("");
181
+ // Lessons
182
+ if (lessonsAvailable && lessons.length > 0) {
183
+ L.push("## Relevant git lessons (maind)");
184
+ for (const l of lessons) {
185
+ L.push(`- **${l.title ?? l.id}**${l.id ? ` \`${l.id}\`` : ""}`);
186
+ }
187
+ L.push("");
188
+ }
189
+ L.push("_Full PR workflow: `activate_skill({id:\"skill_pr_lifecycle\"})`._");
190
+ L.push("");
191
+ return L.join("\n");
192
+ }
193
+ function buildManifest(git, prs, peer) {
194
+ return {
195
+ schema: "maind.git-context/v1",
196
+ generated_at: nowIso(),
197
+ project_key: git.projectKey,
198
+ branch: git.branch,
199
+ default_branch: git.defaultBranch,
200
+ ahead: git.ahead,
201
+ behind: git.behind,
202
+ uncommitted: git.uncommitted,
203
+ open_prs: prs.map((p) => ({ number: p.number, ci: p.ci, current_branch: p.isCurrentBranch })),
204
+ peers_active: peer?.checked ? peer.peersActive : null,
205
+ path_conflicts: peer?.conflicts.map((c) => c.path) ?? [],
206
+ };
207
+ }
208
+ function msg(err) {
209
+ return err instanceof Error ? err.message : String(err);
210
+ }
211
+ function warn(line) {
212
+ process.stderr.write(`maind git-context: ${line}\n`);
213
+ }
214
+ //# sourceMappingURL=git-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-context.js","sourceRoot":"","sources":["../src/git-context.ts"],"names":[],"mappings":"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"}
package/build/git.js ADDED
@@ -0,0 +1,133 @@
1
+ // Local git/gh state gathering for `maind git-context` (ADR-212 v2 / B1).
2
+ //
3
+ // All gathering is CLIENT-SIDE — the maind server is repo-blind by design
4
+ // (ADR-188 privacy): only the project_key (sha256 of the normalized remote) and
5
+ // repo-relative paths ever leave this machine; the remote URL never does.
6
+ //
7
+ // Every probe is fail-soft: a missing git, no remote, or absent `gh` degrades to
8
+ // null/empty, never throws. The command around this is fail-open.
9
+ import { execFileSync } from "node:child_process";
10
+ // project_key derivation now lives in the shared @maind/project-key package
11
+ // (ADR-188 — one normalization for bridge / cli / extension / code-index). Kept
12
+ // re-exported here so existing `./git` importers don't have to change.
13
+ export { normalizeRemoteUrl, projectKeyFromRemote, sha256Hex, } from "@maind/project-key";
14
+ import { projectKeyFromRemote } from "@maind/project-key";
15
+ function run(bin, args) {
16
+ try {
17
+ return execFileSync(bin, args, {
18
+ encoding: "utf8",
19
+ stdio: ["ignore", "pipe", "ignore"],
20
+ timeout: 5000,
21
+ }).trim();
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ const git = (args) => run("git", args);
28
+ const gh = (args) => run("gh", args);
29
+ function resolveDefaultBranch() {
30
+ // origin/HEAD → refs/remotes/origin/main (when set), else probe common names.
31
+ const sym = git(["symbolic-ref", "--quiet", "refs/remotes/origin/HEAD"]);
32
+ if (sym) {
33
+ const m = /refs\/remotes\/origin\/(.+)$/.exec(sym);
34
+ if (m)
35
+ return m[1];
36
+ }
37
+ for (const cand of ["main", "master"]) {
38
+ if (git(["rev-parse", "--verify", "--quiet", `origin/${cand}`]) !== null)
39
+ return cand;
40
+ }
41
+ return null;
42
+ }
43
+ export function gatherGitState() {
44
+ const inside = git(["rev-parse", "--is-inside-work-tree"]);
45
+ if (inside !== "true") {
46
+ return {
47
+ isRepo: false,
48
+ projectKey: null,
49
+ branch: null,
50
+ defaultBranch: null,
51
+ ahead: null,
52
+ behind: null,
53
+ uncommitted: 0,
54
+ workingPaths: [],
55
+ };
56
+ }
57
+ const remote = git(["config", "--get", "remote.origin.url"]);
58
+ const projectKey = remote ? projectKeyFromRemote(remote) : null;
59
+ const branch = git(["rev-parse", "--abbrev-ref", "HEAD"]);
60
+ const defaultBranch = resolveDefaultBranch();
61
+ let ahead = null;
62
+ let behind = null;
63
+ if (defaultBranch) {
64
+ // `--left-right --count A...B` → "<left> <right>": left = in A not B (behind),
65
+ // right = in B not A (ahead). Here A=origin/default, B=HEAD.
66
+ const counts = git(["rev-list", "--left-right", "--count", `origin/${defaultBranch}...HEAD`]);
67
+ if (counts) {
68
+ const [b, a] = counts.split(/\s+/).map((n) => Number.parseInt(n, 10));
69
+ if (Number.isFinite(b))
70
+ behind = b;
71
+ if (Number.isFinite(a))
72
+ ahead = a;
73
+ }
74
+ }
75
+ const porcelain = git(["status", "--porcelain"]) ?? "";
76
+ const changedLines = porcelain.split("\n").filter((l) => l.trim().length > 0);
77
+ const workingPaths = changedLines
78
+ .map((l) => l.slice(3).split(" -> ").pop().trim().replace(/^"|"$/g, ""))
79
+ .filter((p) => p.length > 0)
80
+ .slice(0, 32);
81
+ return {
82
+ isRepo: true,
83
+ projectKey,
84
+ branch,
85
+ defaultBranch,
86
+ ahead,
87
+ behind,
88
+ uncommitted: changedLines.length,
89
+ workingPaths,
90
+ };
91
+ }
92
+ function ciFromChecks(prNumber) {
93
+ const out = gh(["pr", "checks", String(prNumber), "--json", "bucket"]);
94
+ if (!out)
95
+ return "unknown";
96
+ try {
97
+ const rows = JSON.parse(out);
98
+ if (rows.length === 0)
99
+ return "unknown";
100
+ if (rows.some((r) => r.bucket === "fail"))
101
+ return "failure";
102
+ if (rows.some((r) => r.bucket === "pending"))
103
+ return "pending";
104
+ if (rows.every((r) => r.bucket === "pass" || r.bucket === "skipping"))
105
+ return "success";
106
+ return "unknown";
107
+ }
108
+ catch {
109
+ return "unknown";
110
+ }
111
+ }
112
+ export function gatherOpenPrs(currentBranch, max = 5) {
113
+ const out = gh(["pr", "list", "--state", "open", "--limit", String(max), "--json", "number,title,headRefName"]);
114
+ if (out === null)
115
+ return { available: false, prs: [] };
116
+ try {
117
+ const rows = JSON.parse(out);
118
+ const prs = rows.map((r) => ({
119
+ number: r.number,
120
+ title: r.title,
121
+ isCurrentBranch: currentBranch != null && r.headRefName === currentBranch,
122
+ // Only resolve CI for the current branch's PR (cheap) — others stay unknown to avoid N gh calls.
123
+ ci: currentBranch != null && r.headRefName === currentBranch
124
+ ? ciFromChecks(r.number)
125
+ : "unknown",
126
+ }));
127
+ return { available: true, prs };
128
+ }
129
+ catch {
130
+ return { available: false, prs: [] };
131
+ }
132
+ }
133
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}