@bilig/workpaper 0.157.0 → 0.160.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/AGENTS.md CHANGED
@@ -15,18 +15,23 @@ Use this file when an AI coding agent, MCP client, or tool host needs workbook f
15
15
  `npx --yes skills@latest add proompteng/bilig --skill bilig-workpaper --list`.
16
16
  8. If you are using GitHub Copilot or VS Code agent mode in a cloned checkout,
17
17
  use `.github/copilot-instructions.md`,
18
+ `.github/instructions/bilig-workpaper.instructions.md`,
18
19
  `.github/prompts/bilig-workpaper-proof.prompt.md`, and
19
20
  `.vscode/mcp.json`.
20
- 9. If you are inside a cloned Bilig repository with Claude Code, use the
21
- project skill at `.claude/skills/bilig-workpaper/SKILL.md` or invoke the
22
- explicit formula-proof command from
21
+ 9. If you are inside a cloned Bilig repository with Claude Code, read
22
+ `CLAUDE.md` first, then use the project skill at
23
+ `.claude/skills/bilig-workpaper/SKILL.md` or invoke the explicit
24
+ formula-proof command from
23
25
  `.claude/commands/bilig-workpaper-proof.md`.
24
- 10. If you are using Cursor, Windsurf/Cascade, Cline, or Continue, use
26
+ 10. If you are using OpenCode, use `opencode.jsonc` and
27
+ `.opencode/agents/bilig-workpaper.md`.
28
+ 11. If you are using Cursor, Windsurf/Cascade, Cline, or Continue, use
25
29
  `.cursor/rules/bilig-workpaper.mdc` or
30
+ `.devin/rules/bilig-workpaper.md`,
26
31
  `.windsurf/rules/bilig-workpaper.md`,
27
32
  `.clinerules/bilig-workpaper.md`, or
28
33
  `.continue/rules/bilig-workpaper.md`.
29
- 11. Start the MCP server or import `@bilig/workpaper` directly.
34
+ 12. Start the MCP server or import `@bilig/workpaper` directly.
30
35
 
31
36
  Remote MCP clients that support Streamable HTTP can smoke-test the stateless
32
37
  demo endpoint at `https://bilig.proompteng.ai/mcp`. Directory scanners that inspect the
@@ -61,10 +66,12 @@ npm exec --yes --package @bilig/workpaper@latest -- bilig-agent-start --json
61
66
  npm exec --yes --package @bilig/workpaper@latest -- bilig-evaluate --door workpaper-service --json
62
67
  npm exec --yes --package @bilig/workpaper@latest -- bilig-evaluate --door agent-mcp --json
63
68
  npm exec --yes --package @bilig/workpaper@latest -- bilig-evaluate --door agent-mcp --scenario provider-backed --json
69
+ npm exec --yes --package @bilig/xlsx-formula-recalc@latest -- bilig-evaluate --door workbook-compatibility --json
64
70
  npm exec --yes --package @bilig/xlsx-formula-recalc@latest -- bilig-evaluate --door xlsx-cache --json
65
71
  npm exec --package @bilig/workpaper@latest -- bilig-agent-challenge --json
66
72
  npm exec --package @bilig/workpaper@latest -- bilig-mcp-challenge --json
67
73
  npm exec --package @bilig/workpaper@latest -- bilig-workpaper-mcp --workpaper ./pricing.workpaper.json --init-demo-workpaper --writable
74
+ npm exec --package @bilig/workpaper@latest -- bilig-workpaper-mcp --from-xlsx ./pricing.xlsx --workpaper ./.bilig/pricing.workpaper.json --writable
68
75
  npm exec --package @bilig/workpaper@latest -- bilig-formula-clinic ./reduced.xlsx --cells "Summary!B7,Inputs!B2"
