nodebench-mcp 2.25.0 → 2.27.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 (86) hide show
  1. package/NODEBENCH_AGENTS.md +5 -4
  2. package/README.md +145 -16
  3. package/dist/__tests__/architectComplex.test.js +3 -5
  4. package/dist/__tests__/architectComplex.test.js.map +1 -1
  5. package/dist/__tests__/batchAutopilot.test.d.ts +8 -0
  6. package/dist/__tests__/batchAutopilot.test.js +218 -0
  7. package/dist/__tests__/batchAutopilot.test.js.map +1 -0
  8. package/dist/__tests__/cliSubcommands.test.d.ts +1 -0
  9. package/dist/__tests__/cliSubcommands.test.js +138 -0
  10. package/dist/__tests__/cliSubcommands.test.js.map +1 -0
  11. package/dist/__tests__/evalHarness.test.js +1 -1
  12. package/dist/__tests__/forecastingDogfood.test.d.ts +9 -0
  13. package/dist/__tests__/forecastingDogfood.test.js +284 -0
  14. package/dist/__tests__/forecastingDogfood.test.js.map +1 -0
  15. package/dist/__tests__/forecastingScoring.test.d.ts +9 -0
  16. package/dist/__tests__/forecastingScoring.test.js +202 -0
  17. package/dist/__tests__/forecastingScoring.test.js.map +1 -0
  18. package/dist/__tests__/localDashboard.test.d.ts +1 -0
  19. package/dist/__tests__/localDashboard.test.js +226 -0
  20. package/dist/__tests__/localDashboard.test.js.map +1 -0
  21. package/dist/__tests__/multiHopDogfood.test.js +11 -11
  22. package/dist/__tests__/multiHopDogfood.test.js.map +1 -1
  23. package/dist/__tests__/openclawDogfood.test.d.ts +23 -0
  24. package/dist/__tests__/openclawDogfood.test.js +535 -0
  25. package/dist/__tests__/openclawDogfood.test.js.map +1 -0
  26. package/dist/__tests__/openclawMessaging.test.d.ts +14 -0
  27. package/dist/__tests__/openclawMessaging.test.js +232 -0
  28. package/dist/__tests__/openclawMessaging.test.js.map +1 -0
  29. package/dist/__tests__/presetRealWorldBench.test.js +0 -2
  30. package/dist/__tests__/presetRealWorldBench.test.js.map +1 -1
  31. package/dist/__tests__/tools.test.js +9 -157
  32. package/dist/__tests__/tools.test.js.map +1 -1
  33. package/dist/__tests__/toolsetGatingEval.test.js +0 -2
  34. package/dist/__tests__/toolsetGatingEval.test.js.map +1 -1
  35. package/dist/__tests__/traceabilityDogfood.test.d.ts +12 -0
  36. package/dist/__tests__/traceabilityDogfood.test.js +241 -0
  37. package/dist/__tests__/traceabilityDogfood.test.js.map +1 -0
  38. package/dist/__tests__/webmcpTools.test.d.ts +7 -0
  39. package/dist/__tests__/webmcpTools.test.js +195 -0
  40. package/dist/__tests__/webmcpTools.test.js.map +1 -0
  41. package/dist/dashboard/briefHtml.d.ts +20 -0
  42. package/dist/dashboard/briefHtml.js +1000 -0
  43. package/dist/dashboard/briefHtml.js.map +1 -0
  44. package/dist/dashboard/briefServer.d.ts +18 -0
  45. package/dist/dashboard/briefServer.js +320 -0
  46. package/dist/dashboard/briefServer.js.map +1 -0
  47. package/dist/dashboard/html.js +1470 -1230
  48. package/dist/dashboard/html.js.map +1 -1
  49. package/dist/dashboard/server.js +166 -41
  50. package/dist/dashboard/server.js.map +1 -1
  51. package/dist/index.js +210 -14
  52. package/dist/index.js.map +1 -1
  53. package/dist/tools/critterTools.js +4 -0
  54. package/dist/tools/critterTools.js.map +1 -1
  55. package/dist/tools/forecastingTools.d.ts +11 -0
  56. package/dist/tools/forecastingTools.js +616 -0
  57. package/dist/tools/forecastingTools.js.map +1 -0
  58. package/dist/tools/localDashboardTools.d.ts +8 -0
  59. package/dist/tools/localDashboardTools.js +332 -0
  60. package/dist/tools/localDashboardTools.js.map +1 -0
  61. package/dist/tools/metaTools.js +170 -1
  62. package/dist/tools/metaTools.js.map +1 -1
  63. package/dist/tools/openclawTools.d.ts +11 -0
  64. package/dist/tools/openclawTools.js +1017 -0
  65. package/dist/tools/openclawTools.js.map +1 -0
  66. package/dist/tools/overstoryTools.d.ts +14 -0
  67. package/dist/tools/overstoryTools.js +426 -0
  68. package/dist/tools/overstoryTools.js.map +1 -0
  69. package/dist/tools/progressiveDiscoveryTools.js +50 -115
  70. package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
  71. package/dist/tools/selfEvalTools.js +8 -1
  72. package/dist/tools/selfEvalTools.js.map +1 -1
  73. package/dist/tools/sessionMemoryTools.js +14 -2
  74. package/dist/tools/sessionMemoryTools.js.map +1 -1
  75. package/dist/tools/toolRegistry.d.ts +1 -15
  76. package/dist/tools/toolRegistry.js +243 -228
  77. package/dist/tools/toolRegistry.js.map +1 -1
  78. package/dist/tools/visualQaTools.d.ts +2 -0
  79. package/dist/tools/visualQaTools.js +1088 -0
  80. package/dist/tools/visualQaTools.js.map +1 -0
  81. package/dist/tools/webmcpTools.d.ts +16 -0
  82. package/dist/tools/webmcpTools.js +703 -0
  83. package/dist/tools/webmcpTools.js.map +1 -0
  84. package/dist/toolsetRegistry.js +6 -2
  85. package/dist/toolsetRegistry.js.map +1 -1
  86. package/package.json +2 -2
