maybeai-sheet-cli 0.3.2__tar.gz → 0.4.0__tar.gz

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 (53) hide show
  1. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/PKG-INFO +62 -6
  2. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/README.md +61 -5
  3. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/docs/agent-friendly-command-tree.md +153 -5
  4. maybeai_sheet_cli-0.4.0/docs/operation-plan-cli-no-dsl-plan.md +477 -0
  5. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/docs/superpowers/plans/2026-07-01-mbs-agent-friendly-phase-2-routes.md +20 -13
  6. maybeai_sheet_cli-0.4.0/docs/superpowers/reports/2026-07-01-phase2-test-review.html +309 -0
  7. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/pyproject.toml +1 -1
  8. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/__init__.py +1 -1
  9. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/cli.py +10 -0
  10. maybeai_sheet_cli-0.4.0/src/maybeai_sheet/commands/_phase2.py +140 -0
  11. maybeai_sheet_cli-0.4.0/src/maybeai_sheet/commands/column.py +221 -0
  12. maybeai_sheet_cli-0.4.0/src/maybeai_sheet/commands/file.py +135 -0
  13. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/commands/formula.py +99 -0
  14. maybeai_sheet_cli-0.4.0/src/maybeai_sheet/commands/history.py +104 -0
  15. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/commands/range.py +55 -0
  16. maybeai_sheet_cli-0.4.0/src/maybeai_sheet/commands/row.py +170 -0
  17. maybeai_sheet_cli-0.4.0/src/maybeai_sheet/commands/style.py +255 -0
  18. maybeai_sheet_cli-0.4.0/src/maybeai_sheet/commands/worksheet.py +255 -0
  19. maybeai_sheet_cli-0.4.0/src/maybeai_sheet/endpoints.py +127 -0
  20. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/formatters.py +6 -0
  21. maybeai_sheet_cli-0.4.0/tests/test_endpoints.py +105 -0
  22. maybeai_sheet_cli-0.4.0/tests/test_phase2_cli.py +620 -0
  23. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/tests/test_update.py +2 -1
  24. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/uv.lock +1 -1
  25. maybeai_sheet_cli-0.3.2/src/maybeai_sheet/commands/worksheet.py +0 -65
  26. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/.claude/settings.local.json +0 -0
  27. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/.gitignore +0 -0
  28. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/CLAUDE.md +0 -0
  29. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/cli-packaging-plan.md +0 -0
  30. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/cli-plan.md +0 -0
  31. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/docs/superpowers/plans/2026-07-01-mbs-agent-friendly-command-tree.md +0 -0
  32. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/docs/superpowers/plans/2026-07-01-mbs-agent-friendly-phase-2.md +0 -0
  33. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/docs/superpowers/reports/2026-07-01-phase1-test-review.html +0 -0
  34. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/docs/verification-matrix-fallback.md +0 -0
  35. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/client.py +0 -0
  36. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/commands/__init__.py +0 -0
  37. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/commands/raw.py +0 -0
  38. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/commands/share.py +0 -0
  39. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/commands/sheet.py +0 -0
  40. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/commands/table.py +0 -0
  41. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/commands/workbook.py +0 -0
  42. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/config.py +0 -0
  43. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/errors.py +0 -0
  44. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/models/__init__.py +0 -0
  45. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/models/share.py +0 -0
  46. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/models/sheet.py +0 -0
  47. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/models/workbook.py +0 -0
  48. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/options.py +0 -0
  49. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/resolver.py +0 -0
  50. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/src/maybeai_sheet/update.py +0 -0
  51. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/tests/test_cli.py +0 -0
  52. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/tests/test_formatters.py +0 -0
  53. {maybeai_sheet_cli-0.3.2 → maybeai_sheet_cli-0.4.0}/tests/test_resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maybeai-sheet-cli
3
- Version: 0.3.2
3
+ Version: 0.4.0
4
4
  Summary: CLI for common MaybeAI spreadsheet operations
5
5
  Project-URL: Homepage, https://github.com/OmniMCP-AI/maybeai-sheet-cli