69
76
  ```
70
77
 
package/README.md CHANGED
@@ -120,6 +120,7 @@ not the first-run path:
120
120
  | FastMCP Python client for hosted and local stdio checks | <https://proompteng.github.io/bilig/fastmcp-workpaper-client.html> |
121
121
  | Agno MCPTools workbook readback | <https://proompteng.github.io/bilig/agno-workpaper-mcp.html> |
122
122
  | Pydantic AI MCPToolset typed readback | <https://proompteng.github.io/bilig/pydantic-ai-workpaper-mcp.html> |
123
+ | Google ADK McpToolset workbook readback | <https://proompteng.github.io/bilig/google-adk-workpaper-mcp.html> |
123
124
  | Hugging Face smolagents tool | <https://proompteng.github.io/bilig/smolagents-workpaper-tool.html> |
124
125
  | Hugging Face Gradio MCP Space | <https://proompteng.github.io/bilig/huggingface-workpaper-space.html> |
125
126
 
@@ -250,6 +251,9 @@ The challenge commands edit one input, recalculate dependent formulas, export
250
251
  WorkPaper JSON, restore it, and print a `verified: true` proof object.
251
252
  Use `--from-xlsx` when the agent already has an XLSX file: Bilig imports it once
252
253
  into persisted WorkPaper JSON, then starts the same file-backed MCP server.
254
+ That XLSX-backed MCP path also lists `analyze_workbook_risk`, a read-only tool
255
+ fixed to the source workbook passed at startup. It reports workbook risk
256
+ indicators before an agent trusts the imported WorkPaper and does not certify Excel compatibility.
253
257
 
254
258
  ## Agent Adoption Kit
255
259
 
package/SKILL.md CHANGED
@@ -111,6 +111,12 @@ treat its returned `tools` array as the source of truth for the currently publis
111
111
  - `export_workpaper_document`
112
112
  - `validate_formula`
113
113
 
114
+ When the server is started through `@bilig/workpaper@latest` with
115
+ `--from-xlsx ./pricing.xlsx --workpaper ./.bilig/pricing.workpaper.json`,
116
+ `tools/list` also includes `analyze_workbook_risk`. That tool is fixed to
117
+ the source XLSX passed at startup and reports workbook risk indicators before an
118
+ agent trusts the imported WorkPaper. It does not certify Excel compatibility.
119
+
114
120
  After a write, always read the dependent output cell and export the WorkPaper
115
121
  document. If the listed tool set includes `set_cell_contents_and_readback`,
116
122
  prefer it for stateless clients because the edit and dependent readback happen
@@ -203,6 +209,8 @@ If any readback step fails, report the blocker instead of claiming the workbook
203
209
  - Agent handbook: https://proompteng.github.io/bilig/headless-workpaper-agent-handbook.html
204
210
  - Agent workbook challenge: https://proompteng.github.io/bilig/agent-workbook-challenge.html
205
211
  - MCP server guide: https://proompteng.github.io/bilig/mcp-workpaper-tool-server.html
212
+ - OpenHands MCP setup: https://proompteng.github.io/bilig/openhands-workpaper-mcp.html
213
+ - OpenCode MCP setup: https://proompteng.github.io/bilig/opencode-workpaper-mcp.html
206
214
  - Open WebUI tool setup: https://proompteng.github.io/bilig/open-webui-workpaper-mcp.html
207
215
  - LobeHub MCP setup: https://proompteng.github.io/bilig/lobehub-workpaper-mcp.html
208
216
  - AnythingLLM MCP setup: https://proompteng.github.io/bilig/anythingllm-workpaper-mcp.html
@@ -223,5 +231,6 @@ If any readback step fails, report the blocker instead of claiming the workbook
223
231
  - Kestra Node flow: https://proompteng.github.io/bilig/kestra-workpaper-flow.html
224
232
  - Prefect flow: https://proompteng.github.io/bilig/prefect-workpaper-flow.html
225
233
  - XLSX formula clinic: https://proompteng.github.io/bilig/formula-bug-clinic.html
234
+ - Stale XLSX fixture command: npm exec --package @bilig/xlsx-formula-recalc@latest -- xlsx-cache-doctor ./reduced.xlsx --json
226
235
  - Compatibility limits: https://proompteng.github.io/bilig/where-bilig-is-not-excel-compatible-yet.html
227
236
  - Repository: https://github.com/proompteng/bilig
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { buildDemoWorkPaper, createFileBackedWorkPaperMcpToolServer, createFileBackedWorkPaperMcpToolServerFromFile, parseWorkPaperMcpStdioCliArgs, runDemoWorkPaperMcpStdioServer, workPaperMcpStdioHelpText, } from '@bilig/headless/mcp';
2
+ import { buildDemoWorkPaper, createFileBackedWorkPaperMcpToolServer, createFileBackedWorkPaperMcpToolServerFromFile, createFileBackedWorkPaperMcpToolServerFromXlsxFile, parseWorkPaperMcpStdioCliArgs, runDemoWorkPaperMcpStdioServer, withXlsxWorkbookRiskTool, workPaperMcpStdioHelpText, } from 'bilig-workpaper/mcp';
3
3
  const cliOptions = parseWorkPaperMcpStdioCliArgs(process.argv.slice(2));
4
4
  if (cliOptions.help) {
5
5
  process.stdout.write(workPaperMcpStdioHelpText());
@@ -17,6 +17,16 @@ if (cliOptions.demoWorkPaperTools) {
17
17
  else if (cliOptions.workpaperPath === undefined) {
18
18
  runDemoWorkPaperMcpStdioServer();
19
19
  }
20
+ else if (cliOptions.fromXlsxPath !== undefined) {
21
+ runDemoWorkPaperMcpStdioServer({
22
+ server: withXlsxWorkbookRiskTool(createFileBackedWorkPaperMcpToolServerFromXlsxFile({
23
+ fromXlsxPath: cliOptions.fromXlsxPath,
24
+ overwriteWorkPaper: cliOptions.overwriteWorkPaper,
25
+ workpaperPath: cliOptions.workpaperPath,
26
+ writable: cliOptions.writable,
27
+ }), { xlsxPath: cliOptions.fromXlsxPath }),
28
+ });
29
+ }
20
30
  else {
21
31
  runDemoWorkPaperMcpStdioServer({
22
32
  server: createFileBackedWorkPaperMcpToolServerFromFile({
@@ -1 +1 @@
1
- {"version":3,"file":"work-paper-mcp-stdio-bin.js","sourceRoot":"","sources":["../src/work-paper-mcp-stdio-bin.ts"],"names":[],"mappings":";AACA,OAAO,EACL,kBAAkB,EAClB,sCAAsC,EACtC,8CAA8C,EAC9C,6BAA6B,EAC7B,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAA;AAE5B,MAAM,UAAU,GAAG,6BAA6B,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvE,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;IACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAA;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;IAClC,8BAA8B,CAAC;QAC7B,MAAM,EAAE,sCAAsC,CAAC;YAC7C,QAAQ,EAAE,kBAAkB,EAAE;YAC9B,UAAU,EAAE,wBAAwB;YACpC,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC,CAAA;AACJ,CAAC;KAAM,IAAI,UAAU,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;IAClD,8BAA8B,EAAE,CAAA;AAClC,CAAC;KAAM,CAAC;IACN,8BAA8B,CAAC;QAC7B,MAAM,EAAE,8CAA8C,CAAC;YACrD,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;YAC/C,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC;KACH,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"work-paper-mcp-stdio-bin.js","sourceRoot":"","sources":["../src/work-paper-mcp-stdio-bin.ts"],"names":[],"mappings":";AACA,OAAO,EACL,kBAAkB,EAClB,sCAAsC,EACtC,8CAA8C,EAC9C,kDAAkD,EAClD,6BAA6B,EAC7B,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAA;AAE5B,MAAM,UAAU,GAAG,6BAA6B,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvE,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;IACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAA;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;IAClC,8BAA8B,CAAC;QAC7B,MAAM,EAAE,sCAAsC,CAAC;YAC7C,QAAQ,EAAE,kBAAkB,EAAE;YAC9B,UAAU,EAAE,wBAAwB;YACpC,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC,CAAA;AACJ,CAAC;KAAM,IAAI,UAAU,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;IAClD,8BAA8B,EAAE,CAAA;AAClC,CAAC;KAAM,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;IACjD,8BAA8B,CAAC;QAC7B,MAAM,EAAE,wBAAwB,CAC9B,kDAAkD,CAAC;YACjD,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;YACjD,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC,EACF,EAAE,QAAQ,EAAE,UAAU,CAAC,YAAY,EAAE,CACtC;KACF,CAAC,CAAA;AACJ,CAAC;KAAM,CAAC;IACN,8BAA8B,CAAC;QAC7B,MAAM,EAAE,8CAA8C,CAAC;YACrD,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;YAC/C,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC;KACH,CAAC,CAAA;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bilig/workpaper",
3
- "version": "0.157.0",
3
+ "version": "0.160.0",
4
4
  "description": "WorkPaper API, CLI evaluator, and MCP server for headless spreadsheet formulas in Node.js services and agents.",
5
5
  "keywords": [
6
6
  "agent-tools",
@@ -28,7 +28,7 @@
28
28
  "workpaper",
29
29
  "xlsx"
30
30
  ],
31
- "homepage": "https://proompteng.github.io/bilig/",
31
+ "homepage": "https://proompteng.github.io/bilig/agent-framework-workbook-tools.html",
32
32
  "bugs": {
33
33
  "url": "https://github.com/proompteng/bilig/issues"
34
34
  },
@@ -89,12 +89,12 @@
89
89
  "build": "pnpm --dir ../.. --filter bilig-workpaper build && rm -rf dist tsconfig.tsbuildinfo && tsc -p tsconfig.json"
90
90
  },
91
91
  "dependencies": {
92
- "@bilig/headless": "0.157.0",
93
- "@bilig/xlsx-formula-recalc": "0.157.0",
94
- "bilig-workpaper": "0.157.0"
92
+ "@bilig/headless": "0.160.0",
93
+ "@bilig/xlsx-formula-recalc": "0.160.0",
94
+ "bilig-workpaper": "0.160.0"
95
95
  },
96
96
  "devDependencies": {
97
- "ai": "6.0.182",
97
+ "ai": "6.0.195",
98
98
  "zod": "4.3.6"
99
99
  },
100
100
  "peerDependencies": {
package/server.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.proompteng/bilig-workpaper",
4
4
  "title": "Bilig WorkPaper",
5
- "description": "WorkPaper MCP tools, resources, and prompts for readback, edits, and JSON persistence.",
6
- "version": "0.157.0",
5
+ "description": "Formula readback, input edits, JSON persistence, and workbook risk preflight for agents.",
6
+ "version": "0.160.0",
7
7
  "repository": {
8
8
  "url": "https://github.com/proompteng/bilig",
9
9
  "source": "github"
@@ -18,7 +18,7 @@
18
18
  {
19
19
  "registryType": "npm",
20
20
  "identifier": "@bilig/workpaper",
21
- "version": "0.157.0",
21
+ "version": "0.160.0",
22
22
  "transport": {
23
23
  "type": "stdio"
24
24
  }
@@ -1 +0,0 @@
1
- export {};
@@ -1,69 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { WorkPaper } from './index.js';
3
- import { createWorkPaperToolHandlers } from './ai-sdk.js';
4
- describe('@bilig/workpaper AI SDK handlers', () => {
5
- it('edits a WorkPaper input and returns computed restore proof', () => {
6
- const workpaper = WorkPaper.buildFromSheets({
7
- Inputs: [
8
- ['Metric', 'Value'],
9
- ['Qualified opportunities', 20],
10
- ['Win rate', 0.25],
11
- ['Average ARR', 12000],
12
- ],
13
- Summary: [
14
- ['Metric', 'Value'],
15
- ['Expected customers', '=Inputs!B2*Inputs!B3'],
16
- ['Expected ARR', '=B2*Inputs!B4'],
17
- ],
18
- });
19
- const handlers = createWorkPaperToolHandlers({
20
- workpaper,
21
- defaultReadRange: 'Summary!A1:B3',
22
- proofRange: 'Summary!A1:B3',
23
- writableSheets: ['Inputs'],
24
- });
25
- const before = handlers.readWorkPaperSummary();
26
- const write = handlers.setWorkPaperInputCell({
27
- sheetName: 'Inputs',
28
- address: 'B3',
29
- value: 0.4,
30
- });
31
- expect(readNumber(before.values, 2, 1)).toBe(60000);
32
- expect(write.editedCell).toBe('Inputs!B3');
33
- expect(readNumber(write.after.values, 2, 1)).toBe(96000);
34
- expect(readNumber(write.restored.values, 2, 1)).toBe(96000);
35
- expect(write.checks).toMatchObject({
36
- previousValue: 0.25,
37
- newValue: 0.4,
38
- formulasPersisted: true,
39
- restoredMatchesAfter: true,
40
- proofRangeChanged: true,
41
- });
42
- expect(write.checks.serializedBytes).toBeGreaterThan(100);
43
- });
44
- it('blocks writes outside the configured input sheet boundary', () => {
45
- const workpaper = WorkPaper.buildFromSheets({
46
- Inputs: [['Metric', 'Value']],
47
- Summary: [['Metric', '=1+1']],
48
- });
49
- const handlers = createWorkPaperToolHandlers({
50
- workpaper,
51
- defaultReadRange: 'Summary!A1:B1',
52
- proofRange: 'Summary!A1:B1',
53
- writableSheets: ['Inputs'],
54
- });
55
- expect(() => handlers.setWorkPaperInputCell({
56
- sheetName: 'Summary',
57
- address: 'B1',
58
- value: 3,
59
- })).toThrow('Sheet "Summary" is not writable');
60
- });
61
- });
62
- function readNumber(values, row, col) {
63
- const cell = values[row]?.[col];
64
- if (!cell || typeof cell !== 'object' || !('value' in cell) || typeof cell.value !== 'number') {
65
- throw new Error(`Expected numeric cell at row ${row}, col ${col}; received ${JSON.stringify(cell)}`);
66
- }
67
- return Math.round(cell.value * 100) / 100;
68
- }
69
- //# sourceMappingURL=ai-sdk.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-sdk.test.js","sourceRoot":"","sources":["../src/ai-sdk.test.ts"],"names":[],"mappings":"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"}