maybeai-sheet-cli 0.5.0__tar.gz → 0.6.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 (89) hide show
  1. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/PKG-INFO +26 -5
  2. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/README.md +25 -4
  3. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/import_engine_local_report.html +74 -0
  4. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/llm_cost_import_auto.json +479 -0
  5. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/llm_cost_import_mixed_forced.json +0 -0
  6. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/llm_cost_list_worksheets.json +355 -0
  7. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/llm_cost_read_detail_A1_T5.json +549 -0
  8. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/summary.json +79 -0
  9. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/yunling_import_auto.json +602 -0
  10. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/yunling_list_worksheets.json +598 -0
  11. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-local-20260702-150800/yunling_read_T00_A1_F5.json +343 -0
  12. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-merged-20260702-153018/import_auto.json +587 -0
  13. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-merged-20260702-153018/list_worksheets.json +112 -0
  14. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-merged-20260702-153018/merged_two_tables_report.html +12 -0
  15. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-merged-20260702-153018/read_merged_1_A1_T5.json +373 -0
  16. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-merged-20260702-153018/read_merged_2_A1_T5.json +373 -0
  17. maybeai_sheet_cli-0.6.0/docs/superpowers/reports/import-engine-merged-20260702-153018/summary.json +145 -0
  18. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/pyproject.toml +1 -1
  19. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/__init__.py +1 -1
  20. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/db_table.py +156 -5
  21. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/workbook.py +56 -7
  22. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/endpoints.py +3 -0
  23. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/tests/test_cli.py +75 -0
  24. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/tests/test_endpoints.py +3 -0
  25. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/tests/test_two_engine_cli.py +109 -4
  26. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/uv.lock +1 -1
  27. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/.claude/settings.local.json +0 -0
  28. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/.gitignore +0 -0
  29. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/CLAUDE.md +0 -0
  30. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/cli-packaging-plan.md +0 -0
  31. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/cli-plan.md +0 -0
  32. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/agent-friendly-command-tree.md +0 -0
  33. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/operation-plan-cli-no-dsl-plan.md +0 -0
  34. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/plans/2026-07-01-mbs-agent-friendly-command-tree.md +0 -0
  35. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/plans/2026-07-01-mbs-agent-friendly-phase-2-routes.md +0 -0
  36. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/plans/2026-07-01-mbs-agent-friendly-phase-2.md +0 -0
  37. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/plans/2026-07-01-mbs-be-new-backend-contracts-plan.md +0 -0
  38. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/plans/2026-07-01-mbs-deferred-table-routing-plan.md +0 -0
  39. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/plans/2026-07-01-mbs-excel-worksheet-multi-table-plan.md +0 -0
  40. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/plans/2026-07-01-mbs-two-engine-command-refactor.md +0 -0
  41. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/2026-07-01-mbs-deferred-routing-e2e-report.html +0 -0
  42. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/2026-07-01-phase1-test-review.html +0 -0
  43. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/2026-07-01-phase2-test-review.html +0 -0
  44. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/20260701-130317-excel-table-empty-range-e2e.html +0 -0
  45. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/20260701-130447-excel-table-empty-range-e2e.html +0 -0
  46. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/20260701-130556-excel-table-empty-range-e2e.html +0 -0
  47. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/20260701-230803-local-cli-endpoint-verification.html +0 -0
  48. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/20260701-232511-local7011-cli-table-metadata-verification.html +0 -0
  49. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/e2e-artifacts/e2e-payloads-20260701-130317.json +0 -0
  50. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/e2e-artifacts/e2e-payloads-20260701-130447.json +0 -0
  51. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/e2e-artifacts/e2e-payloads-20260701-130556.json +0 -0
  52. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/e2e-artifacts/multi-table-empty-range-20260701-130317.xlsx +0 -0
  53. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/superpowers/reports/e2e-artifacts/openpyxl-multi-table-empty-range-20260701-130447.xlsx +0 -0
  54. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/docs/verification-matrix-fallback.md +0 -0
  55. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/cli.py +0 -0
  56. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/client.py +0 -0
  57. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/__init__.py +0 -0
  58. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/_phase2.py +0 -0
  59. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/cell.py +0 -0
  60. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/column.py +0 -0
  61. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/excel_table.py +0 -0
  62. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/excel_worksheet.py +0 -0
  63. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/file.py +0 -0
  64. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/formula.py +0 -0
  65. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/history.py +0 -0
  66. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/range.py +0 -0
  67. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/raw.py +0 -0
  68. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/row.py +0 -0
  69. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/share.py +0 -0
  70. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/sheet.py +0 -0
  71. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/style.py +0 -0
  72. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/table.py +0 -0
  73. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/commands/worksheet.py +0 -0
  74. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/config.py +0 -0
  75. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/errors.py +0 -0
  76. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/formatters.py +0 -0
  77. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/models/__init__.py +0 -0
  78. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/models/share.py +0 -0
  79. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/models/sheet.py +0 -0
  80. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/models/workbook.py +0 -0
  81. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/options.py +0 -0
  82. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/protocol.py +0 -0
  83. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/resolver.py +0 -0
  84. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/table_resolver.py +0 -0
  85. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/src/maybeai_sheet/update.py +0 -0
  86. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/tests/test_formatters.py +0 -0
  87. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/tests/test_phase2_cli.py +0 -0
  88. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/tests/test_resolver.py +0 -0
  89. {maybeai_sheet_cli-0.5.0 → maybeai_sheet_cli-0.6.0}/tests/test_update.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maybeai-sheet-cli