6
6
  Project-URL: Repository, https://github.com/OmniMCP-AI/maybeai-sheet-cli
@@ -138,11 +138,29 @@ Make a workbook public for viewers:
138
138
  mbs share visibility --doc-id abc123 --visibility public --public-permission viewer
139
139
  ```
140
140
 
141
+ Rename a worksheet and inspect a destructive row delete before sending it:
142
+
143
+ ```bash
144
+ mbs worksheet rename --doc-id abc123 --worksheet-name Old --new-name New
145
+ mbs row delete --doc-id abc123 --worksheet-name Sheet1 --row 10 --dry-run
146
+ mbs row delete --doc-id abc123 --worksheet-name Sheet1 --row 10 --yes
147
+ ```
148
+
149
+ Search, style, inspect history, and export:
150
+
151
+ ```bash
152
+ mbs range search --doc-id abc123 --worksheet-name Sheet1 --query revenue --max-results 20
153
+ mbs style freeze-panes --doc-id abc123 --worksheet-name Sheet1 --cell B2
154
+ mbs formula calculate --doc-id abc123 --worksheet-name Sheet1 --cell E2 --formula "=SUM(B2:D2)"
155
+ mbs history list --doc-id abc123 --limit 10
156
+ mbs file export --doc-id abc123 --out workbook.xlsx
157
+ ```
158
+
141
159
  ## Commands
142
160
 
143
161
  The preferred command groups are `workbook`, `worksheet`, `range`, `table`,
144
- `formula`, `share`, and `raw`. The older `sheet ...` commands remain available
145
- as compatibility aliases.
162
+ `row`, `column`, `formula`, `style`, `history`, `file`, `share`, and `raw`.
163
+ The older `sheet ...` commands remain available as compatibility aliases.
146
164
 
147
165
  ```text
148
166
  mbs
@@ -158,23 +176,57 @@ mbs
158
176
 
159
177
  ├── worksheet
160
178
  │ ├── list List worksheets in a workbook.
161
- └── create Create a worksheet, optionally with starter values.
179
+ ├── create Create a worksheet, optionally with starter values.
180
+ │ ├── rename Rename a worksheet.
181
+ │ ├── delete Delete a worksheet; requires --yes unless --dry-run.
182
+ │ ├── copy Copy a worksheet.
183
+ │ └── move Move a worksheet to a zero-based index.
162
184
 
163
185
  ├── range
164
186
  │ ├── read Read a bounded A1 range.
165
187
  │ ├── write Write a JSON matrix into an A1 range.
166
- └── clear Clear an A1 range.
188
+ ├── clear Clear an A1 range.
189
+ │ └── search Search a worksheet with bounded results.
167
190
 
168
191
  ├── table
169
192
  │ ├── headers Read header row metadata.
170
193
  │ ├── append-rows Append JSON row objects.
171
194
  │ └── upsert-rows Upsert JSON row objects by key.
172
195
 
196
+ ├── row
197
+ │ ├── insert Insert rows.
198
+ │ ├── delete Delete rows; requires --yes unless --dry-run.
199
+ │ └── move Move rows.
200
+
201
+ ├── column
202
+ │ ├── insert Insert columns.
203
+ │ ├── delete Delete columns; requires --yes unless --dry-run.
204
+ │ ├── move Move columns.
205
+ │ └── width Set column width.
206
+
173
207
  ├── formula
174
208
  │ ├── read Read formulas with FORMULA render mode.
175
209
  │ ├── set Set one formula cell.
176
210
  │ ├── batch-set Set formula ranges from a JSON operations file.
