revu-ai 0.1.2 → 0.2.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.
Files changed (90) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +75 -12
  3. package/dist/cache/cross-reference.d.ts +37 -0
  4. package/dist/cache/cross-reference.js +94 -0
  5. package/dist/cache/cross-reference.js.map +1 -0
  6. package/dist/cli.js +106 -12
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +3 -1
  9. package/dist/config.js +9 -10
  10. package/dist/config.js.map +1 -1
  11. package/dist/discovery.js +8 -1
  12. package/dist/discovery.js.map +1 -1
  13. package/dist/findings.d.ts +18 -0
  14. package/dist/findings.js +22 -0
  15. package/dist/findings.js.map +1 -0
  16. package/dist/forges/dedup.d.ts +17 -0
  17. package/dist/forges/dedup.js +42 -0
  18. package/dist/forges/dedup.js.map +1 -0
  19. package/dist/forges/diff-lines.d.ts +12 -0
  20. package/dist/forges/diff-lines.js +93 -0
  21. package/dist/forges/diff-lines.js.map +1 -0
  22. package/dist/forges/github/api.d.ts +70 -0
  23. package/dist/forges/github/api.js +102 -0
  24. package/dist/forges/github/api.js.map +1 -0
  25. package/dist/forges/github/index.d.ts +10 -0
  26. package/dist/forges/github/index.js +292 -0
  27. package/dist/forges/github/index.js.map +1 -0
  28. package/dist/forges/gitlab/index.d.ts +7 -0
  29. package/dist/forges/gitlab/index.js +13 -0
  30. package/dist/forges/gitlab/index.js.map +1 -0
  31. package/dist/forges/post-cmd.d.ts +20 -0
  32. package/dist/forges/post-cmd.js +54 -0
  33. package/dist/forges/post-cmd.js.map +1 -0
  34. package/dist/forges/registry.d.ts +5 -0
  35. package/dist/forges/registry.js +24 -0
  36. package/dist/forges/registry.js.map +1 -0
  37. package/dist/forges/render.d.ts +18 -0
  38. package/dist/forges/render.js +59 -0
  39. package/dist/forges/render.js.map +1 -0
  40. package/dist/forges/types.d.ts +65 -0
  41. package/dist/forges/types.js +2 -0
  42. package/dist/forges/types.js.map +1 -0
  43. package/dist/index.d.ts +2 -2
  44. package/dist/index.js +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/init.d.ts +3 -1
  47. package/dist/init.js +6 -3
  48. package/dist/init.js.map +1 -1
  49. package/dist/mcp/aggregator.d.ts +9 -1
  50. package/dist/mcp/aggregator.js +39 -3
  51. package/dist/mcp/aggregator.js.map +1 -1
  52. package/dist/mcp/server.d.ts +8 -0
  53. package/dist/mcp/server.js +60 -5
  54. package/dist/mcp/server.js.map +1 -1
  55. package/dist/mcp/tools.d.ts +38 -2
  56. package/dist/mcp/tools.js +36 -1
  57. package/dist/mcp/tools.js.map +1 -1
  58. package/dist/output/github.d.ts +1 -1
  59. package/dist/output/github.js +3 -7
  60. package/dist/output/github.js.map +1 -1
  61. package/dist/output/json.d.ts +3 -1
  62. package/dist/output/json.js +4 -7
  63. package/dist/output/json.js.map +1 -1
  64. package/dist/output/pretty.d.ts +1 -1
  65. package/dist/output/pretty.js +2 -8
  66. package/dist/output/pretty.js.map +1 -1
  67. package/dist/prompts/review-system.d.ts +3 -1
  68. package/dist/prompts/review-system.js +47 -2
  69. package/dist/prompts/review-system.js.map +1 -1
  70. package/dist/providers/claude-code.d.ts +7 -5
  71. package/dist/providers/claude-code.js +77 -15
  72. package/dist/providers/claude-code.js.map +1 -1
  73. package/dist/providers/opencode.d.ts +6 -0
  74. package/dist/providers/opencode.js +653 -0
  75. package/dist/providers/opencode.js.map +1 -0
  76. package/dist/providers/registry.d.ts +7 -7
  77. package/dist/providers/registry.js +29 -21
  78. package/dist/providers/registry.js.map +1 -1
  79. package/dist/providers/types.d.ts +8 -1
  80. package/dist/runner.d.ts +6 -1
  81. package/dist/runner.js +71 -26
  82. package/dist/runner.js.map +1 -1
  83. package/dist/scaffold-paths.d.ts +10 -0
  84. package/dist/scaffold-paths.js +25 -0
  85. package/dist/scaffold-paths.js.map +1 -0
  86. package/dist/types.d.ts +38 -3
  87. package/dist/types.js +4 -7
  88. package/dist/types.js.map +1 -1
  89. package/examples/github-workflow.yml +51 -10
  90. package/package.json +16 -10