3
- Version: 0.5.0
3
+ Version: 0.6.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
@@ -135,6 +135,13 @@ Import a large table-like `.xlsx` into SheetTable/PG:
135
135
  mbs workbook import ./large-table.xlsx --engine postgres
136
136
  ```
137
137
 
138
+ Import a mixed workbook and let the backend select engines per worksheet:
139
+
140
+ ```bash
141
+ mbs workbook import ./mixed-workbook.xlsx --engine auto
142
+ mbs workbook import ./mixed-workbook.xlsx --engine "postgres,excel,excel,postgres"
143
+ ```
144
+
138
145
  Append rows and verify:
139
146
 
140
147
  ```bash
@@ -252,9 +259,9 @@ mbs
252
259
  | |- lineage API Trace cell/range lineage.
253
260
 
254
261
  ├── db_worksheet(AKA db_table)
255
- │ ├── create PG Create a PG-backed table.
256
- │ ├── update PG Update PG-backed table metadata.
257
- │ ├── delete PG Delete a PG-backed table; requires --yes unless --dry-run.
262
+ │ ├── create PLAN Create a PG-backed table from JSON row data.
263
+ │ ├── update PLAN Update PG-backed rows from JSON row data.
264
+ │ ├── delete PLAN Delete PG-backed rows/table; requires --yes unless --dry-run.
258
265
  │ ├── schema API Infer table schema from a bounded PG read.
259
266
  │ ├── sample API Return bounded table sample rows.
260
267
  │ ├── read API Read PG-backed table rows.
@@ -363,8 +370,17 @@ mbs excel-table style columns-width --doc-id abc123 --worksheet-name Orders --ta
363
370
  mbs db-table metadata --doc-id abc123 --name orders-large # API
364
371
  mbs db-table schema --doc-id abc123 --name orders-large # API
365
372
  mbs db-table sample --doc-id abc123 --name orders-large --limit 50 # API
366
- mbs db-table read --doc-id abc123 --name orders-large --limit 50 # API
373
+ mbs db-table read --doc-id abc123 --name orders-large --limit 100 --offset 200 # API
367
374
  mbs db-table insert --doc-id abc123 --name orders-large --rows rows.json # API
375
+ mbs db-table create --doc-id abc123 --name Orders --rows orders.json # PLAN
376
+ mbs db-table update --doc-id abc123 --name Orders --key order_id --rows orders_patch.json # PLAN
377
+ mbs db-table update --doc-id abc123 --name Orders --row-index 42 --rows row_patch.json # PLAN
378
+ mbs db-table update --doc-id abc123 --name Orders --where '{"status":"open"}' --rows status_patch.json # PLAN
379
+ mbs db-table update --doc-id abc123 --name Orders --column-index 3 --column-name status # PLAN
380
+ mbs db-table delete --doc-id abc123 --name Orders --where '{"order_id":"A1"}' --yes # PLAN
381
+ mbs db-table delete --doc-id abc123 --name Orders --row-index 42 --count 10 --yes # PLAN
382
+ mbs db-table delete --doc-id abc123 --name Orders --column-index 3 --yes # PLAN
383
+ mbs db-table delete --doc-id abc123 --name Orders --column-name status --yes # PLAN
368
384
 
369
385
  # row
370
386
  mbs excel-worksheet row insert --doc-id abc123 --worksheet-name Actuals --row 10 --count 2 # API
