@eviano/tribunal 0.1.2

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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +169 -0
  3. package/dist/analyzers/assertionFreeTest.d.ts +12 -0
  4. package/dist/analyzers/assertionFreeTest.js +316 -0
  5. package/dist/analyzers/assertionFreeTest.js.map +1 -0
  6. package/dist/analyzers/claimReconciliation.d.ts +3 -0
  7. package/dist/analyzers/claimReconciliation.js +190 -0
  8. package/dist/analyzers/claimReconciliation.js.map +1 -0
  9. package/dist/analyzers/defaults.d.ts +8 -0
  10. package/dist/analyzers/defaults.js +82 -0
  11. package/dist/analyzers/defaults.js.map +1 -0
  12. package/dist/analyzers/exports.d.ts +12 -0
  13. package/dist/analyzers/exports.js +84 -0
  14. package/dist/analyzers/exports.js.map +1 -0
  15. package/dist/analyzers/hallucinatedSymbol.d.ts +22 -0
  16. package/dist/analyzers/hallucinatedSymbol.js +233 -0
  17. package/dist/analyzers/hallucinatedSymbol.js.map +1 -0
  18. package/dist/analyzers/index.d.ts +9 -0
  19. package/dist/analyzers/index.js +9 -0
  20. package/dist/analyzers/index.js.map +1 -0
  21. package/dist/claims.d.ts +15 -0
  22. package/dist/claims.js +32 -0
  23. package/dist/claims.js.map +1 -0
  24. package/dist/cli.d.ts +2 -0
  25. package/dist/cli.js +116 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/diff/gitDiff.d.ts +19 -0
  28. package/dist/diff/gitDiff.js +64 -0
  29. package/dist/diff/gitDiff.js.map +1 -0
  30. package/dist/diff/parseUnifiedDiff.d.ts +9 -0
  31. package/dist/diff/parseUnifiedDiff.js +63 -0
  32. package/dist/diff/parseUnifiedDiff.js.map +1 -0
  33. package/dist/index.d.ts +16 -0
  34. package/dist/index.js +25 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/report/render.d.ts +10 -0
  37. package/dist/report/render.js +70 -0
  38. package/dist/report/render.js.map +1 -0
  39. package/dist/types.d.ts +71 -0
  40. package/dist/types.js +8 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hallucinatedSymbol.js","sourceRoot":"","sources":["../../src/analyzers/hallucinatedSymbol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Analyzer } from '../types.js';
