@clipboard-health/tribunal 1.1.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 ADDED
@@ -0,0 +1,57 @@
1
+ # Tribunal CLI
2
+
3
+ `tribunal` gets a structured second opinion from advocate, skeptic, and analyst
4
+ LLM perspectives, then synthesizes the result with a deliberator model.
5
+
6
+ Run with environment variables already present:
7
+
8
+ ```bash
9
+ npm --workspace @clipboard-health/tribunal run dev -- "Should we migrate?" --verbose
10
+ ```
11
+
12
+ `--verbose` writes progress to stderr, including per-role start, finish, and
13
+ failure lines, plus a dot every five seconds while model calls are in flight.
14
+
15
+ Each run writes durable intermediate snapshots to
16
+ `.tribunal/runs/<timestamp>.json` by default. The file is updated as each role
17
+ starts, finishes, or fails, so completed perspective outputs are preserved even
18
+ when a later model call fails. Use `--save-intermediates <path>` to choose a
19
+ specific file, or `--no-save-intermediates` to disable snapshots.
20
+
21
+ After a successful run, an HTML report is written to
22
+ `.tribunal/reports/<timestamp>.html` and opened in your default browser. The
23
+ report shows the deliberator's verdict, recommendation, and confidence at the
24
+ top, with each perspective (advocate, skeptic, analyst) as a collapsible
25
+ accordion below. Override the path with `--html <path>`, skip opening with
26
+ `--no-open`, or disable the report entirely with `--no-html`.
27
+
28
+ Override model reasoning or thinking levels per role:
29
+
30
+ ```bash
31
+ npm --workspace @clipboard-health/tribunal run dev -- "Should we migrate?" \
32
+ --model advocate=anthropic:claude-opus-4-7 \
33
+ --model skeptic=openai:gpt-5.5-pro \
34
+ --model analyst=google:gemini-3.1-pro-preview \
35
+ --deliberator openai:gpt-5.5-pro \
36
+ --reasoning advocate=max \
37
+ --reasoning skeptic=xhigh \
38
+ --reasoning analyst=high \
39
+ --reasoning deliberator=xhigh
40
+ ```
41
+
42
+ Reasoning levels are mapped to each provider's AI SDK options. OpenAI supports
43
+ `none`, `minimal`, `low`, `medium`, `high`, and `xhigh`; Google supports
44
+ `minimal`, `low`, `medium`, and `high`; Anthropic supports `low`, `medium`,
45
+ `high`, `xhigh`, and `max`.
46
+
47
+ Run through 1Password without writing secret values to disk:
48
+
49
+ ```bash
50
+ ANTHROPIC_API_KEY="op://<vault>/ANTHROPIC_API_KEY/<field>" \
51
+ OPENAI_API_KEY="op://<vault>/OPENAI_API_KEY/<field>" \
52
+ GOOGLE_GENERATIVE_AI_API_KEY="op://<vault>/GOOGLE_GENERATIVE_AI_API_KEY/<field>" \
53
+ npm --workspace @clipboard-health/tribunal run dev:op -- "Should we migrate?"
54
+ ```
55
+
56
+ The committed values are only 1Password secret references. `op run` resolves
57
+ them in the child process environment at runtime.
package/bin/opRun.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const runBinPath = fileURLToPath(new URL("run.js", import.meta.url));
6
+ const child = spawn("op", ["run", "--", process.execPath, runBinPath, ...process.argv.slice(2)], {
7
+ // oxlint-disable-next-line node/no-process-env -- op run needs the caller's environment so secret references can be resolved without writing secrets to disk.
8
+ env: process.env,
9
+ stdio: "inherit",
10
+ });
11
+
12
+ child.on("error", (error) => {
13
+ process.stderr.write(`Failed to execute op run: ${error.message}\n`);
14
+ process.exitCode = 1;
15
+ });
16
+
17
+ child.on("exit", (code, signal) => {
18
+ if (signal !== null) {
19
+ process.kill(process.pid, signal);
20
+ return;
21
+ }
22
+
23
+ process.exitCode = code ?? 1;
24
+ });
package/bin/run.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { dirname } from "node:path";
3
+
4
+ import { runCliEntrypoint } from "./runCli.js";
5
+
6
+ runCliEntrypoint(dirname(import.meta.dirname), "index");
package/bin/runCli.js ADDED
@@ -0,0 +1,40 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { constants as osConstants } from "node:os";
4
+ import { join } from "node:path";
5
+
6
+ /**
7
+ * Run a package source entrypoint by basename. Published packages run compiled
8
+ * JavaScript; workspace source runs TypeScript with the source export condition.
9
+ *
10
+ * @param {string} packageRoot
11
+ * @param {string} name
12
+ */
13
+ export function runCliEntrypoint(packageRoot, name) {
14
+ const compiledPath = join(packageRoot, "src", `${name}.js`);
15
+ const hasCompiledEntrypoint = existsSync(compiledPath);
16
+ const entrypointPath = hasCompiledEntrypoint
17
+ ? compiledPath
18
+ : join(packageRoot, "src", `${name}.ts`);
19
+ const result = spawnSync(
20
+ process.execPath,
21
+ [
22
+ ...(hasCompiledEntrypoint ? [] : ["--conditions", "@clipboard-health/source"]),
23
+ entrypointPath,
24
+ ...process.argv.slice(2),
25
+ ],
26
+ { stdio: "inherit" },
27
+ );
28
+
29
+ if (result.error !== undefined) {
30
+ throw result.error;
31
+ }
32
+
33
+ if (result.signal !== null) {
34
+ const signalNumber = osConstants.signals[result.signal];
35
+ process.exitCode = signalNumber === undefined ? 1 : 128 + signalNumber;
36
+ return;
37
+ }
38
+
39
+ process.exitCode = result.status ?? 1;
40
+ }
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@clipboard-health/tribunal",
3
+ "version": "1.1.0",
4
+ "description": "Structured second opinions from advocate, skeptic, analyst, and deliberator LLM perspectives.",
5
+ "keywords": [
6
+ "agent",
7
+ "ai",
8
+ "cli",
9
+ "decision",
10
+ "llm",
11
+ "reasoning"
12
+ ],
13
+ "bugs": "https://github.com/ClipboardHealth/core-utils/issues",
14
+ "license": "MIT",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/ClipboardHealth/core-utils.git",
18
+ "directory": "packages/tribunal"
19
+ },
20
+ "bin": {
21
+ "tribunal": "./bin/run.js",
22
+ "tribunal-op": "./bin/opRun.js"
23
+ },
24
+ "type": "module",
25
+ "main": "./src/index.js",
26
+ "typings": "./src/index.d.ts",
27
+ "exports": {
28
+ "./package.json": "./package.json",
29
+ ".": {
30
+ "types": "./src/index.d.ts",
31
+ "import": "./src/index.js",
32
+ "default": "./src/index.js"
33
+ }
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "scripts": {
39
+ "dev": "node --conditions @clipboard-health/source ./src/index.ts",
40
+ "dev:op": "op run -- node --conditions @clipboard-health/source ./src/index.ts",
41
+ "test": "vitest run --passWithNoTests"
42
+ },
43
+ "dependencies": {
44
+ "@ai-sdk/anthropic": "3.0.78",
45
+ "@ai-sdk/google": "3.0.75",
46
+ "@ai-sdk/openai": "3.0.64",
47
+ "ai": "6.0.182",
48
+ "tslib": "2.8.1",
49
+ "zod": "3.25.76"
50
+ },
51
+ "types": "./src/index.d.ts",
52
+ "module": "./src/index.js"
53
+ }
@@ -0,0 +1,6 @@
1
+ import type { OutputFormat, TribunalResponse } from "./tribunal.ts";
2
+ export interface FormatOutputInput {
3
+ outputFormat: OutputFormat;
4
+ showPerspectives: boolean;
5
+ }
6
+ export declare function formatOutput(response: TribunalResponse, input: FormatOutputInput): string;
package/src/format.js ADDED
@@ -0,0 +1,186 @@
1
+ import { formatModelSpec } from "./models.js";
2
+ export function formatOutput(response, input) {
3
+ const { outputFormat, showPerspectives } = input;
4
+ switch (outputFormat) {
5
+ case "json": {
6
+ return JSON.stringify(response, undefined, 2);
7
+ }
8
+ case "markdown": {
9
+ return formatMarkdownOutput(response, showPerspectives);
10
+ }
11
+ case "text": {
12
+ return formatTextOutput(response, showPerspectives);
13
+ }
14
+ default: {
15
+ throw new Error("Unsupported output format.");
16
+ }
17
+ }
18
+ }
19
+ function formatTextOutput(response, showPerspectives) {
20
+ const sections = [
21
+ "Tribunal",
22
+ `Answer\n${response.result.answer}`,
23
+ `Recommendation\n${response.result.recommendation ?? "No recommendation."}`,
24
+ `Key takeaways\n${formatNumberedList(response.result.keyTakeaways)}`,
25
+ `Consensus\n${formatBulletedList(response.result.consensus)}`,
26
+ `Disagreements\n${formatBulletedList(response.result.disagreements)}`,
27
+ `Confidence: ${formatConfidence(response.result.confidence)}`,
28
+ `Caveats\n${formatBulletedList(response.result.caveats)}`,
29
+ `Open questions\n${formatBulletedList(response.result.openQuestions)}`,
30
+ formatTextMetadata(response),
31
+ ];
32
+ if (showPerspectives) {
33
+ sections.push(...response.perspectives.map(formatTextPerspective));
34
+ }
35
+ return sections.join("\n\n");
36
+ }
37
+ function formatMarkdownOutput(response, showPerspectives) {
38
+ const sections = [
39
+ "# Tribunal",
40
+ `## Answer\n\n${response.result.answer}`,
41
+ `## Recommendation\n\n${response.result.recommendation ?? "No recommendation."}`,
42
+ `## Key takeaways\n\n${formatNumberedList(response.result.keyTakeaways)}`,
43
+ `## Consensus\n\n${formatBulletedList(response.result.consensus)}`,
44
+ `## Disagreements\n\n${formatBulletedList(response.result.disagreements)}`,
45
+ `## Confidence\n\n${formatConfidence(response.result.confidence)}`,
46
+ `## Caveats\n\n${formatBulletedList(response.result.caveats)}`,
47
+ `## Open questions\n\n${formatBulletedList(response.result.openQuestions)}`,
48
+ formatMarkdownMetadata(response),
49
+ ];
50
+ if (showPerspectives) {
51
+ sections.push(...response.perspectives.map(formatMarkdownPerspective));
52
+ }
53
+ return sections.join("\n\n");
54
+ }
55
+ function formatTextPerspective(perspective) {
56
+ return `Perspective: ${capitalize(perspective.role)}
57
+ Summary: ${perspective.result.summary}
58
+ Claims:
59
+ ${perspective.result.claims.map(formatTextClaim).join("\n")}
60
+ Open questions:
61
+ ${formatBulletedList(perspective.result.openQuestions)}`;
62
+ }
63
+ function formatMarkdownPerspective(perspective) {
64
+ return `## Perspective: ${capitalize(perspective.role)}
65
+
66
+ Summary: ${perspective.result.summary}
67
+
68
+ ### Claims
69
+
70
+ ${perspective.result.claims.map(formatMarkdownClaim).join("\n")}
71
+
72
+ ### Open questions
73
+
74
+ ${formatBulletedList(perspective.result.openQuestions)}`;
75
+ }
76
+ function formatTextClaim(claim) {
77
+ const assumptions = claim.assumptions.length === 0 ? "" : ` Assumptions: ${claim.assumptions.join("; ")}`;
78
+ return `- ${claim.claim} (${formatConfidence(claim.confidence)}): ${claim.reasoning}${assumptions}`;
79
+ }
80
+ function formatMarkdownClaim(claim) {
81
+ const assumptions = claim.assumptions.length === 0 ? "" : ` Assumptions: ${claim.assumptions.join("; ")}`;
82
+ return `- **${claim.claim}** (${formatConfidence(claim.confidence)}): ${claim.reasoning}${assumptions}`;
83
+ }
84
+ function formatTextMetadata(response) {
85
+ return `Metadata
86
+ Models: ${formatModels(response)}
87
+ Reasoning: ${formatReasoning(response)}
88
+ Tokens: ${formatTokenUsage(response)}
89
+ Cost: ${formatCost(response.metadata.estimatedCostUsd)}
90
+ Latency: ${formatLatency(response.metadata.latencyMs)}
91
+ Warnings: ${formatInlineWarnings(response.metadata.warnings)}`;
92
+ }
93
+ function formatMarkdownMetadata(response) {
94
+ return `## Metadata
95
+
96
+ - Models: ${formatModels(response)}
97
+ - Reasoning: ${formatReasoning(response)}
98
+ - Tokens: ${formatTokenUsage(response)}
99
+ - Cost: ${formatCost(response.metadata.estimatedCostUsd)}
100
+ - Latency: ${formatLatency(response.metadata.latencyMs)}
101
+ - Warnings: ${formatInlineWarnings(response.metadata.warnings)}`;
102
+ }
103
+ function formatModels(response) {
104
+ const { models } = response.metadata;
105
+ return [
106
+ `advocate=${formatModelSpec(models.advocate)}`,
107
+ `skeptic=${formatModelSpec(models.skeptic)}`,
108
+ `analyst=${formatModelSpec(models.analyst)}`,
109
+ `deliberator=${formatModelSpec(models.deliberator)}`,
110
+ ].join(", ");
111
+ }
112
+ function formatReasoning(response) {
113
+ const { reasoning } = response.metadata;
114
+ if (reasoning === undefined) {
115
+ return "default";
116
+ }
117
+ const parts = [];
118
+ addReasoningPart(parts, "advocate", reasoning.advocate);
119
+ addReasoningPart(parts, "skeptic", reasoning.skeptic);
120
+ addReasoningPart(parts, "analyst", reasoning.analyst);
121
+ addReasoningPart(parts, "deliberator", reasoning.deliberator);
122
+ if (parts.length === 0) {
123
+ return "default";
124
+ }
125
+ return parts.join(", ");
126
+ }
127
+ function formatTokenUsage(response) {
128
+ const { totalUsage } = response.metadata;
129
+ if (totalUsage === undefined) {
130
+ return "unknown";
131
+ }
132
+ const parts = [];
133
+ addTokenUsagePart(parts, "input", totalUsage.inputTokens);
134
+ addTokenUsagePart(parts, "output", totalUsage.outputTokens);
135
+ addTokenUsagePart(parts, "total", totalUsage.totalTokens);
136
+ return parts.join(", ");
137
+ }
138
+ function formatCost(estimatedCostUsd) {
139
+ if (estimatedCostUsd === null) {
140
+ return "unknown";
141
+ }
142
+ return `$${estimatedCostUsd.toFixed(6)}`;
143
+ }
144
+ function formatLatency(latencyMs) {
145
+ if (latencyMs >= 1000) {
146
+ return `${(latencyMs / 1000).toFixed(1)}s`;
147
+ }
148
+ return `${latencyMs}ms`;
149
+ }
150
+ function formatNumberedList(items) {
151
+ if (items.length === 0) {
152
+ return "none";
153
+ }
154
+ return items.map((item, index) => `${index + 1}. ${item}`).join("\n");
155
+ }
156
+ function formatBulletedList(items) {
157
+ if (items.length === 0) {
158
+ return "- none";
159
+ }
160
+ return items.map((item) => `- ${item}`).join("\n");
161
+ }
162
+ function formatInlineWarnings(warnings) {
163
+ if (warnings.length === 0) {
164
+ return "none";
165
+ }
166
+ return warnings.join("; ");
167
+ }
168
+ function formatConfidence(confidence) {
169
+ return `${Math.round(confidence * 100)}%`;
170
+ }
171
+ function capitalize(input) {
172
+ return `${input.slice(0, 1).toUpperCase()}${input.slice(1)}`;
173
+ }
174
+ function addTokenUsagePart(parts, label, value) {
175
+ if (value === undefined) {
176
+ return;
177
+ }
178
+ parts.push(`${label}=${value}`);
179
+ }
180
+ function addReasoningPart(parts, role, value) {
181
+ if (value === undefined) {
182
+ return;
183
+ }
184
+ parts.push(`${role}=${value}`);
185
+ }
186
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../packages/tribunal/src/format.ts"],"names":[],"mappings":"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"}
package/src/html.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { TribunalResponse } from "./tribunal.ts";
2
+ export interface RenderHtmlReportInput {
3
+ response: TribunalResponse;
4
+ query: string;
5
+ context?: string;
6
+ generatedAt: Date;
7
+ }
8
+ export declare function renderHtmlReport(input: RenderHtmlReportInput): string;