@@ -0,0 +1,138 @@
1
+ /**
2
+ * CLI Subcommand tests — integration via child process spawn.
3
+ * Tests the 5 subcommands: discover, setup, workflow, quickref, call
4
+ */
5
+ import { describe, it, expect } from "vitest";
6
+ import { spawnSync } from "node:child_process";
7
+ import { resolve } from "node:path";
8
+ const PKG_DIR = resolve(import.meta.dirname, "../..");
9
+ /** Run CLI and capture both stdout + stderr regardless of exit code */
10
+ const cli = (args) => {
11
+ const result = spawnSync("npx", ["tsx", "src/index.ts", ...args.split(/\s+/)], {
12
+ cwd: PKG_DIR,
13
+ encoding: "utf-8",
14
+ timeout: 20_000,
15
+ shell: true,
16
+ });
17
+ return {
18
+ stdout: result.stdout ?? "",
19
+ stderr: result.stderr ?? "",
20
+ code: result.status ?? 1,
21
+ /** Combined stdout + stderr for easy searching */
22
+ all: `${result.stdout ?? ""}${result.stderr ?? ""}`,
23
+ };
24
+ };
25
+ describe.skip("CLI Subcommands", { timeout: 25_000 }, () => {
26
+ // ── discover ──────────────────────────────────────────────────────────
27
+ describe("discover", () => {
28
+ it("returns ranked results for a security query", () => {
29
+ const { all, code } = cli("--no-embedding discover security audit");
30
+ expect(code).toBe(0);
31
+ expect(all).toContain("Discover:");
32
+ expect(all).toContain("security");
33
+ expect(all).toMatch(/\d+ matches/);
34
+ });
35
+ it("respects --preset filtering", () => {
36
+ const { all, code } = cli("--no-embedding --preset web_dev discover screenshot");
37
+ expect(code).toBe(0);
38
+ expect(all).toContain("screenshot");
39
+ expect(all).toMatch(/ui_capture|vision|ui_ux_dive/);
40
+ });
41
+ it("shows matching workflows", () => {
42
+ const { all, code } = cli("--no-embedding discover security audit");
43
+ expect(code).toBe(0);
44
+ expect(all).toContain("Matching Workflows");
45
+ expect(all).toContain("security_audit");
46
+ });
47
+ it("exits 1 without a query", () => {
48
+ const { code, all } = cli("--no-embedding discover");
49
+ expect(code).toBe(1);
50
+ expect(all).toContain("Usage:");
51
+ });
52
+ });
53
+ // ── workflow ──────────────────────────────────────────────────────────
54
+ describe("workflow", () => {
55
+ it("lists all workflows", () => {
56
+ const { all, code } = cli("workflow list");
57
+ expect(code).toBe(0);
58
+ expect(all).toContain("Available Workflows");
59
+ expect(all).toContain("new_feature");
60
+ expect(all).toContain("security_audit");
61
+ expect(all).toContain("email_assistant");
62
+ });
63
+ it("shows steps for a specific workflow", () => {
64
+ const { all, code } = cli("workflow fix_bug");
65
+ expect(code).toBe(0);
66
+ expect(all).toContain("Workflow:");
67
+ expect(all).toContain("Step 1");
68
+ expect(all).toContain("search_all_knowledge");
69
+ });
70
+ it("shows error for unknown workflow", () => {
71
+ const { all } = cli("workflow nonexistent_workflow");
72
+ expect(all).toContain("Error:");
73
+ expect(all).toContain("Unknown chain");
74
+ });
75
+ });
76
+ // ── quickref ──────────────────────────────────────────────────────────
77
+ describe("quickref", () => {
78
+ it("shows tool info", () => {
79
+ const { all, code } = cli("quickref run_recon");
80
+ expect(code).toBe(0);
81
+ expect(all).toContain("run_recon");
82
+ expect(all).toContain("Next action:");
83
+ expect(all).toContain("Next tools:");
84
+ });
85
+ it("shows graph neighbors at depth 2", () => {
86
+ const { all, code } = cli("quickref run_recon --depth 2");
87
+ expect(code).toBe(0);
88
+ expect(all).toContain("Related tools");
89
+ expect(all).toContain("hop 1");
90
+ expect(all).toContain("hop 2");
91
+ });
92
+ it("shows didYouMean for unknown tool", () => {
93
+ const { all } = cli("quickref recon");
94
+ expect(all).toContain("Did you mean:");
95
+ });
96
+ });
97
+ // ── setup ─────────────────────────────────────────────────────────────
98
+ describe("setup", () => {
99
+ it("shows domain readiness report", () => {
100
+ const { all, code } = cli("setup");
101
+ expect(code).toBe(0);
102
+ expect(all).toContain("NodeBench MCP Setup Status");
103
+ expect(all).toContain("domains ready");
104
+ expect(all).toMatch(/web|vision|github|llm|embedding/);
105
+ });
106
+ });
107
+ // ── call ──────────────────────────────────────────────────────────────
108
+ describe("call", () => {
109
+ it("calls a tool and returns JSON", () => {
110
+ const { stdout, code } = cli('call getMethodology --args "{\\"topic\\": \\"overview\\"}"');
111
+ expect(code).toBe(0);
112
+ const parsed = JSON.parse(stdout);
113
+ expect(parsed.title).toContain("Overview");
114
+ });
115
+ it("exits 1 for unknown tool", () => {
116
+ const { code, all } = cli("call nonexistent_tool_xyz");
117
+ expect(code).toBe(1);
118
+ expect(all).toContain("Unknown tool");
119
+ });
120
+ it("exits 1 for invalid --args JSON", () => {
121
+ const { code, all } = cli("call getMethodology --args not-json");
122
+ expect(code).toBe(1);
123
+ expect(all).toContain("Invalid JSON");
124
+ });
125
+ });
126
+ // ── help ──────────────────────────────────────────────────────────────
127
+ describe("help text", () => {
128
+ it("includes subcommand section", () => {
129
+ const { all } = cli("--help");
130
+ expect(all).toContain("Subcommands:");
131
+ expect(all).toContain("discover <query>");
132
+ expect(all).toContain("workflow <name|list>");
133
+ expect(all).toContain("quickref <tool>");
134
+ expect(all).toContain("call <tool>");
135
+ });
136
+ });
137
+ });
138
+ //# sourceMappingURL=cliSubcommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliSubcommands.test.js","sourceRoot":"","sources":["../../src/__tests__/cliSubcommands.test.ts"],"names":[],"mappings":"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"}
@@ -600,7 +600,7 @@ describe("Scenario: Meta Tool Discovery", () => {
600
600
  }, "meta");
