revu-ai 0.2.2 → 0.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/dist/runner.js CHANGED
@@ -50,6 +50,12 @@ export async function run(cwd, config, hooks = {}, inputs = {}) {
50
50
  const unsubscribeFindings = hooks.onFinding
51
51
  ? sidecar.aggregator.onAdd(hooks.onFinding)
52
52
  : () => { };
53
+ const unsubscribeSummaries = hooks.onSummary
54
+ ? sidecar.aggregator.onSummary(hooks.onSummary)
55
+ : () => { };
56
+ const unsubscribeChecks = hooks.onCheck
57
+ ? sidecar.aggregator.onCheck(hooks.onCheck)
58
+ : () => { };
53
59
  const factory = getHarnessFactory(config.harness);
54
60
  const provider = factory({
55
61
  ...(config.model ? { model: config.model } : {}),
@@ -58,120 +64,119 @@ export async function run(cwd, config, hooks = {}, inputs = {}) {
58
64
  const concurrency = config.concurrency ?? Math.min(8, rules.length);
59
65
  const limit = createLimiter(concurrency);
60
66
  const ruleResults = [];
61
- try {
62
- await Promise.all(rules.map((rule) => limit(async () => {
63
- hooks.onRuleStart?.(rule.ruleId, rule.relPath);
64
- const priorForRule = priorByRule.get(rule.ruleId);
65
- const ruleStart = Date.now();
66
- // If the rule declares a files: pattern list, decide whether to run, skip,
67
- // or fail before spawning an agent.
68
- // • filePatterns === undefined → no key in frontmatter → run against all files
69
- // • filePatterns is empty [] → key was present but empty (broken config) → fail
70
- // • micromatch throws → invalid pattern syntax fail
71
- // • no changed files match → skip (nothing to review)
72
- if (rule.filePatterns !== undefined) {
73
- if (rule.filePatterns.length === 0) {
74
- const failed = {
75
- id: rule.ruleId,
76
- path: rule.relPath,
77
- ok: false,
78
- durationMs: Date.now() - ruleStart,
79
- findingCount: 0,
80
- errorMessage: "files: pattern list is empty — add at least one glob pattern or remove the key",
81
- };
82
- ruleResults.push(failed);
83
- hooks.onRuleEnd?.(failed);
84
- return;
85
- }
86
- let matchingFiles;
87
- try {
88
- matchingFiles = micromatch(resolved.changedFiles, rule.filePatterns);
89
- }
90
- catch (e) {
91
- const msg = e?.message ?? String(e);
92
- const failed = {
93
- id: rule.ruleId,
94
- path: rule.relPath,
95
- ok: false,
96
- durationMs: Date.now() - ruleStart,
97
- findingCount: 0,
98
- errorMessage: `invalid files: pattern — ${msg}`,
99
- };
100
- ruleResults.push(failed);
101
- hooks.onRuleEnd?.(failed);
102
- return;
103
- }
104
- if (matchingFiles.length === 0) {
105
- const skipped = {
106
- id: rule.ruleId,
107
- path: rule.relPath,
108
- ok: true,
109
- durationMs: 0,
110
- findingCount: 0,
111
- skipped: true,
112
- };
113
- ruleResults.push(skipped);
114
- hooks.onRuleEnd?.(skipped);
115
- return;
116
- }
67
+ // Runs a single rule end-to-end (pre-flight file filtering + provider) and returns its
68
+ // result. Pure w.r.t. ruleResults the caller pushes and fires onRuleEnd.
69
+ const executeRule = async (rule) => {
70
+ const priorForRule = priorByRule.get(rule.ruleId);
71
+ const ruleStart = Date.now();
72
+ if (rule.filePatterns !== undefined) {
73
+ if (rule.filePatterns.length === 0) {
74
+ return {
75
+ id: rule.ruleId, path: rule.relPath, ok: false,
76
+ durationMs: Date.now() - ruleStart, findingCount: 0, summaryCount: 0, checkCount: 0,
77
+ errorMessage: "files: pattern list is empty add at least one glob pattern or remove the key",
78
+ };
117
79
  }
118
- // Per-rule isolation: a provider that throws (bug, runtime
119
- // error, anything we didn't anticipate) must not abort the
120
- // whole run. Catch here, convert to an errored RuleResult, and
121
- // let the other rules finish. The provider's own contract is
122
- // already to return ReviewResult with `ok:false` on expected
123
- // failures — this is the safety net for unexpected ones.
124
- let ruleResult;
80
+ let matchingFiles;
125
81
  try {
126
- const result = await provider.run({
127
- ruleId: rule.ruleId,
128
- rulesFilePath: rule.absPath,
129
- rulesContent: rule.content,
130
- reviewTarget: resolved.target,
131
- repoRoot,
132
- mcp: { url: sidecar.url, authToken: sidecar.authToken },
133
- timeoutMs: config.timeoutMs,
134
- ...(hooks.onActivity
135
- ? { onActivity: (a) => hooks.onActivity?.(rule.ruleId, a) }
136
- : {}),
137
- ...(priorForRule && priorForRule.length > 0 ? { priorFindings: priorForRule } : {}),
138
- ...(priorHeadSha ? { priorHeadSha } : {}),
139
- ...(rule.filePatterns ? { filePatterns: rule.filePatterns } : {}),
140
- });
141
- ruleResult = {
142
- id: result.ruleId,
143
- path: rule.relPath,
144
- ok: result.ok,
145
- durationMs: result.durationMs,
146
- findingCount: sidecar.aggregator.countFor(result.ruleId),
147
- ...(result.errorMessage ? { errorMessage: result.errorMessage } : {}),
148
- ...(result.timedOut ? { timedOut: true } : {}),
149
- ...(result.diagnostics ? { diagnostics: result.diagnostics } : {}),
150
- };
82
+ matchingFiles = micromatch(resolved.changedFiles, rule.filePatterns);
151
83
  }
152
84
  catch (e) {
153
- const message = e?.stack ?? e?.message ?? String(e);
154
- ruleResult = {
155
- id: rule.ruleId,
156
- path: rule.relPath,
157
- ok: false,
158
- durationMs: Date.now() - ruleStart,
159
- findingCount: sidecar.aggregator.countFor(rule.ruleId),
160
- errorMessage: `unexpected error: ${message.split("\n")[0]}`,
85
+ const msg = e?.message ?? String(e);
86
+ return {
87
+ id: rule.ruleId, path: rule.relPath, ok: false,
88
+ durationMs: Date.now() - ruleStart, findingCount: 0, summaryCount: 0, checkCount: 0,
89
+ errorMessage: `invalid files: pattern — ${msg}`,
161
90
  };
162
91
  }
163
- ruleResults.push(ruleResult);
164
- hooks.onRuleEnd?.(ruleResult);
165
- })));
92
+ if (matchingFiles.length === 0) {
93
+ return {
94
+ id: rule.ruleId, path: rule.relPath, ok: true,
95
+ durationMs: 0, findingCount: 0, summaryCount: 0, checkCount: 0, skipped: true,
96
+ };
97
+ }
98
+ }
99
+ try {
100
+ const result = await provider.run({
101
+ ruleId: rule.ruleId,
102
+ rulesFilePath: rule.absPath,
103
+ rulesContent: rule.content,
104
+ reviewTarget: resolved.target,
105
+ repoRoot,
106
+ mcp: { url: sidecar.url, authToken: sidecar.authToken },
107
+ timeoutMs: config.timeoutMs,
108
+ ...(hooks.onActivity ? { onActivity: (a) => hooks.onActivity?.(rule.ruleId, a) } : {}),
109
+ ...(priorForRule && priorForRule.length > 0 ? { priorFindings: priorForRule } : {}),
110
+ ...(priorHeadSha ? { priorHeadSha } : {}),
111
+ ...(rule.filePatterns ? { filePatterns: rule.filePatterns } : {}),
112
+ });
113
+ return {
114
+ id: result.ruleId, path: rule.relPath, ok: result.ok, durationMs: result.durationMs,
115
+ findingCount: sidecar.aggregator.countFor(result.ruleId),
116
+ summaryCount: sidecar.aggregator.summaryCountFor(result.ruleId),
117
+ checkCount: sidecar.aggregator.checkCountFor(result.ruleId),
118
+ ...(result.errorMessage ? { errorMessage: result.errorMessage } : {}),
119
+ ...(result.timedOut ? { timedOut: true } : {}),
120
+ ...(result.diagnostics ? { diagnostics: result.diagnostics } : {}),
121
+ };
122
+ }
123
+ catch (e) {
124
+ const message = e?.stack ?? e?.message ?? String(e);
125
+ return {
126
+ id: rule.ruleId, path: rule.relPath, ok: false,
127
+ durationMs: Date.now() - ruleStart,
128
+ findingCount: sidecar.aggregator.countFor(rule.ruleId),
129
+ summaryCount: sidecar.aggregator.summaryCountFor(rule.ruleId),
130
+ checkCount: sidecar.aggregator.checkCountFor(rule.ruleId),
131
+ errorMessage: `unexpected error: ${message.split("\n")[0]}`,
132
+ };
133
+ }
134
+ };
135
+ const gateThreshold = SEVERITY_ORDER[config.gateOn];
136
+ try {
137
+ const groups = groupRulesByStage(rules);
138
+ let gated = false;
139
+ for (const group of groups) {
140
+ if (gated) {
141
+ for (const rule of group.rules) {
142
+ const result = {
143
+ id: rule.ruleId, path: rule.relPath, ok: true,
144
+ durationMs: 0, findingCount: 0, summaryCount: 0, checkCount: 0, gated: true,
145
+ };
146
+ ruleResults.push(result);
147
+ hooks.onRuleEnd?.(result);
148
+ }
149
+ continue;
150
+ }
151
+ hooks.onStageStart?.(group.label, group.rules.length);
152
+ await Promise.all(group.rules.map((rule) => limit(async () => {
153
+ hooks.onRuleStart?.(rule.ruleId, rule.relPath);
154
+ const result = await executeRule(rule);
155
+ ruleResults.push(result);
156
+ hooks.onRuleEnd?.(result);
157
+ })));
158
+ const maxSev = maxFindingSeverity(sidecar.aggregator.all());
159
+ if (maxSev !== undefined && maxSev >= gateThreshold) {
160
+ gated = true;
161
+ const gatingCount = sidecar.aggregator.all().filter((f) => SEVERITY_ORDER[f.severity] >= gateThreshold).length;
162
+ hooks.onGate?.(group.label, gatingCount, config.gateOn);
163
+ }
164
+ }
166
165
  }
167
166
  finally {
168
167
  unsubscribeFindings();
168
+ unsubscribeSummaries();
169
+ unsubscribeChecks();
169
170
  await sidecar.shutdown();
170
171
  }
171
172
  const findings = sidecar.aggregator.all();
172
173
  const resolutions = sidecar.aggregator.allResolutions();
174
+ const summaries = sidecar.aggregator
175
+ .allSummaries()
176
+ .sort((a, b) => a.ruleId.localeCompare(b.ruleId));
177
+ const checks = sidecar.aggregator.allChecks().sort(checkSort);
173
178
  const report = {
174
- schemaVersion: 2,
179
+ schemaVersion: 3,
175
180
  runId,
176
181
  startedAt,
177
182
  completedAt: new Date().toISOString(),
@@ -179,6 +184,8 @@ export async function run(cwd, config, hooks = {}, inputs = {}) {
179
184
  rules: ruleResults.sort((a, b) => a.id.localeCompare(b.id)),
180
185
  findings: findings.sort(findingSort),
181
186
  resolutions,
187
+ summaries,
188
+ checks,
182
189
  };
183
190
  const exitCode = computeExitCode(findings, ruleResults, config.failOn);
184
191
  return { report, exitCode };
@@ -198,6 +205,52 @@ function findingSort(a, b) {
198
205
  return a.path.localeCompare(b.path);
199
206
  return (a.line ?? 0) - (b.line ?? 0);
200
207
  }
208
+ function checkSort(a, b) {
209
+ if (a.ruleId !== b.ruleId)
210
+ return a.ruleId.localeCompare(b.ruleId);
211
+ if (a.path !== b.path)
212
+ return a.path.localeCompare(b.path);
213
+ return (a.line ?? 0) - (b.line ?? 0);
214
+ }
215
+ /**
216
+ * Group rules into ordered execution stages.
217
+ * - Numbered stages run in ascending order, rules within a stage in parallel.
218
+ * - Unstaged rules (no `stage:`) form a single final group that runs after all numbered stages.
219
+ * - If NO rule declares a stage, the result is one group containing everything — byte-for-byte
220
+ * today's single-pass behavior.
221
+ */
222
+ function groupRulesByStage(rules) {
223
+ const numbered = new Map();
224
+ const unstaged = [];
225
+ for (const rule of rules) {
226
+ if (rule.stage === undefined) {
227
+ unstaged.push(rule);
228
+ }
229
+ else {
230
+ const list = numbered.get(rule.stage);
231
+ if (list)
232
+ list.push(rule);
233
+ else
234
+ numbered.set(rule.stage, [rule]);
235
+ }
236
+ }
237
+ const groups = [...numbered.keys()]
238
+ .sort((a, b) => a - b)
239
+ .map((n) => ({ label: `stage ${n}`, rules: numbered.get(n) }));
240
+ if (unstaged.length > 0) {
241
+ groups.push({ label: groups.length > 0 ? "unstaged" : "all", rules: unstaged });
242
+ }
243
+ return groups;
244
+ }
245
+ function maxFindingSeverity(findings) {
246
+ let max;
247
+ for (const f of findings) {
248
+ const s = SEVERITY_ORDER[f.severity];
249
+ if (max === undefined || s > max)
250
+ max = s;
251
+ }
252
+ return max;
253
+ }
201
254
  export async function listRules(cwd, pattern) {
202
255
  const repoRoot = findRepoRoot(cwd);
203
256
  const rules = await discoverRules(repoRoot, pattern);
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -11,6 +11,10 @@ export interface RuleFile {
11
11
  /** Glob patterns (repo-root-relative) specifying which changed files this rule applies to.
12
12
  * Parsed from the YAML frontmatter `files:` field. When absent, the rule applies to all changed files. */
13
13
  filePatterns?: string[];
14
+ /** Execution stage from the frontmatter `stage:` field. Rules sharing a stage run in
15
+ * parallel; stages run in ascending order with fail-fast gating between them. When absent,
16
+ * the rule runs in a final implicit stage after all numbered stages. */
17
+ stage?: number;
14
18
  }
15
19
  export interface RuleResult {
16
20
  id: string;
@@ -18,11 +22,26 @@ export interface RuleResult {
18
22
  ok: boolean;
19
23
  durationMs: number;
20
24
  findingCount: number;
25
+ /** Count of `report_review_summary` calls the agent emitted via the MCP sidecar.
26
+ * Expected to be exactly 1 for a healthy review. 0 means the agent never
27
+ * signed off — usually a symptom of a broken / silent agent — and surfaces
28
+ * as an "incomplete review" warning. >1 means the agent called it multiple
29
+ * times; only the first is kept. Always present on non-skipped rules. */
30
+ summaryCount: number;
31
+ /** Count of `report_check` calls the agent emitted — incremental compliance
32
+ * notes. No required minimum; high values just mean the agent showed its
33
+ * working. */
34
+ checkCount: number;
21
35
  errorMessage?: string;
22
36
  /** True if this rule was stopped by the per-rule timeout. */
23
37
  timedOut?: boolean;
24
38
  /** True if this rule was skipped because no changed files matched its `files:` patterns. */
25
39
  skipped?: boolean;
40
+ /** True if this rule never ran because an earlier stage tripped the gate. Distinct from
41
+ * `skipped` (which means "ran the pre-flight, nothing to review"). Gated rules emit no
42
+ * findings and no resolutions, so any prior findings they own are carried forward as
43
+ * still-open by the cross-run reconciliation. */
44
+ gated?: boolean;
26
45
  /** Observability counters from the provider — text chars emitted and
27
46
  * report_finding tool calls observed. The pretty output surfaces a warning
28
47
  * when textChars is high but findingCount is 0 (model wrote findings as
@@ -77,10 +96,34 @@ export interface Resolution {
77
96
  /** Commit at which the agent considered the finding resolved. */
78
97
  resolvedAtSha: string;
79
98
  }
99
+ export interface Check {
100
+ ruleId: string;
101
+ /** Repo-relative file path the agent verified. */
102
+ path: string;
103
+ line?: number;
104
+ lineEnd?: number;
105
+ /** What was verified and the evidence that it complies with the rule. */
106
+ message: string;
107
+ category?: string;
108
+ }
109
+ export interface ReviewSummary {
110
+ ruleId: string;
111
+ /** Agent's explicit declaration. "pass" = no findings reported for this rule;
112
+ * "concerns" = one or more findings reported. The runner cross-checks this
113
+ * against the recorded finding count. */
114
+ outcome: "pass" | "concerns";
115
+ /** Concrete description of what the agent examined (files, behaviours, areas). */
116
+ checked: string;
117
+ /** Why the outcome holds, tied to what was checked. */
118
+ rationale: string;
119
+ }
80
120
  export interface RunReport {
81
121
  /** Bumped to 2 when prior-run-aware features (resolutions, fingerprint, commentId) were added.
82
- * Readers SHOULD accept v1 reports and treat missing fields as defaults. */
83
- schemaVersion: 2;
122
+ * Bumped to 3 when the review-summary protocol arrived: required `summaryCount`/`checkCount`
123
+ * on each RuleResult, and required `summaries: ReviewSummary[]` / `checks: Check[]` arrays
124
+ * on the report.
125
+ * Readers SHOULD accept v1, v2, and v3 reports and treat missing fields as defaults. */
126
+ schemaVersion: 3;
84
127
  runId: string;
85
128
  startedAt: string;
86
129
  completedAt: string;
@@ -91,6 +134,12 @@ export interface RunReport {
91
134
  findings: Finding[];
92
135
  /** Resolutions emitted by reviewers this run, OR carried forward from `--prior-report`. */
93
136
  resolutions: Resolution[];
137
+ /** Per-rule review summaries — one per rule that called `report_review_summary`.
138
+ * A rule with no entry here is flagged as a possibly-incomplete review. */
139
+ summaries: ReviewSummary[];
140
+ /** All compliance checks the agents emitted via `report_check`. Granular
141
+ * positive evidence; not findings, not subject to resolution. */
142
+ checks: Check[];
94
143
  }
95
144
  export interface RevuConfig {
96
145
  pattern: string;
@@ -108,6 +157,10 @@ export interface RevuConfig {
108
157
  output: "pretty" | "json" | "github" | "auto";
109
158
  outputFile?: string;
110
159
  failOn: Severity;
160
+ /** Severity at/above which a completed stage stops the run (later stages don't spawn).
161
+ * Defaults to the `failOn` value when `--gate-on` is not supplied. Orthogonal to `failOn`:
162
+ * `failOn` sets the exit code, `gateOn` sets whether later stages run. */
163
+ gateOn: Severity;
111
164
  force: boolean;
112
165
  /** Per-agent wall-clock timeout in ms. Default 300_000 (5 minutes). */
113
166
  timeoutMs: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "revu-ai",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "description": "Parallel AI code review — pluggable agent harnesses (Claude Code, opencode); pick any provider/model",
5
5
  "type": "module",
6
6
  "bin": {