2
+ import { assertionFreeTest } from './assertionFreeTest.js';
3
+ import { hallucinatedSymbol } from './hallucinatedSymbol.js';
4
+ import { claimReconciliation } from './claimReconciliation.js';
5
+ /**
6
+ * The analyzer registry. Analyzers are independent and side-effect free; order is display-only.
7
+ */
8
+ export declare const analyzers: Analyzer[];
9
+ export { assertionFreeTest, hallucinatedSymbol, claimReconciliation };
@@ -0,0 +1,9 @@
1
+ import { assertionFreeTest } from './assertionFreeTest.js';
2
+ import { hallucinatedSymbol } from './hallucinatedSymbol.js';
3
+ import { claimReconciliation } from './claimReconciliation.js';
4
+ /**
5
+ * The analyzer registry. Analyzers are independent and side-effect free; order is display-only.
6
+ */
7
+ export const analyzers = [assertionFreeTest, hallucinatedSymbol, claimReconciliation];
8
+ export { assertionFreeTest, hallucinatedSymbol, claimReconciliation };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAe,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;AAElG,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Claim } from './types.js';
2
+ export interface ParseClaimsOptions {
3
+ /**
4
+ * When true, claims are ONLY read from a ```tribunal fenced block. Use this for free-text sources
5
+ * like a PR body, where treating every prose line as a claim would be wrong. When false (a dedicated
6
+ * claims file), the whole text is parsed, but a fenced block still takes precedence if present.
7
+ */
8
+ requireFence?: boolean;
9
+ }
10
+ /**
11
+ * Extract machine-readable claims. This is deliberately a parser, not natural-language understanding:
12
+ * an agent (or human) declares claims in a fixed vocabulary, so an unparsed line can never become a
13
+ * false CONTRADICTED — it simply isn't a claim.
14
+ */
15
+ export declare function parseClaims(text: string, opts?: ParseClaimsOptions): Claim[];
package/dist/claims.js ADDED
@@ -0,0 +1,32 @@
1
+ const FENCE_RE = /```tribunal[^\n]*\n([\s\S]*?)```/i;
2
+ /**
3
+ * Extract machine-readable claims. This is deliberately a parser, not natural-language understanding:
4
+ * an agent (or human) declares claims in a fixed vocabulary, so an unparsed line can never become a
5
+ * false CONTRADICTED — it simply isn't a claim.
6
+ */
7
+ export function parseClaims(text, opts = {}) {
8
+ if (!text)
9
+ return [];
10
+ const fenced = text.match(FENCE_RE);
11
+ if (opts.requireFence && !fenced)
12
+ return [];
13
+ const body = fenced ? fenced[1] : text;
14
+ const claims = [];
15
+ for (const rawLine of body.split('\n')) {
16
+ let line = rawLine.trim();
17
+ if (!line || line.startsWith('#') || line.startsWith('//'))
18
+ continue;
19
+ line = line.replace(/^[-*]\s+/, '').trim(); // strip markdown list markers
20
+ if (!line)
21
+ continue;
22
+ const idx = line.indexOf(':');
23
+ const keyPart = idx >= 0 ? line.slice(0, idx) : line;
24
+ const arg = idx >= 0 ? line.slice(idx + 1).trim() : undefined;
25
+ const key = keyPart.trim().toLowerCase().replace(/[_\s]+/g, '-');
26
+ if (!key)
27
+ continue;
28
+ claims.push({ key, arg: arg || undefined, raw: line });
29
+ }
30
+ return claims;
31
+ }
32
+ //# sourceMappingURL=claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.js","sourceRoot":"","sources":["../src/claims.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,mCAAmC,CAAC;AAWrD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAA2B,EAAE;IACrE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACrE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,8BAA8B;QAC1E,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ import { runTribunal } from './index.js';
3
+ import { exitCode, renderJson, renderMarkdown } from './report/render.js';
4
+ import { parseClaims } from './claims.js';
5
+ import { readFileSync } from 'node:fs';
6
+ const HELP = `tribunal — a deterministic, no-LLM CI gate for agent-authored PRs
7
+
8
+ Usage:
9
+ tribunal check [options]
10
+
11
+ Options:
12
+ --base <ref> Base ref for a range diff (e.g. the PR base branch).
13
+ --head <ref> Head ref for a range diff. Defaults to working tree vs HEAD.
14
+ --diff <file> Read a unified diff from a file instead of invoking git.
15
+ --claims <file> Read machine-readable claims from a file (whole file, or a tribunal fenced block).
16
+ --pr-body <file> Read claims ONLY from a \`\`\`tribunal fenced block in a PR-body file.
17
+ --cwd <dir> Repo root to run in (default: current directory).
18
+ --format <fmt> Output format: md (default) or json.
19
+ --hard-fail Exit non-zero when there is at least one CONTRADICTED finding.
20
+ Off by default (report-only). Gates ONLY on CONTRADICTED.
21
+ -h, --help Show this help.
22
+
23
+ Tribunal gates only on CONTRADICTED (a syntactic certainty). UNVERIFIED never blocks,
24
+ and no LLM is in the verification path.
25
+ `;
26
+ function parseArgs(argv) {
27
+ const opts = { command: '', cwd: process.cwd(), format: 'md', hardFail: false };
28
+ const rest = [...argv];
29
+ while (rest.length) {
30
+ const a = rest.shift();
31
+ switch (a) {
32
+ case '-h':
33
+ case '--help':
34
+ opts.command = 'help';
35
+ break;
36
+ case '--base':
37
+ opts.base = rest.shift();
38
+ break;
39
+ case '--head':
40
+ opts.head = rest.shift();
41
+ break;
42
+ case '--diff':
43
+ opts.diffFile = rest.shift();
44
+ break;
45
+ case '--claims':
46
+ opts.claimsFile = rest.shift();
47
+ break;
48
+ case '--pr-body':
49
+ opts.prBodyFile = rest.shift();
50
+ break;
51
+ case '--cwd':
52
+ opts.cwd = rest.shift() ?? opts.cwd;
53
+ break;
54
+ case '--format': {
55
+ const f = rest.shift();
56
+ if (f === 'md' || f === 'json')
57
+ opts.format = f;
58
+ else
59
+ throw new Error(`Unknown format: ${f} (expected md or json)`);
60
+ break;
61
+ }
62
+ case '--hard-fail':
63
+ opts.hardFail = true;
64
+ break;
65
+ default:
66
+ if (!a.startsWith('-') && !opts.command)
67
+ opts.command = a;
68
+ else
69
+ throw new Error(`Unknown argument: ${a}`);
70
+ }
71
+ }
72
+ return opts;
73
+ }
74
+ function main() {
75
+ let opts;
76
+ try {
77
+ opts = parseArgs(process.argv.slice(2));
78
+ }
79
+ catch (err) {
80
+ process.stderr.write(`${err.message}\n\n${HELP}`);
81
+ process.exit(2);
82
+ }
83
+ if (opts.command === 'help' || opts.command === '') {
84
+ process.stdout.write(HELP);
85
+ process.exit(0);
86
+ }
87
+ if (opts.command !== 'check') {
88
+ process.stderr.write(`Unknown command: ${opts.command}\n\n${HELP}`);
89
+ process.exit(2);
90
+ }
91
+ let claims;
92
+ if (opts.claimsFile)
93
+ claims = parseClaims(readFileSync(opts.claimsFile, 'utf8'));
94
+ else if (opts.prBodyFile)
95
+ claims = parseClaims(readFileSync(opts.prBodyFile, 'utf8'), { requireFence: true });
96
+ const src = {
97
+ repoRoot: opts.cwd,
98
+ base: opts.base,
99
+ head: opts.head,
100
+ diffText: opts.diffFile ? readFileSync(opts.diffFile, 'utf8') : undefined,
101
+ claims,
102
+ };
103
+ let report;
104
+ try {
105
+ report = runTribunal(src);
106
+ }
107
+ catch (err) {
108
+ process.stderr.write(`tribunal: ${err.message}\n`);
109
+ process.exit(2);
110
+ }
111
+ const out = opts.format === 'json' ? renderJson(report) : renderMarkdown(report, opts.hardFail);
112
+ process.stdout.write(`${out}\n`);
113
+ process.exit(exitCode(report, opts.hardFail));
114
+ }
115
+ main();
116
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AnalyzerContext, ChangedFile, Claim } from '../types.js';
2
+ export interface DiffSource {
3
+ repoRoot: string;
4
+ /** Base ref for a range diff (e.g. the PR base branch). */
5
+ base?: string;
6
+ /** Head ref for a range diff. Defaults to working tree / HEAD. */
7
+ head?: string;
8
+ /** Raw unified diff text. When set, git is not invoked (useful for tests and piped diffs). */
9
+ diffText?: string;
10
+ /** Machine-readable claims parsed from the PR body / claims file. */
11
+ claims?: Claim[];
12
+ }
13
+ /** Resolve the set of changed files from either a raw diff or `git diff`. */
14
+ export declare function getChangedFiles(src: DiffSource): ChangedFile[];
15
+ /**
16
+ * Build an AnalyzerContext that reads file contents from the working tree (assumed to be the head
17
+ * checkout). For range diffs in CI, check out `head` before running.
18
+ */
19
+ export declare function makeContext(src: DiffSource): AnalyzerContext;
@@ -0,0 +1,64 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { parseUnifiedDiff } from './parseUnifiedDiff.js';
5
+ /** Resolve the set of changed files from either a raw diff or `git diff`. */
6
+ export function getChangedFiles(src) {
7
+ if (src.diffText != null)
8
+ return parseUnifiedDiff(src.diffText);
9
+ const args = ['diff', '--no-color', '--unified=0'];
10
+ if (src.base && src.head)
11
+ args.push(`${src.base}...${src.head}`);
12
+ else if (src.base)
13
+ args.push(src.base);
14
+ else
15
+ args.push('HEAD');
16
+ const out = execFileSync('git', args, {
17
+ cwd: src.repoRoot,
18
+ encoding: 'utf8',
19
+ maxBuffer: 64 * 1024 * 1024,
20
+ });
21
+ return parseUnifiedDiff(out);
22
+ }
23
+ /**
24
+ * Build an AnalyzerContext that reads file contents from the working tree (assumed to be the head
25
+ * checkout). For range diffs in CI, check out `head` before running.
26
+ */
27
+ export function makeContext(src) {
28
+ const repoRoot = resolve(src.repoRoot);
29
+ const changedFiles = getChangedFiles(src);
30
+ // Base-tree reads require a base ref and real git history (not the piped-diff path).
31
+ const canReadBase = src.diffText == null && !!src.base;
32
+ return {
33
+ repoRoot,
34
+ base: src.base,
35
+ claims: src.claims,
36
+ readFile(path) {
37
+ const full = join(repoRoot, path);
38
+ if (!existsSync(full))
39
+ return null;
40
+ try {
41
+ return readFileSync(full, 'utf8');
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ },
47
+ readBaseFile: canReadBase
48
+ ? (path) => {
49
+ try {
50
+ return execFileSync('git', ['show', `${src.base}:${path}`], {
51
+ cwd: repoRoot,
52
+ encoding: 'utf8',
53
+ maxBuffer: 64 * 1024 * 1024,
54
+ });
55
+ }
56
+ catch {
57
+ return null; // path did not exist at base
58
+ }
59
+ }
60
+ : undefined,
61
+ changedFiles,
62
+ };
63
+ }
64
+ //# sourceMappingURL=gitDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitDiff.js","sourceRoot":"","sources":["../../src/diff/gitDiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAczD,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,GAAe;IAC7C,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI;QAAE,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEhE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IACnD,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;SAC5D,IAAI,GAAG,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;QACpC,GAAG,EAAE,GAAG,CAAC,QAAQ;QACjB,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAe;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,qFAAqF;IACrF,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACvD,OAAO;QACL,QAAQ;QACR,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,CAAC,IAAY;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnC,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,YAAY,EAAE,WAAW;YACvB,CAAC,CAAC,CAAC,IAAY,EAAiB,EAAE;gBAC9B,IAAI,CAAC;oBACH,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,EAAE;wBAC1D,GAAG,EAAE,QAAQ;wBACb,QAAQ,EAAE,MAAM;wBAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;qBAC5B,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC,CAAC,6BAA6B;gBAC5C,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;QACb,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ChangedFile } from '../types.js';
2
+ /**
3
+ * Parse a unified `git diff` into the set of files changed and, for each, the 1-based line numbers in
4
+ * the NEW file that were added or modified. Works for any `--unified=N` (including 0).
5
+ *
6
+ * We deliberately track only new-file line numbers: analyzers reason about the post-change tree, so a
7
+ * "touched" node is one whose new-file line range overlaps `addedLines`.
8
+ */
9
+ export declare function parseUnifiedDiff(diff: string): ChangedFile[];
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Parse a unified `git diff` into the set of files changed and, for each, the 1-based line numbers in
3
+ * the NEW file that were added or modified. Works for any `--unified=N` (including 0).
4
+ *
5
+ * We deliberately track only new-file line numbers: analyzers reason about the post-change tree, so a
6
+ * "touched" node is one whose new-file line range overlaps `addedLines`.
7
+ */
8
+ export function parseUnifiedDiff(diff) {
9
+ const files = [];
10
+ let current = null;
11
+ let newLine = 0;
12
+ for (const line of diff.split('\n')) {
13
+ if (line.startsWith('diff --git')) {
14
+ current = { path: '', status: 'modified', addedLines: new Set() };
15
+ files.push(current);
16
+ const m = line.match(/^diff --git a\/(.+?) b\/(.+)$/);
17
+ if (m)
18
+ current.path = m[2];
19
+ continue;
20
+ }
21
+ if (!current)
22
+ continue;
23
+ if (line.startsWith('new file mode')) {
24
+ current.status = 'added';
25
+ }
26
+ else if (line.startsWith('deleted file mode')) {
27
+ current.status = 'deleted';
28
+ }
29
+ else if (line.startsWith('rename to ')) {
30
+ current.path = line.slice('rename to '.length).trim();
31
+ current.status = 'renamed';
32
+ }
33
+ else if (line.startsWith('+++ ')) {
34
+ const p = line.slice(4).trim();
35
+ if (p !== '/dev/null')
36
+ current.path = p.replace(/^b\//, '');
37
+ }
38
+ else if (line.startsWith('--- ')) {
39
+ // old-file header; ignore
40
+ }
41
+ else if (line.startsWith('@@')) {
42
+ const m = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
43
+ if (m)
44
+ newLine = parseInt(m[1], 10);
45
+ }
46
+ else if (line.startsWith('+') && !line.startsWith('+++')) {
47
+ current.addedLines.add(newLine);
48
+ newLine++;
49
+ }
50
+ else if (line.startsWith('-') && !line.startsWith('---')) {
51
+ // removed line: does not advance the new-file counter
52
+ }
53
+ else if (line.startsWith('\\')) {
54
+ // ""
55
+ }
56
+ else if (line.startsWith(' ')) {
57
+ // context line (present when unified > 0)
58
+ newLine++;
59
+ }
60
+ }
61
+ return files;
62
+ }
63
+ //# sourceMappingURL=parseUnifiedDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseUnifiedDiff.js","sourceRoot":"","sources":["../../src/diff/parseUnifiedDiff.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,OAAO,GAAuB,IAAI,CAAC;IACvC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;YAC1E,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACtD,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC;QAC3B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,WAAW;gBAAE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,0BAA0B;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC9D,IAAI,CAAC;gBAAE,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,sDAAsD;QACxD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,gCAAgC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,0CAA0C;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type DiffSource } from './diff/gitDiff.js';
2
+ import type { Analyzer, AnalyzerContext, Report } from './types.js';
3
+ export type { Analyzer, AnalyzerContext, ChangedFile, Claim, Finding, Report, Verdict } from './types.js';
4
+ export { analyzers, assertionFreeTest, hallucinatedSymbol, claimReconciliation } from './analyzers/index.js';
5
+ export { recognizedClaims } from './analyzers/claimReconciliation.js';
6
+ export { parseClaims, type ParseClaimsOptions } from './claims.js';
7
+ export { parseUnifiedDiff } from './diff/parseUnifiedDiff.js';
8
+ export { getChangedFiles, makeContext, type DiffSource } from './diff/gitDiff.js';
9
+ export { buildReport, exitCode, renderJson, renderMarkdown } from './report/render.js';
10
+ export interface RunOptions {
11
+ analyzers?: Analyzer[];
12
+ }
13
+ /** Run analyzers over an AnalyzerContext and aggregate into a Report. */
14
+ export declare function runAnalyzers(ctx: AnalyzerContext, opts?: RunOptions): Report;
15
+ /** Convenience: build a context from a DiffSource and run the analyzers. */
16
+ export declare function runTribunal(src: DiffSource, opts?: RunOptions): Report;
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Tribunal — public API.
3
+ *
4
+ * A deterministic, no-LLM-in-the-verification-path gate for agent-authored PRs. See docs/SPEC.md.
5
+ */
6
+ import { analyzers as defaultAnalyzers } from './analyzers/index.js';
7
+ import { makeContext } from './diff/gitDiff.js';
8
+ import { buildReport } from './report/render.js';
9
+ export { analyzers, assertionFreeTest, hallucinatedSymbol, claimReconciliation } from './analyzers/index.js';
10
+ export { recognizedClaims } from './analyzers/claimReconciliation.js';
11
+ export { parseClaims } from './claims.js';
12
+ export { parseUnifiedDiff } from './diff/parseUnifiedDiff.js';
13
+ export { getChangedFiles, makeContext } from './diff/gitDiff.js';
14
+ export { buildReport, exitCode, renderJson, renderMarkdown } from './report/render.js';
15
+ /** Run analyzers over an AnalyzerContext and aggregate into a Report. */
16
+ export function runAnalyzers(ctx, opts = {}) {
17
+ const list = opts.analyzers ?? defaultAnalyzers;
18
+ const findings = list.flatMap((a) => a.run(ctx));
19
+ return buildReport(findings, list.length);
20
+ }
21
+ /** Convenience: build a context from a DiffSource and run the analyzers. */
22
+ export function runTribunal(src, opts = {}) {
23
+ return runAnalyzers(makeContext(src), opts);
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,WAAW,EAA2B,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMvF,yEAAyE;AACzE,MAAM,UAAU,YAAY,CAAC,GAAoB,EAAE,OAAmB,EAAE;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAC,GAAe,EAAE,OAAmB,EAAE;IAChE,OAAO,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Finding, Report } from '../types.js';
2
+ export declare function buildReport(findings: Finding[], analyzersRun: number): Report;
3
+ /**
4
+ * The build is gated ONLY on CONTRADICTED, and ONLY when `--hard-fail` is set. This is the fails-safe
5
+ * guarantee from the Trust Contract: absence of CONTRADICTED never blocks, and UNVERIFIED never blocks.
6
+ */
7
+ export declare function exitCode(report: Report, hardFail: boolean): number;
8
+ export declare function renderJson(report: Report): string;
9
+ /** Markdown intended for a PR comment: blocking findings first, PASS collapsed to a count. */
10
+ export declare function renderMarkdown(report: Report, hardFail: boolean): string;
@@ -0,0 +1,70 @@
1
+ const VERDICT_EMOJI = {
2
+ CONTRADICTED: '🔴',
3
+ UNVERIFIED: '🟡',
4
+ PASS: '🟢',
5
+ };
6
+ export function buildReport(findings, analyzersRun) {
7
+ const counts = { PASS: 0, UNVERIFIED: 0, CONTRADICTED: 0 };
8
+ for (const f of findings)
9
+ counts[f.verdict]++;
10
+ return { findings, counts, analyzersRun };
11
+ }
12
+ /**
13
+ * The build is gated ONLY on CONTRADICTED, and ONLY when `--hard-fail` is set. This is the fails-safe
14
+ * guarantee from the Trust Contract: absence of CONTRADICTED never blocks, and UNVERIFIED never blocks.
15
+ */
16
+ export function exitCode(report, hardFail) {
17
+ return hardFail && report.counts.CONTRADICTED > 0 ? 1 : 0;
18
+ }
19
+ export function renderJson(report) {
20
+ return JSON.stringify(report, null, 2);
21
+ }
22
+ /** Markdown intended for a PR comment: blocking findings first, PASS collapsed to a count. */
23
+ export function renderMarkdown(report, hardFail) {
24
+ const { counts } = report;
25
+ const blocking = report.findings.filter((f) => f.verdict === 'CONTRADICTED');
26
+ const unverified = report.findings.filter((f) => f.verdict === 'UNVERIFIED');
27
+ const lines = [];
28
+ lines.push('## ⚖️ Tribunal');
29
+ lines.push('');
30
+ lines.push(`${VERDICT_EMOJI.CONTRADICTED} **${counts.CONTRADICTED} contradicted** · ` +
31
+ `${VERDICT_EMOJI.UNVERIFIED} ${counts.UNVERIFIED} unverified · ` +
32
+ `${VERDICT_EMOJI.PASS} ${counts.PASS} pass`);
33
+ lines.push('');
34
+ if (blocking.length > 0) {
35
+ lines.push('### 🔴 Contradicted — these are deterministic, blocking findings');
36
+ lines.push('');
37
+ for (const f of blocking)
38
+ lines.push(renderFinding(f));
39
+ lines.push('');
40
+ }
41
+ if (unverified.length > 0) {
42
+ lines.push('### 🟡 Unverified — could not be decided; not blocking');
43
+ lines.push('');
44
+ for (const f of unverified)
45
+ lines.push(renderFinding(f));
46
+ lines.push('');
47
+ }
48
+ if (blocking.length === 0 && unverified.length === 0) {
49
+ lines.push('No issues found in changed files. ✅');
50
+ lines.push('');
51
+ }
52
+ const gate = counts.CONTRADICTED > 0
53
+ ? hardFail
54
+ ? '**Result: FAIL** — at least one contradicted finding and `--hard-fail` is on.'
55
+ : '**Result: pass (report-only)** — contradictions found, but `--hard-fail` is off.'
56
+ : '**Result: pass** — no contradictions.';
57
+ lines.push('---');
58
+ lines.push(gate);
59
+ lines.push('');
60
+ lines.push('<sub>Tribunal gates only on 🔴 CONTRADICTED (a syntactic certainty). 🟡 UNVERIFIED never blocks. ' +
61
+ 'No LLM is in the verification path.</sub>');
62
+ return lines.join('\n');
63
+ }
64
+ function renderFinding(f) {
65
+ const loc = f.endLine && f.endLine !== f.line ? `${f.line}-${f.endLine}` : `${f.line}`;
66
+ const where = f.claim ? `claim: \`${f.claim}\`` : `\`${f.file}:${loc}\``;
67
+ const head = `- ${VERDICT_EMOJI[f.verdict]} **${f.title}** — ${where} _(${f.analyzer})_`;
68
+ return `${head}\n ${f.detail}`;
69
+ }
70
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Core types for Tribunal.
3
+ *
4
+ * The whole tool is organized around one vocabulary: every check yields one of three verdicts, and
5
+ * the build is gated ONLY on CONTRADICTED. See docs/SPEC.md §3 (the Trust Contract).
6
+ */
7
+ /**
8
+ * - `PASS` — the check was evaluated and the code is consistent with it.
9
+ * - `UNVERIFIED` — the check could not be decided deterministically. Loud, but NEVER blocks.
10
+ * - `CONTRADICTED` — a syntactic certainty that the code violates the check. The only blocking verdict.
11
+ */
12
+ export type Verdict = 'PASS' | 'UNVERIFIED' | 'CONTRADICTED';
13
+ export interface Finding {
14
+ /** Analyzer id, e.g. `assertion-free-test`. */
15
+ analyzer: string;
16
+ verdict: Verdict;
17
+ /** Repo-relative path of the file the finding is about. */
18
+ file: string;
19
+ /** 1-based line of the relevant node. */
20
+ line: number;
21
+ /** 1-based end line, when the finding spans a range (e.g. a whole test block). */
22
+ endLine?: number;
23
+ /** Short headline, e.g. "Test asserts nothing". */
24
+ title: string;
25
+ /** Human explanation + evidence for why this verdict was reached. */
26
+ detail: string;
27
+ /** For claim-reconciliation analyzers: the agent claim being checked. */
28
+ claim?: string;
29
+ }
30
+ export type ChangeStatus = 'added' | 'modified' | 'deleted' | 'renamed';
31
+ export interface ChangedFile {
32
+ /** Repo-relative path in the new tree. */
33
+ path: string;
34
+ status: ChangeStatus;
35
+ /** 1-based line numbers in the NEW file that the diff added or modified. */
36
+ addedLines: Set<number>;
37
+ }
38
+ /** A machine-readable claim extracted from the PR body / claims file. Parsing, never NLU. */
39
+ export interface Claim {
40
+ /** Normalized key, e.g. `added-test`, `no-public-api-change`. */
41
+ key: string;
42
+ /** Optional argument after a colon, e.g. `no-default-flip: timeoutMs`. */
43
+ arg?: string;
44
+ /** The original line, for display. */
45
+ raw: string;
46
+ }
47
+ export interface AnalyzerContext {
48
+ repoRoot: string;
49
+ changedFiles: ChangedFile[];
50
+ /** Read the current (new-tree) content of a repo-relative path, or null if unavailable. */
51
+ readFile(path: string): string | null;
52
+ /** Read the base-tree (pre-change) content of a path, or null if unavailable / absent at base. */
53
+ readBaseFile?(path: string): string | null;
54
+ /** The base ref the diff is taken against, when known. */
55
+ base?: string;
56
+ /** Machine-readable claims extracted from the PR body / claims file. */
57
+ claims?: Claim[];
58
+ }
59
+ export interface Analyzer {
60
+ id: string;
61
+ title: string;
62
+ description: string;
63
+ kind: 'claim-independent' | 'claim-reconciliation';
64
+ run(ctx: AnalyzerContext): Finding[];
65
+ }
66
+ export interface Report {
67
+ findings: Finding[];
68
+ counts: Record<Verdict, number>;
69
+ /** Number of analyzers that executed. */
70
+ analyzersRun: number;
71
+ }
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Core types for Tribunal.
3
+ *
4
+ * The whole tool is organized around one vocabulary: every check yields one of three verdicts, and
5
+ * the build is gated ONLY on CONTRADICTED. See docs/SPEC.md §3 (the Trust Contract).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}