@@ -404,6 +420,11 @@ mbs version restore --doc-id abc123 --version-id v42 --dry-run # PLAN
404
420
  mbs share create --doc-id abc123 --email teammate@example.com --role viewer # API
405
421
  ```
406
422
 
423
+ `db-table read`, `schema`, and `sample` keep reads bounded. The default read
424
+ limit is 100 rows, and `--limit` / `--offset` are capped at 10,000 to avoid
425
+ accidental large PG scans. Use a keyset-style backend contract for deeper
426
+ pagination when it becomes available.
427
+
407
428
  Refactor planning is tracked separately from this README:
408
429
  `docs/superpowers/plans/2026-07-01-mbs-two-engine-command-refactor.md`.
409
430
 
@@ -111,6 +111,13 @@ Import a large table-like `.xlsx` into SheetTable/PG:
111
111
  mbs workbook import ./large-table.xlsx --engine postgres
112
112
  ```
113
113
 
114
+ Import a mixed workbook and let the backend select engines per worksheet:
115
+
116
+ ```bash
117
+ mbs workbook import ./mixed-workbook.xlsx --engine auto
118
+ mbs workbook import ./mixed-workbook.xlsx --engine "postgres,excel,excel,postgres"
119
+ ```
120
+
114
121
  Append rows and verify:
115
122
 
116
123
  ```bash
@@ -228,9 +235,9 @@ mbs
228
235
  | |- lineage API Trace cell/range lineage.
229
236
 
230
237
  ├── db_worksheet(AKA db_table)
231
- │ ├── create PG Create a PG-backed table.
232
- │ ├── update PG Update PG-backed table metadata.
233
- │ ├── delete PG Delete a PG-backed table; requires --yes unless --dry-run.
238
+ │ ├── create PLAN Create a PG-backed table from JSON row data.
239
+ │ ├── update PLAN Update PG-backed rows from JSON row data.
240
+ │ ├── delete PLAN Delete PG-backed rows/table; requires --yes unless --dry-run.
234
241
  │ ├── schema API Infer table schema from a bounded PG read.
235
242
  │ ├── sample API Return bounded table sample rows.
236
243
  │ ├── read API Read PG-backed table rows.
@@ -339,8 +346,17 @@ mbs excel-table style columns-width --doc-id abc123 --worksheet-name Orders --ta
339
346
  mbs db-table metadata --doc-id abc123 --name orders-large # API
340
347
  mbs db-table schema --doc-id abc123 --name orders-large # API
341
348
  mbs db-table sample --doc-id abc123 --name orders-large --limit 50 # API
342
- mbs db-table read --doc-id abc123 --name orders-large --limit 50 # API
349
+ mbs db-table read --doc-id abc123 --name orders-large --limit 100 --offset 200 # API
343
350
  mbs db-table insert --doc-id abc123 --name orders-large --rows rows.json # API
351
+ mbs db-table create --doc-id abc123 --name Orders --rows orders.json # PLAN
352
+ mbs db-table update --doc-id abc123 --name Orders --key order_id --rows orders_patch.json # PLAN
353
+ mbs db-table update --doc-id abc123 --name Orders --row-index 42 --rows row_patch.json # PLAN
354
+ mbs db-table update --doc-id abc123 --name Orders --where '{"status":"open"}' --rows status_patch.json # PLAN
355
+ mbs db-table update --doc-id abc123 --name Orders --column-index 3 --column-name status # PLAN
356
+ mbs db-table delete --doc-id abc123 --name Orders --where '{"order_id":"A1"}' --yes # PLAN
357
+ mbs db-table delete --doc-id abc123 --name Orders --row-index 42 --count 10 --yes # PLAN
358
+ mbs db-table delete --doc-id abc123 --name Orders --column-index 3 --yes # PLAN
359
+ mbs db-table delete --doc-id abc123 --name Orders --column-name status --yes # PLAN
344
360
 
345
361
  # row
346
362
  mbs excel-worksheet row insert --doc-id abc123 --worksheet-name Actuals --row 10 --count 2 # API
@@ -380,6 +396,11 @@ mbs version restore --doc-id abc123 --version-id v42 --dry-run # PLAN
380
396
  mbs share create --doc-id abc123 --email teammate@example.com --role viewer # API
381
397
  ```
382
398
 
399
+ `db-table read`, `schema`, and `sample` keep reads bounded. The default read
400
+ limit is 100 rows, and `--limit` / `--offset` are capped at 10,000 to avoid
401
+ accidental large PG scans. Use a keyset-style backend contract for deeper
402
+ pagination when it becomes available.
403
+
383
404
  Refactor planning is tracked separately from this README:
384
405
  `docs/superpowers/plans/2026-07-01-mbs-two-engine-command-refactor.md`.
385
406
 
@@ -0,0 +1,74 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>本地导入引擎验证报告</title>
6
+ <style>
7
+ body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;margin:24px;color:#111827;line-height:1.45}
8
+ h1{font-size:24px} h2{font-size:18px;margin-top:28px}
9
+ table{border-collapse:collapse;width:100%;font-size:13px}th,td{border:1px solid #d1d5db;padding:6px;text-align:left;vertical-align:top}th{background:#f3f4f6}
10
+ .status-pass{color:#166534;background:#dcfce7;font-weight:700}.status-fail{color:#991b1b;background:#fee2e2;font-weight:700}.status-warn,.status-skip{color:#92400e;background:#fef3c7;font-weight:700}
11
+ code,pre{background:#f3f4f6;padding:2px 4px;border-radius:4px}pre{padding:12px;overflow:auto}
12
+ .human-needed{border-left:4px solid #d97706;padding-left:12px;background:#fffbeb}
13
+ </style>
14
+ </head>
15
+ <body>
16
+ <h1>本地导入引擎验证报告</h1>
17
+ <p>运行时间:2026-07-02T15:20:29</p>
18
+ <p>API base:<code>http://localhost:7011</code></p>
19
+ <p>提交版本:maybeai-sheet-cli <code>a988277</code>,play-be <code>76ec7f4</code>,SheetTable <code>2cafe2c</code></p>
20
+ <p>结果汇总:PASS=2,FAIL=0,WARN=1,SKIP=0</p>
21
+ <h2>MaybeSheet URL</h2>
22
+ <ul><li><a href="http://localhost:3003/docs/spreadsheets/d/6a460e52e6feec692aa2b7ee">http://localhost:3003/docs/spreadsheets/d/6a460e52e6feec692aa2b7ee</a></li><li><a href="http://localhost:3003/docs/spreadsheets/d/6a460e59e6feec692aa2b7f2">http://localhost:3003/docs/spreadsheets/d/6a460e59e6feec692aa2b7f2</a></li></ul>
23
+ <h2>流程</h2>
24
+ <div class="mermaid">flowchart LR
25
+ CLI[mbs CLI] --&gt; Play[play-be /api/v1/excel/import]
26
+ Play --&gt; Auto{engine=auto}
27
+ Auto --&gt;|layout/report| Excelize[excelize-mcp]
28
+ Auto --&gt;|forced pg worksheets| SheetTable[SheetTable]
29
+ SheetTable --&gt; PG[(PostgreSQL typed tables)]
30
+ Play --&gt; Response[JSON response]
31
+ Response --&gt; Report[本地 HTML 报告]
32
+ classDef excelize fill:#dbeafe,stroke:#2563eb,color:#111827;
33
+ classDef pg fill:#dcfce7,stroke:#16a34a,color:#111827;
34
+ classDef warn fill:#fef3c7,stroke:#d97706,color:#111827;
35
+ class Excelize excelize;
36
+ class SheetTable,PG pg;
37
+ class Auto warn;
38
+ </div>
39
+ <pre>flowchart LR
40
+ CLI[mbs CLI] --&gt; Play[play-be /api/v1/excel/import]
41
+ Play --&gt; Auto{engine=auto}
42
+ Auto --&gt;|layout/report| Excelize[excelize-mcp]
43
+ Auto --&gt;|forced pg worksheets| SheetTable[SheetTable]
44
+ SheetTable --&gt; PG[(PostgreSQL typed tables)]
45
+ Play --&gt; Response[JSON response]
46
+ Response --&gt; Report[本地 HTML 报告]
47
+ classDef excelize fill:#dbeafe,stroke:#2563eb,color:#111827;
48
+ classDef pg fill:#dcfce7,stroke:#16a34a,color:#111827;
49
+ classDef warn fill:#fef3c7,stroke:#d97706,color:#111827;
50
+ class Excelize excelize;
51
+ class SheetTable,PG pg;
52
+ class Auto warn;
53
+ </pre>
54
+ <h2>对比结果</h2>
55
+ <table><thead><tr><th>类别</th><th>用例</th><th>来源文件</th><th>document_id</th><th>MaybeSheet URL</th><th>期望引擎</th><th>实际引擎</th><th>worksheet_engines</th><th>top-level selected_engine</th><th>preprocess</th><th>list 数量</th><th>read 检查</th><th>结果</th><th>备注</th></tr></thead><tbody><tr><td>auto import</td><td>yunling auto import</td><td>~/Downloads/yunling_v4_20sheet.xlsx</td><td>6a460e52e6feec692aa2b7ee</td><td>http://localhost:3003/docs/spreadsheets/d/6a460e52e6feec692aa2b7ee</td><td>excelize</td><td>excelize</td><td>excelize:21</td><td>absent</td><td>0</td><td>21</td><td>PASS</td><td class="status-pass">PASS</td><td>响应仅保留 top-level engine;每个 worksheet_engines 保留 requested_engine/selected_engine。</td></tr><tr><td>auto import</td><td>llm_cost auto import</td><td>~/Downloads/llm_cost_stats_2026_05_export.xlsx</td><td>6a460e59e6feec692aa2b7f2</td><td>http://localhost:3003/docs/spreadsheets/d/6a460e59e6feec692aa2b7f2</td><td>excelize</td><td>excelize</td><td>excelize:12</td><td>absent</td><td>0</td><td>12</td><td>PASS</td><td class="status-pass">PASS</td><td>响应仅保留 top-level engine;每个 worksheet_engines 保留 requested_engine/selected_engine。</td></tr><tr><td>forced mixed import</td><td>llm_cost forced excelize+postgres list</td><td>~/Downloads/llm_cost_stats_2026_05_export.xlsx</td><td>n/a</td><td>n/a</td><td>composite</td><td>timeout</td><td>SheetTable 日志显示 PG typed writes 已执行;CLI 600s 内未收到 play-be 响应,随后仍在 post-import sync。</td><td>unknown</td><td>observed in SheetTable typed writes</td><td>n/a</td><td>SKIP</td><td class="status-warn">WARN</td><td>命令 --engine &quot;excelize,postgres,...&quot; 触发 PG typed materialization,但 600s 内未返回响应;临时服务关闭时 play-be 记录 SheetTable import failed/server disconnected。需要进一步查 mixed response/registry completion 与 post-import sync 耗时。</td></tr></tbody></table>
56
+ <h2>响应结构检查</h2>
57
+ <ul>
58
+ <li><code>yunling_v4_20sheet.xlsx</code> auto 响应 top-level <code>selected_engine</code>:absent</li>
59
+ <li><code>llm_cost_stats_2026_05_export.xlsx</code> auto 响应 top-level <code>selected_engine</code>:absent</li>
60
+ <li>两个成功响应都保留 <code>engine</code> 和 per-worksheet <code>worksheet_engines[].requested_engine/selected_engine</code>。</li>
61
+ </ul>
62
+ <h2>覆盖率</h2>
63
+ <table><thead><tr><th>区域</th><th>已覆盖</th><th>总数</th><th>百分比</th><th>未覆盖/备注</th></tr></thead><tbody>
64
+ <tr><td>auto import</td><td>2</td><td>2</td><td>100%</td><td>layout/report 与 large workbook</td></tr>
65
+ <tr><td>list worksheets</td><td>2</td><td>2</td><td>100%</td><td>均通过 CLI routed API</td></tr>
66
+ <tr><td>range read</td><td>2</td><td>2</td><td>100%</td><td>均返回样例数据</td></tr>
67
+ <tr><td>forced mixed route</td><td>0</td><td>1</td><td>0%</td><td>SheetTable 完成 typed writes,但 play-be/CLI 响应超时</td></tr>
68
+ </tbody></table>
69
+ <section class="human-needed"><h2>需要人工核验</h2>
70
+ <p>打开上面的 localhost MaybeSheet URL,确认 UI 可以加载对应工作簿。自动化已经验证 import/list/read API;UI 渲染不在本次 CLI 自动检查范围内。</p>
71
+ </section>
72
+ <h2>原始证据文件</h2><p>目录:<code>docs/superpowers/reports/import-engine-local-20260702-150800</code></p><ul><li><code>llm_cost_import_auto.json</code></li><li><code>llm_cost_import_mixed_forced.json</code></li><li><code>llm_cost_list_worksheets.json</code></li><li><code>llm_cost_read_detail_A1_T5.json</code></li><li><code>yunling_import_auto.json</code></li><li><code>yunling_list_worksheets.json</code></li><li><code>yunling_read_T00_A1_F5.json</code></li></ul>
73
+ <script type="module">import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs"; mermaid.initialize({startOnLoad:true, securityLevel:"strict"});</script>
74
+ </body></html>
@@ -0,0 +1,479 @@
1
+ {
2
+ "success": true,
3
+ "endpoint": "/api/v1/excel/import",
4
+ "result": {
5
+ "success": true,
6
+ "documentId": "6a460e59e6feec692aa2b7f2",
7
+ "fileUri": "http://localhost:3003/docs/spreadsheets/d/6a460e59e6feec692aa2b7f2",
8
+ "sheets": [
9
+ "汇总报表",
10
+ "计价明细",
11
+ "计价明细_2",
12
+ "计价明细_3",
13
+ "计价明细_4",
14
+ "计价明细_5",
15
+ "计价明细_6",
16
+ "计价明细_7",
17
+ "计价明细_8",
18
+ "计价明细_9",
19
+ "计价明细_10",
20
+ "计价明细_11"
21
+ ],
22
+ "fileSize": 3984747,
23
+ "source": "upload",
24
+ "message": "File 'llm_cost_stats_2026_05_export.xlsx' imported successfully from upload",
25
+ "engine": "excelize",
26
+ "worksheet_engines": [
27
+ {
28
+ "index": 0,
29
+ "worksheet_name": "汇总报表",
30
+ "requested_engine": "auto",
31
+ "selected_engine": "excelize",
32
+ "reason": "auto: worksheet appears layout/workbook-oriented",
33
+ "row_count": 404,
34
+ "column_count": 7,
35
+ "table_profile": {
36
+ "table_like": false,
37
+ "data_row_count": 403,
38
+ "sampled_rows": 403,
39
+ "density": 0.9791,
40
+ "convertible_columns": false,
41
+ "column_types": [
42
+ "number",
43
+ "number",
44
+ "number",
45
+ "number",
46
+ "number",
47
+ "number",
48
+ "number"
49
+ ]
50
+ }
51
+ },
52
+ {
53
+ "index": 1,
54
+ "worksheet_name": "计价明细",
55
+ "requested_engine": "auto",
56
+ "selected_engine": "excelize",
57
+ "reason": "auto: worksheet appears layout/workbook-oriented",
58
+ "row_count": 4500,
59
+ "column_count": 20,
60
+ "table_profile": {
61
+ "table_like": false,
62
+ "data_row_count": 4499,
63
+ "sampled_rows": 999,
64
+ "density": 0.6834,
65
+ "convertible_columns": false,
66
+ "column_types": [
67
+ "number",
68
+ "text",
69
+ "text",
70
+ "text",
71
+ "text",
72
+ "text",
73
+ "text",
74
+ "text",
75
+ "empty",
76
+ "text",
77
+ "number",
78
+ "number",
79
+ "number",
80
+ "number",
81
+ "empty",
82
+ "text",
83
+ "number",
84
+ "number",
85
+ "number",
86
+ "number"
87
+ ]
88
+ }
89
+ },
90
+ {
91
+ "index": 2,
92
+ "worksheet_name": "计价明细_2",
93
+ "requested_engine": "auto",
94
+ "selected_engine": "excelize",
95
+ "reason": "auto: worksheet appears layout/workbook-oriented",
96
+ "row_count": 4500,
97
+ "column_count": 20,
98
+ "table_profile": {
99
+ "table_like": false,
100
+ "data_row_count": 4499,
101
+ "sampled_rows": 999,
102
+ "density": 0.7373,
103
+ "convertible_columns": false,
104
+ "column_types": [
105
+ "number",
106
+ "text",
107
+ "text",
108
+ "text",
109
+ "text",
110
+ "text",
111
+ "text",
112
+ "text",
113
+ "text",
114
+ "text",
115
+ "number",
116
+ "number",
117
+ "number",
118
+ "number",
119
+ "text",
120
+ "text",
121
+ "number",
122
+ "number",
123
+ "number",
124
+ "number"
125
+ ]
126
+ }
127
+ },
128
+ {
129
+ "index": 3,
130
+ "worksheet_name": "计价明细_3",
131
+ "requested_engine": "auto",
132
+ "selected_engine": "excelize",
133
+ "reason": "auto: worksheet appears layout/workbook-oriented",
134
+ "row_count": 4500,
135
+ "column_count": 20,
136
+ "table_profile": {
137
+ "table_like": false,
138
+ "data_row_count": 4499,
139
+ "sampled_rows": 999,
140
+ "density": 0.7279,
141
+ "convertible_columns": false,
142
+ "column_types": [
143
+ "number",
144
+ "text",
145
+ "text",
146
+ "text",
147
+ "text",
148
+ "text",
149
+ "text",
150
+ "text",
151
+ "text",
152
+ "text",
153
+ "number",
154
+ "number",
155
+ "number",
156
+ "number",
157
+ "text",
158
+ "text",
159
+ "number",
160
+ "number",
161
+ "number",
162
+ "number"
163
+ ]
164
+ }
165
+ },
166
+ {
167
+ "index": 4,
168
+ "worksheet_name": "计价明细_4",
169
+ "requested_engine": "auto",
170
+ "selected_engine": "excelize",
171
+ "reason": "auto: worksheet appears layout/workbook-oriented",
172
+ "row_count": 4500,
173
+ "column_count": 20,
174
+ "table_profile": {
175
+ "table_like": false,
176
+ "data_row_count": 4499,
177
+ "sampled_rows": 999,
178
+ "density": 0.695,
179
+ "convertible_columns": false,
180
+ "column_types": [
181
+ "number",
182
+ "text",
183
+ "text",
184
+ "text",
185
+ "text",
186
+ "text",
187
+ "text",
188
+ "text",
189
+ "text",
190
+ "text",
191
+ "number",
192
+ "number",
193
+ "number",
194
+ "number",
195
+ "text",
196
+ "text",
197
+ "number",
198
+ "number",
199
+ "number",
200
+ "number"
201
+ ]
202
+ }
203
+ },
204
+ {
205
+ "index": 5,
206
+ "worksheet_name": "计价明细_5",
207
+ "requested_engine": "auto",
208
+ "selected_engine": "excelize",
209
+ "reason": "auto: worksheet appears layout/workbook-oriented",
210
+ "row_count": 4500,
211
+ "column_count": 20,
212
+ "table_profile": {
213
+ "table_like": false,
214
+ "data_row_count": 4499,
215
+ "sampled_rows": 999,
216
+ "density": 0.7163,
217
+ "convertible_columns": false,
218
+ "column_types": [
219
+ "number",
220
+ "text",
221
+ "text",
222
+ "text",
223
+ "text",
224
+ "text",
225
+ "text",
226
+ "text",
227
+ "text",
228
+ "text",
229
+ "number",
230
+ "number",
231
+ "number",
232
+ "number",
233
+ "text",
234
+ "text",
235
+ "number",
236
+ "number",
237
+ "number",
238
+ "number"
239
+ ]
240
+ }
241
+ },
242
+ {
243
+ "index": 6,
244
+ "worksheet_name": "计价明细_6",
245
+ "requested_engine": "auto",
246
+ "selected_engine": "excelize",
247
+ "reason": "auto: worksheet appears layout/workbook-oriented",
248
+ "row_count": 4500,
249
+ "column_count": 20,
250
+ "table_profile": {
251
+ "table_like": false,
252
+ "data_row_count": 4499,
253
+ "sampled_rows": 999,
254
+ "density": 0.7474,
255
+ "convertible_columns": false,
256
+ "column_types": [
257
+ "number",
258
+ "text",
259
+ "text",
260
+ "text",
261
+ "text",
262
+ "text",
263
+ "text",
264
+ "text",
265
+ "text",
266
+ "text",
267
+ "number",
268
+ "number",
269
+ "number",
270
+ "number",
271
+ "text",
272
+ "text",
273
+ "number",
274
+ "number",
275
+ "number",
276
+ "number"
277
+ ]
278
+ }
279
+ },
280
+ {
281
+ "index": 7,
282
+ "worksheet_name": "计价明细_7",
283
+ "requested_engine": "auto",
284
+ "selected_engine": "excelize",
285
+ "reason": "auto: worksheet appears layout/workbook-oriented",
286
+ "row_count": 4500,
287
+ "column_count": 20,
288
+ "table_profile": {
289
+ "table_like": false,
290
+ "data_row_count": 4499,
291
+ "sampled_rows": 999,
292
+ "density": 0.7295,
293
+ "convertible_columns": false,
294
+ "column_types": [
295
+ "number",
296
+ "text",
297
+ "text",
298
+ "text",
299
+ "text",
300
+ "text",
301
+ "text",
302
+ "text",
303
+ "text",
304
+ "text",
305
+ "number",
306
+ "number",
307
+ "number",
308
+ "number",
309
+ "text",
310
+ "text",
311
+ "number",
312
+ "number",
313
+ "number",
314
+ "number"
315
+ ]
316
+ }
317
+ },
318
+ {
319
+ "index": 8,
320
+ "worksheet_name": "计价明细_8",
321
+ "requested_engine": "auto",
322
+ "selected_engine": "excelize",
323
+ "reason": "auto: worksheet appears layout/workbook-oriented",
324
+ "row_count": 4500,
325
+ "column_count": 20,
326
+ "table_profile": {
327
+ "table_like": false,
328
+ "data_row_count": 4499,
329
+ "sampled_rows": 999,
330
+ "density": 0.7084,
331
+ "convertible_columns": false,
332
+ "column_types": [
333
+ "number",
334
+ "text",
335
+ "text",
336
+ "text",
337
+ "text",
338
+ "text",
339
+ "text",
340
+ "text",
341
+ "text",
342
+ "text",
343
+ "number",
344
+ "number",
345
+ "number",
346
+ "number",
347
+ "text",
348
+ "text",
349
+ "number",
350
+ "number",
351
+ "number",
352
+ "number"
353
+ ]
354
+ }
355
+ },
356
+ {
357
+ "index": 9,
358
+ "worksheet_name": "计价明细_9",
359
+ "requested_engine": "auto",
360
+ "selected_engine": "excelize",
361
+ "reason": "auto: worksheet appears layout/workbook-oriented",
362
+ "row_count": 4500,
363
+ "column_count": 20,
364
+ "table_profile": {
365
+ "table_like": false,
366
+ "data_row_count": 4499,
367
+ "sampled_rows": 999,
368
+ "density": 0.7212,
369
+ "convertible_columns": false,
370
+ "column_types": [
371
+ "number",
372
+ "text",
373
+ "text",
374
+ "text",
375
+ "text",
376
+ "text",
377
+ "text",
378
+ "text",
379
+ "text",
380
+ "text",
381
+ "number",
382
+ "number",
383
+ "number",
384
+ "number",
385
+ "text",
386
+ "text",
387
+ "number",
388
+ "number",
389
+ "number",
390
+ "number"
391
+ ]
392
+ }
393
+ },
394
+ {
395
+ "index": 10,
396
+ "worksheet_name": "计价明细_10",
397
+ "requested_engine": "auto",
398
+ "selected_engine": "excelize",
399
+ "reason": "auto: worksheet appears layout/workbook-oriented",
400
+ "row_count": 4500,
401
+ "column_count": 20,
402
+ "table_profile": {
403
+ "table_like": false,
404
+ "data_row_count": 4499,
405
+ "sampled_rows": 999,
406
+ "density": 0.7231,
407
+ "convertible_columns": false,
408
+ "column_types": [
409
+ "number",
410
+ "text",
411
+ "text",
412
+ "text",
413
+ "text",
414
+ "text",
415
+ "text",
416
+ "text",
417
+ "text",
418
+ "text",
419
+ "number",
420
+ "number",
421
+ "number",
422
+ "number",
423
+ "text",
424
+ "text",
425
+ "number",
426
+ "number",
427
+ "number",
428
+ "number"
429
+ ]
430
+ }
431
+ },
432
+ {
433
+ "index": 11,
434
+ "worksheet_name": "计价明细_11",
435
+ "requested_engine": "auto",
436
+ "selected_engine": "excelize",
437
+ "reason": "auto: worksheet appears layout/workbook-oriented",
438
+ "row_count": 404,
439
+ "column_count": 20,
440
+ "table_profile": {
441
+ "table_like": false,
442
+ "data_row_count": 403,
443
+ "sampled_rows": 403,
444
+ "density": 0.6502,
445
+ "convertible_columns": false,
446
+ "column_types": [
447
+ "text",
448
+ "number",
449
+ "number",
450
+ "number",
451
+ "number",
452
+ "number",
453
+ "number",
454
+ "text",
455
+ "empty",
456
+ "text",
457
+ "number",
458
+ "number",
459
+ "number",
460
+ "number",
461
+ "empty",
462
+ "text",
463
+ "number",
464
+ "number",
465
+ "number",
466
+ "number"
467
+ ]
468
+ }
469
+ }
470
+ ]
471
+ },
472
+ "target": {
473
+ "document_id": "6a460e59e6feec692aa2b7f2",
474
+ "url": "http://localhost:3003/docs/spreadsheets/d/6a460e59e6feec692aa2b7f2",
475
+ "uri": "http://localhost:3003/docs/spreadsheets/d/6a460e59e6feec692aa2b7f2",
476
+ "gid": null,
477
+ "worksheet_name": null
478
+ }
479
+ }