177
- └── recalculate Recalculate formulas for a worksheet/workbook.
211
+ ├── recalculate Recalculate formulas for a worksheet/workbook.
212
+ │ ├── calculate Calculate one formula cell.
213
+ │ └── lineage Trace formula lineage for one cell.
214
+
215
+ ├── style
216
+ │ ├── freeze-panes Freeze rows/columns using an A1 cell boundary.
217
+ │ ├── auto-filter set Set worksheet auto-filter range.
218
+ │ ├── auto-filter remove Remove worksheet auto-filter.
219
+ │ ├── columns-width Set column widths.
220
+ │ └── rows-height Set row heights.
221
+
222
+ ├── history
223
+ │ ├── list List workbook versions with bounded output.
224
+ │ └── read Read a workbook version.
225
+
226
+ ├── file
227
+ │ ├── export Export workbook bytes to --out.
228
+ │ ├── list List files with bounded output.
229
+ │ └── search Search files with bounded output.
178
230
 
179
231
  ├── share
180
232
  │ ├── visibility Set workbook visibility.
@@ -210,7 +262,11 @@ Relationship guide:
210
262
  - Use `worksheet` for tab lifecycle operations.
211
263
  - Use `range` for coordinate-based reads and writes.
212
264
  - Use `table` when data is row-object shaped and keyed by headers.
265
+ - Use `row` and `column` for structural row/column changes.
213
266
  - Use `formula` when preserving or changing formulas matters.
267
+ - Use `style` for layout operations like freeze panes, filter ranges, widths, and heights.
268
+ - Use `history` for read-only version inspection.
269
+ - Use `file` for export/list/search file operations.
214
270
  - Use `share` for visibility and collaborator access.
215
271
  - Use `raw post` only when a first-class command does not exist yet.
216
272
 
@@ -114,11 +114,29 @@ Make a workbook public for viewers:
114
114
  mbs share visibility --doc-id abc123 --visibility public --public-permission viewer
115
115
  ```
116
116
 
117
+ Rename a worksheet and inspect a destructive row delete before sending it:
118
+
119
+ ```bash
120
+ mbs worksheet rename --doc-id abc123 --worksheet-name Old --new-name New
121
+ mbs row delete --doc-id abc123 --worksheet-name Sheet1 --row 10 --dry-run
122
+ mbs row delete --doc-id abc123 --worksheet-name Sheet1 --row 10 --yes
123
+ ```
124
+
125
+ Search, style, inspect history, and export:
126
+
127
+ ```bash
128
+ mbs range search --doc-id abc123 --worksheet-name Sheet1 --query revenue --max-results 20
129
+ mbs style freeze-panes --doc-id abc123 --worksheet-name Sheet1 --cell B2
130
+ mbs formula calculate --doc-id abc123 --worksheet-name Sheet1 --cell E2 --formula "=SUM(B2:D2)"
131
+ mbs history list --doc-id abc123 --limit 10
132
+ mbs file export --doc-id abc123 --out workbook.xlsx
133
+ ```
134
+
117
135
  ## Commands
118
136
 
119
137
  The preferred command groups are `workbook`, `worksheet`, `range`, `table`,
120
- `formula`, `share`, and `raw`. The older `sheet ...` commands remain available
121
- as compatibility aliases.
138
+ `row`, `column`, `formula`, `style`, `history`, `file`, `share`, and `raw`.
139
+ The older `sheet ...` commands remain available as compatibility aliases.
122
140
 
123
141
  ```text
124
142
  mbs
@@ -134,23 +152,57 @@ mbs
134
152
 
135
153
  ├── worksheet
136
154
  │ ├── list List worksheets in a workbook.
137
- └── create Create a worksheet, optionally with starter values.
155
+ ├── create Create a worksheet, optionally with starter values.
156
+ │ ├── rename Rename a worksheet.
157
+ │ ├── delete Delete a worksheet; requires --yes unless --dry-run.
158
+ │ ├── copy Copy a worksheet.
159
+ │ └── move Move a worksheet to a zero-based index.
138
160
 
139
161
  ├── range
140
162
  │ ├── read Read a bounded A1 range.
141
163
  │ ├── write Write a JSON matrix into an A1 range.
142
- └── clear Clear an A1 range.
164
+ ├── clear Clear an A1 range.
165
+ │ └── search Search a worksheet with bounded results.
143
166
 