601
601
  expect(result.title).toContain("Overview");
602
602
  const topics = Object.keys(result.steps[0].topics);
603
- expect(topics.length).toBe(24);
603
+ expect(topics.length).toBe(26);
604
604
  });
605
605
  it("Step 4: Get specific methodology", async () => {
606
606
  const methodologies = [
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Forecasting OS — Integration Tests (Dogfood)
3
+ *
4
+ * Full lifecycle tests: create → evidence → update → resolve → track record → calibration.
5
+ * Uses MCP tools directly (SQLite-backed, no Convex dependency).
6
+ *
7
+ * Run: npx vitest run src/__tests__/forecastingDogfood.test.ts
8
+ */
9
+ export {};
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Forecasting OS — Integration Tests (Dogfood)
3
+ *
4
+ * Full lifecycle tests: create → evidence → update → resolve → track record → calibration.
5
+ * Uses MCP tools directly (SQLite-backed, no Convex dependency).
6
+ *
7
+ * Run: npx vitest run src/__tests__/forecastingDogfood.test.ts
8
+ */
9
+ import { describe, it, expect, beforeAll } from "vitest";
10
+ import { forecastingTools } from "../tools/forecastingTools.js";
11
+ // ─── Helpers ────────────────────────────────────────────────────────────────
12
+ const toolMap = new Map(forecastingTools.map((t) => [t.name, t]));
13
+ async function callTool(name, args) {
14
+ const tool = toolMap.get(name);
15
+ if (!tool)
16
+ throw new Error(`Tool ${name} not found`);
17
+ const result = await tool.handler(args);
18
+ const text = result.find((r) => r.type === "text")?.text;
19
+ if (!text)
20
+ throw new Error(`Tool ${name} returned no text`);
21
+ return JSON.parse(text);
22
+ }
23
+ // ─── Tool Structure ─────────────────────────────────────────────────────────
24
+ describe("Forecasting tools: structure", () => {
25
+ it("should have 9 tools", () => {
26
+ expect(forecastingTools.length).toBe(9);
27
+ });
28
+ it("every tool has name, description, inputSchema, handler", () => {
29
+ for (const tool of forecastingTools) {
30
+ expect(tool.name).toBeTruthy();
31
+ expect(tool.description).toBeTruthy();
32
+ expect(tool.inputSchema).toBeDefined();
33
+ expect(typeof tool.handler).toBe("function");
34
+ }
35
+ });
36
+ it("tool names match expected list", () => {
37
+ const names = forecastingTools.map((t) => t.name).sort();
38
+ expect(names).toEqual([
39
+ "add_forecast_evidence",
40
+ "compute_calibration",
41
+ "create_forecast",
42
+ "get_active_forecasts",
43
+ "get_forecast_chain",
44
+ "get_forecast_evidence",
45
+ "get_forecast_track_record",
46
+ "resolve_forecast",
47
+ "update_forecast_probability",
48
+ ]);
49
+ });
50
+ });
51
+ // ─── Full Lifecycle ─────────────────────────────────────────────────────────
52
+ describe("Forecasting lifecycle", () => {
53
+ let forecastId;
54
+ it("create_forecast — creates a binary forecast", async () => {
55
+ const result = await callTool("create_forecast", {
56
+ question: "Will GPT-5 be released by 2026-12-31?",
57
+ forecastType: "binary",
58
+ resolutionDate: "2026-12-31",
59
+ resolutionCriteria: "OpenAI announces GPT-5 on official blog or press release",
60
+ probability: 0.5,
61
+ baseRate: 0.6,
62
+ refreshFrequency: "weekly",
63
+ topDrivers: ["Historical 18-month release cadence", "Sam Altman interview hints"],
64
+ topCounterarguments: ["No official roadmap published"],
65
+ tags: ["ai_tech"],
66
+ });
67
+ expect(result.forecastId).toBeTruthy();
68
+ expect(result.status).toBe("active");
69
+ expect(result.probability).toBe(0.5);
70
+ forecastId = result.forecastId;
71
+ });
72
+ it("add_forecast_evidence — adds supporting evidence", async () => {
73
+ const result = await callTool("add_forecast_evidence", {
74
+ forecastId,
75
+ sourceUrl: "https://example.com/sam-altman-interview",
76
+ sourceTitle: "Sam Altman Interview on AI Progress",
77
+ sourceType: "news",
78
+ excerpt: "Altman hints at a major model release in the second half of 2026",
79
+ signal: "supporting",
80
+ impactOnProbability: 0.1,
81
+ });
82
+ expect(result.evidenceId).toBeTruthy();
83
+ expect(result.signal).toBe("supporting");
84
+ });
85
+ it("add_forecast_evidence — adds disconfirming evidence", async () => {
86
+ const result = await callTool("add_forecast_evidence", {
87
+ forecastId,
88
+ sourceUrl: "https://example.com/compute-shortage",
89
+ sourceTitle: "GPU Shortage Report Q1 2026",
90
+ sourceType: "filing",
91
+ excerpt: "Major cloud providers report 40% compute capacity shortfall for large model training",
92
+ signal: "disconfirming",
93
+ });
94
+ expect(result.evidenceId).toBeTruthy();
95
+ expect(result.signal).toBe("disconfirming");
96
+ });
97
+ it("add_forecast_evidence — deduplicates by URL", async () => {
98
+ const result = await callTool("add_forecast_evidence", {
99
+ forecastId,
100
+ sourceUrl: "https://example.com/sam-altman-interview",
101
+ sourceTitle: "Duplicate",
102
+ sourceType: "news",
103
+ excerpt: "Duplicate entry",
104
+ signal: "supporting",
105
+ });
106
+ expect(result.error).toContain("already exists");
107
+ });
108
+ it("get_forecast_evidence — returns evidence", async () => {
109
+ const result = await callTool("get_forecast_evidence", {
110
+ forecastId,
111
+ });
112
+ expect(result.count).toBe(2);
113
+ expect(result.evidence.length).toBe(2);
114
+ });
115
+ it("get_forecast_evidence — filters by signal", async () => {
116
+ const result = await callTool("get_forecast_evidence", {
117
+ forecastId,
118
+ signal: "supporting",
119
+ });
120
+ expect(result.count).toBe(1);
121
+ });
122
+ it("update_forecast_probability — updates with reasoning", async () => {
123
+ const result = await callTool("update_forecast_probability", {
124
+ forecastId,
125
+ probability: 0.65,
126
+ topDrivers: [
127
+ "Sam Altman interview hint",
128
+ "Historical 18-month cadence",
129
+ "Competitor pressure from Google Gemini",
130
+ ],
131
+ topCounterarguments: [
132
+ "GPU shortage may delay training",
133
+ "No official roadmap",
134
+ ],
135
+ reasoning: "Soft leadership signal + historical pattern outweigh compute concerns",
136
+ });
137
+ expect(result.previousProbability).toBe(0.5);
138
+ expect(result.newProbability).toBe(0.65);
139
+ expect(result.diff).toBe("50% → 65% (+15pp)");
140
+ });
141
+ it("update_forecast_probability — validates range", async () => {
142
+ const result = await callTool("update_forecast_probability", {
143
+ forecastId,
144
+ probability: 1.5,
145
+ reasoning: "Invalid",
146
+ });
147
+ expect(result.error).toContain("between 0 and 1");
148
+ });
149
+ it("get_forecast_chain — returns full audit trail", async () => {
150
+ const result = await callTool("get_forecast_chain", {
151
+ forecastId,
152
+ });
153
+ expect(result.forecast).toBeTruthy();
154
+ expect(result.evidence.length).toBe(2);
155
+ expect(result.updateHistory.length).toBe(1);
156
+ expect(result.resolution).toBeNull();
157
+ expect(result.summary.evidenceCount).toBe(2);
158
+ expect(result.summary.updateCount).toBe(1);
159
+ expect(result.summary.isResolved).toBe(false);
160
+ });
161
+ it("get_active_forecasts — lists active forecasts", async () => {
162
+ const result = await callTool("get_active_forecasts", {});
163
+ expect(result.count).toBeGreaterThanOrEqual(1);
164
+ const forecasts = result.forecasts;
165
+ const found = forecasts.find((f) => f.id === forecastId);
166
+ expect(found).toBeTruthy();
167
+ expect(found?.status).toBe("active");
168
+ });
169
+ it("resolve_forecast — resolves with Brier score", async () => {
170
+ const result = await callTool("resolve_forecast", {
171
+ forecastId,
172
+ outcome: "yes",
173
+ resolutionNotes: "GPT-5 announced on 2026-11-15 via OpenAI blog post",
174
+ resolutionSourceUrl: "https://openai.com/gpt-5-announcement",
175
+ });
176
+ expect(result.status).toBe("resolved");
177
+ expect(result.outcome).toBe("yes");
178
+ // Brier: (0.65 - 1)^2 = 0.1225
179
+ expect(result.brierScore).toBeCloseTo(0.1225, 3);
180
+ // Log: -log(0.65) ≈ 0.431
181
+ expect(result.logScore).toBeCloseTo(0.431, 2);
182
+ });
183
+ it("resolve_forecast — cannot resolve twice", async () => {
184
+ const result = await callTool("resolve_forecast", {
185
+ forecastId,
186
+ outcome: "no",
187
+ resolutionNotes: "Already resolved",
188
+ });
189
+ expect(result.error).toContain("already resolved");
190
+ });
191
+ it("get_forecast_track_record — shows Brier aggregate", async () => {
192
+ const result = await callTool("get_forecast_track_record", {});
193
+ expect(result.scoredCount).toBeGreaterThanOrEqual(1);
194
+ // SQLite persists between test runs, so overallBrier is average across ALL
195
+ // resolved forecasts (not just this run). Use a reasonable bound instead.
196
+ expect(result.overallBrier).toBeGreaterThan(0);
197
+ expect(result.overallBrier).toBeLessThan(0.5);
198
+ });
199
+ });
200
+ // ─── Multi-Forecast Calibration ─────────────────────────────────────────────
201
+ describe("Forecasting calibration", () => {
202
+ beforeAll(async () => {
203
+ // Create and resolve 5 forecasts with known outcomes for calibration
204
+ const scenarios = [
205
+ { probability: 0.9, outcome: "yes" }, // Brier: 0.01
206
+ { probability: 0.8, outcome: "yes" }, // Brier: 0.04
207
+ { probability: 0.3, outcome: "no" }, // Brier: 0.09
208
+ { probability: 0.1, outcome: "no" }, // Brier: 0.01
209
+ { probability: 0.6, outcome: "yes" }, // Brier: 0.16
210
+ ];
211
+ for (let i = 0; i < scenarios.length; i++) {
212
+ const create = await callTool("create_forecast", {
213
+ question: `Calibration test forecast ${i + 1}?`,
214
+ resolutionDate: "2026-01-01",
215
+ resolutionCriteria: `Test criteria ${i + 1}`,
216
+ probability: scenarios[i].probability,
217
+ tags: ["test_calibration"],
218
+ });
219
+ await callTool("resolve_forecast", {
220
+ forecastId: create.forecastId,
221
+ outcome: scenarios[i].outcome,
222
+ resolutionNotes: `Test resolution ${i + 1}`,
223
+ });
224
+ }
225
+ });
226
+ it("compute_calibration — returns 10 bins", async () => {
227
+ const result = await callTool("compute_calibration", {});
228
+ expect(result.bins).toBeTruthy();
229
+ expect(result.bins.length).toBe(10);
230
+ expect(result.overallBrier).toBeTruthy();
231
+ expect(typeof result.overallBrier).toBe("number");
232
+ expect(result.forecastCount).toBeGreaterThanOrEqual(5);
233
+ });
234
+ it("get_forecast_track_record — aggregate includes all resolved", async () => {
235
+ const result = await callTool("get_forecast_track_record", {});
236
+ // At least 6 resolved (1 from lifecycle + 5 from calibration)
237
+ expect(result.scoredCount).toBeGreaterThanOrEqual(6);
238
+ // Average Brier should be reasonable
239
+ expect(result.overallBrier).toBeLessThan(0.25);
240
+ });
241
+ });
242
+ // ─── Edge Cases ─────────────────────────────────────────────────────────────
243
+ describe("Forecasting edge cases", () => {
244
+ it("create_forecast — rejects invalid probability", async () => {
245
+ const result = await callTool("create_forecast", {
246
+ question: "Invalid prob test",
247
+ resolutionDate: "2026-12-31",
248
+ resolutionCriteria: "Test",
249
+ probability: -0.1,
250
+ });
251
+ expect(result.error).toContain("between 0 and 1");
252
+ });
253
+ it("resolve_forecast — ambiguous outcome excluded from scoring", async () => {
254
+ const create = await callTool("create_forecast", {
255
+ question: "Ambiguous resolution test?",
256
+ resolutionDate: "2026-12-31",
257
+ resolutionCriteria: "Test",
258
+ probability: 0.7,
259
+ });
260
+ const resolve = await callTool("resolve_forecast", {
261
+ forecastId: create.forecastId,
262
+ outcome: "ambiguous",
263
+ resolutionNotes: "Resolution criteria were unclear",
264
+ });
265
+ expect(resolve.brierScore).toBeNull();
266
+ expect(resolve.logScore).toBeNull();
267
+ });
268
+ it("get_forecast_chain — returns error for nonexistent forecast", async () => {
269
+ const result = await callTool("get_forecast_chain", {
270
+ forecastId: "nonexistent_id",
271
+ });
272
+ expect(result.error).toContain("not found");
273
+ });
274
+ it("get_active_forecasts — filters by tags", async () => {
275
+ const result = await callTool("get_active_forecasts", {
276
+ tags: ["test_calibration"],
277
+ });
278
+ // All calibration forecasts are resolved, so none should be active
279
+ const forecasts = result.forecasts;
280
+ const calibration = forecasts.filter((f) => f.tags.includes("test_calibration"));
281
+ expect(calibration.length).toBe(0);
282
+ });
283
+ });
284
+ //# sourceMappingURL=forecastingDogfood.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forecastingDogfood.test.js","sourceRoot":"","sources":["../../src/__tests__/forecastingDogfood.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Forecasting Scoring Engine — Unit Tests
3
+ *
4
+ * Tests for brierScore, logScore, calibrationBins, isotonicCalibrate,
5
+ * averageBrier, averageLogScore, formatForecastDiff.
6
+ *
7
+ * All functions are pure — no Convex, no SQLite, no network.
8
+ */
9
+ export {};