package/dist/init.d.ts CHANGED
@@ -3,7 +3,9 @@ export interface InitOptions {
3
3
  cwd: string;
4
4
  /** Overwrite existing rule files. */
5
5
  force: boolean;
6
- provider: string;
6
+ harness: string;
7
+ /** AI provider id, only meaningful for harnesses that support multiple (e.g. opencode). */
8
+ provider?: string;
7
9
  model?: string;
8
10
  timeoutMs: number;
9
11
  onActivity?: (activity: ReviewActivity) => void;
package/dist/init.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readdirSync } from "node:fs";
2
2
  import { join, resolve } from "node:path";
3
3
  import { findRepoRoot } from "./refs.js";
4
- import { getScaffoldFactory } from "./providers/registry.js";
4
+ import { getScaffoldHarness } from "./providers/registry.js";
5
5
  export class InitRefusedError extends Error {
6
6
  constructor(message) {
7
7
  super(message);
@@ -17,8 +17,11 @@ export async function runInit(opts) {
17
17
  }
18
18
  }
19
19
  opts.onStart?.({ repoRoot });
20
- const factory = getScaffoldFactory(opts.provider);
21
- const agent = factory({ ...(opts.model ? { model: opts.model } : {}) });
20
+ const factory = getScaffoldHarness(opts.harness);
21
+ const agent = factory({
22
+ ...(opts.model ? { model: opts.model } : {}),
23
+ ...(opts.provider ? { provider: opts.provider } : {}),
24
+ });
22
25
  const result = await agent.run({
23
26
  repoRoot,
24
27
  force: opts.force,
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA0B7D,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,gBAAgB,CACxB,yDAAyD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAC5G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC;QAC7B,QAAQ;QACR,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC,CAAC;IAEH,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,QAAQ;QACR,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1,11 +1,19 @@
1
- import type { Finding, Severity } from "../types.js";
1
+ import { type Finding, type Resolution, type Severity } from "../types.js";
2
2
  export declare class FindingsAggregator {
3
3
  private byRule;
4
4
  private dedupKeys;
5
5
  private listeners;
6
+ private resolutionsByRule;
7
+ private resolutionDedupKeys;
8
+ private resolutionListeners;
6
9
  onAdd(listener: (f: Finding) => void): () => void;
10
+ onResolution(listener: (r: Resolution) => void): () => void;
7
11
  add(finding: Finding): boolean;
12
+ /** Record that a prior finding was resolved by the agent. */
13
+ markResolved(ruleId: string, fingerprint: string, reason: "fixed" | "stale", resolvedAtSha?: string): boolean;
8
14
  countFor(ruleId: string): number;
15
+ resolutionsFor(ruleId: string): Resolution[];
9
16
  all(): Finding[];
17
+ allResolutions(): Resolution[];
10
18
  maxSeverity(): Severity | undefined;
11
19
  }
@@ -1,11 +1,19 @@
1
+ import { SEVERITIES } from "../types.js";
1
2
  export class FindingsAggregator {
2
3
  byRule = new Map();
3
4
  dedupKeys = new Set();
4
5
  listeners = new Set();
6
+ resolutionsByRule = new Map();
7
+ resolutionDedupKeys = new Set();
8
+ resolutionListeners = new Set();
5
9
  onAdd(listener) {
6
10
  this.listeners.add(listener);
7
11
  return () => this.listeners.delete(listener);
8
12
  }
13
+ onResolution(listener) {
14
+ this.resolutionListeners.add(listener);
15
+ return () => this.resolutionListeners.delete(listener);
16
+ }
9
17
  add(finding) {
10
18
  const key = `${finding.ruleId}\0${finding.severity}\0${finding.path}\0${finding.line ?? ""}\0${finding.lineEnd ?? ""}\0${finding.message}`;
11
19
  if (this.dedupKeys.has(key))
@@ -24,24 +32,52 @@ export class FindingsAggregator {
24
32
  }
25
33
  return true;
26
34
  }
35
+ /** Record that a prior finding was resolved by the agent. */
36
+ markResolved(ruleId, fingerprint, reason, resolvedAtSha = "") {
37
+ const key = `${ruleId}\0${fingerprint}`;
38
+ if (this.resolutionDedupKeys.has(key))
39
+ return false;
40
+ this.resolutionDedupKeys.add(key);
41
+ const resolution = { ruleId, fingerprint, reason, resolvedAtSha };
42
+ const list = this.resolutionsByRule.get(ruleId);
43
+ if (list)
44
+ list.push(resolution);
45
+ else
46
+ this.resolutionsByRule.set(ruleId, [resolution]);
47
+ for (const l of this.resolutionListeners) {
48
+ try {
49
+ l(resolution);
50
+ }
51
+ catch { /* listener errors must not affect aggregation */ }
52
+ }
53
+ return true;
54
+ }
27
55
  countFor(ruleId) {
28
56
  return this.byRule.get(ruleId)?.length ?? 0;
29
57
  }
58
+ resolutionsFor(ruleId) {
59
+ return this.resolutionsByRule.get(ruleId) ?? [];
60
+ }
30
61
  all() {
31
62
  const out = [];
32
63
  for (const list of this.byRule.values())
33
64
  out.push(...list);
34
65
  return out;
35
66
  }
67
+ allResolutions() {
68
+ const out = [];
69
+ for (const list of this.resolutionsByRule.values())
70
+ out.push(...list);
71
+ return out;
72
+ }
36
73
  maxSeverity() {
37
- const order = ["aesthetic", "low", "medium", "high", "critical"];
38
74
  let max = -1;
39
75
  for (const f of this.all()) {
40
- const idx = order.indexOf(f.severity);
76
+ const idx = SEVERITIES.indexOf(f.severity);
41
77
  if (idx > max)
42
78
  max = idx;
43
79
  }
44
- return max < 0 ? undefined : order[max];
80
+ return max < 0 ? undefined : SEVERITIES[max];
45
81
  }
46
82
  }
47
83
  //# sourceMappingURL=aggregator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../../src/mcp/aggregator.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IACtC,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEpD,KAAK,CAAC,QAA8B;QAClC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,GAAG,CAAC,OAAgB;QAClB,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,EAAE,KAAK,OAAO,CAAC,OAAO,IAAI,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3I,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iDAAiD,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,GAAG;QACD,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,WAAW;QACT,MAAM,KAAK,GAAe,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7E,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,GAAG,GAAG,GAAG;gBAAE,GAAG,GAAG,GAAG,CAAC;QAC3B,CAAC;QACD,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;CACF"}
1
+ {"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../../src/mcp/aggregator.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,18 @@ export interface SidecarHandle {
5
5
  aggregator: FindingsAggregator;
6
6
  shutdown: () => Promise<void>;
7
7
  }
8
+ export interface ScaffoldSidecarOptions {
9
+ /** Fires once per `.revu.md` file successfully written via `write_rule_file`.
10
+ * The path is repo-relative, forward-slash separated. */
11
+ onFileWritten?: (relPath: string) => void;
12
+ }
8
13
  export interface StartSidecarOptions {
9
14
  repoRoot: string;
10
15
  host?: string;
11
16
  /** If omitted, an ephemeral free port is chosen. */
12
17
  port?: number;
18
+ /** When set, the sidecar additionally exposes a `write_rule_file` tool for
19
+ * scaffold agents that can't enforce path safety in-process (e.g. opencode). */
20
+ scaffold?: ScaffoldSidecarOptions;
13
21
  }
14
22
  export declare function startSidecar(opts: StartSidecarOptions): Promise<SidecarHandle>;
@@ -2,15 +2,24 @@ import { createServer } from "node:http";
2
2
  import { randomBytes } from "node:crypto";
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
5
- import { isAbsolute, relative } from "node:path";
5
+ import { isAbsolute, relative, dirname } from "node:path";
6
+ import { mkdir, writeFile } from "node:fs/promises";
7
+ import { ensureFingerprint } from "../findings.js";
6
8
  import { FindingsAggregator } from "./aggregator.js";
7
- import { ReportFindingShape, REPORT_FINDING_DESCRIPTION } from "./tools.js";
9
+ import { isAllowedRuleFileWrite, toRepoRelative } from "../scaffold-paths.js";
10
+ import { ReportFindingShape, REPORT_FINDING_DESCRIPTION, MarkResolvedShape, MARK_RESOLVED_DESCRIPTION, WriteRuleFileShape, WRITE_RULE_FILE_DESCRIPTION, } from "./tools.js";
8
11
  export async function startSidecar(opts) {
9
12
  const aggregator = new FindingsAggregator();
10
13
  const authToken = randomBytes(24).toString("base64url");
11
14
  const host = opts.host ?? "127.0.0.1";
15
+ const ctx = {
16
+ authToken,
17
+ aggregator,
18
+ repoRoot: opts.repoRoot,
19
+ ...(opts.scaffold ? { scaffold: opts.scaffold } : {}),
20
+ };
12
21
  const httpServer = createServer((req, res) => {
13
- handle(req, res, { authToken, aggregator, repoRoot: opts.repoRoot }).catch((e) => {
22
+ handle(req, res, ctx).catch((e) => {
14
23
  if (!res.headersSent) {
15
24
  res.statusCode = 500;
16
25
  res.end(`internal error: ${e.message}`);
@@ -28,6 +37,14 @@ export async function startSidecar(opts) {
28
37
  const url = `http://${host}:${addr.port}/mcp`;
29
38
  const shutdown = () => new Promise((resolve, reject) => {
30
39
  httpServer.close((err) => (err ? reject(err) : resolve()));
40
+ // `httpServer.close` only stops accepting new connections; it then
41
+ // waits for all keep-alive sockets to drain on their own. The
42
+ // opencode harness keeps an MCP keep-alive connection open, and when
43
+ // an opencode child process is killed mid-prompt, its socket is
44
+ // half-closed but never reaches `end` cleanly — `close()` then waits
45
+ // forever. Force-close every open connection so the runner can
46
+ // proceed to emit its summary instead of hanging post-timeout.
47
+ httpServer.closeAllConnections?.();
31
48
  });
32
49
  return { url, authToken, aggregator, shutdown };
33
50
  }
@@ -66,7 +83,7 @@ function buildMcpServer(ruleId, ctx) {
66
83
  if (args.lineEnd !== undefined && args.line !== undefined && args.lineEnd < args.line) {
67
84
  return errorResult("`lineEnd` must be >= `line`.");
68
85
  }
69
- const finding = {
86
+ const finding = ensureFingerprint({
70
87
  ruleId,
71
88
  severity: args.severity,
72
89
  path: normalizePath(args.path, ctx.repoRoot),
@@ -74,7 +91,8 @@ function buildMcpServer(ruleId, ctx) {
74
91
  ...(args.line !== undefined ? { line: args.line } : {}),
75
92
  ...(args.lineEnd !== undefined ? { lineEnd: args.lineEnd } : {}),
76
93
  ...(args.category !== undefined ? { category: args.category } : {}),
77
- };
94
+ ...(args.priorFp !== undefined ? { priorFp: args.priorFp } : {}),
95
+ });
78
96
  const accepted = ctx.aggregator.add(finding);
79
97
  return {
80
98
  content: [
@@ -87,6 +105,43 @@ function buildMcpServer(ruleId, ctx) {
87
105
  ],
88
106
  };
89
107
  });
108
+ server.registerTool("mark_finding_resolved", {
109
+ description: MARK_RESOLVED_DESCRIPTION,
110
+ inputSchema: MarkResolvedShape,
111
+ }, async (args) => {
112
+ ctx.aggregator.markResolved(ruleId, args.fingerprint, args.reason ?? "fixed");
113
+ return {
114
+ content: [
115
+ {
116
+ type: "text",
117
+ text: `Recorded resolution for ${args.fingerprint} (${args.reason ?? "fixed"}).`,
118
+ },
119
+ ],
120
+ };
121
+ });
122
+ if (ctx.scaffold) {
123
+ const scaffold = ctx.scaffold;
124
+ server.registerTool("write_rule_file", {
125
+ description: WRITE_RULE_FILE_DESCRIPTION,
126
+ inputSchema: WriteRuleFileShape,
127
+ }, async (args) => {
128
+ if (!isAllowedRuleFileWrite(ctx.repoRoot, args.path)) {
129
+ return errorResult("Refused: write_rule_file only accepts paths ending in `.revu.md` that resolve inside the repository. " +
130
+ "Globals go in `.revu/<topic>.revu.md`; locals go alongside the thing they cover as `<dir>/<topic>.revu.md`.");
131
+ }
132
+ const rel = toRepoRelative(ctx.repoRoot, args.path);
133
+ const abs = isAbsolute(args.path) ? args.path : `${ctx.repoRoot}/${rel}`;
134
+ try {
135
+ await mkdir(dirname(abs), { recursive: true });
136
+ await writeFile(abs, args.content, "utf8");
137
+ }
138
+ catch (e) {
139
+ return errorResult(`Failed to write ${rel}: ${e.message}`);
140
+ }
141
+ scaffold.onFileWritten?.(rel);
142
+ return { content: [{ type: "text", text: `Wrote ${rel} (${args.content.length} bytes).` }] };
143
+ });
144
+ }
90
145
  return server;
91
146
  }
92
147
  function normalizePath(input, repoRoot) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export declare const ReportFindingShape: {
6
6
  readonly lineEnd: z.ZodOptional<z.ZodNumber>;
7
7
  readonly message: z.ZodString;
8
8
  readonly category: z.ZodOptional<z.ZodString>;
9
+ readonly priorFp: z.ZodOptional<z.ZodString>;
9
10
  };
10
11
  export declare const ReportFindingObject: z.ZodObject<{
11
12
  readonly severity: z.ZodEnum<["aesthetic", "low", "medium", "high", "critical"]>;
@@ -14,20 +15,55 @@ export declare const ReportFindingObject: z.ZodObject<{
14
15
  readonly lineEnd: z.ZodOptional<z.ZodNumber>;
15
16
  readonly message: z.ZodString;
16
17
  readonly category: z.ZodOptional<z.ZodString>;
18
+ readonly priorFp: z.ZodOptional<z.ZodString>;
17
19
  }, "strip", z.ZodTypeAny, {
20
+ severity: "aesthetic" | "low" | "medium" | "high" | "critical";
18
21
  path: string;
19
22
  message: string;
20
- severity: "aesthetic" | "low" | "medium" | "high" | "critical";
21
23
  line?: number | undefined;
22
24
  lineEnd?: number | undefined;
23
25
  category?: string | undefined;
26
+ priorFp?: string | undefined;
24
27
  }, {
28
+ severity: "aesthetic" | "low" | "medium" | "high" | "critical";
25
29
  path: string;
26
30
  message: string;
27
- severity: "aesthetic" | "low" | "medium" | "high" | "critical";
28
31
  line?: number | undefined;
29
32
  lineEnd?: number | undefined;
30
33
  category?: string | undefined;
34
+ priorFp?: string | undefined;
31
35
  }>;
32
36
  export type ReportFindingInput = z.infer<typeof ReportFindingObject>;
37
+ export declare const MarkResolvedShape: {
38
+ readonly fingerprint: z.ZodString;
39
+ readonly reason: z.ZodOptional<z.ZodEnum<["fixed", "stale"]>>;
40
+ };
41
+ export declare const MarkResolvedObject: z.ZodObject<{
42
+ readonly fingerprint: z.ZodString;
43
+ readonly reason: z.ZodOptional<z.ZodEnum<["fixed", "stale"]>>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ fingerprint: string;
46
+ reason?: "fixed" | "stale" | undefined;
47
+ }, {
48
+ fingerprint: string;
49
+ reason?: "fixed" | "stale" | undefined;
50
+ }>;
51
+ export type MarkResolvedInput = z.infer<typeof MarkResolvedObject>;
52
+ export declare const MARK_RESOLVED_DESCRIPTION = "Mark a previously-reported finding as resolved.\nUse this when reviewing prior findings provided in your system prompt: if the new commits in this PR have addressed an issue you flagged on a previous run, call this tool with the prior finding's fingerprint.\nDo NOT use this tool for findings that are still open at the same location \u2014 just stay silent and the runner will keep them open.\nDo NOT use this tool for findings that have moved to a new location \u2014 instead emit a fresh `report_finding` with the prior fingerprint passed via `priorFp`.";
53
+ export declare const WriteRuleFileShape: {
54
+ readonly path: z.ZodString;
55
+ readonly content: z.ZodString;
56
+ };
57
+ export declare const WriteRuleFileObject: z.ZodObject<{
58
+ readonly path: z.ZodString;
59
+ readonly content: z.ZodString;
60
+ }, "strip", z.ZodTypeAny, {
61
+ path: string;
62
+ content: string;
63
+ }, {
64
+ path: string;
65
+ content: string;
66
+ }>;
67
+ export type WriteRuleFileInput = z.infer<typeof WriteRuleFileObject>;
68
+ export declare const WRITE_RULE_FILE_DESCRIPTION = "Create a revu-ai rule file at the given repo-relative path.\nThe path MUST end in `.revu.md` and resolve inside the repository (server enforces this; out-of-tree paths are rejected).\nGlobals: `.revu/<topic>.revu.md`. Locals: `<sub-service-dir>/<topic>.revu.md` directly inside that directory.\nUse this instead of any built-in file-writing tool \u2014 only this path is safety-checked by revu-ai.";
33
69
  export declare const REPORT_FINDING_DESCRIPTION = "Report a code-review finding to the revu-ai runner.\nCall this tool once for each issue you find. The runner aggregates findings across all reviewers.\nSeverity guidance:\n aesthetic = nit / style preference\n low = minor smell, easy to live with\n medium = should fix; not a bug yet but degrades the codebase\n high = clearly wrong; will cause bugs or regressions\n critical = will break production, security issue, or data loss\nDo NOT report findings outside the scope of your assigned rules.";
package/dist/mcp/tools.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { z } from "zod";
2
+ import { SEVERITIES } from "../types.js";
2
3
  export const ReportFindingShape = {
3
4
  severity: z
4
- .enum(["aesthetic", "low", "medium", "high", "critical"])
5
+ .enum(SEVERITIES)
5
6
  .describe("Severity of the finding."),
6
7
  path: z.string().min(1).describe("Repo-relative file path, forward-slash separated."),
7
8
  line: z
@@ -18,8 +19,42 @@ export const ReportFindingShape = {
18
19
  .describe("1-indexed line number where the issue ends. If set, line must also be set."),
19
20
  message: z.string().min(1).describe("Human-readable description of the issue."),
20
21
  category: z.string().optional().describe("Optional free-form category tag."),
22
+ priorFp: z
23
+ .string()
24
+ .min(1)
25
+ .optional()
26
+ .describe("Set ONLY when this finding is a moved version of a finding that was reported in a previous run (line/location shifted but it's the same logical issue). Pass the prior finding's fingerprint here so the runner can correlate them."),
21
27
  };
22
28
  export const ReportFindingObject = z.object(ReportFindingShape);
29
+ export const MarkResolvedShape = {
30
+ fingerprint: z
31
+ .string()
32
+ .min(1)
33
+ .describe("The fingerprint of the prior finding being marked resolved."),
34
+ reason: z
35
+ .enum(["fixed", "stale"])
36
+ .optional()
37
+ .describe("Why this finding is being marked resolved. `fixed` = the new commits address it. `stale` = the rule's premise no longer holds (file deleted, etc.). Defaults to `fixed`."),
38
+ };
39
+ export const MarkResolvedObject = z.object(MarkResolvedShape);
40
+ export const MARK_RESOLVED_DESCRIPTION = `Mark a previously-reported finding as resolved.
41
+ Use this when reviewing prior findings provided in your system prompt: if the new commits in this PR have addressed an issue you flagged on a previous run, call this tool with the prior finding's fingerprint.
42
+ Do NOT use this tool for findings that are still open at the same location — just stay silent and the runner will keep them open.
43
+ Do NOT use this tool for findings that have moved to a new location — instead emit a fresh \`report_finding\` with the prior fingerprint passed via \`priorFp\`.`;
44
+ export const WriteRuleFileShape = {
45
+ path: z
46
+ .string()
47
+ .min(1)
48
+ .describe("Repo-relative path of the rule file to create. MUST end in `.revu.md`. Globals go in `.revu/<topic>.revu.md`; locals go alongside the thing they cover as `<dir>/<topic>.revu.md`."),
49
+ content: z
50
+ .string()
51
+ .describe("Full Markdown content of the rule file."),
52
+ };
53
+ export const WriteRuleFileObject = z.object(WriteRuleFileShape);
54
+ export const WRITE_RULE_FILE_DESCRIPTION = `Create a revu-ai rule file at the given repo-relative path.
55
+ The path MUST end in \`.revu.md\` and resolve inside the repository (server enforces this; out-of-tree paths are rejected).
56
+ Globals: \`.revu/<topic>.revu.md\`. Locals: \`<sub-service-dir>/<topic>.revu.md\` directly inside that directory.
57
+ Use this instead of any built-in file-writing tool — only this path is safety-checked by revu-ai.`;
23
58
  export const REPORT_FINDING_DESCRIPTION = `Report a code-review finding to the revu-ai runner.
24
59
  Call this tool once for each issue you find. The runner aggregates findings across all reviewers.
25
60
  Severity guidance:
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;SACxD,QAAQ,CAAC,0BAA0B,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IACrF,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,4EAA4E,CAAC;IACzF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAC/E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACpE,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAGhE,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;iEAQuB,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,QAAQ,CAAC,0BAA0B,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IACrF,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,4EAA4E,CAAC;IACzF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAC/E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC5E,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACP,qOAAqO,CACtO;CACK,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAGhE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,6DAA6D,CAAC;IAC1E,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CACP,0KAA0K,CAC3K;CACK,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAG9D,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;iKAGwH,CAAC;AAElK,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,oLAAoL,CACrL;IACH,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,yCAAyC,CAAC;CAC9C,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAGhE,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;kGAGuD,CAAC;AAEnG,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;iEAQuB,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import type { RunReport } from "../types.js";
2
- export declare function emitGithub(report: RunReport, outputFile?: string): void;
2
+ export declare function emitGithub(report: RunReport): void;
@@ -1,4 +1,3 @@
1
- import { writeFileSync } from "node:fs";
2
1
  const SEV_COMMAND = {
3
2
  aesthetic: "notice",
4
3
  low: "notice",
@@ -6,16 +5,13 @@ const SEV_COMMAND = {
6
5
  high: "error",
7
6
  critical: "error",
8
7
  };
9
- export function emitGithub(report, outputFile) {
8
+ export function emitGithub(report) {
10
9
  const lines = [];
11
10
  for (const f of report.findings) {
12
11
  lines.push(formatLine(f));
13
12
  }
14
- const text = lines.length ? lines.join("\n") + "\n" : "";
15
- process.stdout.write(text);
16
- if (outputFile) {
17
- writeFileSync(outputFile, text, "utf8");
18
- }
13
+ if (lines.length)
14
+ process.stdout.write(lines.join("\n") + "\n");
19
15
  }
20
16
  function formatLine(f) {
21
17
  const command = SEV_COMMAND[f.severity];
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/output/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,MAAM,WAAW,GAAqD;IACpE,SAAS,EAAE,QAAQ;IACnB,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,MAAiB,EAAE,UAAmB;IAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAa,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1H,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAChF,CAAC"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/output/github.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAqD;IACpE,SAAS,EAAE,QAAQ;IACnB,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAa,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1H,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAChF,CAAC"}
@@ -1,2 +1,4 @@
1
1
  import type { RunReport } from "../types.js";
2
- export declare function emitJson(report: RunReport, outputFile?: string): void;
2
+ /** Emit the run report as JSON to stdout. The file-side counterpart is always
3
+ * JSON regardless of stdout format — see `writeReportFile` for that. */
4
+ export declare function emitJson(report: RunReport): void;
@@ -1,9 +1,6 @@
1
- import { writeFileSync } from "node:fs";
2
- export function emitJson(report, outputFile) {
3
- const text = JSON.stringify(report, null, 2);
4
- process.stdout.write(text + "\n");
5
- if (outputFile) {
6
- writeFileSync(outputFile, text + "\n", "utf8");
7
- }
1
+ /** Emit the run report as JSON to stdout. The file-side counterpart is always
2
+ * JSON regardless of stdout format — see `writeReportFile` for that. */
3
+ export function emitJson(report) {
4
+ process.stdout.write(JSON.stringify(report, null, 2) + "\n");
8
5
  }
9
6
  //# sourceMappingURL=json.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/output/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,UAAmB;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAClC,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/output/json.ts"],"names":[],"mappings":"AAEA;yEACyE;AACzE,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC/D,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import type { RunReport } from "../types.js";
2
- export declare function emitPretty(report: RunReport, outputFile?: string): void;
2
+ export declare function emitPretty(report: RunReport): void;
@@ -1,4 +1,3 @@
1
- import { writeFileSync } from "node:fs";
2
1
  const COLOR_ENABLED = process.stdout.isTTY && !process.env.NO_COLOR;
3
2
  const c = {
4
3
  reset: "\x1b[0m",
@@ -29,7 +28,7 @@ const SEV_LABEL = {
29
28
  high: "high",
30
29
  critical: "CRIT",
31
30
  };
32
- export function emitPretty(report, outputFile) {
31
+ export function emitPretty(report) {
33
32
  const lines = [];
34
33
  lines.push(paint("bold", `revu-ai ${report.runId.slice(0, 8)}`));
35
34
  lines.push(paint("dim", `target: ${formatTarget(report)} rules: ${report.rules.length} findings: ${report.findings.length}`));
@@ -85,12 +84,7 @@ export function emitPretty(report, outputFile) {
85
84
  }
86
85
  lines.push("");
87
86
  }
88
- const text = lines.join("\n") + "\n";
89
- process.stdout.write(text);
90
- if (outputFile) {
91
- // Strip ANSI codes for file output.
92
- writeFileSync(outputFile, text.replace(/\x1b\[[0-9;]*m/g, ""), "utf8");
93
- }
87
+ process.stdout.write(lines.join("\n") + "\n");
94
88
  }
95
89
  function detectSystemicFailure(report) {
96
90
  // Timeouts are reported in their own banner above; don't double-count.
@@ -1 +1 @@
1
- {"version":3,"file":"pretty.js","sourceRoot":"","sources":["../../src/output/pretty.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pretty.js","sourceRoot":"","sources":["../../src/output/pretty.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import type { ReviewTarget } from "../types.js";
1
+ import type { Finding, ReviewTarget } from "../types.js";
2
2
  export declare function buildSystemPrompt(args: {
3
3
  ruleId: string;
4
4
  rulesContent: string;
5
5
  reviewTarget: ReviewTarget;
6
+ priorFindings?: Finding[];
7
+ priorHeadSha?: string;
6
8
  }): string;