144
167
  ├── table
145
168
  │ ├── headers Read header row metadata.
146
169
  │ ├── append-rows Append JSON row objects.
147
170
  │ └── upsert-rows Upsert JSON row objects by key.
148
171
 
172
+ ├── row
173
+ │ ├── insert Insert rows.
174
+ │ ├── delete Delete rows; requires --yes unless --dry-run.
175
+ │ └── move Move rows.
176
+
177
+ ├── column
178
+ │ ├── insert Insert columns.
179
+ │ ├── delete Delete columns; requires --yes unless --dry-run.
180
+ │ ├── move Move columns.
181
+ │ └── width Set column width.
182
+
149
183
  ├── formula
150
184
  │ ├── read Read formulas with FORMULA render mode.
151
185
  │ ├── set Set one formula cell.
152
186
  │ ├── batch-set Set formula ranges from a JSON operations file.
153
- └── recalculate Recalculate formulas for a worksheet/workbook.
187
+ ├── recalculate Recalculate formulas for a worksheet/workbook.
188
+ │ ├── calculate Calculate one formula cell.
189
+ │ └── lineage Trace formula lineage for one cell.
190
+
191
+ ├── style
192
+ │ ├── freeze-panes Freeze rows/columns using an A1 cell boundary.
193
+ │ ├── auto-filter set Set worksheet auto-filter range.
194
+ │ ├── auto-filter remove Remove worksheet auto-filter.
195
+ │ ├── columns-width Set column widths.
196
+ │ └── rows-height Set row heights.
197
+
198
+ ├── history
199
+ │ ├── list List workbook versions with bounded output.
200
+ │ └── read Read a workbook version.
201
+
202
+ ├── file
203
+ │ ├── export Export workbook bytes to --out.
204
+ │ ├── list List files with bounded output.
205
+ │ └── search Search files with bounded output.
154
206
 
155
207
  ├── share
156
208
  │ ├── visibility Set workbook visibility.
@@ -186,7 +238,11 @@ Relationship guide:
186
238
  - Use `worksheet` for tab lifecycle operations.
187
239
  - Use `range` for coordinate-based reads and writes.
188
240
  - Use `table` when data is row-object shaped and keyed by headers.
241
+ - Use `row` and `column` for structural row/column changes.
189
242
  - Use `formula` when preserving or changing formulas matters.
243
+ - Use `style` for layout operations like freeze panes, filter ranges, widths, and heights.
244
+ - Use `history` for read-only version inspection.
245
+ - Use `file` for export/list/search file operations.
190
246
  - Use `share` for visibility and collaborator access.
191
247
  - Use `raw post` only when a first-class command does not exist yet.
192
248
 
@@ -10,6 +10,10 @@ give agents a predictable object model:
10
10
  workbook -> worksheet -> range/table/formula/style/chart/image/history
11
11
  ```
12
12
 
13
+ For source-oriented inspection, use a separate `source` surface. A source can be
14
+ an Excel worksheet range, a multidimensional worksheet view, or a native table;
15
+ that is broader than `table headers`.
16
+
13
17
  The CLI should call the routed MaybeAI Sheet API through `fastestai-playground`
14
18
  by default, not engine servers directly. `excelize-mcp` and `SheetTable` remain
15
19
  execution engines behind the routing layer.
@@ -78,6 +82,12 @@ Why these first:
78
82
  - They support a manifest-first workflow, which reduces wrong-sheet and wrong-gid
79
83
  mistakes.
80
84
 
85
+ Recommended next API after the manifest/read/write path is stable:
86
+
87
+ ```text
88
+ mbs source schema -> POST /api/v1/excel/source_schema
89
+ ```
90
+
81
91
  ## Typical Command Examples
82
92
 
83
93
  These are representative examples only. The CLI does not need a bespoke example
@@ -91,6 +101,19 @@ mbs workbook manifest --doc-id "$DOC_ID"
91
101
  mbs worksheet list --doc-id "$DOC_ID"
92
102
  ```
93
103
 
104
+ Inspect a source schema before reading or transforming it:
105
+
106
+ ```bash
107
+ mbs source schema \
108
+ --doc-id "$DOC_ID" \
109
+ --mode excel_worksheet \
110
+ --worksheet-name "Actuals" \
111
+ --range "A1:Z5000" \
112
+ --header-row 1 \
113
+ --sample-rows 50 \
114
+ --infer-types
115
+ ```
116
+
94
117
  Create workbook or worksheet:
95
118
 
96
119
  ```bash
@@ -177,6 +200,12 @@ mbs formula recalculate \
177
200
  --doc-id "$DOC_ID" \
178
201
  --worksheet-name "Model"
179
202
 
203
+ mbs formula calculate \
204
+ --doc-id "$DOC_ID" \
205
+ --worksheet-name "Model" \
206
+ --cell "E2" \
207
+ --formula "=SUM(B2:D2)"
208
+
180
209
  mbs formula lineage \
181
210
  --doc-id "$DOC_ID" \
182
211
  --worksheet-name "Model" \
@@ -222,15 +251,15 @@ mbs worksheet copy \
222
251
  mbs row insert \
223
252
  --doc-id "$DOC_ID" \
224
253
  --worksheet-name "Sheet1" \
225
- --start 5 \
254
+ --row 5 \
226
255
  --count 3 \
227
256
  --dry-run
228
257
 
229
258
  mbs column width \
230
259
  --doc-id "$DOC_ID" \
231
260
  --worksheet-name "Sheet1" \
232
- --start "A" \
233
- --end "D" \
261
+ --start-column "A" \
262
+ --end-column "D" \
234
263
  --width 18
235
264
 
236
265
  # Search and worksheet bounds
@@ -387,6 +416,7 @@ power-pivot
387
416
  ```text
388
417
  mbs
389
418
  ├── workbook
419
+ ├── source
390
420
  ├── worksheet
391
421
  ├── range
392
422
  ├── table
@@ -436,11 +466,126 @@ workbook import
436
466
  Notes:
437
467
 
438
468
  - `manifest` should be the default first step for agents.
469
+ - Current CLI route: `POST /api/v1/excel/workbook_profile`.
470
+ - Request shape should include the resolved workbook identity:
471
+
472
+ ```json
473
+ {
474
+ "document_id": "wb_rev",
475
+ "uri": "https://www.maybe.ai/docs/spreadsheets/d/wb_rev"
476
+ }
477
+ ```
478
+
479
+ - `manifest` is for workbook-level structure: worksheets, gids, dimensions,
480
+ engine/profile metadata, and routeability hints.
439
481
  - `capabilities` should eventually return routeable capabilities by engine:
440
482
  read/write/style/sql/formula/export.
441
483
  - Current local CLI maps both `manifest` and `capabilities` to
442
484
  `/api/v1/excel/workbook_profile`; this should be normalized later.
443
485
 
486
+ ## Source Commands
487
+
488
+ Source commands inspect a data source before an agent reads, maps, joins, or
489
+ transforms it. The source may be an Excel worksheet range, a multidimensional
490
+ worksheet, or a native table.
491
+
492
+ ```text
493
+ mbs source schema PLAN
494
+ mbs source sample PLAN
495
+ mbs source profile PLAN
496
+ ```
497
+
498
+ Suggested MVP:
499
+
500
+ ```text
501
+ source schema
502
+ ```
503
+
504
+ Recommended routed API:
505
+
506
+ ```text
507
+ POST /api/v1/excel/source_schema
508
+ ```
509
+
510
+ Recommended CLI:
511
+
512
+ ```bash
513
+ mbs source schema \
514
+ --doc-id "$DOC_ID" \
515
+ --mode excel_worksheet \
516
+ --worksheet-name "Actuals" \
517
+ --range "A1:Z5000" \
518
+ --header-row 1 \
519
+ --sample-rows 50 \
520
+ --infer-types
521
+ ```
522
+
523
+ Equivalent tool contract:
524
+
525
+ ```json
526
+ {
527
+ "workbook_id": "wb_rev",
528
+ "source": {
529
+ "mode": "excel_worksheet",
530
+ "worksheet": {
531
+ "name": "Actuals",
532
+ "range": "A1:Z5000",
533
+ "header_row": 1
534
+ }
535
+ },
536
+ "infer_types": true,
537
+ "sample_rows": 50
538
+ }
539
+ ```
540
+
541
+ Expected output:
542
+
543
+ ```json
544
+ {
545
+ "source_id": "src_actuals",
546
+ "grain_hint": "one row per transaction",
547
+ "columns": [
548
+ {
549
+ "name": "date",
550
+ "type": "date",
551
+ "nullable": false,
552
+ "examples": ["2026-05-01"]
553
+ },
554
+ {
555
+ "name": "amount",
556
+ "type": "currency",
557
+ "nullable": false,
558
+ "summary": {
559
+ "min": 0,
560
+ "max": 102320.5
561
+ }
562
+ }
563
+ ],
564
+ "warnings": [
565
+ {
566
+ "code": "merged_header_detected",
567
+ "message": "Rows 1-2 look like multi-row headers"
568
+ }
569
+ ]
570
+ }
571
+ ```
572
+
573
+ API fit:
574
+
575
+ - `workbook manifest` / `POST /api/v1/excel/workbook_profile` is the right API
576
+ for workbook manifest discovery.
577
+ - `table headers`, `range read`, and `workbook manifest` can approximate source
578
+ schema for simple Excel worksheets, but they do not represent native tables or
579
+ multidimensional worksheet semantics as one contract.
580
+ - Add `POST /api/v1/excel/source_schema` in play-be when the backend can infer
581
+ types, examples, nullability, warnings, and grain hints consistently.
582
+ - The CLI should expose this as `mbs source schema`, not `mbs workbook manifest`
583
+ and not `mbs table headers`, because the source abstraction crosses workbook,
584
+ worksheet, and native table boundaries.
585
+ - Until the routed endpoint exists, keep this command in `PLAN` status or build
586
+ an Excel-worksheet-only fallback that calls `workbook_profile`, `read_headers`,
587
+ and a bounded `read_sheet` sample.
588
+
444
589
  ## Worksheet Commands
445
590
 
446
591
  Worksheet commands manage sheet tabs and worksheet-level metadata.
@@ -625,7 +770,7 @@ mbs formula read NOW
625
770
  mbs formula set NOW
626
771
  mbs formula batch-set NOW
627
772
  mbs formula recalculate NOW
628
- mbs formula compile API
773
+ mbs formula compile PLAN
629
774
  mbs formula calculate API
630
775
  mbs formula fill API
631
776
  mbs formula lineage API
@@ -646,7 +791,6 @@ formula recalculate
646
791
  Suggested phase 2:
647
792
 
648
793
  ```text
649
- formula compile
650
794
  formula calculate
651
795
  formula lineage
652
796
  ```
@@ -664,6 +808,9 @@ Agent-friendly requirements:
664
808
  value after write.
665
809
  - `formula batch-set` should support a JSON operations file.
666
810
  - `formula recalculate` should allow workbook or worksheet scope.
811
+ - `formula calculate` maps to `POST /api/v1/excel/calc-formula`; live play-be
812
+ verification requires both `cellAddress` and `formula`, exposed as CLI
813
+ `--cell` and `--formula`.
667
814
  - `formula lineage` should be SheetTable-aware and return dependencies in a
668
815
  stable JSON shape.
669
816
  - `formula lineage` maps to confirmed routed Playground API
@@ -1128,6 +1275,7 @@ Implement only after confirming the command has a routed public API in
1128
1275
  `fastestai-playground`:
1129
1276
 
1130
1277
  ```text
1278
+ source schema, if POST /api/v1/excel/source_schema is added
1131
1279
  worksheet rename/delete/copy/move
1132
1280
  row insert/delete/move
1133
1281
  column insert/delete/move/width