diff --git a/docs/shortcut-backend-mcp-issues.md b/docs/shortcut-backend-mcp-issues.md new file mode 100644 index 00000000..c84ec4ba --- /dev/null +++ b/docs/shortcut-backend-mcp-issues.md @@ -0,0 +1,174 @@ +# Shortcut 真实测试:后端 / MCP 问题整理 + +这份报告只汇总 `failure_category = backend-or-mcp-error` 的 case,已尽量排除权限、缺真实资源、当前账号无数据等噪音。 + +## 总览 + +- Backend/MCP case 总数:33 +- 聚合问题数:8 +- 复现口径:真实 dws CLI;无 mock;无 dry-run;命令输入和 trace_id 均来自真实测试结果。 + +## 建议优先看 + +1. [P1] Chat/IM 会话 ID 字段在 MCP/后端映射中疑似丢失(15 case) +2. [P1] Chat card 发送 receiverUid 疑似未从 receiver 透传(1 case) +3. [P1] Chat 入群审批 applicantUid/inviterUid 疑似未透传(1 case) +4. [P1] AI 表格 MCP 错误 envelope 语义不一致:success=true 但 error 非空/status=error(5 case) +5. [P1] AI 表格 Workflow 查询在真实 Base 下返回系统级错误(2 case) +6. [P1] AI 表格 roleId 参数疑似未被 MCP 正确读取(3 case) +7. [P2] AI 表格记录主文档查询在真实 record 下返回 no record/SYSTEM_ERROR(2 case) +8. [P2] AI 表格无效 Base/Table/Field/Record 被包装成 SYSTEM_ERROR(4 case) + +## Chat/IM 会话 ID 字段在 MCP/后端映射中疑似丢失 + +- 优先级:P1 +- 建议 owner:IM MCP / IM 后端字段映射 +- 现象:CLI 已传 group/conversation-id/open-conversation-id(部分 case 使用真实 cid),后端仍报 openCid/openConversationId/cid required。 +- 期望:MCP schema/网关应接受并透传 openConversationId/openCid/cid 中的兼容字段;如果资源无效,应返回“无效会话”,而不是 required。 +- 涉及 case:15 + +| 套件 | shortcut | operation | trace_id | 证据 | +|---|---|---|---|---| +| `read` | `chat +chat-members-get` | `tools/call` | `2127d89817840997754345760e07bd` | [UNCLASSIFIED] openCid or cid is required (operation: im/list_group_member_by_ids) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +chat-members-get --id DWSREALREADNOSUCHID0000000000000 --users '冬翔' --yes --format json` | +| `read` | `chat +chat-messages` | `tools/call` | `2104a64c17840997767792656e085e` | [UNCLASSIFIED] openCid or cid is required hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +chat-messages --group cid3Jijzhe2aqs9ysOXjhi05g== --time '2026-07-15 10:00:00' --limit 10 --direction older --yes --format json` | +| `read` | `chat +messages-list` | `tools/call` | `2127d89817840997797873841e0757` | [UNCLASSIFIED] openCid or cid is required hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +messages-list --group cid3Jijzhe2aqs9ysOXjhi05g== --time '2026-07-15 10:00:00' --forward --limit 10 --yes --format json` | +| `write` | `chat +chat-mute-member` | `tools/call` | `2104a64c17840999166036583e08a3` | [UNCLASSIFIED] openConversationId or cid is required (operation: im/set_group_member_mute_list) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +chat-mute-member --group cidDWSREALTESTNOSUCHCONV --users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --mute-time 1 --off --yes --format json` | +| `write` | `chat +chat-transfer-owner` | `tools/call` | `0b5deb3217840999222318863e087a` | [UNCLASSIFIED] openConversationId is required (operation: im/transfer_group_owner) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +chat-transfer-owner --group cidDWSREALTESTNOSUCHCONV --new-owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --yes --format json` | +| `write` | `chat +conversation-clear-messages` | `tools/call` | `2127d89817840999254816721e079b` | [UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_messages) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +conversation-clear-messages --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json` | +| `write` | `chat +conversation-clear-red-point` | `tools/call` | `2104a64c17840999265511295e085f` | [UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_red_point) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +conversation-clear-red-point --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json` | +| `write` | `chat +conversation-hide` | `tools/call` | `2127d89817840999276117140e079b` | [UNCLASSIFIED] openConversationId or cid is required (operation: im/hide_conversation) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +conversation-hide --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json` | +| `write` | `chat +conversation-mark-unread` | `tools/call` | `0bb7c36217840999298744910e0758` | [UNCLASSIFIED] openConversationId or cid is required (operation: im/mark_conversation_unread) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +conversation-mark-unread --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json` | +| `write` | `chat +conversation-mute` | `tools/call` | `2104a64c17840999309241865e085f` | [UNCLASSIFIED] openConversationId is required (operation: im/update_notification_off) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +conversation-mute --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json` | +| `write` | `chat +conversation-mute-at-all` | `tools/call` | `2127d89817840999320028068e07dd` | [UNCLASSIFIED] openConversationId is required (operation: im/update_at_all_notification_off) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +conversation-mute-at-all --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json` | +| `write` | `chat +conversation-mute-red-envelope` | `tools/call` | `0bb7c36217840999330228283e07fe` | [UNCLASSIFIED] openConversationId is required (operation: im/update_red_env_notification_off) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +conversation-mute-red-envelope --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json` | +| `write` | `chat +conversation-set-top` | `tools/call` | `2127d89817840999341302961e07fe` | [UNCLASSIFIED] openConversationId or cid is required (operation: im/set_top_conversation) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +conversation-set-top --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json` | +| `write` | `chat +messages-set-pin` | `tools/call` | `0bb7c36217840999521117991e0758` | [UNCLASSIFIED] openConversationId or cid is required (operation: im/set_pin_message) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +messages-set-pin --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json` | +| `write` | `chat +messages-unset-pin` | `tools/call` | `2104a64c17840999544428103e08ee` | [UNCLASSIFIED] openConversationId or cid is required (operation: im/unset_pin_message) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +messages-unset-pin --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json` | + +## Chat card 发送 receiverUid 疑似未从 receiver 透传 + +- 优先级:P1 +- 建议 owner:IM MCP / card 发送参数映射 +- 现象:CLI 传入 receiver=103262,后端仍报 receiverUid 和 openConversationId 不能同时为空。 +- 期望:receiver 应映射为 receiverUid,或 schema 明确要求 receiverUid;真实入参不应在 MCP 层丢失。 +- 涉及 case:1 + +| 套件 | shortcut | operation | trace_id | 证据 | +|---|---|---|---|---| +| `write` | `chat +messages-send-card` | `tools/call` | `2104a64c17840999509255753e081a` | [UNCLASSIFIED] receiverUid和openConversationId不能同时为空 (operation: im/create_and_send_card) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +messages-send-card --receiver 103262 --yes --format json` | + +## Chat 入群审批 applicantUid/inviterUid 疑似未透传 + +- 优先级:P1 +- 建议 owner:IM MCP / 入群审批参数映射 +- 现象:CLI 传入 applicant=103262、inviter=519019,后端仍报 applicantUid required。 +- 期望:applicant/inviter 应映射为 applicantUid/inviterUid;如果 recordId/group 无效,应返回对应资源错误而不是 applicantUid 缺失。 +- 涉及 case:1 + +| 套件 | shortcut | operation | trace_id | 证据 | +|---|---|---|---|---| +| `write` | `chat +chat-audit-join` | `tools/call` | `0bb7c36217840999154832733e0758` | [UNCLASSIFIED] applicantUid is required (operation: im/audit_join_group) hint: Use --verbose for detailed error logs | +| | input | | | `/private/tmp/dws-real-test chat +chat-audit-join --group cidDWSREALTESTNOSUCHCONV --record-id 999999999999 --applicant 103262 --inviter 519019 --status AuditApprove --description 'DWS shortcut 真实测试描述,可删除' --yes --format json` | + +## AI 表格 MCP 错误 envelope 语义不一致:success=true 但 error 非空/status=error + +- 优先级:P1 +- 建议 owner:AI 表格 MCP wrapper +- 现象:多条 AI 表格命令返回 MCP_TOOL_ERROR,内部 JSON 同时出现 success=true、status=error、error 非空。 +- 期望:只要 error 非空或 status=error,success 应为 false,外层也应按业务错误返回稳定错误码/trace。 +- 涉及 case:5 + +| 套件 | shortcut | operation | trace_id | 证据 | +|---|---|---|---|---| +| `read` | `aitable +export-data` | `-` | `2104a64c17840997514714448e0817` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"taskId cannot be combined with scope, format, tableId or viewId","retryable":false,"type":"INPUT_ERROR"},"m… | +| | input | | | `/private/tmp/dws-real-test aitable +export-data --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --task-id DWSREALREADNOSUCHID0000000000000 --scope all --format excel --table-id hERWDMS --view-id qvGDAH2 --timeout-ms 1 --yes` | +| `write` | `aitable +chart-update` | `-` | `2106d98117840998553244877e08df` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"config is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summ… | +| | input | | | `/private/tmp/dws-real-test aitable +chart-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --chart-id DWSREALTESTNOSUCHID0000000000000 --config '{}' --layout '{}' --yes --format json` | +| `write` | `aitable +record-update` | `-` | `0bab027317840998747383236e090b` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_RECORDS","message":"records must contain at least one writable record","retryable":false,"type":"INPUT_ERROR"},"meta":{},"stat… | +| | input | | | `/private/tmp/dws-real-test aitable +record-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --records '[{"recordId":"recDWSREALTEST","cells":{}}]' --yes --format json` | +| `write` | `aitable +record-upsert` | `-` | `2106d98117840998759832182e087b` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMETER","message":"records is required and must not be empty","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"e… | +| | input | | | `/private/tmp/dws-real-test aitable +record-upsert --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --records '[]' --yes --format json` | +| `write` | `aitable +view-set-fill-color-rule` | `-` | `2106d98117840998924181709e08df` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"conditionalFormats is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success… | +| | input | | | `/private/tmp/dws-real-test aitable +view-set-fill-color-rule --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --json '{}' --yes --format json` | + +## AI 表格 Workflow 查询在真实 Base 下返回系统级错误 + +- 优先级:P1 +- 建议 owner:AI 表格 Workflow MCP / 后端 +- 现象:使用真实可访问 Base 查询 workflow list/get,返回 LIST_WORKFLOWS_ERROR/GET_WORKFLOW_ERROR。 +- 期望:无 workflow 时应返回空列表或 WORKFLOW_NOT_FOUND;有后端异常时需提供稳定错误码和可排查 trace。 +- 涉及 case:2 + +| 套件 | shortcut | operation | trace_id | 证据 | +|---|---|---|---|---| +| `read` | `aitable +workflow-get` | `-` | `2104a64c17840997556363676e08ee` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"GET_WORKFLOW_ERROR","message":"调用远程服务业务异常","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary"… | +| | input | | | `/private/tmp/dws-real-test aitable +workflow-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --workflow-id DWSREALREADNOSUCHID0000000000000 --yes --format json` | +| `read` | `aitable +workflow-list` | `-` | `2127d89817840997572427879e075d` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"LIST_WORKFLOWS_ERROR","message":"biz error","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary… | +| | input | | | `/private/tmp/dws-real-test aitable +workflow-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --limit 10 --offset 1 --yes --format json` | + +## AI 表格 roleId 参数疑似未被 MCP 正确读取 + +- 优先级:P1 +- 建议 owner:AI 表格 MCP role 接口 +- 现象:CLI 已传 --role-id,但 MCP 返回 roleId is required。 +- 期望:role-id/roleId 字段应被正确映射;如果 role 不存在,返回 ROLE_NOT_FOUND,而不是 required。 +- 涉及 case:3 + +| 套件 | shortcut | operation | trace_id | 证据 | +|---|---|---|---|---| +| `read` | `aitable +role-get` | `-` | `2104a64c17840997542904838e0817` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"roleId is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summ… | +| | input | | | `/private/tmp/dws-real-test aitable +role-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --role-id x --yes --format json` | +| `write` | `aitable +role-delete` | `-` | `2106d98117840998782482701e089c` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"roleId is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summ… | +| | input | | | `/private/tmp/dws-real-test aitable +role-delete --base-id DWSREALTESTNOSUCHID0000000000000 --role-id DWSREALTESTNOSUCHID0000000000000 --yes --format json` | +| `write` | `aitable +role-update` | `-` | `2132f5ca17840998794483634e08d8` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"roleId is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summ… | +| | input | | | `/private/tmp/dws-real-test aitable +role-update --base-id DWSREALTESTNOSUCHID0000000000000 --role-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --role-type x --flow-type x --sub-roles '[]' --yes --format json` | + +## AI 表格记录主文档查询在真实 record 下返回 no record/SYSTEM_ERROR + +- 优先级:P2 +- 建议 owner:AI 表格 primary doc MCP / 后端 +- 现象:record-query 已能查到真实 recordId,但 primary-doc 查询返回 no record、type=SYSTEM_ERROR。 +- 期望:若该记录无主文档,应返回空/未创建;若 recordId 语义不匹配,应返回明确参数错误,不应是系统错误。 +- 涉及 case:2 + +| 套件 | shortcut | operation | trace_id | 证据 | +|---|---|---|---|---| +| `read` | `aitable +base-get-primary-doc-id` | `-` | `0b5deb3217840997466255627e08ee` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"-1","message":"no record","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to query… | +| | input | | | `/private/tmp/dws-real-test aitable +base-get-primary-doc-id --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-id 1015oH3OXy --yes --format json` | +| `read` | `aitable +record-primary-doc-get` | `-` | `2127d89817840997528393730e079c` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"-1","message":"no record","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to query… | +| | input | | | `/private/tmp/dws-real-test aitable +record-primary-doc-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-id 1015oH3OXy --yes --format json` | + +## AI 表格无效 Base/Table/Field/Record 被包装成 SYSTEM_ERROR + +- 优先级:P2 +- 建议 owner:AI 表格 MCP wrapper / 后端错误码 +- 现象:安全负向 ID 下,部分写接口返回 getDentryDTO returns null、type=SYSTEM_ERROR、retryable=true。 +- 期望:资源不存在应返回 INPUT_ERROR/NOT_FOUND 且 retryable=false,避免误导调用方重试。 +- 涉及 case:4 + +| 套件 | shortcut | operation | trace_id | 证据 | +|---|---|---|---|---| +| `write` | `aitable +field-delete` | `-` | `0bab027317840998611338768e08c8` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"getDentryDTO returns null","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary"… | +| | input | | | `/private/tmp/dws-real-test aitable +field-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --yes --format json` | +| `write` | `aitable +field-update` | `-` | `213ee25c17840998623207342e08e2` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"getDentryDTO returns null","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary"… | +| | input | | | `/private/tmp/dws-real-test aitable +field-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --config '{}' --ai-config '{}' --yes --format json` | +| `write` | `aitable +record-delete` | `-` | `2132f5ca17840998724753149e0853` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"getDentryDTO returns null","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary"… | +| | input | | | `/private/tmp/dws-real-test aitable +record-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --record-ids DWSREALTESTNOSUCHID0000000000000 --yes --format json` | +| `write` | `aitable +table-update` | `-` | `213ee25c17840998877246229e087f` | [MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"getDentryDTO returns null","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary"… | +| | input | | | `/private/tmp/dws-real-test aitable +table-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --description 'DWS shortcut 真实测试描述,可删除' --record-name-key task --yes --format json` | diff --git a/docs/shortcut-comparison.html b/docs/shortcut-comparison.html index 98c900c1..c744f083 100644 --- a/docs/shortcut-comparison.html +++ b/docs/shortcut-comparison.html @@ -13,6 +13,15 @@ h1{margin:0 0 6px;font-size:25px} .sub{color:var(--muted);font-size:13px} .note{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:12px 16px;margin:22px 0;color:var(--muted);font-size:13px} .note b{color:var(--ink)} h2{font-size:18px;margin:34px 0 4px;padding-top:10px} h2 .c{color:var(--muted);font-size:14px;font-weight:400} +.section-lead{color:var(--muted);max-width:980px;margin:7px 0 14px} +.card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px;margin:12px 0 24px} +.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:13px 15px} +.card h3{margin:0 0 8px;font-size:14px;color:var(--accent)} +.smart-list{list-style:none;padding:0;margin:0;display:grid;gap:7px} +.smart-list li{border-top:1px solid var(--line);padding-top:7px} +.smart-list li:first-child{border-top:0;padding-top:0} +.smart-list code{color:#d3a7ff} .smart-desc{display:block;color:var(--muted);font-size:11.5px;margin-top:1px} +.why td:first-child{color:#9aa8bb} .why td:nth-child(2){color:#dce7f7} table{width:100%;border-collapse:collapse;margin:10px 0 6px;background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;table-layout:fixed} th,td{padding:9px 11px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top;word-break:break-all} th{background:#1b2536;color:var(--muted);font-size:12px;font-weight:600} @@ -23,6 +32,13 @@ code{font-family:"SF Mono",Menlo,Consolas,monospace;font-size:12.5px} .desc{color:var(--muted);font-size:11.5px;margin-top:3px} .rk{display:inline-block;font-size:10px;padding:0 6px;border-radius:10px;margin-left:6px;vertical-align:1px} .rk-r{background:#12321d;color:#66d38a} .rk-w{background:#3a2f10;color:#e2b23c} .rk-h{background:#3a1414;color:#f27272} +.smart-badge{display:inline-block;font-size:10px;padding:0 6px;border-radius:10px;margin-left:6px;vertical-align:1px;background:#35204d;color:#d3a7ff} +.test-ok,.test-warn,.test-bad{display:inline-block;font-size:10px;padding:0 6px;border-radius:10px;vertical-align:1px} +.test-ok{background:#12321d;color:#66d38a} .test-warn{background:#3a2f10;color:#e2b23c} .test-bad{background:#3a1414;color:#f27272} +.test-err{color:#d5a429} +details.io{margin-top:6px} details.io summary{cursor:pointer;color:#8fd3ff;font-size:11.5px} +.io-label{color:#9aa8bb;font-size:11px;margin-top:6px} +details.io pre{white-space:pre-wrap;word-break:break-word;background:#101827;border:1px solid var(--line);border-radius:6px;padding:7px;margin:3px 0 6px;color:#c7cfdb;max-height:260px;overflow:auto;font-size:11px} .lk-none{color:#6b7890} .lk-miss{color:var(--yellow)} .lk-hit{color:var(--green)} footer{color:var(--muted);text-align:center;font-size:12px;margin-top:36px} @@ -30,1907 +46,22306 @@ footer{color:var(--muted);text-align:center;font-size:12px;margin-top:36px}
每个 shortcut:dws +命令 vs lark-cli vs dws 原生 MCP 组合 · 源码自动提取
366
shortcut 总数
+
68
复合 / 智能型
+
298
原子型
16
服务
50
lark 同名可对齐
53
钉钉特有(无 lark)
+
39
lark 平台特有
+
366
逐条实测覆盖
+
204
真实只读后端测试
+
162
真实写入后端测试
读表说明:① dws shortcut = 新增的精选命令(<xxx> 为参数占位)。 -② dws 原生 MCP 组合 = 该 shortcut 底层等价的裸命令,需手拼 JSON —— 直观体现 shortcut 的收敛价值。 -③ lark-cli = 飞书对应命令:绿色=同名可对齐;黄色=lark 有该服务但命名/能力不同;灰色=钉钉特有服务,lark 无对应。因两边 API 不同,仅同名项做逐一对齐。
+② 原生 MCP / 编排说明:原子型展示等价裸命令;复合型说明其分页、消歧、多步调用、聚合或回滚职责。 +③ lark-cli = 飞书对应命令:绿色=同名可对齐;黄色=lark 有该服务但命名/能力不同;灰色=钉钉特有服务,lark 无对应。因两边 API 不同,仅同名项做逐一对齐。 +④ 复合/智能型 = 不只是参数改名,内部包含多次调用、跨服务 ID 解析、分页、消歧、聚合、投影、批处理或失败回滚。 +⑤ lark 平台特有 = 飞书有独立产品对象或事件模型,但当前 DWS / 钉钉 MCP 没有等价资源,不能通过简单封装实现。 +⑥ 实际测试情况 = 每条 dws shortcut 都通过真实 cobra 命令树执行;fake MCP 拦截所有后端调用,因此不发网络、不写线上数据。绿色=已装配到 MCP 调用;黄色=synthetic 参数被命令自身校验正确拦截;红色=失败。每行都可展开查看本次测试的 CLI 输入、stdout、stderr/error。 +⑦ 真实后端测试 = 用真实 dws 二进制、真实登录态、真实后端执行(无 --mock、无 --dry-run),逐条记录真实输入与真实 stdout/stderr。read 已全量覆盖;write / high-risk-write 按临时测试资源和测试人员分批推进,未覆盖项会继续补测。 +⑧ 逐项失败 review = shortcut-error-review.html 已把每个真实失败逐条标出“要改哪里 / 具体改法 / 验证方式”。
+

逐条实际测试矩阵 · 366 / 366 覆盖

+

本页每一条 dws shortcut 都有测试记录。测试由 scripts/gen_shortcut_test_matrix.go 生成:逐条喂入合成参数,实际执行 cobra 命令树,所有 MCP 调用由 fake caller 拦截并记录 product/tool/args,同时捕获每条命令的 CLI 输入、stdout、stderr/error,确保零网络、零副作用。结果:323 条已装配到真实 MCP tool,43 条被自身校验按预期拦截,失败 0 条,tool ground truth 校验失败 0 条。

+ + + + + +
测试类型数量含义副作用边界
已实测装配323命令实际执行到 MCP 调用组装路径,并记录 product/tool/argsfake MCP 拦截,不访问后端,不写数据
实测校验拦截43命令实际执行到自身校验链路,synthetic 参数被合法拒绝校验前停止,无 MCP 调用
失败0panic、无调用无错误、或 tool ground truth 未通过必须为 0 才允许生成报告
+

真实后端只读测试 · 204 / 204 read 覆盖

+

这一层不使用 mock,也不使用 dry-run:用临时构建的真实 dws 二进制和当前 profile 登录态执行 read shortcut,并捕获真实 stdout/stderr。结果:成功 162 条,真实后端/参数/鉴权错误 41 条,超时 0 条。大量错误并不代表命令未执行,而是后端真实返回了 not_authenticated、参数校验、资源不存在或权限/业务错误;这些原始输出已逐条写在主表展开项中。

+ + + + + +
真实测试类型数量含义副作用边界
真实后端成功162命令真实访问后端并 exit 0仅 read 命令
真实后端返回错误41命令真实访问后端或真实执行本地校验后返回错误;stdout/stderr 已逐条记录仅 read 命令
真实后端超时0超过测试超时时间仅 read 命令
+

只读真实失败归因

+ + + + + + + + +
失败归因数量说明
输入或业务校验失败16命令真实进入校验;可能是安全负向输入触发,也可能需要更完整 fixture。
后端 / MCP 内部错误9服务端/MCP 返回内部错误,报告保留原始输出供后端排查。
缺真实资源 fixture7资源、消息、群、文档、单据等真实对象不存在。
权限 / 鉴权不足6账号、应用 scope 或资源权限不足;需要授权/换账号/配置应用权限。
缺妙记/听记真实 fixture3妙记/听记命令依赖当前账号可见的真实会议产物。
人工授权后执行1无安全负向目标或高风险动作,需人工逐项确认。
+

真实后端写入测试 · 162 / 162 write 覆盖中

+

这一层同样不使用 mock,也不使用 dry-run:用真实 dws 二进制、当前登录态、临时测试资源以及测试人员(冬翔、克谨、怒龙)分批执行 write / high-risk-write shortcut。当前已记录 162 条:成功 48 条,真实后端/参数/业务错误 114 条,超时 0 条,待执行 0 条。写入类的失败同样保留真实 stdout/stderr,便于定位是 shortcut 参数投影问题、后端业务约束还是权限限制。

+ + + + + +
真实测试类型数量含义副作用边界
真实后端成功48命令真实访问后端并 exit 0临时资源 / 测试人员
真实后端返回错误114命令真实访问后端或真实执行本地校验后返回错误;stdout/stderr 已逐条记录临时资源 / 测试人员
真实后端超时0超过测试超时时间需单独复测
+

写入真实失败归因

+ + + + + + + +
失败归因数量说明
缺 AI 表格真实 fixture31AI 表格命令依赖真实 Base/Table/View/Record 等资源。
后端 / MCP 内部错误24服务端/MCP 返回内部错误,报告保留原始输出供后端排查。
缺真实资源 fixture23资源、消息、群、文档、单据等真实对象不存在。
输入或业务校验失败20命令真实进入校验;可能是安全负向输入触发,也可能需要更完整 fixture。
权限 / 鉴权不足16账号、应用 scope 或资源权限不足;需要授权/换账号/配置应用权限。
+

非复合 / 智能型 shortcut 为什么也要写? · 298 个

+

原子型 shortcut 不是在宣称“新增了底层能力”,而是在 MCP tool 之上提供一层稳定、可发现、可测试的用户入口。它的价值边界要讲清楚:有增量就保留,纯重复就删除。

+ + + + + + + + +
必要性没有原子型 shortcut 时保留原子型 shortcut 的价值
补齐命令面空白有些 MCP tool 没有对应的 dws <svc> <verb> helper,只能走裸 dws mcp ... --json把真实可用的底层能力挂到产品命令树里,用户和 Agent 不必手写 JSON
参数收敛调用者要记服务端字段名、嵌套 JSON、枚举和必填关系收敛成命名 flag、默认值和校验,降低误填与 prompt 猜参概率
Intent / Help / 可发现性MCP schema 偏接口视角,Agent 需要先理解 tool 再判断何时使用每条 shortcut 都带任务化描述,可被 --help、dws shortcut list 和 Agent 规划直接利用
统一安全与输出入口读写风险、dry-run、format / jq / fields 等能力分散到调用者侧复用 shortcut 框架的 risk 分级、dry-run 通道和统一输出契约
稳定投影底层响应 envelope 冗长且字段不稳定,常把噪声暴露给用户对一部分读类命令保留干净投影,只输出用户真正要看的字段
对齐与治理无法判断与 lark-cli、helper、MCP tool 的覆盖差异,也难以做后续去重形成可枚举的命令面,便于生成报告、做 GSB 对比和持续 prune
+
保留标准:原子型 shortcut 必须至少满足“补 helper 空白”或“提供投影/校验/Intent 等体验增量”。本轮已删除 213 条仅换名字、无投影增量、且 helper 已覆盖的纯重复 wrapper;所以这里的原子型不是为了凑数量,而是为了把仍有价值的底层能力变成稳定入口。
+

复合 / 智能型 shortcut · 68 个

+

这组命令面向完整用户意图,例如“按姓名发消息”“找共同空闲时间”“找到最新妙记并取逐字稿”。其中一部分是真正的多 MCP / 跨服务编排,另一部分是单服务内的分页、过滤、批处理和稳定输出;两者都不是普通 API 别名。

+
+

calendar · 15

+

chat · 10

+

todo · 8

+

contact · 7

+

minutes · 6

+

aitable · 5

+

mail · 4

+

oa · 4

+

doc · 3

+

attendance · 2

+

wiki · 2

+

drive · 1

+

report · 1

+
+

为什么不只提供 API 形态?

+

API/MCP 形态以服务端资源和接口为中心;shortcut 以用户任务为中心。单独封装的价值不是少写几个字符,而是把稳定的客户端语义、保护措施和多步流程变成可测试契约。

+ + + + + + + + + +
维度直接 API / MCP单独 shortcut 封装
输入语义要求调用者理解服务端字段名、类型、枚举和 JSON 结构提供面向任务的 flags、默认值、枚举、时间解析和跨字段校验
ID 与上下文通常先查 userId、deptId、eventId、baseId,再复制到下一次调用可按姓名/标题解析、唯一性消歧,并自动串联后续操作
多步一致性调用者自行处理部分成功、重试、回滚与中间结果集中实现 fan-out、分页、去重、partial failure 和必要回滚
安全写接口裸露,dry-run 和确认逻辑由每个调用者重复实现统一 risk 分级、确认提示、dry-run 计划和高风险保护
输出契约响应 envelope 和字段随底层工具而异,常含大量噪声稳定投影关键字段,并统一支持 format / jq / fields
Agent 可发现性模型需先理解 API schema,再自己规划完整调用链Intent、示例和窄参数面直接表达“什么时候用、会发生什么”
演进隔离上游参数或响应变化会扩散到所有脚本和 Agent prompt在一个经过测试的适配层吸收兼容变化
+
它不是 API 的替代品。 对一次性、低频、需要完整底层字段或刚上线尚未沉淀的能力,仍应直接调用 API/MCP。只有当封装提供明确增量——复合编排、校验、安全、稳定投影或高频意图——才值得保留;纯粹改名且没有增量的 wrapper 应删除或不新增。
+

lark 平台特有 shortcut · 39 个

+

这批不是“DWS 少写了几个 shortcut”,而是飞书平台有对应的一等产品对象或事件模型,当前钉钉 MCP/DWS 没有同语义承接点。后续只有在钉钉开放对应 API、或 DWS 接入等价 MCP tool 后,才适合再做 shortcut。

+
+

lark event · 1

+
飞书 event shortcut 面向 lark-cli 的事件订阅模型;DWS 的钉钉事件/机器人连接模型不同,目前没有沉淀成同参数、同语义的 shortcut。
+
+

lark markdown · 5

+
lark-cli 的 markdown shortcut 绑定飞书云文档/云盘里的 Markdown 工作流;当前 DWS 没有等价的钉钉 Markdown 云文档资源与 patch/diff/overwrite API。
+
+

lark note · 2

+
飞书 Note 是会议纪要直查对象,可按 note_id 取详情和逐字稿;DWS 的 minutes 能力属于钉钉妙记/听记,资源 ID、权限和数据模型不同,不能保证等价。
+
+

lark okr · 13

+
飞书 OKR 是独立目标管理产品;当前 DWS / 钉钉 MCP 没有等价的 OKR 周期、目标、指标和进展对象,不能只靠 wrapper 复刻。
+
+

lark slides · 6

+
飞书 Slides 是原生演示文稿对象,支持页面替换、截图、XML 和媒体上传;当前 DWS 没有钉钉幻灯片对象模型与页面级 MCP 能力。
+
+

lark vc · 9

+
飞书 VC 暴露会议加入/离开、会中事件、消息、录制等对象;当前 DWS 没有一套干净的钉钉会议 MCP tool 可等价承接,已有事件能力也不是同一套会议生命周期语义。
+
+

lark whiteboard · 3

+
飞书 Whiteboard 有独立画板节点、查询和结构化更新能力;当前 DWS 没有钉钉画板节点 schema 或对应 MCP tool。
+
+

chat · 89 个 · ↔ lark im

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ - - + + + + + - - + + + + + + + + + + + - + + + + + - + + + + + - + + - - + + + + - + + + + + + + + + + + + + + - + + + + + + + - + + - + + - + + + + + + - + + - + + - + + - + + - + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + + - + + + + - - + + + - - + + + - - + + + - - + + + - - + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws chat +at-me --days <days>read
查最近 @我 的消息(自动算时间窗,投影发送人/时间/内容/会话)
dws mcp chat <tool>dws chat +at-me --days <days>read复合/智能型
查最近 @我 的消息(自动算时间窗,投影发送人/时间/内容/会话)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/search_at_me_message
输入 / CLI 输出
输入
dws chat +at-me --days 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cursor": "0",
+    "endTime": 1784105092577,
+    "limit": 50,
+    "startTime": 1784018692577
+  },
+  "product": "chat",
+  "tool": "search_at_me_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cursor": "0",
+    "endTime": 1784105092577,
+    "limit": 50,
+    "startTime": 1784018692577
+  },
+  "product": "chat",
+  "tool": "search_at_me_message"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2787ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +at-me --days 7 --yes --format json
真实 stdout
{
+  "messages": [
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "@梓寻 @崇幻(主用钉) @陈叙 @念晨 明天下午给孙总的蓝图汇报,最后一part是对本次AI营销项目的建议和求助。大家可以把每个模块目前遇到的问题和困难(例如:需要客户提供的资源、需求落地的阻力等),单独反馈给我。",
+      "time": "2026-07-15 14:29:53"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 这个知识蓝图好了么?客户想先看一下材料",
+      "time": "2026-07-15 13:41:25"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 @杨淑平 \n1、**生产环境:补充一下是否需要域名**[图片消息](mediaId=@lQLPJxN0PcmAzMfNBfDNCuKwMJ8nHWzNI30KKoLRQapEAQ)**2、测试环境:**\n(1)需要几台服务器,配置保持跟生产一样,还是改一下\n(2)测试环境是否需要域名,(测试环境就写是否需要好了,可以让客户随机分配下)[图片消息](mediaId=@lQLPJwPJXqYLLMfNBf7NCqCw5iUu-ba7L7IKKoLRQapEAA)",
+      "time": "2026-07-15 10:19:17"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "栩铭-主账号",
+      "text": "@徐洪鑫(崇幻(主用钉)) @董鑫阳(念晨) @陈绪(陈叙) @杨淑平 @梓寻 \n需要申请 测试服务器环境的同学,在https://alidocs.dingtalk.com/i/nodes/PwkYGxZV3ZEBnPvwI92oDm9rWAgozOKL?utm_scene=team_space&iframeQuery=sheet_range%3Dkgqie6hm_0_11_9_3  “测试环境”Sheet页登记下\n需要域名的,填写在新增的“域名”栏目",
+      "time": "2026-07-15 09:50:16"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "@梓寻 @陈叙 @崇幻(主用钉) @念晨  各业务场景的蓝图素材还请大家统一补充到钉钉文档中 https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPzYvRArmHv23ye4kWzN67Mw4",
+      "time": "2026-07-14 22:44:59"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@崇幻(主用钉) @陈叙 @念晨 @杨淑平 今日进展和明日计划记得发一下哈,\n\n另外再看一下情报助手、活动助手、解决方案助手、专家Agent什么时候可以让中控一线人员在自己的电脑上运行(最小MVP版本),要给下时间",
+      "time": "2026-07-14 21:35:38"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 选李龙就是@粤腾 批啦[憨笑]",
+      "time": "2026-07-14 20:33:28"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "@崇幻(主用钉) @念晨 @梓寻 @陈叙 如果大家明天上午方便,最好能来中控现场,蓝图规划和场景demo录制两个事现场对齐高效输出。[抱拳]",
+      "time": "2026-07-14 19:13:20"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "@崇幻(主用钉) @陈叙 @梓寻 @念晨 明天要给新的分管It和营销业务副总裁孙总汇报整体项目蓝图规划,辛苦大家今天内把每个模块用户故事动线(产品原型图,demo界面,场景等)串起来的相关素材放到知识库。https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYrlp4LN6IBEylmR48akx1Z5N?corpId=ding5bb1eba46e6a17d94ac5d6980864d335&utm_medium=im_card&iframeQuery=utm_medium%3Dim_card%26utm_source%3Dim&utm_scene=team_space&utm_source=im",
+      "time": "2026-07-14 16:28:06"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 @陈叙 会议室在 E307",
+      "time": "2026-07-14 13:12:04"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "崇幻这边可以现场演示,@念晨 @陈叙 你俩下午赶的过来么?",
+      "time": "2026-07-14 11:13:17"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 @粤腾 @梓寻 @陈叙 @崇幻(主用钉) 崔总突然下午要看项目整体进度,需要汇报每个子项目的情况,大概2点半这样。",
+      "time": "2026-07-14 11:11:28"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 明日计划给你加个知识蓝图输出中,然后约客户周三对焦哈",
+      "time": "2026-07-13 23:14:03"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@陈叙 @念晨 @杨淑平 今日进展和明天计划记得同步下[送花花]",
+      "time": "2026-07-13 21:40:08"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "还差一个情报助理和 知识库与中控制标Agent打通。  @杨淑平 情报助理看下周三能做到什么程度。 @念晨 知识库与中控制标Agent打通 需要在7 18 的demo演示中打通么。",
+      "time": "2026-07-13 16:43:23"
+    },
+    {
+      "conversation": "算法团队mentor群(内部讨论群)",
+      "sender": "璟琦(主用钉)",
+      "text": "@董鑫阳(念晨) https://acl.alibaba-inc.com/permission/datapermission/applyDetail.htm?spm=21540d8c.6248353e.0.0.6ae2264c9zDMFB&flowId=3cd438c0-2cee-4eac-a763-4625dbf2b51d",
+      "time": "2026-07-15 10:54:23"
+    },
+    {
+      "conversation": "算法团队mentor群(内部讨论群)",
+      "sender": "九韶",
+      "text": "@董鑫阳(念晨) 给你留了一个目标, 你抓紧更新,进去。 我给大哥先发一般",
+      "time": "2026-07-14 16:15:16"
+    },
+    {
+      "conversation": "算法团队mentor群(内部讨论群)",
+      "sender": "璟琦(主用钉)",
+      "text": "@董鑫阳(念晨) 你补一下 中控 及  专家agent 的部分",
+      "time": "2026-07-14 15:48:29"
+    },
+    {
+      "conversation": "算法团队mentor群(内部讨论群)",
+      "sender": "璟琦(主用钉)",
+      "text": "@董鑫阳(念晨) cli实现的时候这里面的能力最好都支持",
+      "time": "2026-07-14 10:49:39"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "筱淘",
+      "text": "@董鑫阳(念晨) 让客户再等等 明天见客户",
+      "time": "2026-07-15 09:48:49"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 没事,下次星爷的美人鱼2要在2028年上映了,到时候我们再一起翘班去",
+      "time": "2026-07-15 09:41:06"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@卢翮(龙衔) @董鑫阳(念晨) 去么去么",
+      "time": "2026-07-15 09:22:09"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) @蒋志刚(穆伦) @卢翮(龙衔) 去么,去么",
+      "time": "2026-07-15 09:16:18"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 哪个 HR 问你",
+      "time": "2026-07-15 09:10:25"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "穆伦",
+      "text": "@Dennis(念晨) 为啥这么问呢?你们那边没有好的位置?",
+      "time": "2026-07-15 09:05:14"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "筱淘",
+      "text": "@董鑫阳(念晨) 还等什么 来吧",
+      "time": "2026-07-15 09:00:21"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 害怕",
+      "time": "2026-07-14 22:01:18"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "穆伦",
+      "text": "@Dennis(念晨) 展开说说",
+      "time": "2026-07-14 16:39:26"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "龙衔",
+      "text": "@董鑫阳(念晨) 聊啥",
+      "time": "2026-07-14 16:36:03"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "穆伦",
+      "text": "@Dennis(念晨) 什么评价",
+      "time": "2026-07-14 16:33:04"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 我就说旁边有个车神经的滴滴我",
+      "time": "2026-07-14 13:04:30"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 赛银",
+      "time": "2026-07-14 12:51:33"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 刚才出来的车是你的呀",
+      "time": "2026-07-14 12:51:27"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 你最后一条为什么只出现一半",
+      "time": "2026-07-14 10:27:07"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) iPad or Mac?",
+      "time": "2026-07-14 10:23:28"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "龙衔",
+      "text": "@董鑫阳(念晨) 走,请你吃面",
+      "time": "2026-07-13 18:26:51"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "龙衔",
+      "text": "@董鑫阳(念晨) 茶叶忘了给你了 下次吃饭吧 头大 脑子不够了",
+      "time": "2026-07-13 14:14:22"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 下午你来",
+      "time": "2026-07-13 11:37:02"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 你是开个新卡,还是试试筱淘那个100多的",
+      "time": "2026-07-13 11:33:47"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨)",
+      "time": "2026-07-13 11:32:43"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 我给你开个卡?",
+      "time": "2026-07-13 11:28:36"
+    },
+    {
+      "conversation": "元智,九韶,璟琦(主用钉),念晨",
+      "sender": "元智",
+      "text": "@董鑫阳(念晨) 给力,scope更大了",
+      "time": "2026-07-14 15:39:19"
+    },
+    {
+      "conversation": "元智,九韶,璟琦(主用钉),念晨",
+      "sender": "九韶",
+      "text": "@董鑫阳(念晨) 汇报过了吗?  怎么样?",
+      "time": "2026-07-14 15:19:43"
+    },
+    {
+      "conversation": "[会议群]销售知识库方案讨论",
+      "sender": "赵瑞(玖霄)",
+      "text": "我来约你时间@念晨",
+      "time": "2026-07-14 12:37:23"
+    },
+    {
+      "conversation": "[会议群]销售知识库方案讨论",
+      "sender": "迦卢",
+      "text": "@赵瑞(玖霄) 你把需求和@念晨 对焦下",
+      "time": "2026-07-14 12:25:15"
+    },
+    {
+      "conversation": "[会议群]销售知识库方案讨论",
+      "sender": "迦卢",
+      "text": "@赵瑞(玖霄) @念晨 是知识库这边的技术架构师,目前还没有产品,但是他来进行和我们共创",
+      "time": "2026-07-13 17:48:48"
+    },
+    {
+      "conversation": "FDE Go",
+      "sender": "冬翔",
+      "text": "@董鑫阳(念晨) 你的Claude还是不能用?",
+      "time": "2026-07-14 10:22:12"
+    },
+    {
+      "conversation": "FDE Go",
+      "sender": "黎常",
+      "text": "@董鑫阳(念晨) 这个确实太傻逼了,放着好好优势不用",
+      "time": "2026-07-14 09:55:49"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "messages": [
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "@梓寻 @崇幻(主用钉) @陈叙 @念晨 明天下午给孙总的蓝图汇报,最后一part是对本次AI营销项目的建议和求助。大家可以把每个模块目前遇到的问题和困难(例如:需要客户提供的资源、需求落地的阻力等),单独反馈给我。",
+      "time": "2026-07-15 14:29:53"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 这个知识蓝图好了么?客户想先看一下材料",
+      "time": "2026-07-15 13:41:25"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 @杨淑平 \n1、**生产环境:补充一下是否需要域名**[图片消息](mediaId=@lQLPJxN0PcmAzMfNBfDNCuKwMJ8nHWzNI30KKoLRQapEAQ)**2、测试环境:**\n(1)需要几台服务器,配置保持跟生产一样,还是改一下\n(2)测试环境是否需要域名,(测试环境就写是否需要好了,可以让客户随机分配下)[图片消息](mediaId=@lQLPJwPJXqYLLMfNBf7NCqCw5iUu-ba7L7IKKoLRQapEAA)",
+      "time": "2026-07-15 10:19:17"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "栩铭-主账号",
+      "text": "@徐洪鑫(崇幻(主用钉)) @董鑫阳(念晨) @陈绪(陈叙) @杨淑平 @梓寻 \n需要申请 测试服务器环境的同学,在https://alidocs.dingtalk.com/i/nodes/PwkYGxZV3ZEBnPvwI92oDm9rWAgozOKL?utm_scene=team_space&iframeQuery=sheet_range%3Dkgqie6hm_0_11_9_3  “测试环境”Sheet页登记下\n需要域名的,填写在新增的“域名”栏目",
+      "time": "2026-07-15 09:50:16"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "@梓寻 @陈叙 @崇幻(主用钉) @念晨  各业务场景的蓝图素材还请大家统一补充到钉钉文档中 https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPzYvRArmHv23ye4kWzN67Mw4",
+      "time": "2026-07-14 22:44:59"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@崇幻(主用钉) @陈叙 @念晨 @杨淑平 今日进展和明日计划记得发一下哈,\n\n另外再看一下情报助手、活动助手、解决方案助手、专家Agent什么时候可以让中控一线人员在自己的电脑上运行(最小MVP版本),要给下时间",
+      "time": "2026-07-14 21:35:38"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 选李龙就是@粤腾 批啦[憨笑]",
+      "time": "2026-07-14 20:33:28"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "@崇幻(主用钉) @念晨 @梓寻 @陈叙 如果大家明天上午方便,最好能来中控现场,蓝图规划和场景demo录制两个事现场对齐高效输出。[抱拳]",
+      "time": "2026-07-14 19:13:20"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "@崇幻(主用钉) @陈叙 @梓寻 @念晨 明天要给新的分管It和营销业务副总裁孙总汇报整体项目蓝图规划,辛苦大家今天内把每个模块用户故事动线(产品原型图,demo界面,场景等)串起来的相关素材放到知识库。https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYrlp4LN6IBEylmR48akx1Z5N?corpId=ding5bb1eba46e6a17d94ac5d6980864d335&utm_medium=im_card&iframeQuery=utm_medium%3Dim_card%26utm_source%3Dim&utm_scene=team_space&utm_source=im",
+      "time": "2026-07-14 16:28:06"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 @陈叙 会议室在 E307",
+      "time": "2026-07-14 13:12:04"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "崇幻这边可以现场演示,@念晨 @陈叙 你俩下午赶的过来么?",
+      "time": "2026-07-14 11:13:17"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 @粤腾 @梓寻 @陈叙 @崇幻(主用钉) 崔总突然下午要看项目整体进度,需要汇报每个子项目的情况,大概2点半这样。",
+      "time": "2026-07-14 11:11:28"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@念晨 明日计划给你加个知识蓝图输出中,然后约客户周三对焦哈",
+      "time": "2026-07-13 23:14:03"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "千启",
+      "text": "@陈叙 @念晨 @杨淑平 今日进展和明天计划记得同步下[送花花]",
+      "time": "2026-07-13 21:40:08"
+    },
+    {
+      "conversation": "【内】中控每日工作进展汇总群",
+      "sender": "粤腾",
+      "text": "还差一个情报助理和 知识库与中控制标Agent打通。  @杨淑平 情报助理看下周三能做到什么程度。 @念晨 知识库与中控制标Agent打通 需要在7 18 的demo演示中打通么。",
+      "time": "2026-07-13 16:43:23"
+    },
+    {
+      "conversation": "算法团队mentor群(内部讨论群)",
+      "sender": "璟琦(主用钉)",
+      "text": "@董鑫阳(念晨) https://acl.alibaba-inc.com/permission/datapermission/applyDetail.htm?spm=21540d8c.6248353e.0.0.6ae2264c9zDMFB&flowId=3cd438c0-2cee-4eac-a763-4625dbf2b51d",
+      "time": "2026-07-15 10:54:23"
+    },
+    {
+      "conversation": "算法团队mentor群(内部讨论群)",
+      "sender": "九韶",
+      "text": "@董鑫阳(念晨) 给你留了一个目标, 你抓紧更新,进去。 我给大哥先发一般",
+      "time": "2026-07-14 16:15:16"
+    },
+    {
+      "conversation": "算法团队mentor群(内部讨论群)",
+      "sender": "璟琦(主用钉)",
+      "text": "@董鑫阳(念晨) 你补一下 中控 及  专家agent 的部分",
+      "time": "2026-07-14 15:48:29"
+    },
+    {
+      "conversation": "算法团队mentor群(内部讨论群)",
+      "sender": "璟琦(主用钉)",
+      "text": "@董鑫阳(念晨) cli实现的时候这里面的能力最好都支持",
+      "time": "2026-07-14 10:49:39"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "筱淘",
+      "text": "@董鑫阳(念晨) 让客户再等等 明天见客户",
+      "time": "2026-07-15 09:48:49"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 没事,下次星爷的美人鱼2要在2028年上映了,到时候我们再一起翘班去",
+      "time": "2026-07-15 09:41:06"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@卢翮(龙衔) @董鑫阳(念晨) 去么去么",
+      "time": "2026-07-15 09:22:09"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) @蒋志刚(穆伦) @卢翮(龙衔) 去么,去么",
+      "time": "2026-07-15 09:16:18"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 哪个 HR 问你",
+      "time": "2026-07-15 09:10:25"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "穆伦",
+      "text": "@Dennis(念晨) 为啥这么问呢?你们那边没有好的位置?",
+      "time": "2026-07-15 09:05:14"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "筱淘",
+      "text": "@董鑫阳(念晨) 还等什么 来吧",
+      "time": "2026-07-15 09:00:21"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 害怕",
+      "time": "2026-07-14 22:01:18"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "穆伦",
+      "text": "@Dennis(念晨) 展开说说",
+      "time": "2026-07-14 16:39:26"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "龙衔",
+      "text": "@董鑫阳(念晨) 聊啥",
+      "time": "2026-07-14 16:36:03"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "穆伦",
+      "text": "@Dennis(念晨) 什么评价",
+      "time": "2026-07-14 16:33:04"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 我就说旁边有个车神经的滴滴我",
+      "time": "2026-07-14 13:04:30"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 赛银",
+      "time": "2026-07-14 12:51:33"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 刚才出来的车是你的呀",
+      "time": "2026-07-14 12:51:27"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 你最后一条为什么只出现一半",
+      "time": "2026-07-14 10:27:07"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) iPad or Mac?",
+      "time": "2026-07-14 10:23:28"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "龙衔",
+      "text": "@董鑫阳(念晨) 走,请你吃面",
+      "time": "2026-07-13 18:26:51"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "龙衔",
+      "text": "@董鑫阳(念晨) 茶叶忘了给你了 下次吃饭吧 头大 脑子不够了",
+      "time": "2026-07-13 14:14:22"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 下午你来",
+      "time": "2026-07-13 11:37:02"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 你是开个新卡,还是试试筱淘那个100多的",
+      "time": "2026-07-13 11:33:47"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨)",
+      "time": "2026-07-13 11:32:43"
+    },
+    {
+      "conversation": "AI全栈",
+      "sender": "怒龙",
+      "text": "@董鑫阳(念晨) 我给你开个卡?",
+      "time": "2026-07-13 11:28:36"
+    },
+    {
+      "conversation": "元智,九韶,璟琦(主用钉),念晨",
+      "sender": "元智",
+      "text": "@董鑫阳(念晨) 给力,scope更大了",
+      "time": "2026-07-14 15:39:19"
+    },
+    {
+      "conversation": "元智,九韶,璟琦(主用钉),念晨",
+      "sender": "九韶",
+      "text": "@董鑫阳(念晨) 汇报过了吗?  怎么样?",
+      "time": "2026-07-14 15:19:43"
+    },
+    {
+      "conversation": "[会议群]销售知识库方案讨论",
+      "sender": "赵瑞(玖霄)",
+      "text": "我来约你时间@念晨",
+      "time": "2026-07-14 12:37:23"
+    },
+    {
+      "conversation": "[会议群]销售知识库方案讨论",
+      "sender": "迦卢",
+      "text": "@赵瑞(玖霄) 你把需求和@念晨 对焦下",
+      "time": "2026-07-14 12:25:15"
+    },
+    {
+      "conversation": "[会议群]销售知识库方案讨论",
+      "sender": "迦卢",
+      "text": "@赵瑞(玖霄) @念晨 是知识库这边的技术架构师,目前还没有产品,但是他来进行和我们共创",
+      "time": "2026-07-13 17:48:48"
+    },
+    {
+      "conversation": "FDE Go",
+      "sender": "冬翔",
+      "text": "@董鑫阳(念晨) 你的Claude还是不能用?",
+      "time": "2026-07-14 10:22:12"
+    },
+    {
+      "conversation": "FDE Go",
+      "sender": "黎常",
+      "text": "@董鑫阳(念晨) 这个确实太傻逼了,放着好好优势不用",
+      "time": "2026-07-14 09:55:49"
+    }
+  ]
+}
dws chat +bot-find --query <query> --limit <limit> --cursor <cursor>read
搜索全部可用机器人(含他人/官方,返回 openDingTalkId 可发单聊)
dws mcp bot <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/search_bots
输入 / CLI 输出
输入
dws chat +bot-find --query x --limit 1 --cursor x --yes
stdout
{
+  "bots": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "bots": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1312ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +bot-find --query '测试' --limit 10 --cursor '' --yes --format json
真实 stdout
{
+  "bots": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "bots": [],
+  "count": 0
+}
dws chat +bot-search --page <page> --size <size> --name <name>read
搜索当前用户自己创建的机器人
dws mcp bot <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/search_my_robots
输入 / CLI 输出
输入
dws chat +bot-search --page 1 --size 1 --name x --yes
stdout
{
+  "count": 0,
+  "robots": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "robots": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1191ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +bot-search --page 1 --size 1 --name 'DWS shortcut 真实测试' --yes --format json
真实 stdout
{
+  "count": 0,
+  "robots": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "robots": []
+}
dws chat +broadcast --to <to> --text <text>write
按姓名逐一给多个人群发同一条单聊消息(自动解析 userId、逐个发送)
dws mcp chat <tool>dws chat +broadcast --to <to> --text <text>write复合/智能型
按姓名逐一给多个人群发同一条单聊消息(自动解析 userId、逐个发送)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;没有任何人收到消息,请检查姓名是否正确
输入 / CLI 输出
输入
dws chat +broadcast --to x --text x --yes
stdout
(空)
stderr / error
没有任何人收到消息,请检查姓名是否正确
最终用于判定的返回
没有任何人收到消息,请检查姓名是否正确
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2388ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +broadcast --to '冬翔,克谨,怒龙' --text 'DWS shortcut 修复复测 20260715:验证 chat +broadcast,请忽略。' --yes --format json
真实 stdout
{
+  "failedCount": 0,
+  "sent": [
+    "夏东翔",
+    "黄渊卓",
+    "刘力"
+  ],
+  "sentCount": 3
+}
真实 stderr / error
(空)
真实返回
{
+  "failedCount": 0,
+  "sent": [
+    "夏东翔",
+    "黄渊卓",
+    "刘力"
+  ],
+  "sentCount": 3
+}
dws chat +category-add-conversation --group <group> --category-ids <category-ids>write
将会话移动到指定的自定义分组中
dws mcp im add_conv_to_categories --json '{"openConversationId":<..>, "categoryIds":<..>}' lark im 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--category-ids: invalid integer "x"
输入 / CLI 输出
输入
dws chat +category-add-conversation --group x --category-ids x --yes
stdout
(空)
stderr / error
--category-ids: invalid integer "x"
最终用于判定的返回
--category-ids: invalid integer "x"
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1213ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test chat +category-add-conversation --group cidDWSREALTESTNOSUCHCONV --category-ids 999999999999 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/add_conv_to_categories)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999117776203e08f9"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/add_conv_to_categories)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999117776203e08f9"
+  }
+}
dws chat +category-create --title <title>write
创建用户自定义会话分组
dws mcp im create_conv_category --json '{"title":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/create_conv_category
输入 / CLI 输出
输入
dws chat +category-create --title x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "title": "x"
+  },
+  "product": "im",
+  "tool": "create_conv_category"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "title": "x"
+  },
+  "product": "im",
+  "tool": "create_conv_category"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=959ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +category-create --title 'DWS测0715' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "categoryId": 1784081668329
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "categoryId": 1784081668329
+  },
+  "success": true
+}
dws chat +category-delete --category-id <category-id>high-risk-write
删除用户自定义会话分组
dws mcp im delete_conv_category --json '{"categoryId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/delete_conv_category
输入 / CLI 输出
输入
dws chat +category-delete --category-id 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "categoryId": 1
+  },
+  "product": "im",
+  "tool": "delete_conv_category"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "categoryId": 1
+  },
+  "product": "im",
+  "tool": "delete_conv_category"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1378ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +category-delete --category-id 1784081668329 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "success": true
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "success": true
+  },
+  "success": true
+}
dws chat +category-listread
获取用户自定义会话分组
dws mcp im <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_user_define_conv_categories
输入 / CLI 输出
输入
dws chat +category-list --yes
stdout
{
+  "categories": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "categories": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1326ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +category-list --yes --format json
真实 stdout
{
+  "categories": [
+    {
+      "categoryId": 1561691365563,
+      "title": "大型摸鱼现场"
+    },
+    {
+      "categoryId": 1761880390389,
+      "title": "悟空"
+    },
+    {
+      "categoryId": 1561692216352,
+      "title": "钉钉"
+    },
+    {
+      "categoryId": 1761880350586,
+      "title": "RELU"
+    },
+    {
+      "categoryId": 1767577825401,
+      "title": "X Project"
+    },
+    {
+      "categoryId": 1770100726133,
+      "title": "A1合作"
+    },
+    {
+      "categoryId": 1764209474291,
+      "title": "CodeAgent"
+    },
+    {
+      "categoryId": 1764818531490,
+      "title": "DeepResearch"
+    },
+    {
+      "categoryId": 1765771015868,
+      "title": "J Project"
+    },
+    {
+      "categoryId": 1761881089886,
+      "title": "客户服务"
+    }
+  ],
+  "count": 10
+}
真实 stderr / error
(空)
真实返回
{
+  "categories": [
+    {
+      "categoryId": 1561691365563,
+      "title": "大型摸鱼现场"
+    },
+    {
+      "categoryId": 1761880390389,
+      "title": "悟空"
+    },
+    {
+      "categoryId": 1561692216352,
+      "title": "钉钉"
+    },
+    {
+      "categoryId": 1761880350586,
+      "title": "RELU"
+    },
+    {
+      "categoryId": 1767577825401,
+      "title": "X Project"
+    },
+    {
+      "categoryId": 1770100726133,
+      "title": "A1合作"
+    },
+    {
+      "categoryId": 1764209474291,
+      "title": "CodeAgent"
+    },
+    {
+      "categoryId": 1764818531490,
+      "title": "DeepResearch"
+    },
+    {
+      "categoryId": 1765771015868,
+      "title": "J Project"
+    },
+    {
+      "categoryId": 1761881089886,
+      "title": "客户服务"
+    }
+  ],
+  "count": 10
+}
dws chat +category-list-conversations --category-id <category-id> --exclude-muted <exclude-muted>read
拉取指定自定义会话分组下的会话
dws mcp im <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_conversations_by_category
输入 / CLI 输出
输入
dws chat +category-list-conversations --category-id 1 --exclude-muted --yes
stdout
{
+  "conversations": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "conversations": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1445ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +category-list-conversations --category-id 1 --exclude-muted --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listConversationsByCategoryV2 error\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840997724375834e0758"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listConversationsByCategoryV2 error\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840997724375834e0758"
+  }
+}
dws chat +category-remove-conversation --group <group> --category-ids <category-ids>write
将会话从指定的自定义分组中移出
dws mcp im remove_conv_from_categories --json '{"openConversationId":<..>, "categoryIds":<..>}' lark im 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--category-ids: invalid integer "x"
输入 / CLI 输出
输入
dws chat +category-remove-conversation --group x --category-ids x --yes
stdout
(空)
stderr / error
--category-ids: invalid integer "x"
最终用于判定的返回
--category-ids: invalid integer "x"
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1309ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test chat +category-remove-conversation --group cidDWSREALTESTNOSUCHCONV --category-ids 999999999999 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/remove_conv_from_categories)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999130466520e085e"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/remove_conv_from_categories)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999130466520e085e"
+  }
+}
dws chat +category-rename --category-id <category-id> --title <title>write
更新用户自定义会话分组的名称
dws mcp im rename_conv_category --json '{"categoryId":<..>, "title":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/rename_conv_category
输入 / CLI 输出
输入
dws chat +category-rename --category-id 1 --title x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "categoryId": 1,
+    "title": "x"
+  },
+  "product": "im",
+  "tool": "rename_conv_category"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "categoryId": 1,
+    "title": "x"
+  },
+  "product": "im",
+  "tool": "rename_conv_category"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1225ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +category-rename --category-id 1784081668329 --title 'DWS改0715' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-add-bot --robot-code <robot-code> --id <id>write
将机器人添加到群中
dws mcp bot add_robot_to_group --json '{"robotCode":<..>, "openConversationId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/add_robot_to_group
输入 / CLI 输出
输入
dws chat +chat-add-bot --robot-code x --id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "robotCode": "x"
+  },
+  "product": "bot",
+  "tool": "add_robot_to_group"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "robotCode": "x"
+  },
+  "product": "bot",
+  "tool": "add_robot_to_group"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1273ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test chat +chat-add-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: bot/add_robot_to_group)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "500025",
+    "server_key": "bot",
+    "trace_id": "2104a64c17840999144193460e08c7"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: bot/add_robot_to_group)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "500025",
+    "server_key": "bot",
+    "trace_id": "2104a64c17840999144193460e08c7"
+  }
+}
dws chat +chat-audit-join --group <group> --record-id <record-id> --applicant <applicant> --inviter <inviter> --status <status> --description <description>write
审批入群验证(通过/拒绝/删除/忽略/拉黑)
dws mcp im audit_join_group --json '{"openConversationId":<..>, "applyRecordId":<..>, "applicantOpenDingTalkId":<..>, "inviterOpenDingTalkId":<..>, "status":<..>, "auditDescription":<..>}'dws mcp im audit_join_group --json '{"openConversationId":<..>, "applyRecordId":<..>, "applicantUid":<..>, "inviterUid":<..>, "status":<..>, "auditDescription":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/audit_join_group
输入 / CLI 输出
输入
dws chat +chat-audit-join --group x --record-id 1 --applicant x --inviter x --status AuditApprove --description x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "applicantUid": "x",
+    "applyRecordId": 1,
+    "auditDescription": "x",
+    "inviterUid": "x",
+    "openConversationId": "x",
+    "status": "AuditApprove"
+  },
+  "product": "im",
+  "tool": "audit_join_group"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "applicantUid": "x",
+    "applyRecordId": 1,
+    "auditDescription": "x",
+    "inviterUid": "x",
+    "openConversationId": "x",
+    "status": "AuditApprove"
+  },
+  "product": "im",
+  "tool": "audit_join_group"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1073ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+dry-run 已证明 CLI 装配了 applicantUid/inviterUid;真实后端仍报 applicantUid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +chat-audit-join --group cidDWSREALTESTNOSUCHCONV --record-id 999999999999 --applicant 103262 --inviter 519019 --status AuditApprove --description 'DWS shortcut 真实测试描述,可删除' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] applicantUid is required (operation: im/audit_join_group)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999154832733e0758"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] applicantUid is required (operation: im/audit_join_group)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999154832733e0758"
+  }
+}
dws chat +chat-bots --group <group>read
查看群内所有机器人
dws mcp bot <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/list_group_bots
输入 / CLI 输出
输入
dws chat +chat-bots --group x --yes
stdout
{
+  "bots": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "bots": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=907ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-bots --group cid3Jijzhe2aqs9ysOXjhi05g== --yes --format json
真实 stdout
{
+  "bots": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "bots": [],
+  "count": 0
+}
dws chat +chat-dismiss --group <group>high-risk-write
解散群聊(不可逆,需群主权限)
dws mcp im dismiss_group --json '{"openConversationId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/dismiss_group
输入 / CLI 输出
输入
dws chat +chat-dismiss --group x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "dismiss_group"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "dismiss_group"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1120ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-dismiss --group cidXgIVDDzZE7kdQ+bcp3gWNw== --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-get-by-id --group-id <group-id>read
根据群号获取群聊信息
dws mcp im get_conv_info_by_group_id --json '{"groupId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/get_conv_info_by_group_id
输入 / CLI 输出
输入
dws chat +chat-get-by-id --group-id 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "groupId": 1
+  },
+  "product": "im",
+  "tool": "get_conv_info_by_group_id"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "groupId": 1
+  },
+  "product": "im",
+  "tool": "get_conv_info_by_group_id"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1462ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +chat-get-by-id --group-id 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] verifyGroupId error: The group id does not exit (operation: im/get_conv_info_by_group_id)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840997739165535e07bd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] verifyGroupId error: The group id does not exit (operation: im/get_conv_info_by_group_id)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840997739165535e07bd"
+  }
+}
dws chat +chat-invite-url --group <group> --expires-seconds <expires-seconds>read
获取群邀请链接
dws mcp im get_group_invite_url --json '{"openConversationId":<..>, "expiresSeconds":<..>}'dws mcp im get_group_invite_url --json '{"openConversationId":<..>, "cid":<..>, "expiresSeconds":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/get_group_invite_url
输入 / CLI 输出
输入
dws chat +chat-invite-url --group x --expires-seconds 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "expiresSeconds": 1,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "get_group_invite_url"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "expiresSeconds": 1,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "get_group_invite_url"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=958ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-invite-url --group cid3Jijzhe2aqs9ysOXjhi05g== --expires-seconds 1 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "inviteUrl": "https://qr.dingtalk.com/action/joingroup?code=v1,k1,Rj9aR+97xuRdK0cKsvoU/daj0MZj7p02n7pETjkgcMo=\u0026_dt_no_comment=1\u0026origin=11"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "inviteUrl": "https://qr.dingtalk.com/action/joingroup?code=v1,k1,Rj9aR+97xuRdK0cKsvoU/daj0MZj7p02n7pETjkgcMo=\u0026_dt_no_comment=1\u0026origin=11"
+  },
+  "success": true
+}
dws chat +chat-list-all --limit <limit> --cursor <cursor>read
分页拉取我加入的所有群列表
dws mcp im <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_my_groups_pagination
输入 / CLI 输出
输入
dws chat +chat-list-all --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "groups": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "groups": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1043ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-list-all --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "count": 9,
+  "groups": [
+    {
+      "name": "浅曦-kida,Dennis,秋画",
+      "openConversationId": "cid3Jijzhe2aqs9ysOXjhi05g=="
+    },
+    {
+      "name": "Dennis,梨岚,浅曦,秋画",
+      "openConversationId": "cidBRb3r823j/rs8mGdPervyQ=="
+    },
+    {
+      "name": "HISTORE_DINGDING_VOIP_APP",
+      "openConversationId": "cid68WRQRLAWFUvSWPjFTxQEg=="
+    },
+    {
+      "name": "钉钉19届应届生校招群",
+      "openConversationId": "cidsXjWvcYMguAWhhE6x1PsRw=="
+    },
+    {
+      "name": "钉钉尖角班第21期欢迎你!",
+      "openConversationId": "cid2YTSHeguqsO/PjSu33/IRA=="
+    },
+    {
+      "name": "钉子户",
+      "openConversationId": "cidCVNiNIaY1vsA6Hp0rUvk7w=="
+    },
+    {
+      "name": "应用通知",
+      "openConversationId": "cidPrcdDg1wZb3/0oQRIWxVRw=="
+    },
+    {
+      "name": "三口之家",
+      "openConversationId": "cid8eLJsKOY3EwulLUqD3jVbA=="
+    },
+    {
+      "name": "工作通知:三口之家",
+      "openConversationId": "cidAHnUfD5n2F+Ybdsqeu9ymQ=="
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 9,
+  "groups": [
+    {
+      "name": "浅曦-kida,Dennis,秋画",
+      "openConversationId": "cid3Jijzhe2aqs9ysOXjhi05g=="
+    },
+    {
+      "name": "Dennis,梨岚,浅曦,秋画",
+      "openConversationId": "cidBRb3r823j/rs8mGdPervyQ=="
+    },
+    {
+      "name": "HISTORE_DINGDING_VOIP_APP",
+      "openConversationId": "cid68WRQRLAWFUvSWPjFTxQEg=="
+    },
+    {
+      "name": "钉钉19届应届生校招群",
+      "openConversationId": "cidsXjWvcYMguAWhhE6x1PsRw=="
+    },
+    {
+      "name": "钉钉尖角班第21期欢迎你!",
+      "openConversationId": "cid2YTSHeguqsO/PjSu33/IRA=="
+    },
+    {
+      "name": "钉子户",
+      "openConversationId": "cidCVNiNIaY1vsA6Hp0rUvk7w=="
+    },
+    {
+      "name": "应用通知",
+      "openConversationId": "cidPrcdDg1wZb3/0oQRIWxVRw=="
+    },
+    {
+      "name": "三口之家",
+      "openConversationId": "cid8eLJsKOY3EwulLUqD3jVbA=="
+    },
+    {
+      "name": "工作通知:三口之家",
+      "openConversationId": "cidAHnUfD5n2F+Ybdsqeu9ymQ=="
+    }
+  ]
+}
dws chat +chat-list-join-requests --limit <limit> --cursor <cursor>read
分页拉取入群验证记录
dws mcp im list_apply_join_group_records --json '{"limit":<..>, "cursor":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_apply_join_group_records
输入 / CLI 输出
输入
dws chat +chat-list-join-requests --limit 1 --cursor x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cursor": "x",
+    "limit": 1
+  },
+  "product": "im",
+  "tool": "list_apply_join_group_records"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cursor": "x",
+    "limit": 1
+  },
+  "product": "im",
+  "tool": "list_apply_join_group_records"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=960ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-list-join-requests --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "hasMore": false,
+    "nextCursor": 0,
+    "records": []
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "hasMore": false,
+    "nextCursor": 0,
+    "records": []
+  },
+  "success": true
+}
dws chat +chat-list-mine --role <role> --limit <limit> --exclude-muted <exclude-muted>read
拉取我创建/管理的群
dws mcp im <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_owned_or_admin_groups
输入 / CLI 输出
输入
dws chat +chat-list-mine --role OWNER --limit 1 --exclude-muted --yes
stdout
{
+  "count": 0,
+  "groups": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "groups": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1799ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-list-mine --role OWNER --limit 10 --exclude-muted --yes --format json
真实 stdout
{
+  "count": 10,
+  "groups": [
+    {
+      "name": "DING_VIBE_CODING没统计到token的问题",
+      "openConversationId": "cidl/foiVj/HRZjBxQI4+Y81g=="
+    },
+    {
+      "name": "钉钉 EveryDay X RELU 共创",
+      "openConversationId": "cid7XlLm5toebOyqw0J3GJfmA=="
+    },
+    {
+      "name": "中控测试",
+      "openConversationId": "cidwnTdZmw2YMznZKLOmws9VQ=="
+    },
+    {
+      "name": "国粹候选人",
+      "openConversationId": "cidw+0WK0/N8nrKwvcgpg6AJQ=="
+    },
+    {
+      "name": "X 项目算法支持",
+      "openConversationId": "cidbDGRPLyhdI1/b85MiUSz5Q=="
+    },
+    {
+      "name": "悟空 Agent Runtime Scrum",
+      "openConversationId": "cidCAHeQDMT93RTArxiqBJLiA=="
+    },
+    {
+      "name": "电商刊登接入CodeAgent",
+      "openConversationId": "cid6IhuGpSIpuosGTGusYUc2g=="
+    },
+    {
+      "name": "0529机器人 && 移动端中控问题跟进",
+      "openConversationId": "cidXMfbCGTSiHzLLaRV5WDXgw=="
+    },
+    {
+      "name": "念晨,伊玲,双数",
+      "openConversationId": "cid/xM8a62lWiQGkfgLi4kfhA=="
+    },
+    {
+      "name": "方齐,念晨,向尘",
+      "openConversationId": "cidpG74/BF0DPbkIHS42XPZZg=="
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 10,
+  "groups": [
+    {
+      "name": "DING_VIBE_CODING没统计到token的问题",
+      "openConversationId": "cidl/foiVj/HRZjBxQI4+Y81g=="
+    },
+    {
+      "name": "钉钉 EveryDay X RELU 共创",
+      "openConversationId": "cid7XlLm5toebOyqw0J3GJfmA=="
+    },
+    {
+      "name": "中控测试",
+      "openConversationId": "cidwnTdZmw2YMznZKLOmws9VQ=="
+    },
+    {
+      "name": "国粹候选人",
+      "openConversationId": "cidw+0WK0/N8nrKwvcgpg6AJQ=="
+    },
+    {
+      "name": "X 项目算法支持",
+      "openConversationId": "cidbDGRPLyhdI1/b85MiUSz5Q=="
+    },
+    {
+      "name": "悟空 Agent Runtime Scrum",
+      "openConversationId": "cidCAHeQDMT93RTArxiqBJLiA=="
+    },
+    {
+      "name": "电商刊登接入CodeAgent",
+      "openConversationId": "cid6IhuGpSIpuosGTGusYUc2g=="
+    },
+    {
+      "name": "0529机器人 && 移动端中控问题跟进",
+      "openConversationId": "cidXMfbCGTSiHzLLaRV5WDXgw=="
+    },
+    {
+      "name": "念晨,伊玲,双数",
+      "openConversationId": "cid/xM8a62lWiQGkfgLi4kfhA=="
+    },
+    {
+      "name": "方齐,念晨,向尘",
+      "openConversationId": "cidpG74/BF0DPbkIHS42XPZZg=="
+    }
+  ]
+}
dws chat +chat-members-get --id <id> --users <users>read
根据成员 openDingTalkId 批量查询群成员详情
dws mcp im list_group_member_by_ids --json '{"openConversationId":<..>, "memberOpenDingTalkIds":<..>}'dws mcp im list_group_member_by_ids --json '{"openConversationId":<..>, "cid":<..>, "memberOpenDingTalkIds":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_group_member_by_ids
输入 / CLI 输出
输入
dws chat +chat-members-get --id x --users x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "memberOpenDingTalkIds": [
+      "x"
+    ],
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "list_group_member_by_ids"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "memberOpenDingTalkIds": [
+      "x"
+    ],
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "list_group_member_by_ids"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1518ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +chat-members-get --id DWSREALREADNOSUCHID0000000000000 --users '冬翔' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openCid or cid is required (operation: im/list_group_member_by_ids)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840997754345760e07bd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openCid or cid is required (operation: im/list_group_member_by_ids)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840997754345760e07bd"
+  }
+}
dws chat +chat-messages --group <group> --user <user> --time <time> --limit <limit> --direction <direction>read
拉取某个会话(群聊或单聊)的消息列表并投影出发言人/文本/时间
dws mcp chat <tool>dws chat +chat-messages --group <group> --user <user> --time <time> --limit <limit> --direction <direction>read复合/智能型
拉取某个会话(群聊或单聊)的消息列表并投影出发言人/文本/时间
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark im 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);参数 --group、--user 只能指定其一(当前指定了 --group、--user)
输入 / CLI 输出
输入
dws chat +chat-messages --group x --user x --time x --limit 1 --direction x --yes
stdout
(空)
stderr / error
参数 --group、--user 只能指定其一(当前指定了 --group、--user)
最终用于判定的返回
参数 --group、--user 只能指定其一(当前指定了 --group、--user)
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1328ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +chat-messages --group cid3Jijzhe2aqs9ysOXjhi05g== --time '2026-07-15 10:00:00' --limit 10 --direction older --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openCid or cid is required\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "chat",
+    "trace_id": "2104a64c17840997767792656e085e"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openCid or cid is required\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "chat",
+    "trace_id": "2104a64c17840997767792656e085e"
+  }
+}
dws chat +chat-mute --group <group> --off <off>write
全员禁言 / 取消全员禁言
dws mcp im set_group_mute --json '{"openConversationId":<..>, "mute":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/set_group_mute
输入 / CLI 输出
输入
dws chat +chat-mute --group x --off --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "mute": false,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "set_group_mute"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "mute": false,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "set_group_mute"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1252ms;real-backend-manual-write cleanup/unmute; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-mute --group cidXgIVDDzZE7kdQ+bcp3gWNw== --off --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-mute-member --group <group> --users <users> --mute-time <mute-time> --off <off>write
指定群成员禁言 / 取消禁言
dws mcp im set_group_member_mute_list --json '{"openConversationId":<..>, "mute":<..>, "uids":<..>, "openDingTalkIds":<..>, "muteTime":<..>}'dws mcp im set_group_member_mute_list --json '{"openConversationId":<..>, "cid":<..>, "mute":<..>, "uids":<..>, "openDingTalkIds":<..>, "muteTime":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/set_group_member_mute_list
输入 / CLI 输出
输入
dws chat +chat-mute-member --group x --users x --mute-time 1 --off --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "mute": false,
+    "openConversationId": "x",
+    "uids": [
+      "x"
+    ]
+  },
+  "product": "im",
+  "tool": "set_group_member_mute_list"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "mute": false,
+    "openConversationId": "x",
+    "uids": [
+      "x"
+    ]
+  },
+  "product": "im",
+  "tool": "set_group_member_mute_list"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1139ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +chat-mute-member --group cidDWSREALTESTNOSUCHCONV --users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --mute-time 1 --off --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_group_member_mute_list)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999166036583e08a3"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_group_member_mute_list)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999166036583e08a3"
+  }
+}
dws chat +chat-quit --group <group>write
退出群聊
dws mcp im quit_group --json '{"openConversationId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/quit_group
输入 / CLI 输出
输入
dws chat +chat-quit --group x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "quit_group"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "quit_group"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1162ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +chat-quit --group cidDWSREALTESTNOSUCHCONV --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/quit_group)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999176728426e0779"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/quit_group)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999176728426e0779"
+  }
+}
dws chat +chat-remove-bot --id <id> --bot-id <bot-id>high-risk-write
从群内移除机器人
dws mcp bot remove_robot_in_group --json '{"openConversationId":<..>, "openBotId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/remove_robot_in_group
输入 / CLI 输出
输入
dws chat +chat-remove-bot --id x --bot-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openBotId": "x",
+    "openConversationId": "x"
+  },
+  "product": "bot",
+  "tool": "remove_robot_in_group"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openBotId": "x",
+    "openConversationId": "x"
+  },
+  "product": "bot",
+  "tool": "remove_robot_in_group"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1220ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +chat-remove-bot --id DWSREALTESTNOSUCHID0000000000000 --bot-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 无效的会话 (operation: bot/remove_robot_in_group)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "500009",
+    "server_key": "bot",
+    "trace_id": "0b5deb3217840999189888305e08b5"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 无效的会话 (operation: bot/remove_robot_in_group)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "500009",
+    "server_key": "bot",
+    "trace_id": "0b5deb3217840999189888305e08b5"
+  }
+}
dws chat +chat-role-add --group <group> --name <name>write
添加群身份
dws mcp im add_custom_group_role --json '{"openConversationId":<..>, "name":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/add_custom_group_role
输入 / CLI 输出
输入
dws chat +chat-role-add --group x --name x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "name": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "add_custom_group_role"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "name": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "add_custom_group_role"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1281ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-role-add --group cidXgIVDDzZE7kdQ+bcp3gWNw== --name 'DWS测试角色' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openRoleId": "role9G67RdPFmhF1VxBpguhr1QiEiE"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openRoleId": "role9G67RdPFmhF1VxBpguhr1QiEiE"
+  },
+  "success": true
+}
dws chat +chat-role-list --group <group>read
拉取会话的群身份列表
dws mcp im <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_custom_group_roles
输入 / CLI 输出
输入
dws chat +chat-role-list --group x --yes
stdout
{
+  "count": 0,
+  "roles": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "roles": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=928ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-role-list --group cid3Jijzhe2aqs9ysOXjhi05g== --yes --format json
真实 stdout
{
+  "count": 0,
+  "roles": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "roles": []
+}
dws chat +chat-role-query-user --group <group> --user <user>read
查询群成员的群身份
dws mcp im query_custom_user_roles --json '{"openConversationId":<..>, "openDingTalkId":<..>, "userId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/query_custom_user_roles
输入 / CLI 输出
输入
dws chat +chat-role-query-user --group x --user x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "userId": "x"
+  },
+  "product": "im",
+  "tool": "query_custom_user_roles"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "userId": "x"
+  },
+  "product": "im",
+  "tool": "query_custom_user_roles"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=958ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-role-query-user --group cid3Jijzhe2aqs9ysOXjhi05g== --user '冬翔' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "roles": []
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "roles": []
+  },
+  "success": true
+}
dws chat +chat-role-remove --group <group> --role-id <role-id>high-risk-write
删除群身份
dws mcp im remove_custom_group_role --json '{"openConversationId":<..>, "openRoleId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/remove_custom_group_role
输入 / CLI 输出
输入
dws chat +chat-role-remove --group x --role-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openRoleId": "x"
+  },
+  "product": "im",
+  "tool": "remove_custom_group_role"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openRoleId": "x"
+  },
+  "product": "im",
+  "tool": "remove_custom_group_role"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1054ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +chat-role-remove --group cidDWSREALTESTNOSUCHCONV --role-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_group_role)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999200483204e079c"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_group_role)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999200483204e079c"
+  }
+}
dws chat +chat-role-remove-user --group <group> --user <user> --role-ids <role-ids>write
移除用户的指定群身份
dws mcp im remove_custom_user_roles --json '{"openConversationId":<..>, "openRoleIds":<..>, "openDingTalkId":<..>, "userId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/remove_custom_user_roles
输入 / CLI 输出
输入
dws chat +chat-role-remove-user --group x --user x --role-ids x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openRoleIds": [
+      "x"
+    ],
+    "userId": "x"
+  },
+  "product": "im",
+  "tool": "remove_custom_user_roles"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openRoleIds": [
+      "x"
+    ],
+    "userId": "x"
+  },
+  "product": "im",
+  "tool": "remove_custom_user_roles"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1104ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +chat-role-remove-user --group cidDWSREALTESTNOSUCHCONV --user __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --role-ids DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_user_roles)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999211317952e0757"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_user_roles)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999211317952e0757"
+  }
+}
dws chat +chat-role-set-user --group <group> --user <user> --role-ids <role-ids>write
设置用户的群身份(覆盖该用户的全部群身份)
dws mcp im set_custom_user_roles --json '{"openConversationId":<..>, "openRoleIds":<..>, "openDingTalkId":<..>, "userId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/set_custom_user_roles
输入 / CLI 输出
输入
dws chat +chat-role-set-user --group x --user x --role-ids x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openRoleIds": [
+      "x"
+    ],
+    "userId": "x"
+  },
+  "product": "im",
+  "tool": "set_custom_user_roles"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openRoleIds": [
+      "x"
+    ],
+    "userId": "x"
+  },
+  "product": "im",
+  "tool": "set_custom_user_roles"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1355ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-role-set-user --group cidXgIVDDzZE7kdQ+bcp3gWNw== --user 103262 --role-ids role9G67RdPFmhF1VxBpguhr1QiEiE --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-role-update --group <group> --role-id <role-id> --name <name>write
更新群身份名称
dws mcp im update_custom_group_role --json '{"openConversationId":<..>, "openRoleId":<..>, "name":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_custom_group_role
输入 / CLI 输出
输入
dws chat +chat-role-update --group x --role-id x --name x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "name": "x",
+    "openConversationId": "x",
+    "openRoleId": "x"
+  },
+  "product": "im",
+  "tool": "update_custom_group_role"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "name": "x",
+    "openConversationId": "x",
+    "openRoleId": "x"
+  },
+  "product": "im",
+  "tool": "update_custom_group_role"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1366ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-role-update --group cidXgIVDDzZE7kdQ+bcp3gWNw== --role-id role9G67RdPFmhF1VxBpguhr1QiEiE --name 'DWS角色改' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-search --query <query> --limit <limit> --cursor <cursor> --exclude-muted <exclude-muted>read
按关键词搜索群聊
dws mcp im search_groups --json '{"keyword":<..>, "limit":<..>, "cursor":<..>, "excludeMuted":<..>}' lark-cli im +chat-search已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/search_groups
输入 / CLI 输出
输入
dws chat +chat-search --query x --limit 1 --cursor x --exclude-muted --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cursor": "x",
+    "excludeMuted": true,
+    "keyword": "x",
+    "limit": 1
+  },
+  "product": "im",
+  "tool": "search_groups"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cursor": "x",
+    "excludeMuted": true,
+    "keyword": "x",
+    "limit": 1
+  },
+  "product": "im",
+  "tool": "search_groups"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1176ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-search --query '测试' --limit 10 --cursor 0 --exclude-muted --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "groups": [
+      {
+        "channel": false,
+        "createAt": "2026-06-09 09:21:07",
+        "extension": {
+          "newCSpaceIdIM": "29001572040"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 4,
+        "openConversationId": "cidYmSrmbqMM/OseCzcs4cJdg==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "测试群已废弃"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-06-09 09:21:00",
+        "extension": {
+          "newCSpaceIdIM": "29001813316"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 3,
+        "openConversationId": "cidSIMPP2TD6HZcn1nO0mVNoA==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "测试群已废弃"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-05-13 16:22:30",
+        "extension": {
+          "newCSpaceIdIM": "28540426059"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 70,
+        "openConversationId": "cidU38vTWZbweyBRT71Md/KJQ==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UXSDzdMWL3Ls3VUvhTCwbT",
+        "title": "测试项目沟通群"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-04-24 11:49:36",
+        "extension": {
+          "newCSpaceIdIM": "28740101247"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 2,
+        "openConversationId": "cidOpAz1EH8TLuD9H1Who48pw==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "测试项目沟通群"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-06-26 14:05:19",
+        "extension": {
+          "newCSpaceIdIM": "29101779299"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 2,
+        "openConversationId": "cidp+Oj7m1gJnx+bCtTn3vhcQ==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "Spur测试"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-07-02 11:26:29",
+        "extension": {
+          "newCSpaceIdIM": "29137611383"
+        },
+        "groupType": "NEW_EXTERNAL_GROUP",
+        "memberCount": 1,
+        "openConversationId": "cidwnTdZmw2YMznZKLOmws9VQ==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "中控测试"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-06-09 11:03:12",
+        "extension": {
+          "newCSpaceIdIM": "29002815625"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 2,
+        "openConversationId": "cid3hq0VEj6C6FtEtDsWCtNwg==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "评测复盘讨论群-测试"
+      },
+      {
+        "channel": true,
+        "createAt": "2026-03-24 18:10:34",
+        "extension": {
+          "newCSpaceIdIM": "28494427717"
+        },
+        "groupType": "NEW_EXTERNAL_GROUP",
+        "memberCount": 2628,
+        "openConversationId": "cidm6kkku3iW/ddE/DuoWOEnQ==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3XSNFHTUgOrXFyf7hpLIgii2",
+        "title": "悟空问题反馈群"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-05-13 16:23:30",
+        "extension": {
+          "newCSpaceIdIM": "28540433569"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 71,
+        "openConversationId": "cidzoNLz/wgp7gRm/mRph+MxA==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UXSDzdMWL3Ls3VUvhTCwbT",
+        "title": "日常消息同步群"
+      }
+    ],
+    "hasMore": true,
+    "nextCursor": "da8b2b5ea0a50c4ae90dcf38edde9f52425c3bb1dd7cb1eddf53e7db6b73b3c4299e03fd01b0cf917b20e2f46a4f5e13bb7a1bd722cf6c4a372c6971d3c37fb7a3301ae0e438d2556a38ae1fc9c6ee9c110732c3d5d829998a367dc7ebd3a0f639e2dc0841255be944cf07a406575e4cbee22cfca7f309a6bba4d6c35f7d3bd05ce9af894fd2f107f264c0c16d61f6c778e2c2e5c3ea05bc0f77ae6cd7bf402f77218ef7439e2483e5348b3cc40b6a28eeb87bc58925bff5a69d0b080d3818ef1eed93958ffb401cb286b4e885564950f46fa42ad85b4161fd5752f840865648c4e2a89a26f8e241ee476d17a8a2352feb4e1f7d97b28d69aeba429b1e6565fd9acc3e2aa71ec6c05d0a31d90c451aa3"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "groups": [
+      {
+        "channel": false,
+        "createAt": "2026-06-09 09:21:07",
+        "extension": {
+          "newCSpaceIdIM": "29001572040"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 4,
+        "openConversationId": "cidYmSrmbqMM/OseCzcs4cJdg==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "测试群已废弃"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-06-09 09:21:00",
+        "extension": {
+          "newCSpaceIdIM": "29001813316"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 3,
+        "openConversationId": "cidSIMPP2TD6HZcn1nO0mVNoA==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "测试群已废弃"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-05-13 16:22:30",
+        "extension": {
+          "newCSpaceIdIM": "28540426059"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 70,
+        "openConversationId": "cidU38vTWZbweyBRT71Md/KJQ==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UXSDzdMWL3Ls3VUvhTCwbT",
+        "title": "测试项目沟通群"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-04-24 11:49:36",
+        "extension": {
+          "newCSpaceIdIM": "28740101247"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 2,
+        "openConversationId": "cidOpAz1EH8TLuD9H1Who48pw==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "测试项目沟通群"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-06-26 14:05:19",
+        "extension": {
+          "newCSpaceIdIM": "29101779299"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 2,
+        "openConversationId": "cidp+Oj7m1gJnx+bCtTn3vhcQ==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "Spur测试"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-07-02 11:26:29",
+        "extension": {
+          "newCSpaceIdIM": "29137611383"
+        },
+        "groupType": "NEW_EXTERNAL_GROUP",
+        "memberCount": 1,
+        "openConversationId": "cidwnTdZmw2YMznZKLOmws9VQ==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "中控测试"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-06-09 11:03:12",
+        "extension": {
+          "newCSpaceIdIM": "29002815625"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 2,
+        "openConversationId": "cid3hq0VEj6C6FtEtDsWCtNwg==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "title": "评测复盘讨论群-测试"
+      },
+      {
+        "channel": true,
+        "createAt": "2026-03-24 18:10:34",
+        "extension": {
+          "newCSpaceIdIM": "28494427717"
+        },
+        "groupType": "NEW_EXTERNAL_GROUP",
+        "memberCount": 2628,
+        "openConversationId": "cidm6kkku3iW/ddE/DuoWOEnQ==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3XSNFHTUgOrXFyf7hpLIgii2",
+        "title": "悟空问题反馈群"
+      },
+      {
+        "channel": false,
+        "createAt": "2026-05-13 16:23:30",
+        "extension": {
+          "newCSpaceIdIM": "28540433569"
+        },
+        "groupType": "INTERNAL_GROUP",
+        "memberCount": 71,
+        "openConversationId": "cidzoNLz/wgp7gRm/mRph+MxA==",
+        "ownerOpenDingtalkId": "D1jIqGatuH3UXSDzdMWL3Ls3VUvhTCwbT",
+        "title": "日常消息同步群"
+      }
+    ],
+    "hasMore": true,
+    "nextCursor": "da8b2b5ea0a50c4ae90dcf38edde9f52425c3bb1dd7cb1eddf53e7db6b73b3c4299e03fd01b0cf917b20e2f46a4f5e13bb7a1bd722cf6c4a372c6971d3c37fb7a3301ae0e438d2556a38ae1fc9c6ee9c110732c3d5d829998a367dc7ebd3a0f639e2dc0841255be944cf07a406575e4cbee22cfca7f309a6bba4d6c35f7d3bd05ce9af894fd2f107f264c0c16d61f6c778e2c2e5c3ea05bc0f77ae6cd7bf402f77218ef7439e2483e5348b3cc40b6a28eeb87bc58925bff5a69d0b080d3818ef1eed93958ffb401cb286b4e885564950f46fa42ad85b4161fd5752f840865648c4e2a89a26f8e241ee476d17a8a2352feb4e1f7d97b28d69aeba429b1e6565fd9acc3e2aa71ec6c05d0a31d90c451aa3"
+  },
+  "success": true
+}
dws chat +chat-set-admin --group <group> --users <users> --off <off>write
设置 / 取消群管理员
dws mcp im update_conv_member_roles --json '{"openConversationId":<..>, "admin":<..>, "uids":<..>, "openDingTalkIds":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_conv_member_roles
输入 / CLI 输出
输入
dws chat +chat-set-admin --group x --users x --off --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "admin": false,
+    "openConversationId": "x",
+    "uids": [
+      "x"
+    ]
+  },
+  "product": "im",
+  "tool": "update_conv_member_roles"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "admin": false,
+    "openConversationId": "x",
+    "uids": [
+      "x"
+    ]
+  },
+  "product": "im",
+  "tool": "update_conv_member_roles"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1554ms;real-backend-manual-write cleanup/unset-admin; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-set-admin --group cidXgIVDDzZE7kdQ+bcp3gWNw== --users 103262 --off --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-set-history --group <group> --option <option>write
设置新成员入群可查看历史消息范围
dws mcp im update_show_history_msg_option --json '{"openConversationId":<..>, "option":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_show_history_msg_option
输入 / CLI 输出
输入
dws chat +chat-set-history --group x --option FORBIDDEN --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "option": "FORBIDDEN"
+  },
+  "product": "im",
+  "tool": "update_show_history_msg_option"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "option": "FORBIDDEN"
+  },
+  "product": "im",
+  "tool": "update_show_history_msg_option"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1219ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-set-history --group cidXgIVDDzZE7kdQ+bcp3gWNw== --option RECENT_100 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-transfer-owner --group <group> --new-owner <new-owner>write
转让群主
dws mcp im transfer_group_owner --json '{"openConversationId":<..>, "newOwnerOpenDingTalkId":<..>, "newOwnerUid":<..>}'dws mcp im transfer_group_owner --json '{"openConversationId":<..>, "cid":<..>, "newOwnerOpenDingTalkId":<..>, "newOwnerUid":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/transfer_group_owner
输入 / CLI 输出
输入
dws chat +chat-transfer-owner --group x --new-owner x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "newOwnerUid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "transfer_group_owner"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "newOwnerUid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "transfer_group_owner"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1054ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +chat-transfer-owner --group cidDWSREALTESTNOSUCHCONV --new-owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId is required (operation: im/transfer_group_owner)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999222318863e087a"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId is required (operation: im/transfer_group_owner)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999222318863e087a"
+  }
+}
dws chat +chat-update-alias --group <group> --alias-title <alias-title>write
设置群备注(仅自己可见)
dws mcp im update_user_group_alias --json '{"openConversationId":<..>, "aliasTitle":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_user_group_alias
输入 / CLI 输出
输入
dws chat +chat-update-alias --group x --alias-title x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "aliasTitle": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_user_group_alias"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "aliasTitle": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_user_group_alias"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1298ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-update-alias --group cidXgIVDDzZE7kdQ+bcp3gWNw== --alias-title 'DWS群备注' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-update-icon --group <group> --icon-media-id <icon-media-id>write
更新群头像
dws mcp im update_group_icon --json '{"openConversationId":<..>, "iconMediaId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_group_icon
输入 / CLI 输出
输入
dws chat +chat-update-icon --group x --icon-media-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "iconMediaId": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_group_icon"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "iconMediaId": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_group_icon"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1023ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +chat-update-icon --group cidDWSREALTESTNOSUCHCONV --icon-media-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/update_group_icon)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999232478654e0819"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/update_group_icon)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999232478654e0819"
+  }
+}
dws chat +chat-update-nick --group <group> --nick <nick>write
设置当前用户在群内的群昵称
dws mcp im update_group_nick --json '{"openConversationId":<..>, "nick":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_group_nick
输入 / CLI 输出
输入
dws chat +chat-update-nick --group x --nick x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nick": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_group_nick"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nick": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_group_nick"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1478ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +chat-update-nick --group cidXgIVDDzZE7kdQ+bcp3gWNw== --nick 'DWS测试' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +chat-update-settings --group <group> --setting-key <setting-key> --status <status>write
更新群设置(settingKey + status)
dws mcp im update_group_settings --json '{"openConversationId":<..>, "settingKey":<..>, "status":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_group_settings
输入 / CLI 输出
输入
dws chat +chat-update-settings --group x --setting-key x --status 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "settingKey": "x",
+    "status": 1
+  },
+  "product": "im",
+  "tool": "update_group_settings"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "settingKey": "x",
+    "status": 1
+  },
+  "product": "im",
+  "tool": "update_group_settings"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1184ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +chat-update-settings --group cidDWSREALTESTNOSUCHCONV --setting-key x --status 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] unsupported setting key: x (operation: im/update_group_settings)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999244326971e07dd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] unsupported setting key: x (operation: im/update_group_settings)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999244326971e07dd"
+  }
+}
dws chat +conversation-clear-all-red-pointwrite
清除所有会话红点(全部已读)
dws mcp im clear_all_red_point lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/clear_all_red_point
输入 / CLI 输出
输入
dws chat +conversation-clear-all-red-point --yes
stdout
{
+  "_fake": true,
+  "args": {},
+  "product": "im",
+  "tool": "clear_all_red_point"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {},
+  "product": "im",
+  "tool": "clear_all_red_point"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=13459ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +conversation-clear-all-red-point --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +conversation-clear-messages --conversation-id <conversation-id>high-risk-write
清空当前用户指定会话的聊天记录(仅本人视角,不可逆)
dws mcp im clear_conversation_messages --json '{"openConversationId":<..>}'dws mcp im clear_conversation_messages --json '{"openConversationId":<..>, "cid":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/clear_conversation_messages
输入 / CLI 输出
输入
dws chat +conversation-clear-messages --conversation-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "clear_conversation_messages"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "clear_conversation_messages"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1065ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +conversation-clear-messages --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_messages)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999254816721e079b"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_messages)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999254816721e079b"
+  }
+}
dws chat +conversation-clear-red-point --conversation-id <conversation-id>write
清除会话红点
dws mcp im clear_conversation_red_point --json '{"openConversationId":<..>}'dws mcp im clear_conversation_red_point --json '{"openConversationId":<..>, "cid":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/clear_conversation_red_point
输入 / CLI 输出
输入
dws chat +conversation-clear-red-point --conversation-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "clear_conversation_red_point"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "clear_conversation_red_point"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1044ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +conversation-clear-red-point --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_red_point)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999265511295e085f"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_red_point)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999265511295e085f"
+  }
+}
dws chat +conversation-hide --conversation-id <conversation-id>write
会话列表中隐藏会话(收到新消息会重新出现)
dws mcp im hide_conversation --json '{"openConversationId":<..>}'dws mcp im hide_conversation --json '{"openConversationId":<..>, "cid":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/hide_conversation
输入 / CLI 输出
输入
dws chat +conversation-hide --conversation-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "hide_conversation"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "hide_conversation"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1064ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +conversation-hide --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/hide_conversation)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999276117140e079b"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/hide_conversation)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999276117140e079b"
+  }
+}
dws chat +conversation-info --group <group> --open-dingtalk-id <open-dingtalk-id>read
获取会话信息(群聊传 --group,单聊传 --open-dingtalk-id)
dws mcp chat get_conversation_info --json '{"openConversationId":<..>, "openDingTalkId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/get_conversation_info
输入 / CLI 输出
输入
dws chat +conversation-info --group x --open-dingtalk-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openDingTalkId": "x"
+  },
+  "product": "chat",
+  "tool": "get_conversation_info"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openDingTalkId": "x"
+  },
+  "product": "chat",
+  "tool": "get_conversation_info"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=942ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +conversation-info --group cid3Jijzhe2aqs9ysOXjhi05g== --open-dingtalk-id x --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "conversationInfo": {
+      "createAt": "2018-11-13 12:39:07",
+      "extension": {
+        "newCSpaceIdIM": "1090404636"
+      },
+      "memberCount": 3,
+      "openConversationId": "cid3Jijzhe2aqs9ysOXjhi05g==",
+      "ownerNick": "浅曦",
+      "singleChat": false,
+      "title": "浅曦-kida,Dennis,秋画"
+    }
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "conversationInfo": {
+      "createAt": "2018-11-13 12:39:07",
+      "extension": {
+        "newCSpaceIdIM": "1090404636"
+      },
+      "memberCount": 3,
+      "openConversationId": "cid3Jijzhe2aqs9ysOXjhi05g==",
+      "ownerNick": "浅曦",
+      "singleChat": false,
+      "title": "浅曦-kida,Dennis,秋画"
+    }
+  },
+  "success": true
+}
dws chat +conversation-list --limit <limit> --cursor <cursor> --exclude-muted <exclude-muted>read
分页获取当前用户的全部会话列表(单聊+群聊)
dws mcp im <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_all_conversations
输入 / CLI 输出
输入
dws chat +conversation-list --limit 1 --cursor 1 --exclude-muted --yes
stdout
{
+  "conversations": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "conversations": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2857ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +conversation-list --limit 10 --cursor 0 --exclude-muted --yes --format json
真实 stdout
{
+  "conversations": [
+    {
+      "conversationName": "AI全栈",
+      "openConversationId": "cidGAcU1FHD+D2n3W6d+SXuhw=="
+    },
+    {
+      "conversationName": "念晨",
+      "openConversationId": "cidLw95vHkBXGePhIxRvleOUOtxfWW7v5vcWfa2fdxfxyg="
+    },
+    {
+      "conversationName": "九韶",
+      "openConversationId": "cidJdiIbpqCvEjbCuwHaHwR4A=="
+    },
+    {
+      "conversationName": "战友会",
+      "openConversationId": "cidK7s9XRz94DFkk4raOLduFw=="
+    },
+    {
+      "conversationName": "生煎包",
+      "openConversationId": "cid2CMDRvYP+Aw5ioOfP+se4+txfWW7v5vcWfa2fdxfxyg="
+    },
+    {
+      "conversationName": "Wukong & Real 日志群",
+      "openConversationId": "ciddYsoBxGQrFWR5zJ8lnpPBg=="
+    },
+    {
+      "conversationName": "粤腾",
+      "openConversationId": "cid72F2hVHMoijoL1CvmWp1ImIo0AJKl0bni7qLL0B05PA="
+    },
+    {
+      "conversationName": "算法团队全员群",
+      "openConversationId": "cidXMThCvAfn35/JRu/JOr6BA=="
+    },
+    {
+      "conversationName": "汇量问题反馈✖️skill/mcp",
+      "openConversationId": "cidTm/YDFJ/jgGFYFe3UF6dzA=="
+    },
+    {
+      "conversationName": "亲橙park舒婷水果优惠1群",
+      "openConversationId": "cid9LvgVwAlIvDBduIER4jFQg=="
+    }
+  ],
+  "count": 10
+}
真实 stderr / error
(空)
真实返回
{
+  "conversations": [
+    {
+      "conversationName": "AI全栈",
+      "openConversationId": "cidGAcU1FHD+D2n3W6d+SXuhw=="
+    },
+    {
+      "conversationName": "念晨",
+      "openConversationId": "cidLw95vHkBXGePhIxRvleOUOtxfWW7v5vcWfa2fdxfxyg="
+    },
+    {
+      "conversationName": "九韶",
+      "openConversationId": "cidJdiIbpqCvEjbCuwHaHwR4A=="
+    },
+    {
+      "conversationName": "战友会",
+      "openConversationId": "cidK7s9XRz94DFkk4raOLduFw=="
+    },
+    {
+      "conversationName": "生煎包",
+      "openConversationId": "cid2CMDRvYP+Aw5ioOfP+se4+txfWW7v5vcWfa2fdxfxyg="
+    },
+    {
+      "conversationName": "Wukong & Real 日志群",
+      "openConversationId": "ciddYsoBxGQrFWR5zJ8lnpPBg=="
+    },
+    {
+      "conversationName": "粤腾",
+      "openConversationId": "cid72F2hVHMoijoL1CvmWp1ImIo0AJKl0bni7qLL0B05PA="
+    },
+    {
+      "conversationName": "算法团队全员群",
+      "openConversationId": "cidXMThCvAfn35/JRu/JOr6BA=="
+    },
+    {
+      "conversationName": "汇量问题反馈✖️skill/mcp",
+      "openConversationId": "cidTm/YDFJ/jgGFYFe3UF6dzA=="
+    },
+    {
+      "conversationName": "亲橙park舒婷水果优惠1群",
+      "openConversationId": "cid9LvgVwAlIvDBduIER4jFQg=="
+    }
+  ],
+  "count": 10
+}
dws chat +conversation-list-top --limit <limit> --cursor <cursor> --exclude-muted <exclude-muted>read
拉取置顶会话列表
dws mcp chat <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/list_top_conversations
输入 / CLI 输出
输入
dws chat +conversation-list-top --limit 1 --cursor 1 --exclude-muted --yes
stdout
{
+  "conversations": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "conversations": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1091ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +conversation-list-top --limit 10 --cursor 0 --exclude-muted --yes --format json
真实 stdout
{
+  "conversations": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "conversations": [],
+  "count": 0
+}
dws chat +conversation-mark-read --conversation-id <conversation-id> --message-id <message-id>write
标记消息已读(该消息及之前的消息都标记为已读)
dws mcp im mark_message_read --json '{"openConversationId":<..>, "openMessageId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/mark_message_read
输入 / CLI 输出
输入
dws chat +conversation-mark-read --conversation-id x --message-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "mark_message_read"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "mark_message_read"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1162ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +conversation-mark-read --conversation-id cidDWSREALTESTNOSUCHCONV --message-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/mark_message_read)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2127d89817840999287654280e07bd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/mark_message_read)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2127d89817840999287654280e07bd"
+  }
+}
dws chat +conversation-mark-unread --conversation-id <conversation-id>write
标记会话为未读
dws mcp im mark_conversation_unread --json '{"openConversationId":<..>}'dws mcp im mark_conversation_unread --json '{"openConversationId":<..>, "cid":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/mark_conversation_unread
输入 / CLI 输出
输入
dws chat +conversation-mark-unread --conversation-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "mark_conversation_unread"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "mark_conversation_unread"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1090ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +conversation-mark-unread --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/mark_conversation_unread)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999298744910e0758"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/mark_conversation_unread)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999298744910e0758"
+  }
+}
dws chat +conversation-mute --conversation-id <conversation-id> --off <off>write
会话消息免打扰(支持单聊/群聊)
dws mcp im update_notification_off --json '{"openConversationId":<..>, "mute":<..>}'dws mcp im update_notification_off --json '{"openConversationId":<..>, "cid":<..>, "mute":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_notification_off
输入 / CLI 输出
输入
dws chat +conversation-mute --conversation-id x --off --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "mute": false,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_notification_off"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "mute": false,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_notification_off"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1052ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +conversation-mute --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId is required (operation: im/update_notification_off)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999309241865e085f"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId is required (operation: im/update_notification_off)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999309241865e085f"
+  }
+}
dws chat +conversation-mute-at-all --conversation-id <conversation-id> --off <off>write
关闭/开启 @所有人消息提醒
dws mcp im update_at_all_notification_off --json '{"openConversationId":<..>, "mute":<..>}'dws mcp im update_at_all_notification_off --json '{"openConversationId":<..>, "cid":<..>, "mute":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_at_all_notification_off
输入 / CLI 输出
输入
dws chat +conversation-mute-at-all --conversation-id x --off --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "mute": false,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_at_all_notification_off"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "mute": false,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_at_all_notification_off"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1110ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +conversation-mute-at-all --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId is required (operation: im/update_at_all_notification_off)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2127d89817840999320028068e07dd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId is required (operation: im/update_at_all_notification_off)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2127d89817840999320028068e07dd"
+  }
+}
dws chat +conversation-mute-red-envelope --conversation-id <conversation-id> --off <off>write
关闭/开启红包消息提醒
dws mcp im update_red_env_notification_off --json '{"openConversationId":<..>, "mute":<..>}'dws mcp im update_red_env_notification_off --json '{"openConversationId":<..>, "cid":<..>, "mute":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_red_env_notification_off
输入 / CLI 输出
输入
dws chat +conversation-mute-red-envelope --conversation-id x --off --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "mute": false,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_red_env_notification_off"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "mute": false,
+    "openConversationId": "x"
+  },
+  "product": "im",
+  "tool": "update_red_env_notification_off"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1001ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +conversation-mute-red-envelope --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId is required (operation: im/update_red_env_notification_off)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999330228283e07fe"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId is required (operation: im/update_red_env_notification_off)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999330228283e07fe"
+  }
+}
dws chat +conversation-set-top --conversation-id <conversation-id> --off <off>write
会话置顶 / 取消置顶(支持单聊/群聊)
dws mcp im set_top_conversation --json '{"openConversationId":<..>, "top":<..>}'dws mcp im set_top_conversation --json '{"openConversationId":<..>, "cid":<..>, "top":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/set_top_conversation
输入 / CLI 输出
输入
dws chat +conversation-set-top --conversation-id x --off --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x",
+    "top": false
+  },
+  "product": "im",
+  "tool": "set_top_conversation"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x",
+    "top": false
+  },
+  "product": "im",
+  "tool": "set_top_conversation"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1102ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +conversation-set-top --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_top_conversation)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999341302961e07fe"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_top_conversation)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2127d89817840999341302961e07fe"
+  }
+}
dws chat +dm --to <to> --text <text>write
按姓名直接给某人发单聊消息(自动解析 userId)
dws mcp chat send_personal_message --json '{"title":<..>, "text":<..>, "receiverUserId":<..>, "msgType":<..>, "content":<..>}'dws chat +dm --to <to> --text <text>write复合/智能型
按姓名直接给某人发单聊消息(自动解析 userId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 send_personal_message lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws chat +dm --to x --text x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2547ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +dm --to '冬翔' --text 'DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openTaskId": "y/wM6Lo+9GbIqtILYPv1BZDcMW+2FgnqskgcpdOiMdM="
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openTaskId": "y/wM6Lo+9GbIqtILYPv1BZDcMW+2FgnqskgcpdOiMdM="
+  },
+  "success": true
+}
dws chat +group-members --group <group>read
按群名列出群成员(自动搜群解析 openConversationId)
dws mcp chat <tool>dws chat +group-members --group <group>read复合/智能型
按群名列出群成员(自动搜群解析 openConversationId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/search_groups;没找到名字匹配 "x" 的群;换用群名里连续的核心词再试。
输入 / CLI 输出
输入
dws chat +group-members --group x --yes
stdout
(空)
stderr / error
没找到名字匹配 "x" 的群;换用群名里连续的核心词再试。
最终用于判定的返回
没找到名字匹配 "x" 的群;换用群名里连续的核心词再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1955ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +group-members --group '浅曦-kida,Dennis,秋画' --yes --format json
真实 stdout
{
+  "count": 3,
+  "members": [
+    {
+      "name": "",
+      "nick": "秋画",
+      "openDingtalkId": "DpDC43OwfSyzvpshro641ZyKOpvhZI2tI",
+      "role": "普通成员"
+    },
+    {
+      "name": "",
+      "nick": "浅曦",
+      "openDingtalkId": "DiPbzolsu3XcIqiPOT4eDpd1MUBtiiFg6Xhx",
+      "role": "群主"
+    },
+    {
+      "name": "",
+      "nick": "念晨",
+      "openDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "role": "普通成员"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 3,
+  "members": [
+    {
+      "name": "",
+      "nick": "秋画",
+      "openDingtalkId": "DpDC43OwfSyzvpshro641ZyKOpvhZI2tI",
+      "role": "普通成员"
+    },
+    {
+      "name": "",
+      "nick": "浅曦",
+      "openDingtalkId": "DiPbzolsu3XcIqiPOT4eDpd1MUBtiiFg6Xhx",
+      "role": "群主"
+    },
+    {
+      "name": "",
+      "nick": "念晨",
+      "openDingtalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "role": "普通成员"
+    }
+  ]
+}
dws chat +messages-add-emoji --conversation-id <conversation-id> --msg-id <msg-id> --emoji <emoji>write
对消息添加 emoji 表情回应
dws mcp im add_emoji_reaction --json '{"openConversationId":<..>, "openMsgId":<..>, "emojiName":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/add_emoji_reaction
输入 / CLI 输出
输入
dws chat +messages-add-emoji --conversation-id x --msg-id x --emoji x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "emojiName": "x",
+    "openConversationId": "x",
+    "openMsgId": "x"
+  },
+  "product": "im",
+  "tool": "add_emoji_reaction"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "emojiName": "x",
+    "openConversationId": "x",
+    "openMsgId": "x"
+  },
+  "product": "im",
+  "tool": "add_emoji_reaction"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1170ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-add-emoji --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --emoji '👍' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_emoji_reaction)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2127d89817840999352941910e0756"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_emoji_reaction)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2127d89817840999352941910e0756"
+  }
+}
dws chat +messages-add-text-emotion --conversation-id <conversation-id> --msg-id <msg-id> --emotion-id <emotion-id> --emotion-name <emotion-name> --text <text> --background-id <background-id>write
对消息添加文字表情回应
dws mcp im add_text_emotion --json '{"openConversationId":<..>, "openMsgId":<..>, "emotionId":<..>, "emotionName":<..>, "text":<..>, "backgroundId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/add_text_emotion
输入 / CLI 输出
输入
dws chat +messages-add-text-emotion --conversation-id x --msg-id x --emotion-id x --emotion-name x --text x --background-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "backgroundId": "x",
+    "emotionId": "x",
+    "emotionName": "x",
+    "openConversationId": "x",
+    "openMsgId": "x",
+    "text": "x"
+  },
+  "product": "im",
+  "tool": "add_text_emotion"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "backgroundId": "x",
+    "emotionId": "x",
+    "emotionName": "x",
+    "openConversationId": "x",
+    "openMsgId": "x",
+    "text": "x"
+  },
+  "product": "im",
+  "tool": "add_text_emotion"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=992ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-add-text-emotion --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --emotion-id DWSREALTESTNOSUCHID0000000000000 --emotion-name 'DWS测试表情' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --background-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_text_emotion)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999362862711e08b5"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_text_emotion)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999362862711e08b5"
+  }
+}
dws chat +messages-batch-recall-by-bot --robot-code <robot-code> --keys <keys>write
机器人撤回单聊消息
dws mcp bot batch_recall_robot_users_msg --json '{"robotCode":<..>, "processQueryKeys":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/batch_recall_robot_users_msg
输入 / CLI 输出
输入
dws chat +messages-batch-recall-by-bot --robot-code x --keys x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "processQueryKeys": [
+      "x"
+    ],
+    "robotCode": "x"
+  },
+  "product": "bot",
+  "tool": "batch_recall_robot_users_msg"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "processQueryKeys": [
+      "x"
+    ],
+    "robotCode": "x"
+  },
+  "product": "bot",
+  "tool": "batch_recall_robot_users_msg"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1085ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-batch-recall-by-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --keys DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: bot/batch_recall_robot_users_msg)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "retryable": true,
+    "server_error_code": "ERROR",
+    "server_key": "bot",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\"success\":false,\"dingOpenErrcode\":400014,\"errorMsg\":\"错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确;\"} ",
+    "trace_id": "2104a64c17840999373456305e0817"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: bot/batch_recall_robot_users_msg)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "retryable": true,
+    "server_error_code": "ERROR",
+    "server_key": "bot",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\"success\":false,\"dingOpenErrcode\":400014,\"errorMsg\":\"错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确;\"} ",
+    "trace_id": "2104a64c17840999373456305e0817"
+  }
+}
dws chat +messages-batch-send-by-bot --robot-code <robot-code> --title <title> --text <text> --users <users> --open-dingtalk-ids <open-dingtalk-ids> --at-all <at-all>write
机器人批量向用户发送单聊 Markdown 消息
dws mcp bot batch_send_robot_msg_to_users --json '{"robotCode":<..>, "title":<..>, "markdown":<..>, "userIds":<..>, "openDingtalkIds":<..>, "isAtAll":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/batch_send_robot_msg_to_users
输入 / CLI 输出
输入
dws chat +messages-batch-send-by-bot --robot-code x --title x --text x --users x --open-dingtalk-ids x --at-all --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "isAtAll": "true",
+    "markdown": "x",
+    "openDingtalkIds": [
+      "x"
+    ],
+    "robotCode": "x",
+    "title": "x",
+    "userIds": [
+      "x"
+    ]
+  },
+  "product": "bot",
+  "tool": "batch_send_robot_msg_to_users"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "isAtAll": "true",
+    "markdown": "x",
+    "openDingtalkIds": [
+      "x"
+    ],
+    "robotCode": "x",
+    "title": "x",
+    "userIds": [
+      "x"
+    ]
+  },
+  "product": "bot",
+  "tool": "batch_send_robot_msg_to_users"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1211ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-batch-send-by-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --title 'DWS shortcut 真实测试 20260715-151724' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --open-dingtalk-ids '' --at-all --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: bot/batch_send_robot_msg_to_users)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "retryable": true,
+    "server_error_code": "ERROR",
+    "server_key": "bot",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\"success\":false,\"dingOpenErrcode\":400106,\"errorMsg\":\"错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确;\"} ",
+    "trace_id": "0bb7c36217840999385748776e0757"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: bot/batch_send_robot_msg_to_users)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "retryable": true,
+    "server_error_code": "ERROR",
+    "server_key": "bot",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\"success\":false,\"dingOpenErrcode\":400106,\"errorMsg\":\"错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确;\"} ",
+    "trace_id": "0bb7c36217840999385748776e0757"
+  }
+}
dws chat +messages-combine-forward --src-conversation-id <src-conversation-id> --msg-ids <msg-ids> --dest-conversation-id <dest-conversation-id> --uuid <uuid>write
合并转发多条消息
dws mcp im combine_forward_messages --json '{"srcOpenCid":<..>, "srcOpenMessageIds":<..>, "destOpenCid":<..>, "uuid":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/combine_forward_messages
输入 / CLI 输出
输入
dws chat +messages-combine-forward --src-conversation-id x --msg-ids x --dest-conversation-id x --uuid x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "destOpenCid": "x",
+    "srcOpenCid": "x",
+    "srcOpenMessageIds": [
+      "x"
+    ],
+    "uuid": "x"
+  },
+  "product": "im",
+  "tool": "combine_forward_messages"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "destOpenCid": "x",
+    "srcOpenCid": "x",
+    "srcOpenMessageIds": [
+      "x"
+    ],
+    "uuid": "x"
+  },
+  "product": "im",
+  "tool": "combine_forward_messages"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1075ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-combine-forward --src-conversation-id cidDWSREALTESTNOSUCHCONV --msg-ids DWSREALTESTNOSUCHID0000000000000 --dest-conversation-id cidDWSREALTESTNOSUCHCONV --uuid dws-shortcut-real-negative-20260715-151724 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] srcOpenCid无效,无法解析为cid (operation: im/combine_forward_messages)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999396596163e08ee"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] srcOpenCid无效,无法解析为cid (operation: im/combine_forward_messages)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999396596163e08ee"
+  }
+}
dws chat +messages-create-text-emotion --emotion-name <emotion-name> --text <text> --background-id <background-id>write
创建文字表情(获取 emotionId)
dws mcp im create_text_emotion --json '{"emotionName":<..>, "text":<..>, "backgroundId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/create_text_emotion
输入 / CLI 输出
输入
dws chat +messages-create-text-emotion --emotion-name x --text x --background-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "backgroundId": "x",
+    "emotionName": "x",
+    "text": "x"
+  },
+  "product": "im",
+  "tool": "create_text_emotion"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "backgroundId": "x",
+    "emotionName": "x",
+    "text": "x"
+  },
+  "product": "im",
+  "tool": "create_text_emotion"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1054ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +messages-create-text-emotion --emotion-name 'DWS测试表情' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --background-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 暂不支持保存该文字表情 (operation: im/create_text_emotion)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "400519",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999407422891e08cd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 暂不支持保存该文字表情 (operation: im/create_text_emotion)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "400519",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999407422891e08cd"
+  }
+}
dws chat +messages-forward --src-conversation-id <src-conversation-id> --msg-id <msg-id> --dest-conversation-id <dest-conversation-id> --uuid <uuid>write
转发单条消息
dws mcp im forward_message --json '{"srcOpenCid":<..>, "srcOpenMessageId":<..>, "destOpenCid":<..>, "uuid":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/forward_message
输入 / CLI 输出
输入
dws chat +messages-forward --src-conversation-id x --msg-id x --dest-conversation-id x --uuid x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "destOpenCid": "x",
+    "srcOpenCid": "x",
+    "srcOpenMessageId": "x",
+    "uuid": "x"
+  },
+  "product": "im",
+  "tool": "forward_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "destOpenCid": "x",
+    "srcOpenCid": "x",
+    "srcOpenMessageId": "x",
+    "uuid": "x"
+  },
+  "product": "im",
+  "tool": "forward_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1090ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-forward --src-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --dest-conversation-id cidDWSREALTESTNOSUCHCONV --uuid dws-shortcut-real-negative-20260715-151724 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999417966407e08ee"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999417966407e08ee"
+  }
+}
dws chat +messages-forward-topic --src-msg-id <src-msg-id> --src-conversation-id <src-conversation-id> --src-thread-id <src-thread-id> --dest-conversation-id <dest-conversation-id>write
转发话题消息到目标会话
dws mcp im forward_topic --json '{"srcOpenMessageId":<..>, "srcOpenConversationId":<..>, "srcOpenConvThreadId":<..>, "destOpenConversationId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/forward_topic
输入 / CLI 输出
输入
dws chat +messages-forward-topic --src-msg-id x --src-conversation-id x --src-thread-id x --dest-conversation-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "destOpenConversationId": "x",
+    "srcOpenConvThreadId": "x",
+    "srcOpenConversationId": "x",
+    "srcOpenMessageId": "x"
+  },
+  "product": "im",
+  "tool": "forward_topic"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "destOpenConversationId": "x",
+    "srcOpenConvThreadId": "x",
+    "srcOpenConversationId": "x",
+    "srcOpenMessageId": "x"
+  },
+  "product": "im",
+  "tool": "forward_topic"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1043ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-forward-topic --src-msg-id DWSREALTESTNOSUCHID0000000000000 --src-conversation-id cidDWSREALTESTNOSUCHCONV --src-thread-id DWSREALTESTNOSUCHID0000000000000 --dest-conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_topic)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2127d89817840999428541474e07dd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_topic)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2127d89817840999428541474e07dd"
+  }
+}
dws chat +messages-list --group <group> --time <time> --forward <forward> --limit <limit>read
拉取群聊会话消息
dws mcp chat <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/list_conversation_message_v2
输入 / CLI 输出
输入
dws chat +messages-list --group x --time x --forward --limit 1 --yes
stdout
{
+  "count": 0,
+  "messages": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "messages": []
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1480ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +messages-list --group cid3Jijzhe2aqs9ysOXjhi05g== --time '2026-07-15 10:00:00' --forward --limit 10 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openCid or cid is required\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "chat",
+    "trace_id": "2127d89817840997797873841e0757"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openCid or cid is required\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "chat",
+    "trace_id": "2127d89817840997797873841e0757"
+  }
+}
dws chat +messages-list-direct --user <user> --open-dingtalk-id <open-dingtalk-id> --time <time> --forward <forward> --limit <limit>read
拉取单聊会话消息
dws mcp chat <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/list_individual_chat_message
输入 / CLI 输出
输入
dws chat +messages-list-direct --user x --open-dingtalk-id x --time x --forward --limit 1 --yes
stdout
{
+  "count": 0,
+  "messages": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "messages": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1386ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +messages-list-direct --user 103262 --time '2026-07-15 10:00:00' --forward --limit 10 --yes --format json
真实 stdout
{
+  "count": 4,
+  "messages": [
+    {
+      "createTime": "2026-07-15 11:02:04",
+      "messageId": "msgmsdyW4xAGL0iXVc9mR4V0g==",
+      "senderId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "text": "[文档](https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO)\nDWS shortcut 修复复测 20260715:验证 doc +share-doc,请忽略。"
+    },
+    {
+      "createTime": "2026-07-15 11:01:49",
+      "messageId": "msgj2fRqVeyvOLxrZ5EntlMIA==",
+      "senderId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "text": "DWS shortcut 修复复测 20260715:验证 chat +broadcast,请忽略。"
+    },
+    {
+      "createTime": "2026-07-15 11:01:34",
+      "messageId": "msgEuOor1PmFBNlx9M06N9z1Q==",
+      "senderId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "text": "DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。"
+    },
+    {
+      "createTime": "2026-07-15 10:12:31",
+      "messageId": "msg4cdzVyqpmXc9WAxnR3lcYQ==",
+      "senderId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "text": "-1\nDWS shortcut 真实测试 20260715 日程,可忽略\nAsia/Shanghai\ndingtalk://dingtalkclient/action/switchtab?index=1&name=ding&type=calendar&targetDateTime=1784172600000\n1\n1784173500000\n日历使用手册\n0\ndingtalk://dingtalkclient/page/calendar_detail?uniqueId=c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09&corpId=ding8196cd9a2b2405da24f2f5cc6abecb85&from=im_card&redirect_url=https%3A%2F%2Fn.dingtalk.com%2Fdingding%2Fcalendar%2Fdetail%2Findex.html%3Fdd_full_screen%3Dtrue%26dd_progress%3Dfalse%26dd_darkmode%3Dtrue%26%26dd_android_full%3Dtrue%26uniqueId%3Dc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09%26corpId%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26from%3Dim_card\n0\n0\n了解详情\n1784172600000\n1\n439446171\n1784172600000\n1784081621092b363beb2-0536-4131-b9ca-935571fca90d\ndingtalk://dingtalkclient/page/link?url=https%3A%2F%2Falidocs.dingtalk.com%2Fi%2Fp%2FY7kmbokZp3pgGLq2%2Fdocs%2F7Y36k14mK9AV3pKq5zA1J5NqapjblR2D\nfalse\n0\n512653609\n999\n1784173500000\ndingtalk://dingtalkclient/page/calendar_detail?uniqueId=c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09&corpId=ding8196cd9a2b2405da24f2f5cc6abecb85&from=im_card&redirect_url=https%3A%2F%2Fn.dingtalk.com%2Fdingding%2Fcalendar%2Fdetail%2Findex.html%3Fdd_full_screen%3Dtrue%26dd_progress%3Dfalse%26dd_darkmode%3Dtrue%26%26dd_android_full%3Dtrue%26uniqueId%3Dc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09%26corpId%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26from%3Dim_card\nc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 4,
+  "messages": [
+    {
+      "createTime": "2026-07-15 11:02:04",
+      "messageId": "msgmsdyW4xAGL0iXVc9mR4V0g==",
+      "senderId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "text": "[文档](https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO)\nDWS shortcut 修复复测 20260715:验证 doc +share-doc,请忽略。"
+    },
+    {
+      "createTime": "2026-07-15 11:01:49",
+      "messageId": "msgj2fRqVeyvOLxrZ5EntlMIA==",
+      "senderId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "text": "DWS shortcut 修复复测 20260715:验证 chat +broadcast,请忽略。"
+    },
+    {
+      "createTime": "2026-07-15 11:01:34",
+      "messageId": "msgEuOor1PmFBNlx9M06N9z1Q==",
+      "senderId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "text": "DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。"
+    },
+    {
+      "createTime": "2026-07-15 10:12:31",
+      "messageId": "msg4cdzVyqpmXc9WAxnR3lcYQ==",
+      "senderId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+      "text": "-1\nDWS shortcut 真实测试 20260715 日程,可忽略\nAsia/Shanghai\ndingtalk://dingtalkclient/action/switchtab?index=1&name=ding&type=calendar&targetDateTime=1784172600000\n1\n1784173500000\n日历使用手册\n0\ndingtalk://dingtalkclient/page/calendar_detail?uniqueId=c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09&corpId=ding8196cd9a2b2405da24f2f5cc6abecb85&from=im_card&redirect_url=https%3A%2F%2Fn.dingtalk.com%2Fdingding%2Fcalendar%2Fdetail%2Findex.html%3Fdd_full_screen%3Dtrue%26dd_progress%3Dfalse%26dd_darkmode%3Dtrue%26%26dd_android_full%3Dtrue%26uniqueId%3Dc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09%26corpId%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26from%3Dim_card\n0\n0\n了解详情\n1784172600000\n1\n439446171\n1784172600000\n1784081621092b363beb2-0536-4131-b9ca-935571fca90d\ndingtalk://dingtalkclient/page/link?url=https%3A%2F%2Falidocs.dingtalk.com%2Fi%2Fp%2FY7kmbokZp3pgGLq2%2Fdocs%2F7Y36k14mK9AV3pKq5zA1J5NqapjblR2D\nfalse\n0\n512653609\n999\n1784173500000\ndingtalk://dingtalkclient/page/calendar_detail?uniqueId=c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09&corpId=ding8196cd9a2b2405da24f2f5cc6abecb85&from=im_card&redirect_url=https%3A%2F%2Fn.dingtalk.com%2Fdingding%2Fcalendar%2Fdetail%2Findex.html%3Fdd_full_screen%3Dtrue%26dd_progress%3Dfalse%26dd_darkmode%3Dtrue%26%26dd_android_full%3Dtrue%26uniqueId%3Dc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09%26corpId%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26from%3Dim_card\nc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09"
+    }
+  ]
+}
dws chat +messages-list-pin --open-conversation-id <open-conversation-id> --cursor <cursor> --size <size>read
拉取会话中钉住的消息列表
dws mcp im <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_pin_messages
输入 / CLI 输出
输入
dws chat +messages-list-pin --open-conversation-id x --cursor x --size 1 --yes
stdout
{
+  "count": 0,
+  "pins": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "pins": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1105ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +messages-list-pin --open-conversation-id cid3Jijzhe2aqs9ysOXjhi05g== --cursor 0 --size 1 --yes --format json
真实 stdout
{
+  "count": 0,
+  "pins": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "pins": []
+}
dws chat +messages-list-unread-conversations --count <count> --exclude-muted <exclude-muted>read
获取有未读消息的会话列表
dws mcp chat <tool> lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/unread_message_conversation_list
输入 / CLI 输出
输入
dws chat +messages-list-unread-conversations --count 1 --exclude-muted --yes
stdout
{
+  "conversations": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "conversations": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1575ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +messages-list-unread-conversations --count 1 --exclude-muted --yes --format json
真实 stdout
{
+  "conversations": [
+    {
+      "conversationId": "ciddYsoBxGQrFWR5zJ8lnpPBg==",
+      "title": "Wukong & Real 日志群"
+    }
+  ],
+  "count": 1
+}
真实 stderr / error
(空)
真实返回
{
+  "conversations": [
+    {
+      "conversationId": "ciddYsoBxGQrFWR5zJ8lnpPBg==",
+      "title": "Wukong & Real 日志群"
+    }
+  ],
+  "count": 1
+}
dws chat +messages-mget --msg-ids <msg-ids>read
根据消息 ID 批量查询消息(最多 50 条)
dws mcp im list_messages_by_ids --json '{"openMsgIds":<..>}' lark-cli im +messages-mget已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_messages_by_ids
输入 / CLI 输出
输入
dws chat +messages-mget --msg-ids x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openMsgIds": [
+      "x"
+    ]
+  },
+  "product": "im",
+  "tool": "list_messages_by_ids"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openMsgIds": [
+      "x"
+    ]
+  },
+  "product": "im",
+  "tool": "list_messages_by_ids"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1461ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +messages-mget --msg-ids msgEuOor1PmFBNlx9M06N9z1Q== --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "messages": [
+      {
+        "content": "DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。",
+        "createTime": "2026-07-15 11:01:34",
+        "openConversationId": "cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=",
+        "openMessageId": "msgEuOor1PmFBNlx9M06N9z1Q==",
+        "sender": "念晨",
+        "senderOpenDingTalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I"
+      }
+    ]
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "messages": [
+      {
+        "content": "DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。",
+        "createTime": "2026-07-15 11:01:34",
+        "openConversationId": "cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=",
+        "openMessageId": "msgEuOor1PmFBNlx9M06N9z1Q==",
+        "sender": "念晨",
+        "senderOpenDingTalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I"
+      }
+    ]
+  },
+  "success": true
+}
dws chat +messages-query-send-status --open-task-id <open-task-id>read
查询消息发送状态
dws mcp im query_message_send_status --json '{"openTaskId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/query_message_send_status
输入 / CLI 输出
输入
dws chat +messages-query-send-status --open-task-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openTaskId": "x"
+  },
+  "product": "im",
+  "tool": "query_message_send_status"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openTaskId": "x"
+  },
+  "product": "im",
+  "tool": "query_message_send_status"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1312ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +messages-query-send-status --open-task-id y/wM6Lo+9GbIqtILYPv1BZDcMW+2FgnqskgcpdOiMdM= --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openConversationId": "cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=",
+    "openMessageId": "msgEuOor1PmFBNlx9M06N9z1Q==",
+    "sendStatus": "SUCCESS"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openConversationId": "cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=",
+    "openMessageId": "msgEuOor1PmFBNlx9M06N9z1Q==",
+    "sendStatus": "SUCCESS"
+  },
+  "success": true
+}
dws chat +messages-read-status --conversation-id <conversation-id> --message-id <message-id> --users <users>read
查询消息的已读/未读状态
dws mcp im query_msg_read_status --json '{"openConversationId":<..>, "openMessageId":<..>, "targetUserIds":<..>, "targetOpenDingTalkIds":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/query_msg_read_status
输入 / CLI 输出
输入
dws chat +messages-read-status --conversation-id x --message-id x --users x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x",
+    "targetUserIds": [
+      "x"
+    ]
+  },
+  "product": "im",
+  "tool": "query_msg_read_status"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x",
+    "targetUserIds": [
+      "x"
+    ]
+  },
+  "product": "im",
+  "tool": "query_msg_read_status"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1376ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +messages-read-status --conversation-id cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI= --message-id msgEuOor1PmFBNlx9M06N9z1Q== --users '冬翔' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "memberReadStatusList": [
+      {
+        "openDingTalkId": "DAdiiQDqzH1DEqiPOT4eDpd1MUBtiiFg6Xhx",
+        "readStatus": "READ",
+        "readTime": "2026-07-15 11:53:31",
+        "userNick": "冬翔"
+      },
+      {
+        "openDingTalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "readStatus": "READ",
+        "readTime": "2026-07-15 11:01:35",
+        "userNick": "念晨"
+      }
+    ],
+    "messageStatus": "SUCCESS"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "memberReadStatusList": [
+      {
+        "openDingTalkId": "DAdiiQDqzH1DEqiPOT4eDpd1MUBtiiFg6Xhx",
+        "readStatus": "READ",
+        "readTime": "2026-07-15 11:53:31",
+        "userNick": "冬翔"
+      },
+      {
+        "openDingTalkId": "D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I",
+        "readStatus": "READ",
+        "readTime": "2026-07-15 11:01:35",
+        "userNick": "念晨"
+      }
+    ],
+    "messageStatus": "SUCCESS"
+  },
+  "success": true
+}
dws chat +messages-recall --conversation-id <conversation-id> --msg-id <msg-id>write
撤回当前用户发送的消息
dws mcp im recall_message --json '{"openConversationId":<..>, "openMessageId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/recall_message
输入 / CLI 输出
输入
dws chat +messages-recall --conversation-id x --msg-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "recall_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "recall_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1247ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-recall --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/recall_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999441138103e08c7"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/recall_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999441138103e08c7"
+  }
+}
dws chat +messages-recall-by-bot --robot-code <robot-code> --group <group> --keys <keys>write
机器人撤回群消息
dws mcp bot recall_robot_group_message --json '{"robotCode":<..>, "openConversationId":<..>, "processQueryKeys":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/recall_robot_group_message
输入 / CLI 输出
输入
dws chat +messages-recall-by-bot --robot-code x --group x --keys x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "processQueryKeys": [
+      "x"
+    ],
+    "robotCode": "x"
+  },
+  "product": "bot",
+  "tool": "recall_robot_group_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "processQueryKeys": [
+      "x"
+    ],
+    "robotCode": "x"
+  },
+  "product": "bot",
+  "tool": "recall_robot_group_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1317ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +messages-recall-by-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --group cidDWSREALTESTNOSUCHCONV --keys DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: bot/recall_robot_group_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "bot",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。DingOpenResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"dingOpenErrcode\":400012,\"errorMsg\":\"错误描述:无效的openConversationId此参数的示例值如\\\"cidl1B8RVUFmkXXXXXX\\\";解决方案:请检查拼写是否正确;参考链接:请参考本接口对应文档查看参数的获取方式,或者在https://open.dingtalk.com/ 查询如何获取对应的参数\"} ",
+    "trace_id": "2104a64c17840999454382709e08a3"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: bot/recall_robot_group_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "bot",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。DingOpenResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"dingOpenErrcode\":400012,\"errorMsg\":\"错误描述:无效的openConversationId此参数的示例值如\\\"cidl1B8RVUFmkXXXXXX\\\";解决方案:请检查拼写是否正确;参考链接:请参考本接口对应文档查看参数的获取方式,或者在https://open.dingtalk.com/ 查询如何获取对应的参数\"} ",
+    "trace_id": "2104a64c17840999454382709e08a3"
+  }
+}
dws chat +messages-remove-emoji --conversation-id <conversation-id> --msg-id <msg-id> --emoji <emoji>write
移除消息的 emoji 表情回应
dws mcp im remove_emoji_reaction --json '{"openConversationId":<..>, "openMsgId":<..>, "emojiName":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/remove_emoji_reaction
输入 / CLI 输出
输入
dws chat +messages-remove-emoji --conversation-id x --msg-id x --emoji x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "emojiName": "x",
+    "openConversationId": "x",
+    "openMsgId": "x"
+  },
+  "product": "im",
+  "tool": "remove_emoji_reaction"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "emojiName": "x",
+    "openConversationId": "x",
+    "openMsgId": "x"
+  },
+  "product": "im",
+  "tool": "remove_emoji_reaction"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1347ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-remove-emoji --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --emoji '👍' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_emoji_reaction)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999467733059e08f9"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_emoji_reaction)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999467733059e08f9"
+  }
+}
dws chat +messages-remove-text-emotion --conversation-id <conversation-id> --msg-id <msg-id> --emotion-id <emotion-id> --emotion-name <emotion-name> --text <text> --background-id <background-id>write
移除消息的文字表情回应
dws mcp im remove_text_emotion --json '{"openConversationId":<..>, "openMsgId":<..>, "emotionId":<..>, "emotionName":<..>, "text":<..>, "backgroundId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/remove_text_emotion
输入 / CLI 输出
输入
dws chat +messages-remove-text-emotion --conversation-id x --msg-id x --emotion-id x --emotion-name x --text x --background-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "backgroundId": "x",
+    "emotionId": "x",
+    "emotionName": "x",
+    "openConversationId": "x",
+    "openMsgId": "x",
+    "text": "x"
+  },
+  "product": "im",
+  "tool": "remove_text_emotion"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "backgroundId": "x",
+    "emotionId": "x",
+    "emotionName": "x",
+    "openConversationId": "x",
+    "openMsgId": "x",
+    "text": "x"
+  },
+  "product": "im",
+  "tool": "remove_text_emotion"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1210ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-remove-text-emotion --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --emotion-id DWSREALTESTNOSUCHID0000000000000 --emotion-name 'DWS测试表情' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --background-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_text_emotion)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999478923406e087f"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_text_emotion)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999478923406e087f"
+  }
+}
dws chat +messages-resource-url --type <type> --resource-id <resource-id> --message-id <message-id> --open-conversation-id <open-conversation-id>read
获取消息资源(图片/视频/语音)下载链接
dws mcp im get_resource_download_url --json '{"resourceType":<..>, "resourceId":<..>, "openMessageId":<..>, "openConversationId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/get_resource_download_url
输入 / CLI 输出
输入
dws chat +messages-resource-url --type mediaId --resource-id x --message-id x --open-conversation-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x",
+    "resourceId": "x",
+    "resourceType": "mediaId"
+  },
+  "product": "im",
+  "tool": "get_resource_download_url"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x",
+    "resourceId": "x",
+    "resourceType": "mediaId"
+  },
+  "product": "im",
+  "tool": "get_resource_download_url"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1264ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-resource-url --type mediaId --resource-id x --message-id DWSREALREADNOSUCHID0000000000000 --open-conversation-id cid3Jijzhe2aqs9ysOXjhi05g== --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] failed to get download url for resourceId: x (operation: im/get_resource_download_url)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "RESOURCE_NOT_FOUND",
+    "server_key": "im",
+    "trace_id": "2127d89817840997855423145e07dd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] failed to get download url for resourceId: x (operation: im/get_resource_download_url)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "RESOURCE_NOT_FOUND",
+    "server_key": "im",
+    "trace_id": "2127d89817840997855423145e07dd"
+  }
+}
dws chat +messages-send-by-bot --robot-code <robot-code> --group <group> --title <title> --text <text> --at-user-ids <at-user-ids> --at-open-dingtalk-ids <at-open-dingtalk-ids> --at-all <at-all>write
机器人向群聊发送 Markdown 消息
dws mcp bot send_robot_group_message --json '{"robotCode":<..>, "openConversationId":<..>, "title":<..>, "markdown":<..>, "atUserIds":<..>, "atOpendingtalkIds":<..>, "isAtAll":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/send_robot_group_message
输入 / CLI 输出
输入
dws chat +messages-send-by-bot --robot-code x --group x --title x --text x --at-user-ids x --at-open-dingtalk-ids x --at-all --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "atOpendingtalkIds": [
+      "x"
+    ],
+    "atUserIds": [
+      "x"
+    ],
+    "isAtAll": "true",
+    "markdown": "x",
+    "openConversationId": "x",
+    "robotCode": "x",
+    "title": "x"
+  },
+  "product": "bot",
+  "tool": "send_robot_group_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "atOpendingtalkIds": [
+      "x"
+    ],
+    "atUserIds": [
+      "x"
+    ],
+    "isAtAll": "true",
+    "markdown": "x",
+    "openConversationId": "x",
+    "robotCode": "x",
+    "title": "x"
+  },
+  "product": "bot",
+  "tool": "send_robot_group_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1436ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-send-by-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --group cidDWSREALTESTNOSUCHCONV --title 'DWS shortcut 真实测试 20260715-151724' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --at-user-ids __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --at-open-dingtalk-ids '' --at-all --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: bot/send_robot_group_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "BUSINESS_ERROR",
+    "server_key": "bot",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。DingOpenResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"400004\",\"errorMsg\":\"robotCode对应的机器人模板不存在\"} ",
+    "trace_id": "0b5deb3217840999494005921e08ef"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: bot/send_robot_group_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "BUSINESS_ERROR",
+    "server_key": "bot",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。DingOpenResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"400004\",\"errorMsg\":\"robotCode对应的机器人模板不存在\"} ",
+    "trace_id": "0b5deb3217840999494005921e08ef"
+  }
+}
dws chat +messages-send-by-webhook --token <token> --title <title> --text <text> --at-all <at-all> --at-mobiles <at-mobiles> --at-users <at-users>write
自定义机器人 Webhook 发送群消息
dws mcp bot send_message_by_custom_robot --json '{"robotToken":<..>, "title":<..>, "text":<..>, "isAtAll":<..>, "atMobiles":<..>, "atUserIds":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;bot/send_message_by_custom_robot
输入 / CLI 输出
输入
dws chat +messages-send-by-webhook --token x --title x --text x --at-all --at-mobiles x --at-users x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "atMobiles": [
+      "x"
+    ],
+    "atUserIds": [
+      "x"
+    ],
+    "isAtAll": true,
+    "robotToken": "x",
+    "text": "x",
+    "title": "x"
+  },
+  "product": "bot",
+  "tool": "send_message_by_custom_robot"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "atMobiles": [
+      "x"
+    ],
+    "atUserIds": [
+      "x"
+    ],
+    "isAtAll": true,
+    "robotToken": "x",
+    "text": "x",
+    "title": "x"
+  },
+  "product": "bot",
+  "tool": "send_message_by_custom_robot"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=925ms;real-backend-safe-negative-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +messages-send-by-webhook --token __DWS_SHORTCUT_REAL_TEST_NO_SUCH_WEBHOOK_TOKEN__ --title 'DWS shortcut 真实测试 20260715-104025' --text 'DWS shortcut 真实测试 20260715-104025,安全负向输入,请忽略。' --at-all --at-mobiles x --at-users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --yes --format json
真实 stdout
{
+  "errcode": "300005",
+  "errmsg": "token is not exist",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "errcode": "300005",
+  "errmsg": "token is not exist",
+  "success": true
+}
dws chat +messages-send-card --group <group> --receiver <receiver>write
创建并推送流式卡片(需配合 messages-update-card)
dws mcp im create_and_send_card --json '{"openConversationId":<..>, "receiverOpenDingTalkId":<..>}'dws mcp im create_and_send_card --json '{"openConversationId":<..>, "receiverUid":<..>}' lark im 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--group 与 --receiver 互斥
输入 / CLI 输出
输入
dws chat +messages-send-card --group x --receiver x --yes
stdout
(空)
stderr / error
--group 与 --receiver 互斥
最终用于判定的返回
--group 与 --receiver 互斥
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1502ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+dry-run 已证明 CLI 装配了 receiverUid;真实后端仍报 receiverUid/openConversationId 为空,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +messages-send-card --receiver 103262 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] receiverUid和openConversationId不能同时为空 (operation: im/create_and_send_card)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999509255753e081a"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] receiverUid和openConversationId不能同时为空 (operation: im/create_and_send_card)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999509255753e081a"
+  }
+}
dws chat +messages-set-pin --open-conversation-id <open-conversation-id> --msg-id <msg-id>write
钉住消息(Pin)
dws mcp im set_pin_message --json '{"openConversationId":<..>, "openMessageId":<..>}'dws mcp im set_pin_message --json '{"openConversationId":<..>, "cid":<..>, "openMessageId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/set_pin_message
输入 / CLI 输出
输入
dws chat +messages-set-pin --open-conversation-id x --msg-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "set_pin_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "set_pin_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1217ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +messages-set-pin --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_pin_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999521117991e0758"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_pin_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "0bb7c36217840999521117991e0758"
+  }
+}
dws chat +messages-set-top --open-conversation-id <open-conversation-id> --msg-id <msg-id>write
置顶消息
dws mcp im set_top_message --json '{"openConversationId":<..>, "openMessageId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/set_top_message
输入 / CLI 输出
输入
dws chat +messages-set-top --open-conversation-id x --msg-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "set_top_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "set_top_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1121ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-set-top --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/set_top_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999532438476e0817"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/set_top_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999532438476e0817"
+  }
+}
dws chat +messages-unset-pin --open-conversation-id <open-conversation-id> --msg-id <msg-id>write
取消钉住消息(Unpin)
dws mcp im unset_pin_message --json '{"openConversationId":<..>, "openMessageId":<..>}'dws mcp im unset_pin_message --json '{"openConversationId":<..>, "cid":<..>, "openMessageId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/unset_pin_message
输入 / CLI 输出
输入
dws chat +messages-unset-pin --open-conversation-id x --msg-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "unset_pin_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cid": "x",
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "unset_pin_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1185ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。
真实输入
/private/tmp/dws-real-test chat +messages-unset-pin --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/unset_pin_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999544428103e08ee"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/unset_pin_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "im",
+    "trace_id": "2104a64c17840999544428103e08ee"
+  }
+}
dws chat +messages-unset-top --open-conversation-id <open-conversation-id> --msg-id <msg-id>write
取消置顶消息
dws mcp im unset_top_message --json '{"openConversationId":<..>, "openMessageId":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/unset_top_message
输入 / CLI 输出
输入
dws chat +messages-unset-top --open-conversation-id x --msg-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "unset_top_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x"
+  },
+  "product": "im",
+  "tool": "unset_top_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=963ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +messages-unset-top --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/unset_top_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999554154221e08f9"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/unset_top_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999554154221e08f9"
+  }
+}
dws chat +messages-update-card --biz-id <biz-id> --content <content> --flow-status <flow-status>write
流式更新卡片内容(最后一次 --flow-status 应为 3)
dws mcp im update_streaming_card --json '{"bizId":<..>, "msgContent":<..>, "flowStatus":<..>}' lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/update_streaming_card
输入 / CLI 输出
输入
dws chat +messages-update-card --biz-id x --content x --flow-status 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "bizId": "x",
+    "flowStatus": 1,
+    "msgContent": "x"
+  },
+  "product": "im",
+  "tool": "update_streaming_card"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "bizId": "x",
+    "flowStatus": 1,
+    "msgContent": "x"
+  },
+  "product": "im",
+  "tool": "update_streaming_card"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=934ms;real-backend-safe-negative-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +messages-update-card --biz-id __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__ --content 'DWS shortcut 真实测试 20260715-104025,安全负向输入,请忽略。' --flow-status 1 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws chat +my-groups --type <type>read
列出我加入的群,可按类型过滤并投影关键字段
dws mcp chat <tool>dws chat +my-groups --type <type>read复合/智能型
列出我加入的群,可按类型过滤并投影关键字段
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_my_groups_pagination
输入 / CLI 输出
输入
dws chat +my-groups --type x --yes
stdout
{
+  "count": 0,
+  "groups": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "groups": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1499ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +my-groups --type ALL --yes --format json
真实 stdout
{
+  "count": 0,
+  "groups": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "groups": []
+}
dws chat +search-msg --group <group> --query <query> --days <days>read
在群内按关键词搜消息(默认近 7 天,投影发送人/时间/内容/messageId)
dws mcp chat <tool>dws chat +search-msg --group <group> --query <query> --days <days>read复合/智能型
在群内按关键词搜消息(默认近 7 天,投影发送人/时间/内容/messageId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/search_messages_by_keyword
输入 / CLI 输出
输入
dws chat +search-msg --group x --query x --days 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cursor": "0",
+    "endTime": 1784105093141,
+    "keyword": "x",
+    "limit": 100,
+    "openConversationId": "x",
+    "startTime": 1784018693141
+  },
+  "product": "chat",
+  "tool": "search_messages_by_keyword"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cursor": "0",
+    "endTime": 1784105093141,
+    "keyword": "x",
+    "limit": 100,
+    "openConversationId": "x",
+    "startTime": 1784018693141
+  },
+  "product": "chat",
+  "tool": "search_messages_by_keyword"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1519ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test chat +search-msg --group cid3Jijzhe2aqs9ysOXjhi05g== --query '测试' --days 7 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户暂无消息搜索权益,无法执行本次搜索。请提示用户开通消息搜索权益后重试。\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "SearchRightsDenied",
+    "server_key": "chat",
+    "trace_id": "0b5deb3217840997866824643e0853"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户暂无消息搜索权益,无法执行本次搜索。请提示用户开通消息搜索权益后重试。\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "SearchRightsDenied",
+    "server_key": "chat",
+    "trace_id": "0b5deb3217840997866824643e0853"
+  }
+}
dws chat +send-to-group --group <group> --text <text>write
按群名直接给群发消息(自动搜群解析 openConversationId)
dws mcp chat send_personal_message --json '{"keyword":<..>, "limit":<..>, "cursor":<..>, "title":<..>, "text":<..>, "openConversationId":<..>, "msgType":<..>, "content":<..>}'dws chat +send-to-group --group <group> --text <text>write复合/智能型
按群名直接给群发消息(自动搜群解析 openConversationId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 send_personal_message lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/search_groups;没找到名字匹配 "x" 的群;换用群名里连续的核心词再试。
输入 / CLI 输出
输入
dws chat +send-to-group --group x --text x --yes
stdout
(空)
stderr / error
没找到名字匹配 "x" 的群;换用群名里连续的核心词再试。
最终用于判定的返回
没找到名字匹配 "x" 的群;换用群名里连续的核心词再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1854ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +send-to-group --group 'DWS测0715' --text 'DWS shortcut 真实测试 20260715:验证 chat +send-to-group,请忽略。' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openTaskId": "tECwJpPL2sAnZwUZhjTFhNWleCgSp0GSMPlGkMUIL5Q="
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openTaskId": "tECwJpPL2sAnZwUZhjTFhNWleCgSp0GSMPlGkMUIL5Q="
+  },
+  "success": true
+}
dws chat +thread-replies --group <group> --topic-id <topic-id> --time <time> --limit <limit>read
拉取某条话题消息的全部回复并投影出发言人/文本/时间
dws mcp chat <tool>dws chat +thread-replies --group <group> --topic-id <topic-id> --time <time> --limit <limit>read复合/智能型
拉取某条话题消息的全部回复并投影出发言人/文本/时间
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/list_topic_replies
输入 / CLI 输出
输入
dws chat +thread-replies --group x --topic-id x --time x --limit 1 --yes
stdout
{
+  "count": 0,
+  "replies": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "replies": []
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1582ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test chat +thread-replies --group cid3Jijzhe2aqs9ysOXjhi05g== --topic-id x --time '2026-07-15 10:00:00' --limit 10 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] failed to decrypt openConvThreadId\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "chat",
+    "trace_id": "0b5deb3217840997883504915e0853"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] failed to decrypt openConvThreadId\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "1001",
+    "server_key": "chat",
+    "trace_id": "0b5deb3217840997883504915e0853"
+  }
+}
dws chat +unread-chats --count <count> --exclude-muted <exclude-muted>read
列出我有未读消息的会话(投影会话名/未读数/会话ID)
dws mcp chat <tool>dws chat +unread-chats --count <count> --exclude-muted <exclude-muted>read复合/智能型
列出我有未读消息的会话(投影会话名/未读数/会话ID)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark im 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;chat/unread_message_conversation_list
输入 / CLI 输出
输入
dws chat +unread-chats --count 1 --exclude-muted --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "count": 1,
+    "excludeMuted": true
+  },
+  "product": "chat",
+  "tool": "unread_message_conversation_list"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "count": 1,
+    "excludeMuted": true
+  },
+  "product": "chat",
+  "tool": "unread_message_conversation_list"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1649ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test chat +unread-chats --count 1 --exclude-muted --yes --format json
真实 stdout
{
+  "conversations": [
+    {
+      "conversationId": "ciddYsoBxGQrFWR5zJ8lnpPBg==",
+      "name": "Wukong & Real 日志群"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "conversations": [
+    {
+      "conversationId": "ciddYsoBxGQrFWR5zJ8lnpPBg==",
+      "name": "Wukong & Real 日志群"
+    }
+  ]
+}

aitable · 82 个 · ↔ lark base

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + - - + + + + + + + + + - - + + + + + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws aitable +advperm-disable --base-id <base-id>high-risk-write
关闭指定 Base 的高级权限总开关(所有自定义角色失效)
dws mcp aitable set_advanced_permission --json '{"baseId":<..>, "enabled":<..>}' lark-cli base +advperm-disable已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/set_advanced_permission
输入 / CLI 输出
输入
dws aitable +advperm-disable --base-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "enabled": false
+  },
+  "product": "aitable-helper",
+  "tool": "set_advanced_permission"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "enabled": false
+  },
+  "product": "aitable-helper",
+  "tool": "set_advanced_permission"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1447ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test aitable +advperm-disable --base-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set advanced permission for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998455921653e08de\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set advanced permission for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998455921653e08de\"}"
+  }
+}
dws aitable +advperm-enable --base-id <base-id>write
开启指定 Base 的高级权限总开关
dws mcp aitable set_advanced_permission --json '{"baseId":<..>, "enabled":<..>}' lark-cli base +advperm-enable已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/set_advanced_permission
输入 / CLI 输出
输入
dws aitable +advperm-enable --base-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "enabled": true
+  },
+  "product": "aitable-helper",
+  "tool": "set_advanced_permission"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "enabled": true
+  },
+  "product": "aitable-helper",
+  "tool": "set_advanced_permission"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1358ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test aitable +advperm-enable --base-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set advanced permission for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"0bab027317840998469916877e08c8\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set advanced permission for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"0bab027317840998469916877e08c8\"}"
+  }
+}
dws aitable +attachment-upload --base-id <base-id> --file-name <file-name> --size <size> --mime-type <mime-type>write
为 attachment 字段申请 OSS 直传地址(uploadUrl / fileToken)
dws mcp aitable prepare_attachment_upload --json '{"baseId":<..>, "fileName":<..>, "size":<..>, "mimeType":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/prepare_attachment_upload
输入 / CLI 输出
输入
dws aitable +attachment-upload --base-id x --file-name x --size 1 --mime-type x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fileName": "x",
+    "mimeType": "x",
+    "size": 1
+  },
+  "product": "aitable",
+  "tool": "prepare_attachment_upload"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fileName": "x",
+    "mimeType": "x",
+    "size": 1
+  },
+  "product": "aitable",
+  "tool": "prepare_attachment_upload"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1131ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +attachment-upload --base-id DWSREALTESTNOSUCHID0000000000000 --file-name dws-shortcut-real-20260715-151724.txt --size 1 --mime-type text/plain --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to prepare attachment upload: base does not exist or is inaccessible\",\"trace_id\":\"213ee25c17840998481228948e087f\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to prepare attachment upload: base does not exist or is inaccessible\",\"trace_id\":\"213ee25c17840998481228948e087f\"}"
+  }
+}
dws aitable +base-copy --base-id <base-id> --target-folder-id <target-folder-id> --only-struct <only-struct>write
复制 AI 表格到指定目录(可仅复制结构)
dws mcp aitable copy_base --json '{"baseId":<..>, "targetFolderId":<..>, "onlyCopyMeta":<..>}' lark-cli base +base-copy已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/copy_base
输入 / CLI 输出
输入
dws aitable +base-copy --base-id x --target-folder-id x --only-struct --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "onlyCopyMeta": true,
+    "targetFolderId": "x"
+  },
+  "product": "aitable",
+  "tool": "copy_base"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "onlyCopyMeta": true,
+    "targetFolderId": "x"
+  },
+  "product": "aitable",
+  "tool": "copy_base"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1318ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +base-copy --base-id DWSREALTESTNOSUCHID0000000000000 --target-folder-id x --only-struct --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":null,\"message\":\"Invalid source baseId: DWSREALTESTNOSUCHID0000000000000\",\"retryable\":null,\"type\":\"USER_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Invalid source baseId\",\"trace_id\":\"213ee25c17840998493715617e08e2\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":null,\"message\":\"Invalid source baseId: DWSREALTESTNOSUCHID0000000000000\",\"retryable\":null,\"type\":\"USER_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Invalid source baseId\",\"trace_id\":\"213ee25c17840998493715617e08e2\"}"
+  }
+}
dws aitable +base-delete --base-id <base-id> --reason <reason>high-risk-write
删除指定 Base(不可逆)
dws mcp aitable delete_base --json '{"baseId":<..>, "reason":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/delete_base
输入 / CLI 输出
输入
dws aitable +base-delete --base-id x --reason x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "reason": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_base"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "reason": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_base"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1124ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test aitable +base-delete --base-id DWSREALTESTNOSUCHID0000000000000 --reason 'DWS shortcut 真实测试安全负向清理' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"52600003\",\"message\":\"Data not found\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete base DWSREALTESTNOSUCHID0000000000000. Check whether the base still exists, the caller still has access, and the baseId is from get_base/search_bases before retrying.\",\"trace_id\":\"2132f5ca17840998505858640e0874\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"52600003\",\"message\":\"Data not found\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete base DWSREALTESTNOSUCHID0000000000000. Check whether the base still exists, the caller still has access, and the baseId is from get_base/search_bases before retrying.\",\"trace_id\":\"2132f5ca17840998505858640e0874\"}"
+  }
+}
dws aitable +base-get --base-id <base-id>read
获取指定 Base 的目录信息(tables / dashboards summary)
dws mcp aitable get_base --json '{"baseId":<..>}' lark-cli base +base-get已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_base
输入 / CLI 输出
输入
dws aitable +base-get --base-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_base"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_base"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1773ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +base-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json
真实 stdout
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "baseName": "Real共创版设备去向登记",
+    "dashboards": [
+      {
+        "chartCount": 8,
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2",
+        "dashboardName": "仪表盘",
+        "meta": {}
+      }
+    ],
+    "documents": [],
+    "tables": [
+      {
+        "tableId": "hERWDMS",
+        "tableName": "Mac Mini"
+      },
+      {
+        "tableId": "k8d898q",
+        "tableName": "手机"
+      },
+      {
+        "tableId": "zyLRwwa",
+        "tableName": "SIM卡"
+      },
+      {
+        "tableId": "L53jNZz",
+        "tableName": "机箱"
+      },
+      {
+        "tableId": "zTiHNDL",
+        "tableName": "磁吸片"
+      },
+      {
+        "tableId": "anMdihs",
+        "tableName": "手机线"
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got base 'Real共创版设备去向登记' with 6 table(s). URL rules: AI 表格访问地址: https://docs.dingtalk.com/i/nodes/{baseId}; AI 表格数据表访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}; AI 表格仪表盘访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{dashboardId}; AI 表格说明文档地址: https://pre-alidocs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{documentId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "baseName": "Real共创版设备去向登记",
+    "dashboards": [
+      {
+        "chartCount": 8,
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2",
+        "dashboardName": "仪表盘",
+        "meta": {}
+      }
+    ],
+    "documents": [],
+    "tables": [
+      {
+        "tableId": "hERWDMS",
+        "tableName": "Mac Mini"
+      },
+      {
+        "tableId": "k8d898q",
+        "tableName": "手机"
+      },
+      {
+        "tableId": "zyLRwwa",
+        "tableName": "SIM卡"
+      },
+      {
+        "tableId": "L53jNZz",
+        "tableName": "机箱"
+      },
+      {
+        "tableId": "zTiHNDL",
+        "tableName": "磁吸片"
+      },
+      {
+        "tableId": "anMdihs",
+        "tableName": "手机线"
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got base 'Real共创版设备去向登记' with 6 table(s). URL rules: AI 表格访问地址: https://docs.dingtalk.com/i/nodes/{baseId}; AI 表格数据表访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}; AI 表格仪表盘访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{dashboardId}; AI 表格说明文档地址: https://pre-alidocs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{documentId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。"
+}
dws aitable +base-get-primary-doc-id --base-id <base-id> --table-id <table-id> --record-id <record-id>read
根据 baseId/tableId/recordId 获取主键文档的 dentryUuid
dws mcp aitable get_base_primary_doc_id --json '{"baseId":<..>, "tableId":<..>, "recordId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_base_primary_doc_id
输入 / CLI 输出
输入
dws aitable +base-get-primary-doc-id --base-id x --table-id x --record-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "recordId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_base_primary_doc_id"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "recordId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_base_primary_doc_id"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1929ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +base-get-primary-doc-id --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-id 1015oH3OXy --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"-1\",\"message\":\"no record\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to query cell doc for record 1015oH3OXy in table hERWDMS\",\"trace_id\":\"0b5deb3217840997466255627e08ee\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"-1\",\"message\":\"no record\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to query cell doc for record 1015oH3OXy in table hERWDMS\",\"trace_id\":\"0b5deb3217840997466255627e08ee\"}"
+  }
+}
dws aitable +base-list --limit <limit> --cursor <cursor>read
获取当前用户可访问的 AI 表格 Base 列表(最近访问,支持游标分页)
dws mcp aitable <tool> lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/list_bases
输入 / CLI 输出
输入
dws aitable +base-list --limit 1 --cursor x --yes
stdout
{
+  "bases": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "bases": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1289ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +base-list --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "bases": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "bases": [],
+  "count": 0
+}
dws aitable +base-search --query <query> --cursor <cursor>read
按名称关键词搜索 AI 表格 Base
dws mcp aitable <tool> lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/search_bases
输入 / CLI 输出
输入
dws aitable +base-search --query x --cursor x --yes
stdout
{
+  "bases": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "bases": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1628ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +base-search --query '测试' --cursor 0 --yes --format json
真实 stdout
{
+  "bases": [
+    {
+      "baseId": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03"
+    },
+    {
+      "baseId": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "baseName": "文件扫描测试 -20260414"
+    },
+    {
+      "baseId": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "baseName": "文件扫描测试(25)"
+    },
+    {
+      "baseId": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "baseName": "文件扫描测试(5)"
+    },
+    {
+      "baseId": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "baseName": "文件扫描测试(24)"
+    },
+    {
+      "baseId": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "baseName": "文件扫描测试(22)"
+    },
+    {
+      "baseId": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "baseName": "文件扫描测试(26)(2)"
+    },
+    {
+      "baseId": "MyQA2dXW7oOA63Yac5lMpzxkWzlwrZgb",
+      "baseName": "文件扫描测试"
+    },
+    {
+      "baseId": "9E05BDRVQePjzLkZtyX1L6vmV63zgkYA",
+      "baseName": "工作目录文件扫描测试"
+    },
+    {
+      "baseId": "y20BglGWOGQgpOj6u0GaqL3EWA7depqY",
+      "baseName": "case-0055-数据导入测试"
+    },
+    {
+      "baseId": "14dA3GK8gkP4oNl0cKqRz7jy89ekBD76",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-22 19:41:26"
+    },
+    {
+      "baseId": "gpG2NdyVXQyZ0OmoSGLpk7EdJMwvDqPk",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-22 18:41:20"
+    },
+    {
+      "baseId": "7dx2rn0Jbakrq9O5t2GbL30XVMGjLRb3",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-22 16:33:50"
+    },
+    {
+      "baseId": "OG9lyrgJPL7M2ONQSzPgGxwvJzN67Mw4",
+      "baseName": "case-0052-临时测试"
+    },
+    {
+      "baseId": "wva2dxOW4kO6dpRac0jppNE58bkz3BRL",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-21 22:11:30"
+    },
+    {
+      "baseId": "0eMKjyp81MrAdNmPu4NvYXAE8xAZB1Gv",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 21:24:44"
+    },
+    {
+      "baseId": "dxXB52LJqwZrolvyFMkR2MDPWqjMp697",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 16:53:48"
+    },
+    {
+      "baseId": "bva6QBXJwZenolNyS2Gwg2NxVn4qY5Pr",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 15:53:56"
+    },
+    {
+      "baseId": "bva6QBXJwZenolNyS2G3bNnOVn4qY5Pr",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 09:09:21"
+    },
+    {
+      "baseId": "pYLaezmVNGmDXOMxuGjwevPqJrMqPxX6",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 08:09:11"
+    }
+  ],
+  "count": 20
+}
真实 stderr / error
(空)
真实返回
{
+  "bases": [
+    {
+      "baseId": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03"
+    },
+    {
+      "baseId": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "baseName": "文件扫描测试 -20260414"
+    },
+    {
+      "baseId": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "baseName": "文件扫描测试(25)"
+    },
+    {
+      "baseId": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "baseName": "文件扫描测试(5)"
+    },
+    {
+      "baseId": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "baseName": "文件扫描测试(24)"
+    },
+    {
+      "baseId": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "baseName": "文件扫描测试(22)"
+    },
+    {
+      "baseId": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "baseName": "文件扫描测试(26)(2)"
+    },
+    {
+      "baseId": "MyQA2dXW7oOA63Yac5lMpzxkWzlwrZgb",
+      "baseName": "文件扫描测试"
+    },
+    {
+      "baseId": "9E05BDRVQePjzLkZtyX1L6vmV63zgkYA",
+      "baseName": "工作目录文件扫描测试"
+    },
+    {
+      "baseId": "y20BglGWOGQgpOj6u0GaqL3EWA7depqY",
+      "baseName": "case-0055-数据导入测试"
+    },
+    {
+      "baseId": "14dA3GK8gkP4oNl0cKqRz7jy89ekBD76",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-22 19:41:26"
+    },
+    {
+      "baseId": "gpG2NdyVXQyZ0OmoSGLpk7EdJMwvDqPk",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-22 18:41:20"
+    },
+    {
+      "baseId": "7dx2rn0Jbakrq9O5t2GbL30XVMGjLRb3",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-22 16:33:50"
+    },
+    {
+      "baseId": "OG9lyrgJPL7M2ONQSzPgGxwvJzN67Mw4",
+      "baseName": "case-0052-临时测试"
+    },
+    {
+      "baseId": "wva2dxOW4kO6dpRac0jppNE58bkz3BRL",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-21 22:11:30"
+    },
+    {
+      "baseId": "0eMKjyp81MrAdNmPu4NvYXAE8xAZB1Gv",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 21:24:44"
+    },
+    {
+      "baseId": "dxXB52LJqwZrolvyFMkR2MDPWqjMp697",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 16:53:48"
+    },
+    {
+      "baseId": "bva6QBXJwZenolNyS2Gwg2NxVn4qY5Pr",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 15:53:56"
+    },
+    {
+      "baseId": "bva6QBXJwZenolNyS2G3bNnOVn4qY5Pr",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 09:09:21"
+    },
+    {
+      "baseId": "pYLaezmVNGmDXOMxuGjwevPqJrMqPxX6",
+      "baseName": "🧪测试 工作区目录扫描 - 2026-04-20 08:09:11"
+    }
+  ],
+  "count": 20
+}
dws aitable +base-update --base-id <base-id> --name <name> --desc <desc>write
更新 Base 名称(可选备注)
dws mcp aitable update_base --json '{"baseId":<..>, "newBaseName":<..>, "description":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/update_base
输入 / CLI 输出
输入
dws aitable +base-update --base-id x --name x --desc x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "description": "x",
+    "newBaseName": "x"
+  },
+  "product": "aitable",
+  "tool": "update_base"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "description": "x",
+    "newBaseName": "x"
+  },
+  "product": "aitable",
+  "tool": "update_base"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1318ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +base-update --base-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --desc 'DWS shortcut 真实测试描述,可删除' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update base because base does not exist or is inaccessible\",\"trace_id\":\"2132f5ca17840998518767946e08b6\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update base because base does not exist or is inaccessible\",\"trace_id\":\"2132f5ca17840998518767946e08b6\"}"
+  }
+}
dws aitable +chart-delete --base-id <base-id> --dashboard-id <dashboard-id> --chart-id <chart-id> --reason <reason>high-risk-write
删除指定 chart 及其布局项(不可逆)
dws mcp aitable delete_chart --json '{"baseId":<..>, "dashboardId":<..>, "chartId":<..>, "reason":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/delete_chart
输入 / CLI 输出
输入
dws aitable +chart-delete --base-id x --dashboard-id x --chart-id x --reason x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "chartId": "x",
+    "dashboardId": "x",
+    "reason": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_chart"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "chartId": "x",
+    "dashboardId": "x",
+    "reason": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_chart"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1154ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +chart-delete --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --chart-id DWSREALTESTNOSUCHID0000000000000 --reason 'DWS shortcut 真实测试安全负向清理' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete chart DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"0bab027317840998530143696e08c9\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete chart DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"0bab027317840998530143696e08c9\"}"
+  }
+}
dws aitable +chart-get --base-id <base-id> --dashboard-id <dashboard-id> --chart-id <chart-id>read
获取指定 chart 的详细信息
dws mcp aitable get_chart --json '{"baseId":<..>, "dashboardId":<..>, "chartId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_chart
输入 / CLI 输出
输入
dws aitable +chart-get --base-id x --dashboard-id x --chart-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "chartId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_chart"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "chartId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_chart"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1038ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +chart-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --dashboard-id KY9tlWg5NEHgfs8WT6IO2 --chart-id widget-dlxFo0tNSImp4ITpDn5fQ --yes --format json
真实 stdout
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "chartId": "widget-dlxFo0tNSImp4ITpDn5fQ",
+    "chartName": "各业务线未部署数",
+    "chartType": "BAR",
+    "config": {
+      "axisLabelShow": false,
+      "categoryAxisMaxRatio": "0.3",
+      "chartType": "BAR",
+      "colors": "COLOR_PALETTE_1",
+      "dimension": [
+        {
+          "value": "rjwzzIu"
+        }
+      ],
+      "fillType": "solid",
+      "filter": [],
+      "gridShow": false,
+      "group": [
+        {
+          "value": "none"
+        }
+      ],
+      "label": true,
+      "labelHideOverlap": true,
+      "legend": "top",
+      "measure": [
+        {
+          "externalValue": [
+            {
+              "type": "formula",
+              "value": "count"
+            }
+          ],
+          "value": "kFwb8br"
+        }
+      ],
+      "measureType": "field",
+      "nullValue": "ignore",
+      "sheet": "hERWDMS",
+      "sortRule": "asc",
+      "view": "",
+      "xAbbr": {
+        "abbr": "",
+        "decimal": "",
+        "numberType": "default"
+      },
+      "xAxisLabel": true,
+      "xAxisLabelRotate": "auto",
+      "xAxisLine": false,
+      "xAxisShow": true,
+      "xSortBy": "x",
+      "xSortCustom": [],
+      "yAbbr": {
+        "abbr": "",
+        "decimal": "",
+        "numberType": "default"
+      },
+      "yAxisLabel": true,
+      "yAxisLine": false,
+      "yAxisRange": {
+        "range": [],
+        "type": "absolute"
+      },
+      "yAxisShow": true,
+      "yRightAbbr": {
+        "abbr": "",
+        "decimal": "",
+        "numberType": "default"
+      },
+      "ySortCustom": []
+    },
+    "dashboardId": "KY9tlWg5NEHgfs8WT6IO2",
+    "layout": {
+      "h": 5,
+      "i": "widget-dlxFo0tNSImp4ITpDn5fQ",
+      "w": 6,
+      "x": 0,
+      "y": 4
+    }
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got chart widget-dlxFo0tNSImp4ITpDn5fQ"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "chartId": "widget-dlxFo0tNSImp4ITpDn5fQ",
+    "chartName": "各业务线未部署数",
+    "chartType": "BAR",
+    "config": {
+      "axisLabelShow": false,
+      "categoryAxisMaxRatio": "0.3",
+      "chartType": "BAR",
+      "colors": "COLOR_PALETTE_1",
+      "dimension": [
+        {
+          "value": "rjwzzIu"
+        }
+      ],
+      "fillType": "solid",
+      "filter": [],
+      "gridShow": false,
+      "group": [
+        {
+          "value": "none"
+        }
+      ],
+      "label": true,
+      "labelHideOverlap": true,
+      "legend": "top",
+      "measure": [
+        {
+          "externalValue": [
+            {
+              "type": "formula",
+              "value": "count"
+            }
+          ],
+          "value": "kFwb8br"
+        }
+      ],
+      "measureType": "field",
+      "nullValue": "ignore",
+      "sheet": "hERWDMS",
+      "sortRule": "asc",
+      "view": "",
+      "xAbbr": {
+        "abbr": "",
+        "decimal": "",
+        "numberType": "default"
+      },
+      "xAxisLabel": true,
+      "xAxisLabelRotate": "auto",
+      "xAxisLine": false,
+      "xAxisShow": true,
+      "xSortBy": "x",
+      "xSortCustom": [],
+      "yAbbr": {
+        "abbr": "",
+        "decimal": "",
+        "numberType": "default"
+      },
+      "yAxisLabel": true,
+      "yAxisLine": false,
+      "yAxisRange": {
+        "range": [],
+        "type": "absolute"
+      },
+      "yAxisShow": true,
+      "yRightAbbr": {
+        "abbr": "",
+        "decimal": "",
+        "numberType": "default"
+      },
+      "ySortCustom": []
+    },
+    "dashboardId": "KY9tlWg5NEHgfs8WT6IO2",
+    "layout": {
+      "h": 5,
+      "i": "widget-dlxFo0tNSImp4ITpDn5fQ",
+      "w": 6,
+      "x": 0,
+      "y": 4
+    }
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got chart widget-dlxFo0tNSImp4ITpDn5fQ"
+}
dws aitable +chart-share-get --base-id <base-id> --dashboard-id <dashboard-id> --chart-id <chart-id>read
查询 chart 的分享配置
dws mcp aitable get_chart_share --json '{"baseId":<..>, "dashboardId":<..>, "chartId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_chart_share
输入 / CLI 输出
输入
dws aitable +chart-share-get --base-id x --dashboard-id x --chart-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "chartId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_chart_share"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "chartId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_chart_share"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1584ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test aitable +chart-share-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --dashboard-id KY9tlWg5NEHgfs8WT6IO2 --chart-id widget-dlxFo0tNSImp4ITpDn5fQ --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"403\",\"message\":\"Forbidden\",\"retryable\":false,\"type\":\"AUTH_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get chart share config for chart widget-dlxFo0tNSImp4ITpDn5fQ: [403] Forbidden\",\"trace_id\":\"2127d89817840997481396653e075d\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"403\",\"message\":\"Forbidden\",\"retryable\":false,\"type\":\"AUTH_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get chart share config for chart widget-dlxFo0tNSImp4ITpDn5fQ: [403] Forbidden\",\"trace_id\":\"2127d89817840997481396653e075d\"}"
+  }
+}
dws aitable +chart-share-update --base-id <base-id> --dashboard-id <dashboard-id> --chart-id <chart-id> --enabled <enabled> --share-type <share-type> --allow-back-to-doc <allow-back-to-doc>write
开启/关闭 chart 分享并可设置分享类型
dws mcp aitable update_chart_share --json '{"baseId":<..>, "dashboardId":<..>, "chartId":<..>, "enabled":<..>, "shareType":<..>, "allowBackToDoc":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/update_chart_share
输入 / CLI 输出
输入
dws aitable +chart-share-update --base-id x --dashboard-id x --chart-id x --enabled --share-type PUBLIC --allow-back-to-doc --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "allowBackToDoc": true,
+    "baseId": "x",
+    "chartId": "x",
+    "dashboardId": "x",
+    "enabled": true,
+    "shareType": "PUBLIC"
+  },
+  "product": "aitable",
+  "tool": "update_chart_share"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "allowBackToDoc": true,
+    "baseId": "x",
+    "chartId": "x",
+    "dashboardId": "x",
+    "enabled": true,
+    "shareType": "PUBLIC"
+  },
+  "product": "aitable",
+  "tool": "update_chart_share"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1175ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +chart-share-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --chart-id DWSREALTESTNOSUCHID0000000000000 --enabled --share-type PUBLIC --allow-back-to-doc --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update chart share for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"0bab027317840998541842968e094d\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update chart share for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"0bab027317840998541842968e094d\"}"
+  }
+}
dws aitable +chart-update --base-id <base-id> --dashboard-id <dashboard-id> --chart-id <chart-id> --config <config> --layout <layout>write
更新指定 chart 的配置或布局(--config 必填)
dws mcp aitable update_chart --json '{"baseId":<..>, "dashboardId":<..>, "chartId":<..>, "config":<..>, "layout":<..>}' lark base 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--config JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +chart-update --base-id x --dashboard-id x --chart-id x --config x --layout x --yes
stdout
(空)
stderr / error
--config JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--config JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1102ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +chart-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --chart-id DWSREALTESTNOSUCHID0000000000000 --config '{}' --layout '{}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"config is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update chart because config is missing\",\"trace_id\":\"2106d98117840998553244877e08df\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"config is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update chart because config is missing\",\"trace_id\":\"2106d98117840998553244877e08df\"}"
+  }
+}
dws aitable +chart-widgets-exampleread
获取所有图表类型的 widget config 示例
dws mcp aitable get_dashboard_widgets_example lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_dashboard_widgets_example
输入 / CLI 输出
输入
dws aitable +chart-widgets-example --yes
stdout
{
+  "_fake": true,
+  "args": {},
+  "product": "aitable",
+  "tool": "get_dashboard_widgets_example"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {},
+  "product": "aitable",
+  "tool": "get_dashboard_widgets_example"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1286ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +chart-widgets-example --yes --format json
真实 stdout
{
+  "data": "// 注意\n// 1. 下述 JSON 示例中的注释(// 开头的注释)仅用于说明,实际使用时请删除,否则会导致解析错误\n// 2. 所有图表类型的 widget config 示例,key 是图表类型,value 是对应的完整 config\n// 3. 创建图表时,必需使用示例中的图表类型和配置格式\n\n\n{\n// 聚合列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"AGGREGATE_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"AGGREGATE_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"聚合列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置聚合列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置聚合列表的显示方式和布局\n    \"listConfig\": {},\n    // 字段聚合映射,用于设置字段的聚合方式(如 sum、count、avg 等)\n    \"fieldAggregateMap\": {},\n    // 工具栏配置,用于控制聚合列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n    },\n  },\n// AI 分析卡片配置格式,必须按照此格式配置,否则会导致解析错误\n  // 注意:AI 分析卡片不依赖数据表,无需配置 sheet / view / filter\n  \"AI_ANALYZE\": {\n    // 必填,图表类型,固定值 \"AI_ANALYZE\"\n    \"chartType\": \"AI_ANALYZE\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"AI 分析卡片\",\n    // 可选,AI 提示词,用自然语言描述希望 AI 分析的内容和问题,\n    // 例如:\"分析本月各产品线的销售额趋势,找出增长最快的类别并给出建议\"\n    \"prompt\": \"\",\n    // 可选,需要 AI 参考分析的图表 ID 列表,数组中每个元素必须是当前仪表盘中已存在的图表 ID;\n    // 不填或传空数组时 AI 将基于提示词独立分析,不关联具体图表数据\n    \"analyzeChartIds\": [],\n    // 可选,指定 AI 模型 ID;不填时使用系统默认模型\n    \"modelId\": \"\",\n    // 只读,AI 生成的 Markdown 分析内容,由系统写入,创建时无需填写\n    \"content\": \"\",\n    // 只读,AI 分析结果的最后更新时间戳(毫秒),由系统写入,创建时无需填写\n    \"lastUpdatedAt\": null\n  },\n// 面积图配置格式\n  \"AREA\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"AREA\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"面积图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 条形图配置格式\n  \"BAR\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"BAR\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"条形图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"record-count\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"nullValue\": \"ignore\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"label\": true,\n    \"labelHideOverlap\": true,\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"categoryAxisMaxRatio\": \"0.3\",\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"fillType\": \"solid\",\n    \"filter\": []\n  }\n// 按钮配置格式,必须按照此格式配置,否则会导致解析错误\n  \"BUTTON\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"BUTTON\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"按钮\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,按钮样式类型,合法值有:type1 到 type10,默认为 type1\n    \"buttonStyleType\": \"type1\",\n    // 可选,边框宽度,默认为 1\n    \"borderWidth\": 1,\n    // 可选,按钮大小,合法值有:default(默认)/ small(小)/ large(大),默认为 default\n    \"buttonSize\": \"default\",\n    // 可选,按钮图标,合法值有:link / download / refresh 等\n    \"buttonIcon\": \"link\",\n    // 可选,按钮图标背景类型,合法值有:light(浅色)/ dark(深色),默认为 light\n    \"buttonIconBackgroundType\": \"light\",\n    // 可选,按钮字体配置\n    \"buttonFontSetting\": {\n      // 字体大小,默认为 14\n      \"size\": 14,\n      // 字体颜色\n      \"color\": \"\",\n      // 字间距,默认为 0\n      \"letterSpacing\": 0,\n      // 是否加粗,默认为 false\n      \"bold\": false,\n      // 是否斜体,默认为 false\n      \"italic\": false,\n      // 是否下划线,默认为 false\n      \"underline\": false\n    }\n  },\n// 日历视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"CALENDAR_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"CALENDAR_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"日历视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 视图分组配置,用于设置视图的默认分组规则\n    \"viewGroup\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 日历自定义配置,这是日历视图的核心配置\n    \"calendarCustom\": {\n      // 必填,显示字段 ID(必须是该表中真实存在的字段 ID)\n      // 用于在日历中显示事件标题或描述\n      \"displayFieldId\": \"fld_text_01\",\n      // 必填,开始时间字段 ID(必须是该表中真实存在的日期字段 ID)\n      // 用于设置事件的开始时间\n      \"startField\": \"fld_date_01\",\n      // 必填,结束时间字段 ID(必须是该表中真实存在的日期字段 ID)\n      // 用于设置事件的结束时间\n      \"endField\": \"fld_date_02\",\n      // 标记配置,用于在日历中添加特殊标记或样式\n      \"markers\": [],\n      // 时间轴刻度,合法值有:day(日)/ week(周)/ month(月)\n      // 用于设置日历的显示粒度\n      \"timelineScale\": \"month\",\n      // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\n      \"widthMap\": {},\n      // 单元格高度,单位为像素,默认为 32\n      \"cellHeight\": 32\n    },\n    // 工具栏配置,用于控制日历视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// 卡片列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"CARD_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"CARD_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"卡片列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置卡片列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置卡片列表的显示方式和布局\n    \"listConfig\": {},\n    // 工具栏配置,用于控制卡片列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n    },\n  },\n// 折叠列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"COLLAPSIBLE_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"COLLAPSIBLE_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"折叠列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置折叠列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置折叠列表的显示方式和布局\n    \"listConfig\": {},\n    // 工具栏配置,用于控制折叠列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n    },\n  },\n// 组合布局配置格式,必须按照此格式配置,否则会导致解析错误\n  \"COMPOSITE_LAYOUT\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"COMPOSITE_LAYOUT\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"组合布局\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\"\n    // 组合布局容器,无特殊配置字段,用于承载其他图表组件\n  },\n// 组合图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"COMPOSITION\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"COMPOSITION\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"组合图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ],\n        \"composition\": {\n          // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"HISTOGRAM\",\n          \"yAxisPosition\": \"left\"\n        }\n      },\n      {\n        \"value\": \"fld_number_02\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"average\"\n          }\n        ],\n        \"composition\": {\n          // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"LINE\",\n          \"yAxisPosition\": \"right\"\n        }\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"label\": true,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:倒计时(COUNTDOWN)\n  // 别名/同义词:倒计时、正计时、计时器、倒计时卡片\n  // 用途:用于展示距离某个目标日期的剩余时间或已过时间,\n  //       支持倒计时和正计时两种模式。适合展示活动截止时间、\n  //       项目里程碑、重要日期提醒等场景。\n  // ═══════════════════════════════════════════════════════════════════\n  // ⚠️ 重要注意事项:\n  //   1. fixedDatetime 必须是毫秒时间戳(如 1746028800000),不是日期字符串(如 \"2026-05-01\")!\n  //   2. unit 是一个对象(Object),不是字符串!不要写成 \"天\" 或 \"day\"!\n  //   3. 背景色字段名是 \"background\",不是 \"backgroundColor\"\n  //   4. 时间数字颜色字段名是 \"timeColor\",不是 \"numberColor\"\n  //   5. 描述文字颜色字段名是 \"descColor\",不是 \"titleColor\"\n  //   6. 不存在 \"countdownType\"、\"endDate\"、\"numberColor\"、\"titleColor\" 等字段,使用这些字段会导致图表渲染异常\n  \"COUNTDOWN\": {\n    // 必填,图表类型,固定值 \"COUNTDOWN\"\n    \"chartType\": \"COUNTDOWN\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"倒计时\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": null,\n    // 可选,描述文本,显示在倒计时数字上方\n    \"desc\": \"倒计时\",\n    // 必填,数据来源类型,合法值:fixed(固定日期时间)/ field(从数据表日期字段取值)\n    \"sourceType\": \"fixed\",\n    // sourceType = \"fixed\" 时必填,目标日期的毫秒时间戳\n    // ⚠️ 必须是毫秒时间戳数字(如 1746028800000),不是日期字符串(如 \"2026-05-01\")!\n    // 示例:2026-05-01 00:00:00 → 1746028800000\n    \"fixedDatetime\": 1746028800000,\n    // sourceType = \"field\" 时填写,日期字段的 fieldId\n    \"fieldId\": null,\n    // sourceType = \"field\" 时填写,日期选择方式,合法值:earliest(最早日期)/ latest(最晚日期)\n    \"fieldChoice\": \"earliest\",\n    // 必填,计时模式,合法值:countdown(倒计时,目标时间在未来)/ countup(正计时,目标时间在过去)\n    \"timingMode\": \"countdown\",\n    // 必填,显示的时间单位开关(是一个对象,不是字符串!)\n    // ⚠️ 不要写成 \"天\" 或 \"day\",必须是如下对象格式:\n    \"unit\": {\n      // 是否显示月,默认 false\n      \"month\": false,\n      // 是否显示周,默认 false\n      \"week\": false,\n      // 是否显示天,默认 true\n      \"day\": true,\n      // 是否显示小时,默认 true\n      \"hour\": true,\n      // 是否显示分钟,默认 true\n      \"minute\": true,\n      // 是否显示秒,默认 true\n      \"second\": true\n    },\n\n    // ── 样式配置 ──────────────────────────────────────────────────────────────\n    // 可选,卡片背景颜色(⚠️ 字段名是 \"background\",不是 \"backgroundColor\")\n    \"background\": \"\",\n    // 可选,描述文字颜色(⚠️ 字段名是 \"descColor\",不是 \"titleColor\")\n    \"descColor\": \"\",\n    // 可选,时间块背景颜色\n    \"timeBlockColor\": \"\",\n    // 可选,倒计时数字颜色(⚠️ 字段名是 \"timeColor\",不是 \"numberColor\")\n    \"timeColor\": \"\",\n    // 可选,计时完成是否显示动效,默认 false\n    \"showFinishEffect\": false\n  },\n// 详情列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"DETAIL_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"DETAIL_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"详情列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置详情列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置详情列表的显示方式和布局\n    \"listConfig\": {},\n    // 工具栏配置,用于控制详情列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n    },\n  },\n// 嵌入网页配置格式,必须按照此格式配置,否则会导致解析错误\n  \"EMBED_WEBPAGE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"EMBED_WEBPAGE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"嵌入网页\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 必填,嵌入的网页 URL(必须是有效的 URL 地址)\n    \"url\": \"https://example.com\"\n  },\n// 漏斗图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"FUNNEL\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"FUNNEL\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"漏斗图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"record-count\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"sumValue\": true,\n    \"funnelType\": \"normal\",\n    \"filter\": []\n  },\n// 画册视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"GALLERY_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"GALLERY_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"画册视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 画册自定义配置,用于设置画册的显示样式\n    \"galleryCustom\": {\n      // 卡片设置,用于配置画册中卡片的显示方式\n      \"cardSetting\": {\n        // 封面模式,合法值有:none(无封面)/ cover(封面)等\n        \"coverMode\": \"none\"\n      }\n    },\n    // 工具栏配置,用于控制画册视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// 甘特视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"GANTT_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"GANTT_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"甘特视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 视图分组配置,用于设置视图的默认分组规则\n    \"viewGroup\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 是否折叠网格,默认为 false\n    \"collapsedGrid\": false,\n    // 甘特自定义配置,这是甘特视图的核心配置\n    \"ganttCustom\": {\n      // 必填,显示字段 ID(必须是该表中真实存在的字段 ID)\n      // 用于在甘特图中显示任务名称或描述\n      \"displayFieldId\": \"fld_text_01\",\n      // 必填,开始时间字段 ID(必须是该表中真实存在的日期字段 ID)\n      // 用于设置任务的开始时间\n      \"startField\": \"fld_date_01\",\n      // 必填,结束时间字段 ID(必须是该表中真实存在的日期字段 ID)\n      // 用于设置任务的结束时间\n      \"endField\": \"fld_date_02\",\n      // 标记配置,用于在甘特图中添加里程碑或重要时间点\n      \"markers\": [],\n      // 时间轴刻度,合法值有:day(日)/ week(周)/ month(月)/ quarter(季)/ year(年)\n      // 用于设置甘特图的时间轴显示粒度\n      \"timelineScale\": \"month\",\n      // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\n      \"widthMap\": {},\n      // 单元格高度,单位为像素,默认为 32\n      \"cellHeight\": 32\n    },\n    // 工具栏配置,用于控制甘特视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// 表格视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"GRID_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"GRID_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"表格视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 视图分组配置,用于设置视图的默认分组规则\n    \"viewGroup\": [],\n    // 单元格高度,单位为像素,默认为 32\n    \"cellHeight\": 32,\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\n    \"widthMap\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 冻结列数,默认为 1,表示冻结左侧的列数\n    \"frozenColCount\": 1,\n    // 工具栏配置,用于控制表格视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 创建行按钮的文本内容\n      \"createRowText\": \"\",\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:柱状图(HISTOGRAM)\n  // 别名/同义词:竖向柱图、垂直柱图、分组柱图\n  // 用途:以垂直柱子展示多个分类维度的数值对比,适合比较不同类别之间的\n  //       数量差异,如各月销售额对比、各部门人数对比、各产品销量排名等。\n  //       核心特征:有 X 轴(分类维度)和 Y 轴(数值),每个类别对应一根柱子。\n  // 与\"统计数字(SUMMARY)\"的关键区别:\n  //   - 柱状图(HISTOGRAM):展示多个分类的对比,有坐标轴,是\"多值图表\"\n  //   - 统计数字(SUMMARY):只展示一个聚合数字,无坐标轴,是\"单值卡片\"\n  // 重要:当用户说\"柱状图\"、\"柱图\"、\"分组柱图\"时,\n  //       必须使用 chartType = \"HISTOGRAM\",不要使用 SUMMARY 或其他图表类型。\n  // ═══════════════════════════════════════════════════════════════════\n  \"HISTOGRAM\": {\n    // 必填,图表类型,固定值 \"HISTOGRAM\"(柱状图)\n    \"chartType\": \"HISTOGRAM\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"柱状图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"record-count\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_02\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"xSortCustom\": [],\n    \"ySortCustom\": [],\n    \"sortRule\": \"asc\",\n    \"nullValue\": \"ignore\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"axisLabelShow\": false,\n    \"label\": true,\n    \"labelHideOverlap\": true,\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"xAxisLabelRotate\": \"auto\",\n    \"categoryAxisMaxRatio\": \"0.2\",\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"fillType\": \"solid\",\n    \"yAxisRange\": {\n      \"type\": \"absolute\",\n      \"range\": []\n    },\n    \"xAbbr\": {\n      \"numberType\": \"default\",\n      \"abbr\": \"\",\n      \"decimal\": \"\"\n    },\n    \"yAbbr\": {\n      \"numberType\": \"default\",\n      \"abbr\": \"\",\n      \"decimal\": \"\"\n    },\n    \"yRightAbbr\": {\n      \"numberType\": \"default\",\n      \"abbr\": \"\",\n      \"decimal\": \"\"\n    },\n    \"filter\": []\n  }\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:图片(IMAGE)\n  // 别名/同义词:图片卡、图片展示、图片轮播、Banner 图\n  // 用途:在仪表盘中展示一张或多张静态图片,支持多图轮播(滑动/淡入淡出),\n  //       可为每张图片配置标题、描述和点击跳转链接。适合展示品牌 Banner、\n  //       产品图、说明图、装饰图等不依赖数据表的纯图片内容。\n  // 重要:当用户说\"图片\"、\"图片卡\"、\"图片展示\"、\"Banner\"、\"轮播图\"时,\n  //       必须使用 chartType = \"IMAGE\",不要使用其他图表类型。\n  //       此图表类型不依赖数据表,无需配置 sheet / view / filter。\n  // ═══════════════════════════════════════════════════════════════════\n  \"IMAGE\": {\n    // 必填,图表类型,固定值 \"IMAGE\"(图片)\n    \"chartType\": \"IMAGE\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"图片\",\n    // 必填,图片列表,至少包含一张图片;多张图片时支持轮播\n    \"img_images\": [\n      {\n        // 必填,图片的访问 URL\n        \"url\": \"https://example.com/image.png\",\n        // 可选,图片标题,显示在图片上方(需 img_showImgText=true)\n        \"title\": \"\",\n        // 可选,图片描述,显示在标题下方(需 img_showImgText=true)\n        \"desc\": \"\",\n        // 可选,点击图片后跳转的链接 URL\n        \"toUrl\": \"\",\n        // 必填,图片填充模式,合法值:cover(裁剪铺满)/ contain(等比缩放留白)/ fill(拉伸铺满)\n        \"fillMode\": \"cover\"\n      }\n    ],\n    // 可选,是否在图片上显示标题和描述文字,默认 true;\n    // 设为 false 时 img_titleStyle / img_descStyle / img_textAlign 均不生效\n    \"img_showImgText\": true,\n    // 可选,图片文字的对齐位置,合法值:\n    //   leftTop / top / rightTop / left / center / right / leftBottom / bottom / rightBottom\n    \"img_textAlign\": \"center\",\n    // 可选,图片标题的字体样式(仅 img_showImgText=true 时生效)\n    \"img_titleStyle\": {\n      // 字体大小(px),合法范围 16~56,步长 4\n      \"size\": 16,\n      // 字体颜色,十六进制色值,如 \"#FFFFFF\"\n      \"color\": \"\",\n      // 是否加粗\n      \"bold\": true,\n      // 是否斜体\n      \"italic\": false,\n      // 是否下划线\n      \"underline\": false\n    },\n    // 可选,图片描述的字体样式(仅 img_showImgText=true 时生效)\n    \"img_descStyle\": {\n      // 字体大小(px),合法范围 16~56,步长 4\n      \"size\": 14,\n      // 字体颜色,十六进制色值\n      \"color\": \"\",\n      // 是否加粗\n      \"bold\": false,\n      // 是否斜体\n      \"italic\": false,\n      // 是否下划线\n      \"underline\": false\n    },\n    // 可选,多图时是否自动轮播,默认 false;单张图片时此配置无效\n    \"img_autoPlay\": false,\n    // 可选,多图轮播切换动效,合法值:slide(滑动)/ fade(淡入淡出),默认 slide;单张图片时无效\n    \"img_imgTransitionType\": \"slide\",\n    // 可选,多图自动轮播间隔(秒),合法范围 0.1~1000,默认 1;仅 img_autoPlay=true 时生效\n    \"img_imgTransitionInterval\": 1\n  },\n// 看板视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"KANBAN_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"KANBAN_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"看板视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 看板自定义配置,这是看板视图的核心配置\n    \"kanbanCustom\": {\n      // 分组基础配置,用于设置看板的分组字段\n      \"groupBase\": {\n        // 必填,分组字段 ID(必须是该表中真实存在的字段 ID)\n        // 看板将按照此字段的值进行分组显示\n        \"baseFieldId\": \"fld_select_01\"\n      }\n    },\n    // 工具栏配置,用于控制看板视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// 排行榜配置格式,必须按照此格式配置,否则会导致解析错误\n  \"LEADERBOARD\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"LEADERBOARD\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"排行榜\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    \"measureType\": \"record-count\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_text_01\"\n      }\n    ],\n    \"showType\": \"podium\", // 展示类型:podium 领奖台/list 列表\n    \"showCount\": 10, // 显示条数\n    \"hideValue\": false,\n    \"sortRule\": \"asc\",\n    \"filter\": []\n  },\n// 折线图配置格式\n  \"LINE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"LINE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"折线图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"nullValue\": \"ignore\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"label\": true,\n    \"labelHideOverlap\": true,\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"fillType\": \"solid\",\n    \"filter\": []\n  }\n// 抽奖配置格式,必须按照此格式配置,否则会导致解析错误\n  \"LOTTERY\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"LOTTERY\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"抽奖\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 必填,指标类型,合法值有:record-count(记录数)/ field(字段)\n    \"measureType\": \"record-count\",\n    // 必填,指标配置数组\n    \"measure\": [],\n    // 可选,输出表 ID,用于记录中奖结果\n    \"outputSheet\": \"\",\n    // 可选,滚动速度,默认为 5\n    \"speed\": 5,\n    // 可选,字体大小,默认为 20\n    \"fontSize\": 20,\n    // 可选,颜色主题,合法值有:COLOR_PALETTE_1 到 COLOR_PALETTE_10\n    \"colors\": \"COLOR_PALETTE_1\",\n    // 必填,奖项配置数组,每个元素格式为 [数量, 名称]\n    \"gameRounds\": [\n      [\n        1,\n        \"一等奖\"\n      ]\n    ],\n    // 可选,是否包含已中奖者,默认为 false\n    \"includeWinners\": false\n  },\n// 跑马灯配置格式,必须按照此格式配置,否则会导致解析错误\n  \"MARQUEE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"MARQUEE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"跑马灯\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,滚动文本内容\n    \"content\": \"这是一条滚动消息\",\n    // 可选,字体大小,默认为 14\n    \"fontSize\": 14,\n    // 可选,滚动速度,数值越小速度越快,默认为 50\n    \"speed\": 50,\n    // 可选,字体配置\n    \"fontSetting\": {\n      // 字体颜色\n      \"color\": \"\",\n      // 是否加粗,默认为 false\n      \"bold\": false,\n      // 是否斜体,默认为 false\n      \"italic\": false,\n      // 是否下划线,默认为 false\n      \"underline\": false\n    }\n  },\n// NPS评分配置格式,必须按照此格式配置,否则会导致解析错误\n  \"NPS\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"NPS\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"NPS评分\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\"\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"showLabel\": true,\n    \"showList\": false,\n    \"threshold\": [ // 评分阈值数组\n      2,\n      3\n    ],\n    \"colorSetName\": \"COLOR_PALETTE_1\",\n    \"filter\": []\n  },\n// 百分比堆叠面积图配置格式\n  \"PERCENT_STACKED_AREA\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PERCENT_STACKED_AREA\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"百分比堆叠面积图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": true,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 百分比堆叠条形图配置格式\n  \"PERCENT_STACKED_BAR\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PERCENT_STACKED_BAR\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"百分比堆叠条形图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_02\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": true,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"categoryAxisMaxRatio\": \"0.3\",\n    \"filter\": []\n  }\n// 百分比堆叠柱状图配置格式\n  \"PERCENT_STACKED_HISTOGRAM\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PERCENT_STACKED_HISTOGRAM\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"百分比堆叠柱状图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_02\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": true,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 饼图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"PIE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PIE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"饼图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"colors\": \"COLOR_PALETTE_1\", // 必须使用示例中的默认值如 COLOR_PALETTE_1,禁止自行编造\n    \"legend\": \"none\",\n    \"label\": true, // 必须设为 true 以默认显示数据标签\n    \"innerRadius\": 0, // 内半径,0 为实心饼图\n    \"outerRadius\": 60, // 外半径百分比\n    \"filter\": []\n  },\n// 透视表配置格式,必须按照此格式配置,否则会导致解析错误\n  \"PIVOT\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PIVOT\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"透视表\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 透视表配置,这是透视表的核心配置\n    \"pivotConfig\": {\n      // 必填,rows 是行字段列表,至少要有一个行字段,\n      // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\n      // 如果多层分组,行字段列表中多个字段的 fieldId 依次对应每层分组的字段 ID\n      \"rows\": [\n        {\n          // 必填,行字段 ID(必须是该表中真实存在的字段 ID)\n          \"fld\": \"fld_01\",\n          // 可选,排序方式,合法值有:1(升序)和 -1(降序),默认为 1 升序\n          \"srt\": 1\n        }\n      ],\n      // 可选,columns 是列字段列表,默认为空数组,\n      // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\n      // 如果多层分组,列字段列表中多个字段的 fieldId 依次对应每层分组的字段 ID\n      \"columns\": [\n        {\n          // 必填,列字段 ID(必须是该表中真实存在的字段 ID)\n          \"fld\": \"fld_02\",\n          // 可选,排序方式,合法值有:1(升序)和 -1(降序),默认为 1 升序\n          \"srt\": 1\n        }\n      ],\n      // 必填,values 是值字段列表,至少要有一个值字段,\n      // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\n      // 值字段,是用于计算值的字段,通常是数值字段,但也可以是其他类型的字段(如文本字段),具体取决于聚合函数的要求\n      \"values\": [\n        {\n          // 必填,值字段 ID(必须是该表中真实存在的字段 ID)\n          \"fld\": \"fld_03\",\n          //必填,聚合函数,合法值有:sum /count / count_distinct / avg / min / max / median / population_variance / sample_variance / population_stddev / sample_stddev / first / last / range / mode / sum_of_squares / harmonic_mean / geometric_mean / interquartile_range / centered_mean / weighted_mean / kurtosis / skewness / quartile_median / range_median / coefficient_of_variation / adjusted_stddev / weighted_sum / weighted_count / weighted_count_distinct / weighted_avg / centered_weighted_mean / weighted_harmonic_mean / weighted_geometric_mean / weighted_range / weighted_range_median / weighted_interquartile_range / weighted_quartile_median / weighted_centered_mean / weighted_adjusted_stddev\n          \"agg\": \"sum\",\n          //可选,后聚合函数,合法值有:default / percent_of_row_total / percent_of_col_total / percent_of_grand_total\n          \"pgg\": \"string\",\n          //可选,格式化函数,合法值有:default / percentage / thousands / currency / scientific / fixed / integer\n          \"fmt\": \"\",\n          //可选,字段别名\n          \"als\": \"string\"\n        }\n      ],\n      // 是否显示行总计,默认为 true\n      \"rowTotals\": true,\n      // 是否显示列总计,默认为 true\n      \"columnTotals\": true\n    },\n    \"pivotStyle\": {\n      // 可选,透视表在卡片中的对齐方式,合法值有: start(上部)/ center(中间)\n      \"verticalAlign\": \"start\"\n    }\n  },\n// 地图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"PLOT_MAP\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PLOT_MAP\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"地图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 地图配置,这是地图的核心配置\n    \"plotMapConfig\": {\n      // 数据源配置\n      \"source\": {\n        // 数据源类型,合法值有:view(视图)\n        \"type\": \"view\",\n        // 数据源名称,格式为 \"sheetId:viewId\"\n        // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"sheet_001:view_001\"\n      },\n      // 渲染器类型,合法值有:marker(标记点)/ heatmap(热力图)等\n      // 用于设置地图的渲染方式\n      \"renderer\": \"marker\",\n      // 处理器,用于对数据进行预处理\n      \"processor\": \"\",\n      // 维度配置,用于设置地图的维度字段(如地理位置字段)\n      \"dimensions\": [\n        {\n          // 必填,维度字段 ID(必须是该表中真实存在的字段 ID)\n          // 通常为位置字段,用于在地图上定位\n          \"fieldId\": \"fld_location_01\"\n        }\n      ],\n      // 度量配置,用于设置地图的度量字段(如数值字段)\n      \"measures\": [\n        {\n          // 必填,度量字段 ID(必须是该表中真实存在的字段 ID)\n          // 用于在地图上显示数值大小或颜色\n          \"fieldId\": \"fld_number_01\"\n        }\n      ],\n      // 样式配置,用于设置地图的显示样式\n      \"styles\": []\n    },\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:进度图(PROGRESS)\n  // 别名/同义词:进度条、进度环、进度卡、进度图表\n  // 用途:用于展示某项目标的完成进度,支持当前值 vs 目标值的对比,\n  //       可视化呈现完成百分比。适合展示销售目标达成率、任务完成度、\n  //       日期时间进度等场景。\n  // 重要:当用户说\"进度图\"、\"进度条\"、\"进度环\"、\"目标完成度\"时,\n  //       必须使用 chartType = \"PROGRESS\",不要使用其他图表类型。\n  // ═══════════════════════════════════════════════════════════════════\n  //\n  // ⚠️⚠️⚠️ 极其重要的注意事项(不遵守会导致图表渲染报错):\n  //\n  //   1. currentMeasure / targetMeasure 的格式是一个对象(Object),绝对不是数组(Array)!\n  //      不要使用普通图表的 measure 数组格式 [{ externalValue, value }],否则图表会报错!\n  //\n  //   2. 必须包含以下顶层通用字段,否则图表校验会失败并报「表格字段发生变化」错误:\n  //      - \"measureType\": \"record-count\"  ← 必填!缺少此字段图表必定报错\n  //      - \"sheet\": \"\u003csheetId\u003e\"           ← 必填!设置为 currentSheet 相同的值\n  //      - \"view\": \"\"                     ← 必填!设置为空字符串\n  //      - \"filter\": []                   ← 必填!设置为空数组\n  //\n  //   3. currentFilter / targetFilter 中的每个筛选条件必须包含 \"link\" 字段:\n  //      正确:{ \"fieldId\": \"xxx\", \"symbol\": \"EQ\", \"value\": \"yyy\", \"link\": \"AND\" }\n  //      错误:{ \"fieldId\": \"xxx\", \"symbol\": \"EQ\", \"value\": \"yyy\" }  ← 缺少 link!\n  //      注意:单选字段的 value 必须是选项的 ID(如 \"PO5PWsAqQi\"),不能是选项的显示文本(如 \"影院观影\")!\n  //      使用文本作为 value 会导致筛选条件无法匹配任何记录,当前值始终为 0。\n  //\n  //   4. 即使 targetSource 为 \"custom\",也必须提供 targetSheet、targetView、targetFilter、targetMeasure 的默认值\n  //      即使 currentSource 为 \"custom\",也必须提供 currentSheet、currentView、currentFilter、currentMeasure 的默认值\n  //\n  //   5. 必须包含 numberFormat 和 fixedCount 字段,否则当前值/目标值会显示异常(数值被乘以100、出现双%%、文案被挤掉不显示):\n  //      - \"numberFormat\": { \"digits\": 0, \"format\": \"number\", \"thousandSeparator\": true }  ← format 必须是 \"number\"!\n  //      - \"fixedCount\": 0\n  //\n  \"PROGRESS\": {\n    // ── 顶层通用字段(必填,缺少会导致图表校验失败)─────────────────────────\n    // 必填,图表类型,固定值 \"PROGRESS\"(进度图)\n    \"chartType\": \"PROGRESS\",\n    // ⚠️ 必填,统计类型,进度图固定为 \"record-count\"\n    \"measureType\": \"record-count\",\n    // ⚠️ 必填,顶层数据表 ID,设置为 currentSheet 相同的值\n    \"sheet\": \"\u003csheetId\u003e\",\n    // ⚠️ 必填,顶层视图 ID,设置为空字符串\n    \"view\": \"\",\n    // ⚠️ 必填,顶层筛选条件,设置为空数组\n    \"filter\": [],\n\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"进度图\",\n    // 必填,数据类型,合法值:number(数值进度)/ date(日期进度)\n    \"dataType\": \"number\",\n    // 必填,图表形状,合法值:bar(条形)/ semi-circle(半环)/ circle(圆环)\n    \"progressType\": \"bar\",\n\n    // ── 目标值配置 ──────────────────────────────────────────────────────────\n    // 目标值来源,合法值:custom(自定义数值)/ sheet(从数据表字段聚合)\n    \"targetSource\": \"custom\",\n    // targetSource = \"custom\" 时填写,目标值的固定数值字符串\n    \"target\": \"500\",\n    // 必填,目标值来源的数据表 ID,即使 targetSource = \"custom\" 也要填写,设置为 currentSheet 相同的值\n    \"targetSheet\": \"\u003csheetId\u003e\",\n    // 必填,目标值来源的视图 ID,设置为空字符串\n    \"targetView\": \"\",\n    // 必填,目标值来源的过滤条件,targetSource = \"custom\" 时设置为空数组\n    \"targetFilter\": [],\n    // 必填,目标值聚合字段配置,targetSource = \"custom\" 时设置为默认值\n    // ⚠️ 格式必须是对象,不是数组!详见下方 currentMeasure 的格式说明,targetMeasure 格式完全相同\n    \"targetMeasure\": { \"type\": \"record-count\", \"fields\": [] },\n    // 可选,目标值的标签文字,显示在目标值旁边\n    \"targetText\": \"\",\n\n    // ── 当前值配置 ──────────────────────────────────────────────────────────\n    // 当前值来源,合法值:custom(自定义数值)/ sheet(从数据表字段聚合)\n    \"currentSource\": \"custom\",\n    // currentSource = \"custom\" 时填写,当前值的固定数值字符串\n    \"current\": \"100\",\n    // 必填,当前值来源的数据表 ID\n    \"currentSheet\": \"\u003csheetId\u003e\",\n    // 必填,当前值来源的视图 ID,设置为空字符串表示全部数据\n    \"currentView\": \"\",\n    // 必填,当前值来源的过滤条件,currentSource = \"custom\" 时设置为空数组\n    // ⚠️ 每个筛选条件必须包含 \"link\" 字段!格式:\n    //   { \"fieldId\": \"\u003cfieldId\u003e\", \"symbol\": \"EQ\", \"value\": \"\u003c选项ID\u003e\", \"link\": \"AND\" }\n    //   多个条件时,第一个条件的 link 也必须填 \"AND\"\n    \"currentFilter\": [],\n    // 必填,当前值聚合字段配置\n    // ═══════════════════════════════════════════════════════════════════\n    // ⚠️⚠️⚠️ 极其重要:currentMeasure 是一个 Object,不是 Array!\n    // 绝对不要写成 [{ externalValue: [...], value: \"xxx\" }] 这种数组格式!\n    // 正确格式如下:\n    //\n    // 方式一:记录计数(统计满足条件的记录总数)\n    //   { \"type\": \"record-count\", \"fields\": [] }\n    //\n    // 方式二:字段聚合(对某个字段做聚合计算)\n    //   { \"type\": \"field\", \"fields\": [{ \"value\": \"\u003cfieldId\u003e\", \"formula\": \"\u003c聚合函数\u003e\" }] }\n    //   formula 合法值:count / unique-count / sum / average / max / min\n    //\n    // 错误示例(绝对禁止):\n    //   [{ \"externalValue\": [{ \"type\": \"formula\", \"value\": \"count\" }], \"value\": \"fieldId\" }]\n    // ═══════════════════════════════════════════════════════════════════\n    \"currentMeasure\": { \"type\": \"record-count\", \"fields\": [] },\n    // 可选,当前值的标签文字,显示在当前值旁边\n    \"currentText\": \"\",\n\n    // ── 数值格式配置 ──────────────────────────────────────────────────────────\n    // ⚠️ 必填,百分比小数位数,缺少会导致小数位数异常,默认填 0\n    \"fixedCount\": 0,\n    // ⚠️ 必填,数字格式化配置(作用于当前值和目标值的显示)\n    // 缺少此字段会导致数值显示异常(数值被乘以100、出现双%%符号、文案被挤掉不显示)\n    \"numberFormat\": {\n      // 小数位数,默认 0\n      \"digits\": 0,\n      // ⚠️ 格式类型,进度图必须填 \"number\"!绝对不要填 \"percent\",否则数值会被乘以100并多出%符号\n      // 合法值:number / percent / thousand,进度图固定填 \"number\"\n      \"format\": \"number\",\n      // 是否显示千位分隔符\n      \"thousandSeparator\": true\n    },\n    // 可选,数值单位,如 \"¥\" / \"$\" / \"人\" / \"%\" 等自定义字符串,不填则无单位\n    \"modifier\": \"\",\n    // 可选,单位位置,合法值:left(左)/ right(右),默认 left\n    \"modifierPosition\": \"left\",\n    // 可选,目标方向,合法值:increase(越大越好)/ decrease(越小越好),影响进度条配色逻辑\n    \"targetDirection\": \"increase\",\n\n    // ── 日期进度(dataType = \"date\")专属配置 ────────────────────────────────\n    // 目标日期范围,合法值:month(本月)/ quarter(本季度)/ year(今年)/ custom(自定义)\n    \"targetDateSelected\": \"month\",\n    // targetDateSelected = \"custom\" 时填写,自定义目标日期范围 [开始时间戳, 结束时间戳]\n    \"targetDateRange\": null,\n    // 当前日期,合法值:today(今日)/ yesterday(昨日)/ custom(自定义)\n    \"currentDateSelected\": \"today\",\n    // currentDateSelected = \"custom\" 时填写,自定义当前日期时间戳\n    \"currentDate\": null,\n    // 日期格式,如 \"YYYY-MM-DD\",仅在 targetDateSelected 或 currentDateSelected 为 custom 时生效\n    \"dateFormat\": \"YYYY-MM-DD\",\n\n    // ── 样式配置 ──────────────────────────────────────────────────────────────\n    // 可选,卡片背景颜色,十六进制色值,如 \"#F0F5FF\"\n    \"background\": \"\",\n    // 可选,百分比数字颜色,十六进制色值,如 \"#1677FF\"\n    \"percentageColor\": \"\",\n    // 可选,进度条填充颜色,支持两种形式:\n    //   1. 固定色值字符串,如 \"#1677FF\",或渐变色 \"linear-gradient(...)\"(圆环图支持渐变)\n    //   2. 条件配色对象(根据百分比区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\n    \"strokeColor\": \"\",\n    // 可选,进度条背景颜色\n    \"strokeBgColor\": \"\",\n    // 可选,当前值文字颜色(仅 dataType=number 时生效)\n    \"currentColor\": \"\",\n    // 可选,目标值文字颜色\n    \"targetColor\": \"\"\n  },\n// 查询页配置格式,必须按照此格式配置,否则会导致解析错误\n  \"QUERY_PAGE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"QUERY_PAGE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"查询页\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"\",\n    // 查询页无其他特殊配置字段,\n    // 主要用于提供数据查询和展示的基础功能\n  },\n// 雷达图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"RADAR\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"RADAR\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"雷达图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"xSortBy\": \"y\",\n    \"sortRule\": \"asc\",\n    \"radarShape\": \"circle\",\n    \"isFilled\": true,\n    \"gridShow\": true,\n    \"yAxisLine\": true,\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": true,\n    \"filter\": []\n  },\n// 富文本配置格式,必须按照此格式配置,否则会导致解析错误\n  \"RICH_TEXT\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"RICH_TEXT\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"富文本\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,富文本内容,支持 HTML 格式\n    \"content\": \"\"\n  },\n// 玫瑰图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"ROSE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"ROSE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"玫瑰图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"none\",\n    \"label\": true,\n    \"innerRadius\": 0,\n    \"outerRadius\": 60,\n    \"filter\": []\n  },\n// 散点图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"SCATTER\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"SCATTER\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"散点图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_number_02\",\n        \"externalValue\": []\n      }\n    ],\n    \"smooth\": false,\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"filter\": []\n  },\n// 筛选器配置格式,必须按照此格式配置,否则会导致解析错误\n  \"SLICER\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"SLICER\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"筛选器\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,筛选器样式,合法值有:button(按钮)/ dropdown(下拉),默认为 button\n    \"sli_filterStyle\": \"button\",\n    // 可选,排序方式,合法值有:asc(升序)/ desc(降序),默认为 asc\n    \"sli_orderBy\": \"asc\",\n    // 可选,是否多选,默认为 true\n    \"sli_multiple\": true,\n    // 可选,是否显示数量,默认为 true\n    \"sli_showCount\": true,\n    // 可选,日期操作符,合法值有:BEFORE / AFTER / BETWEEN 等\n    \"sli_dateOperator\": \"BEFORE\",\n    // 可选,数字操作符,合法值有:EQ(等于)/ NE(不等于)/ GT(大于)等\n    \"sli_numberOperator\": \"EQ\",\n    // 可选,关联到图表的方式,合法值有:auto(自动)/ manual(手动),默认为 auto\n    \"sli_2Chart\": \"auto\",\n    // 可选,关联到其他筛选器的方式,合法值有:auto(自动)/ manual(手动),默认为 auto\n    \"sli_2Slicer\": \"auto\",\n    // 可选,对齐方式,合法值有:top(顶部)/ bottom(底部),默认为 top\n    \"sli_align\": \"top\",\n    // 可选,选择样式,合法值有:1 / 2 / 3 等,默认为 1\n    \"sli_selectStyle\": \"1\",\n    // 必填,绑定的字段 ID(必须是该表中真实存在的字段 ID)\n    \"sli_fieldId\": \"fld_select_01\"\n  },\n// 堆叠面积图配置格式\n  \"STACKED_AREA\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STACKED_AREA\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"堆叠面积图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 堆叠条形图配置格式\n  \"STACKED_BAR\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STACKED_BAR\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"堆叠条形图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_02\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"bottom\",\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"categoryAxisMaxRatio\": \"0.3\",\n    \"filter\": []\n  }\n// 堆叠柱状图配置格式\n  \"STACKED_HISTOGRAM\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STACKED_HISTOGRAM\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"堆叠柱状图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"nullValue\": \"ignore\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"bottom\",\n    \"gridShow\": false,\n    \"label\": false,\n    \"labelHideOverlap\": true,\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"fillType\": \"solid\",\n    \"filter\": []\n  }\n// 堆叠折线图配置格式\n  \"STACKED_LINE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STACKED_LINE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"堆叠折线图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 标准列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"STANDARD_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STANDARD_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标准列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置列表的显示方式和布局\n    \"listConfig\": {},\n    // 字段聚合映射,用于设置字段的聚合方式\n    \"fieldAggregateMap\": {},\n    // 工具栏配置,用于控制标准列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:指标卡(STATISTICS)\n  // 别名/同义词:KPI 卡、指标图、数据指标卡、关键指标卡\n  // 用途:以大号数字展示核心指标,并可附加环同比(与上期对比的涨跌幅)\n  //       和趋势折线图,适合展示销售额、DAU、转化率等需要对比分析的 KPI 指标。\n  //       与\"统计数字(SUMMARY)\"的区别:指标卡支持环同比对比和趋势图,\n  //       功能更丰富;统计数字仅展示单一数字,更简洁。\n  // 重要:当用户说\"指标卡\"、\"KPI 卡\"、\"指标图\"、\"关键指标\"、\"带趋势的数字\"时,\n  //       必须使用 chartType = \"STATISTICS\",不要使用其他图表类型。\n  // ═══════════════════════════════════════════════════════════════════\n  \"STATISTICS\": {\n    // 必填,图表类型,固定值 \"STATISTICS\"(指标卡)\n    \"chartType\": \"STATISTICS\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"指标卡\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时为 null,传入时必须是该表中真实存在的 viewId\n    \"view\": null,\n    // 无 filter 时请传空数组;\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置)中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 统计指标配置,measureType 与 measure 二选一:\n    //   measureType = \"record-count\" 时统计记录总数,无需填 measure;\n    //   measureType = \"field\" 时需填 measure,指定聚合字段和聚合函数\n    \"measureType\": \"field\",\n    // 可选,当 measureType = \"field\" 时必填,指定聚合字段\n    \"measure\": [\n      {\n        // 必填,字段 ID(必须是该表中真实存在的数值类字段 ID)\n        \"value\": \"fld_number_01\",\n        // 必填,聚合函数配置\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            // formula 合法值:count (计数), unique-count (去重计数), sum (求和), average (平均值), max (最大值), min (最小值)'\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    // 可选,指标说明文字,显示在数值下方\n    \"desc\": \"\",\n    // 可选,数字格式化配置\n    \"numberFormat\": {\n      // 小数位数,默认 0\n      \"digits\": 0,\n      // 格式类型,合法值:number / percent / thousand\n      \"format\": \"number\",\n      // 是否显示千位分隔符\n      \"thousandSeparator\": true\n    },\n    // 可选,是否显示环同比,默认 false\n    \"showComparison\": false,\n    // 可选,showComparison=true 时填写,环同比对比的日期字段 ID\n    \"comparisonField\": null,\n    // 可选,环同比时间范围,如 \"this_week\" / \"this_month\" / \"this_year\"\n    \"comparisonDateRange\": null,\n    // 可选,环同比类型,合法值:sequential(环比)/ year-on-year(同比)/ month-on-month(月比)/ week-on-week(周比)/ custom(自定义)\n    \"comparisonType\": \"sequential\",\n    // 可选,时间统计方式,合法值:same_period(同期)/ cumulative(累计)\n    \"comparisonPeriodType\": \"same_period\",\n    // 可选,环同比计算类型,合法值:difference-rate(差值率)/ difference-value(差值)/ original-value(原值)\n    \"comparisonCalculationType\": \"difference-rate\",\n    // 可选,环同比布局方向(仅 showComparison=true 且 showTrend=false 时生效),合法值:bottom(下方)/ right(右侧)\n    \"comparisonLayout\": \"bottom\",\n    // 可选,是否显示趋势图,默认 false\n    \"showTrend\": false,\n    // 可选,showTrend=true 时填写,趋势图使用的日期字段 ID\n    \"trendField\": null,\n    // 可选,趋势图时间范围,如 \"this_week\" / \"this_month\" / \"this_year\"\n    \"trendDateRange\": null,\n    // 可选,趋势图布局方向(仅 showTrend=true 且 showComparison=false 时生效),合法值:bottom(下方)/ right(右侧)\n    \"trendLayout\": \"bottom\",\n    // 可选,趋势图颜色,十六进制色值,如 \"#1677FF\"\n    \"trendColor\": \"\",\n    // 可选,环同比图标样式,合法值:1 / 2 / 3 / 4 / 5 / 6 / 7 / 8\n    \"iconStyle\": \"5\",\n    // 可选,卡片标题颜色,十六进制色值\n    \"titleColor\": \"\",\n    // 可选,指标说明文字颜色,十六进制色值\n    \"descColor\": \"\",\n    // 可选,环同比描述颜色,十六进制色值\n    \"comparisonDescColor\": \"\",\n    // 可选,数值颜色配置,支持两种形式:\n    //   1. 固定色值字符串,如 \"#1677FF\",或渐变色 \"linear-gradient(...)\"\n    //   2. 条件配色对象(根据数值区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\n    \"colors\": \"\"\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:统计数字(SUMMARY)\n  // 别名/同义词:汇总数字、统计卡、数字卡、计数卡\n  // 用途:以大号数字形式展示单一聚合指标(如记录总数、字段求和/均值等),\n  //       是最简洁的数据汇总展示方式,适合展示总销售额、总订单数、平均分等。\n  // 与其他图表的关键区别:\n  //   - 与\"指标卡(STATISTICS)\"的区别:统计数字更简洁,无环同比、无趋势图;\n  //     指标卡功能更丰富,支持环同比对比和趋势折线图。\n  //   - 与\"柱状图(HISTOGRAM)\"的关键区别:统计数字只展示一个聚合数字(单值卡片),\n  //     无坐标轴、无分类对比;柱状图展示多个分类的数值对比,有 X/Y 轴(多值图表)。\n  // 重要:当用户说\"统计数字\"、\"汇总数字\"、\"数字卡\"、\"计数\"、\"总数\"时,\n  //       必须使用 chartType = \"SUMMARY\",不要使用 HISTOGRAM 或其他图表类型。\n  // ═══════════════════════════════════════════════════════════════════\n  \"SUMMARY\": {\n    // 必填,图表类型,固定值 \"SUMMARY\"(统计数字)\n    \"chartType\": \"SUMMARY\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"统计数字\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时为 null,传入时必须是该表中真实存在的 viewId\n    \"view\": null,\n    // 无 filter 时请传空数组;\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置)中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 统计指标配置,measureType 与 measure 二选一:\n    //   measureType = \"record-count\" 时统计记录总数,无需填 measure;\n    //   measureType = \"field\" 时需填 measure,指定聚合字段和聚合函数\n    \"measureType\": \"field\",\n    // 可选,当 measureType = \"field\" 时必填,指定聚合字段\n    \"measure\": [\n      {\n        // 必填,字段 ID(必须是该表中真实存在的数值类字段 ID)\n        \"value\": \"fld_number_01\",\n        // 必填,聚合函数配置\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            // formula 合法值:count (计数), unique-count (去重计数), sum (求和), average (平均值), max (最大值), min (最小值)'\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    // 可选,数字格式化配置\n    \"numberFormat\": {\n      // 小数位数,默认 0\n      \"digits\": 0,\n      // 格式类型,合法值:number / percent / thousand\n      \"format\": \"number\",\n      // 是否显示千位分隔符\n      \"thousandSeparator\": true\n    },\n    // 可选,指标说明文字,由用户在编辑器中输入,传给服务端后显示在数值下方\n    \"desc\": \"\",\n    // 可选,数值颜色配置,支持两种形式:\n    //   1. 固定色值字符串,如 \"#1677FF\",或渐变色 \"linear-gradient(...)\"\n    //   2. 条件配色对象(根据数值区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\n    \"colors\": \"\"\n  },\n// 标签页配置格式,必须按照此格式配置,否则会导致解析错误\n  \"TABS\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"TABS\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标签页\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,标签页样式类型,合法值有:type1 到 type10,默认为 type1\n    \"tabsStyleType\": \"type1\",\n    // 可选,标签页对齐方式,合法值有:left(左对齐)/ center(居中)/ right(右对齐),默认为 left\n    \"tabsAlignType\": \"left\",\n    // 可选,默认激活的标签页 ID,必须与 tabs 数组中的某个 id 匹配\n    \"activeTabId\": \"tab_001\",\n    // 必填,标签页数组\n    \"tabs\": [\n      {\n        // 必填,标签页 ID(必须唯一)\n        \"id\": \"tab_001\",\n        // 必填,标签页名称\n        // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标签页 1\"\n      },\n      {\n        \"id\": \"tab_002\",\n        // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标签页 2\"\n      },\n      {\n        \"id\": \"tab_003\",\n        // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标签页 3\"\n      }\n    ]\n  },\n// 词云图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"WORD_CLOUD\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"WORD_CLOUD\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"词云图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_text_01\"\n      }\n    ],\n    \"disableParticiple\": false, // 是否禁用分词\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"filter\": []\n  },\n}\n",
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Dashboard widgets config example returned. Each key is a chart type (e.g. HISTOGRAM, PIE), and the value is the corresponding widget config example. Use the matching chart type's config as a reference when calling create_chart."
+}
真实 stderr / error
(空)
真实返回
{
+  "data": "// 注意\n// 1. 下述 JSON 示例中的注释(// 开头的注释)仅用于说明,实际使用时请删除,否则会导致解析错误\n// 2. 所有图表类型的 widget config 示例,key 是图表类型,value 是对应的完整 config\n// 3. 创建图表时,必需使用示例中的图表类型和配置格式\n\n\n{\n// 聚合列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"AGGREGATE_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"AGGREGATE_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"聚合列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置聚合列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置聚合列表的显示方式和布局\n    \"listConfig\": {},\n    // 字段聚合映射,用于设置字段的聚合方式(如 sum、count、avg 等)\n    \"fieldAggregateMap\": {},\n    // 工具栏配置,用于控制聚合列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n    },\n  },\n// AI 分析卡片配置格式,必须按照此格式配置,否则会导致解析错误\n  // 注意:AI 分析卡片不依赖数据表,无需配置 sheet / view / filter\n  \"AI_ANALYZE\": {\n    // 必填,图表类型,固定值 \"AI_ANALYZE\"\n    \"chartType\": \"AI_ANALYZE\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"AI 分析卡片\",\n    // 可选,AI 提示词,用自然语言描述希望 AI 分析的内容和问题,\n    // 例如:\"分析本月各产品线的销售额趋势,找出增长最快的类别并给出建议\"\n    \"prompt\": \"\",\n    // 可选,需要 AI 参考分析的图表 ID 列表,数组中每个元素必须是当前仪表盘中已存在的图表 ID;\n    // 不填或传空数组时 AI 将基于提示词独立分析,不关联具体图表数据\n    \"analyzeChartIds\": [],\n    // 可选,指定 AI 模型 ID;不填时使用系统默认模型\n    \"modelId\": \"\",\n    // 只读,AI 生成的 Markdown 分析内容,由系统写入,创建时无需填写\n    \"content\": \"\",\n    // 只读,AI 分析结果的最后更新时间戳(毫秒),由系统写入,创建时无需填写\n    \"lastUpdatedAt\": null\n  },\n// 面积图配置格式\n  \"AREA\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"AREA\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"面积图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 条形图配置格式\n  \"BAR\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"BAR\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"条形图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"record-count\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"nullValue\": \"ignore\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"label\": true,\n    \"labelHideOverlap\": true,\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"categoryAxisMaxRatio\": \"0.3\",\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"fillType\": \"solid\",\n    \"filter\": []\n  }\n// 按钮配置格式,必须按照此格式配置,否则会导致解析错误\n  \"BUTTON\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"BUTTON\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"按钮\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,按钮样式类型,合法值有:type1 到 type10,默认为 type1\n    \"buttonStyleType\": \"type1\",\n    // 可选,边框宽度,默认为 1\n    \"borderWidth\": 1,\n    // 可选,按钮大小,合法值有:default(默认)/ small(小)/ large(大),默认为 default\n    \"buttonSize\": \"default\",\n    // 可选,按钮图标,合法值有:link / download / refresh 等\n    \"buttonIcon\": \"link\",\n    // 可选,按钮图标背景类型,合法值有:light(浅色)/ dark(深色),默认为 light\n    \"buttonIconBackgroundType\": \"light\",\n    // 可选,按钮字体配置\n    \"buttonFontSetting\": {\n      // 字体大小,默认为 14\n      \"size\": 14,\n      // 字体颜色\n      \"color\": \"\",\n      // 字间距,默认为 0\n      \"letterSpacing\": 0,\n      // 是否加粗,默认为 false\n      \"bold\": false,\n      // 是否斜体,默认为 false\n      \"italic\": false,\n      // 是否下划线,默认为 false\n      \"underline\": false\n    }\n  },\n// 日历视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"CALENDAR_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"CALENDAR_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"日历视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 视图分组配置,用于设置视图的默认分组规则\n    \"viewGroup\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 日历自定义配置,这是日历视图的核心配置\n    \"calendarCustom\": {\n      // 必填,显示字段 ID(必须是该表中真实存在的字段 ID)\n      // 用于在日历中显示事件标题或描述\n      \"displayFieldId\": \"fld_text_01\",\n      // 必填,开始时间字段 ID(必须是该表中真实存在的日期字段 ID)\n      // 用于设置事件的开始时间\n      \"startField\": \"fld_date_01\",\n      // 必填,结束时间字段 ID(必须是该表中真实存在的日期字段 ID)\n      // 用于设置事件的结束时间\n      \"endField\": \"fld_date_02\",\n      // 标记配置,用于在日历中添加特殊标记或样式\n      \"markers\": [],\n      // 时间轴刻度,合法值有:day(日)/ week(周)/ month(月)\n      // 用于设置日历的显示粒度\n      \"timelineScale\": \"month\",\n      // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\n      \"widthMap\": {},\n      // 单元格高度,单位为像素,默认为 32\n      \"cellHeight\": 32\n    },\n    // 工具栏配置,用于控制日历视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// 卡片列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"CARD_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"CARD_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"卡片列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置卡片列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置卡片列表的显示方式和布局\n    \"listConfig\": {},\n    // 工具栏配置,用于控制卡片列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n    },\n  },\n// 折叠列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"COLLAPSIBLE_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"COLLAPSIBLE_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"折叠列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置折叠列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置折叠列表的显示方式和布局\n    \"listConfig\": {},\n    // 工具栏配置,用于控制折叠列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n    },\n  },\n// 组合布局配置格式,必须按照此格式配置,否则会导致解析错误\n  \"COMPOSITE_LAYOUT\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"COMPOSITE_LAYOUT\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"组合布局\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\"\n    // 组合布局容器,无特殊配置字段,用于承载其他图表组件\n  },\n// 组合图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"COMPOSITION\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"COMPOSITION\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"组合图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ],\n        \"composition\": {\n          // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"HISTOGRAM\",\n          \"yAxisPosition\": \"left\"\n        }\n      },\n      {\n        \"value\": \"fld_number_02\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"average\"\n          }\n        ],\n        \"composition\": {\n          // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"LINE\",\n          \"yAxisPosition\": \"right\"\n        }\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"label\": true,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:倒计时(COUNTDOWN)\n  // 别名/同义词:倒计时、正计时、计时器、倒计时卡片\n  // 用途:用于展示距离某个目标日期的剩余时间或已过时间,\n  //       支持倒计时和正计时两种模式。适合展示活动截止时间、\n  //       项目里程碑、重要日期提醒等场景。\n  // ═══════════════════════════════════════════════════════════════════\n  // ⚠️ 重要注意事项:\n  //   1. fixedDatetime 必须是毫秒时间戳(如 1746028800000),不是日期字符串(如 \"2026-05-01\")!\n  //   2. unit 是一个对象(Object),不是字符串!不要写成 \"天\" 或 \"day\"!\n  //   3. 背景色字段名是 \"background\",不是 \"backgroundColor\"\n  //   4. 时间数字颜色字段名是 \"timeColor\",不是 \"numberColor\"\n  //   5. 描述文字颜色字段名是 \"descColor\",不是 \"titleColor\"\n  //   6. 不存在 \"countdownType\"、\"endDate\"、\"numberColor\"、\"titleColor\" 等字段,使用这些字段会导致图表渲染异常\n  \"COUNTDOWN\": {\n    // 必填,图表类型,固定值 \"COUNTDOWN\"\n    \"chartType\": \"COUNTDOWN\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"倒计时\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": null,\n    // 可选,描述文本,显示在倒计时数字上方\n    \"desc\": \"倒计时\",\n    // 必填,数据来源类型,合法值:fixed(固定日期时间)/ field(从数据表日期字段取值)\n    \"sourceType\": \"fixed\",\n    // sourceType = \"fixed\" 时必填,目标日期的毫秒时间戳\n    // ⚠️ 必须是毫秒时间戳数字(如 1746028800000),不是日期字符串(如 \"2026-05-01\")!\n    // 示例:2026-05-01 00:00:00 → 1746028800000\n    \"fixedDatetime\": 1746028800000,\n    // sourceType = \"field\" 时填写,日期字段的 fieldId\n    \"fieldId\": null,\n    // sourceType = \"field\" 时填写,日期选择方式,合法值:earliest(最早日期)/ latest(最晚日期)\n    \"fieldChoice\": \"earliest\",\n    // 必填,计时模式,合法值:countdown(倒计时,目标时间在未来)/ countup(正计时,目标时间在过去)\n    \"timingMode\": \"countdown\",\n    // 必填,显示的时间单位开关(是一个对象,不是字符串!)\n    // ⚠️ 不要写成 \"天\" 或 \"day\",必须是如下对象格式:\n    \"unit\": {\n      // 是否显示月,默认 false\n      \"month\": false,\n      // 是否显示周,默认 false\n      \"week\": false,\n      // 是否显示天,默认 true\n      \"day\": true,\n      // 是否显示小时,默认 true\n      \"hour\": true,\n      // 是否显示分钟,默认 true\n      \"minute\": true,\n      // 是否显示秒,默认 true\n      \"second\": true\n    },\n\n    // ── 样式配置 ──────────────────────────────────────────────────────────────\n    // 可选,卡片背景颜色(⚠️ 字段名是 \"background\",不是 \"backgroundColor\")\n    \"background\": \"\",\n    // 可选,描述文字颜色(⚠️ 字段名是 \"descColor\",不是 \"titleColor\")\n    \"descColor\": \"\",\n    // 可选,时间块背景颜色\n    \"timeBlockColor\": \"\",\n    // 可选,倒计时数字颜色(⚠️ 字段名是 \"timeColor\",不是 \"numberColor\")\n    \"timeColor\": \"\",\n    // 可选,计时完成是否显示动效,默认 false\n    \"showFinishEffect\": false\n  },\n// 详情列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"DETAIL_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"DETAIL_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"详情列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置详情列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置详情列表的显示方式和布局\n    \"listConfig\": {},\n    // 工具栏配置,用于控制详情列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n    },\n  },\n// 嵌入网页配置格式,必须按照此格式配置,否则会导致解析错误\n  \"EMBED_WEBPAGE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"EMBED_WEBPAGE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"嵌入网页\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 必填,嵌入的网页 URL(必须是有效的 URL 地址)\n    \"url\": \"https://example.com\"\n  },\n// 漏斗图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"FUNNEL\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"FUNNEL\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"漏斗图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"record-count\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"sumValue\": true,\n    \"funnelType\": \"normal\",\n    \"filter\": []\n  },\n// 画册视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"GALLERY_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"GALLERY_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"画册视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 画册自定义配置,用于设置画册的显示样式\n    \"galleryCustom\": {\n      // 卡片设置,用于配置画册中卡片的显示方式\n      \"cardSetting\": {\n        // 封面模式,合法值有:none(无封面)/ cover(封面)等\n        \"coverMode\": \"none\"\n      }\n    },\n    // 工具栏配置,用于控制画册视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// 甘特视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"GANTT_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"GANTT_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"甘特视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 视图分组配置,用于设置视图的默认分组规则\n    \"viewGroup\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 是否折叠网格,默认为 false\n    \"collapsedGrid\": false,\n    // 甘特自定义配置,这是甘特视图的核心配置\n    \"ganttCustom\": {\n      // 必填,显示字段 ID(必须是该表中真实存在的字段 ID)\n      // 用于在甘特图中显示任务名称或描述\n      \"displayFieldId\": \"fld_text_01\",\n      // 必填,开始时间字段 ID(必须是该表中真实存在的日期字段 ID)\n      // 用于设置任务的开始时间\n      \"startField\": \"fld_date_01\",\n      // 必填,结束时间字段 ID(必须是该表中真实存在的日期字段 ID)\n      // 用于设置任务的结束时间\n      \"endField\": \"fld_date_02\",\n      // 标记配置,用于在甘特图中添加里程碑或重要时间点\n      \"markers\": [],\n      // 时间轴刻度,合法值有:day(日)/ week(周)/ month(月)/ quarter(季)/ year(年)\n      // 用于设置甘特图的时间轴显示粒度\n      \"timelineScale\": \"month\",\n      // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\n      \"widthMap\": {},\n      // 单元格高度,单位为像素,默认为 32\n      \"cellHeight\": 32\n    },\n    // 工具栏配置,用于控制甘特视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// 表格视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"GRID_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"GRID_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"表格视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 视图分组配置,用于设置视图的默认分组规则\n    \"viewGroup\": [],\n    // 单元格高度,单位为像素,默认为 32\n    \"cellHeight\": 32,\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\n    \"widthMap\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 冻结列数,默认为 1,表示冻结左侧的列数\n    \"frozenColCount\": 1,\n    // 工具栏配置,用于控制表格视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 创建行按钮的文本内容\n      \"createRowText\": \"\",\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:柱状图(HISTOGRAM)\n  // 别名/同义词:竖向柱图、垂直柱图、分组柱图\n  // 用途:以垂直柱子展示多个分类维度的数值对比,适合比较不同类别之间的\n  //       数量差异,如各月销售额对比、各部门人数对比、各产品销量排名等。\n  //       核心特征:有 X 轴(分类维度)和 Y 轴(数值),每个类别对应一根柱子。\n  // 与\"统计数字(SUMMARY)\"的关键区别:\n  //   - 柱状图(HISTOGRAM):展示多个分类的对比,有坐标轴,是\"多值图表\"\n  //   - 统计数字(SUMMARY):只展示一个聚合数字,无坐标轴,是\"单值卡片\"\n  // 重要:当用户说\"柱状图\"、\"柱图\"、\"分组柱图\"时,\n  //       必须使用 chartType = \"HISTOGRAM\",不要使用 SUMMARY 或其他图表类型。\n  // ═══════════════════════════════════════════════════════════════════\n  \"HISTOGRAM\": {\n    // 必填,图表类型,固定值 \"HISTOGRAM\"(柱状图)\n    \"chartType\": \"HISTOGRAM\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"柱状图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"record-count\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_02\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"xSortCustom\": [],\n    \"ySortCustom\": [],\n    \"sortRule\": \"asc\",\n    \"nullValue\": \"ignore\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"axisLabelShow\": false,\n    \"label\": true,\n    \"labelHideOverlap\": true,\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"xAxisLabelRotate\": \"auto\",\n    \"categoryAxisMaxRatio\": \"0.2\",\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"fillType\": \"solid\",\n    \"yAxisRange\": {\n      \"type\": \"absolute\",\n      \"range\": []\n    },\n    \"xAbbr\": {\n      \"numberType\": \"default\",\n      \"abbr\": \"\",\n      \"decimal\": \"\"\n    },\n    \"yAbbr\": {\n      \"numberType\": \"default\",\n      \"abbr\": \"\",\n      \"decimal\": \"\"\n    },\n    \"yRightAbbr\": {\n      \"numberType\": \"default\",\n      \"abbr\": \"\",\n      \"decimal\": \"\"\n    },\n    \"filter\": []\n  }\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:图片(IMAGE)\n  // 别名/同义词:图片卡、图片展示、图片轮播、Banner 图\n  // 用途:在仪表盘中展示一张或多张静态图片,支持多图轮播(滑动/淡入淡出),\n  //       可为每张图片配置标题、描述和点击跳转链接。适合展示品牌 Banner、\n  //       产品图、说明图、装饰图等不依赖数据表的纯图片内容。\n  // 重要:当用户说\"图片\"、\"图片卡\"、\"图片展示\"、\"Banner\"、\"轮播图\"时,\n  //       必须使用 chartType = \"IMAGE\",不要使用其他图表类型。\n  //       此图表类型不依赖数据表,无需配置 sheet / view / filter。\n  // ═══════════════════════════════════════════════════════════════════\n  \"IMAGE\": {\n    // 必填,图表类型,固定值 \"IMAGE\"(图片)\n    \"chartType\": \"IMAGE\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"图片\",\n    // 必填,图片列表,至少包含一张图片;多张图片时支持轮播\n    \"img_images\": [\n      {\n        // 必填,图片的访问 URL\n        \"url\": \"https://example.com/image.png\",\n        // 可选,图片标题,显示在图片上方(需 img_showImgText=true)\n        \"title\": \"\",\n        // 可选,图片描述,显示在标题下方(需 img_showImgText=true)\n        \"desc\": \"\",\n        // 可选,点击图片后跳转的链接 URL\n        \"toUrl\": \"\",\n        // 必填,图片填充模式,合法值:cover(裁剪铺满)/ contain(等比缩放留白)/ fill(拉伸铺满)\n        \"fillMode\": \"cover\"\n      }\n    ],\n    // 可选,是否在图片上显示标题和描述文字,默认 true;\n    // 设为 false 时 img_titleStyle / img_descStyle / img_textAlign 均不生效\n    \"img_showImgText\": true,\n    // 可选,图片文字的对齐位置,合法值:\n    //   leftTop / top / rightTop / left / center / right / leftBottom / bottom / rightBottom\n    \"img_textAlign\": \"center\",\n    // 可选,图片标题的字体样式(仅 img_showImgText=true 时生效)\n    \"img_titleStyle\": {\n      // 字体大小(px),合法范围 16~56,步长 4\n      \"size\": 16,\n      // 字体颜色,十六进制色值,如 \"#FFFFFF\"\n      \"color\": \"\",\n      // 是否加粗\n      \"bold\": true,\n      // 是否斜体\n      \"italic\": false,\n      // 是否下划线\n      \"underline\": false\n    },\n    // 可选,图片描述的字体样式(仅 img_showImgText=true 时生效)\n    \"img_descStyle\": {\n      // 字体大小(px),合法范围 16~56,步长 4\n      \"size\": 14,\n      // 字体颜色,十六进制色值\n      \"color\": \"\",\n      // 是否加粗\n      \"bold\": false,\n      // 是否斜体\n      \"italic\": false,\n      // 是否下划线\n      \"underline\": false\n    },\n    // 可选,多图时是否自动轮播,默认 false;单张图片时此配置无效\n    \"img_autoPlay\": false,\n    // 可选,多图轮播切换动效,合法值:slide(滑动)/ fade(淡入淡出),默认 slide;单张图片时无效\n    \"img_imgTransitionType\": \"slide\",\n    // 可选,多图自动轮播间隔(秒),合法范围 0.1~1000,默认 1;仅 img_autoPlay=true 时生效\n    \"img_imgTransitionInterval\": 1\n  },\n// 看板视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"KANBAN_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"KANBAN_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"看板视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 看板自定义配置,这是看板视图的核心配置\n    \"kanbanCustom\": {\n      // 分组基础配置,用于设置看板的分组字段\n      \"groupBase\": {\n        // 必填,分组字段 ID(必须是该表中真实存在的字段 ID)\n        // 看板将按照此字段的值进行分组显示\n        \"baseFieldId\": \"fld_select_01\"\n      }\n    },\n    // 工具栏配置,用于控制看板视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// 排行榜配置格式,必须按照此格式配置,否则会导致解析错误\n  \"LEADERBOARD\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"LEADERBOARD\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"排行榜\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    \"measureType\": \"record-count\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_text_01\"\n      }\n    ],\n    \"showType\": \"podium\", // 展示类型:podium 领奖台/list 列表\n    \"showCount\": 10, // 显示条数\n    \"hideValue\": false,\n    \"sortRule\": \"asc\",\n    \"filter\": []\n  },\n// 折线图配置格式\n  \"LINE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"LINE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"折线图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"nullValue\": \"ignore\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"label\": true,\n    \"labelHideOverlap\": true,\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"fillType\": \"solid\",\n    \"filter\": []\n  }\n// 抽奖配置格式,必须按照此格式配置,否则会导致解析错误\n  \"LOTTERY\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"LOTTERY\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"抽奖\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 必填,指标类型,合法值有:record-count(记录数)/ field(字段)\n    \"measureType\": \"record-count\",\n    // 必填,指标配置数组\n    \"measure\": [],\n    // 可选,输出表 ID,用于记录中奖结果\n    \"outputSheet\": \"\",\n    // 可选,滚动速度,默认为 5\n    \"speed\": 5,\n    // 可选,字体大小,默认为 20\n    \"fontSize\": 20,\n    // 可选,颜色主题,合法值有:COLOR_PALETTE_1 到 COLOR_PALETTE_10\n    \"colors\": \"COLOR_PALETTE_1\",\n    // 必填,奖项配置数组,每个元素格式为 [数量, 名称]\n    \"gameRounds\": [\n      [\n        1,\n        \"一等奖\"\n      ]\n    ],\n    // 可选,是否包含已中奖者,默认为 false\n    \"includeWinners\": false\n  },\n// 跑马灯配置格式,必须按照此格式配置,否则会导致解析错误\n  \"MARQUEE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"MARQUEE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"跑马灯\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,滚动文本内容\n    \"content\": \"这是一条滚动消息\",\n    // 可选,字体大小,默认为 14\n    \"fontSize\": 14,\n    // 可选,滚动速度,数值越小速度越快,默认为 50\n    \"speed\": 50,\n    // 可选,字体配置\n    \"fontSetting\": {\n      // 字体颜色\n      \"color\": \"\",\n      // 是否加粗,默认为 false\n      \"bold\": false,\n      // 是否斜体,默认为 false\n      \"italic\": false,\n      // 是否下划线,默认为 false\n      \"underline\": false\n    }\n  },\n// NPS评分配置格式,必须按照此格式配置,否则会导致解析错误\n  \"NPS\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"NPS\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"NPS评分\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\"\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"showLabel\": true,\n    \"showList\": false,\n    \"threshold\": [ // 评分阈值数组\n      2,\n      3\n    ],\n    \"colorSetName\": \"COLOR_PALETTE_1\",\n    \"filter\": []\n  },\n// 百分比堆叠面积图配置格式\n  \"PERCENT_STACKED_AREA\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PERCENT_STACKED_AREA\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"百分比堆叠面积图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": true,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 百分比堆叠条形图配置格式\n  \"PERCENT_STACKED_BAR\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PERCENT_STACKED_BAR\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"百分比堆叠条形图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_02\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": true,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"categoryAxisMaxRatio\": \"0.3\",\n    \"filter\": []\n  }\n// 百分比堆叠柱状图配置格式\n  \"PERCENT_STACKED_HISTOGRAM\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PERCENT_STACKED_HISTOGRAM\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"百分比堆叠柱状图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_02\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": true,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 饼图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"PIE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PIE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"饼图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"colors\": \"COLOR_PALETTE_1\", // 必须使用示例中的默认值如 COLOR_PALETTE_1,禁止自行编造\n    \"legend\": \"none\",\n    \"label\": true, // 必须设为 true 以默认显示数据标签\n    \"innerRadius\": 0, // 内半径,0 为实心饼图\n    \"outerRadius\": 60, // 外半径百分比\n    \"filter\": []\n  },\n// 透视表配置格式,必须按照此格式配置,否则会导致解析错误\n  \"PIVOT\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PIVOT\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"透视表\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 透视表配置,这是透视表的核心配置\n    \"pivotConfig\": {\n      // 必填,rows 是行字段列表,至少要有一个行字段,\n      // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\n      // 如果多层分组,行字段列表中多个字段的 fieldId 依次对应每层分组的字段 ID\n      \"rows\": [\n        {\n          // 必填,行字段 ID(必须是该表中真实存在的字段 ID)\n          \"fld\": \"fld_01\",\n          // 可选,排序方式,合法值有:1(升序)和 -1(降序),默认为 1 升序\n          \"srt\": 1\n        }\n      ],\n      // 可选,columns 是列字段列表,默认为空数组,\n      // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\n      // 如果多层分组,列字段列表中多个字段的 fieldId 依次对应每层分组的字段 ID\n      \"columns\": [\n        {\n          // 必填,列字段 ID(必须是该表中真实存在的字段 ID)\n          \"fld\": \"fld_02\",\n          // 可选,排序方式,合法值有:1(升序)和 -1(降序),默认为 1 升序\n          \"srt\": 1\n        }\n      ],\n      // 必填,values 是值字段列表,至少要有一个值字段,\n      // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\n      // 值字段,是用于计算值的字段,通常是数值字段,但也可以是其他类型的字段(如文本字段),具体取决于聚合函数的要求\n      \"values\": [\n        {\n          // 必填,值字段 ID(必须是该表中真实存在的字段 ID)\n          \"fld\": \"fld_03\",\n          //必填,聚合函数,合法值有:sum /count / count_distinct / avg / min / max / median / population_variance / sample_variance / population_stddev / sample_stddev / first / last / range / mode / sum_of_squares / harmonic_mean / geometric_mean / interquartile_range / centered_mean / weighted_mean / kurtosis / skewness / quartile_median / range_median / coefficient_of_variation / adjusted_stddev / weighted_sum / weighted_count / weighted_count_distinct / weighted_avg / centered_weighted_mean / weighted_harmonic_mean / weighted_geometric_mean / weighted_range / weighted_range_median / weighted_interquartile_range / weighted_quartile_median / weighted_centered_mean / weighted_adjusted_stddev\n          \"agg\": \"sum\",\n          //可选,后聚合函数,合法值有:default / percent_of_row_total / percent_of_col_total / percent_of_grand_total\n          \"pgg\": \"string\",\n          //可选,格式化函数,合法值有:default / percentage / thousands / currency / scientific / fixed / integer\n          \"fmt\": \"\",\n          //可选,字段别名\n          \"als\": \"string\"\n        }\n      ],\n      // 是否显示行总计,默认为 true\n      \"rowTotals\": true,\n      // 是否显示列总计,默认为 true\n      \"columnTotals\": true\n    },\n    \"pivotStyle\": {\n      // 可选,透视表在卡片中的对齐方式,合法值有: start(上部)/ center(中间)\n      \"verticalAlign\": \"start\"\n    }\n  },\n// 地图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"PLOT_MAP\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"PLOT_MAP\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"地图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 地图配置,这是地图的核心配置\n    \"plotMapConfig\": {\n      // 数据源配置\n      \"source\": {\n        // 数据源类型,合法值有:view(视图)\n        \"type\": \"view\",\n        // 数据源名称,格式为 \"sheetId:viewId\"\n        // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"sheet_001:view_001\"\n      },\n      // 渲染器类型,合法值有:marker(标记点)/ heatmap(热力图)等\n      // 用于设置地图的渲染方式\n      \"renderer\": \"marker\",\n      // 处理器,用于对数据进行预处理\n      \"processor\": \"\",\n      // 维度配置,用于设置地图的维度字段(如地理位置字段)\n      \"dimensions\": [\n        {\n          // 必填,维度字段 ID(必须是该表中真实存在的字段 ID)\n          // 通常为位置字段,用于在地图上定位\n          \"fieldId\": \"fld_location_01\"\n        }\n      ],\n      // 度量配置,用于设置地图的度量字段(如数值字段)\n      \"measures\": [\n        {\n          // 必填,度量字段 ID(必须是该表中真实存在的字段 ID)\n          // 用于在地图上显示数值大小或颜色\n          \"fieldId\": \"fld_number_01\"\n        }\n      ],\n      // 样式配置,用于设置地图的显示样式\n      \"styles\": []\n    },\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:进度图(PROGRESS)\n  // 别名/同义词:进度条、进度环、进度卡、进度图表\n  // 用途:用于展示某项目标的完成进度,支持当前值 vs 目标值的对比,\n  //       可视化呈现完成百分比。适合展示销售目标达成率、任务完成度、\n  //       日期时间进度等场景。\n  // 重要:当用户说\"进度图\"、\"进度条\"、\"进度环\"、\"目标完成度\"时,\n  //       必须使用 chartType = \"PROGRESS\",不要使用其他图表类型。\n  // ═══════════════════════════════════════════════════════════════════\n  //\n  // ⚠️⚠️⚠️ 极其重要的注意事项(不遵守会导致图表渲染报错):\n  //\n  //   1. currentMeasure / targetMeasure 的格式是一个对象(Object),绝对不是数组(Array)!\n  //      不要使用普通图表的 measure 数组格式 [{ externalValue, value }],否则图表会报错!\n  //\n  //   2. 必须包含以下顶层通用字段,否则图表校验会失败并报「表格字段发生变化」错误:\n  //      - \"measureType\": \"record-count\"  ← 必填!缺少此字段图表必定报错\n  //      - \"sheet\": \"\u003csheetId\u003e\"           ← 必填!设置为 currentSheet 相同的值\n  //      - \"view\": \"\"                     ← 必填!设置为空字符串\n  //      - \"filter\": []                   ← 必填!设置为空数组\n  //\n  //   3. currentFilter / targetFilter 中的每个筛选条件必须包含 \"link\" 字段:\n  //      正确:{ \"fieldId\": \"xxx\", \"symbol\": \"EQ\", \"value\": \"yyy\", \"link\": \"AND\" }\n  //      错误:{ \"fieldId\": \"xxx\", \"symbol\": \"EQ\", \"value\": \"yyy\" }  ← 缺少 link!\n  //      注意:单选字段的 value 必须是选项的 ID(如 \"PO5PWsAqQi\"),不能是选项的显示文本(如 \"影院观影\")!\n  //      使用文本作为 value 会导致筛选条件无法匹配任何记录,当前值始终为 0。\n  //\n  //   4. 即使 targetSource 为 \"custom\",也必须提供 targetSheet、targetView、targetFilter、targetMeasure 的默认值\n  //      即使 currentSource 为 \"custom\",也必须提供 currentSheet、currentView、currentFilter、currentMeasure 的默认值\n  //\n  //   5. 必须包含 numberFormat 和 fixedCount 字段,否则当前值/目标值会显示异常(数值被乘以100、出现双%%、文案被挤掉不显示):\n  //      - \"numberFormat\": { \"digits\": 0, \"format\": \"number\", \"thousandSeparator\": true }  ← format 必须是 \"number\"!\n  //      - \"fixedCount\": 0\n  //\n  \"PROGRESS\": {\n    // ── 顶层通用字段(必填,缺少会导致图表校验失败)─────────────────────────\n    // 必填,图表类型,固定值 \"PROGRESS\"(进度图)\n    \"chartType\": \"PROGRESS\",\n    // ⚠️ 必填,统计类型,进度图固定为 \"record-count\"\n    \"measureType\": \"record-count\",\n    // ⚠️ 必填,顶层数据表 ID,设置为 currentSheet 相同的值\n    \"sheet\": \"\u003csheetId\u003e\",\n    // ⚠️ 必填,顶层视图 ID,设置为空字符串\n    \"view\": \"\",\n    // ⚠️ 必填,顶层筛选条件,设置为空数组\n    \"filter\": [],\n\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"进度图\",\n    // 必填,数据类型,合法值:number(数值进度)/ date(日期进度)\n    \"dataType\": \"number\",\n    // 必填,图表形状,合法值:bar(条形)/ semi-circle(半环)/ circle(圆环)\n    \"progressType\": \"bar\",\n\n    // ── 目标值配置 ──────────────────────────────────────────────────────────\n    // 目标值来源,合法值:custom(自定义数值)/ sheet(从数据表字段聚合)\n    \"targetSource\": \"custom\",\n    // targetSource = \"custom\" 时填写,目标值的固定数值字符串\n    \"target\": \"500\",\n    // 必填,目标值来源的数据表 ID,即使 targetSource = \"custom\" 也要填写,设置为 currentSheet 相同的值\n    \"targetSheet\": \"\u003csheetId\u003e\",\n    // 必填,目标值来源的视图 ID,设置为空字符串\n    \"targetView\": \"\",\n    // 必填,目标值来源的过滤条件,targetSource = \"custom\" 时设置为空数组\n    \"targetFilter\": [],\n    // 必填,目标值聚合字段配置,targetSource = \"custom\" 时设置为默认值\n    // ⚠️ 格式必须是对象,不是数组!详见下方 currentMeasure 的格式说明,targetMeasure 格式完全相同\n    \"targetMeasure\": { \"type\": \"record-count\", \"fields\": [] },\n    // 可选,目标值的标签文字,显示在目标值旁边\n    \"targetText\": \"\",\n\n    // ── 当前值配置 ──────────────────────────────────────────────────────────\n    // 当前值来源,合法值:custom(自定义数值)/ sheet(从数据表字段聚合)\n    \"currentSource\": \"custom\",\n    // currentSource = \"custom\" 时填写,当前值的固定数值字符串\n    \"current\": \"100\",\n    // 必填,当前值来源的数据表 ID\n    \"currentSheet\": \"\u003csheetId\u003e\",\n    // 必填,当前值来源的视图 ID,设置为空字符串表示全部数据\n    \"currentView\": \"\",\n    // 必填,当前值来源的过滤条件,currentSource = \"custom\" 时设置为空数组\n    // ⚠️ 每个筛选条件必须包含 \"link\" 字段!格式:\n    //   { \"fieldId\": \"\u003cfieldId\u003e\", \"symbol\": \"EQ\", \"value\": \"\u003c选项ID\u003e\", \"link\": \"AND\" }\n    //   多个条件时,第一个条件的 link 也必须填 \"AND\"\n    \"currentFilter\": [],\n    // 必填,当前值聚合字段配置\n    // ═══════════════════════════════════════════════════════════════════\n    // ⚠️⚠️⚠️ 极其重要:currentMeasure 是一个 Object,不是 Array!\n    // 绝对不要写成 [{ externalValue: [...], value: \"xxx\" }] 这种数组格式!\n    // 正确格式如下:\n    //\n    // 方式一:记录计数(统计满足条件的记录总数)\n    //   { \"type\": \"record-count\", \"fields\": [] }\n    //\n    // 方式二:字段聚合(对某个字段做聚合计算)\n    //   { \"type\": \"field\", \"fields\": [{ \"value\": \"\u003cfieldId\u003e\", \"formula\": \"\u003c聚合函数\u003e\" }] }\n    //   formula 合法值:count / unique-count / sum / average / max / min\n    //\n    // 错误示例(绝对禁止):\n    //   [{ \"externalValue\": [{ \"type\": \"formula\", \"value\": \"count\" }], \"value\": \"fieldId\" }]\n    // ═══════════════════════════════════════════════════════════════════\n    \"currentMeasure\": { \"type\": \"record-count\", \"fields\": [] },\n    // 可选,当前值的标签文字,显示在当前值旁边\n    \"currentText\": \"\",\n\n    // ── 数值格式配置 ──────────────────────────────────────────────────────────\n    // ⚠️ 必填,百分比小数位数,缺少会导致小数位数异常,默认填 0\n    \"fixedCount\": 0,\n    // ⚠️ 必填,数字格式化配置(作用于当前值和目标值的显示)\n    // 缺少此字段会导致数值显示异常(数值被乘以100、出现双%%符号、文案被挤掉不显示)\n    \"numberFormat\": {\n      // 小数位数,默认 0\n      \"digits\": 0,\n      // ⚠️ 格式类型,进度图必须填 \"number\"!绝对不要填 \"percent\",否则数值会被乘以100并多出%符号\n      // 合法值:number / percent / thousand,进度图固定填 \"number\"\n      \"format\": \"number\",\n      // 是否显示千位分隔符\n      \"thousandSeparator\": true\n    },\n    // 可选,数值单位,如 \"¥\" / \"$\" / \"人\" / \"%\" 等自定义字符串,不填则无单位\n    \"modifier\": \"\",\n    // 可选,单位位置,合法值:left(左)/ right(右),默认 left\n    \"modifierPosition\": \"left\",\n    // 可选,目标方向,合法值:increase(越大越好)/ decrease(越小越好),影响进度条配色逻辑\n    \"targetDirection\": \"increase\",\n\n    // ── 日期进度(dataType = \"date\")专属配置 ────────────────────────────────\n    // 目标日期范围,合法值:month(本月)/ quarter(本季度)/ year(今年)/ custom(自定义)\n    \"targetDateSelected\": \"month\",\n    // targetDateSelected = \"custom\" 时填写,自定义目标日期范围 [开始时间戳, 结束时间戳]\n    \"targetDateRange\": null,\n    // 当前日期,合法值:today(今日)/ yesterday(昨日)/ custom(自定义)\n    \"currentDateSelected\": \"today\",\n    // currentDateSelected = \"custom\" 时填写,自定义当前日期时间戳\n    \"currentDate\": null,\n    // 日期格式,如 \"YYYY-MM-DD\",仅在 targetDateSelected 或 currentDateSelected 为 custom 时生效\n    \"dateFormat\": \"YYYY-MM-DD\",\n\n    // ── 样式配置 ──────────────────────────────────────────────────────────────\n    // 可选,卡片背景颜色,十六进制色值,如 \"#F0F5FF\"\n    \"background\": \"\",\n    // 可选,百分比数字颜色,十六进制色值,如 \"#1677FF\"\n    \"percentageColor\": \"\",\n    // 可选,进度条填充颜色,支持两种形式:\n    //   1. 固定色值字符串,如 \"#1677FF\",或渐变色 \"linear-gradient(...)\"(圆环图支持渐变)\n    //   2. 条件配色对象(根据百分比区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\n    \"strokeColor\": \"\",\n    // 可选,进度条背景颜色\n    \"strokeBgColor\": \"\",\n    // 可选,当前值文字颜色(仅 dataType=number 时生效)\n    \"currentColor\": \"\",\n    // 可选,目标值文字颜色\n    \"targetColor\": \"\"\n  },\n// 查询页配置格式,必须按照此格式配置,否则会导致解析错误\n  \"QUERY_PAGE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"QUERY_PAGE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"查询页\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"\",\n    // 查询页无其他特殊配置字段,\n    // 主要用于提供数据查询和展示的基础功能\n  },\n// 雷达图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"RADAR\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"RADAR\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"雷达图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"xSortBy\": \"y\",\n    \"sortRule\": \"asc\",\n    \"radarShape\": \"circle\",\n    \"isFilled\": true,\n    \"gridShow\": true,\n    \"yAxisLine\": true,\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": true,\n    \"filter\": []\n  },\n// 富文本配置格式,必须按照此格式配置,否则会导致解析错误\n  \"RICH_TEXT\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"RICH_TEXT\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"富文本\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,富文本内容,支持 HTML 格式\n    \"content\": \"\"\n  },\n// 玫瑰图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"ROSE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"ROSE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"玫瑰图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"none\",\n    \"label\": true,\n    \"innerRadius\": 0,\n    \"outerRadius\": 60,\n    \"filter\": []\n  },\n// 散点图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"SCATTER\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"SCATTER\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"散点图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_number_02\",\n        \"externalValue\": []\n      }\n    ],\n    \"smooth\": false,\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"gridShow\": false,\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"filter\": []\n  },\n// 筛选器配置格式,必须按照此格式配置,否则会导致解析错误\n  \"SLICER\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"SLICER\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"筛选器\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,筛选器样式,合法值有:button(按钮)/ dropdown(下拉),默认为 button\n    \"sli_filterStyle\": \"button\",\n    // 可选,排序方式,合法值有:asc(升序)/ desc(降序),默认为 asc\n    \"sli_orderBy\": \"asc\",\n    // 可选,是否多选,默认为 true\n    \"sli_multiple\": true,\n    // 可选,是否显示数量,默认为 true\n    \"sli_showCount\": true,\n    // 可选,日期操作符,合法值有:BEFORE / AFTER / BETWEEN 等\n    \"sli_dateOperator\": \"BEFORE\",\n    // 可选,数字操作符,合法值有:EQ(等于)/ NE(不等于)/ GT(大于)等\n    \"sli_numberOperator\": \"EQ\",\n    // 可选,关联到图表的方式,合法值有:auto(自动)/ manual(手动),默认为 auto\n    \"sli_2Chart\": \"auto\",\n    // 可选,关联到其他筛选器的方式,合法值有:auto(自动)/ manual(手动),默认为 auto\n    \"sli_2Slicer\": \"auto\",\n    // 可选,对齐方式,合法值有:top(顶部)/ bottom(底部),默认为 top\n    \"sli_align\": \"top\",\n    // 可选,选择样式,合法值有:1 / 2 / 3 等,默认为 1\n    \"sli_selectStyle\": \"1\",\n    // 必填,绑定的字段 ID(必须是该表中真实存在的字段 ID)\n    \"sli_fieldId\": \"fld_select_01\"\n  },\n// 堆叠面积图配置格式\n  \"STACKED_AREA\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STACKED_AREA\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"堆叠面积图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 堆叠条形图配置格式\n  \"STACKED_BAR\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STACKED_BAR\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"堆叠条形图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_select_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_02\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"bottom\",\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"categoryAxisMaxRatio\": \"0.3\",\n    \"filter\": []\n  }\n// 堆叠柱状图配置格式\n  \"STACKED_HISTOGRAM\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STACKED_HISTOGRAM\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"堆叠柱状图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"xSortBy\": \"x\",\n    \"sortRule\": \"asc\",\n    \"nullValue\": \"ignore\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"bottom\",\n    \"gridShow\": false,\n    \"label\": false,\n    \"labelHideOverlap\": true,\n    \"xAxisShow\": true,\n    \"xAxisLine\": false,\n    \"xAxisLabel\": true,\n    \"yAxisShow\": true,\n    \"yAxisLine\": false,\n    \"yAxisLabel\": true,\n    \"fillType\": \"solid\",\n    \"filter\": []\n  }\n// 堆叠折线图配置格式\n  \"STACKED_LINE\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STACKED_LINE\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"堆叠折线图\",\n    \"sheet\": \"sheet_001\",\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_date_01\",\n        \"externalValue\": []\n      }\n    ],\n    \"group\": [\n      {\n        \"value\": \"fld_select_01\"\n      }\n    ],\n    \"smooth\": false,\n    \"symbolType\": \"always\",\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"legend\": \"top\",\n    \"label\": false,\n    \"xAxisShow\": true,\n    \"yAxisShow\": true,\n    \"filter\": []\n  }\n// 标准列表视图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"STANDARD_LIST_VIEW\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"STANDARD_LIST_VIEW\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标准列表视图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\n    \"view\": \"view_001\",\n    // 无 filter 时请传空数组,\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 视图排序配置,用于设置视图的默认排序规则\n    \"viewSort\": [],\n    // 隐藏字段配置,key 为 fieldId,value 为 true/false\n    \"hiddenFields\": {},\n    // 列排序配置,用于设置列的显示顺序\n    \"columnSort\": [],\n    // 列表自定义配置,用于设置列表的自定义样式和行为\n    \"listCustom\": {},\n    // 列表配置,用于设置列表的显示方式和布局\n    \"listConfig\": {},\n    // 字段聚合映射,用于设置字段的聚合方式\n    \"fieldAggregateMap\": {},\n    // 工具栏配置,用于控制标准列表视图中工具栏的功能按钮\n    \"toolbarConfig\": {\n      // 是否显示创建行按钮\n      \"enableCreateRow\": false,\n      // 是否显示筛选按钮\n      \"enableFilter\": true,\n      // 是否显示分组按钮\n      \"enableGroup\": true,\n      // 是否显示排序按钮\n      \"enableSort\": true,\n      // 是否显示查找按钮\n      \"enableFind\": true,\n      // 是否显示详情记录按钮\n      \"enableDetailRecord\": true,\n      // 是否显示编辑记录按钮\n      \"enableEditRecord\": false\n    },\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:指标卡(STATISTICS)\n  // 别名/同义词:KPI 卡、指标图、数据指标卡、关键指标卡\n  // 用途:以大号数字展示核心指标,并可附加环同比(与上期对比的涨跌幅)\n  //       和趋势折线图,适合展示销售额、DAU、转化率等需要对比分析的 KPI 指标。\n  //       与\"统计数字(SUMMARY)\"的区别:指标卡支持环同比对比和趋势图,\n  //       功能更丰富;统计数字仅展示单一数字,更简洁。\n  // 重要:当用户说\"指标卡\"、\"KPI 卡\"、\"指标图\"、\"关键指标\"、\"带趋势的数字\"时,\n  //       必须使用 chartType = \"STATISTICS\",不要使用其他图表类型。\n  // ═══════════════════════════════════════════════════════════════════\n  \"STATISTICS\": {\n    // 必填,图表类型,固定值 \"STATISTICS\"(指标卡)\n    \"chartType\": \"STATISTICS\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"指标卡\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时为 null,传入时必须是该表中真实存在的 viewId\n    \"view\": null,\n    // 无 filter 时请传空数组;\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置)中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 统计指标配置,measureType 与 measure 二选一:\n    //   measureType = \"record-count\" 时统计记录总数,无需填 measure;\n    //   measureType = \"field\" 时需填 measure,指定聚合字段和聚合函数\n    \"measureType\": \"field\",\n    // 可选,当 measureType = \"field\" 时必填,指定聚合字段\n    \"measure\": [\n      {\n        // 必填,字段 ID(必须是该表中真实存在的数值类字段 ID)\n        \"value\": \"fld_number_01\",\n        // 必填,聚合函数配置\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            // formula 合法值:count (计数), unique-count (去重计数), sum (求和), average (平均值), max (最大值), min (最小值)'\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    // 可选,指标说明文字,显示在数值下方\n    \"desc\": \"\",\n    // 可选,数字格式化配置\n    \"numberFormat\": {\n      // 小数位数,默认 0\n      \"digits\": 0,\n      // 格式类型,合法值:number / percent / thousand\n      \"format\": \"number\",\n      // 是否显示千位分隔符\n      \"thousandSeparator\": true\n    },\n    // 可选,是否显示环同比,默认 false\n    \"showComparison\": false,\n    // 可选,showComparison=true 时填写,环同比对比的日期字段 ID\n    \"comparisonField\": null,\n    // 可选,环同比时间范围,如 \"this_week\" / \"this_month\" / \"this_year\"\n    \"comparisonDateRange\": null,\n    // 可选,环同比类型,合法值:sequential(环比)/ year-on-year(同比)/ month-on-month(月比)/ week-on-week(周比)/ custom(自定义)\n    \"comparisonType\": \"sequential\",\n    // 可选,时间统计方式,合法值:same_period(同期)/ cumulative(累计)\n    \"comparisonPeriodType\": \"same_period\",\n    // 可选,环同比计算类型,合法值:difference-rate(差值率)/ difference-value(差值)/ original-value(原值)\n    \"comparisonCalculationType\": \"difference-rate\",\n    // 可选,环同比布局方向(仅 showComparison=true 且 showTrend=false 时生效),合法值:bottom(下方)/ right(右侧)\n    \"comparisonLayout\": \"bottom\",\n    // 可选,是否显示趋势图,默认 false\n    \"showTrend\": false,\n    // 可选,showTrend=true 时填写,趋势图使用的日期字段 ID\n    \"trendField\": null,\n    // 可选,趋势图时间范围,如 \"this_week\" / \"this_month\" / \"this_year\"\n    \"trendDateRange\": null,\n    // 可选,趋势图布局方向(仅 showTrend=true 且 showComparison=false 时生效),合法值:bottom(下方)/ right(右侧)\n    \"trendLayout\": \"bottom\",\n    // 可选,趋势图颜色,十六进制色值,如 \"#1677FF\"\n    \"trendColor\": \"\",\n    // 可选,环同比图标样式,合法值:1 / 2 / 3 / 4 / 5 / 6 / 7 / 8\n    \"iconStyle\": \"5\",\n    // 可选,卡片标题颜色,十六进制色值\n    \"titleColor\": \"\",\n    // 可选,指标说明文字颜色,十六进制色值\n    \"descColor\": \"\",\n    // 可选,环同比描述颜色,十六进制色值\n    \"comparisonDescColor\": \"\",\n    // 可选,数值颜色配置,支持两种形式:\n    //   1. 固定色值字符串,如 \"#1677FF\",或渐变色 \"linear-gradient(...)\"\n    //   2. 条件配色对象(根据数值区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\n    \"colors\": \"\"\n  },\n// ═══════════════════════════════════════════════════════════════════\n  // 图表类型:统计数字(SUMMARY)\n  // 别名/同义词:汇总数字、统计卡、数字卡、计数卡\n  // 用途:以大号数字形式展示单一聚合指标(如记录总数、字段求和/均值等),\n  //       是最简洁的数据汇总展示方式,适合展示总销售额、总订单数、平均分等。\n  // 与其他图表的关键区别:\n  //   - 与\"指标卡(STATISTICS)\"的区别:统计数字更简洁,无环同比、无趋势图;\n  //     指标卡功能更丰富,支持环同比对比和趋势折线图。\n  //   - 与\"柱状图(HISTOGRAM)\"的关键区别:统计数字只展示一个聚合数字(单值卡片),\n  //     无坐标轴、无分类对比;柱状图展示多个分类的数值对比,有 X/Y 轴(多值图表)。\n  // 重要:当用户说\"统计数字\"、\"汇总数字\"、\"数字卡\"、\"计数\"、\"总数\"时,\n  //       必须使用 chartType = \"SUMMARY\",不要使用 HISTOGRAM 或其他图表类型。\n  // ═══════════════════════════════════════════════════════════════════\n  \"SUMMARY\": {\n    // 必填,图表类型,固定值 \"SUMMARY\"(统计数字)\n    \"chartType\": \"SUMMARY\",\n    // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\n    \"name\": \"统计数字\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时为 null,传入时必须是该表中真实存在的 viewId\n    \"view\": null,\n    // 无 filter 时请传空数组;\n    // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置)中 filters 的 filter 格式,\n    // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\n    \"filter\": [],\n    // 统计指标配置,measureType 与 measure 二选一:\n    //   measureType = \"record-count\" 时统计记录总数,无需填 measure;\n    //   measureType = \"field\" 时需填 measure,指定聚合字段和聚合函数\n    \"measureType\": \"field\",\n    // 可选,当 measureType = \"field\" 时必填,指定聚合字段\n    \"measure\": [\n      {\n        // 必填,字段 ID(必须是该表中真实存在的数值类字段 ID)\n        \"value\": \"fld_number_01\",\n        // 必填,聚合函数配置\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            // formula 合法值:count (计数), unique-count (去重计数), sum (求和), average (平均值), max (最大值), min (最小值)'\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    // 可选,数字格式化配置\n    \"numberFormat\": {\n      // 小数位数,默认 0\n      \"digits\": 0,\n      // 格式类型,合法值:number / percent / thousand\n      \"format\": \"number\",\n      // 是否显示千位分隔符\n      \"thousandSeparator\": true\n    },\n    // 可选,指标说明文字,由用户在编辑器中输入,传给服务端后显示在数值下方\n    \"desc\": \"\",\n    // 可选,数值颜色配置,支持两种形式:\n    //   1. 固定色值字符串,如 \"#1677FF\",或渐变色 \"linear-gradient(...)\"\n    //   2. 条件配色对象(根据数值区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\n    \"colors\": \"\"\n  },\n// 标签页配置格式,必须按照此格式配置,否则会导致解析错误\n  \"TABS\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"TABS\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标签页\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    // 可选,标签页样式类型,合法值有:type1 到 type10,默认为 type1\n    \"tabsStyleType\": \"type1\",\n    // 可选,标签页对齐方式,合法值有:left(左对齐)/ center(居中)/ right(右对齐),默认为 left\n    \"tabsAlignType\": \"left\",\n    // 可选,默认激活的标签页 ID,必须与 tabs 数组中的某个 id 匹配\n    \"activeTabId\": \"tab_001\",\n    // 必填,标签页数组\n    \"tabs\": [\n      {\n        // 必填,标签页 ID(必须唯一)\n        \"id\": \"tab_001\",\n        // 必填,标签页名称\n        // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标签页 1\"\n      },\n      {\n        \"id\": \"tab_002\",\n        // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标签页 2\"\n      },\n      {\n        \"id\": \"tab_003\",\n        // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"标签页 3\"\n      }\n    ]\n  },\n// 词云图配置格式,必须按照此格式配置,否则会导致解析错误\n  \"WORD_CLOUD\": {\n    // 必填,图表的类型,不传或传错图表将渲染异常\n    \"chartType\": \"WORD_CLOUD\",\n    // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\n    \"name\": \"词云图\",\n    // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\n    \"sheet\": \"sheet_001\",\n    // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\n    \"view\": \"view_001\",\n    \"measureType\": \"field\",\n    \"measure\": [\n      {\n        \"value\": \"fld_number_01\",\n        \"externalValue\": [\n          {\n            \"type\": \"formula\",\n            \"value\": \"sum\"\n          }\n        ]\n      }\n    ],\n    \"dimension\": [\n      {\n        \"value\": \"fld_text_01\"\n      }\n    ],\n    \"disableParticiple\": false, // 是否禁用分词\n    \"colors\": \"COLOR_PALETTE_1\",\n    \"filter\": []\n  },\n}\n",
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Dashboard widgets config example returned. Each key is a chart type (e.g. HISTOGRAM, PIE), and the value is the corresponding widget config example. Use the matching chart type's config as a reference when calling create_chart."
+}
dws aitable +dashboard-arrange --base-id <base-id> --dashboard-id <dashboard-id>write
对指定仪表盘做服务端智能布局重排
dws mcp aitable align_dashboard --json '{"baseId":<..>, "dashboardId":<..>}' lark-cli base +dashboard-arrange已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/align_dashboard
输入 / CLI 输出
输入
dws aitable +dashboard-arrange --base-id x --dashboard-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "align_dashboard"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "align_dashboard"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1141ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +dashboard-arrange --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to align dashboard for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998564478222e08d8\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to align dashboard for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998564478222e08d8\"}"
+  }
+}
dws aitable +dashboard-config-exampleread
获取 dashboard config 的结构示例
dws mcp aitable get_dashboard_config_example lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_dashboard_config_example
输入 / CLI 输出
输入
dws aitable +dashboard-config-example --yes
stdout
{
+  "_fake": true,
+  "args": {},
+  "product": "aitable",
+  "tool": "get_dashboard_config_example"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {},
+  "product": "aitable",
+  "tool": "get_dashboard_config_example"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1064ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +dashboard-config-example --yes --format json
真实 stdout
{
+  "data": "// 注意\n// 1. 下述 JSON 示例中的注释(// 开头的注释)仅用于说明,实际使用时请删除,否则会导致解析错误\n// 2. 当一个仪表盘创建完成,并添加图表完成后,检查一下布局,如果有空白或不对齐的图表,请调用 update_chart 优化布局\n// 3. 当一个仪表盘完整创建后,包括图表也添加完成后,可通过 get_dashboard 接口查看仪表盘详情,检查布局是合适(没有空白或不对齐),如果有问题,调用 update_chart 优化布局\n// 4. 仪表盘创建好并优化布局后,向用户输出仪表盘链接 URL(注意是仪表盘 URL),方便用户直接访问和使用仪表盘\n\n{\n  // 服务端自动生成,调用方传入会被忽略\n  \"id\": \"dashboard_001\",\n  // 必填,dashboard 名称,是整个仪表盘的标题,一定要传入,且清晰明确,方便用户使用\n  \"name\": \"示例仪表盘\",\n  // 必须使用本示例中的默认主题,禁止自行编造,随意生成的主题无法解析和渲染\n  \"theme\": {\n    // 必须为 DEFAULT\n    \"key\": \"DEFAULT\",\n    // 主题背景色,大部分情况下「传入 null 或 undefined」,使用默认即可\n    \"background\": null,\n    \"image\": \"\"\n  },\n  // 可选,全局筛选条件数组;每个元素对应一张数据表的筛选规则\n  \"filters\": [\n    {\n      // 要筛选的数据表 ID(必须是真实存在的 tableId)\n      \"sheetId\": \"sheet_001\",\n      // 筛选条件数组;第一个条件的 link 必须为 null,后续条件用 \"AND\" 或 \"OR\" 连接\n      \"filter\": [\n        {\n          // 要筛选的字段 ID(必须是该表中真实存在的 fieldId)\n          \"fieldId\": \"fld_001\",\n          // 条件连接符:第一个条件必须为 null,后续条件为 \"AND\" 或 \"OR\"\n          \"link\": null,\n          // 固定为 1\n          \"version\": 1,\n          // 比较符号,合法值按字段类型分组如下:\n          //   文本类: EQ(等于), NE(不等于), CONTAIN(包含), EXCLUSIVE(不包含) — value 为字符串\n          //   数字类: EQ, NE, GT(大于), LT(小于), GTE(大于等于), LTE(小于等于) — value 为数字\n          //   日期类: DATE_EQ(日期等于), BEFORE(早于), AFTER(晚于), NOT_AFTER(不晚于), NOT_BEFORE(不早于) — value 为 \"yyyy-MM-dd\" 格式字符串\n          //   选项类: ANY_OF(包含任一), ALL_OF(包含全部), NONE_OF(不包含任一) — value 为选项 ID 字符串数组,如 [\"opt_001\", \"opt_002\"]\n          //   存在性: EXIST(有值), UN_EXIST(无值) — value 为 null\n          \"symbol\": \"EQ\",\n          // value 的类型取决于 symbol,参见上方说明\n          \"value\": \"已完成\"\n        }\n      ]\n    }\n  ],\n  // 图表布局数组;创建时会被忽略(默认空数组),更新时有效\n  // 每个元素描述一个图表在网格中的位置和尺寸\n  // layout 的更新,需要通过 update_chart 接口更新到每个图表上,update_chart 接口会自动根据 layout 调整仪表盘布局\n  // 无法通过 update_dashboard 接口直接更新布局,必须通过 update_chart 接口更新图表来间接更新布局\n  \"layout\": [\n    {\n      // 对应的 widget/chart ID\n      \"i\": \"widget_001\",\n      // 横坐标(列位置,从 0 开始,取值范围 0~11)\n      \"x\": 0,\n      // 纵坐标(行位置,从 0 开始,无上限)\n      \"y\": 0,\n      // 宽度(占几列,网格总宽 12 列,取值范围 1~12,同一行所有图表的 w 之和应等于 12)\n      \"w\": 12,\n      // 高度(占几行,取值范围 1~N,同一行的图表必须保持相同高度)\n      \"h\": 6,\n      // 最小宽度(可选,限制用户拖拽缩放的下限)\n      \"minW\": 4,\n      // 最小高度(可选,限制用户拖拽缩放的下限)\n      \"minH\": 3,\n      // 可选,所属分组 ID(用于 COMPOSITE_LAYOUT 组合布局,不使用分组时省略)\n      \"parentId\": \"group_001\"\n    }\n  ]\n}",
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Dashboard config example returned. The 'id' field is for structure reference only; it will be auto-generated by the server when creating a dashboard. The 'layout' field is ignored when creating (defaults to empty array), but effective when updating."
+}
真实 stderr / error
(空)
真实返回
{
+  "data": "// 注意\n// 1. 下述 JSON 示例中的注释(// 开头的注释)仅用于说明,实际使用时请删除,否则会导致解析错误\n// 2. 当一个仪表盘创建完成,并添加图表完成后,检查一下布局,如果有空白或不对齐的图表,请调用 update_chart 优化布局\n// 3. 当一个仪表盘完整创建后,包括图表也添加完成后,可通过 get_dashboard 接口查看仪表盘详情,检查布局是合适(没有空白或不对齐),如果有问题,调用 update_chart 优化布局\n// 4. 仪表盘创建好并优化布局后,向用户输出仪表盘链接 URL(注意是仪表盘 URL),方便用户直接访问和使用仪表盘\n\n{\n  // 服务端自动生成,调用方传入会被忽略\n  \"id\": \"dashboard_001\",\n  // 必填,dashboard 名称,是整个仪表盘的标题,一定要传入,且清晰明确,方便用户使用\n  \"name\": \"示例仪表盘\",\n  // 必须使用本示例中的默认主题,禁止自行编造,随意生成的主题无法解析和渲染\n  \"theme\": {\n    // 必须为 DEFAULT\n    \"key\": \"DEFAULT\",\n    // 主题背景色,大部分情况下「传入 null 或 undefined」,使用默认即可\n    \"background\": null,\n    \"image\": \"\"\n  },\n  // 可选,全局筛选条件数组;每个元素对应一张数据表的筛选规则\n  \"filters\": [\n    {\n      // 要筛选的数据表 ID(必须是真实存在的 tableId)\n      \"sheetId\": \"sheet_001\",\n      // 筛选条件数组;第一个条件的 link 必须为 null,后续条件用 \"AND\" 或 \"OR\" 连接\n      \"filter\": [\n        {\n          // 要筛选的字段 ID(必须是该表中真实存在的 fieldId)\n          \"fieldId\": \"fld_001\",\n          // 条件连接符:第一个条件必须为 null,后续条件为 \"AND\" 或 \"OR\"\n          \"link\": null,\n          // 固定为 1\n          \"version\": 1,\n          // 比较符号,合法值按字段类型分组如下:\n          //   文本类: EQ(等于), NE(不等于), CONTAIN(包含), EXCLUSIVE(不包含) — value 为字符串\n          //   数字类: EQ, NE, GT(大于), LT(小于), GTE(大于等于), LTE(小于等于) — value 为数字\n          //   日期类: DATE_EQ(日期等于), BEFORE(早于), AFTER(晚于), NOT_AFTER(不晚于), NOT_BEFORE(不早于) — value 为 \"yyyy-MM-dd\" 格式字符串\n          //   选项类: ANY_OF(包含任一), ALL_OF(包含全部), NONE_OF(不包含任一) — value 为选项 ID 字符串数组,如 [\"opt_001\", \"opt_002\"]\n          //   存在性: EXIST(有值), UN_EXIST(无值) — value 为 null\n          \"symbol\": \"EQ\",\n          // value 的类型取决于 symbol,参见上方说明\n          \"value\": \"已完成\"\n        }\n      ]\n    }\n  ],\n  // 图表布局数组;创建时会被忽略(默认空数组),更新时有效\n  // 每个元素描述一个图表在网格中的位置和尺寸\n  // layout 的更新,需要通过 update_chart 接口更新到每个图表上,update_chart 接口会自动根据 layout 调整仪表盘布局\n  // 无法通过 update_dashboard 接口直接更新布局,必须通过 update_chart 接口更新图表来间接更新布局\n  \"layout\": [\n    {\n      // 对应的 widget/chart ID\n      \"i\": \"widget_001\",\n      // 横坐标(列位置,从 0 开始,取值范围 0~11)\n      \"x\": 0,\n      // 纵坐标(行位置,从 0 开始,无上限)\n      \"y\": 0,\n      // 宽度(占几列,网格总宽 12 列,取值范围 1~12,同一行所有图表的 w 之和应等于 12)\n      \"w\": 12,\n      // 高度(占几行,取值范围 1~N,同一行的图表必须保持相同高度)\n      \"h\": 6,\n      // 最小宽度(可选,限制用户拖拽缩放的下限)\n      \"minW\": 4,\n      // 最小高度(可选,限制用户拖拽缩放的下限)\n      \"minH\": 3,\n      // 可选,所属分组 ID(用于 COMPOSITE_LAYOUT 组合布局,不使用分组时省略)\n      \"parentId\": \"group_001\"\n    }\n  ]\n}",
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Dashboard config example returned. The 'id' field is for structure reference only; it will be auto-generated by the server when creating a dashboard. The 'layout' field is ignored when creating (defaults to empty array), but effective when updating."
+}
dws aitable +dashboard-delete --base-id <base-id> --dashboard-id <dashboard-id> --reason <reason>high-risk-write
删除指定 dashboard(级联删除其 chart,不可逆)
dws mcp aitable delete_dashboard --json '{"baseId":<..>, "dashboardId":<..>, "reason":<..>}' lark-cli base +dashboard-delete已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/delete_dashboard
输入 / CLI 输出
输入
dws aitable +dashboard-delete --base-id x --dashboard-id x --reason x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "dashboardId": "x",
+    "reason": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_dashboard"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "dashboardId": "x",
+    "reason": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_dashboard"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1247ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +dashboard-delete --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --reason 'DWS shortcut 真实测试安全负向清理' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete dashboard DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998577042546e0941\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete dashboard DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998577042546e0941\"}"
+  }
+}
dws aitable +dashboard-get --base-id <base-id> --dashboard-id <dashboard-id>read
获取指定 dashboard 的详细信息(含 charts summary)
dws mcp aitable get_dashboard --json '{"baseId":<..>, "dashboardId":<..>}' lark-cli base +dashboard-get已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_dashboard
输入 / CLI 输出
输入
dws aitable +dashboard-get --base-id x --dashboard-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_dashboard"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_dashboard"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1179ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +dashboard-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --dashboard-id KY9tlWg5NEHgfs8WT6IO2 --yes --format json
真实 stdout
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "chartCount": 8,
+    "charts": [
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-dlxFo0tNSImp4ITpDn5fQ",
+        "chartName": "各业务线未部署数",
+        "chartType": "BAR",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-OQW55ZoOPT3abjYxQbdBo",
+        "chartName": "部署完成率",
+        "chartType": "PIE",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "0ed6ae150c7e43508d504b741ca1b19a",
+        "chartName": "设备付费情况分布",
+        "chartType": "PIE",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-dqjTHaYZdhbSTwRk3JEjI",
+        "chartName": "领取人未部署排行",
+        "chartType": "LEADERBOARD",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-qqMeLF69BEVnKCglPUPRw",
+        "chartName": "验证情况分析",
+        "chartType": "BAR",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-tIkpYHZqciaEu0ypokSEt",
+        "chartName": "部署时间趋势",
+        "chartType": "LINE",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-PcnRUOqW5RzJHFZ1BxQJe",
+        "chartName": "客户未部署分布",
+        "chartType": "HISTOGRAM",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-8LICblz3EqyoLbkyM22Bw",
+        "chartName": "付费状态漏斗",
+        "chartType": "FUNNEL",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      }
+    ],
+    "dashboardId": "KY9tlWg5NEHgfs8WT6IO2",
+    "dashboardName": "仪表盘",
+    "filters": [],
+    "layout": [
+      {
+        "h": 4,
+        "i": "widget-05w7XiwviqQgWrMxmvP20",
+        "w": 12,
+        "x": 0,
+        "y": 0
+      },
+      {
+        "h": 5,
+        "i": "widget-dlxFo0tNSImp4ITpDn5fQ",
+        "w": 6,
+        "x": 0,
+        "y": 4
+      },
+      {
+        "h": 5,
+        "i": "widget-PcnRUOqW5RzJHFZ1BxQJe",
+        "w": 6,
+        "x": 6,
+        "y": 4
+      },
+      {
+        "h": 5,
+        "i": "widget-qqMeLF69BEVnKCglPUPRw",
+        "w": 6,
+        "x": 0,
+        "y": 9
+      },
+      {
+        "h": 5,
+        "i": "widget-tIkpYHZqciaEu0ypokSEt",
+        "w": 6,
+        "x": 6,
+        "y": 9
+      },
+      {
+        "h": 5,
+        "i": "widget-OQW55ZoOPT3abjYxQbdBo",
+        "w": 4,
+        "x": 0,
+        "y": 14
+      },
+      {
+        "h": 5,
+        "i": "widget-dqjTHaYZdhbSTwRk3JEjI",
+        "w": 4,
+        "x": 4,
+        "y": 14
+      },
+      {
+        "h": 5,
+        "i": "widget-8LICblz3EqyoLbkyM22Bw",
+        "w": 4,
+        "x": 8,
+        "y": 14
+      },
+      {
+        "h": 4,
+        "i": "0ed6ae150c7e43508d504b741ca1b19a",
+        "w": 6,
+        "x": 0,
+        "y": 0
+      }
+    ],
+    "meta": {}
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got dashboard KY9tlWg5NEHgfs8WT6IO2. URL rules: AI 表格仪表盘访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{dashboardId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "chartCount": 8,
+    "charts": [
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-dlxFo0tNSImp4ITpDn5fQ",
+        "chartName": "各业务线未部署数",
+        "chartType": "BAR",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-OQW55ZoOPT3abjYxQbdBo",
+        "chartName": "部署完成率",
+        "chartType": "PIE",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "0ed6ae150c7e43508d504b741ca1b19a",
+        "chartName": "设备付费情况分布",
+        "chartType": "PIE",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-dqjTHaYZdhbSTwRk3JEjI",
+        "chartName": "领取人未部署排行",
+        "chartType": "LEADERBOARD",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-qqMeLF69BEVnKCglPUPRw",
+        "chartName": "验证情况分析",
+        "chartType": "BAR",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-tIkpYHZqciaEu0ypokSEt",
+        "chartName": "部署时间趋势",
+        "chartType": "LINE",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-PcnRUOqW5RzJHFZ1BxQJe",
+        "chartName": "客户未部署分布",
+        "chartType": "HISTOGRAM",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      },
+      {
+        "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+        "chartId": "widget-8LICblz3EqyoLbkyM22Bw",
+        "chartName": "付费状态漏斗",
+        "chartType": "FUNNEL",
+        "dashboardId": "KY9tlWg5NEHgfs8WT6IO2"
+      }
+    ],
+    "dashboardId": "KY9tlWg5NEHgfs8WT6IO2",
+    "dashboardName": "仪表盘",
+    "filters": [],
+    "layout": [
+      {
+        "h": 4,
+        "i": "widget-05w7XiwviqQgWrMxmvP20",
+        "w": 12,
+        "x": 0,
+        "y": 0
+      },
+      {
+        "h": 5,
+        "i": "widget-dlxFo0tNSImp4ITpDn5fQ",
+        "w": 6,
+        "x": 0,
+        "y": 4
+      },
+      {
+        "h": 5,
+        "i": "widget-PcnRUOqW5RzJHFZ1BxQJe",
+        "w": 6,
+        "x": 6,
+        "y": 4
+      },
+      {
+        "h": 5,
+        "i": "widget-qqMeLF69BEVnKCglPUPRw",
+        "w": 6,
+        "x": 0,
+        "y": 9
+      },
+      {
+        "h": 5,
+        "i": "widget-tIkpYHZqciaEu0ypokSEt",
+        "w": 6,
+        "x": 6,
+        "y": 9
+      },
+      {
+        "h": 5,
+        "i": "widget-OQW55ZoOPT3abjYxQbdBo",
+        "w": 4,
+        "x": 0,
+        "y": 14
+      },
+      {
+        "h": 5,
+        "i": "widget-dqjTHaYZdhbSTwRk3JEjI",
+        "w": 4,
+        "x": 4,
+        "y": 14
+      },
+      {
+        "h": 5,
+        "i": "widget-8LICblz3EqyoLbkyM22Bw",
+        "w": 4,
+        "x": 8,
+        "y": 14
+      },
+      {
+        "h": 4,
+        "i": "0ed6ae150c7e43508d504b741ca1b19a",
+        "w": 6,
+        "x": 0,
+        "y": 0
+      }
+    ],
+    "meta": {}
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got dashboard KY9tlWg5NEHgfs8WT6IO2. URL rules: AI 表格仪表盘访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{dashboardId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。"
+}
dws aitable +dashboard-share-get --base-id <base-id> --dashboard-id <dashboard-id>read
查询 dashboard 的分享配置
dws mcp aitable get_dashboard_share --json '{"baseId":<..>, "dashboardId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_dashboard_share
输入 / CLI 输出
输入
dws aitable +dashboard-share-get --base-id x --dashboard-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_dashboard_share"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "dashboardId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_dashboard_share"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1472ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test aitable +dashboard-share-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --dashboard-id KY9tlWg5NEHgfs8WT6IO2 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"Not Found\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get dashboard share config for dashboard KY9tlWg5NEHgfs8WT6IO2\",\"trace_id\":\"0bb7c36217840997497315836e07fe\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"Not Found\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get dashboard share config for dashboard KY9tlWg5NEHgfs8WT6IO2\",\"trace_id\":\"0bb7c36217840997497315836e07fe\"}"
+  }
+}
dws aitable +dashboard-share-update --base-id <base-id> --dashboard-id <dashboard-id> --enabled <enabled> --share-type <share-type> --allow-back-to-doc <allow-back-to-doc>write
开启/关闭 dashboard 分享并可设置分享类型
dws mcp aitable update_dashboard_share --json '{"baseId":<..>, "dashboardId":<..>, "enabled":<..>, "shareType":<..>, "allowBackToDoc":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/update_dashboard_share
输入 / CLI 输出
输入
dws aitable +dashboard-share-update --base-id x --dashboard-id x --enabled --share-type PUBLIC --allow-back-to-doc --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "allowBackToDoc": true,
+    "baseId": "x",
+    "dashboardId": "x",
+    "enabled": true,
+    "shareType": "PUBLIC"
+  },
+  "product": "aitable",
+  "tool": "update_dashboard_share"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "allowBackToDoc": true,
+    "baseId": "x",
+    "dashboardId": "x",
+    "enabled": true,
+    "shareType": "PUBLIC"
+  },
+  "product": "aitable",
+  "tool": "update_dashboard_share"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1115ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +dashboard-share-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --enabled --share-type PUBLIC --allow-back-to-doc --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update dashboard share for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998588081246e0853\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update dashboard share for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998588081246e0853\"}"
+  }
+}
dws aitable +dashboard-update --base-id <base-id> --dashboard-id <dashboard-id> --config <config> --name <name>write
更新指定 dashboard 的配置
dws mcp aitable update_dashboard --json '{"baseId":<..>, "dashboardId":<..>, "config":<..>}' lark-cli base +dashboard-update实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--config JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +dashboard-update --base-id x --dashboard-id x --config x --name x --yes
stdout
(空)
stderr / error
--config JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--config JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1157ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +dashboard-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --config '{}' --name 'DWS shortcut 真实测试 20260715-151724' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update dashboard DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998599403187e08b8\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update dashboard DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998599403187e08b8\"}"
+  }
+}
dws aitable +export-data --base-id <base-id> --task-id <task-id> --scope <scope> --format <format> --table-id <table-id> --view-id <view-id> --timeout-ms <timeout-ms>read
导出 AI 表格数据(创建导出任务或按 taskId 续等)
dws mcp aitable export_data --json '{"baseId":<..>, "taskId":<..>, "scope":<..>, "format":<..>, "tableId":<..>, "viewId":<..>, "timeoutMs":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/export_data
输入 / CLI 输出
输入
dws aitable +export-data --base-id x --task-id x --scope all --format excel --table-id x --view-id x --timeout-ms 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "taskId": "x",
+    "timeoutMs": 1,
+    "viewId": "x"
+  },
+  "product": "aitable",
+  "tool": "export_data"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "taskId": "x",
+    "timeoutMs": 1,
+    "viewId": "x"
+  },
+  "product": "aitable",
+  "tool": "export_data"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1754ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +export-data --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --task-id DWSREALREADNOSUCHID0000000000000 --scope all --format excel --table-id hERWDMS --view-id qvGDAH2 --timeout-ms 1 --yes
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"taskId cannot be combined with scope, format, tableId or viewId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to continue export because taskId mode cannot include create-task params\",\"trace_id\":\"2104a64c17840997514714448e0817\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"taskId cannot be combined with scope, format, tableId or viewId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to continue export because taskId mode cannot include create-task params\",\"trace_id\":\"2104a64c17840997514714448e0817\"}"
+  }
+}
dws aitable +field-delete --base-id <base-id> --table-id <table-id> --field-id <field-id>high-risk-write
删除指定字段(不可逆)
dws mcp aitable delete_field --json '{"baseId":<..>, "tableId":<..>, "fieldId":<..>}' lark-cli base +field-delete已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/delete_field
输入 / CLI 输出
输入
dws aitable +field-delete --base-id x --table-id x --field-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_field"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_field"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1157ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +field-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get current field info before delete\",\"trace_id\":\"0bab027317840998611338768e08c8\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get current field info before delete\",\"trace_id\":\"0bab027317840998611338768e08c8\"}"
+  }
+}
dws aitable +field-get --base-id <base-id> --table-id <table-id> --field-ids <field-ids>read
批量获取字段详情(含类型相关完整配置)
dws mcp aitable get_fields --json '{"baseId":<..>, "tableId":<..>, "fieldIds":<..>}' lark-cli base +field-get已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_fields
输入 / CLI 输出
输入
dws aitable +field-get --base-id x --table-id x --field-ids x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldIds": [
+      "x"
+    ],
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_fields"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldIds": [
+      "x"
+    ],
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_fields"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1402ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +field-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --field-ids 01ZM8y7 --yes --format json
真实 stdout
{
+  "data": {
+    "fields": [
+      {
+        "aiConfig": {
+          "autoRecompute": false,
+          "computeOnEmptyRef": false,
+          "enableThinking": false,
+          "enableWebSearch": false,
+          "imageConfig": {
+            "aiGeneratedWatermark": true,
+            "count": 1,
+            "resolution": "1024*1024"
+          },
+          "outputType": "text",
+          "prompt": [
+            {
+              "type": "text",
+              "value": "你是一位贴心的文字识别助手,当用户需要识别图片中的文字时(如菜单、传单、说明书),清晰识别出内容。\n\n执行前严格验证输入:\n- 如果未提供图片,立即回复:\"请上传需要识别文字的图片,我帮您快速查看内容!\"\n- 如果图片模糊/黑暗,回复:\"图片不太清楚,建议:1) 重新拍摄 2) 对准文字区域 3) 确保光线充足\"\n当输入有效时,按以下规则生成结果(禁用任何技术格式):\n1. 识别原则(像真人一样读图)\n   - 严格按阅读顺序朗读文字,保留原换行与空格\n   - 模糊处标注\"(看不清)\",不猜测内容(例:\"价(格)\")\n   - 保留所有标点、符号和大小写(如\"¥25\"不改为\"25元\")\n   - 表格按\"从左到右、从上到下\"顺序朗读\n2. 输出格式要求(必须遵守)\n   - 禁用JSON/XML/代码块,仅用**模拟纸质文档**的直观格式\n   - 示例(基于用户输入):\n     欢迎光临\n     ABC咖啡店\n     今日特惠:\n     拿铁 ¥25\n     卡布奇诺 ¥28\n     营业时间:8:00-22:00\n3. 关键控制规则\n   - 排版还原:用空行分隔段落,保留项目符号(如\"•\")\n   - 模糊处理:单个模糊字符→\"(看不清)\",连续模糊→\"(此处有文字但看不清)\"\n   - 语言提示:仅列出主要语言(如\"中文为主,含少量英文\")\n   - 空结果处理:写\"未检测到清晰文字,请检查图片\"\n   - 绝对禁止:不添加任何解释(如\"根据OCR技术...\")\n4. 禁止行为\n   × 生成任何JSON/XML代码  \n   × 使用术语如\"full_text\"、\"lines\"  \n   × 修改原始文字内容(如\"¥25\"不改为\"25元\")\n\n下面是你要总结和分析的原始内容"
+            },
+            {
+              "fieldId": "2hfk5Hd",
+              "type": "fieldRef"
+            },
+            {
+              "type": "text",
+              "value": ",只保留识别结果中的“序列号”或者“Serial No\""
+            }
+          ],
+          "type": "ai-agent"
+        },
+        "fieldId": "01ZM8y7",
+        "fieldName": "序列号",
+        "type": "text"
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got 1 fields from table hERWDMS"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "fields": [
+      {
+        "aiConfig": {
+          "autoRecompute": false,
+          "computeOnEmptyRef": false,
+          "enableThinking": false,
+          "enableWebSearch": false,
+          "imageConfig": {
+            "aiGeneratedWatermark": true,
+            "count": 1,
+            "resolution": "1024*1024"
+          },
+          "outputType": "text",
+          "prompt": [
+            {
+              "type": "text",
+              "value": "你是一位贴心的文字识别助手,当用户需要识别图片中的文字时(如菜单、传单、说明书),清晰识别出内容。\n\n执行前严格验证输入:\n- 如果未提供图片,立即回复:\"请上传需要识别文字的图片,我帮您快速查看内容!\"\n- 如果图片模糊/黑暗,回复:\"图片不太清楚,建议:1) 重新拍摄 2) 对准文字区域 3) 确保光线充足\"\n当输入有效时,按以下规则生成结果(禁用任何技术格式):\n1. 识别原则(像真人一样读图)\n   - 严格按阅读顺序朗读文字,保留原换行与空格\n   - 模糊处标注\"(看不清)\",不猜测内容(例:\"价(格)\")\n   - 保留所有标点、符号和大小写(如\"¥25\"不改为\"25元\")\n   - 表格按\"从左到右、从上到下\"顺序朗读\n2. 输出格式要求(必须遵守)\n   - 禁用JSON/XML/代码块,仅用**模拟纸质文档**的直观格式\n   - 示例(基于用户输入):\n     欢迎光临\n     ABC咖啡店\n     今日特惠:\n     拿铁 ¥25\n     卡布奇诺 ¥28\n     营业时间:8:00-22:00\n3. 关键控制规则\n   - 排版还原:用空行分隔段落,保留项目符号(如\"•\")\n   - 模糊处理:单个模糊字符→\"(看不清)\",连续模糊→\"(此处有文字但看不清)\"\n   - 语言提示:仅列出主要语言(如\"中文为主,含少量英文\")\n   - 空结果处理:写\"未检测到清晰文字,请检查图片\"\n   - 绝对禁止:不添加任何解释(如\"根据OCR技术...\")\n4. 禁止行为\n   × 生成任何JSON/XML代码  \n   × 使用术语如\"full_text\"、\"lines\"  \n   × 修改原始文字内容(如\"¥25\"不改为\"25元\")\n\n下面是你要总结和分析的原始内容"
+            },
+            {
+              "fieldId": "2hfk5Hd",
+              "type": "fieldRef"
+            },
+            {
+              "type": "text",
+              "value": ",只保留识别结果中的“序列号”或者“Serial No\""
+            }
+          ],
+          "type": "ai-agent"
+        },
+        "fieldId": "01ZM8y7",
+        "fieldName": "序列号",
+        "type": "text"
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got 1 fields from table hERWDMS"
+}
dws aitable +field-update --base-id <base-id> --table-id <table-id> --field-id <field-id> --name <name> --config <config> --ai-config <ai-config>write
更新字段名称 / 配置 / AI 配置(类型不可改)
dws mcp aitable update_field --json '{"baseId":<..>, "tableId":<..>, "fieldId":<..>, "newFieldName":<..>, "config":<..>, "aiConfig":<..>}' lark-cli base +field-update实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--config JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +field-update --base-id x --table-id x --field-id x --name x --config x --ai-config x --yes
stdout
(空)
stderr / error
--config JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--config JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1196ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +field-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --config '{}' --ai-config '{}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get current field info for update\",\"trace_id\":\"213ee25c17840998623207342e08e2\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get current field info for update\",\"trace_id\":\"213ee25c17840998623207342e08e2\"}"
+  }
+}
dws aitable +find-record --base <base> --table <table> --query <query>read
在指定多维表里按关键词查记录(只读)
dws mcp aitable query_records --json '{"baseId":<..>, "tableId":<..>, "keyword":<..>}'dws aitable +find-record --base <base> --table <table> --query <query>read复合/智能型
在指定多维表里按关键词查记录(只读)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 query_records lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/query_records
输入 / CLI 输出
输入
dws aitable +find-record --base x --table x --query x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "keyword": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "query_records"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "keyword": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "query_records"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2849ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +find-record --base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table hERWDMS --query '测试' --yes --format json
真实 stdout
{
+  "data": {
+    "nextCursor": "oXh7WgGooe",
+    "records": [
+      {
+        "cells": {
+          "01ZM8y7": "N0QWY69QN4",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4048.HEIC.JPG",
+              "resourceId": "479e4321-3d6a-42f0-91de-583c6ea41d9f",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5268e3736ebad509e7fcef9dcd108f495a911ef939606b63dc103944eb9062bae7f23148f19bc87f4",
+              "size": 1753393,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "8LVOssPz6Q"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "CDQD7CN97V",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4054.HEIC.JPG",
+              "resourceId": "7d68adf9-ec88-4192-8728-5de240f17fc8",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d57cd5cd33059ea9b3d2766775dd1ba8096b8c5a9cb3defd6f5321c276624c51f602fba57aca34bc6d",
+              "size": 1801325,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试\nAI营销借用",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "133206"
+            }
+          ]
+        },
+        "recordId": "AjOk0hu1pe"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "RY7LCW719Q",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4213.HEIC.JPG",
+              "resourceId": "0022f2cc-bd93-49f0-8039-04ac2909dd32",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d59a2750fefa807e0cfc41158e98407c864f1745537f406fcb0e02c76b1696b84f8bac5e1298eba711",
+              "size": 1763574,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "DUDacJdQ2X"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "D54X6C7WH6",
+          "2hfk5Hd": [
+            {
+              "filename": "image.png",
+              "resourceId": "e7dea77f-0f65-4266-a3fd-e401b80a9582",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5d45d39275c65656906af57b60be7002feaf431efea862523554a56545a2e6ac55d17ee7f4c9382c9",
+              "size": 9795238,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ],
+          "ty1M3J4": {
+            "markdown": "已归还\n"
+          }
+        },
+        "recordId": "Dt8KZX7Nt2"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "MN7V04VVD4",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4044.HEIC.JPG",
+              "resourceId": "82903e20-99ca-4497-8596-64b8a9511347",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5585fe6169387aa3767c7e8d94f1e6b2bdcb910b90a359120b13c8f9d1a59101157155a75536e1183",
+              "size": 1965625,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "FA0TZMthqI"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "CYY9PQRXJ5",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4216.HEIC.JPG",
+              "resourceId": "3dfd0bec-a06a-4580-a9a2-b8ae450df2a4",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d52f04469c6bb09596caffbbac393c775d8db27175749aef18fb6444ef163ea9d17fb0a232eda6495f",
+              "size": 2290335,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "IyGa4g01n1"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "K30F574N0W",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4071.HEIC.JPG",
+              "resourceId": "8f970cbb-9e4d-4abb-bc2e-bae127a6231a",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5988e57da667e94ed89271196611e117503f232ffda40509efa8b2836f86122df894b0282d28e9bd0",
+              "size": 1883600,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "UJwTYA3uNw"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "Y7CXVJ9XWD",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4072.HEIC.JPG",
+              "resourceId": "68b711bd-e972-445a-be79-bf4954b52000",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d581be5bba89215dfa8bf27c7a750a77959fc36654d351427344ca8cee273282f51f530a2b9381f2f5",
+              "size": 1856927,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "Uygc2paXj3"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "GMQW2JLWVY",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4214.HEIC.JPG",
+              "resourceId": "ca4deb91-17d6-43e7-9812-72101643deb9",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d57860f934d7f4ae4fd1379962b8f251e8357d71880d1389e2b613f13514ac39fcfcb2a6a1fcb68a65",
+              "size": 1640058,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "ewj09NwU1z",
+              "name": "AI招聘"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "429676"
+            }
+          ]
+        },
+        "recordId": "Xjj4e7GgG8"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "Y0V7Y2N2YD",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4074.HEIC.JPG",
+              "resourceId": "5b8d3006-280e-41af-a4b0-3320e6a5d596",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5f3f03272cd3d6f49910031a2e873f763b035f6f21d03abba7ab038475a5ab532635226d96df6a64e",
+              "size": 1964512,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "Y056lsOG61"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "P24GFQN7YT",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4033.HEIC.JPG",
+              "resourceId": "38656067-b7b7-45fd-8bea-64f4c89dc4f7",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d50c8666278c495a44ef70265cd8adb7f504b841c8f61607d92f11852026cd92eff88db6bf5a5d630c",
+              "size": 2028953,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "YVaPzcuGBa"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "N7Q33L77WR",
+          "2hfk5Hd": [
+            {
+              "filename": "image.png",
+              "resourceId": "4abf67c0-ad03-4a81-a3db-3794d15453e9",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d53aa03710ddc5973e4df2b4d6c72f04177dd7b5a30206f588777548a9d514bbd2a1bdc9489688a5fb",
+              "size": 9870487,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "hXTMF9el7v"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "HFk9Y9TYQD",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4043.HEIC.JPG",
+              "resourceId": "d6786a91-bca7-4c09-8225-9503cb66610f",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5fe8628219f060fbe50542a5616689036033b038792e8d5a77e12f7fc37630879073a357b1dacf1ae",
+              "size": 2110186,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "kk7eQt1kJB"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "TX6377KGFH",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4064.HEIC.JPG",
+              "resourceId": "850e1a7f-aa0a-4ba8-9b54-5bc9c66a5a63",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5716c6100d05323cbd2151a4b9cf8174b09cf0ac1af356178c4572bfa55a8c065f499293f0f9b00e2",
+              "size": 1963615,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试--恒飞",
+          "ARoUEWW": {
+            "id": "Zw0fFCNl8e",
+            "name": "付费"
+          },
+          "ZoCsF67": "2026-01-23T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "ewj09NwU1z",
+              "name": "AI招聘"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "103262"
+            }
+          ],
+          "ty1M3J4": {
+            "markdown": "目前看设备离线\n"
+          }
+        },
+        "recordId": "oXh7WgGooe"
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Successfully queried 14 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "nextCursor": "oXh7WgGooe",
+    "records": [
+      {
+        "cells": {
+          "01ZM8y7": "N0QWY69QN4",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4048.HEIC.JPG",
+              "resourceId": "479e4321-3d6a-42f0-91de-583c6ea41d9f",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5268e3736ebad509e7fcef9dcd108f495a911ef939606b63dc103944eb9062bae7f23148f19bc87f4",
+              "size": 1753393,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "8LVOssPz6Q"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "CDQD7CN97V",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4054.HEIC.JPG",
+              "resourceId": "7d68adf9-ec88-4192-8728-5de240f17fc8",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d57cd5cd33059ea9b3d2766775dd1ba8096b8c5a9cb3defd6f5321c276624c51f602fba57aca34bc6d",
+              "size": 1801325,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试\nAI营销借用",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "133206"
+            }
+          ]
+        },
+        "recordId": "AjOk0hu1pe"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "RY7LCW719Q",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4213.HEIC.JPG",
+              "resourceId": "0022f2cc-bd93-49f0-8039-04ac2909dd32",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d59a2750fefa807e0cfc41158e98407c864f1745537f406fcb0e02c76b1696b84f8bac5e1298eba711",
+              "size": 1763574,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "DUDacJdQ2X"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "D54X6C7WH6",
+          "2hfk5Hd": [
+            {
+              "filename": "image.png",
+              "resourceId": "e7dea77f-0f65-4266-a3fd-e401b80a9582",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5d45d39275c65656906af57b60be7002feaf431efea862523554a56545a2e6ac55d17ee7f4c9382c9",
+              "size": 9795238,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ],
+          "ty1M3J4": {
+            "markdown": "已归还\n"
+          }
+        },
+        "recordId": "Dt8KZX7Nt2"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "MN7V04VVD4",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4044.HEIC.JPG",
+              "resourceId": "82903e20-99ca-4497-8596-64b8a9511347",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5585fe6169387aa3767c7e8d94f1e6b2bdcb910b90a359120b13c8f9d1a59101157155a75536e1183",
+              "size": 1965625,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "FA0TZMthqI"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "CYY9PQRXJ5",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4216.HEIC.JPG",
+              "resourceId": "3dfd0bec-a06a-4580-a9a2-b8ae450df2a4",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d52f04469c6bb09596caffbbac393c775d8db27175749aef18fb6444ef163ea9d17fb0a232eda6495f",
+              "size": 2290335,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "IyGa4g01n1"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "K30F574N0W",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4071.HEIC.JPG",
+              "resourceId": "8f970cbb-9e4d-4abb-bc2e-bae127a6231a",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5988e57da667e94ed89271196611e117503f232ffda40509efa8b2836f86122df894b0282d28e9bd0",
+              "size": 1883600,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "UJwTYA3uNw"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "Y7CXVJ9XWD",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4072.HEIC.JPG",
+              "resourceId": "68b711bd-e972-445a-be79-bf4954b52000",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d581be5bba89215dfa8bf27c7a750a77959fc36654d351427344ca8cee273282f51f530a2b9381f2f5",
+              "size": 1856927,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "Uygc2paXj3"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "GMQW2JLWVY",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4214.HEIC.JPG",
+              "resourceId": "ca4deb91-17d6-43e7-9812-72101643deb9",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d57860f934d7f4ae4fd1379962b8f251e8357d71880d1389e2b613f13514ac39fcfcb2a6a1fcb68a65",
+              "size": 1640058,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "ewj09NwU1z",
+              "name": "AI招聘"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "429676"
+            }
+          ]
+        },
+        "recordId": "Xjj4e7GgG8"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "Y0V7Y2N2YD",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4074.HEIC.JPG",
+              "resourceId": "5b8d3006-280e-41af-a4b0-3320e6a5d596",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5f3f03272cd3d6f49910031a2e873f763b035f6f21d03abba7ab038475a5ab532635226d96df6a64e",
+              "size": 1964512,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "Y056lsOG61"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "P24GFQN7YT",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4033.HEIC.JPG",
+              "resourceId": "38656067-b7b7-45fd-8bea-64f4c89dc4f7",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d50c8666278c495a44ef70265cd8adb7f504b841c8f61607d92f11852026cd92eff88db6bf5a5d630c",
+              "size": 2028953,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "YVaPzcuGBa"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "N7Q33L77WR",
+          "2hfk5Hd": [
+            {
+              "filename": "image.png",
+              "resourceId": "4abf67c0-ad03-4a81-a3db-3794d15453e9",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d53aa03710ddc5973e4df2b4d6c72f04177dd7b5a30206f588777548a9d514bbd2a1bdc9489688a5fb",
+              "size": 9870487,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "hXTMF9el7v"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "HFk9Y9TYQD",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4043.HEIC.JPG",
+              "resourceId": "d6786a91-bca7-4c09-8225-9503cb66610f",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5fe8628219f060fbe50542a5616689036033b038792e8d5a77e12f7fc37630879073a357b1dacf1ae",
+              "size": 2110186,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试",
+          "6B78kgr": "2",
+          "ARoUEWW": {
+            "id": "P6GYJKc3t0",
+            "name": "未付费"
+          },
+          "Str3hFF": {
+            "id": "m4Y2qZ07Yk",
+            "name": "领取两台"
+          },
+          "ZoCsF67": "2026-02-09T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "lpH5zwRv5D",
+              "name": "AI差旅"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "151705"
+            }
+          ]
+        },
+        "recordId": "kk7eQt1kJB"
+      },
+      {
+        "cells": {
+          "01ZM8y7": "TX6377KGFH",
+          "2hfk5Hd": [
+            {
+              "filename": "IMG_4064.HEIC.JPG",
+              "resourceId": "850e1a7f-aa0a-4ba8-9b54-5bc9c66a5a63",
+              "resourceUrl": "/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5716c6100d05323cbd2151a4b9cf8174b09cf0ac1af356178c4572bfa55a8c065f499293f0f9b00e2",
+              "size": 1963615,
+              "type": "image",
+              "url": "[REDACTED_OSS_URL]"
+            }
+          ],
+          "47bTcjO": "内部测试--恒飞",
+          "ARoUEWW": {
+            "id": "Zw0fFCNl8e",
+            "name": "付费"
+          },
+          "ZoCsF67": "2026-01-23T00:00:00+08:00",
+          "j1Zwe1c": [
+            {
+              "id": "s9UKjSzdLg",
+              "name": "业务方自主"
+            }
+          ],
+          "kFwb8br": {
+            "id": "1ZiuS5Wlgz",
+            "name": "内部部署"
+          },
+          "rjwzzIu": [
+            {
+              "id": "ewj09NwU1z",
+              "name": "AI招聘"
+            }
+          ],
+          "t9n9SDE": [
+            {
+              "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+              "userId": "103262"
+            }
+          ],
+          "ty1M3J4": {
+            "markdown": "目前看设备离线\n"
+          }
+        },
+        "recordId": "oXh7WgGooe"
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Successfully queried 14 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
dws aitable +form-delete --base-id <base-id> --table-id <table-id> --view-id <view-id>high-risk-write
删除指定表单视图(不可逆)
dws mcp aitable delete_form_view --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>}' lark-cli base +form-delete已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/delete_form_view
输入 / CLI 输出
输入
dws aitable +form-delete --base-id x --table-id x --view-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "delete_form_view"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "delete_form_view"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1290ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +form-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete form view for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998636217552e08e2\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete form view for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998636217552e08e2\"}"
+  }
+}
dws aitable +form-field-hide --base-id <base-id> --table-id <table-id> --view-id <view-id> --field-id <field-id> --hidden <hidden>write
切换表单字段的隐藏/显示状态
dws mcp aitable update_form_field_hidden --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "fieldId":<..>, "hidden":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/update_form_field_hidden
输入 / CLI 输出
输入
dws aitable +form-field-hide --base-id x --table-id x --view-id x --field-id x --hidden --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldId": "x",
+    "hidden": true,
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "update_form_field_hidden"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldId": "x",
+    "hidden": true,
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "update_form_field_hidden"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1312ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +form-field-hide --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --hidden --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update form field hidden for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998649456212e08df\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update form field hidden for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998649456212e08df\"}"
+  }
+}
dws aitable +form-field-list --base-id <base-id> --table-id <table-id> --view-id <view-id>read
列出表单视图当前可见的字段及其配置
dws mcp aitable list_form_fields --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/list_form_fields
输入 / CLI 输出
输入
dws aitable +form-field-list --base-id x --table-id x --view-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "list_form_fields"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "list_form_fields"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1139ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +form-field-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id lmeV1cb --yes --format json
真实 stdout
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "fields": [
+      {
+        "fieldId": "t9n9SDE",
+        "hidden": false,
+        "name": "领取人",
+        "required": true,
+        "type": "user"
+      },
+      {
+        "fieldId": "j1Zwe1c",
+        "hidden": false,
+        "name": "验证情况",
+        "required": true,
+        "type": "multipleSelect"
+      },
+      {
+        "fieldId": "2hfk5Hd",
+        "hidden": false,
+        "name": "商品图片",
+        "required": false,
+        "type": "file"
+      },
+      {
+        "fieldId": "ZoCsF67",
+        "hidden": false,
+        "name": "领取时间",
+        "required": true,
+        "type": "date"
+      },
+      {
+        "fieldId": "47bTcjO",
+        "hidden": false,
+        "name": "交付客户",
+        "required": true,
+        "type": "text"
+      },
+      {
+        "description": "填写:客户业务介绍,老板是谁,实际使用部门,使用人数,主要解决客户什么问题,客户原声",
+        "fieldId": "3p4hbFh",
+        "hidden": false,
+        "name": "客户背景",
+        "required": true,
+        "type": "richText"
+      }
+    ],
+    "tableId": "hERWDMS",
+    "viewId": "lmeV1cb"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Found 6 field(s) in form view lmeV1cb"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "fields": [
+      {
+        "fieldId": "t9n9SDE",
+        "hidden": false,
+        "name": "领取人",
+        "required": true,
+        "type": "user"
+      },
+      {
+        "fieldId": "j1Zwe1c",
+        "hidden": false,
+        "name": "验证情况",
+        "required": true,
+        "type": "multipleSelect"
+      },
+      {
+        "fieldId": "2hfk5Hd",
+        "hidden": false,
+        "name": "商品图片",
+        "required": false,
+        "type": "file"
+      },
+      {
+        "fieldId": "ZoCsF67",
+        "hidden": false,
+        "name": "领取时间",
+        "required": true,
+        "type": "date"
+      },
+      {
+        "fieldId": "47bTcjO",
+        "hidden": false,
+        "name": "交付客户",
+        "required": true,
+        "type": "text"
+      },
+      {
+        "description": "填写:客户业务介绍,老板是谁,实际使用部门,使用人数,主要解决客户什么问题,客户原声",
+        "fieldId": "3p4hbFh",
+        "hidden": false,
+        "name": "客户背景",
+        "required": true,
+        "type": "richText"
+      }
+    ],
+    "tableId": "hERWDMS",
+    "viewId": "lmeV1cb"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Found 6 field(s) in form view lmeV1cb"
+}
dws aitable +form-field-update --base-id <base-id> --table-id <table-id> --view-id <view-id> --field-id <field-id> --required <required> --field-description <field-description>write
更新表单字段的必填状态或描述
dws mcp aitable update_form_field --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "fieldId":<..>, "required":<..>, "fieldDescription":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/update_form_field
输入 / CLI 输出
输入
dws aitable +form-field-update --base-id x --table-id x --view-id x --field-id x --required --field-description x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldDescription": "x",
+    "fieldId": "x",
+    "required": true,
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "update_form_field"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldDescription": "x",
+    "fieldId": "x",
+    "required": true,
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "update_form_field"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1153ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +form-field-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --required --field-description 'DWS shortcut 真实测试字段说明' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update form field config for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998660847932e08e2\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update form field config for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998660847932e08e2\"}"
+  }
+}
dws aitable +form-list --base-id <base-id> --table-id <table-id>read
列出指定数据表下的所有表单视图
dws mcp aitable <tool> lark-cli base +form-list已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/list_form_views
输入 / CLI 输出
输入
dws aitable +form-list --base-id x --table-id x --yes
stdout
{
+  "count": 0,
+  "forms": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "forms": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1003ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +form-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --yes --format json
真实 stdout
{
+  "count": 2,
+  "forms": [
+    {
+      "viewId": "lmeV1cb",
+      "viewName": "设备登记"
+    },
+    {
+      "viewId": "HaFV1LW",
+      "viewName": "客户使用情况"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 2,
+  "forms": [
+    {
+      "viewId": "lmeV1cb",
+      "viewName": "设备登记"
+    },
+    {
+      "viewId": "HaFV1LW",
+      "viewName": "客户使用情况"
+    }
+  ]
+}
dws aitable +form-share-get --base-id <base-id> --table-id <table-id> --view-id <view-id>read
读取视图当前的分享表单配置
dws mcp aitable get_share_form_config --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_share_form_config
输入 / CLI 输出
输入
dws aitable +form-share-get --base-id x --table-id x --view-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_share_form_config"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_share_form_config"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1067ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +form-share-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id lmeV1cb --yes --format json
真实 stdout
{
+  "data": {
+    "anonymousSubmit": false,
+    "authTypeCode": 0,
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "enabled": true,
+    "formName": "Mac Mini领取信息登记",
+    "loadLastSubmit": true,
+    "punished": false,
+    "replyNotice": false,
+    "shareFormUuid": "v01ZWGl05mvrY0PMn34_hERWDMS_lmeV1cb",
+    "status": 1,
+    "submitTimesUserLimit": 0,
+    "tableId": "hERWDMS",
+    "viewId": "lmeV1cb"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Fetched share form config for view lmeV1cb: enabled=true"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "anonymousSubmit": false,
+    "authTypeCode": 0,
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "enabled": true,
+    "formName": "Mac Mini领取信息登记",
+    "loadLastSubmit": true,
+    "punished": false,
+    "replyNotice": false,
+    "shareFormUuid": "v01ZWGl05mvrY0PMn34_hERWDMS_lmeV1cb",
+    "status": 1,
+    "submitTimesUserLimit": 0,
+    "tableId": "hERWDMS",
+    "viewId": "lmeV1cb"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Fetched share form config for view lmeV1cb: enabled=true"
+}
dws aitable +form-share-update --base-id <base-id> --table-id <table-id> --view-id <view-id> --enabled <enabled>write
开启或关闭指定视图的分享表单
dws mcp aitable update_share_form --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "enabled":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/update_share_form
输入 / CLI 输出
输入
dws aitable +form-share-update --base-id x --table-id x --view-id x --enabled true --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "enabled": "true",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "update_share_form"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "enabled": "true",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "update_share_form"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1573ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +form-share-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --enabled true --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update share form for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998675755538e087d\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update share form for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998675755538e087d\"}"
+  }
+}
dws aitable +form-update --base-id <base-id> --table-id <table-id> --view-id <view-id> --title <title> --description <description>write
更新表单标题 / 描述
dws mcp aitable update_form_info --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "title":<..>, "description":<..>}' lark-cli base +form-update已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/update_form_info
输入 / CLI 输出
输入
dws aitable +form-update --base-id x --table-id x --view-id x --title x --description x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "description": "x",
+    "tableId": "x",
+    "title": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "update_form_info"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "description": "x",
+    "tableId": "x",
+    "title": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "update_form_info"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1141ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +form-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --title 'DWS shortcut 真实测试 20260715-151724' --description 'DWS shortcut 真实测试描述,可删除' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update form info for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998688302645e0853\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update form info for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998688302645e0853\"}"
+  }
+}
dws aitable +import-data --import-id <import-id> --table-id <table-id> --timeout <timeout> --header-row <header-row> --src-sheet-name <src-sheet-name> --field-mapping <field-mapping>write
将已上传文件导入 AI 表格(新建表或追加到已有表)
dws mcp aitable import_data --json '{"importId":<..>, "tableId":<..>, "timeout":<..>, "headerRow":<..>, "srcSheetName":<..>, "fieldMapping":<..>}' lark base 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--field-mapping JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +import-data --import-id x --table-id x --timeout 1 --header-row 1 --src-sheet-name x --field-mapping x --yes
stdout
(空)
stderr / error
--field-mapping JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--field-mapping JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1227ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test aitable +import-data --import-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --timeout 1 --header-row 1 --src-sheet-name x --field-mapping '{}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_IMPORT_ID\",\"message\":\"importId not found: either invalid or expired\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"importId「DWSREALTESTNOSUCHID0000000000000」无效或已过期(有效期 1 小时)。请勿重试相同 importId。需重新上传:① 调用 prepare_import_upload 获取新的 uploadUrl 和 importId;② 通过 HTTP PUT 将原始文件字节流上传至 uploadUrl;除非 uploadUrl 明确要求,否则不要额外附带 Content-Type 等自定义请求头;③ 调用 import_data 传入新的 importId。\",\"trace_id\":\"213ee25c17840998700326443e0944\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_IMPORT_ID\",\"message\":\"importId not found: either invalid or expired\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"importId「DWSREALTESTNOSUCHID0000000000000」无效或已过期(有效期 1 小时)。请勿重试相同 importId。需重新上传:① 调用 prepare_import_upload 获取新的 uploadUrl 和 importId;② 通过 HTTP PUT 将原始文件字节流上传至 uploadUrl;除非 uploadUrl 明确要求,否则不要额外附带 Content-Type 等自定义请求头;③ 调用 import_data 传入新的 importId。\",\"trace_id\":\"213ee25c17840998700326443e0944\"}"
+  }
+}
dws aitable +import-upload --base-id <base-id> --file-name <file-name> --file-size <file-size>write
为导入任务申请 OSS 直传地址(uploadUrl / importId)
dws mcp aitable prepare_import_upload --json '{"baseId":<..>, "fileName":<..>, "fileSize":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/prepare_import_upload
输入 / CLI 输出
输入
dws aitable +import-upload --base-id x --file-name x --file-size 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fileName": "x",
+    "fileSize": 1
+  },
+  "product": "aitable",
+  "tool": "prepare_import_upload"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fileName": "x",
+    "fileSize": 1
+  },
+  "product": "aitable",
+  "tool": "prepare_import_upload"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1302ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +import-upload --base-id DWSREALTESTNOSUCHID0000000000000 --file-name dws-shortcut-real-20260715-151724.txt --file-size 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"无法解析 baseId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"无效的 baseId\",\"trace_id\":\"0bab027317840998713075490e096e\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"无法解析 baseId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"无效的 baseId\",\"trace_id\":\"0bab027317840998713075490e096e\"}"
+  }
+}
dws aitable +list-tables --base <base>read
列出某个多维表(base)里的所有数据表(只读,投影 tableId/tableName)
dws mcp aitable <tool>dws aitable +list-tables --base <base>read复合/智能型
列出某个多维表(base)里的所有数据表(只读,投影 tableId/tableName)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_tables
输入 / CLI 输出
输入
dws aitable +list-tables --base x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_tables"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable",
+  "tool": "get_tables"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1452ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +list-tables --base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json
真实 stdout
{
+  "tables": [
+    {
+      "tableId": "hERWDMS",
+      "tableName": "Mac Mini"
+    },
+    {
+      "tableId": "k8d898q",
+      "tableName": "手机"
+    },
+    {
+      "tableId": "zyLRwwa",
+      "tableName": "SIM卡"
+    },
+    {
+      "tableId": "L53jNZz",
+      "tableName": "机箱"
+    },
+    {
+      "tableId": "zTiHNDL",
+      "tableName": "磁吸片"
+    },
+    {
+      "tableId": "anMdihs",
+      "tableName": "手机线"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "tables": [
+    {
+      "tableId": "hERWDMS",
+      "tableName": "Mac Mini"
+    },
+    {
+      "tableId": "k8d898q",
+      "tableName": "手机"
+    },
+    {
+      "tableId": "zyLRwwa",
+      "tableName": "SIM卡"
+    },
+    {
+      "tableId": "L53jNZz",
+      "tableName": "机箱"
+    },
+    {
+      "tableId": "zTiHNDL",
+      "tableName": "磁吸片"
+    },
+    {
+      "tableId": "anMdihs",
+      "tableName": "手机线"
+    }
+  ]
+}
dws aitable +record-delete --base-id <base-id> --table-id <table-id> --record-ids <record-ids>high-risk-write
批量删除记录(不可逆),单次最多 100 条
dws mcp aitable delete_records --json '{"baseId":<..>, "tableId":<..>, "recordIds":<..>}' lark-cli base +record-delete已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/delete_records
输入 / CLI 输出
输入
dws aitable +record-delete --base-id x --table-id x --record-ids x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "recordIds": [
+      "x"
+    ],
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_records"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "recordIds": [
+      "x"
+    ],
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_records"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1159ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +record-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --record-ids DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete records\",\"trace_id\":\"2132f5ca17840998724753149e0853\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete records\",\"trace_id\":\"2132f5ca17840998724753149e0853\"}"
+  }
+}
dws aitable +record-history-list --base-id <base-id> --table-id <table-id> --record-id <record-id> --offset <offset> --limit <limit>read
按 recordId 查询单条记录的变更历史
dws mcp aitable query_record_history --json '{"baseId":<..>, "tableId":<..>, "recordId":<..>, "offset":<..>, "limit":<..>}' lark-cli base +record-history-list已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/query_record_history
输入 / CLI 输出
输入
dws aitable +record-history-list --base-id x --table-id x --record-id x --offset 1 --limit 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "limit": 1,
+    "offset": 1,
+    "recordId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "query_record_history"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "limit": 1,
+    "offset": 1,
+    "recordId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "query_record_history"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1156ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +record-history-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-id 1015oH3OXy --offset 1 --limit 10 --yes --format json
真实 stdout
{
+  "data": {
+    "histories": [
+      {
+        "action": "updateRecords",
+        "newValue": "{\"47bTcjO\":{\"dataType\":\"STRING\",\"value\":\"山东梅格彤\"}}",
+        "oldValue": "{\"47bTcjO\":{\"dataType\":\"STRING\",\"value\":\"内部测试\"}}",
+        "operateTime": 1772700326253,
+        "type": "row",
+        "version": 2455
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"ARoUEWW\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"Zw0fFCNl8e\",\"sequence\":\"Zw0fFCNl8e\",\"data\":\"Zw0fFCNl8e\",\"filterFactor\":\"Zw0fFCNl8e\"}}}",
+        "oldValue": "{\"ARoUEWW\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"P6GYJKc3t0\",\"identifier\":\"P6GYJKc3t0\",\"data\":\"P6GYJKc3t0\",\"filterFactor\":\"P6GYJKc3t0\"}}}",
+        "operateTime": 1772700311648,
+        "type": "row",
+        "version": 2454
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"kFwb8br\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"uvZmbeb5RH\",\"sequence\":\"uvZmbeb5RH\",\"data\":\"uvZmbeb5RH\",\"filterFactor\":\"uvZmbeb5RH\"}}}",
+        "oldValue": "{}",
+        "operateTime": 1772700308342,
+        "type": "row",
+        "version": 2453
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{}",
+        "oldValue": "{\"kFwb8br\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"1ZiuS5Wlgz\",\"identifier\":\"1ZiuS5Wlgz\",\"data\":\"1ZiuS5Wlgz\",\"filterFactor\":\"1ZiuS5Wlgz\"}}}",
+        "operateTime": 1772700305961,
+        "type": "row",
+        "version": 2452
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{}",
+        "oldValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"给不挠了\",\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"给不挠了\\\"]]]]\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"给不挠了\\\"]]]]\",\"filterFactor\":[\"给不挠了\"]}}}",
+        "operateTime": 1772700303480,
+        "type": "row",
+        "version": 2451
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"给不挠了\\\"]]]]\",\"sequence\":\"给不挠了\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"给不挠了\\\"]]]]\",\"filterFactor\":[\"给不挠了\"]}}}",
+        "oldValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"闲置\",\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"闲置\\\"]]]]\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"闲置\\\"]]]]\",\"filterFactor\":[\"闲置\"]}}}",
+        "operateTime": 1772003207333,
+        "type": "row",
+        "version": 2377
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"闲置\\\"]]]]\",\"sequence\":\"闲置\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"闲置\\\"]]]]\",\"filterFactor\":[\"闲置\"]}}}",
+        "oldValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"目前查是离线\\\"]]]]\",\"sequence\":\"目前查是离线\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"目前查是离线\\\"]]]]\",\"filterFactor\":[\"目前查是离线\"]}}}",
+        "operateTime": 1770990377587,
+        "type": "row",
+        "version": 2241
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"kFwb8br\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"1ZiuS5Wlgz\",\"sequence\":\"1ZiuS5Wlgz\",\"data\":\"1ZiuS5Wlgz\",\"filterFactor\":\"1ZiuS5Wlgz\"}}}",
+        "oldValue": "{}",
+        "operateTime": 1770875502420,
+        "type": "row",
+        "version": 2162
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{}",
+        "oldValue": "{\"kFwb8br\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"8G9fnUmdKY\",\"sequence\":\"8G9fnUmdKY\",\"data\":\"8G9fnUmdKY\",\"filterFactor\":\"8G9fnUmdKY\"}}}",
+        "operateTime": 1770875501255,
+        "type": "row",
+        "version": 2161
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"目前查是离线\\\"]]]]\",\"sequence\":\"目前查是离线\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"目前查是离线\\\"]]]]\",\"filterFactor\":[\"目前查是离线\"]}}}",
+        "oldValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"\",\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"\\\"]]]]\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"\\\"]]]]\",\"filterFactor\":[\"\"]}}}",
+        "operateTime": 1770868083188,
+        "type": "row",
+        "version": 2139
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got 10 history record(s) for record 1015oH3OXy"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "histories": [
+      {
+        "action": "updateRecords",
+        "newValue": "{\"47bTcjO\":{\"dataType\":\"STRING\",\"value\":\"山东梅格彤\"}}",
+        "oldValue": "{\"47bTcjO\":{\"dataType\":\"STRING\",\"value\":\"内部测试\"}}",
+        "operateTime": 1772700326253,
+        "type": "row",
+        "version": 2455
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"ARoUEWW\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"Zw0fFCNl8e\",\"sequence\":\"Zw0fFCNl8e\",\"data\":\"Zw0fFCNl8e\",\"filterFactor\":\"Zw0fFCNl8e\"}}}",
+        "oldValue": "{\"ARoUEWW\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"P6GYJKc3t0\",\"identifier\":\"P6GYJKc3t0\",\"data\":\"P6GYJKc3t0\",\"filterFactor\":\"P6GYJKc3t0\"}}}",
+        "operateTime": 1772700311648,
+        "type": "row",
+        "version": 2454
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"kFwb8br\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"uvZmbeb5RH\",\"sequence\":\"uvZmbeb5RH\",\"data\":\"uvZmbeb5RH\",\"filterFactor\":\"uvZmbeb5RH\"}}}",
+        "oldValue": "{}",
+        "operateTime": 1772700308342,
+        "type": "row",
+        "version": 2453
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{}",
+        "oldValue": "{\"kFwb8br\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"1ZiuS5Wlgz\",\"identifier\":\"1ZiuS5Wlgz\",\"data\":\"1ZiuS5Wlgz\",\"filterFactor\":\"1ZiuS5Wlgz\"}}}",
+        "operateTime": 1772700305961,
+        "type": "row",
+        "version": 2452
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{}",
+        "oldValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"给不挠了\",\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"给不挠了\\\"]]]]\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"给不挠了\\\"]]]]\",\"filterFactor\":[\"给不挠了\"]}}}",
+        "operateTime": 1772700303480,
+        "type": "row",
+        "version": 2451
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"给不挠了\\\"]]]]\",\"sequence\":\"给不挠了\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"给不挠了\\\"]]]]\",\"filterFactor\":[\"给不挠了\"]}}}",
+        "oldValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"闲置\",\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"闲置\\\"]]]]\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"闲置\\\"]]]]\",\"filterFactor\":[\"闲置\"]}}}",
+        "operateTime": 1772003207333,
+        "type": "row",
+        "version": 2377
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"闲置\\\"]]]]\",\"sequence\":\"闲置\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"闲置\\\"]]]]\",\"filterFactor\":[\"闲置\"]}}}",
+        "oldValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"目前查是离线\\\"]]]]\",\"sequence\":\"目前查是离线\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"目前查是离线\\\"]]]]\",\"filterFactor\":[\"目前查是离线\"]}}}",
+        "operateTime": 1770990377587,
+        "type": "row",
+        "version": 2241
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"kFwb8br\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"1ZiuS5Wlgz\",\"sequence\":\"1ZiuS5Wlgz\",\"data\":\"1ZiuS5Wlgz\",\"filterFactor\":\"1ZiuS5Wlgz\"}}}",
+        "oldValue": "{}",
+        "operateTime": 1770875502420,
+        "type": "row",
+        "version": 2162
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{}",
+        "oldValue": "{\"kFwb8br\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"8G9fnUmdKY\",\"sequence\":\"8G9fnUmdKY\",\"data\":\"8G9fnUmdKY\",\"filterFactor\":\"8G9fnUmdKY\"}}}",
+        "operateTime": 1770875501255,
+        "type": "row",
+        "version": 2161
+      },
+      {
+        "action": "updateRecords",
+        "newValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"目前查是离线\\\"]]]]\",\"sequence\":\"目前查是离线\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"目前查是离线\\\"]]]]\",\"filterFactor\":[\"目前查是离线\"]}}}",
+        "oldValue": "{\"ty1M3J4\":{\"dataType\":\"OBJECT\",\"value\":{\"sequence\":\"\",\"identifier\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"\\\"]]]]\",\"data\":\"[\\\"root\\\",{},[\\\"p\\\",{},[\\\"span\\\",{\\\"data-type\\\":\\\"text\\\"},[\\\"span\\\",{\\\"data-type\\\":\\\"leaf\\\"},\\\"\\\"]]]]\",\"filterFactor\":[\"\"]}}}",
+        "operateTime": 1770868083188,
+        "type": "row",
+        "version": 2139
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got 10 history record(s) for record 1015oH3OXy"
+}
dws aitable +record-primary-doc-create --base-id <base-id> --table-id <table-id> --field-id <field-id> --record-id <record-id>write
为记录创建主键文档(幂等),fieldId 须为 primaryDoc 类型
dws mcp aitable create_primary_doc --json '{"baseId":<..>, "tableId":<..>, "fieldId":<..>, "recordId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/create_primary_doc
输入 / CLI 输出
输入
dws aitable +record-primary-doc-create --base-id x --table-id x --field-id x --record-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldId": "x",
+    "recordId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "create_primary_doc"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "fieldId": "x",
+    "recordId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "create_primary_doc"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1150ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +record-primary-doc-create --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --record-id 999999999999 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"RESOLVE_DOC_ID_ERROR\",\"message\":\"Failed to resolve docId from baseId\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to create cell doc because baseId cannot be resolved to docId\",\"trace_id\":\"213ee25c17840998736256985e0944\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"RESOLVE_DOC_ID_ERROR\",\"message\":\"Failed to resolve docId from baseId\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to create cell doc because baseId cannot be resolved to docId\",\"trace_id\":\"213ee25c17840998736256985e0944\"}"
+  }
+}
dws aitable +record-primary-doc-get --base-id <base-id> --table-id <table-id> --record-id <record-id>read
查询记录关联的主键文档 nodeId
dws mcp aitable get_primary_doc --json '{"baseId":<..>, "tableId":<..>, "recordId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_primary_doc
输入 / CLI 输出
输入
dws aitable +record-primary-doc-get --base-id x --table-id x --record-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "recordId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_primary_doc"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "recordId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_primary_doc"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1344ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +record-primary-doc-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-id 1015oH3OXy --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"-1\",\"message\":\"no record\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to query cell doc for record 1015oH3OXy in table hERWDMS\",\"trace_id\":\"2127d89817840997528393730e079c\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"-1\",\"message\":\"no record\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to query cell doc for record 1015oH3OXy in table hERWDMS\",\"trace_id\":\"2127d89817840997528393730e079c\"}"
+  }
+}
dws aitable +record-query --base-id <base-id> --table-id <table-id> --record-ids <record-ids> --field-ids <field-ids> --filters <filters> --sort <sort> --query <query> --limit <limit> --cursor <cursor>read
查询表格记录(按 ID 取 / 条件筛选 / 关键词 / 分页)
dws mcp aitable query_records --json '{"baseId":<..>, "tableId":<..>, "recordIds":<..>, "fieldIds":<..>, "filters":<..>, "sort":<..>, "keyword":<..>, "limit":<..>, "cursor":<..>}' lark base 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--filters JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +record-query --base-id x --table-id x --record-ids x --field-ids x --filters x --sort x --query x --limit 1 --cursor x --yes
stdout
(空)
stderr / error
--filters JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--filters JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1241ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +record-query --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-ids 1015oH3OXy --field-ids 01ZM8y7 --filters '{}' --sort '[]' --query '测试' --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "data": {},
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Successfully queried 0 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {},
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Successfully queried 0 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
dws aitable +record-query-empty --base-id <base-id> --table-id <table-id> --limit <limit> --cursor <cursor>read
扫描并过滤出完全没填用户字段的空行
dws mcp aitable query_empty_records --json '{"baseId":<..>, "tableId":<..>, "limit":<..>, "cursor":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/query_empty_records
输入 / CLI 输出
输入
dws aitable +record-query-empty --base-id x --table-id x --limit 1 --cursor x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "cursor": "x",
+    "limit": 1,
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "query_empty_records"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "cursor": "x",
+    "limit": 1,
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "query_empty_records"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2057ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +record-query-empty --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "data": {
+    "nextCursor": "4lLnbs69uY",
+    "records": []
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Scanned 10 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk, 0 of them are empty."
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "nextCursor": "4lLnbs69uY",
+    "records": []
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Scanned 10 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk, 0 of them are empty."
+}
dws aitable +record-share-links --base <base> --table <table> --record-ids <record-ids> --view-id <view-id>read
批量(可 >20 条)获取多维表记录分享链接:去重+分片+合并
dws mcp aitable <tool>dws aitable +record-share-links --base <base> --table <table> --record-ids <record-ids> --view-id <view-id>read复合/智能型
批量(可 >20 条)获取多维表记录分享链接:去重+分片+合并
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_record_share_url
输入 / CLI 输出
输入
dws aitable +record-share-links --base x --table x --record-ids x --view-id x --yes
stdout
{
+  "base": "x",
+  "batches": 1,
+  "items": [],
+  "table": "x",
+  "total": 1
+}
stderr / error
(空)
最终用于判定的返回
{
+  "base": "x",
+  "batches": 1,
+  "items": [],
+  "table": "x",
+  "total": 1
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1249ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +record-share-links --base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table hERWDMS --record-ids 1015oH3OXy --view-id qvGDAH2 --yes --format json
真实 stdout
{
+  "base": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+  "batches": 1,
+  "items": [
+    {
+      "recordId": "1015oH3OXy",
+      "shareUrl": "https://alidocs.dingtalk.com/notable/record?dentryUuid=gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk&sheetId=hERWDMS&rowId=1015oH3OXy&viewId=qvGDAH2"
+    }
+  ],
+  "table": "hERWDMS",
+  "total": 1
+}
真实 stderr / error
(空)
真实返回
{
+  "base": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+  "batches": 1,
+  "items": [
+    {
+      "recordId": "1015oH3OXy",
+      "shareUrl": "https://alidocs.dingtalk.com/notable/record?dentryUuid=gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk&sheetId=hERWDMS&rowId=1015oH3OXy&viewId=qvGDAH2"
+    }
+  ],
+  "table": "hERWDMS",
+  "total": 1
+}
dws aitable +record-share-url --base-id <base-id> --table-id <table-id> --record-ids <record-ids> --view-id <view-id>read
按 recordId 批量获取记录分享链接,单次最多 20 条
dws mcp aitable get_record_share_url --json '{"baseId":<..>, "tableId":<..>, "recordIds":<..>, "viewId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_record_share_url
输入 / CLI 输出
输入
dws aitable +record-share-url --base-id x --table-id x --record-ids x --view-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "recordIds": [
+      "x"
+    ],
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_record_share_url"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "recordIds": [
+      "x"
+    ],
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_record_share_url"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1130ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +record-share-url --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-ids 1015oH3OXy --view-id qvGDAH2 --yes --format json
真实 stdout
{
+  "data": {
+    "items": [
+      {
+        "recordId": "1015oH3OXy",
+        "shareUrl": "https://alidocs.dingtalk.com/notable/record?dentryUuid=gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\u0026sheetId=hERWDMS\u0026rowId=1015oH3OXy\u0026viewId=qvGDAH2"
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got share urls for 1 record(s)"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "items": [
+      {
+        "recordId": "1015oH3OXy",
+        "shareUrl": "https://alidocs.dingtalk.com/notable/record?dentryUuid=gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\u0026sheetId=hERWDMS\u0026rowId=1015oH3OXy\u0026viewId=qvGDAH2"
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got share urls for 1 record(s)"
+}
dws aitable +record-update --base-id <base-id> --table-id <table-id> --records <records>write
批量更新记录(每条含 recordId 与 cells),单次最多 100 条
dws mcp aitable update_records --json '{"baseId":<..>, "tableId":<..>, "records":<..>}' lark base 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--records JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +record-update --base-id x --table-id x --records x --yes
stdout
(空)
stderr / error
--records JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--records JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1144ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +record-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --records '[{"recordId":"recDWSREALTEST","cells":{}}]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_RECORDS\",\"message\":\"records must contain at least one writable record\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update records because no valid writable records remain for table DWSREALTESTNOSUCHID0000000000000. Skipped records with empty cells (1): recDWSREALTEST\",\"trace_id\":\"0bab027317840998747383236e090b\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_RECORDS\",\"message\":\"records must contain at least one writable record\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update records because no valid writable records remain for table DWSREALTESTNOSUCHID0000000000000. Skipped records with empty cells (1): recDWSREALTEST\",\"trace_id\":\"0bab027317840998747383236e090b\"}"
+  }
+}
dws aitable +record-upsert --base-id <base-id> --table-id <table-id> --records <records>write
按 records 是否带 recordId 自动拆分 create / update
dws mcp aitable record_upsert --json '{"baseId":<..>, "tableId":<..>, "records":<..>}' lark-cli base +record-upsert实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--records JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +record-upsert --base-id x --table-id x --records x --yes
stdout
(空)
stderr / error
--records JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--records JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1173ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +record-upsert --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --records '[]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMETER\",\"message\":\"records is required and must not be empty\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"records is required and must not be empty\",\"trace_id\":\"2106d98117840998759832182e087b\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMETER\",\"message\":\"records is required and must not be empty\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"records is required and must not be empty\",\"trace_id\":\"2106d98117840998759832182e087b\"}"
+  }
+}
dws aitable +resolve-base --name <name>read
按名称搜索多维表 Base 并解析出唯一 baseId(只读)
dws mcp aitable <tool>dws aitable +resolve-base --name <name>read复合/智能型
按名称搜索多维表 Base 并解析出唯一 baseId(只读)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/search_bases;没有找到名称包含 x 的 Base
输入 / CLI 输出
输入
dws aitable +resolve-base --name x --yes
stdout
(空)
stderr / error
没有找到名称包含 x 的 Base
最终用于判定的返回
没有找到名称包含 x 的 Base
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1228ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +resolve-base --name 'Real共创版设备去向登记' --yes --format json
真实 stdout
{
+  "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+  "name": "Real共创版设备去向登记",
+  "resolved": true
+}
真实 stderr / error
(空)
真实返回
{
+  "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+  "name": "Real共创版设备去向登记",
+  "resolved": true
+}
dws aitable +resolve-table --base <base> --name <name>read
在某个多维表 Base 内按名称解析出唯一的数据表 tableId(只读)
dws mcp aitable <tool>dws aitable +resolve-table --base <base> --name <name>read复合/智能型
在某个多维表 Base 内按名称解析出唯一的数据表 tableId(只读)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_tables;Base 内没有名称包含 x 的数据表
输入 / CLI 输出
输入
dws aitable +resolve-table --base x --name x --yes
stdout
(空)
stderr / error
Base 内没有名称包含 x 的数据表
最终用于判定的返回
Base 内没有名称包含 x 的数据表
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1425ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +resolve-table --base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --name 'Mac Mini' --yes --format json
真实 stdout
{
+  "base": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+  "name": "Mac Mini",
+  "resolved": true,
+  "tableId": "hERWDMS"
+}
真实 stderr / error
(空)
真实返回
{
+  "base": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+  "name": "Mac Mini",
+  "resolved": true,
+  "tableId": "hERWDMS"
+}
dws aitable +role-create --base-id <base-id> --name <name> --role-type <role-type> --flow-type <flow-type> --sub-roles <sub-roles>write
在指定 Base 下创建自定义角色
dws mcp aitable create_role --json '{"baseId":<..>, "name":<..>, "roleType":<..>, "flowType":<..>, "subRoles":<..>}' lark-cli base +role-create实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--sub-roles JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +role-create --base-id x --name x --role-type x --flow-type x --sub-roles x --yes
stdout
(空)
stderr / error
--sub-roles JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--sub-roles JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1130ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +role-create --base-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --role-type x --flow-type x --sub-roles '[]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to create role for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"0bab027317840998770933580e090b\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to create role for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"0bab027317840998770933580e090b\"}"
+  }
+}
dws aitable +role-delete --base-id <base-id> --role-id <role-id>high-risk-write
删除 Base 下指定的自定义角色(不可逆)
dws mcp aitable delete_role --json '{"baseId":<..>, "roleId":<..>}' lark-cli base +role-delete已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/delete_role
输入 / CLI 输出
输入
dws aitable +role-delete --base-id x --role-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "roleId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "delete_role"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "roleId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "delete_role"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1150ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +role-delete --base-id DWSREALTESTNOSUCHID0000000000000 --role-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete role because roleId is missing\",\"trace_id\":\"2106d98117840998782482701e089c\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete role because roleId is missing\",\"trace_id\":\"2106d98117840998782482701e089c\"}"
+  }
+}
dws aitable +role-get --base-id <base-id> --role-id <role-id>read
获取单个角色的完整配置
dws mcp aitable get_role --json '{"baseId":<..>, "roleId":<..>}' lark-cli base +role-get已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_role
输入 / CLI 输出
输入
dws aitable +role-get --base-id x --role-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "roleId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_role"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "roleId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_role"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1450ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +role-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --role-id x --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get role because roleId is missing\",\"trace_id\":\"2104a64c17840997542904838e0817\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get role because roleId is missing\",\"trace_id\":\"2104a64c17840997542904838e0817\"}"
+  }
+}
dws aitable +role-list --base-id <base-id>read
列出指定 Base 下的全部角色
dws mcp aitable list_roles --json '{"baseId":<..>}' lark-cli base +role-list已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/list_roles
输入 / CLI 输出
输入
dws aitable +role-list --base-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "list_roles"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "list_roles"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1483ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +role-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json
真实 stdout
{
+  "data": {
+    "defaultRole": {
+      "mode": 2
+    },
+    "enabled": true,
+    "roles": [
+      {
+        "name": "所有者",
+        "roleId": "owner",
+        "roleType": "5000",
+        "subRoles": [],
+        "system": true
+      },
+      {
+        "name": "管理员",
+        "roleId": "manager",
+        "roleType": "4000",
+        "subRoles": [],
+        "system": true
+      },
+      {
+        "name": "可查看角色",
+        "roleId": "10181777133",
+        "roleType": "custom",
+        "subRoles": [
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 255
+            },
+            "display": {
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置",
+              "targetTypeLabel": "仪表盘"
+            },
+            "targetId": "KY9tlWg5NEHgfs8WT6IO2",
+            "targetType": "dashboard"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "hERWDMS",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "k8d898q",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "zyLRwwa",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "L53jNZz",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "zTiHNDL",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "anMdihs",
+            "targetType": "sheet"
+          }
+        ],
+        "system": false
+      },
+      {
+        "name": "notable_biz_advanced_permission_role_editor",
+        "roleId": "10181777134",
+        "roleType": "system_editor",
+        "subRoles": [
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 255
+            },
+            "display": {
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置",
+              "targetTypeLabel": "仪表盘"
+            },
+            "targetId": "KY9tlWg5NEHgfs8WT6IO2",
+            "targetType": "dashboard"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "hERWDMS",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "k8d898q",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "zyLRwwa",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "L53jNZz",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "zTiHNDL",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "anMdihs",
+            "targetType": "sheet"
+          }
+        ],
+        "system": true
+      },
+      {
+        "name": "notable_biz_advanced_permission_role_reader",
+        "roleId": "10181777135",
+        "roleType": "system_reader",
+        "subRoles": [
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 255
+            },
+            "display": {
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置",
+              "targetTypeLabel": "仪表盘"
+            },
+            "targetId": "KY9tlWg5NEHgfs8WT6IO2",
+            "targetType": "dashboard"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "hERWDMS",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "k8d898q",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "zyLRwwa",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "L53jNZz",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "zTiHNDL",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "anMdihs",
+            "targetType": "sheet"
+          }
+        ],
+        "system": true
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Listed 5 roles for base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "defaultRole": {
+      "mode": 2
+    },
+    "enabled": true,
+    "roles": [
+      {
+        "name": "所有者",
+        "roleId": "owner",
+        "roleType": "5000",
+        "subRoles": [],
+        "system": true
+      },
+      {
+        "name": "管理员",
+        "roleId": "manager",
+        "roleType": "4000",
+        "subRoles": [],
+        "system": true
+      },
+      {
+        "name": "可查看角色",
+        "roleId": "10181777133",
+        "roleType": "custom",
+        "subRoles": [
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 255
+            },
+            "display": {
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置",
+              "targetTypeLabel": "仪表盘"
+            },
+            "targetId": "KY9tlWg5NEHgfs8WT6IO2",
+            "targetType": "dashboard"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "hERWDMS",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "k8d898q",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "zyLRwwa",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "L53jNZz",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "zTiHNDL",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "anMdihs",
+            "targetType": "sheet"
+          }
+        ],
+        "system": false
+      },
+      {
+        "name": "notable_biz_advanced_permission_role_editor",
+        "roleId": "10181777134",
+        "roleType": "system_editor",
+        "subRoles": [
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 255
+            },
+            "display": {
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置",
+              "targetTypeLabel": "仪表盘"
+            },
+            "targetId": "KY9tlWg5NEHgfs8WT6IO2",
+            "targetType": "dashboard"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "hERWDMS",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "k8d898q",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "zyLRwwa",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "L53jNZz",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "zTiHNDL",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "manage",
+            "display": {
+              "authLevelLabel": "可管理",
+              "permissionScopeNote": "可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断",
+              "targetTypeLabel": "数据表"
+            },
+            "targetId": "anMdihs",
+            "targetType": "sheet"
+          }
+        ],
+        "system": true
+      },
+      {
+        "name": "notable_biz_advanced_permission_role_reader",
+        "roleId": "10181777135",
+        "roleType": "system_reader",
+        "subRoles": [
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 255
+            },
+            "display": {
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置",
+              "targetTypeLabel": "仪表盘"
+            },
+            "targetId": "KY9tlWg5NEHgfs8WT6IO2",
+            "targetType": "dashboard"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "hERWDMS",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "k8d898q",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "zyLRwwa",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "L53jNZz",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "zTiHNDL",
+            "targetType": "sheet"
+          },
+          {
+            "authLevel": "read",
+            "config": {
+              "actions": 268435455
+            },
+            "display": {
+              "actionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ],
+              "actionsNote": "actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作",
+              "authLevelLabel": "仅查看",
+              "permissionScopeNote": "仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作",
+              "targetTypeLabel": "数据表",
+              "viewActionsLabels": [
+                "新增视图",
+                "删除视图",
+                "修改视图"
+              ]
+            },
+            "targetId": "anMdihs",
+            "targetType": "sheet"
+          }
+        ],
+        "system": true
+      }
+    ]
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Listed 5 roles for base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
dws aitable +role-update --base-id <base-id> --role-id <role-id> --name <name> --role-type <role-type> --flow-type <flow-type> --sub-roles <sub-roles>write
按 PATCH 语义增量更新自定义角色
dws mcp aitable patch_role --json '{"baseId":<..>, "roleId":<..>, "name":<..>, "roleType":<..>, "flowType":<..>, "subRoles":<..>}' lark-cli base +role-update实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--sub-roles JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +role-update --base-id x --role-id x --name x --role-type x --flow-type x --sub-roles x --yes
stdout
(空)
stderr / error
--sub-roles JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--sub-roles JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1209ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +role-update --base-id DWSREALTESTNOSUCHID0000000000000 --role-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --role-type x --flow-type x --sub-roles '[]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to patch role because roleId is missing\",\"trace_id\":\"2132f5ca17840998794483634e08d8\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to patch role because roleId is missing\",\"trace_id\":\"2132f5ca17840998794483634e08d8\"}"
+  }
+}
dws aitable +section-create --base-id <base-id> --name <name> --parent-section-id <parent-section-id> --index <index>write
在指定 Base 下创建文件夹(组织 table / dashboard)
dws mcp aitable create_section --json '{"baseId":<..>, "name":<..>, "parentSectionId":<..>, "index":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/create_section
输入 / CLI 输出
输入
dws aitable +section-create --base-id x --name x --parent-section-id x --index 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "index": 1,
+    "name": "x",
+    "parentSectionId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "create_section"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "index": 1,
+    "name": "x",
+    "parentSectionId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "create_section"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1117ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +section-create --base-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --parent-section-id DWSREALTESTNOSUCHID0000000000000 --index 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to create section for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998805556786e08d9\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to create section for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998805556786e08d9\"}"
+  }
+}
dws aitable +section-delete --base-id <base-id> --section-id <section-id>high-risk-write
删除指定文件夹(不可逆)
dws mcp aitable delete_section --json '{"baseId":<..>, "sectionId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/delete_section
输入 / CLI 输出
输入
dws aitable +section-delete --base-id x --section-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "sectionId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "delete_section"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "sectionId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "delete_section"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1111ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +section-delete --base-id DWSREALTESTNOSUCHID0000000000000 --section-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete section for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998817023336e087a\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete section for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998817023336e087a\"}"
+  }
+}
dws aitable +section-list-empty --base-id <base-id>read
列出指定 Base 下所有没有子节点的空文件夹
dws mcp aitable list_empty_sections --json '{"baseId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/list_empty_sections
输入 / CLI 输出
输入
dws aitable +section-list-empty --base-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "list_empty_sections"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "list_empty_sections"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1202ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +section-list-empty --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json
真实 stdout
{
+  "data": {
+    "items": [],
+    "total": 0
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Found 0 empty sections in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "items": [],
+    "total": 0
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Found 0 empty sections in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
dws aitable +section-list-nodes --base-id <base-id>read
列出指定 Base 当前版本下的全部 nsheet 节点
dws mcp aitable list_nsheet_nodes --json '{"baseId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/list_nsheet_nodes
输入 / CLI 输出
输入
dws aitable +section-list-nodes --base-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "list_nsheet_nodes"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "list_nsheet_nodes"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=969ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +section-list-nodes --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json
真实 stdout
{
+  "data": {
+    "items": [
+      {
+        "nodeId": "L53jNZz",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "zTiHNDL",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "TG566ix",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "hERWDMS-HaFV1LW",
+        "nodeType": "form_view",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "KY9tlWg5NEHgfs8WT6IO2",
+        "nodeType": "dashboard",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "TWB385A",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "hERWDMS-lmeV1cb",
+        "nodeType": "form_view",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "anMdihs",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "qid57iq",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "k8d898q-mkGX58x",
+        "nodeType": "form_view",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "k8d898q",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "zyLRwwa",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "hERWDMS",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      }
+    ],
+    "total": 13
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Found 13 nsheet nodes in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "items": [
+      {
+        "nodeId": "L53jNZz",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "zTiHNDL",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "TG566ix",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "hERWDMS-HaFV1LW",
+        "nodeType": "form_view",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "KY9tlWg5NEHgfs8WT6IO2",
+        "nodeType": "dashboard",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "TWB385A",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "hERWDMS-lmeV1cb",
+        "nodeType": "form_view",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "anMdihs",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "qid57iq",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "k8d898q-mkGX58x",
+        "nodeType": "form_view",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "k8d898q",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "zyLRwwa",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      },
+      {
+        "nodeId": "hERWDMS",
+        "nodeType": "sheet",
+        "parentSectionId": ""
+      }
+    ],
+    "total": 13
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Found 13 nsheet nodes in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk"
+}
dws aitable +section-move-node --base-id <base-id> --node-id <node-id> --new-parent-section-id <new-parent-section-id> --target-index <target-index>write
把任意 nsheet 节点移动到目标文件夹下(可选调整位置)
dws mcp aitable move_nsheet_node --json '{"baseId":<..>, "nodeId":<..>, "newParentSectionId":<..>, "targetIndex":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/move_nsheet_node
输入 / CLI 输出
输入
dws aitable +section-move-node --base-id x --node-id x --new-parent-section-id x --target-index 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "newParentSectionId": "x",
+    "nodeId": "x",
+    "targetIndex": 1
+  },
+  "product": "aitable-helper",
+  "tool": "move_nsheet_node"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "newParentSectionId": "x",
+    "nodeId": "x",
+    "targetIndex": 1
+  },
+  "product": "aitable-helper",
+  "tool": "move_nsheet_node"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1186ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +section-move-node --base-id DWSREALTESTNOSUCHID0000000000000 --node-id DWSREALTESTNOSUCHID0000000000000 --new-parent-section-id DWSREALTESTNOSUCHID0000000000000 --target-index 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to move node for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998828667800e0920\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to move node for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998828667800e0920\"}"
+  }
+}
dws aitable +section-rename --base-id <base-id> --section-id <section-id> --new-name <new-name>write
重命名指定文件夹
dws mcp aitable rename_section --json '{"baseId":<..>, "sectionId":<..>, "newName":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/rename_section
输入 / CLI 输出
输入
dws aitable +section-rename --base-id x --section-id x --new-name x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "newName": "x",
+    "sectionId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "rename_section"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "newName": "x",
+    "sectionId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "rename_section"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1259ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +section-rename --base-id DWSREALTESTNOSUCHID0000000000000 --section-id DWSREALTESTNOSUCHID0000000000000 --new-name 'DWS shortcut 真实测试 20260715-151724' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to rename section for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998840692547e08e2\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to rename section for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998840692547e08e2\"}"
+  }
+}
dws aitable +section-reorder --base-id <base-id> --section-id <section-id> --target-index <target-index>write
在当前父文件夹下调整文件夹的展示顺序
dws mcp aitable reorder_section --json '{"baseId":<..>, "sectionId":<..>, "targetIndex":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/reorder_section
输入 / CLI 输出
输入
dws aitable +section-reorder --base-id x --section-id x --target-index 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "sectionId": "x",
+    "targetIndex": 1
+  },
+  "product": "aitable-helper",
+  "tool": "reorder_section"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "sectionId": "x",
+    "targetIndex": 1
+  },
+  "product": "aitable-helper",
+  "tool": "reorder_section"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1193ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +section-reorder --base-id DWSREALTESTNOSUCHID0000000000000 --section-id DWSREALTESTNOSUCHID0000000000000 --target-index 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to reorder section for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998853157434e08d9\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to reorder section for base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998853157434e08d9\"}"
+  }
+}
dws aitable +table-delete --base-id <base-id> --table-id <table-id> --reason <reason>high-risk-write
删除指定数据表(不可逆)
dws mcp aitable delete_table --json '{"baseId":<..>, "tableId":<..>, "reason":<..>}' lark-cli base +table-delete已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/delete_table
输入 / CLI 输出
输入
dws aitable +table-delete --base-id x --table-id x --reason x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "reason": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_table"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "reason": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_table"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1199ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +table-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --reason 'DWS shortcut 真实测试安全负向清理' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete table because base does not exist or is inaccessible\",\"trace_id\":\"2132f5ca17840998865048372e0852\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete table because base does not exist or is inaccessible\",\"trace_id\":\"2132f5ca17840998865048372e0852\"}"
+  }
+}
dws aitable +table-get --base-id <base-id> --table-ids <table-ids>read
批量获取指定数据表的表级信息、字段目录与视图目录
dws mcp aitable get_tables --json '{"baseId":<..>, "tableIds":<..>}' lark-cli base +table-get已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_tables
输入 / CLI 输出
输入
dws aitable +table-get --base-id x --table-ids x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableIds": [
+      "x"
+    ]
+  },
+  "product": "aitable",
+  "tool": "get_tables"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableIds": [
+      "x"
+    ]
+  },
+  "product": "aitable",
+  "tool": "get_tables"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1301ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +table-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-ids x --yes --format json
真实 stdout
{
+  "data": {
+    "tables": []
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got 0 tables from base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk. Requested tableIds not returned: x. URL rules: AI 表格数据表访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}; AI 表格视图访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}%26viewId%3D{viewId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "tables": []
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Got 0 tables from base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk. Requested tableIds not returned: x. URL rules: AI 表格数据表访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}; AI 表格视图访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}%26viewId%3D{viewId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。"
+}
dws aitable +table-update --base-id <base-id> --table-id <table-id> --name <name> --description <description> --record-name-key <record-name-key>write
更新数据表名称 / 备注 / 行命名规则
dws mcp aitable update_table --json '{"baseId":<..>, "tableId":<..>, "newTableName":<..>, "description":<..>, "recordNameKey":<..>}' lark-cli base +table-update已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/update_table
输入 / CLI 输出
输入
dws aitable +table-update --base-id x --table-id x --name x --description x --record-name-key x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "description": "x",
+    "newTableName": "x",
+    "recordNameKey": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "update_table"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "description": "x",
+    "newTableName": "x",
+    "recordNameKey": "x",
+    "tableId": "x"
+  },
+  "product": "aitable",
+  "tool": "update_table"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1249ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +table-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --description 'DWS shortcut 真实测试描述,可删除' --record-name-key task --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update table DWSREALTESTNOSUCHID0000000000000 in base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998877246229e087f\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update table DWSREALTESTNOSUCHID0000000000000 in base DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998877246229e087f\"}"
+  }
+}
dws aitable +template-search --query <query> --limit <limit> --cursor <cursor>read
按名称关键词搜索 AI 表格模板
dws mcp aitable <tool> lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/search_templates
输入 / CLI 输出
输入
dws aitable +template-search --query x --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "templates": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "templates": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=953ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +template-search --query '测试' --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "count": 2,
+  "templates": [
+    {
+      "templateId": "513",
+      "templateName": "随堂小测试"
+    },
+    {
+      "templateId": "425",
+      "templateName": "随堂小测试"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 2,
+  "templates": [
+    {
+      "templateId": "513",
+      "templateName": "随堂小测试"
+    },
+    {
+      "templateId": "425",
+      "templateName": "随堂小测试"
+    }
+  ]
+}
dws aitable +view-delete --base-id <base-id> --table-id <table-id> --view-id <view-id>high-risk-write
删除指定视图(不可逆)
dws mcp aitable delete_view --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>}' lark-cli base +view-delete已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/delete_view
输入 / CLI 输出
输入
dws aitable +view-delete --base-id x --table-id x --view-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_view"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable",
+  "tool": "delete_view"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1236ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +view-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998889051250e08df\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998889051250e08df\"}"
+  }
+}
dws aitable +view-duplicate --base-id <base-id> --table-id <table-id> --view-id <view-id> --new-name <new-name>write
复制视图,生成配置相同的新视图
dws mcp aitable duplicate_view --json '{"baseId":<..>, "tableId":<..>, "sourceViewId":<..>, "newViewName":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/duplicate_view
输入 / CLI 输出
输入
dws aitable +view-duplicate --base-id x --table-id x --view-id x --new-name x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "newViewName": "x",
+    "sourceViewId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "duplicate_view"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "newViewName": "x",
+    "sourceViewId": "x",
+    "tableId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "duplicate_view"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1160ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +view-duplicate --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --new-name 'DWS shortcut 真实测试 20260715-151724' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to duplicate view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998901765467e0853\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to duplicate view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2132f5ca17840998901765467e0853\"}"
+  }
+}
dws aitable +view-get --base-id <base-id> --table-id <table-id> --view-ids <view-ids>read
获取视图完整信息(列顺序、筛选、排序、分组等)
dws mcp aitable <tool> lark-cli base +view-get已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable/get_views
输入 / CLI 输出
输入
dws aitable +view-get --base-id x --table-id x --view-ids x --yes
stdout
{
+  "count": 0,
+  "views": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "views": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1137ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +view-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-ids qvGDAH2 --yes --format json
真实 stdout
{
+  "count": 1,
+  "views": [
+    {
+      "viewId": "qvGDAH2",
+      "viewName": "Mac Mini",
+      "viewType": "Grid"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 1,
+  "views": [
+    {
+      "viewId": "qvGDAH2",
+      "viewName": "Mac Mini",
+      "viewType": "Grid"
+    }
+  ]
+}
dws aitable +view-get-frozen-cols --base-id <base-id> --table-id <table-id> --view-id <view-id>read
获取视图当前冻结的左侧列数
dws mcp aitable get_frozen_columns_of_view --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_frozen_columns_of_view
输入 / CLI 输出
输入
dws aitable +view-get-frozen-cols --base-id x --table-id x --view-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_frozen_columns_of_view"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_frozen_columns_of_view"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1097ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +view-get-frozen-cols --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id qvGDAH2 --yes --format json
真实 stdout
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "count": 1,
+    "tableId": "hERWDMS",
+    "viewId": "qvGDAH2"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Frozen column count of view 'Mac Mini' is 1"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "count": 1,
+    "tableId": "hERWDMS",
+    "viewId": "qvGDAH2"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "Frozen column count of view 'Mac Mini' is 1"
+}
dws aitable +view-get-lock --base-id <base-id> --table-id <table-id> --view-id <view-id>read
获取视图锁定状态
dws mcp aitable get_view_lock_status --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_view_lock_status
输入 / CLI 输出
输入
dws aitable +view-get-lock --base-id x --table-id x --view-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_view_lock_status"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_view_lock_status"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1063ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +view-get-lock --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id qvGDAH2 --yes --format json
真实 stdout
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "locked": false,
+    "tableId": "hERWDMS",
+    "viewId": "qvGDAH2"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "View 'Mac Mini' is unlocked"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "locked": false,
+    "tableId": "hERWDMS",
+    "viewId": "qvGDAH2"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "View 'Mac Mini' is unlocked"
+}
dws aitable +view-get-row-height --base-id <base-id> --table-id <table-id> --view-id <view-id>read
获取视图单元格行高(像素)
dws mcp aitable get_cell_height_of_view --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_cell_height_of_view
输入 / CLI 输出
输入
dws aitable +view-get-row-height --base-id x --table-id x --view-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_cell_height_of_view"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_cell_height_of_view"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1284ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test aitable +view-get-row-height --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id qvGDAH2 --yes --format json
真实 stdout
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "tableId": "hERWDMS",
+    "viewId": "qvGDAH2"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "View 'Mac Mini' has no explicit cell height"
+}
真实 stderr / error
(空)
真实返回
{
+  "data": {
+    "baseId": "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk",
+    "tableId": "hERWDMS",
+    "viewId": "qvGDAH2"
+  },
+  "error": {},
+  "meta": {},
+  "status": "success",
+  "success": true,
+  "summary": "View 'Mac Mini' has no explicit cell height"
+}
dws aitable +view-lock --base-id <base-id> --table-id <table-id> --view-id <view-id> --off <off>write
锁定视图(默认)或解锁(--off)
dws mcp aitable lock_or_unlock_view --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "action":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/lock_or_unlock_view
输入 / CLI 输出
输入
dws aitable +view-lock --base-id x --table-id x --view-id x --off --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "action": "unlock",
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "lock_or_unlock_view"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "action": "unlock",
+    "baseId": "x",
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "lock_or_unlock_view"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1215ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +view-lock --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --off --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to lock_or_unlock view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998913717245e0941\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to lock_or_unlock view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998913717245e0941\"}"
+  }
+}
dws aitable +view-set-fill-color-rule --base-id <base-id> --table-id <table-id> --view-id <view-id> --json <json>write
全量覆盖 Grid 视图的条件填色规则(传 '[]' 清空)
dws mcp aitable set_view_fill_color_rule --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "conditionalFormats":<..>}' lark base 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--json JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +view-set-fill-color-rule --base-id x --table-id x --view-id x --json x --yes
stdout
(空)
stderr / error
--json JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--json JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1046ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +view-set-fill-color-rule --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --json '{}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"conditionalFormats is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set fill color rule because conditionalFormats is missing\",\"trace_id\":\"2106d98117840998924181709e08df\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"conditionalFormats is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set fill color rule because conditionalFormats is missing\",\"trace_id\":\"2106d98117840998924181709e08df\"}"
+  }
+}
dws aitable +view-set-frozen-cols --base-id <base-id> --table-id <table-id> --view-id <view-id> --count <count>write
设置视图冻结列数(0 表示取消冻结)
dws mcp aitable set_frozen_columns_of_view --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "count":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/set_frozen_columns_of_view
输入 / CLI 输出
输入
dws aitable +view-set-frozen-cols --base-id x --table-id x --view-id x --count 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "count": 1,
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "set_frozen_columns_of_view"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "count": 1,
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "set_frozen_columns_of_view"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1149ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +view-set-frozen-cols --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --count 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set frozen columns for view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998935988648e08de\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set frozen columns for view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998935988648e08de\"}"
+  }
+}
dws aitable +view-set-row-height --base-id <base-id> --table-id <table-id> --view-id <view-id> --cell-height <cell-height>write
设置视图单元格行高(像素,合法档位 32/56/88/128)
dws mcp aitable set_cell_height_of_view --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "cellHeight":<..>}' lark base 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/set_cell_height_of_view
输入 / CLI 输出
输入
dws aitable +view-set-row-height --base-id x --table-id x --view-id x --cell-height 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "cellHeight": 1,
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "set_cell_height_of_view"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "cellHeight": 1,
+    "tableId": "x",
+    "viewId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "set_cell_height_of_view"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1345ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +view-set-row-height --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --cell-height 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set cell height for view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998949428245e08b8\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set cell height for view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"2106d98117840998949428245e08b8\"}"
+  }
+}
dws aitable +view-update --base-id <base-id> --table-id <table-id> --view-id <view-id> --name <name> --desc <desc> --config <config>write
更新视图名称 / 描述 / 配置(visibleFieldIds、filter、sort、group 等)
dws mcp aitable update_view --json '{"baseId":<..>, "tableId":<..>, "viewId":<..>, "newViewName":<..>, "viewDescription":<..>, "config":<..>}' lark base 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--desc JSON 解析失败: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws aitable +view-update --base-id x --table-id x --view-id x --name x --desc x --config x --yes
stdout
(空)
stderr / error
--desc JSON 解析失败: invalid character 'x' looking for beginning of value
最终用于判定的返回
--desc JSON 解析失败: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1331ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +view-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --desc '{}' --config '{}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998961487395e087f\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update view DWSREALTESTNOSUCHID0000000000000\",\"trace_id\":\"213ee25c17840998961487395e087f\"}"
+  }
+}
dws aitable +workflow-disable --base-id <base-id> --workflow-id <workflow-id>high-risk-write
禁用指定 Base 中的自动化工作流(影响业务自动化)
dws mcp aitable disable_workflow --json '{"baseId":<..>, "workflowId":<..>}' lark-cli base +workflow-disable已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/disable_workflow
输入 / CLI 输出
输入
dws aitable +workflow-disable --base-id x --workflow-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "workflowId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "disable_workflow"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "workflowId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "disable_workflow"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1320ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +workflow-disable --base-id DWSREALTESTNOSUCHID0000000000000 --workflow-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to disable workflow because base 'DWSREALTESTNOSUCHID0000000000000' could not be found\",\"trace_id\":\"213ee25c17840998975738372e087e\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to disable workflow because base 'DWSREALTESTNOSUCHID0000000000000' could not be found\",\"trace_id\":\"213ee25c17840998975738372e087e\"}"
+  }
+}
dws aitable +workflow-enable --base-id <base-id> --workflow-id <workflow-id>write
启用指定 Base 中的自动化工作流
dws mcp aitable enable_workflow --json '{"baseId":<..>, "workflowId":<..>}' lark-cli base +workflow-enable已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/enable_workflow
输入 / CLI 输出
输入
dws aitable +workflow-enable --base-id x --workflow-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "workflowId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "enable_workflow"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "workflowId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "enable_workflow"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1171ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺 AI 表格真实 fixture / 需真实 fixture,非 CLI 可直接修
+AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。
真实输入
/private/tmp/dws-real-test aitable +workflow-enable --base-id DWSREALTESTNOSUCHID0000000000000 --workflow-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to enable workflow because base 'DWSREALTESTNOSUCHID0000000000000' could not be found\",\"trace_id\":\"0bab027317840998987508899e094d\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to enable workflow because base 'DWSREALTESTNOSUCHID0000000000000' could not be found\",\"trace_id\":\"0bab027317840998987508899e094d\"}"
+  }
+}
dws aitable +workflow-get --base-id <base-id> --workflow-id <workflow-id>read
获取单个自动化工作流的详细信息
dws mcp aitable get_workflow --json '{"baseId":<..>, "workflowId":<..>}' lark-cli base +workflow-get已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/get_workflow
输入 / CLI 输出
输入
dws aitable +workflow-get --base-id x --workflow-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "workflowId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_workflow"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "baseId": "x",
+    "workflowId": "x"
+  },
+  "product": "aitable-helper",
+  "tool": "get_workflow"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1535ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +workflow-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --workflow-id DWSREALREADNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"GET_WORKFLOW_ERROR\",\"message\":\"调用远程服务业务异常\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get workflow in base 'gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk' due to an unexpected error\",\"trace_id\":\"2104a64c17840997556363676e08ee\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"GET_WORKFLOW_ERROR\",\"message\":\"调用远程服务业务异常\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get workflow in base 'gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk' due to an unexpected error\",\"trace_id\":\"2104a64c17840997556363676e08ee\"}"
+  }
+}
dws aitable +workflow-list --base-id <base-id> --limit <limit> --offset <offset>read
列出指定 Base 中的自动化工作流(分页)
dws mcp aitable <tool> lark-cli base +workflow-list已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;aitable-helper/list_workflows
输入 / CLI 输出
输入
dws aitable +workflow-list --base-id x --limit 1 --offset 1 --yes
stdout
{
+  "count": 0,
+  "workflows": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "workflows": []
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1540ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
后端 / MCP 内部错误 / 优先后端 / MCP 排查
+后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。
真实输入
/private/tmp/dws-real-test aitable +workflow-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --limit 10 --offset 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"LIST_WORKFLOWS_ERROR\",\"message\":\"biz error\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to list workflows in base 'gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk' due to an unexpected error\",\"trace_id\":\"2127d89817840997572427879e075d\"}"
+  }
+}
真实返回
{
+  "error": {
+    "category": "internal",
+    "code": 1,
+    "message": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"LIST_WORKFLOWS_ERROR\",\"message\":\"biz error\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to list workflows in base 'gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk' due to an unexpected error\",\"trace_id\":\"2127d89817840997572427879e075d\"}"
+  }
+}

attendance · 35 个 · 钉钉特有 · lark 无对应

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + - - + + + + + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws attendance +boss-check --plan-id <plan-id> --result-id <result-id> --time <time> --result <result> --absent-min <absent-min> --remark <remark>write
BOSS 改签打卡记录(管理员修改打卡时间/结果)
dws mcp attendance boss_check --json '{"BossCheckMcpRequest":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/boss_check
输入 / CLI 输出
输入
dws attendance +boss-check --plan-id x --result-id x --time x --result Normal --absent-min 1 --remark x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "BossCheckMcpRequest": {
+      "absentMin": 1,
+      "bossCheckTime": "x",
+      "remark": "x",
+      "result": "Normal",
+      "resultId": "x"
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "boss_check"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "BossCheckMcpRequest": {
+      "absentMin": 1,
+      "bossCheckTime": "x",
+      "remark": "x",
+      "result": "Normal",
+      "resultId": "x"
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "boss_check"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1136ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test attendance +boss-check --plan-id 999999999999 --result-id 999999999999 --time 2026-07-22T10:00:00+08:00 --result Normal --absent-min 1 --remark 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/boss_check)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "C0002",
+    "server_key": "attendance-wukong",
+    "trace_id": "213ee25c17840998998942184e087d"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/boss_check)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "C0002",
+    "server_key": "attendance-wukong",
+    "trace_id": "213ee25c17840998998942184e087d"
+  }
+}
dws attendance +check-record --users <users> --start <start> --end <end>read
查询用户打卡流水(打卡时间/地点/定位方式)
dws mcp attendance query_check_record --json '{"QueryCheckRecordRequest":<..>, "userIds":<..>, "checkDateFrom":<..>, "checkDateTo":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws attendance +check-record --users x --start x --end x --yes
stdout
(空)
stderr / error
日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
最终用于判定的返回
日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=998ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +check-record --users 202397 --start 2026-07-14 --end 2026-07-15 --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
dws attendance +check-result --users <users> --start <start> --end <end> --offset <offset> --limit <limit>read
查询用户打卡结果(迟到/早退/缺卡等)
dws mcp attendance query_check_result --json '{"QueryCheckResultRequest":<..>, "userIds":<..>, "workDateFrom":<..>, "workDateTo":<..>, "offset":<..>, "limit":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws attendance +check-result --users x --start x --end x --offset 1 --limit 1 --yes
stdout
(空)
stderr / error
日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
最终用于判定的返回
日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1134ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +check-result --users 202397 --start 2026-07-14 --end 2026-07-15 --offset 1 --limit 10 --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
dws attendance +create-class --name <name> --owner <owner> --class-vo <class-vo>write
创建班次(checkTime 用 HH:mm,自动转时间戳)
dws mcp attendance create_class_setting --json '{"TopAtClassVO":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --class-vo JSON: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws attendance +create-class --name x --owner x --class-vo x --yes
stdout
(空)
stderr / error
invalid --class-vo JSON: invalid character 'x' looking for beginning of value
最终用于判定的返回
invalid --class-vo JSON: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1148ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test attendance +create-class --name 'DWS shortcut 真实测试 20260715-151724' --owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --class-vo '{"sections":[{"times":[{"checkType":"OnDuty","checkTime":"09:00","across":0},{"checkType":"OffDuty","checkTime":"18:00","across":0}]}]}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_class_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0001",
+    "server_key": "attendance-wukong",
+    "trace_id": "0bab027317840999009926838e090b"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_class_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0001",
+    "server_key": "attendance-wukong",
+    "trace_id": "0bab027317840999009926838e090b"
+  }
+}
dws attendance +create-group --name <name> --type <type> --owner <owner> --group-vo <group-vo>write
创建考勤组(复杂子对象用 --group-vo JSON 传入)
dws mcp attendance create_group_setting --json '{"groupVO":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --group-vo JSON: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws attendance +create-group --name x --type FIXED --owner x --group-vo x --yes
stdout
(空)
stderr / error
invalid --group-vo JSON: invalid character 'x' looking for beginning of value
最终用于判定的返回
invalid --group-vo JSON: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1201ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test attendance +create-group --name 'DWS shortcut 真实测试 20260715-151724' --type FIXED --owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --group-vo '{"defaultClassId":999999999999,"workDayClassList":[999999999999,999999999999,999999999999,999999999999,999999999999,0,0]}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_group_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0001",
+    "server_key": "attendance-wukong",
+    "trace_id": "2106d98117840999021121258e08b8"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_group_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0001",
+    "server_key": "attendance-wukong",
+    "trace_id": "2106d98117840999021121258e08b8"
+  }
+}
dws attendance +get-adjustment-rule --adjustment-id <adjustment-id>read
根据补卡规则主键 ID 查询补卡规则详情
dws mcp attendance get_adjustment_rule_detail --json '{"adjustmentId":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_adjustment_rule_detail
输入 / CLI 输出
输入
dws attendance +get-adjustment-rule --adjustment-id 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "adjustmentId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_adjustment_rule_detail"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "adjustmentId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_adjustment_rule_detail"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=950ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +get-adjustment-rule --adjustment-id 1 --yes --format json
真实 stdout
{
+  "success": true,
+  "有效期类型": "工作日"
+}
真实 stderr / error
(空)
真实返回
{
+  "success": true,
+  "有效期类型": "工作日"
+}
dws attendance +get-approve-template --type <type>read
查询补卡/请假/加班/外出/出差审批提交链接
dws mcp attendance query_at_approve_template --json '{"OUT":<..>, "approveType":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);无效的审批类型: x,支持: repair-check/补卡、leave/请假、overtime/加班、travel/外出、out/出差,或 REPAIR_CHECK/LEAVE/OVERTIME/TRAVEL/OUT
输入 / CLI 输出
输入
dws attendance +get-approve-template --type x --yes
stdout
(空)
stderr / error
无效的审批类型: x,支持: repair-check/补卡、leave/请假、overtime/加班、travel/外出、out/出差,或 REPAIR_CHECK/LEAVE/OVERTIME/TRAVEL/OUT
最终用于判定的返回
无效的审批类型: x,支持: repair-check/补卡、leave/请假、overtime/加班、travel/外出、out/出差,或 REPAIR_CHECK/LEAVE/OVERTIME/TRAVEL/OUT
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1080ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +get-approve-template --type leave --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": [
+    {
+      "approveType": "LEAVE",
+      "formName": "请假",
+      "processCode": "PROC-940F2B1F-845D-4F39-A92E-FA5F45D1BF87",
+      "submitUrl": "dingtalk://dingtalkclient/action/openapp?app_id=-4\u0026container_type=work_platform\u0026corpid=ding8196cd9a2b2405da24f2f5cc6abecb85\u0026ddtab=true\u0026redirect_type=jump\u0026redirect_url=https%3A%2F%2Faflow.dingtalk.com%2Fdingtalk%2Fmobile%2Fhomepage.htm%3FappUuid%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26backcontrol%3Dfalse%26corpid%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26dd_progress%3Dfalse%26dd_share%3Dfalse%26ddtab%3Dtrue%26showmenu%3Dfalse%23%2Fcustom%3Fpcredirect%3Dself%26processCode%3DPROC-940F2B1F-845D-4F39-A92E-FA5F45D1BF87"
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": [
+    {
+      "approveType": "LEAVE",
+      "formName": "请假",
+      "processCode": "PROC-940F2B1F-845D-4F39-A92E-FA5F45D1BF87",
+      "submitUrl": "dingtalk://dingtalkclient/action/openapp?app_id=-4\u0026container_type=work_platform\u0026corpid=ding8196cd9a2b2405da24f2f5cc6abecb85\u0026ddtab=true\u0026redirect_type=jump\u0026redirect_url=https%3A%2F%2Faflow.dingtalk.com%2Fdingtalk%2Fmobile%2Fhomepage.htm%3FappUuid%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26backcontrol%3Dfalse%26corpid%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26dd_progress%3Dfalse%26dd_share%3Dfalse%26ddtab%3Dtrue%26showmenu%3Dfalse%23%2Fcustom%3Fpcredirect%3Dself%26processCode%3DPROC-940F2B1F-845D-4F39-A92E-FA5F45D1BF87"
+    }
+  ],
+  "success": true
+}
dws attendance +get-checkin-record --operator-corp-id <operator-corp-id> --operator-staff-id <operator-staff-id> --staff-ids <staff-ids> --start <start> --end <end>read
查询指定员工一段时间内的签到记录
dws mcp attendance get_checkin_record --json '{"QueryMcpUserRecordRequest":<..>, "operatorCorpId":<..>, "operatorStaffId":<..>, "staffIds":<..>, "startTime":<..>, "endTime":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws attendance +get-checkin-record --operator-corp-id x --operator-staff-id x --staff-ids x --start x --end x --yes
stdout
(空)
stderr / error
--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
最终用于判定的返回
--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1116ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +get-checkin-record --operator-corp-id x --operator-staff-id 202397 --staff-ids 202397 --start '2026-07-15 10:00:00' --end '2026-07-15 16:00:00' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "result": {
+    "list": []
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "result": {
+    "list": []
+  },
+  "success": true
+}
dws attendance +get-class --class-id <class-id>read
根据班次 ID 查询班次详情
dws mcp attendance get_class_detail --json '{"classId":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_class_detail
输入 / CLI 输出
输入
dws attendance +get-class --class-id 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "classId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_class_detail"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "classId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_class_detail"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1492ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test attendance +get-class --class-id 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_class_detail)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "rule not found",
+    "server_key": "attendance-wukong",
+    "trace_id": "2127d89817840997588238831e0757"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_class_detail)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "rule not found",
+    "server_key": "attendance-wukong",
+    "trace_id": "2127d89817840997588238831e0757"
+  }
+}
dws attendance +get-global-setting --setting-scene <setting-scene> --scope <scope>read
查询全局规则设置(仅管理员)
dws mcp attendance query_global_setting --json '{"RuleMcpQueryGlobalSettingRequest":<..>, "settingScene":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/query_global_setting
输入 / CLI 输出
输入
dws attendance +get-global-setting --setting-scene checkRemind --scope 企业 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "RuleMcpQueryGlobalSettingRequest": {
+      "settingScene": "checkRemind"
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "query_global_setting"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "RuleMcpQueryGlobalSettingRequest": {
+      "settingScene": "checkRemind"
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "query_global_setting"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1635ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test attendance +get-global-setting --setting-scene checkRemind --scope '企业' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/query_global_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "NO_PERMISSION",
+    "server_key": "attendance-wukong",
+    "trace_id": "2104a64c17840997604718062e085e"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/query_global_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "NO_PERMISSION",
+    "server_key": "attendance-wukong",
+    "trace_id": "2104a64c17840997604718062e085e"
+  }
+}
dws attendance +get-group --group-id <group-id>read
根据考勤组 ID 查询考勤组全量信息
dws mcp attendance get_group_detail --json '{"groupId":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_group_detail
输入 / CLI 输出
输入
dws attendance +get-group --group-id 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "groupId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_group_detail"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "groupId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_group_detail"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1568ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test attendance +get-group --group-id 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_detail)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "rule not found",
+    "server_key": "attendance-wukong",
+    "trace_id": "0b5deb3217840997620512305e08ef"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_detail)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "rule not found",
+    "server_key": "attendance-wukong",
+    "trace_id": "0b5deb3217840997620512305e08ef"
+  }
+}
dws attendance +get-group-filtered --group-id <group-id> --member <member> --position <position> --wifi <wifi> --bles <bles>read
按需查询考勤组成员/打卡地址/蓝牙/Wifi 子集
dws mcp attendance get_group_filtered_detail --json '{"groupId":<..>, "GroupResultFilter":<..>, "includeMember":<..>, "includePosition":<..>, "includeWifi":<..>, "includeBles":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_group_filtered_detail
输入 / CLI 输出
输入
dws attendance +get-group-filtered --group-id 1 --member --position --wifi --bles --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "GroupResultFilter": {
+      "includeBles": true,
+      "includeMember": true,
+      "includePosition": true,
+      "includeWifi": true
+    },
+    "groupId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_group_filtered_detail"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "GroupResultFilter": {
+      "includeBles": true,
+      "includeMember": true,
+      "includePosition": true,
+      "includeWifi": true
+    },
+    "groupId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_group_filtered_detail"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1746ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test attendance +get-group-filtered --group-id 1 --member --position --wifi --bles --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_filtered_detail)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "rule not found",
+    "server_key": "attendance-wukong",
+    "trace_id": "2104a64c17840997638062468e08c7"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_filtered_detail)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "rule not found",
+    "server_key": "attendance-wukong",
+    "trace_id": "2104a64c17840997638062468e08c7"
+  }
+}
dws attendance +get-leave-balance --users <users> --leave-code <leave-code>read
查询指定员工的假期余额
dws mcp attendance get_leave_balance_quota --json '{"targetUserIds":<..>, "McpLeaveBalanceRequest":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_leave_balance_quota
输入 / CLI 输出
输入
dws attendance +get-leave-balance --users x --leave-code x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "McpLeaveBalanceRequest": {
+      "leaveCode": "x",
+      "targetUserIds": [
+        "x"
+      ]
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "get_leave_balance_quota"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "McpLeaveBalanceRequest": {
+      "leaveCode": "x",
+      "targetUserIds": [
+        "x"
+      ]
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "get_leave_balance_quota"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1479ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test attendance +get-leave-balance --users 202397 --leave-code 731ed089-62ff-4734-a6c7-3c8fcc8294fc --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 亲,假期类型没有余额 (operation: attendance-wukong/get_leave_balance_quota)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "2002",
+    "server_key": "attendance-wukong",
+    "trace_id": "2104a64c17840997652901307e081a"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 亲,假期类型没有余额 (operation: attendance-wukong/get_leave_balance_quota)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "2002",
+    "server_key": "attendance-wukong",
+    "trace_id": "2104a64c17840997652901307e081a"
+  }
+}
dws attendance +get-leave-records --user <user> --leave-code <leave-code> --start <start> --end <end>read
查询指定员工的假期余额变更记录
dws mcp attendance get_leave_balance_records_v2 --json '{"targetUserId":<..>, "startTimeStamp":<..>, "endTimeStamp":<..>, "McpLeaveRecordRequest":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws attendance +get-leave-records --user x --leave-code x --start x --end x --yes
stdout
(空)
stderr / error
日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
最终用于判定的返回
日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1009ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +get-leave-records --user 202397 --leave-code 731ed089-62ff-4734-a6c7-3c8fcc8294fc --start 2026-07-14 --end 2026-07-15 --yes --format json
真实 stdout
{
+  "errorCode": null,
+  "errorMsg": null,
+  "result": [],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "errorCode": null,
+  "errorMsg": null,
+  "result": [],
+  "success": true
+}
dws attendance +get-overtime-rule --overtime-id <overtime-id>read
根据加班规则主键 ID 查询加班规则详情
dws mcp attendance get_overtime_rule_detail --json '{"overtimeId":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_overtime_rule_detail
输入 / CLI 输出
输入
dws attendance +get-overtime-rule --overtime-id 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "overtimeId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_overtime_rule_detail"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "overtimeId": 1
+  },
+  "product": "attendance-wukong",
+  "tool": "get_overtime_rule_detail"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=961ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +get-overtime-rule --overtime-id 1 --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": [
+    {
+      "advanceSettingDays": [],
+      "content": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "durationSettings": {
+        "holiday": {
+          "calcType": 1,
+          "durationType": 1,
+          "holidayPlanOvertimeRedress": null,
+          "holidayPlanOvertimeRedressBy": null,
+          "holidayPlanVacationRate": null,
+          "overtimeRedress": true,
+          "overtimeRedressBy": "vacation",
+          "roundType": null,
+          "settings": {},
+          "skipTime": "none",
+          "skipTimeByDurations": [],
+          "skipTimeByFrames": [],
+          "stepType": null,
+          "stepValue": null,
+          "vacationRate": "1.0",
+          "warningSettings": [],
+          "workMinutesPerDay": null
+        },
+        "restDay": {
+          "calcType": 1,
+          "durationType": 1,
+          "holidayPlanOvertimeRedress": null,
+          "holidayPlanOvertimeRedressBy": null,
+          "holidayPlanVacationRate": null,
+          "overtimeRedress": true,
+          "overtimeRedressBy": "vacation",
+          "roundType": null,
+          "settings": {},
+          "skipTime": "none",
+          "skipTimeByDurations": [],
+          "skipTimeByFrames": [],
+          "stepType": null,
+          "stepValue": null,
+          "vacationRate": "1.0",
+          "warningSettings": [],
+          "workMinutesPerDay": null
+        },
+        "workDay": {
+          "calcType": 1,
+          "durationType": 1,
+          "holidayPlanOvertimeRedress": null,
+          "holidayPlanOvertimeRedressBy": null,
+          "holidayPlanVacationRate": null,
+          "overtimeRedress": true,
+          "overtimeRedressBy": "vacation",
+          "roundType": null,
+          "settings": {
+            "calcTypeBetweenDutyWorktime": null,
+            "durationTypeBetweenDutyWorktime": null,
+            "dutyWorktimeLieuTypeVacationCode": null,
+            "dutyWorktimeOvertimeRedress": null,
+            "dutyWorktimeOvertimeRedressBy": null,
+            "dutyWorktimeVacationRate": null,
+            "enableAfterOffDuty": true,
+            "enableBeforeOnDuty": true,
+            "enableBetweenDuty": true,
+            "enableBetweenDutyWorktime": null,
+            "startTime": null,
+            "timeUnit": null,
+            "timeUnitAfterOffDuty": 30,
+            "timeUnitBeforeOnDuty": 30,
+            "timeUnitBetweenDuty": 0,
+            "timeUnitBetweenDutyWorktime": null
+          },
+          "skipTime": "none",
+          "skipTimeByDurations": [],
+          "skipTimeByFrames": [],
+          "stepType": null,
+          "stepValue": null,
+          "vacationRate": "1.0",
+          "warningSettings": [],
+          "workMinutesPerDay": null
+        }
+      },
+      "groupIdAndNames": [],
+      "id": 941615052,
+      "isDefault": null,
+      "name": "以审批时间计算加班",
+      "overtimeCheckSetting": {},
+      "overtimeDivisions": [],
+      "owner": null,
+      "ownerList": [],
+      "roundType": "floor",
+      "scopes": null,
+      "settingId": 941615052,
+      "stepType": 0,
+      "stepValue": "1.0",
+      "warningSettings": [],
+      "workMinutesPerDay": 480
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": [
+    {
+      "advanceSettingDays": [],
+      "content": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "durationSettings": {
+        "holiday": {
+          "calcType": 1,
+          "durationType": 1,
+          "holidayPlanOvertimeRedress": null,
+          "holidayPlanOvertimeRedressBy": null,
+          "holidayPlanVacationRate": null,
+          "overtimeRedress": true,
+          "overtimeRedressBy": "vacation",
+          "roundType": null,
+          "settings": {},
+          "skipTime": "none",
+          "skipTimeByDurations": [],
+          "skipTimeByFrames": [],
+          "stepType": null,
+          "stepValue": null,
+          "vacationRate": "1.0",
+          "warningSettings": [],
+          "workMinutesPerDay": null
+        },
+        "restDay": {
+          "calcType": 1,
+          "durationType": 1,
+          "holidayPlanOvertimeRedress": null,
+          "holidayPlanOvertimeRedressBy": null,
+          "holidayPlanVacationRate": null,
+          "overtimeRedress": true,
+          "overtimeRedressBy": "vacation",
+          "roundType": null,
+          "settings": {},
+          "skipTime": "none",
+          "skipTimeByDurations": [],
+          "skipTimeByFrames": [],
+          "stepType": null,
+          "stepValue": null,
+          "vacationRate": "1.0",
+          "warningSettings": [],
+          "workMinutesPerDay": null
+        },
+        "workDay": {
+          "calcType": 1,
+          "durationType": 1,
+          "holidayPlanOvertimeRedress": null,
+          "holidayPlanOvertimeRedressBy": null,
+          "holidayPlanVacationRate": null,
+          "overtimeRedress": true,
+          "overtimeRedressBy": "vacation",
+          "roundType": null,
+          "settings": {
+            "calcTypeBetweenDutyWorktime": null,
+            "durationTypeBetweenDutyWorktime": null,
+            "dutyWorktimeLieuTypeVacationCode": null,
+            "dutyWorktimeOvertimeRedress": null,
+            "dutyWorktimeOvertimeRedressBy": null,
+            "dutyWorktimeVacationRate": null,
+            "enableAfterOffDuty": true,
+            "enableBeforeOnDuty": true,
+            "enableBetweenDuty": true,
+            "enableBetweenDutyWorktime": null,
+            "startTime": null,
+            "timeUnit": null,
+            "timeUnitAfterOffDuty": 30,
+            "timeUnitBeforeOnDuty": 30,
+            "timeUnitBetweenDuty": 0,
+            "timeUnitBetweenDutyWorktime": null
+          },
+          "skipTime": "none",
+          "skipTimeByDurations": [],
+          "skipTimeByFrames": [],
+          "stepType": null,
+          "stepValue": null,
+          "vacationRate": "1.0",
+          "warningSettings": [],
+          "workMinutesPerDay": null
+        }
+      },
+      "groupIdAndNames": [],
+      "id": 941615052,
+      "isDefault": null,
+      "name": "以审批时间计算加班",
+      "overtimeCheckSetting": {},
+      "overtimeDivisions": [],
+      "owner": null,
+      "ownerList": [],
+      "roundType": "floor",
+      "scopes": null,
+      "settingId": 941615052,
+      "stepType": 0,
+      "stepValue": "1.0",
+      "warningSettings": [],
+      "workMinutesPerDay": 480
+    }
+  ],
+  "success": true
+}
dws attendance +get-schedule --users <users> --start <start> --end <end>read
获取指定用户一段时间内的排班记录
dws mcp attendance getScheduleByRange --json '{"GetScheduleByRangeRequest":<..>, "userIdList":<..>, "workDateBegin":<..>, "workDateEnd":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);日期格式错误,应为 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss
输入 / CLI 输出
输入
dws attendance +get-schedule --users x --start x --end x --yes
stdout
(空)
stderr / error
日期格式错误,应为 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss
最终用于判定的返回
日期格式错误,应为 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss
真实后端测试输入 / 输出真实后端成功
exit=0;duration=929ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +get-schedule --users 202397 --start 2026-07-14 --end 2026-07-15 --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
dws attendance +get-self-setting --setting-scene <setting-scene> --user <user>read
查询个人规则设置(打卡提醒/极速打卡/缺卡提醒等)
dws mcp attendance query_self_setting --json '{"RuleMcpQuerySelfSettingRequest":<..>, "settingScene":<..>, "userId":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/query_self_setting
输入 / CLI 输出
输入
dws attendance +get-self-setting --setting-scene checkRemind --user x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "RuleMcpQuerySelfSettingRequest": {
+      "settingScene": "checkRemind",
+      "userId": "x"
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "query_self_setting"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "RuleMcpQuerySelfSettingRequest": {
+      "settingScene": "checkRemind",
+      "userId": "x"
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "query_self_setting"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=989ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +get-self-setting --setting-scene checkRemind --user 202397 --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": {
+    "bossMonthReportType": null,
+    "bossPushStartMin": null,
+    "bossWeekReportType": null,
+    "canUpdateOffDuty": null,
+    "checkRemindSetting": {},
+    "checkRemindUserOffDuty": true,
+    "checkRemindUserOnDuty": true,
+    "checkResultMsg": null,
+    "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+    "enableOffdutyCheckRemindOfPc": true,
+    "enableOndutyCheckRemindOfPc": true,
+    "fastCheckLateNeedConfirm": null,
+    "lackRemindUser": null,
+    "lackSendTodoMsg": null,
+    "offdutyCheckType": null,
+    "offdutyRemindEndMin": null,
+    "offdutyRemindStartMin": null,
+    "ondutyCheckType": null,
+    "ondutyRemindEndMin": null,
+    "ondutyRemindStartMin": null,
+    "personDailyReportSwitch": null,
+    "personMonthReportType": null,
+    "personWeekReportType": null,
+    "userId": "202397",
+    "vibrationRemindSwitch": null,
+    "voiceRemindSwitch": null
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": {
+    "bossMonthReportType": null,
+    "bossPushStartMin": null,
+    "bossWeekReportType": null,
+    "canUpdateOffDuty": null,
+    "checkRemindSetting": {},
+    "checkRemindUserOffDuty": true,
+    "checkRemindUserOnDuty": true,
+    "checkResultMsg": null,
+    "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+    "enableOffdutyCheckRemindOfPc": true,
+    "enableOndutyCheckRemindOfPc": true,
+    "fastCheckLateNeedConfirm": null,
+    "lackRemindUser": null,
+    "lackSendTodoMsg": null,
+    "offdutyCheckType": null,
+    "offdutyRemindEndMin": null,
+    "offdutyRemindStartMin": null,
+    "ondutyCheckType": null,
+    "ondutyRemindEndMin": null,
+    "ondutyRemindStartMin": null,
+    "personDailyReportSwitch": null,
+    "personMonthReportType": null,
+    "personWeekReportType": null,
+    "userId": "202397",
+    "vibrationRemindSwitch": null,
+    "voiceRemindSwitch": null
+  },
+  "success": true
+}
dws attendance +get-summary --user <user> --date <date> --stats-type <stats-type>read
查询某个人的考勤统计摘要(周/月)
dws mcp attendance get_user_attendance_summary --json '{"userId":<..>, "queryDate":<..>, "statsType":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);日期格式错误,应为 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss
输入 / CLI 输出
输入
dws attendance +get-summary --user x --date x --stats-type week --yes
stdout
(空)
stderr / error
日期格式错误,应为 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss
最终用于判定的返回
日期格式错误,应为 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1315ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +get-summary --user 202397 --date 2026-07-15 --stats-type week --yes --format json
真实 stdout
{
+  "errorCode": "0",
+  "errorMessage": "success",
+  "result": {
+    "items": [
+      {
+        "name": "平均工时",
+        "remark": "0小时",
+        "unit": "小时"
+      },
+      {
+        "name": "出勤天数",
+        "remark": "0天",
+        "unit": null
+      },
+      {
+        "name": "出勤班次",
+        "remark": "0个",
+        "unit": null
+      },
+      {
+        "name": "休息天数",
+        "remark": "0天",
+        "unit": null
+      },
+      {
+        "name": "迟到",
+        "remark": "0次",
+        "unit": "次"
+      },
+      {
+        "name": "早退",
+        "remark": "0次",
+        "unit": "次"
+      },
+      {
+        "name": "缺卡",
+        "remark": "0次",
+        "unit": "次"
+      },
+      {
+        "name": "旷工",
+        "remark": "0天",
+        "unit": null
+      },
+      {
+        "name": "外勤",
+        "remark": "0次",
+        "unit": null
+      },
+      {
+        "name": "加班",
+        "remark": "0小时",
+        "unit": null
+      },
+      {
+        "name": "补卡申请",
+        "remark": "0次",
+        "unit": null
+      }
+    ]
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "errorCode": "0",
+  "errorMessage": "success",
+  "result": {
+    "items": [
+      {
+        "name": "平均工时",
+        "remark": "0小时",
+        "unit": "小时"
+      },
+      {
+        "name": "出勤天数",
+        "remark": "0天",
+        "unit": null
+      },
+      {
+        "name": "出勤班次",
+        "remark": "0个",
+        "unit": null
+      },
+      {
+        "name": "休息天数",
+        "remark": "0天",
+        "unit": null
+      },
+      {
+        "name": "迟到",
+        "remark": "0次",
+        "unit": "次"
+      },
+      {
+        "name": "早退",
+        "remark": "0次",
+        "unit": "次"
+      },
+      {
+        "name": "缺卡",
+        "remark": "0次",
+        "unit": "次"
+      },
+      {
+        "name": "旷工",
+        "remark": "0天",
+        "unit": null
+      },
+      {
+        "name": "外勤",
+        "remark": "0次",
+        "unit": null
+      },
+      {
+        "name": "加班",
+        "remark": "0小时",
+        "unit": null
+      },
+      {
+        "name": "补卡申请",
+        "remark": "0次",
+        "unit": null
+      }
+    ]
+  },
+  "success": true
+}
dws attendance +import-schedule --group-id <group-id> --schedules <schedules>write
导入排班记录到排班制考勤组
dws mcp attendance generateTurnSchedule --json '{"GenerateTurnScheduleRequest":<..>, "groupId":<..>, "scheduleVOS":<..>, "param":<..>, "useHistoryGroupAndShift":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --schedules JSON: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws attendance +import-schedule --group-id 1 --schedules x --yes
stdout
(空)
stderr / error
invalid --schedules JSON: invalid character 'x' looking for beginning of value
最终用于判定的返回
invalid --schedules JSON: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1271ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test attendance +import-schedule --group-id 999999999999 --schedules '[{"userId":"202397","workDate":"2026-07-16 09:00:00","classId":999999999999,"isRest":"N"}]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/generateTurnSchedule)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0003",
+    "server_key": "attendance-wukong",
+    "trace_id": "2104a64c17840999034845189e085e"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/generateTurnSchedule)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0003",
+    "server_key": "attendance-wukong",
+    "trace_id": "2104a64c17840999034845189e085e"
+  }
+}
dws attendance +list-approve --users <users> --types <types> --start <start> --end <end>read
查询用户考勤审批单(补卡/加班/请假/出差外出)
dws mcp attendance query_user_approve --json '{"QueryUserApproveRequest":<..>, "userIds":<..>, "bizTypes":<..>, "fromDate":<..>, "toDate":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws attendance +list-approve --users x --types x --start x --end x --yes
stdout
(空)
stderr / error
日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
最终用于判定的返回
日期格式错误,应为 YYYY-MM-DD(如 2026-04-01): parsing time "x" as "2006-01-02": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1208ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +list-approve --users 202397 --types leave --start 2026-07-14 --end 2026-07-15 --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
dws attendance +list-leave-typesread
查询当前用户可用的假期规则列表
dws mcp attendance get_leave_types --json '{"McpLeaveTypeRequest":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_leave_types
输入 / CLI 输出
输入
dws attendance +list-leave-types --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "McpLeaveTypeRequest": {}
+  },
+  "product": "attendance-wukong",
+  "tool": "get_leave_types"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "McpLeaveTypeRequest": {}
+  },
+  "product": "attendance-wukong",
+  "tool": "get_leave_types"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1107ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +list-leave-types --yes --format json
真实 stdout
{
+  "result": [
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "754f72b4-0476-4e7d-ae4c-c46486268c5c",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "事假",
+      "leaveStatisticType": "freedom",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_hour",
+      "leaveViewUnit": "hour",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "a49f333e-275b-489a-8ec7-2c2000b81f35",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "调休",
+      "leaveStatisticType": "balance_cycle_freedom",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_hour",
+      "leaveViewUnit": "hour",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "5c4380ea-6f9c-4955-bbe6-bc0d114e4676",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "病假",
+      "leaveStatisticType": "freedom",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_hour",
+      "leaveViewUnit": "hour",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "731ed089-62ff-4734-a6c7-3c8fcc8294fc",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "年假",
+      "leaveStatisticType": "balance_cycle",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "halfDay",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "8a551c65-d3e1-4671-9eaf-78dd4645b8c3",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "产假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "day",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "904d3f51-1f73-4161-a50a-300d0009676d",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "陪产假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "day",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "05e2ba99-1916-4be9-8166-54f6a652e3bc",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "婚假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "day",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "b168cb41-fbca-4f28-8234-fc62e0b66a2b",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "例假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "halfDay",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "9daf653b-b3dd-46ef-a2b0-dd160bbf08c4",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "丧假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "day",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "3730df36-c05c-45e7-bac1-26b2ba137a25",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "哺乳假",
+      "leaveStatisticType": "freedom",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_hour",
+      "leaveViewUnit": "hour",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "result": [
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "754f72b4-0476-4e7d-ae4c-c46486268c5c",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "事假",
+      "leaveStatisticType": "freedom",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_hour",
+      "leaveViewUnit": "hour",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "a49f333e-275b-489a-8ec7-2c2000b81f35",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "调休",
+      "leaveStatisticType": "balance_cycle_freedom",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_hour",
+      "leaveViewUnit": "hour",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "5c4380ea-6f9c-4955-bbe6-bc0d114e4676",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "病假",
+      "leaveStatisticType": "freedom",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_hour",
+      "leaveViewUnit": "hour",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "731ed089-62ff-4734-a6c7-3c8fcc8294fc",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "年假",
+      "leaveStatisticType": "balance_cycle",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "halfDay",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "8a551c65-d3e1-4671-9eaf-78dd4645b8c3",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "产假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "day",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "904d3f51-1f73-4161-a50a-300d0009676d",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "陪产假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "day",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "05e2ba99-1916-4be9-8166-54f6a652e3bc",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "婚假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "day",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "b168cb41-fbca-4f28-8234-fc62e0b66a2b",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "例假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "halfDay",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "9daf653b-b3dd-46ef-a2b0-dd160bbf08c4",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "丧假",
+      "leaveStatisticType": "once_max",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_day",
+      "leaveViewUnit": "day",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    },
+    {
+      "allRecordCleanTime": null,
+      "bizType": null,
+      "corpId": "ding8196cd9a2b2405da24f2f5cc6abecb85",
+      "exsitFlag": "y",
+      "gmtCreate": 1650879712000,
+      "gmtModified": 1650879712000,
+      "leaveBalanceRuleVO": {},
+      "leaveCertificate": {},
+      "leaveCode": "3730df36-c05c-45e7-bac1-26b2ba137a25",
+      "leaveCycleStatisticInfoVO": {},
+      "leaveHourCeil": null,
+      "leaveName": "哺乳假",
+      "leaveStatisticType": "freedom",
+      "leaveStatus": "on",
+      "leaveTimeCeil": null,
+      "leaveTimeCeilMinUnit": null,
+      "leaveUnit": "percent_hour",
+      "leaveViewUnit": "hour",
+      "maxLeaveTime": null,
+      "minLeaveHour": null,
+      "naturalDayLeave": false,
+      "orderId": null,
+      "paidLeave": false,
+      "perHoursInDay": 0,
+      "remindRuleVO": {},
+      "source": "inner",
+      "submitTimeRuleVO": {},
+      "sysFlag": "n",
+      "userId": null,
+      "version": "1",
+      "visibilityRules": [],
+      "whenCanLeave": "entry"
+    }
+  ],
+  "success": true
+}
dws attendance +list-report-columnsread
获取企业考勤报表字段列表(仅管理员)
dws mcp attendance get_report_columns 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_report_columns
输入 / CLI 输出
输入
dws attendance +list-report-columns --yes
stdout
{
+  "_fake": true,
+  "args": {},
+  "product": "attendance-wukong",
+  "tool": "get_report_columns"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {},
+  "product": "attendance-wukong",
+  "tool": "get_report_columns"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1351ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test attendance +list-report-columns --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_report_columns)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "attendance-wukong",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"6001\",\"errorMsg\":\"无权限操作\"} ",
+    "trace_id": "2127d89817840997666188472e0756"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_report_columns)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "attendance-wukong",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"6001\",\"errorMsg\":\"无权限操作\"} ",
+    "trace_id": "2127d89817840997666188472e0756"
+  }
+}
dws attendance +my-attendanceread
查我今天的考勤打卡记录(打卡流水,自动解析当前用户)
dws mcp attendance <tool>dws attendance +my-attendanceread复合/智能型
查我今天的考勤打卡记录(打卡流水,自动解析当前用户)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_current_user_profile;没能解析出当前登录用户的 userId,无法查询你的打卡记录;请确认已登录后重试。
输入 / CLI 输出
输入
dws attendance +my-attendance --yes
stdout
(空)
stderr / error
没能解析出当前登录用户的 userId,无法查询你的打卡记录;请确认已登录后重试。
最终用于判定的返回
没能解析出当前登录用户的 userId,无法查询你的打卡记录;请确认已登录后重试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1169ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +my-attendance --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
dws attendance +query-report-data --users <users> --columns <columns> --start <start> --end <end>read
根据字段查询考勤报表数据(仅管理员)
dws mcp attendance get_report_columns_value --json '{"McpQueryParam":<..>, "targetUserIds":<..>, "columnIds":<..>, "fromDate":<..>, "toDate":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws attendance +query-report-data --users x --columns x --start x --end x --yes
stdout
(空)
stderr / error
--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
最终用于判定的返回
--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=998ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +query-report-data --users 202397 --columns 1001 --start '2026-07-15 10:00:00' --end '2026-07-15 16:00:00' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": [],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": [],
+  "success": true
+}
dws attendance +query-report-leave --users <users> --leave-names <leave-names> --start <start> --end <end>read
查询用户假期数据(仅管理员)
dws mcp attendance get_leave_time_by_leave_names --json '{"McpLeaveQueryParam":<..>, "targetUserIds":<..>, "leaveNames":<..>, "fromDate":<..>, "toDate":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws attendance +query-report-leave --users x --leave-names x --start x --end x --yes
stdout
(空)
stderr / error
--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
最终用于判定的返回
--start 格式错误,应为 yyyy-MM-dd HH:mm:ss: parsing time "x" as "2006-01-02 15:04:05": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1373ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test attendance +query-report-leave --users 202397 --leave-names '年假' --start '2026-07-15 10:00:00' --end '2026-07-15 16:00:00' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_leave_time_by_leave_names)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "attendance-wukong",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"6001\",\"errorMsg\":\"无权限操作\"} ",
+    "trace_id": "2104a64c17840997679973065e085f"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_leave_time_by_leave_names)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "attendance-wukong",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"6001\",\"errorMsg\":\"无权限操作\"} ",
+    "trace_id": "2104a64c17840997679973065e085f"
+  }
+}
dws attendance +save-leave-balance --target <target> --leave-code <leave-code> --num <num> --reason <reason> --start <start> --end <end>write
设置员工假期余额(SET 覆盖,非累加)
dws mcp attendance update_leave_balance --json '{"targetUserId":<..>, "leaveCode":<..>, "quotaNum":<..>, "reason":<..>, "McpUpdateLeaveBalanceRequest":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--num 格式错误: strconv.ParseFloat: parsing "x": invalid syntax(应为数字,如 8 或 7.5)
输入 / CLI 输出
输入
dws attendance +save-leave-balance --target x --leave-code x --num x --reason x --start x --end x --yes
stdout
(空)
stderr / error
--num 格式错误: strconv.ParseFloat: parsing "x": invalid syntax(应为数字,如 8 或 7.5)
最终用于判定的返回
--num 格式错误: strconv.ParseFloat: parsing "x": invalid syntax(应为数字,如 8 或 7.5)
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1081ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test attendance +save-leave-balance --target __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --leave-code DWSREALTESTNOSUCHID0000000000000 --num 1 --reason 'DWS shortcut 真实测试安全负向清理' --start 2026-07-16 --end 2026-08-14 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 无权更新指定员工的假期余额 (operation: attendance-wukong/update_leave_balance)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PERMISSION_DENIED",
+    "server_key": "attendance-wukong",
+    "trace_id": "2127d89817840999045751134e079c"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 无权更新指定员工的假期余额 (operation: attendance-wukong/update_leave_balance)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PERMISSION_DENIED",
+    "server_key": "attendance-wukong",
+    "trace_id": "2127d89817840999045751134e079c"
+  }
+}
dws attendance +search-adjustment-rule --query <query> --page <page> --limit <limit>read
查询当前用户可管理的补卡规则列表
dws mcp attendance <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_adjustment_rule
输入 / CLI 输出
输入
dws attendance +search-adjustment-rule --query x --page 1 --limit 1 --yes
stdout
{
+  "count": 0,
+  "rules": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "rules": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=985ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +search-adjustment-rule --query '测试' --page 1 --limit 10 --yes --format json
真实 stdout
{
+  "count": 0,
+  "rules": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "rules": []
+}
dws attendance +search-class --query <query> --filter-type <filter-type> --page <page> --limit <limit>read
查询当前用户可管理的班次详情列表
dws mcp attendance <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_class_list
输入 / CLI 输出
输入
dws attendance +search-class --query x --filter-type ALL --page 1 --limit 1 --yes
stdout
{
+  "classes": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "classes": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1043ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +search-class --query '测试' --filter-type ALL --page 1 --limit 10 --yes --format json
真实 stdout
{
+  "classes": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "classes": [],
+  "count": 0
+}
dws attendance +search-group --query <query> --type <type> --query-position <query-position> --query-ble <query-ble> --page <page> --limit <limit>read
查询当前用户可管理的考勤组列表
dws mcp attendance <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_simple_groups
输入 / CLI 输出
输入
dws attendance +search-group --query x --type FIXED --query-position --query-ble --page 1 --limit 1 --yes
stdout
{
+  "count": 0,
+  "groups": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "groups": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=939ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +search-group --query '测试' --type FIXED --query-position --query-ble --page 1 --limit 10 --yes --format json
真实 stdout
{
+  "count": 0,
+  "groups": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "groups": []
+}
dws attendance +search-overtime-rule --query <query> --page <page> --limit <limit>read
查询当前用户可管理的加班规则列表
dws mcp attendance <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/get_overtime_rule
输入 / CLI 输出
输入
dws attendance +search-overtime-rule --query x --page 1 --limit 1 --yes
stdout
{
+  "count": 0,
+  "rules": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "rules": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=997ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +search-overtime-rule --query '测试' --page 1 --limit 10 --yes --format json
真实 stdout
{
+  "count": 0,
+  "rules": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "rules": []
+}
dws attendance +this-monthread
查我本月的考勤打卡记录(打卡流水,自动解析当前用户)
dws mcp attendance <tool>dws attendance +this-monthread复合/智能型
查我本月的考勤打卡记录(打卡流水,自动解析当前用户)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_current_user_profile;没能解析出当前登录用户的 userId,无法查询你的打卡记录;请确认已登录后重试。
输入 / CLI 输出
输入
dws attendance +this-month --yes
stdout
(空)
stderr / error
没能解析出当前登录用户的 userId,无法查询你的打卡记录;请确认已登录后重试。
最终用于判定的返回
没能解析出当前登录用户的 userId,无法查询你的打卡记录;请确认已登录后重试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1108ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test attendance +this-month --yes --format json
真实 stdout
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "code": "0",
+  "message": "success",
+  "result": [],
+  "success": true
+}
dws attendance +update-class --class-id <class-id> --name <name> --owner <owner> --class-vo <class-vo>write
更新已有班次(仅传要修改的字段)
dws mcp attendance update_class_setting --json '{"TopAtClassVO":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --class-vo JSON: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws attendance +update-class --class-id 1 --name x --owner x --class-vo x --yes
stdout
(空)
stderr / error
invalid --class-vo JSON: invalid character 'x' looking for beginning of value
最终用于判定的返回
invalid --class-vo JSON: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1248ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test attendance +update-class --class-id 999999999999 --name 'DWS shortcut 真实测试 20260715-151724' --owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --class-vo '{"sections":[{"times":[{"checkType":"OnDuty","checkTime":"09:00","across":0},{"checkType":"OffDuty","checkTime":"18:00","across":0}]}]}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_class_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0001",
+    "server_key": "attendance-wukong",
+    "trace_id": "0b5deb3217840999058236471e08b5"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_class_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0001",
+    "server_key": "attendance-wukong",
+    "trace_id": "0b5deb3217840999058236471e08b5"
+  }
+}
dws attendance +update-group --group-id <group-id> --name <name> --type <type> --owner <owner> --enable-outside-check <enable-outside-check> --class-ids <class-ids> --group-vo <group-vo>write
更新考勤组配置(仅修改需要变更的字段)
dws mcp attendance update_group_setting --json '{"groupId":<..>, "groupVO":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --group-vo JSON: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws attendance +update-group --group-id 1 --name x --type FIXED --owner x --enable-outside-check true --class-ids x --group-vo x --yes
stdout
(空)
stderr / error
invalid --group-vo JSON: invalid character 'x' looking for beginning of value
最终用于判定的返回
invalid --group-vo JSON: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1175ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test attendance +update-group --group-id 999999999999 --name 'DWS shortcut 真实测试 20260715-151724' --type FIXED --owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --enable-outside-check true --class-ids '[999999999999]' --group-vo '{"defaultClassId":999999999999,"workDayClassList":[999999999999,999999999999,999999999999,999999999999,999999999999,0,0]}' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0001",
+    "server_key": "attendance-wukong",
+    "trace_id": "0b5deb3217840999068826691e087a"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_setting)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0001",
+    "server_key": "attendance-wukong",
+    "trace_id": "0b5deb3217840999068826691e087a"
+  }
+}
dws attendance +update-group-members --group-id <group-id> --add-users <add-users> --remove-users <remove-users> --add-extra-users <add-extra-users> --remove-extra-users <remove-extra-users> --add-depts <add-depts> --remove-depts <remove-depts>write
更新考勤组成员(增删考勤人员/部门/无需考勤人员)
dws mcp attendance update_group_member --json '{"groupId":<..>, "updateParam":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;attendance-wukong/update_group_member
输入 / CLI 输出
输入
dws attendance +update-group-members --group-id 1 --add-users x --remove-users x --add-extra-users x --remove-extra-users x --add-depts x --remove-depts x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "groupId": 1,
+    "updateParam": {
+      "addDepts": [
+        "x"
+      ],
+      "addExtraUsers": [
+        "x"
+      ],
+      "addUsers": [
+        "x"
+      ],
+      "removeDepts": [
+        "x"
+      ],
+      "removeExtraUsers": [
+        "x"
+      ],
+      "removeUsers": [
+        "x"
+      ]
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "update_group_member"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "groupId": 1,
+    "updateParam": {
+      "addDepts": [
+        "x"
+      ],
+      "addExtraUsers": [
+        "x"
+      ],
+      "addUsers": [
+        "x"
+      ],
+      "removeDepts": [
+        "x"
+      ],
+      "removeExtraUsers": [
+        "x"
+      ],
+      "removeUsers": [
+        "x"
+      ]
+    }
+  },
+  "product": "attendance-wukong",
+  "tool": "update_group_member"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1170ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test attendance +update-group-members --group-id 999999999999 --add-users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --remove-users '' --add-extra-users '' --remove-extra-users '' --add-depts '' --remove-depts '' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_member)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0002",
+    "server_key": "attendance-wukong",
+    "trace_id": "2127d89817840999081094644e07dd"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_member)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "S0002",
+    "server_key": "attendance-wukong",
+    "trace_id": "2127d89817840999081094644e07dd"
+  }
+}
dws attendance +update-leave-type --leave-code <leave-code> --name <name> --unit <unit> --paid <paid> --per-hours <per-hours> --when-can-leave <when-can-leave> --visibility-rules <visibility-rules>write
更新已有假期规则(仅传要修改的字段)
dws mcp attendance save_leave_type --json '{"leaveCode":<..>, "McpSaveLeaveTypeRequest":<..>}' 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --visibility-rules JSON: invalid character 'x' looking for beginning of value
输入 / CLI 输出
输入
dws attendance +update-leave-type --leave-code x --name x --unit day --paid --per-hours 1 --when-can-leave entry --visibility-rules x --yes
stdout
(空)
stderr / error
invalid --visibility-rules JSON: invalid character 'x' looking for beginning of value
最终用于判定的返回
invalid --visibility-rules JSON: invalid character 'x' looking for beginning of value
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1208ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test attendance +update-leave-type --leave-code DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --unit day --paid --per-hours 1 --when-can-leave entry --visibility-rules '[{"type":"dept","visible":["-1"]}]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: attendance-wukong/save_leave_type)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "INVALID_PARAMS",
+    "server_key": "attendance-wukong",
+    "trace_id": "0bb7c36217840999093924897e07fe"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: attendance-wukong/save_leave_type)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "INVALID_PARAMS",
+    "server_key": "attendance-wukong",
+    "trace_id": "0bb7c36217840999093924897e07fe"
+  }
+}

devapp · 30 个 · ↔ lark apps

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws devapp +create --name <name> --desc <desc> --icon-media-id <icon-media-id>write
创建开放平台企业内部应用
dws mcp devapp create_dev_app --json '{"name":<..>, "desc":<..>, "iconMediaId":<..>}' lark-cli apps +create已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/create_dev_app
输入 / CLI 输出
输入
dws devapp +create --name x --desc x --icon-media-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "desc": "x",
+    "iconMediaId": "x",
+    "name": "x"
+  },
+  "product": "devapp",
+  "tool": "create_dev_app"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "desc": "x",
+    "iconMediaId": "x",
+    "name": "x"
+  },
+  "product": "devapp",
+  "tool": "create_dev_app"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1464ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +create --name 'DWS测试应用0715' --desc 'DWS shortcut 真实测试,可删除' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "appKey": "dingyqsdchocxp3xrfm3",
+    "desc": "DWS shortcut 真实测试,可删除",
+    "icon": "@lADPDfmVQafoVxrMyMzI",
+    "iconUrl": "https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg",
+    "name": "DWS测试应用0715",
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "appKey": "dingyqsdchocxp3xrfm3",
+    "desc": "DWS shortcut 真实测试,可删除",
+    "icon": "@lADPDfmVQafoVxrMyMzI",
+    "iconUrl": "https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg",
+    "name": "DWS测试应用0715",
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
dws devapp +credentials-get --unified-app-id <unified-app-id>read
读取开放平台应用凭证
dws mcp devapp get_dev_app_credentials --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/get_dev_app_credentials
输入 / CLI 输出
输入
dws devapp +credentials-get --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_dev_app_credentials"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_dev_app_credentials"
+}
真实后端测试输入 / 输出待真实执行
exit=None;duration=0ms;held; sensitive credential read
失败归因 / 可修复性
人工授权后执行 / 需人工授权
+高风险或无安全目标,需人工逐项授权后执行。
真实输入
真实 stdout
(空)
真实 stderr / error
该命令会读取真实应用凭证/密钥;不能用真实 app 自动执行。当前仅用占位 ID 验证负向路径,真实成功需人工在安全环境单独确认。
真实返回
该命令会读取真实应用凭证/密钥;不能用真实 app 自动执行。当前仅用占位 ID 验证负向路径,真实成功需人工在安全环境单独确认。
dws devapp +delete --unified-app-id <unified-app-id>high-risk-write
删除开放平台企业内部应用(不可逆)
dws mcp devapp delete_dev_app --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/delete_dev_app
输入 / CLI 输出
输入
dws devapp +delete --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "delete_dev_app"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "delete_dev_app"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2868ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +delete --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "deleted": true,
+    "message": "应用删除成功。",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "deleted": true,
+    "message": "应用删除成功。",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
dws devapp +disable --unified-app-id <unified-app-id>high-risk-write
停用开放平台企业内部应用
dws mcp devapp disable_dev_app --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/disable_dev_app
输入 / CLI 输出
输入
dws devapp +disable --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "disable_dev_app"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "disable_dev_app"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2583ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +disable --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "message": "应用已停用。",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "message": "应用已停用。",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
dws devapp +enable --unified-app-id <unified-app-id>write
启用开放平台企业内部应用
dws mcp devapp enable_dev_app --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/enable_dev_app
输入 / CLI 输出
输入
dws devapp +enable --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "enable_dev_app"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "enable_dev_app"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1506ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +enable --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "message": "应用已启用。",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "message": "应用已启用。",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
dws devapp +event-list --unified-app-id <unified-app-id> --keyword <keyword>read
查询应用已订阅的事件列表
dws mcp devapp <tool> lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/list_dev_app_events
输入 / CLI 输出
输入
dws devapp +event-list --unified-app-id x --keyword x --cursor x --page-size 1 --yes
stdout
{
+  "count": 0,
+  "events": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "events": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1214ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +event-list --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --keyword '测试' --cursor '' --page-size 10 --yes --format json
真实 stdout
{
+  "count": 0,
+  "events": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "events": []
+}
dws devapp +event-subscribe --unified-app-id <unified-app-id> --event-codes <event-codes>write
订阅应用事件回调
dws mcp devapp subscribe_dev_app_events --json '{"unifiedAppId":<..>, "eventCodes":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/subscribe_dev_app_events
输入 / CLI 输出
输入
dws devapp +event-subscribe --unified-app-id x --event-codes x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "eventCodes": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "subscribe_dev_app_events"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "eventCodes": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "subscribe_dev_app_events"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1034ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test devapp +event-subscribe --unified-app-id DWSREALTESTNOSUCHID0000000000000 --event-codes '[]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户没有应用事件订阅权限 (operation: devapp/subscribe_dev_app_events)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "503",
+    "server_key": "devapp",
+    "trace_id": "2104a64c17840999564022020e08c7"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户没有应用事件订阅权限 (operation: devapp/subscribe_dev_app_events)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "503",
+    "server_key": "devapp",
+    "trace_id": "2104a64c17840999564022020e08c7"
+  }
+}
dws devapp +event-unsubscribe --unified-app-id <unified-app-id> --event-codes <event-codes>high-risk-write
取消订阅应用事件
dws mcp devapp unsubscribe_dev_app_events --json '{"unifiedAppId":<..>, "eventCodes":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/unsubscribe_dev_app_events
输入 / CLI 输出
输入
dws devapp +event-unsubscribe --unified-app-id x --event-codes x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "eventCodes": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "unsubscribe_dev_app_events"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "eventCodes": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "unsubscribe_dev_app_events"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1134ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test devapp +event-unsubscribe --unified-app-id DWSREALTESTNOSUCHID0000000000000 --event-codes '[]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/unsubscribe_dev_app_events)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"503\",\"errorMsg\":\"当前用户没有应用事件订阅权限\"} ",
+    "trace_id": "0bb7c36217840999575698500e07db"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/unsubscribe_dev_app_events)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"503\",\"errorMsg\":\"当前用户没有应用事件订阅权限\"} ",
+    "trace_id": "0bb7c36217840999575698500e07db"
+  }
+}
dws devapp +get --unified-app-id <unified-app-id>read
查询开放平台企业内部应用详情
dws mcp devapp get_dev_app --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/get_dev_app
输入 / CLI 输出
输入
dws devapp +get --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_dev_app"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_dev_app"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1268ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +get --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "appKey": "dingdtqbtxgtn2r5uyge",
+    "appStatus": "normal",
+    "canDelete": true,
+    "canUpdate": true,
+    "creator": "董鑫阳",
+    "desc": "DTDennisLobster",
+    "gmtCreate": "2026-03-06 10:41:40",
+    "gmtModified": "2026-03-06 10:41:40",
+    "icon": "@lADPDfmVQafoVxrMyMzI",
+    "iconUrl": "https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg",
+    "name": "DTDennisLobster",
+    "supportHarmony": false,
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552",
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "appKey": "dingdtqbtxgtn2r5uyge",
+    "appStatus": "normal",
+    "canDelete": true,
+    "canUpdate": true,
+    "creator": "董鑫阳",
+    "desc": "DTDennisLobster",
+    "gmtCreate": "2026-03-06 10:41:40",
+    "gmtModified": "2026-03-06 10:41:40",
+    "icon": "@lADPDfmVQafoVxrMyMzI",
+    "iconUrl": "https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg",
+    "name": "DTDennisLobster",
+    "supportHarmony": false,
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552",
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
dws devapp +list --name <name> --app-key <app-key> --app-group-id <app-group-id> --creator <creator> --robot-name <robot-name> --develop-type <develop-type> --filter-cool-app <filter-cool-app> --sort-type <sort-type> --sort-order <sort-order>read
查询开放平台企业内部应用列表
dws mcp devapp <tool> lark-cli apps +list已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/list_dev_app
输入 / CLI 输出
输入
dws devapp +list --name x --app-key x --app-group-id 1 --creator x --robot-name x --develop-type 1 --filter-cool-app 1 --sort-type x --sort-order x --cursor x --page-size 1 --yes
stdout
{
+  "apps": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "apps": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=8524ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +list --name 'DWS shortcut 真实测试' --app-key x --app-group-id 1 --creator x --robot-name x --develop-type 1 --filter-cool-app 1 --sort-type x --sort-order x --cursor '' --page-size 10 --yes --format json
真实 stdout
{
+  "apps": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "apps": [],
+  "count": 0
+}
dws devapp +member-add --unified-app-id <unified-app-id> --user-ids <user-ids> --member-type <member-type>write
添加开放平台应用成员
dws mcp devapp add_dev_app_members --json '{"unifiedAppId":<..>, "userIds":<..>, "memberType":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/add_dev_app_members
输入 / CLI 输出
输入
dws devapp +member-add --unified-app-id x --user-ids x --member-type x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "memberType": "x",
+    "unifiedAppId": "x",
+    "userIds": [
+      "x"
+    ]
+  },
+  "product": "devapp",
+  "tool": "add_dev_app_members"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "memberType": "x",
+    "unifiedAppId": "x",
+    "userIds": [
+      "x"
+    ]
+  },
+  "product": "devapp",
+  "tool": "add_dev_app_members"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2393ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +member-add --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --user-ids 103262 --member-type DEVELOPER --yes --format json
真实 stdout
{
+  "memberType": "DEVELOPER",
+  "operation": "ADDED",
+  "success": true,
+  "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692",
+  "userIds": [
+    "103262"
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "memberType": "DEVELOPER",
+  "operation": "ADDED",
+  "success": true,
+  "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692",
+  "userIds": [
+    "103262"
+  ]
+}
dws devapp +member-list --unified-app-id <unified-app-id>read
查询开放平台应用成员
dws mcp devapp list_dev_app_members --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/list_dev_app_members
输入 / CLI 输出
输入
dws devapp +member-list --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "list_dev_app_members"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "list_dev_app_members"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1404ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +member-list --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --yes --format json
真实 stdout
{
+  "members": [
+    {
+      "memberType": "OWNER",
+      "name": "董鑫阳",
+      "userId": "202397"
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "members": [
+    {
+      "memberType": "OWNER",
+      "name": "董鑫阳",
+      "userId": "202397"
+    }
+  ],
+  "success": true
+}
dws devapp +member-remove --unified-app-id <unified-app-id> --user-ids <user-ids> --member-type <member-type>high-risk-write
移除开放平台应用成员
dws mcp devapp remove_dev_app_members --json '{"unifiedAppId":<..>, "userIds":<..>, "memberType":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/remove_dev_app_members
输入 / CLI 输出
输入
dws devapp +member-remove --unified-app-id x --user-ids x --member-type x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "memberType": "x",
+    "unifiedAppId": "x",
+    "userIds": [
+      "x"
+    ]
+  },
+  "product": "devapp",
+  "tool": "remove_dev_app_members"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "memberType": "x",
+    "unifiedAppId": "x",
+    "userIds": [
+      "x"
+    ]
+  },
+  "product": "devapp",
+  "tool": "remove_dev_app_members"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1188ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +member-remove --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --user-ids 103262 --member-type DEVELOPER --yes --format json
真实 stdout
{
+  "memberType": "DEVELOPER",
+  "operation": "REMOVED",
+  "success": true,
+  "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692",
+  "userIds": [
+    "103262"
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "memberType": "DEVELOPER",
+  "operation": "REMOVED",
+  "success": true,
+  "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692",
+  "userIds": [
+    "103262"
+  ]
+}
dws devapp +permission-add --unified-app-id <unified-app-id> --scope-values <scope-values>write
申请开放平台应用权限点
dws mcp devapp apply_dev_app_permissions --json '{"unifiedAppId":<..>, "scopeValues":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/apply_dev_app_permissions
输入 / CLI 输出
输入
dws devapp +permission-add --unified-app-id x --scope-values x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "scopeValues": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "apply_dev_app_permissions"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "scopeValues": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "apply_dev_app_permissions"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1186ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test devapp +permission-add --unified-app-id DWSREALTESTNOSUCHID0000000000000 --scope-values '[]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/apply_dev_app_permissions)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "503",
+    "server_key": "devapp",
+    "trace_id": "2127d89817840999587758457e079c"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/apply_dev_app_permissions)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "503",
+    "server_key": "devapp",
+    "trace_id": "2127d89817840999587758457e079c"
+  }
+}
dws devapp +permission-list --unified-app-id <unified-app-id> --keyword <keyword> --scope-value <scope-value> --auth-status <auth-status> --scope-type <scope-type> --api-status <api-status>read
查询开放平台应用权限列表
dws mcp devapp <tool> lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/list_dev_app_permissions
输入 / CLI 输出
输入
dws devapp +permission-list --unified-app-id x --keyword x --scope-value x --auth-status x --scope-type x --api-status x --cursor x --page-size 1 --yes
stdout
{
+  "count": 0,
+  "permissions": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "permissions": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1578ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +permission-list --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --keyword '测试' --auth-status ALL --cursor '' --page-size 10 --yes --format json
真实 stdout
{
+  "count": 0,
+  "permissions": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "permissions": []
+}
dws devapp +permission-remove --unified-app-id <unified-app-id> --scope-values <scope-values>high-risk-write
取消开放平台应用权限点
dws mcp devapp remove_dev_app_permissions --json '{"unifiedAppId":<..>, "scopeValues":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/remove_dev_app_permissions
输入 / CLI 输出
输入
dws devapp +permission-remove --unified-app-id x --scope-values x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "scopeValues": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "remove_dev_app_permissions"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "scopeValues": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "remove_dev_app_permissions"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1061ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test devapp +permission-remove --unified-app-id DWSREALTESTNOSUCHID0000000000000 --scope-values '[]' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/remove_dev_app_permissions)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "503",
+    "server_key": "devapp",
+    "trace_id": "2104a64c17840999598445247e085e"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/remove_dev_app_permissions)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "503",
+    "server_key": "devapp",
+    "trace_id": "2104a64c17840999598445247e085e"
+  }
+}
dws devapp +robot-config --unified-app-id <unified-app-id> --name <name> --brief <brief> --desc <desc> --icon-media-id <icon-media-id> --outgoing-url <outgoing-url> --event-callback-url <event-callback-url> --mode <mode> --skills <skills> --add-scope <add-scope> --disable-ssl-verify <disable-ssl-verify>write
创建或更新现有应用的机器人配置(upsert)
dws mcp devapp set_extension_robot_config --json '{"unifiedAppId":<..>, "name":<..>, "brief":<..>, "desc":<..>, "iconMediaId":<..>, "outgoingUrl":<..>, "eventCallbackUrl":<..>, "mode":<..>, "skills":<..>, "addScope":<..>, "disableSSLVerify":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/set_extension_robot_config
输入 / CLI 输出
输入
dws devapp +robot-config --unified-app-id x --name x --brief x --desc x --icon-media-id x --outgoing-url x --event-callback-url x --mode HTTPS --skills x --add-scope --disable-ssl-verify --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "addScope": true,
+    "brief": "x",
+    "desc": "x",
+    "disableSSLVerify": true,
+    "eventCallbackUrl": "x",
+    "iconMediaId": "x",
+    "mode": "HTTPS",
+    "name": "x",
+    "outgoingUrl": "x",
+    "skills": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "set_extension_robot_config"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "addScope": true,
+    "brief": "x",
+    "desc": "x",
+    "disableSSLVerify": true,
+    "eventCallbackUrl": "x",
+    "iconMediaId": "x",
+    "mode": "HTTPS",
+    "name": "x",
+    "outgoingUrl": "x",
+    "skills": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "set_extension_robot_config"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1167ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test devapp +robot-config --unified-app-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --brief x --desc 'DWS shortcut 真实测试描述,可删除' --icon-media-id DWSREALTESTNOSUCHID0000000000000 --outgoing-url https://example.invalid/dws-shortcut-real-test --event-callback-url https://example.invalid/dws-shortcut-real-test --mode HTTPS --skills '[]' --add-scope --disable-ssl-verify --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/set_extension_robot_config)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"503\",\"errorMsg\":\"当前用户没有应用机器人配置权限\"} ",
+    "trace_id": "0bb7c36217840999609828961e07db"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/set_extension_robot_config)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"503\",\"errorMsg\":\"当前用户没有应用机器人配置权限\"} ",
+    "trace_id": "0bb7c36217840999609828961e07db"
+  }
+}
dws devapp +robot-disable --unified-app-id <unified-app-id>high-risk-write
停用现有应用的机器人能力
dws mcp devapp disable_dev_app_robot --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/disable_dev_app_robot
输入 / CLI 输出
输入
dws devapp +robot-disable --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "disable_dev_app_robot"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "disable_dev_app_robot"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1062ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test devapp +robot-disable --unified-app-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/disable_dev_app_robot)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"503\",\"errorMsg\":\"当前用户没有应用机器人配置权限\"} ",
+    "trace_id": "2104a64c17840999620461113e08ee"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/disable_dev_app_robot)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"503\",\"errorMsg\":\"当前用户没有应用机器人配置权限\"} ",
+    "trace_id": "2104a64c17840999620461113e08ee"
+  }
+}
dws devapp +robot-enable --unified-app-id <unified-app-id>write
启用现有应用机器人能力(纯启用,无需配置字段)
dws mcp devapp enable_dev_app_robot --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/enable_dev_app_robot
输入 / CLI 输出
输入
dws devapp +robot-enable --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "enable_dev_app_robot"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "enable_dev_app_robot"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1306ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test devapp +robot-enable --unified-app-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/enable_dev_app_robot)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"503\",\"errorMsg\":\"当前用户没有应用机器人配置权限\"} ",
+    "trace_id": "0bb7c36217840999632641525e0758"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/enable_dev_app_robot)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "AUTH_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"503\",\"errorMsg\":\"当前用户没有应用机器人配置权限\"} ",
+    "trace_id": "0bb7c36217840999632641525e0758"
+  }
+}
dws devapp +robot-get --unified-app-id <unified-app-id>read
查询现有应用的机器人配置
dws mcp devapp get_extension_robot_config --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/get_extension_robot_config
输入 / CLI 输出
输入
dws devapp +robot-get --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_extension_robot_config"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_extension_robot_config"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1204ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +robot-get --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "configured": false,
+    "message": "应用未配置机器人。",
+    "robotStatus": "UNCONFIGURED",
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "configured": false,
+    "message": "应用未配置机器人。",
+    "robotStatus": "UNCONFIGURED",
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552"
+  },
+  "success": true
+}
dws devapp +security-config --unified-app-id <unified-app-id> --ip-whitelist <ip-whitelist> --redirect-urls <redirect-urls> --sso-urls <sso-urls>write
更新开放平台应用安全配置(整组覆盖,非追加)
dws mcp devapp update_dev_app_security_config --json '{"unifiedAppId":<..>, "ipWhitelist":<..>, "redirectUrls":<..>, "ssoUrls":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/update_dev_app_security_config
输入 / CLI 输出
输入
dws devapp +security-config --unified-app-id x --ip-whitelist x --redirect-urls x --sso-urls x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "ipWhitelist": [
+      "x"
+    ],
+    "redirectUrls": [
+      "x"
+    ],
+    "ssoUrls": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "update_dev_app_security_config"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "ipWhitelist": [
+      "x"
+    ],
+    "redirectUrls": [
+      "x"
+    ],
+    "ssoUrls": [
+      "x"
+    ],
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "update_dev_app_security_config"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1205ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test devapp +security-config --unified-app-id DWSREALTESTNOSUCHID0000000000000 --ip-whitelist 127.0.0.1 --redirect-urls https://example.invalid/dws-shortcut-real-test --sso-urls https://example.invalid/dws-shortcut-real-test --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/update_dev_app_security_config)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "503",
+    "server_key": "devapp",
+    "trace_id": "2104a64c17840999645522046e0817"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/update_dev_app_security_config)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "503",
+    "server_key": "devapp",
+    "trace_id": "2104a64c17840999645522046e0817"
+  }
+}
dws devapp +update --unified-app-id <unified-app-id> --name <name> --desc <desc> --icon-media-id <icon-media-id>write
修改开放平台企业内部应用基础信息
dws mcp devapp update_dev_app --json '{"unifiedAppId":<..>, "name":<..>, "desc":<..>, "iconMediaId":<..>}' lark-cli apps +update已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/update_dev_app
输入 / CLI 输出
输入
dws devapp +update --unified-app-id x --name x --desc x --icon-media-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "desc": "x",
+    "iconMediaId": "x",
+    "name": "x",
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "update_dev_app"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "desc": "x",
+    "iconMediaId": "x",
+    "name": "x",
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "update_dev_app"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=5611ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +update --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --name 'DWS测试应用0715改' --desc 'DWS shortcut 真实测试已更新' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "appKey": "dingyqsdchocxp3xrfm3",
+    "desc": "DWS shortcut 真实测试已更新",
+    "icon": "@lADPDfmVQafoVxrMyMzI",
+    "iconUrl": "https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg",
+    "message": "应用基础信息更新成功。",
+    "name": "DWS测试应用0715改",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692",
+    "updatedFields": [
+      "name",
+      "desc"
+    ],
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "appKey": "dingyqsdchocxp3xrfm3",
+    "desc": "DWS shortcut 真实测试已更新",
+    "icon": "@lADPDfmVQafoVxrMyMzI",
+    "iconUrl": "https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg",
+    "message": "应用基础信息更新成功。",
+    "name": "DWS测试应用0715改",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692",
+    "updatedFields": [
+      "name",
+      "desc"
+    ],
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
dws devapp +version-check-approval --unified-app-id <unified-app-id> --version-id <version-id>read
预检版本发布是否需要审批(不实际发布)
dws mcp devapp publish_dev_app_version --json '{"unifiedAppId":<..>, "versionId":<..>, "precheckOnly":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/publish_dev_app_version
输入 / CLI 输出
输入
dws devapp +version-check-approval --unified-app-id x --version-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "precheckOnly": true,
+    "unifiedAppId": "x",
+    "versionId": "x"
+  },
+  "product": "devapp",
+  "tool": "publish_dev_app_version"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "precheckOnly": true,
+    "unifiedAppId": "x",
+    "versionId": "x"
+  },
+  "product": "devapp",
+  "tool": "publish_dev_app_version"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2081ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +version-check-approval --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --version-id 4743accb-45e2-4bc9-8c96-74fc62ace2e8 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "approvalCandidates": [
+      {
+        "mainAdmin": false,
+        "name": "王军",
+        "userId": "084896"
+      },
+      {
+        "mainAdmin": false,
+        "name": "尤坤",
+        "userId": "425982"
+      },
+      {
+        "mainAdmin": false,
+        "name": "贺汝坤",
+        "userId": "453209"
+      },
+      {
+        "mainAdmin": false,
+        "name": "倪爽",
+        "userId": "443841"
+      },
+      {
+        "mainAdmin": false,
+        "name": "谢传贵",
+        "userId": "014823"
+      },
+      {
+        "mainAdmin": false,
+        "name": "史伟民",
+        "userId": "188288"
+      },
+      {
+        "mainAdmin": false,
+        "name": "郭迪",
+        "userId": "452337"
+      },
+      {
+        "mainAdmin": false,
+        "name": "周子杰",
+        "userId": "312753"
+      },
+      {
+        "mainAdmin": false,
+        "name": "刘畅",
+        "userId": "068373"
+      },
+      {
+        "mainAdmin": false,
+        "name": "张磊",
+        "userId": "371811"
+      },
+      {
+        "mainAdmin": false,
+        "name": "霍俊龙",
+        "userId": "068428"
+      },
+      {
+        "mainAdmin": false,
+        "name": "李晓军",
+        "userId": "004897"
+      },
+      {
+        "mainAdmin": false,
+        "name": "姚海龙",
+        "userId": "107578"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王丽丽",
+        "userId": "246929"
+      },
+      {
+        "mainAdmin": false,
+        "name": "李恺杰",
+        "userId": "272720"
+      },
+      {
+        "mainAdmin": false,
+        "name": "夏东翔",
+        "userId": "103262"
+      },
+      {
+        "mainAdmin": false,
+        "name": "朱鸿",
+        "userId": "024083"
+      },
+      {
+        "mainAdmin": false,
+        "name": "叶冬",
+        "userId": "371817"
+      },
+      {
+        "mainAdmin": false,
+        "name": "任卿",
+        "userId": "006792"
+      },
+      {
+        "mainAdmin": false,
+        "name": "彭家俊",
+        "userId": "225893"
+      },
+      {
+        "mainAdmin": false,
+        "name": "刘蓓蓓",
+        "userId": "074268"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王耀波",
+        "userId": "220629"
+      },
+      {
+        "mainAdmin": false,
+        "name": "夏烈阳",
+        "userId": "176371"
+      },
+      {
+        "mainAdmin": false,
+        "name": "魏玉科",
+        "userId": "061331"
+      },
+      {
+        "mainAdmin": false,
+        "name": "张晨阳",
+        "userId": "244717"
+      },
+      {
+        "mainAdmin": false,
+        "name": "李祎嵩",
+        "userId": "238863"
+      },
+      {
+        "mainAdmin": false,
+        "name": "吕思霖",
+        "userId": "193021"
+      },
+      {
+        "mainAdmin": false,
+        "name": "宋宜涛",
+        "userId": "037168"
+      },
+      {
+        "mainAdmin": false,
+        "name": "李红军",
+        "userId": "133206"
+      },
+      {
+        "mainAdmin": false,
+        "name": "沈运亮",
+        "userId": "101595"
+      },
+      {
+        "mainAdmin": false,
+        "name": "桂明月",
+        "userId": "077725"
+      },
+      {
+        "mainAdmin": false,
+        "name": "吴芳祥",
+        "userId": "074360"
+      },
+      {
+        "mainAdmin": false,
+        "name": "赵召航",
+        "userId": "044473"
+      },
+      {
+        "mainAdmin": false,
+        "name": "黄文奇",
+        "userId": "270175"
+      },
+      {
+        "mainAdmin": false,
+        "name": "董金威",
+        "userId": "085729"
+      },
+      {
+        "mainAdmin": false,
+        "name": "孙博文",
+        "userId": "034766"
+      },
+      {
+        "mainAdmin": false,
+        "name": "朱通",
+        "userId": "327979"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王帅军",
+        "userId": "061731"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王海旭",
+        "userId": "273048"
+      },
+      {
+        "mainAdmin": false,
+        "name": "欧阳德仁",
+        "userId": "167272"
+      },
+      {
+        "mainAdmin": false,
+        "name": "冯汝伟",
+        "userId": "124456"
+      },
+      {
+        "mainAdmin": false,
+        "name": "刘啸天",
+        "userId": "314418"
+      },
+      {
+        "mainAdmin": false,
+        "name": "杨期",
+        "userId": "028611"
+      },
+      {
+        "mainAdmin": false,
+        "name": "宋华青",
+        "userId": "054469"
+      },
+      {
+        "mainAdmin": false,
+        "name": "俞福春",
+        "userId": "424920"
+      },
+      {
+        "mainAdmin": false,
+        "name": "汤素文",
+        "userId": "088045"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王摧",
+        "userId": "141842"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王鸣霏",
+        "userId": "184163"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王兵",
+        "userId": "135976"
+      },
+      {
+        "mainAdmin": false,
+        "name": "周剑云",
+        "userId": "164217"
+      },
+      {
+        "mainAdmin": false,
+        "name": "沈国勋",
+        "userId": "026247"
+      },
+      {
+        "mainAdmin": false,
+        "name": "高阿娜",
+        "userId": "001423"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王森",
+        "userId": "045981"
+      },
+      {
+        "mainAdmin": false,
+        "name": "林朋",
+        "userId": "236891"
+      }
+    ],
+    "approvalMode": "SELECT_APPROVER",
+    "approvalSubmitted": false,
+    "publishable": false,
+    "published": false,
+    "requiresApproval": true,
+    "sensitive": false,
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552",
+    "version": "1.0.0",
+    "versionId": "4743accb-45e2-4bc9-8c96-74fc62ace2e8",
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "approvalCandidates": [
+      {
+        "mainAdmin": false,
+        "name": "王军",
+        "userId": "084896"
+      },
+      {
+        "mainAdmin": false,
+        "name": "尤坤",
+        "userId": "425982"
+      },
+      {
+        "mainAdmin": false,
+        "name": "贺汝坤",
+        "userId": "453209"
+      },
+      {
+        "mainAdmin": false,
+        "name": "倪爽",
+        "userId": "443841"
+      },
+      {
+        "mainAdmin": false,
+        "name": "谢传贵",
+        "userId": "014823"
+      },
+      {
+        "mainAdmin": false,
+        "name": "史伟民",
+        "userId": "188288"
+      },
+      {
+        "mainAdmin": false,
+        "name": "郭迪",
+        "userId": "452337"
+      },
+      {
+        "mainAdmin": false,
+        "name": "周子杰",
+        "userId": "312753"
+      },
+      {
+        "mainAdmin": false,
+        "name": "刘畅",
+        "userId": "068373"
+      },
+      {
+        "mainAdmin": false,
+        "name": "张磊",
+        "userId": "371811"
+      },
+      {
+        "mainAdmin": false,
+        "name": "霍俊龙",
+        "userId": "068428"
+      },
+      {
+        "mainAdmin": false,
+        "name": "李晓军",
+        "userId": "004897"
+      },
+      {
+        "mainAdmin": false,
+        "name": "姚海龙",
+        "userId": "107578"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王丽丽",
+        "userId": "246929"
+      },
+      {
+        "mainAdmin": false,
+        "name": "李恺杰",
+        "userId": "272720"
+      },
+      {
+        "mainAdmin": false,
+        "name": "夏东翔",
+        "userId": "103262"
+      },
+      {
+        "mainAdmin": false,
+        "name": "朱鸿",
+        "userId": "024083"
+      },
+      {
+        "mainAdmin": false,
+        "name": "叶冬",
+        "userId": "371817"
+      },
+      {
+        "mainAdmin": false,
+        "name": "任卿",
+        "userId": "006792"
+      },
+      {
+        "mainAdmin": false,
+        "name": "彭家俊",
+        "userId": "225893"
+      },
+      {
+        "mainAdmin": false,
+        "name": "刘蓓蓓",
+        "userId": "074268"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王耀波",
+        "userId": "220629"
+      },
+      {
+        "mainAdmin": false,
+        "name": "夏烈阳",
+        "userId": "176371"
+      },
+      {
+        "mainAdmin": false,
+        "name": "魏玉科",
+        "userId": "061331"
+      },
+      {
+        "mainAdmin": false,
+        "name": "张晨阳",
+        "userId": "244717"
+      },
+      {
+        "mainAdmin": false,
+        "name": "李祎嵩",
+        "userId": "238863"
+      },
+      {
+        "mainAdmin": false,
+        "name": "吕思霖",
+        "userId": "193021"
+      },
+      {
+        "mainAdmin": false,
+        "name": "宋宜涛",
+        "userId": "037168"
+      },
+      {
+        "mainAdmin": false,
+        "name": "李红军",
+        "userId": "133206"
+      },
+      {
+        "mainAdmin": false,
+        "name": "沈运亮",
+        "userId": "101595"
+      },
+      {
+        "mainAdmin": false,
+        "name": "桂明月",
+        "userId": "077725"
+      },
+      {
+        "mainAdmin": false,
+        "name": "吴芳祥",
+        "userId": "074360"
+      },
+      {
+        "mainAdmin": false,
+        "name": "赵召航",
+        "userId": "044473"
+      },
+      {
+        "mainAdmin": false,
+        "name": "黄文奇",
+        "userId": "270175"
+      },
+      {
+        "mainAdmin": false,
+        "name": "董金威",
+        "userId": "085729"
+      },
+      {
+        "mainAdmin": false,
+        "name": "孙博文",
+        "userId": "034766"
+      },
+      {
+        "mainAdmin": false,
+        "name": "朱通",
+        "userId": "327979"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王帅军",
+        "userId": "061731"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王海旭",
+        "userId": "273048"
+      },
+      {
+        "mainAdmin": false,
+        "name": "欧阳德仁",
+        "userId": "167272"
+      },
+      {
+        "mainAdmin": false,
+        "name": "冯汝伟",
+        "userId": "124456"
+      },
+      {
+        "mainAdmin": false,
+        "name": "刘啸天",
+        "userId": "314418"
+      },
+      {
+        "mainAdmin": false,
+        "name": "杨期",
+        "userId": "028611"
+      },
+      {
+        "mainAdmin": false,
+        "name": "宋华青",
+        "userId": "054469"
+      },
+      {
+        "mainAdmin": false,
+        "name": "俞福春",
+        "userId": "424920"
+      },
+      {
+        "mainAdmin": false,
+        "name": "汤素文",
+        "userId": "088045"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王摧",
+        "userId": "141842"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王鸣霏",
+        "userId": "184163"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王兵",
+        "userId": "135976"
+      },
+      {
+        "mainAdmin": false,
+        "name": "周剑云",
+        "userId": "164217"
+      },
+      {
+        "mainAdmin": false,
+        "name": "沈国勋",
+        "userId": "026247"
+      },
+      {
+        "mainAdmin": false,
+        "name": "高阿娜",
+        "userId": "001423"
+      },
+      {
+        "mainAdmin": false,
+        "name": "王森",
+        "userId": "045981"
+      },
+      {
+        "mainAdmin": false,
+        "name": "林朋",
+        "userId": "236891"
+      }
+    ],
+    "approvalMode": "SELECT_APPROVER",
+    "approvalSubmitted": false,
+    "publishable": false,
+    "published": false,
+    "requiresApproval": true,
+    "sensitive": false,
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552",
+    "version": "1.0.0",
+    "versionId": "4743accb-45e2-4bc9-8c96-74fc62ace2e8",
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
dws devapp +version-create --unified-app-id <unified-app-id> --version <version> --desc <desc>write
基于当前配置创建应用新版本
dws mcp devapp create_dev_app_version --json '{"unifiedAppId":<..>, "version":<..>, "desc":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/create_dev_app_version
输入 / CLI 输出
输入
dws devapp +version-create --unified-app-id x --version x --desc x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "desc": "x",
+    "unifiedAppId": "x",
+    "version": "x"
+  },
+  "product": "devapp",
+  "tool": "create_dev_app_version"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "desc": "x",
+    "unifiedAppId": "x",
+    "version": "x"
+  },
+  "product": "devapp",
+  "tool": "create_dev_app_version"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1157ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test devapp +version-create --unified-app-id DWSREALTESTNOSUCHID0000000000000 --version 0.0.1-dws-real-test --desc 'DWS shortcut 真实测试描述,可删除' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/create_dev_app_version)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "BUSINESS_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"450001\"} ",
+    "trace_id": "0b5deb3217840999656705920e0853"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/create_dev_app_version)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "BUSINESS_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"450001\"} ",
+    "trace_id": "0b5deb3217840999656705920e0853"
+  }
+}
dws devapp +version-get --unified-app-id <unified-app-id> --version-id <version-id>read
查询指定版本详情
dws mcp devapp get_dev_app_version_detail --json '{"unifiedAppId":<..>, "versionId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/get_dev_app_version_detail
输入 / CLI 输出
输入
dws devapp +version-get --unified-app-id x --version-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x",
+    "versionId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_dev_app_version_detail"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x",
+    "versionId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_dev_app_version_detail"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1738ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +version-get --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --version-id 4743accb-45e2-4bc9-8c96-74fc62ace2e8 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "abilityList": [],
+    "approvalMode": "SELECT_APPROVER",
+    "description": "1.0.0",
+    "enterpriseSelfBuiltAudit": false,
+    "gmtCreate": "2026-03-06 10:43:01",
+    "requiresApproval": true,
+    "scopeList": [
+      "qyapi_robot_sendmsg",
+      "Card.Instance.Write",
+      "Card.Streaming.Write"
+    ],
+    "sensitiveScopeList": [],
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552",
+    "version": "1.0.0",
+    "versionId": "4743accb-45e2-4bc9-8c96-74fc62ace2e8",
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "abilityList": [],
+    "approvalMode": "SELECT_APPROVER",
+    "description": "1.0.0",
+    "enterpriseSelfBuiltAudit": false,
+    "gmtCreate": "2026-03-06 10:43:01",
+    "requiresApproval": true,
+    "scopeList": [
+      "qyapi_robot_sendmsg",
+      "Card.Instance.Write",
+      "Card.Streaming.Write"
+    ],
+    "sensitiveScopeList": [],
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552",
+    "version": "1.0.0",
+    "versionId": "4743accb-45e2-4bc9-8c96-74fc62ace2e8",
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
dws devapp +version-list --unified-app-id <unified-app-id>read
分页查询应用版本列表
dws mcp devapp <tool> lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/list_dev_app_versions
输入 / CLI 输出
输入
dws devapp +version-list --unified-app-id x --cursor x --page-size 1 --yes
stdout
{
+  "count": 0,
+  "versions": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "versions": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1349ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +version-list --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --cursor '' --page-size 10 --yes --format json
真实 stdout
{
+  "count": 1,
+  "versions": [
+    {
+      "desc": "1.0.0",
+      "gmtCreate": 1772764981000,
+      "status": "INIT",
+      "version": "1.0.0",
+      "versionId": "4743accb-45e2-4bc9-8c96-74fc62ace2e8"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 1,
+  "versions": [
+    {
+      "desc": "1.0.0",
+      "gmtCreate": 1772764981000,
+      "status": "INIT",
+      "version": "1.0.0",
+      "versionId": "4743accb-45e2-4bc9-8c96-74fc62ace2e8"
+    }
+  ]
+}
dws devapp +version-publish --unified-app-id <unified-app-id> --version-id <version-id> --confirmed-sensitive <confirmed-sensitive> --approver-user-id <approver-user-id>write
发布指定版本(含高敏权限需 --confirmed-sensitive)
dws mcp devapp publish_dev_app_version --json '{"unifiedAppId":<..>, "versionId":<..>, "precheckOnly":<..>, "confirmedSensitive":<..>, "approverUserId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/publish_dev_app_version
输入 / CLI 输出
输入
dws devapp +version-publish --unified-app-id x --version-id x --confirmed-sensitive --approver-user-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "approverUserId": "x",
+    "confirmedSensitive": true,
+    "precheckOnly": false,
+    "unifiedAppId": "x",
+    "versionId": "x"
+  },
+  "product": "devapp",
+  "tool": "publish_dev_app_version"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "approverUserId": "x",
+    "confirmedSensitive": true,
+    "precheckOnly": false,
+    "unifiedAppId": "x",
+    "versionId": "x"
+  },
+  "product": "devapp",
+  "tool": "publish_dev_app_version"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1071ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test devapp +version-publish --unified-app-id DWSREALTESTNOSUCHID0000000000000 --version-id DWSREALTESTNOSUCHID0000000000000 --confirmed-sensitive --approver-user-id __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/publish_dev_app_version)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "BUSINESS_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"450001\"} ",
+    "trace_id": "2127d89817840999667906017e075d"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false (operation: devapp/publish_dev_app_version)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "BUSINESS_ERROR",
+    "server_key": "devapp",
+    "technical_detail": "iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\"success\":false,\"errorCode\":\"450001\"} ",
+    "trace_id": "2127d89817840999667906017e075d"
+  }
+}
dws devapp +version-status --unified-app-id <unified-app-id> --version-id <version-id>read
查询版本发布/审批状态
dws mcp devapp get_dev_app_version_status --json '{"unifiedAppId":<..>, "versionId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/get_dev_app_version_status
输入 / CLI 输出
输入
dws devapp +version-status --unified-app-id x --version-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x",
+    "versionId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_dev_app_version_status"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x",
+    "versionId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_dev_app_version_status"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2272ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +version-status --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --version-id 4743accb-45e2-4bc9-8c96-74fc62ace2e8 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552",
+    "version": "1.0.0",
+    "versionId": "4743accb-45e2-4bc9-8c96-74fc62ace2e8",
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552",
+    "version": "1.0.0",
+    "versionId": "4743accb-45e2-4bc9-8c96-74fc62ace2e8",
+    "versionStatus": "INIT"
+  },
+  "success": true
+}
dws devapp +webapp-config --unified-app-id <unified-app-id> --h5-page-type <h5-page-type> --homepage-url <homepage-url> --pc-homepage-url <pc-homepage-url> --omp-url <omp-url>write
配置网页应用能力
dws mcp devapp set_extension_webapp_config --json '{"unifiedAppId":<..>, "h5PageType":<..>, "homepageUrl":<..>, "pcHomepageUrl":<..>, "ompUrl":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/set_extension_webapp_config
输入 / CLI 输出
输入
dws devapp +webapp-config --unified-app-id x --h5-page-type x --homepage-url x --pc-homepage-url x --omp-url x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "h5PageType": "x",
+    "homepageUrl": "x",
+    "ompUrl": "x",
+    "pcHomepageUrl": "x",
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "set_extension_webapp_config"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "h5PageType": "x",
+    "homepageUrl": "x",
+    "ompUrl": "x",
+    "pcHomepageUrl": "x",
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "set_extension_webapp_config"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=4926ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +webapp-config --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --h5-page-type pc --homepage-url https://example.invalid/dws --pc-homepage-url https://example.invalid/dws-pc --omp-url https://example.invalid/omp --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "configured": true,
+    "h5PageType": "pc",
+    "homepageUrl": "https://example.invalid/dws",
+    "message": "网页应用配置成功。",
+    "ompUrl": "https://example.invalid/omp",
+    "pcHomepageUrl": "https://example.invalid/dws-pc",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "configured": true,
+    "h5PageType": "pc",
+    "homepageUrl": "https://example.invalid/dws",
+    "message": "网页应用配置成功。",
+    "ompUrl": "https://example.invalid/omp",
+    "pcHomepageUrl": "https://example.invalid/dws-pc",
+    "success": true,
+    "unifiedAppId": "c5a8e611-1555-44a0-ba8d-9617ab599692"
+  },
+  "success": true
+}
dws devapp +webapp-get --unified-app-id <unified-app-id>read
查询网页应用配置
dws mcp devapp get_extension_webapp_config --json '{"unifiedAppId":<..>}' lark apps 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;devapp/get_extension_webapp_config
输入 / CLI 输出
输入
dws devapp +webapp-get --unified-app-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_extension_webapp_config"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "unifiedAppId": "x"
+  },
+  "product": "devapp",
+  "tool": "get_extension_webapp_config"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1576ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test devapp +webapp-get --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "configured": false,
+    "message": "未配置网页应用入口,请使用 webapp config 设置 homepageUrl、pcHomepageUrl 或 ompUrl。",
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "configured": false,
+    "message": "未配置网页应用入口,请使用 webapp config 设置 homepageUrl、pcHomepageUrl 或 ompUrl。",
+    "unifiedAppId": "678f27ec-4339-49d8-9c49-371b284bf552"
+  },
+  "success": true
+}

calendar · 23 个 · ↔ lark calendar

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + - - + + + + + - - + + + - - + + + - - + + + - - + + + - - + + + + - - + + + - - + + + - - + + + - - + + + - - + + + + + + - - + + + - - + + + - - + + + - - + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws calendar +agenda --start <start> --end <end> --calendar-id <calendar-id> --cursor <cursor> --limit <limit>read
查询日程列表(不传时间默认查询今天)
dws mcp calendar <tool> lark-cli calendar +agenda实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
输入 / CLI 输出
输入
dws calendar +agenda --start x --end x --calendar-id x --cursor x --limit 1 --yes
stdout
(空)
stderr / error
invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
最终用于判定的返回
invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2094ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +agenda --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --calendar-id primary --cursor '' --limit 10 --yes --format json
真实 stdout
{
+  "count": 1,
+  "events": [
+    {
+      "end": {
+        "date": null,
+        "dateTime": "2026-07-16T10:00:00+08:00",
+        "timeZone": "Asia/Shanghai"
+      },
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000",
+      "location": "B310",
+      "start": {
+        "date": null,
+        "dateTime": "2026-07-16T09:15:00+08:00",
+        "timeZone": "Asia/Shanghai"
+      },
+      "status": "confirmed",
+      "summary": "中控专属钉&AI项目早会"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 1,
+  "events": [
+    {
+      "end": {
+        "date": null,
+        "dateTime": "2026-07-16T10:00:00+08:00",
+        "timeZone": "Asia/Shanghai"
+      },
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000",
+      "location": "B310",
+      "start": {
+        "date": null,
+        "dateTime": "2026-07-16T09:15:00+08:00",
+        "timeZone": "Asia/Shanghai"
+      },
+      "status": "confirmed",
+      "summary": "中控专属钉&AI项目早会"
+    }
+  ]
+}
dws calendar +attendee-list --event <event> --calendar-id <calendar-id>read
查看日程参会人
dws mcp calendar <tool> lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/get_calendar_participants
输入 / CLI 输出
输入
dws calendar +attendee-list --event x --calendar-id x --yes
stdout
{
+  "attendees": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "attendees": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1144ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +attendee-list --event THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000 --calendar-id primary --yes --format json
真实 stdout
{
+  "attendees": [
+    {
+      "displayName": "秦天",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "崇幻(主用钉)",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "恩澈主用钉",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "楠者",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "栩铭-主账号",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "思敏",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "念晨",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "杨淑平",
+      "responseStatus": "declined"
+    },
+    {
+      "displayName": "李伟韬",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "王琳",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "千启",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "粤腾",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "石涤",
+      "responseStatus": "declined"
+    },
+    {
+      "displayName": "陈叙",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "李畅(主用钉)",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "徐海儿",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "袁航",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王伟明",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "巫利华",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "张彪",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "舒畅",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王晓璇",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "孙茂林",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "尤福海",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "杨凯",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "杨二磊",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "姚俊杰",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "王鑫杰",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "毛金权",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王国红",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "刘刚",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王福超",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "张海蛟",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "方胜新",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "邵嘉铭",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "孙龙飞",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "刘琦",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "申展",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "李光辉",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "蒋志恒",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "籍敏",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "黄徐贤",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王继光",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "裴美娟",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "闫铎功",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "陈江义",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "刘颖",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "杨旭[工作号]",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "刘少军",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王贵",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "付玉强",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "张振奎",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "武永江",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "沈体峰",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "孔维娜",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王东亮",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "李鑫",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "张磊",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "朱晓闪",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "吴斌",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "陈露鑫",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "陈永纯",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "李所清",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "盛超",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王军超",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "曲宁涛",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "方美",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "杨帆",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "万以华",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "毕晨",
+      "responseStatus": "accepted"
+    }
+  ],
+  "count": 70
+}
真实 stderr / error
(空)
真实返回
{
+  "attendees": [
+    {
+      "displayName": "秦天",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "崇幻(主用钉)",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "恩澈主用钉",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "楠者",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "栩铭-主账号",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "思敏",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "念晨",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "杨淑平",
+      "responseStatus": "declined"
+    },
+    {
+      "displayName": "李伟韬",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "王琳",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "千启",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "粤腾",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "石涤",
+      "responseStatus": "declined"
+    },
+    {
+      "displayName": "陈叙",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "李畅(主用钉)",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "徐海儿",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "袁航",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王伟明",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "巫利华",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "张彪",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "舒畅",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王晓璇",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "孙茂林",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "尤福海",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "杨凯",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "杨二磊",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "姚俊杰",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "王鑫杰",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "毛金权",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王国红",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "刘刚",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王福超",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "张海蛟",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "方胜新",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "邵嘉铭",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "孙龙飞",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "刘琦",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "申展",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "李光辉",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "蒋志恒",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "籍敏",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "黄徐贤",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王继光",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "裴美娟",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "闫铎功",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "陈江义",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "刘颖",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "杨旭[工作号]",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "刘少军",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王贵",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "付玉强",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "张振奎",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "武永江",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "沈体峰",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "孔维娜",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王东亮",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "李鑫",
+      "responseStatus": "accepted"
+    },
+    {
+      "displayName": "张磊",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "朱晓闪",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "吴斌",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "陈露鑫",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "陈永纯",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "李所清",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "盛超",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "王军超",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "曲宁涛",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "方美",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "杨帆",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "万以华",
+      "responseStatus": "needsAction"
+    },
+    {
+      "displayName": "毕晨",
+      "responseStatus": "accepted"
+    }
+  ],
+  "count": 70
+}
dws calendar +book --title <title> --start <start> --end <end> --with <with>write
创建日程,并可按姓名邀请参会人(自动解析 userId,失败自动回滚删除日程)
dws mcp calendar create_calendar_event --json '{"summary":<..>, "startDateTime":<..>, "endDateTime":<..>, "dryRun":<..>, "wouldCreate":<..>, "wouldInvite":<..>, "eventId":<..>, "attendeesToAdd":<..>}'dws calendar +book --title <title> --start <start> --end <end> --with <with>write复合/智能型
创建日程,并可按姓名邀请参会人(自动解析 userId,失败自动回滚删除日程)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 create_calendar_event lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws calendar +book --title x --start x --end x --with x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2909ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +book --title 'DWS shortcut 真实测试 20260715 日程,可忽略' --start 2026-07-16T11:00:00+08:00 --end 2026-07-16T11:15:00+08:00 --with '冬翔,克谨,怒龙' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "result": {
+    "attendees": [
+      {
+        "displayName": "怒龙",
+        "optional": false,
+        "responseStatus": "needsAction",
+        "self": false
+      },
+      {
+        "displayName": "冬翔",
+        "optional": false,
+        "responseStatus": "needsAction",
+        "self": false
+      },
+      {
+        "displayName": "念晨",
+        "optional": false,
+        "responseStatus": "accepted",
+        "self": true
+      },
+      {
+        "displayName": "黄渊卓(克谨)",
+        "optional": false,
+        "responseStatus": "needsAction",
+        "self": false
+      }
+    ],
+    "categories": [],
+    "createTime": "2026-07-15 10:12:30",
+    "end": {
+      "dateTime": "2026-07-16T11:15:00+08:00",
+      "timeZone": "Asia/Shanghai"
+    },
+    "extendedProperties": {
+      "sharedProperties": {
+        "belongCorpId": "ding8196cd9a2b2405da24f2f5cc6abecb85"
+      }
+    },
+    "freeBusy": "BUSY",
+    "iCalUID": "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09",
+    "id": "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09",
+    "isAllDay": false,
+    "meetingRooms": [],
+    "onlineMeetingInfo": {
+      "conferenceId": "c76abd52-29bb-4183-85d3-bcf91debe3e4",
+      "extraInfo": {
+        "phones": "[\"+862381045152\",\"+862381045153\"]",
+        "roomCode": "131 508 161"
+      },
+      "internalExtraInfo": {
+        "urlForCalDAV": "dingtalk://dingtalkclient/page/videoConfFromSystemCalendar?confId=c76abd52-29bb-4183-85d3-bcf91debe3e4\u0026calendarId=24714119393"
+      },
+      "type": "dingtalk",
+      "url": "dingtalk://dingtalkclient/page/videoConfFromCalendar?confId=c76abd52-29bb-4183-85d3-bcf91debe3e4\u0026calendarId=24714119393"
+    },
+    "organizer": {
+      "displayName": "念晨",
+      "optional": false,
+      "self": true
+    },
+    "reminders": [
+      {
+        "method": "dingtalk",
+        "minutes": 15
+      }
+    ],
+    "start": {
+      "dateTime": "2026-07-16T11:00:00+08:00",
+      "timeZone": "Asia/Shanghai"
+    },
+    "status": "confirmed",
+    "summary": "DWS shortcut 真实测试 20260715 日程,可忽略",
+    "updateTime": "2026-07-15 10:12:31"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "result": {
+    "attendees": [
+      {
+        "displayName": "怒龙",
+        "optional": false,
+        "responseStatus": "needsAction",
+        "self": false
+      },
+      {
+        "displayName": "冬翔",
+        "optional": false,
+        "responseStatus": "needsAction",
+        "self": false
+      },
+      {
+        "displayName": "念晨",
+        "optional": false,
+        "responseStatus": "accepted",
+        "self": true
+      },
+      {
+        "displayName": "黄渊卓(克谨)",
+        "optional": false,
+        "responseStatus": "needsAction",
+        "self": false
+      }
+    ],
+    "categories": [],
+    "createTime": "2026-07-15 10:12:30",
+    "end": {
+      "dateTime": "2026-07-16T11:15:00+08:00",
+      "timeZone": "Asia/Shanghai"
+    },
+    "extendedProperties": {
+      "sharedProperties": {
+        "belongCorpId": "ding8196cd9a2b2405da24f2f5cc6abecb85"
+      }
+    },
+    "freeBusy": "BUSY",
+    "iCalUID": "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09",
+    "id": "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09",
+    "isAllDay": false,
+    "meetingRooms": [],
+    "onlineMeetingInfo": {
+      "conferenceId": "c76abd52-29bb-4183-85d3-bcf91debe3e4",
+      "extraInfo": {
+        "phones": "[\"+862381045152\",\"+862381045153\"]",
+        "roomCode": "131 508 161"
+      },
+      "internalExtraInfo": {
+        "urlForCalDAV": "dingtalk://dingtalkclient/page/videoConfFromSystemCalendar?confId=c76abd52-29bb-4183-85d3-bcf91debe3e4\u0026calendarId=24714119393"
+      },
+      "type": "dingtalk",
+      "url": "dingtalk://dingtalkclient/page/videoConfFromCalendar?confId=c76abd52-29bb-4183-85d3-bcf91debe3e4\u0026calendarId=24714119393"
+    },
+    "organizer": {
+      "displayName": "念晨",
+      "optional": false,
+      "self": true
+    },
+    "reminders": [
+      {
+        "method": "dingtalk",
+        "minutes": 15
+      }
+    ],
+    "start": {
+      "dateTime": "2026-07-16T11:00:00+08:00",
+      "timeZone": "Asia/Shanghai"
+    },
+    "status": "confirmed",
+    "summary": "DWS shortcut 真实测试 20260715 日程,可忽略",
+    "updateTime": "2026-07-15 10:12:31"
+  },
+  "success": true
+}
dws calendar +book-listread
查询用户的日历本列表
dws mcp calendar <tool> lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/list_calendars
输入 / CLI 输出
输入
dws calendar +book-list --yes
stdout
{
+  "calendars": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "calendars": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1033ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +book-list --yes --format json
真实 stdout
{
+  "calendars": [
+    {
+      "calendarId": "primary",
+      "description": null,
+      "privilege": "owner",
+      "summary": "我的日历(钉钉)",
+      "type": "primary"
+    }
+  ],
+  "count": 1
+}
真实 stderr / error
(空)
真实返回
{
+  "calendars": [
+    {
+      "calendarId": "primary",
+      "description": null,
+      "privilege": "owner",
+      "summary": "我的日历(钉钉)",
+      "type": "primary"
+    }
+  ],
+  "count": 1
+}
dws calendar +book-search --query <query>read
按名称模糊搜索日历本
dws mcp calendar <tool> lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/search_calendar
输入 / CLI 输出
输入
dws calendar +book-search --query x --yes
stdout
{
+  "calendars": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "calendars": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1036ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +book-search --query '测试' --yes --format json
真实 stdout
{
+  "calendars": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "calendars": [],
+  "count": 0
+}
dws calendar +cancel-event --event <event>high-risk-write
取消(删除)一个已有日程(删除前先确认它真实存在)
dws mcp calendar delete_calendar_event --json '{"eventId":<..>, "title":<..>, "action":<..>}'dws calendar +cancel-event --event <event>high-risk-write复合/智能型
取消(删除)一个已有日程(删除前先确认它真实存在)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 delete_calendar_event lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 2;tool 已校验;calendar/delete_calendar_event、calendar/get_calendar_detail
输入 / CLI 输出
输入
dws calendar +cancel-event --event x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "eventId": "x"
+  },
+  "product": "calendar",
+  "tool": "delete_calendar_event"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "eventId": "x"
+  },
+  "product": "calendar",
+  "tool": "delete_calendar_event"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1369ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +cancel-event --event c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09 --yes --format json
真实 stdout
{
+  "action": "about_to_cancel",
+  "eventId": "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09",
+  "title": "DWS shortcut 真实测试 20260715 日程,可忽略"
+}
+{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "action": "about_to_cancel",
+  "eventId": "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09",
+  "title": "DWS shortcut 真实测试 20260715 日程,可忽略"
+}
+{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws calendar +conflicts --in-days <in-days>read
检测我某天日程的时间冲突(重叠/双重预订,默认今天)
dws mcp calendar <tool>dws calendar +conflicts --in-days <in-days>read复合/智能型
检测我某天日程的时间冲突(重叠/双重预订,默认今天)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/list_calendar_events
输入 / CLI 输出
输入
dws calendar +conflicts --in-days 1 --yes
stdout
{
+  "conflictCount": 0,
+  "conflicts": [],
+  "date": "2026-07-16",
+  "eventCount": 0,
+  "hasConflict": false
+}
stderr / error
(空)
最终用于判定的返回
{
+  "conflictCount": 0,
+  "conflicts": [],
+  "date": "2026-07-16",
+  "eventCount": 0,
+  "hasConflict": false
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2369ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +conflicts --in-days 1 --yes --format json
真实 stdout
{
+  "conflictCount": 0,
+  "conflicts": [],
+  "date": "2026-07-16",
+  "eventCount": 3,
+  "hasConflict": false
+}
真实 stderr / error
(空)
真实返回
{
+  "conflictCount": 0,
+  "conflicts": [],
+  "date": "2026-07-16",
+  "eventCount": 3,
+  "hasConflict": false
+}
dws calendar +find-room --start <start> --end <end>read
查询指定时间段内所有可用的会议室
dws mcp calendar <tool>dws calendar +find-room --start <start> --end <end>read复合/智能型
查询指定时间段内所有可用的会议室
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--start 时间格式无效:"x",请使用 ISO8601(如 2026-03-10T14:00:00+08:00)
输入 / CLI 输出
输入
dws calendar +find-room --start x --end x --yes
stdout
(空)
stderr / error
--start 时间格式无效:"x",请使用 ISO8601(如 2026-03-10T14:00:00+08:00)
最终用于判定的返回
--start 时间格式无效:"x",请使用 ISO8601(如 2026-03-10T14:00:00+08:00)
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1498ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test calendar +find-room --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "458019",
+    "server_key": "calendar",
+    "trace_id": "0bb7c36217840997694975303e0758"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "458019",
+    "server_key": "calendar",
+    "trace_id": "0bb7c36217840997694975303e0758"
+  }
+}
dws calendar +free --who <who> --start <start> --end <end>read
按姓名查询某人在指定时间段内的忙闲状态(自动解析 userId)
dws mcp calendar <tool>dws calendar +free --who <who> --start <start> --end <end>read复合/智能型
按姓名查询某人在指定时间段内的忙闲状态(自动解析 userId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws calendar +free --who x --start x --end x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1697ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +free --who '冬翔' --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --yes --format json
真实 stdout
{
+  "busy": [],
+  "free": true,
+  "userId": "103262",
+  "who": "夏东翔"
+}
真实 stderr / error
(空)
真实返回
{
+  "busy": [],
+  "free": true,
+  "userId": "103262",
+  "who": "夏东翔"
+}
dws calendar +free-slots --in-days <in-days> --from <from> --to <to>read
找我某天工作时段内的空闲时间段(默认今天 09:00-18:00)
dws mcp calendar <tool>dws calendar +free-slots --in-days <in-days> --from <from> --to <to>read复合/智能型
找我某天工作时段内的空闲时间段(默认今天 09:00-18:00)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--from/--to 需满足 0<=from<to<=24
输入 / CLI 输出
输入
dws calendar +free-slots --in-days 1 --from 1 --to 1 --yes
stdout
(空)
stderr / error
--from/--to 需满足 0<=from<to<=24
最终用于判定的返回
--from/--to 需满足 0<=from<to<=24
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2195ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +free-slots --in-days 1 --from 9 --to 18 --yes --format json
真实 stdout
{
+  "allBusy": false,
+  "date": "2026-07-16",
+  "freeSlots": [
+    {
+      "durationMin": 15,
+      "end": "09:15",
+      "start": "09:00"
+    },
+    {
+      "durationMin": 480,
+      "end": "18:00",
+      "start": "10:00"
+    }
+  ],
+  "slotCount": 2,
+  "window": "09:00-18:00"
+}
真实 stderr / error
(空)
真实返回
{
+  "allBusy": false,
+  "date": "2026-07-16",
+  "freeSlots": [
+    {
+      "durationMin": 15,
+      "end": "09:15",
+      "start": "09:00"
+    },
+    {
+      "durationMin": 480,
+      "end": "18:00",
+      "start": "10:00"
+    }
+  ],
+  "slotCount": 2,
+  "window": "09:00-18:00"
+}
dws calendar +freebusy --users <users> --rooms <rooms> --start <start> --end <end>read
查询用户 / 会议室闲忙状态(--users 与 --rooms 至少其一)
dws mcp calendar query_busy_status --json '{"startTime":<..>, "endTime":<..>, "userIds":<..>, "roomIds":<..>}' lark-cli calendar +freebusy实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
输入 / CLI 输出
输入
dws calendar +freebusy --users x --rooms x --start x --end x --yes
stdout
(空)
stderr / error
invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
最终用于判定的返回
invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1154ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +freebusy --users 103262 --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --yes --format json
真实 stdout
{
+  "result": [
+    {
+      "error": null,
+      "roomId": null,
+      "scheduleItems": [],
+      "userId": "103262"
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "result": [
+    {
+      "error": null,
+      "roomId": null,
+      "scheduleItems": [],
+      "userId": "103262"
+    }
+  ],
+  "success": true
+}
dws calendar +invite --event <event> --with <with>write
按姓名把参会人加入已有日程(自动解析 userId 后批量添加)
dws mcp calendar add_calendar_participant --json '{"eventId":<..>, "attendeesToAdd":<..>}'dws calendar +invite --event <event> --with <with>write复合/智能型
按姓名把参会人加入已有日程(自动解析 userId 后批量添加)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 add_calendar_participant lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws calendar +invite --event x --with x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2033ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +invite --event c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09 --with '冬翔' --yes --format json
真实 stdout
{
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws calendar +my-free --start <start> --end <end>read
查我自己在某时间段的忙闲(默认今天,无需输入姓名)
dws mcp calendar <tool>dws calendar +my-free --start <start> --end <end>read复合/智能型
查我自己在某时间段的忙闲(默认今天,无需输入姓名)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_current_user_profile;无法解析当前用户的 userId
输入 / CLI 输出
输入
dws calendar +my-free --start x --end x --yes
stdout
(空)
stderr / error
无法解析当前用户的 userId
最终用于判定的返回
无法解析当前用户的 userId
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1406ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +my-free --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --yes --format json
真实 stdout
{
+  "busy": [
+    {
+      "end": "2026-07-16T10:00:00+08:00",
+      "start": "2026-07-16T09:15:00+08:00"
+    }
+  ],
+  "free": false,
+  "userId": "202397"
+}
真实 stderr / error
(空)
真实返回
{
+  "busy": [
+    {
+      "end": "2026-07-16T10:00:00+08:00",
+      "start": "2026-07-16T09:15:00+08:00"
+    }
+  ],
+  "free": false,
+  "userId": "202397"
+}
dws calendar +next-eventread
查看接下来最近的一个日程(默认扫描未来 7 天)
dws mcp calendar <tool>dws calendar +next-eventread复合/智能型
查看接下来最近的一个日程(默认扫描未来 7 天)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/list_calendar_events
输入 / CLI 输出
输入
dws calendar +next-event --yes
stdout
{
+  "event": null,
+  "message": "近 7 天无日程"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "event": null,
+  "message": "近 7 天无日程"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=5504ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +next-event --yes --format json
真实 stdout
{
+  "event": {
+    "end": "2026-07-15 21:15",
+    "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000",
+    "start": "2026-07-15 21:00",
+    "title": "循环提醒:项目每日工作进展同步"
+  }
+}
真实 stderr / error
(空)
真实返回
{
+  "event": {
+    "end": "2026-07-15 21:15",
+    "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000",
+    "start": "2026-07-15 21:00",
+    "title": "循环提醒:项目每日工作进展同步"
+  }
+}
dws calendar +reschedule --event <event> --start <start> --end <end>write
改一个已有日程的时间(只动开始/结束时间,其他字段不变)
dws mcp calendar update_calendar_event --json '{"eventId":<..>, "startDateTime":<..>, "endDateTime":<..>}'dws calendar +reschedule --event <event> --start <start> --end <end>write复合/智能型
改一个已有日程的时间(只动开始/结束时间,其他字段不变)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 update_calendar_event lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 2;tool 已校验;calendar/get_calendar_detail、calendar/update_calendar_event
输入 / CLI 输出
输入
dws calendar +reschedule --event x --start x --end x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "endDateTime": "x",
+    "eventId": "x",
+    "startDateTime": "x"
+  },
+  "product": "calendar",
+  "tool": "update_calendar_event"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "endDateTime": "x",
+    "eventId": "x",
+    "startDateTime": "x"
+  },
+  "product": "calendar",
+  "tool": "update_calendar_event"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1960ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +reschedule --event c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09 --start 2026-07-16T11:30:00+08:00 --end 2026-07-16T11:45:00+08:00 --yes --format json
真实 stdout
{
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "success": true
+}
dws calendar +respond-event --event <event> --response <response>write
接受 / 拒绝 / 暂定回复一个日程邀请(作为参会人设置自己的响应状态)
dws mcp calendar respond --json '{"accept":<..>, "decline":<..>, "tentative":<..>, "eventId":<..>, "responseStatus":<..>}'dws calendar +respond-event --event <event> --response <response>write复合/智能型
接受 / 拒绝 / 暂定回复一个日程邀请(作为参会人设置自己的响应状态)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 respond lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/respond
输入 / CLI 输出
输入
dws calendar +respond-event --event x --response accept --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "eventId": "x",
+    "responseStatus": "accepted"
+  },
+  "product": "calendar",
+  "tool": "respond"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "eventId": "x",
+    "responseStatus": "accepted"
+  },
+  "product": "calendar",
+  "tool": "respond"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1217ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test calendar +respond-event --event x --response accept --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] code: 300000, developerMessage: Event does not exist. (operation: calendar/respond)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "300000",
+    "server_key": "calendar",
+    "trace_id": "0bb7c36217840999105062121e07db"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] code: 300000, developerMessage: Event does not exist. (operation: calendar/respond)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "300000",
+    "server_key": "calendar",
+    "trace_id": "0bb7c36217840999105062121e07db"
+  }
+}
dws calendar +room-find --start <start> --end <end> --available <available> --group-id <group-id> --room-name <room-name> --limit <limit> --page <page>read
按时间段搜索可用会议室(不传时间默认当前起 1 小时)
dws mcp calendar query_available_meeting_room --json '{"startTime":<..>, "endTime":<..>, "needAvailable":<..>, "groupId":<..>, "roomName":<..>, "pageSize":<..>, "pageIndex":<..>}' lark-cli calendar +room-find实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
输入 / CLI 输出
输入
dws calendar +room-find --start x --end x --available --group-id x --room-name x --limit x --page x --yes
stdout
(空)
stderr / error
invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
最终用于判定的返回
invalid --start time "x": expected ISO-8601 like 2026-03-10T14:00:00+08:00
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1504ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test calendar +room-find --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --available --group-id x --room-name x --limit 10 --page 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。 (operation: calendar/query_available_meeting_room)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "458019",
+    "server_key": "calendar",
+    "trace_id": "2104a64c17840997709913005e0819"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。 (operation: calendar/query_available_meeting_room)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "458019",
+    "server_key": "calendar",
+    "trace_id": "2104a64c17840997709913005e0819"
+  }
+}
dws calendar +room-groups --limit <limit> --page <page>read
会议室分组列表
dws mcp calendar <tool> lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/list_meeting_room_groups
输入 / CLI 输出
输入
dws calendar +room-groups --limit x --page x --yes
stdout
{
+  "count": 0,
+  "groups": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "groups": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1224ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +room-groups --limit 10 --page 1 --yes --format json
真实 stdout
{
+  "count": 0,
+  "groups": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "groups": []
+}
dws calendar +room-search --room-name <room-name>read
按名称模糊搜索会议室(不检查可用性)
dws mcp calendar <tool> lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/search_rooms
输入 / CLI 输出
输入
dws calendar +room-search --room-name x --yes
stdout
{
+  "count": 0,
+  "rooms": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "rooms": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1298ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +room-search --room-name x --yes --format json
真实 stdout
{
+  "count": 0,
+  "rooms": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "rooms": []
+}
dws calendar +suggest-time --with <with> --start <start> --end <end> --duration <duration>read
按姓名解析多位参与者,推荐大家都有空的可开会时间段(自动解析 userId)
dws mcp calendar <tool>dws calendar +suggest-time --with <with> --start <start> --end <end> --duration <duration>read复合/智能型
按姓名解析多位参与者,推荐大家都有空的可开会时间段(自动解析 userId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;以下参与者无法解析为唯一 userId: +- 通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws calendar +suggest-time --with x --start x --end x --duration x --yes
stdout
(空)
stderr / error
以下参与者无法解析为唯一 userId:
+- 通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
以下参与者无法解析为唯一 userId:
+- 通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1711ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +suggest-time --with '冬翔' --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --duration x --yes --format json
真实 stdout
{
+  "suggestions": [
+    {
+      "end": "2026-07-16T10:30:00+08:00",
+      "start": "2026-07-16T10:00:00+08:00"
+    },
+    {
+      "end": "2026-07-16T11:00:00+08:00",
+      "start": "2026-07-16T10:30:00+08:00"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "suggestions": [
+    {
+      "end": "2026-07-16T10:30:00+08:00",
+      "start": "2026-07-16T10:00:00+08:00"
+    },
+    {
+      "end": "2026-07-16T11:00:00+08:00",
+      "start": "2026-07-16T10:30:00+08:00"
+    }
+  ]
+}
dws calendar +todayread
列出我今天的日程(自动计算今天的起止时间,无需手动填时间范围)
dws mcp calendar <tool>dws calendar +todayread复合/智能型
列出我今天的日程(自动计算今天的起止时间,无需手动填时间范围)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/list_calendar_events
输入 / CLI 输出
输入
dws calendar +today --yes
stdout
{
+  "events": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "events": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1951ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +today --yes --format json
真实 stdout
{
+  "events": [
+    {
+      "end": "2026-07-15 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000",
+      "location": "B310",
+      "start": "2026-07-15 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-15 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000",
+      "start": "2026-07-15 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "events": [
+    {
+      "end": "2026-07-15 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000",
+      "location": "B310",
+      "start": "2026-07-15 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-15 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000",
+      "start": "2026-07-15 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    }
+  ]
+}
dws calendar +tomorrowread
列出我明天的日程(自动计算明天的起止时间,无需手动填时间范围)
dws mcp calendar <tool>dws calendar +tomorrowread复合/智能型
列出我明天的日程(自动计算明天的起止时间,无需手动填时间范围)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/list_calendar_events
输入 / CLI 输出
输入
dws calendar +tomorrow --yes
stdout
{
+  "events": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "events": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2254ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +tomorrow --yes --format json
真实 stdout
{
+  "events": [
+    {
+      "end": "2026-07-16 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000",
+      "location": "B310",
+      "start": "2026-07-16 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-16 20:00",
+      "eventId": "cVRhbUZsMzZscU1XQjd0NURFaEdnZz09",
+      "location": "张功馆·桐庐菜(未来星宸永福店)",
+      "start": "2026-07-16 18:00",
+      "title": "搜问&搜索团队聚餐"
+    },
+    {
+      "end": "2026-07-16 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784206800000",
+      "start": "2026-07-16 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "events": [
+    {
+      "end": "2026-07-16 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000",
+      "location": "B310",
+      "start": "2026-07-16 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-16 20:00",
+      "eventId": "cVRhbUZsMzZscU1XQjd0NURFaEdnZz09",
+      "location": "张功馆·桐庐菜(未来星宸永福店)",
+      "start": "2026-07-16 18:00",
+      "title": "搜问&搜索团队聚餐"
+    },
+    {
+      "end": "2026-07-16 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784206800000",
+      "start": "2026-07-16 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    }
+  ]
+}
dws calendar +weekread
列出我本周的日程(自动按周一为周首计算本周起止时间,无需手动填时间范围)
dws mcp calendar <tool>dws calendar +weekread复合/智能型
列出我本周的日程(自动按周一为周首计算本周起止时间,无需手动填时间范围)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark calendar 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;calendar/list_calendar_events
输入 / CLI 输出
输入
dws calendar +week --yes
stdout
{
+  "events": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "events": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=6589ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test calendar +week --yes --format json
真实 stdout
{
+  "events": [
+    {
+      "end": "2026-07-13 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1783905300000",
+      "location": "B310",
+      "start": "2026-07-13 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-13 15:30",
+      "eventId": "UTFidStpV3JUcnVQRDhHZThjZVJGQT09",
+      "start": "2026-07-13 15:00",
+      "title": "llm-wiki的能力共创快速对一下使用说明"
+    },
+    {
+      "end": "2026-07-13 16:15",
+      "eventId": "bjZWVmlieHVpUUJJMm15RGFUMlRIZz09",
+      "start": "2026-07-13 15:30",
+      "title": "聊聊"
+    },
+    {
+      "end": "2026-07-13 16:30",
+      "eventId": "elVnVE45K1YvcStEbEpvM2RxbGVYQT09",
+      "location": "2003",
+      "start": "2026-07-13 16:00",
+      "title": "AI技术平台小周会"
+    },
+    {
+      "end": "2026-07-13 18:00",
+      "eventId": "RXJDc2RMNzNPWkRZRnpzTU1NZ1Nsdz09_1783933200000",
+      "location": "B310",
+      "start": "2026-07-13 17:00",
+      "title": "AI营销周会"
+    },
+    {
+      "end": "2026-07-13 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1783947600000",
+      "start": "2026-07-13 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    },
+    {
+      "end": "2026-07-14 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1783991700000",
+      "location": "B310",
+      "start": "2026-07-14 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-14 14:30",
+      "eventId": "d1BpNmZOVkdJaFY5dXdIVE9SdkZPQT09",
+      "location": "D1-2001",
+      "start": "2026-07-14 13:30",
+      "title": "简单聊一聊"
+    },
+    {
+      "end": "2026-07-14 20:30",
+      "eventId": "ZUtBTlQxNjY3TnJKM0JpVEx2T1Ardz09",
+      "location": "D1-2004",
+      "start": "2026-07-14 19:30",
+      "title": "盘一下算法 x 搜索搜问合作"
+    },
+    {
+      "end": "2026-07-14 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784034000000",
+      "start": "2026-07-14 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    },
+    {
+      "end": "2026-07-15 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000",
+      "location": "B310",
+      "start": "2026-07-15 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-15 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000",
+      "start": "2026-07-15 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    },
+    {
+      "end": "2026-07-16 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000",
+      "location": "B310",
+      "start": "2026-07-16 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-16 20:00",
+      "eventId": "cVRhbUZsMzZscU1XQjd0NURFaEdnZz09",
+      "location": "张功馆·桐庐菜(未来星宸永福店)",
+      "start": "2026-07-16 18:00",
+      "title": "搜问&搜索团队聚餐"
+    },
+    {
+      "end": "2026-07-16 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784206800000",
+      "start": "2026-07-16 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    },
+    {
+      "end": "2026-07-17 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784250900000",
+      "location": "B310",
+      "start": "2026-07-17 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-17 18:00",
+      "eventId": "bmVEbnArV25ITStSQlE5WU1QOHhJUT09_1784278800000",
+      "location": "项目室(D1-1604)",
+      "start": "2026-07-17 17:00",
+      "title": "模型算法团队周会"
+    },
+    {
+      "end": "2026-07-17 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784293200000",
+      "start": "2026-07-17 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "events": [
+    {
+      "end": "2026-07-13 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1783905300000",
+      "location": "B310",
+      "start": "2026-07-13 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-13 15:30",
+      "eventId": "UTFidStpV3JUcnVQRDhHZThjZVJGQT09",
+      "start": "2026-07-13 15:00",
+      "title": "llm-wiki的能力共创快速对一下使用说明"
+    },
+    {
+      "end": "2026-07-13 16:15",
+      "eventId": "bjZWVmlieHVpUUJJMm15RGFUMlRIZz09",
+      "start": "2026-07-13 15:30",
+      "title": "聊聊"
+    },
+    {
+      "end": "2026-07-13 16:30",
+      "eventId": "elVnVE45K1YvcStEbEpvM2RxbGVYQT09",
+      "location": "2003",
+      "start": "2026-07-13 16:00",
+      "title": "AI技术平台小周会"
+    },
+    {
+      "end": "2026-07-13 18:00",
+      "eventId": "RXJDc2RMNzNPWkRZRnpzTU1NZ1Nsdz09_1783933200000",
+      "location": "B310",
+      "start": "2026-07-13 17:00",
+      "title": "AI营销周会"
+    },
+    {
+      "end": "2026-07-13 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1783947600000",
+      "start": "2026-07-13 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    },
+    {
+      "end": "2026-07-14 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1783991700000",
+      "location": "B310",
+      "start": "2026-07-14 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-14 14:30",
+      "eventId": "d1BpNmZOVkdJaFY5dXdIVE9SdkZPQT09",
+      "location": "D1-2001",
+      "start": "2026-07-14 13:30",
+      "title": "简单聊一聊"
+    },
+    {
+      "end": "2026-07-14 20:30",
+      "eventId": "ZUtBTlQxNjY3TnJKM0JpVEx2T1Ardz09",
+      "location": "D1-2004",
+      "start": "2026-07-14 19:30",
+      "title": "盘一下算法 x 搜索搜问合作"
+    },
+    {
+      "end": "2026-07-14 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784034000000",
+      "start": "2026-07-14 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    },
+    {
+      "end": "2026-07-15 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000",
+      "location": "B310",
+      "start": "2026-07-15 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-15 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000",
+      "start": "2026-07-15 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    },
+    {
+      "end": "2026-07-16 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000",
+      "location": "B310",
+      "start": "2026-07-16 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-16 20:00",
+      "eventId": "cVRhbUZsMzZscU1XQjd0NURFaEdnZz09",
+      "location": "张功馆·桐庐菜(未来星宸永福店)",
+      "start": "2026-07-16 18:00",
+      "title": "搜问&搜索团队聚餐"
+    },
+    {
+      "end": "2026-07-16 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784206800000",
+      "start": "2026-07-16 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    },
+    {
+      "end": "2026-07-17 10:00",
+      "eventId": "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784250900000",
+      "location": "B310",
+      "start": "2026-07-17 09:15",
+      "title": "中控专属钉&AI项目早会"
+    },
+    {
+      "end": "2026-07-17 18:00",
+      "eventId": "bmVEbnArV25ITStSQlE5WU1QOHhJUT09_1784278800000",
+      "location": "项目室(D1-1604)",
+      "start": "2026-07-17 17:00",
+      "title": "模型算法团队周会"
+    },
+    {
+      "end": "2026-07-17 21:15",
+      "eventId": "cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784293200000",
+      "start": "2026-07-17 21:00",
+      "title": "循环提醒:项目每日工作进展同步"
+    }
+  ]
+}

doc · 19 个 · ↔ lark doc

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + + + + - - + + + + + - - + + + + + + - - + + + + + + + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws doc +comment-create --node <node> --content <content> --mention <mention>write
在文档上创建一条评论
dws mcp doc create_comment --json '{"nodeId":<..>, "content":<..>, "mentionedUserIds":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc-comment/create_comment
输入 / CLI 输出
输入
dws doc +comment-create --node x --content x --mention x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "content": "x",
+    "mentionedUserIds": [
+      "x"
+    ],
+    "nodeId": "x"
+  },
+  "product": "doc-comment",
+  "tool": "create_comment"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "content": "x",
+    "mentionedUserIds": [
+      "x"
+    ],
+    "nodeId": "x"
+  },
+  "product": "doc-comment",
+  "tool": "create_comment"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2263ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +comment-create --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --content 'DWS shortcut 真实测试 20260715:验证 doc +comment-create,可忽略。' --yes --format json
真实 stdout
{
+  "commentKey": "1784082136009b316ba6c48ad41ad92a8b6905406a17c",
+  "logId": "2132f5ca17840821358717098e08d7",
+  "message": "评论创建成功。commentKey: 1784082136009b316ba6c48ad41ad92a8b6905406a17c",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "commentKey": "1784082136009b316ba6c48ad41ad92a8b6905406a17c",
+  "logId": "2132f5ca17840821358717098e08d7",
+  "message": "评论创建成功。commentKey: 1784082136009b316ba6c48ad41ad92a8b6905406a17c",
+  "success": true
+}
dws doc +comment-create-inline --node <node> --content <content> --block-id <block-id> --start <start> --end <end> --selected-text <selected-text> --mention <mention>write
在文档选中文本区域上创建划词评论
dws mcp doc create_inline_comment --json '{"nodeId":<..>, "content":<..>, "blockId":<..>, "start":<..>, "end":<..>, "selectedText":<..>, "mentionedUserIds":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc-comment/create_inline_comment
输入 / CLI 输出
输入
dws doc +comment-create-inline --node x --content x --block-id x --start 1 --end 1 --selected-text x --mention x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "blockId": "x",
+    "content": "x",
+    "end": 1,
+    "mentionedUserIds": [
+      "x"
+    ],
+    "nodeId": "x",
+    "selectedText": "x",
+    "start": 1
+  },
+  "product": "doc-comment",
+  "tool": "create_inline_comment"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "blockId": "x",
+    "content": "x",
+    "end": 1,
+    "mentionedUserIds": [
+      "x"
+    ],
+    "nodeId": "x",
+    "selectedText": "x",
+    "start": 1
+  },
+  "product": "doc-comment",
+  "tool": "create_inline_comment"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1183ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test doc +comment-create-inline --node DWSREALTESTNOSUCHID0000000000000 --content 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --block-id DWSREALTESTNOSUCHID0000000000000 --start 0 --end 1 --selected-text 'DWS测试' --mention x --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc-comment/create_inline_comment)\n  hint: Document may have been deleted or moved",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.inputArgs.invalid",
+    "server_key": "doc-comment",
+    "trace_id": "2127d89817840999689931893e079c"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc-comment/create_inline_comment)\n  hint: Document may have been deleted or moved",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.inputArgs.invalid",
+    "server_key": "doc-comment",
+    "trace_id": "2127d89817840999689931893e079c"
+  }
+}
dws doc +comment-list --node <node> --limit <limit> --cursor <cursor> --type <type> --resolve-status <resolve-status>read
查询文档评论列表
dws mcp doc list_comments --json '{"nodeId":<..>, "pageSize":<..>, "nextToken":<..>, "commentType":<..>, "resolveStatus":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc-comment/list_comments
输入 / CLI 输出
输入
dws doc +comment-list --node x --limit 1 --cursor x --type global --resolve-status resolved --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "commentType": "global",
+    "nextToken": "x",
+    "nodeId": "x",
+    "pageSize": 1,
+    "resolveStatus": "resolved"
+  },
+  "product": "doc-comment",
+  "tool": "list_comments"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "commentType": "global",
+    "nextToken": "x",
+    "nodeId": "x",
+    "pageSize": 1,
+    "resolveStatus": "resolved"
+  },
+  "product": "doc-comment",
+  "tool": "list_comments"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2579ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +comment-list --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --limit 10 --type global --yes --format json
真实 stdout
{
+  "commentList": [
+    {
+      "commentKey": "1784082136009b316ba6c48ad41ad92a8b6905406a17c",
+      "content": "DWS shortcut 真实测试 20260715:验证 doc +comment-create,可忽略。",
+      "createTime": 1784082136009,
+      "isGlobal": true,
+      "isSolved": false,
+      "quote": null,
+      "updateTime": 1784082136009
+    },
+    {
+      "commentKey": "1784082170012979f5c547f7a49e88a6c1dd718bbb304",
+      "content": "DWS shortcut 真实测试 20260715:验证 doc +comment-reply,可忽略。",
+      "createTime": 1784082170012,
+      "isGlobal": true,
+      "isSolved": false,
+      "quote": null,
+      "updateTime": 1784082170012
+    }
+  ],
+  "hasMore": false,
+  "logId": "213ee25c17840994077796280e0923",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "commentList": [
+    {
+      "commentKey": "1784082136009b316ba6c48ad41ad92a8b6905406a17c",
+      "content": "DWS shortcut 真实测试 20260715:验证 doc +comment-create,可忽略。",
+      "createTime": 1784082136009,
+      "isGlobal": true,
+      "isSolved": false,
+      "quote": null,
+      "updateTime": 1784082136009
+    },
+    {
+      "commentKey": "1784082170012979f5c547f7a49e88a6c1dd718bbb304",
+      "content": "DWS shortcut 真实测试 20260715:验证 doc +comment-reply,可忽略。",
+      "createTime": 1784082170012,
+      "isGlobal": true,
+      "isSolved": false,
+      "quote": null,
+      "updateTime": 1784082170012
+    }
+  ],
+  "hasMore": false,
+  "logId": "213ee25c17840994077796280e0923",
+  "success": true
+}
dws doc +comment-reply --node <node> --content <content> --comment-key <comment-key> --emoji <emoji> --mention <mention>write
回复文档中的一条评论
dws mcp doc reply_comment --json '{"nodeId":<..>, "content":<..>, "replyCommentKey":<..>, "emoji":<..>, "mentionedUserIds":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc-comment/reply_comment
输入 / CLI 输出
输入
dws doc +comment-reply --node x --content x --comment-key x --emoji --mention x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "content": "x",
+    "emoji": true,
+    "mentionedUserIds": [
+      "x"
+    ],
+    "nodeId": "x",
+    "replyCommentKey": "x"
+  },
+  "product": "doc-comment",
+  "tool": "reply_comment"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "content": "x",
+    "emoji": true,
+    "mentionedUserIds": [
+      "x"
+    ],
+    "nodeId": "x",
+    "replyCommentKey": "x"
+  },
+  "product": "doc-comment",
+  "tool": "reply_comment"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1553ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +comment-reply --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --comment-key 1784082136009b316ba6c48ad41ad92a8b6905406a17c --content 'DWS shortcut 真实测试 20260715:验证 doc +comment-reply,可忽略。' --yes --format json
真实 stdout
{
+  "commentKey": "1784082170012979f5c547f7a49e88a6c1dd718bbb304",
+  "logId": "2106d98117840821697518379e089c",
+  "message": "回复评论成功。commentKey: 1784082170012979f5c547f7a49e88a6c1dd718bbb304",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "commentKey": "1784082170012979f5c547f7a49e88a6c1dd718bbb304",
+  "logId": "2106d98117840821697518379e089c",
+  "message": "回复评论成功。commentKey: 1784082170012979f5c547f7a49e88a6c1dd718bbb304",
+  "success": true
+}
dws doc +copy --node <node> --folder <folder> --workspace <workspace>write
复制文档/文件到指定文件夹或知识库
dws mcp doc copy_document --json '{"nodeId":<..>, "targetFolderId":<..>, "workspaceId":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/copy_document
输入 / CLI 输出
输入
dws doc +copy --node x --folder x --workspace x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "copy_document"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "copy_document"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1531ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +copy --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --yes --format json
真实 stdout
{
+  "docUrl": "https://alidocs.dingtalk.com/i/nodes/7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+  "message": "节点复制成功,已复制到目标文件夹。sourceNodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ,新节点 ID: 7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+  "nodeId": "7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "docUrl": "https://alidocs.dingtalk.com/i/nodes/7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+  "message": "节点复制成功,已复制到目标文件夹。sourceNodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ,新节点 ID: 7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+  "nodeId": "7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+  "success": true
+}
dws doc +doc-append --doc <doc> --text <text>write
在文档末尾追加一段文本(安全追加,不改动原有内容)
dws mcp doc update_document --json '{"nodeId":<..>, "markdown":<..>, "mode":<..>}'dws doc +doc-append --doc <doc> --text <text>write复合/智能型
在文档末尾追加一段文本(安全追加,不改动原有内容)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 update_document lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/update_document
输入 / CLI 输出
输入
dws doc +doc-append --doc x --text x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "markdown": "x",
+    "mode": "append",
+    "nodeId": "x"
+  },
+  "product": "doc",
+  "tool": "update_document"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "markdown": "x",
+    "mode": "append",
+    "nodeId": "x"
+  },
+  "product": "doc",
+  "tool": "update_document"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2892ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +doc-append --doc P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --text 'DWS shortcut 真实测试 20260715:验证 doc +doc-append。' --yes --format json
真实 stdout
{
+  "logId": "213ee25c17840821367055154e08a0",
+  "message": "内容已成功追加到文档末尾,原有内容保持不变。",
+  "mode": "append",
+  "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "logId": "213ee25c17840821367055154e08a0",
+  "message": "内容已成功追加到文档末尾,原有内容保持不变。",
+  "mode": "append",
+  "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "success": true
+}
dws doc +export-get --job-id <job-id>read
根据 jobId 查询文档导出任务结果
dws mcp doc query_export_job --json '{"jobId":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/query_export_job
输入 / CLI 输出
输入
dws doc +export-get --job-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "jobId": "x"
+  },
+  "product": "doc",
+  "tool": "query_export_job"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "jobId": "x"
+  },
+  "product": "doc",
+  "tool": "query_export_job"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1379ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +export-get --job-id 29346731713 --yes --format json
真实 stdout
{
+  "downloadUrl": "[REDACTED_OSS_URL]",
+  "jobId": "29346731713",
+  "logId": "2132f5ca17840994092582121e08d9",
+  "message": "Export job completed. The file is ready for download via the downloadUrl.",
+  "status": "success",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "downloadUrl": "[REDACTED_OSS_URL]",
+  "jobId": "29346731713",
+  "logId": "2132f5ca17840994092582121e08d9",
+  "message": "Export job completed. The file is ready for download via the downloadUrl.",
+  "status": "success",
+  "success": true
+}
dws doc +export-submit --node <node> --export-format <export-format>read
提交在线文档导出任务 (docx/markdown/pdf),返回 jobId
dws mcp doc submit_export_job --json '{"nodeId":<..>, "exportFormat":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/submit_export_job
输入 / CLI 输出
输入
dws doc +export-submit --node x --export-format docx --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "exportFormat": "docx",
+    "nodeId": "x"
+  },
+  "product": "doc",
+  "tool": "submit_export_job"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "exportFormat": "docx",
+    "nodeId": "x"
+  },
+  "product": "doc",
+  "tool": "submit_export_job"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1573ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +export-submit --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --export-format docx --yes --format json
真实 stdout
{
+  "jobId": "29346731713",
+  "logId": "2132f5ca17840994104887005e08d8",
+  "message": "Export job submitted successfully. Use query_export_job with jobId '29346731713' to check the export status and get the download link.",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "jobId": "29346731713",
+  "logId": "2132f5ca17840994104887005e08d8",
+  "message": "Export job submitted successfully. Use query_export_job with jobId '29346731713' to check the export status and get the download link.",
+  "success": true
+}
dws doc +find-doc --query <query> --limit <limit>read
按关键词搜索云文档并投影关键字段(只读)
dws mcp doc <tool>dws doc +find-doc --query <query> --limit <limit>read复合/智能型
按关键词搜索云文档并投影关键字段(只读)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/search_documents;没搜到文档
输入 / CLI 输出
输入
dws doc +find-doc --query x --limit 1 --yes
stdout
(空)
stderr / error
没搜到文档
最终用于判定的返回
没搜到文档
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2146ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +find-doc --query '测试' --limit 10 --yes --format json
真实 stdout
{
+  "count": 10,
+  "documents": [
+    {
+      "title": "DWS shortcut 真实测试文档 20260715",
+      "token": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space"
+    },
+    {
+      "title": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03",
+      "token": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试 -20260414",
+      "token": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(25)",
+      "token": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(5)",
+      "token": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(24)",
+      "token": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(22)",
+      "token": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(26)(2)",
+      "token": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space"
+    },
+    {
+      "title": "悟空DWS全部测试账号信息",
+      "token": "X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space"
+    },
+    {
+      "title": "测试",
+      "token": "1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 10,
+  "documents": [
+    {
+      "title": "DWS shortcut 真实测试文档 20260715",
+      "token": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space"
+    },
+    {
+      "title": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03",
+      "token": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试 -20260414",
+      "token": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(25)",
+      "token": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(5)",
+      "token": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(24)",
+      "token": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(22)",
+      "token": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "title": "文件扫描测试(26)(2)",
+      "token": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space"
+    },
+    {
+      "title": "悟空DWS全部测试账号信息",
+      "token": "X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space"
+    },
+    {
+      "title": "测试",
+      "token": "1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE",
+      "type": "",
+      "url": "https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space"
+    }
+  ]
+}
dws doc +list --folder <folder> --workspace <workspace> --limit <limit> --cursor <cursor>read
列出文件夹或知识库下的直接子节点
dws mcp doc <tool> lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/list_nodes
输入 / CLI 输出
输入
dws doc +list --folder x --workspace x --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "nodes": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "nodes": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2075ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +list --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --limit 10 --yes --format json
真实 stdout
{
+  "count": 10,
+  "nodes": [
+    {
+      "name": "DWS shortcut 真实测试文档 20260715(2)",
+      "nodeId": "np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l?utm_scene=person_space"
+    },
+    {
+      "name": "DWS shortcut 真实测试文档 20260715",
+      "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space"
+    },
+    {
+      "name": "DWS shortcut 真实测试文档 20260715(1)",
+      "nodeId": "7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3?utm_scene=person_space"
+    },
+    {
+      "name": "知识库对接调研问卷-供各业务系统填写",
+      "nodeId": "R4GpnMqJzOP0oLp6skZ0Kmvp8Ke0xjE3",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/R4GpnMqJzOP0oLp6skZ0Kmvp8Ke0xjE3?utm_scene=person_space"
+    },
+    {
+      "name": "无标题文档(2)",
+      "nodeId": "X6GRezwJlYxMoDeBsgX95gYj8dqbropQ",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsgX95gYj8dqbropQ?utm_scene=person_space"
+    },
+    {
+      "name": "hi",
+      "nodeId": "1zknDm0WRz0NZeXQu01lGOdmWBQEx5rG",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/1zknDm0WRz0NZeXQu01lGOdmWBQEx5rG?utm_scene=person_space"
+    },
+    {
+      "name": "T(2)",
+      "nodeId": "dxXB52LJqwZrolvyFKLy25D9WqjMp697",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/dxXB52LJqwZrolvyFKLy25D9WqjMp697?utm_scene=person_space"
+    },
+    {
+      "name": "T(1)",
+      "nodeId": "mweZ92PV6O36dZbnsML6RyaAJxEKBD6p",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/mweZ92PV6O36dZbnsML6RyaAJxEKBD6p?utm_scene=person_space"
+    },
+    {
+      "name": "T",
+      "nodeId": "4lgGw3P8vwYmoljyFg90Z2X9W5daZ90D",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/4lgGw3P8vwYmoljyFg90Z2X9W5daZ90D?utm_scene=person_space"
+    },
+    {
+      "name": "念晨与hugozhu的会话 2026年06月22日",
+      "nodeId": "GZLxjv9VGGDA9Ro2u6yKZ7BxV6EDybno",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/GZLxjv9VGGDA9Ro2u6yKZ7BxV6EDybno?utm_scene=person_space"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 10,
+  "nodes": [
+    {
+      "name": "DWS shortcut 真实测试文档 20260715(2)",
+      "nodeId": "np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l?utm_scene=person_space"
+    },
+    {
+      "name": "DWS shortcut 真实测试文档 20260715",
+      "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space"
+    },
+    {
+      "name": "DWS shortcut 真实测试文档 20260715(1)",
+      "nodeId": "7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3?utm_scene=person_space"
+    },
+    {
+      "name": "知识库对接调研问卷-供各业务系统填写",
+      "nodeId": "R4GpnMqJzOP0oLp6skZ0Kmvp8Ke0xjE3",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/R4GpnMqJzOP0oLp6skZ0Kmvp8Ke0xjE3?utm_scene=person_space"
+    },
+    {
+      "name": "无标题文档(2)",
+      "nodeId": "X6GRezwJlYxMoDeBsgX95gYj8dqbropQ",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsgX95gYj8dqbropQ?utm_scene=person_space"
+    },
+    {
+      "name": "hi",
+      "nodeId": "1zknDm0WRz0NZeXQu01lGOdmWBQEx5rG",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/1zknDm0WRz0NZeXQu01lGOdmWBQEx5rG?utm_scene=person_space"
+    },
+    {
+      "name": "T(2)",
+      "nodeId": "dxXB52LJqwZrolvyFKLy25D9WqjMp697",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/dxXB52LJqwZrolvyFKLy25D9WqjMp697?utm_scene=person_space"
+    },
+    {
+      "name": "T(1)",
+      "nodeId": "mweZ92PV6O36dZbnsML6RyaAJxEKBD6p",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/mweZ92PV6O36dZbnsML6RyaAJxEKBD6p?utm_scene=person_space"
+    },
+    {
+      "name": "T",
+      "nodeId": "4lgGw3P8vwYmoljyFg90Z2X9W5daZ90D",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/4lgGw3P8vwYmoljyFg90Z2X9W5daZ90D?utm_scene=person_space"
+    },
+    {
+      "name": "念晨与hugozhu的会话 2026年06月22日",
+      "nodeId": "GZLxjv9VGGDA9Ro2u6yKZ7BxV6EDybno",
+      "nodeType": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/GZLxjv9VGGDA9Ro2u6yKZ7BxV6EDybno?utm_scene=person_space"
+    }
+  ]
+}
dws doc +move --node <node> --folder <folder> --workspace <workspace>write
移动文档/文件到指定文件夹或知识库
dws mcp doc move_document --json '{"nodeId":<..>, "targetFolderId":<..>, "workspaceId":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/move_document
输入 / CLI 输出
输入
dws doc +move --node x --folder x --workspace x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "move_document"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "move_document"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1087ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +move --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --yes --format json
真实 stdout
{
+  "docUrl": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "message": "节点移动成功,已移动到目标文件夹。nodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ",
+  "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "docUrl": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "message": "节点移动成功,已移动到目标文件夹。nodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ",
+  "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "success": true
+}
dws doc +search --query <query> --extensions <extensions> --created-from <created-from> --created-to <created-to> --visited-from <visited-from> --visited-to <visited-to> --creator-uids <creator-uids> --editor-uids <editor-uids> --mentioned-uids <mentioned-uids> --workspace-ids <workspace-ids> --limit <limit> --cursor <cursor>read
按关键词搜索有权限的文档 (不传则返回最近访问)
dws mcp doc <tool> lark-cli doc +search已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/search_documents
输入 / CLI 输出
输入
dws doc +search --query x --extensions x --created-from 1 --created-to 1 --visited-from 1 --visited-to 1 --creator-uids x --editor-uids x --mentioned-uids x --workspace-ids x --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "documents": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "documents": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1911ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +search --query '测试' --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "count": 10,
+  "documents": [
+    {
+      "docType": "adoc",
+      "modifiedTime": null,
+      "name": "DWS shortcut 真实测试文档 20260715",
+      "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "url": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03",
+      "nodeId": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "url": "https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试 -20260414",
+      "nodeId": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "url": "https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(25)",
+      "nodeId": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "url": "https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(5)",
+      "nodeId": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "url": "https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(24)",
+      "nodeId": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(22)",
+      "nodeId": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(26)(2)",
+      "nodeId": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "url": "https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space"
+    },
+    {
+      "docType": "adoc",
+      "modifiedTime": null,
+      "name": "悟空DWS全部测试账号信息",
+      "nodeId": "X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ",
+      "url": "https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space"
+    },
+    {
+      "docType": "folder",
+      "modifiedTime": null,
+      "name": "测试",
+      "nodeId": "1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE",
+      "url": "https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 10,
+  "documents": [
+    {
+      "docType": "adoc",
+      "modifiedTime": null,
+      "name": "DWS shortcut 真实测试文档 20260715",
+      "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "url": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03",
+      "nodeId": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "url": "https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试 -20260414",
+      "nodeId": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "url": "https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(25)",
+      "nodeId": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "url": "https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(5)",
+      "nodeId": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "url": "https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(24)",
+      "nodeId": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(22)",
+      "nodeId": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "docType": "able",
+      "modifiedTime": null,
+      "name": "文件扫描测试(26)(2)",
+      "nodeId": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "url": "https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space"
+    },
+    {
+      "docType": "adoc",
+      "modifiedTime": null,
+      "name": "悟空DWS全部测试账号信息",
+      "nodeId": "X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ",
+      "url": "https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space"
+    },
+    {
+      "docType": "folder",
+      "modifiedTime": null,
+      "name": "测试",
+      "nodeId": "1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE",
+      "url": "https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space"
+    }
+  ]
+}
dws doc +share-doc --to <to> --url <url> --note <note>write
按姓名把文档链接私信发给某人(自动解析 userId)
dws mcp chat send_personal_message --json '{"title":<..>, "text":<..>, "receiverUserId":<..>, "msgType":<..>, "content":<..>}'dws doc +share-doc --to <to> --url <url> --note <note>write复合/智能型
按姓名把文档链接私信发给某人(自动解析 userId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 send_personal_message lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws doc +share-doc --to x --url x --note x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1943ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +share-doc --to '冬翔' --url https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --note 'DWS shortcut 修复复测 20260715:验证 doc +share-doc,请忽略。' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openTaskId": "30ETViSW+9qhs7fBO9cbeSocHjj2iUZL4firJPz/h/I="
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openTaskId": "30ETViSW+9qhs7fBO9cbeSocHjj2iUZL4firJPz/h/I="
+  },
+  "success": true
+}
dws doc +template-apply --template-id <template-id> --name <name> --folder <folder> --workspace <workspace>write
使用指定模板创建新文档
dws mcp doc apply_doc_template --json '{"templateId":<..>, "name":<..>, "folderId":<..>, "workspaceId":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/apply_doc_template
输入 / CLI 输出
输入
dws doc +template-apply --template-id x --name x --folder x --workspace x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "folderId": "x",
+    "name": "x",
+    "templateId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "apply_doc_template"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "folderId": "x",
+    "name": "x",
+    "templateId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "apply_doc_template"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1093ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test doc +template-apply --template-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --folder DWSREALTESTNOSUCHID0000000000000 --workspace DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: doc/apply_doc_template)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.inputArgs.invalid",
+    "server_key": "doc",
+    "trace_id": "2127d89817840999701186954e0757"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: doc/apply_doc_template)\n  hint: Check if the resource exists or if your account has permission",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.inputArgs.invalid",
+    "server_key": "doc",
+    "trace_id": "2127d89817840999701186954e0757"
+  }
+}
dws doc +template-list --source <source> --limit <limit> --cursor <cursor>read
获取文档模板列表
dws mcp doc list_doc_templates --json '{"templateSource":<..>, "maxResults":<..>, "nextCursor":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/list_doc_templates
输入 / CLI 输出
输入
dws doc +template-list --source MY --limit 1 --cursor x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "maxResults": 1,
+    "nextCursor": "x",
+    "templateSource": "MY"
+  },
+  "product": "doc",
+  "tool": "list_doc_templates"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "maxResults": 1,
+    "nextCursor": "x",
+    "templateSource": "MY"
+  },
+  "product": "doc",
+  "tool": "list_doc_templates"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1370ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +template-list --source MY --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "hasMore": false,
+  "logId": "213ee25c17840994183018652e08e2",
+  "message": "成功获取 3 个模版。",
+  "success": true,
+  "templates": [
+    {
+      "coverUrl": "[REDACTED_OSS_URL]",
+      "description": null,
+      "templateId": "494040872345",
+      "title": "接口定义模版v1.0",
+      "usedCount": null
+    },
+    {
+      "coverUrl": "[REDACTED_OSS_URL]",
+      "description": null,
+      "templateId": "494801282345",
+      "title": "接口定义与描述模版",
+      "usedCount": null
+    },
+    {
+      "coverUrl": "[REDACTED_OSS_URL]",
+      "description": null,
+      "templateId": "111001402345",
+      "title": "2023届钉钉音视频春招海报",
+      "usedCount": null
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "hasMore": false,
+  "logId": "213ee25c17840994183018652e08e2",
+  "message": "成功获取 3 个模版。",
+  "success": true,
+  "templates": [
+    {
+      "coverUrl": "[REDACTED_OSS_URL]",
+      "description": null,
+      "templateId": "494040872345",
+      "title": "接口定义模版v1.0",
+      "usedCount": null
+    },
+    {
+      "coverUrl": "[REDACTED_OSS_URL]",
+      "description": null,
+      "templateId": "494801282345",
+      "title": "接口定义与描述模版",
+      "usedCount": null
+    },
+    {
+      "coverUrl": "[REDACTED_OSS_URL]",
+      "description": null,
+      "templateId": "111001402345",
+      "title": "2023届钉钉音视频春招海报",
+      "usedCount": null
+    }
+  ]
+}
dws doc +template-search --query <query> --source <source> --limit <limit> --cursor <cursor>read
根据关键词搜索文档模板
dws mcp doc search_doc_templates --json '{"searchName":<..>, "templateSource":<..>, "maxResults":<..>, "nextCursor":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/search_doc_templates
输入 / CLI 输出
输入
dws doc +template-search --query x --source MY --limit 1 --cursor x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "maxResults": 1,
+    "nextCursor": "x",
+    "searchName": "x",
+    "templateSource": "MY"
+  },
+  "product": "doc",
+  "tool": "search_doc_templates"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "maxResults": 1,
+    "nextCursor": "x",
+    "searchName": "x",
+    "templateSource": "MY"
+  },
+  "product": "doc",
+  "tool": "search_doc_templates"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1576ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +template-search --query '测试' --source MY --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "hasMore": false,
+  "logId": "213ee25c17840994199004331e08a0",
+  "message": "未找到与「测试」相关的模版,请尝试其他关键词。",
+  "success": true,
+  "templates": []
+}
真实 stderr / error
(空)
真实返回
{
+  "hasMore": false,
+  "logId": "213ee25c17840994199004331e08a0",
+  "message": "未找到与「测试」相关的模版,请尝试其他关键词。",
+  "success": true,
+  "templates": []
+}
dws doc +version-list --node <node> --limit <limit> --cursor <cursor>read
查看文档历史版本列表
dws mcp doc list_doc_versions --json '{"nodeId":<..>, "maxResults":<..>, "nextCursor":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/list_doc_versions
输入 / CLI 输出
输入
dws doc +version-list --node x --limit 1 --cursor x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "maxResults": 1,
+    "nextCursor": "x",
+    "nodeId": "x"
+  },
+  "product": "doc",
+  "tool": "list_doc_versions"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "maxResults": 1,
+    "nextCursor": "x",
+    "nodeId": "x"
+  },
+  "product": "doc",
+  "tool": "list_doc_versions"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2069ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +version-list --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "hasMore": false,
+  "success": true,
+  "versions": [
+    {
+      "createTime": "2026-07-15T10:21:47+08:00",
+      "type": "AUTO_SAVE",
+      "updateTime": "2026-07-15T10:21:47+08:00",
+      "userId": "202397",
+      "version": 0
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "hasMore": false,
+  "success": true,
+  "versions": [
+    {
+      "createTime": "2026-07-15T10:21:47+08:00",
+      "type": "AUTO_SAVE",
+      "updateTime": "2026-07-15T10:21:47+08:00",
+      "userId": "202397",
+      "version": 0
+    }
+  ]
+}
dws doc +version-revert --node <node> --version <version>high-risk-write
回滚文档到指定历史版本
dws mcp doc revert_doc_version --json '{"nodeId":<..>, "version":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/revert_doc_version
输入 / CLI 输出
输入
dws doc +version-revert --node x --version 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "version": 1
+  },
+  "product": "doc",
+  "tool": "revert_doc_version"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "version": 1
+  },
+  "product": "doc",
+  "tool": "revert_doc_version"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2065ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +version-revert --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --version 1 --yes --format json
真实 stdout
{
+  "message": "文档已成功回滚到指定版本。",
+  "revertedToVersion": 1,
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "message": "文档已成功回滚到指定版本。",
+  "revertedToVersion": 1,
+  "success": true
+}
dws doc +version-save --node <node>write
手动保存文档版本快照
dws mcp doc save_doc_version --json '{"nodeId":<..>}' lark doc 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/save_doc_version
输入 / CLI 输出
输入
dws doc +version-save --node x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x"
+  },
+  "product": "doc",
+  "tool": "save_doc_version"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x"
+  },
+  "product": "doc",
+  "tool": "save_doc_version"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1853ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test doc +version-save --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --yes --format json
真实 stdout
{
+  "message": "文档版本已成功保存。",
+  "savedVersion": 1,
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "message": "文档版本已成功保存。",
+  "savedVersion": 1,
+  "success": true
+}

contact · 16 个 · ↔ lark contact

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ - - + + + - - + + + + + + + + + + - - + + + - - + + + - - + + + - - + + + + + - - + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws contact +by-mobile --mobile <mobile>read
按手机号查询某人的完整资料(自动解析 userId 后取详情)
dws mcp contact get_user_info_by_user_ids --json '{"mobile":<..>, "user_id_list":<..>}'dws contact +by-mobile --mobile <mobile>read复合/智能型
按手机号查询某人的完整资料(自动解析 userId 后取详情)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 get_user_info_by_user_ids lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_user_by_mobile;没找到绑定手机号 "x" 的用户;确认号码正确、且该人在当前组织通讯录中。
输入 / CLI 输出
输入
dws contact +by-mobile --mobile x --yes
stdout
(空)
stderr / error
没找到绑定手机号 "x" 的用户;确认号码正确、且该人在当前组织通讯录中。
最终用于判定的返回
没找到绑定手机号 "x" 的用户;确认号码正确、且该人在当前组织通讯录中。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1884ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +by-mobile --mobile 13161187007 --yes --format json
真实 stdout
{
+  "result": [
+    {
+      "isAdmin": false,
+      "orgEmployeeModel": {
+        "depts": [
+          {
+            "deptId": 842379556,
+            "deptName": "模型算法"
+          }
+        ],
+        "jobNumber": "202397",
+        "labels": [],
+        "orgAuthEmail": null,
+        "orgId": null,
+        "orgMasterDisplayName": "张俊韶",
+        "orgMasterUserId": "030386",
+        "orgName": "钉钉",
+        "orgTitle": "",
+        "orgUserId": "202397",
+        "orgUserName": "董鑫阳",
+        "positions": [
+          {
+            "deptId": 842379556,
+            "isMain": true,
+            "managerDisplayName": null,
+            "managerStaffId": null,
+            "title": null,
+            "workStation": "浙江-杭州-阿里中心·杭州未科 D1-20-015"
+          }
+        ]
+      }
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "result": [
+    {
+      "isAdmin": false,
+      "orgEmployeeModel": {
+        "depts": [
+          {
+            "deptId": 842379556,
+            "deptName": "模型算法"
+          }
+        ],
+        "jobNumber": "202397",
+        "labels": [],
+        "orgAuthEmail": null,
+        "orgId": null,
+        "orgMasterDisplayName": "张俊韶",
+        "orgMasterUserId": "030386",
+        "orgName": "钉钉",
+        "orgTitle": "",
+        "orgUserId": "202397",
+        "orgUserName": "董鑫阳",
+        "positions": [
+          {
+            "deptId": 842379556,
+            "isMain": true,
+            "managerDisplayName": null,
+            "managerStaffId": null,
+            "title": null,
+            "workStation": "浙江-杭州-阿里中心·杭州未科 D1-20-015"
+          }
+        ]
+      }
+    }
+  ],
+  "success": true
+}
dws contact +dept-members --dept <dept>read
按部门名列出部门成员(自动解析 deptId)
dws mcp contact get_dept_members_by_deptId --json '{"query":<..>, "deptIds":<..>}'dws contact +dept-members --dept <dept>read复合/智能型
按部门名列出部门成员(自动解析 deptId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 get_dept_members_by_deptId lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_dept_by_keyword;没找到名字里包含 "x" 的部门;换个更准确的部门名再试。
输入 / CLI 输出
输入
dws contact +dept-members --dept x --yes
stdout
(空)
stderr / error
没找到名字里包含 "x" 的部门;换个更准确的部门名再试。
最终用于判定的返回
没找到名字里包含 "x" 的部门;换个更准确的部门名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1539ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +dept-members --dept '模型算法' --yes --format json
真实 stdout
{
+  "deptUserList": [
+    {
+      "userInfo": {
+        "name": "冯铖喆",
+        "userId": "453559"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "何佳瑶",
+        "userId": "548493"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "陈梦媛",
+        "userId": "378607"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "张俊韶",
+        "userId": "030386"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "陈邦杰",
+        "userId": "489149"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "王昊东",
+        "userId": "548778"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "岑锦锋",
+        "userId": "547857"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "彭智韩",
+        "userId": "478801"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "王迎湃",
+        "userId": "543875"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "段旭彬",
+        "userId": "550582"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "牛康佳",
+        "userId": "484887"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "符咏畅",
+        "userId": "519483"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "代成俊",
+        "userId": "167095"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "黄渊卓",
+        "userId": "519019"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "董鑫阳",
+        "userId": "202397"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "崔佳骐",
+        "userId": "534975"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "郑琪欣",
+        "userId": "543310"
+      }
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "deptUserList": [
+    {
+      "userInfo": {
+        "name": "冯铖喆",
+        "userId": "453559"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "何佳瑶",
+        "userId": "548493"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "陈梦媛",
+        "userId": "378607"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "张俊韶",
+        "userId": "030386"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "陈邦杰",
+        "userId": "489149"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "王昊东",
+        "userId": "548778"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "岑锦锋",
+        "userId": "547857"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "彭智韩",
+        "userId": "478801"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "王迎湃",
+        "userId": "543875"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "段旭彬",
+        "userId": "550582"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "牛康佳",
+        "userId": "484887"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "符咏畅",
+        "userId": "519483"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "代成俊",
+        "userId": "167095"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "黄渊卓",
+        "userId": "519019"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "董鑫阳",
+        "userId": "202397"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "崔佳骐",
+        "userId": "534975"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "郑琪欣",
+        "userId": "543310"
+      }
+    }
+  ],
+  "success": true
+}
dws contact +get-roster --staff-id <staff-id> --fields <fields>read
查询员工花名册字段信息(学历、家庭、银行卡、合同等)
dws mcp hrmregister get_authorized_emp_rosterInfo --json '{"staffId":<..>, "fieldCodeList":<..>}' lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;hrmregister/get_authorized_emp_rosterInfo
输入 / CLI 输出
输入
dws contact +get-roster --staff-id x --fields x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "fieldCodeList": [
+      "x"
+    ],
+    "staffId": "x"
+  },
+  "product": "hrmregister",
+  "tool": "get_authorized_emp_rosterInfo"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "fieldCodeList": [
+      "x"
+    ],
+    "staffId": "x"
+  },
+  "product": "hrmregister",
+  "tool": "get_authorized_emp_rosterInfo"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1895ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test contact +get-roster --staff-id x --fields x --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/get_authorized_emp_rosterInfo)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "2001",
+    "server_key": "hrmregister",
+    "trace_id": "2106d98117840997920166915e087b"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/get_authorized_emp_rosterInfo)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "2001",
+    "server_key": "hrmregister",
+    "trace_id": "2106d98117840997920166915e087b"
+  }
+}
dws contact +list-dept-members --depts <depts>read
查看部门成员(仅本部门,不含下级)
dws mcp contact <tool> lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_dept_members_by_deptId
输入 / CLI 输出
输入
dws contact +list-dept-members --depts x --yes
stdout
{
+  "count": 0,
+  "members": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "members": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=965ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +list-dept-members --depts x --yes --format json
真实 stdout
{
+  "count": 0,
+  "members": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "members": []
+}
dws contact +list-followingsread
获取当前用户的特别关注列表
dws mcp contact <tool> lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/list_my_followings
输入 / CLI 输出
输入
dws contact +list-followings --yes
stdout
{
+  "count": 0,
+  "followings": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "followings": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1658ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +list-followings --yes --format json
真实 stdout
{
+  "count": 13,
+  "followings": [
+    {
+      "openDingTalkId": "D1jIqGatuH3UbjK1S0jAZJrukgiPdVtRlZ"
+    },
+    {
+      "openDingTalkId": "DS8iSxaOjF5pjvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "D1jIqGatuH3UrNUuSZbqakTnUpQ3uwcViS"
+    },
+    {
+      "openDingTalkId": "D1jIqGatuH3X0M3DbwmJLFJDaK7t2NhxA"
+    },
+    {
+      "openDingTalkId": "D51G4GOo4SMLvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "DHpuMVMNL77HvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "DO3r8ZwxEZ7iSvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "DbQkLTHgGzOiSvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "D1jIqGatuH3UgB25OaELcBlHqiPGB82YtU"
+    },
+    {
+      "openDingTalkId": "D8y2OTDIEjFjWZ8DyfnKC9lug4rSiPJt8I"
+    },
+    {
+      "openDingTalkId": "DepgurAiSOr3bvpshro641ZyKOpvhZI2tI"
+    },
+    {
+      "openDingTalkId": "DtMlaaX4m2p8qiPOT4eDpd1MUBtiiFg6Xhx"
+    },
+    {
+      "openDingTalkId": "D1jIqGatuH3U4ekOiiRj3wcvSfoaqqfvEb"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 13,
+  "followings": [
+    {
+      "openDingTalkId": "D1jIqGatuH3UbjK1S0jAZJrukgiPdVtRlZ"
+    },
+    {
+      "openDingTalkId": "DS8iSxaOjF5pjvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "D1jIqGatuH3UrNUuSZbqakTnUpQ3uwcViS"
+    },
+    {
+      "openDingTalkId": "D1jIqGatuH3X0M3DbwmJLFJDaK7t2NhxA"
+    },
+    {
+      "openDingTalkId": "D51G4GOo4SMLvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "DHpuMVMNL77HvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "DO3r8ZwxEZ7iSvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "DbQkLTHgGzOiSvmTc3wM85awiEiE"
+    },
+    {
+      "openDingTalkId": "D1jIqGatuH3UgB25OaELcBlHqiPGB82YtU"
+    },
+    {
+      "openDingTalkId": "D8y2OTDIEjFjWZ8DyfnKC9lug4rSiPJt8I"
+    },
+    {
+      "openDingTalkId": "DepgurAiSOr3bvpshro641ZyKOpvhZI2tI"
+    },
+    {
+      "openDingTalkId": "DtMlaaX4m2p8qiPOT4eDpd1MUBtiiFg6Xhx"
+    },
+    {
+      "openDingTalkId": "D1jIqGatuH3U4ekOiiRj3wcvSfoaqqfvEb"
+    }
+  ]
+}
dws contact +list-role-members --id <id>read
查询角色下的成员列表
dws mcp contact <tool> lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_label_members_by_labelId
输入 / CLI 输出
输入
dws contact +list-role-members --id x --yes
stdout
{
+  "count": 0,
+  "members": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "members": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1162ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +list-role-members --id DWSREALREADNOSUCHID0000000000000 --yes --format json
真实 stdout
{
+  "count": 0,
+  "members": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "members": []
+}
dws contact +list-rolesread
获取企业所有角色(标签)列表
dws mcp contact <tool> lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_org_labels
输入 / CLI 输出
输入
dws contact +list-roles --yes
stdout
{
+  "count": 0,
+  "roles": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "roles": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1227ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +list-roles --yes --format json
真实 stdout
{
+  "count": 0,
+  "roles": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "roles": []
+}
dws contact +list-roster-fieldsread
查询花名册有权限的字段列表
dws mcp hrmregister list_authorized_roster_fields lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;hrmregister/list_authorized_roster_fields
输入 / CLI 输出
输入
dws contact +list-roster-fields --yes
stdout
{
+  "_fake": true,
+  "args": {},
+  "product": "hrmregister",
+  "tool": "list_authorized_roster_fields"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {},
+  "product": "hrmregister",
+  "tool": "list_authorized_roster_fields"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1305ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
权限 / 鉴权不足 / 非 CLI 可修
+真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。
真实输入
/private/tmp/dws-real-test contact +list-roster-fields --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/list_authorized_roster_fields)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "2001",
+    "server_key": "hrmregister",
+    "trace_id": "213ee25c17840997934295673e08e2"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/list_authorized_roster_fields)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "2001",
+    "server_key": "hrmregister",
+    "trace_id": "213ee25c17840997934295673e08e2"
+  }
+}
dws contact +list-sub-depts --dept <dept>read
查看指定部门的子部门
dws mcp contact <tool> lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_sub_depts_by_dept_id
输入 / CLI 输出
输入
dws contact +list-sub-depts --dept 1 --yes
stdout
{
+  "count": 0,
+  "depts": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "depts": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1217ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +list-sub-depts --dept 842379556 --yes --format json
真实 stdout
{
+  "count": 0,
+  "depts": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "depts": []
+}
dws contact +lookup --name <name>read
按姓名查询某人的完整资料(自动解析 userId 后取详情)
dws mcp contact get_user_info_by_user_ids --json '{"user_id_list":<..>}'dws contact +lookup --name <name>read复合/智能型
按姓名查询某人的完整资料(自动解析 userId 后取详情)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 get_user_info_by_user_ids lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws contact +lookup --name x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1698ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +lookup --name '冬翔' --yes --format json
真实 stdout
{
+  "result": [
+    {
+      "isAdmin": true,
+      "orgEmployeeModel": {
+        "depts": [
+          {
+            "deptId": 996530034,
+            "deptName": "AI终端与创新"
+          }
+        ],
+        "jobNumber": "103262",
+        "labels": [
+          {
+            "groupName": "默认",
+            "id": 2679876691,
+            "name": "子管理员",
+            "tagGroupCode": "2679876691"
+          },
+          {
+            "groupName": "默认",
+            "id": 2679876693,
+            "name": "主管",
+            "tagGroupCode": "2679876693"
+          }
+        ],
+        "orgAuthEmail": null,
+        "orgId": null,
+        "orgMasterDisplayName": "朱鸿",
+        "orgMasterUserId": "024083",
+        "orgName": "钉钉",
+        "orgTitle": "",
+        "orgUserId": "103262",
+        "orgUserName": "夏东翔",
+        "positions": [
+          {
+            "deptId": 996530034,
+            "isMain": true,
+            "managerDisplayName": null,
+            "managerStaffId": null,
+            "title": null,
+            "workStation": "浙江-杭州-阿里中心·杭州未科 "
+          }
+        ]
+      }
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "result": [
+    {
+      "isAdmin": true,
+      "orgEmployeeModel": {
+        "depts": [
+          {
+            "deptId": 996530034,
+            "deptName": "AI终端与创新"
+          }
+        ],
+        "jobNumber": "103262",
+        "labels": [
+          {
+            "groupName": "默认",
+            "id": 2679876691,
+            "name": "子管理员",
+            "tagGroupCode": "2679876691"
+          },
+          {
+            "groupName": "默认",
+            "id": 2679876693,
+            "name": "主管",
+            "tagGroupCode": "2679876693"
+          }
+        ],
+        "orgAuthEmail": null,
+        "orgId": null,
+        "orgMasterDisplayName": "朱鸿",
+        "orgMasterUserId": "024083",
+        "orgName": "钉钉",
+        "orgTitle": "",
+        "orgUserId": "103262",
+        "orgUserName": "夏东翔",
+        "positions": [
+          {
+            "deptId": 996530034,
+            "isMain": true,
+            "managerDisplayName": null,
+            "managerStaffId": null,
+            "title": null,
+            "workStation": "浙江-杭州-阿里中心·杭州未科 "
+          }
+        ]
+      }
+    }
+  ],
+  "success": true
+}
dws contact +meread
查看我自己的通讯录资料(姓名/userId/手机/部门/组织,干净投影)
dws mcp contact <tool>dws contact +meread复合/智能型
查看我自己的通讯录资料(姓名/userId/手机/部门/组织,干净投影)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_current_user_profile
输入 / CLI 输出
输入
dws contact +me --yes
stdout
{
+  "_fake": true,
+  "args": {},
+  "product": "contact",
+  "tool": "get_current_user_profile"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {},
+  "product": "contact",
+  "tool": "get_current_user_profile"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1072ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +me --yes --format json
真实 stdout
{
+  "dept": "模型算法",
+  "mobile": "13161187007",
+  "name": "董鑫阳",
+  "org": "钉钉",
+  "userId": "202397"
+}
真实 stderr / error
(空)
真实返回
{
+  "dept": "模型算法",
+  "mobile": "13161187007",
+  "name": "董鑫阳",
+  "org": "钉钉",
+  "userId": "202397"
+}
dws contact +org --name <name>read
按姓名查某人所在部门的详情(自动解析 userId 与 deptId)
dws mcp contact get_dept_info_by_dept_id --json '{"user_id_list":<..>, "deptId":<..>}'dws contact +org --name <name>read复合/智能型
按姓名查某人所在部门的详情(自动解析 userId 与 deptId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 get_dept_info_by_dept_id lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws contact +org --name x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1627ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +org --name '冬翔' --yes --format json
真实 stdout
{
+  "result": {
+    "deptId": 996530034,
+    "deptName": "AI终端与创新",
+    "memberCount": 5
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "result": {
+    "deptId": 996530034,
+    "deptName": "AI终端与创新",
+    "memberCount": 5
+  },
+  "success": true
+}
dws contact +resolve-dept --name <name>read
按名称搜索部门并解析出唯一 deptId(只读)
dws mcp contact <tool>dws contact +resolve-dept --name <name>read复合/智能型
按名称搜索部门并解析出唯一 deptId(只读)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_dept_by_keyword;没有找到名称包含 x 的部门
输入 / CLI 输出
输入
dws contact +resolve-dept --name x --yes
stdout
(空)
stderr / error
没有找到名称包含 x 的部门
最终用于判定的返回
没有找到名称包含 x 的部门
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1186ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +resolve-dept --name '模型算法' --yes --format json
真实 stdout
{
+  "deptId": "842379556",
+  "name": "技术平台-模型算法",
+  "resolved": true
+}
真实 stderr / error
(空)
真实返回
{
+  "deptId": "842379556",
+  "name": "技术平台-模型算法",
+  "resolved": true
+}
dws contact +search-mobile --mobile <mobile>read
按手机号搜索通讯录用户
dws mcp contact <tool> lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_user_by_mobile
输入 / CLI 输出
输入
dws contact +search-mobile --mobile x --yes
stdout
{
+  "count": 0,
+  "users": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "users": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1415ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +search-mobile --mobile 13000000000 --yes --format json
真实 stdout
{
+  "count": 0,
+  "users": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "users": []
+}
dws contact +search-user --query <query>read
按关键词搜索通讯录用户
dws mcp contact <tool> lark-cli contact +search-user已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word
输入 / CLI 输出
输入
dws contact +search-user --query x --yes
stdout
{
+  "count": 0,
+  "users": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "users": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1419ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +search-user --query '测试' --yes --format json
真实 stdout
{
+  "count": 4,
+  "users": [
+    {
+      "flowerName": null,
+      "name": null,
+      "openDingTalkId": "Dn3FQ9n3oCiiNviSya2usICjFug4rSiPJt8I",
+      "title": null,
+      "userId": null
+    },
+    {
+      "flowerName": null,
+      "name": null,
+      "openDingTalkId": "Dxud965XFNRyGCOG0Bwk0pVug4rSiPJt8I",
+      "title": null,
+      "userId": null
+    },
+    {
+      "flowerName": null,
+      "name": null,
+      "openDingTalkId": "D1jIqGatuH3VffnYwNdg1p2LlYiSf05oYii",
+      "title": null,
+      "userId": null
+    },
+    {
+      "flowerName": null,
+      "name": "测试",
+      "openDingTalkId": "D1jIqGatuH3WSeoELOC89rgTx03b5vNii1",
+      "title": "",
+      "userId": "036230684122903146"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 4,
+  "users": [
+    {
+      "flowerName": null,
+      "name": null,
+      "openDingTalkId": "Dn3FQ9n3oCiiNviSya2usICjFug4rSiPJt8I",
+      "title": null,
+      "userId": null
+    },
+    {
+      "flowerName": null,
+      "name": null,
+      "openDingTalkId": "Dxud965XFNRyGCOG0Bwk0pVug4rSiPJt8I",
+      "title": null,
+      "userId": null
+    },
+    {
+      "flowerName": null,
+      "name": null,
+      "openDingTalkId": "D1jIqGatuH3VffnYwNdg1p2LlYiSf05oYii",
+      "title": null,
+      "userId": null
+    },
+    {
+      "flowerName": null,
+      "name": "测试",
+      "openDingTalkId": "D1jIqGatuH3WSeoELOC89rgTx03b5vNii1",
+      "title": "",
+      "userId": "036230684122903146"
+    }
+  ]
+}
dws contact +team --name <name>read
按姓名列出某人所在部门的成员(自动解析 userId 与 deptId)
dws mcp contact get_dept_members_by_deptId --json '{"user_id_list":<..>, "deptIds":<..>}'dws contact +team --name <name>read复合/智能型
按姓名列出某人所在部门的成员(自动解析 userId 与 deptId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 get_dept_members_by_deptId lark contact 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws contact +team --name x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1738ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test contact +team --name '冬翔' --yes --format json
真实 stdout
{
+  "deptUserList": [
+    {
+      "userInfo": {
+        "name": "黄文杰",
+        "userId": "106261"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "夏东翔",
+        "userId": "103262"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "何伟楠",
+        "userId": "106201"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "汪鑫",
+        "userId": "323179"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "刘光宇",
+        "userId": "112161"
+      }
+    }
+  ],
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "deptUserList": [
+    {
+      "userInfo": {
+        "name": "黄文杰",
+        "userId": "106261"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "夏东翔",
+        "userId": "103262"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "何伟楠",
+        "userId": "106201"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "汪鑫",
+        "userId": "323179"
+      }
+    },
+    {
+      "userInfo": {
+        "name": "刘光宇",
+        "userId": "112161"
+      }
+    }
+  ],
+  "success": true
+}

minutes · 13 个 · ↔ lark minutes

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ - - + + + - - + + + - - + + + + + + - - + + + + + + + - - + + + - - + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws minutes +action-itemsread
取我最新一条妙记里的待办事项
dws mcp minutes list_minutes_todos --json '{"belongingConditionId":<..>, "maxResults":<..>, "taskUuid":<..>}'dws minutes +action-itemsread复合/智能型
取我最新一条妙记里的待办事项
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 list_minutes_todos lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/list_by_keyword_and_time_range;暂无妙记
输入 / CLI 输出
输入
dws minutes +action-items --yes
stdout
(空)
stderr / error
暂无妙记
最终用于判定的返回
暂无妙记
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1286ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺妙记/听记真实 fixture / 需真实 fixture,非 CLI 可直接修
+当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。
真实输入
/private/tmp/dws-real-test minutes +action-items --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "暂无妙记"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "暂无妙记"
+  }
+}
dws minutes +detail --id <id> --artifacts <artifacts> --direction <direction>read
一条命令聚合取一条妙记(听记)的多项产物(基础信息/摘要/关键词/逐字稿/待办)
dws mcp minutes <tool>dws minutes +detail --id <id> --artifacts <artifacts> --direction <direction>read复合/智能型
一条命令聚合取一条妙记(听记)的多项产物(基础信息/摘要/关键词/逐字稿/待办)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark-cli minutes +detail实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);未知的 --artifacts 取值 "x",可选: basic,summary,keywords,transcript,todos
输入 / CLI 输出
输入
dws minutes +detail --id x --artifacts x --direction x --yes
stdout
(空)
stderr / error
未知的 --artifacts 取值 "x",可选: basic,summary,keywords,transcript,todos
最终用于判定的返回
未知的 --artifacts 取值 "x",可选: basic,summary,keywords,transcript,todos
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2608ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test minutes +detail --id DWSREALREADNOSUCHID0000000000000 --artifacts basic --direction older --yes --format json
真实 stdout
{
+  "basic": {
+    "error": "[UNCLASSIFIED] taskUuid is invalid\n  hint: Use --verbose for detailed error logs"
+  },
+  "taskUuid": "DWSREALREADNOSUCHID0000000000000"
+}
真实 stderr / error
(空)
真实返回
{
+  "basic": {
+    "error": "[UNCLASSIFIED] taskUuid is invalid\n  hint: Use --verbose for detailed error logs"
+  },
+  "taskUuid": "DWSREALREADNOSUCHID0000000000000"
+}
dws minutes +latest-minutes --keyword <keyword>read
取我最新的一条妙记(听记)详情
dws mcp minutes get_minutes_basic_info --json '{"belongingConditionId":<..>, "maxResults":<..>, "taskUuid":<..>}'dws minutes +latest-minutes --keyword <keyword>read复合/智能型
取我最新的一条妙记(听记)详情
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 get_minutes_basic_info lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/list_by_keyword_and_time_range;暂无妙记
输入 / CLI 输出
输入
dws minutes +latest-minutes --keyword x --yes
stdout
(空)
stderr / error
暂无妙记
最终用于判定的返回
暂无妙记
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=8499ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺妙记/听记真实 fixture / 需真实 fixture,非 CLI 可直接修
+当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。
真实输入
/private/tmp/dws-real-test minutes +latest-minutes --keyword '测试' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "暂无妙记"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "暂无妙记"
+  }
+}
dws minutes +list-all --query <query> --limit <limit> --cursor <cursor>read
查询我有权限访问的所有听记列表
dws mcp minutes <tool> lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/list_by_keyword_and_time_range
输入 / CLI 输出
输入
dws minutes +list-all --query x --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "minutes": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "minutes": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=23790ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test minutes +list-all --query '测试' --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "count": 0,
+  "minutes": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "minutes": []
+}
dws minutes +list-mine --query <query> --limit <limit> --cursor <cursor>read
查询我创建的听记列表
dws mcp minutes <tool> lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/list_by_keyword_and_time_range
输入 / CLI 输出
输入
dws minutes +list-mine --query x --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "minutes": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "minutes": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=27516ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test minutes +list-mine --query '测试' --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "count": 0,
+  "minutes": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "minutes": []
+}
dws minutes +list-shared --query <query> --limit <limit> --cursor <cursor>read
查询他人共享给我的听记列表
dws mcp minutes <tool> lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/list_by_keyword_and_time_range
输入 / CLI 输出
输入
dws minutes +list-shared --query x --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "minutes": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "minutes": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1362ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test minutes +list-shared --query '测试' --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "count": 0,
+  "minutes": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "minutes": []
+}
dws minutes +minutes-search --query <query>read
按关键词搜索我的妙记并投影列表
dws mcp minutes <tool>dws minutes +minutes-search --query <query>read复合/智能型
按关键词搜索我的妙记并投影列表
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/list_by_keyword_and_time_range;没搜到妙记
输入 / CLI 输出
输入
dws minutes +minutes-search --query x --yes
stdout
(空)
stderr / error
没搜到妙记
最终用于判定的返回
没搜到妙记
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1150ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test minutes +minutes-search --query '测试' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没搜到妙记"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没搜到妙记"
+  }
+}
dws minutes +record-pause --id <id> --session-id <session-id>write
暂停听记录音
dws mcp minutes 执行听记指令-发起AI听记录音 --json '{"cmd":<..>, "uuid":<..>, "sessionId":<..>}' lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/执行听记指令-发起AI听记录音
输入 / CLI 输出
输入
dws minutes +record-pause --id x --session-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cmd": "pause",
+    "sessionId": "x",
+    "uuid": "x"
+  },
+  "product": "minutes",
+  "tool": "执行听记指令-发起AI听记录音"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cmd": "pause",
+    "sessionId": "x",
+    "uuid": "x"
+  },
+  "product": "minutes",
+  "tool": "执行听记指令-发起AI听记录音"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1233ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test minutes +record-pause --id DWSREALTESTNOSUCHID0000000000000 --session-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "aiAgentTestRunCmdUnknownError",
+    "server_key": "minutes",
+    "trace_id": "0bb7c36217840999713124987e0757"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "aiAgentTestRunCmdUnknownError",
+    "server_key": "minutes",
+    "trace_id": "0bb7c36217840999713124987e0757"
+  }
+}
dws minutes +record-resume --id <id> --session-id <session-id>write
恢复听记录音
dws mcp minutes 执行听记指令-发起AI听记录音 --json '{"cmd":<..>, "uuid":<..>, "sessionId":<..>}' lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/执行听记指令-发起AI听记录音
输入 / CLI 输出
输入
dws minutes +record-resume --id x --session-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cmd": "resume",
+    "sessionId": "x",
+    "uuid": "x"
+  },
+  "product": "minutes",
+  "tool": "执行听记指令-发起AI听记录音"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cmd": "resume",
+    "sessionId": "x",
+    "uuid": "x"
+  },
+  "product": "minutes",
+  "tool": "执行听记指令-发起AI听记录音"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1074ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test minutes +record-resume --id DWSREALTESTNOSUCHID0000000000000 --session-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "aiAgentTestRunCmdUnknownError",
+    "server_key": "minutes",
+    "trace_id": "0bb7c36217840999724452848e0758"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "aiAgentTestRunCmdUnknownError",
+    "server_key": "minutes",
+    "trace_id": "0bb7c36217840999724452848e0758"
+  }
+}
dws minutes +record-start --session-id <session-id>write
发起听记(开始录音)
dws mcp minutes 执行听记指令-发起AI听记录音 --json '{"cmd":<..>, "sessionId":<..>}' lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/执行听记指令-发起AI听记录音
输入 / CLI 输出
输入
dws minutes +record-start --session-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cmd": "create",
+    "sessionId": "x"
+  },
+  "product": "minutes",
+  "tool": "执行听记指令-发起AI听记录音"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cmd": "create",
+    "sessionId": "x"
+  },
+  "product": "minutes",
+  "tool": "执行听记指令-发起AI听记录音"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=821ms;real-backend-safe-negative-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test minutes +record-start --session-id __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__ --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "cmd": "create",
+    "operatorUid": 512653609,
+    "sessionId": "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__",
+    "uid": 512653609
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "cmd": "create",
+    "operatorUid": 512653609,
+    "sessionId": "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__",
+    "uid": 512653609
+  },
+  "success": true
+}
dws minutes +record-stop --id <id> --session-id <session-id>write
结束听记录音
dws mcp minutes 执行听记指令-发起AI听记录音 --json '{"cmd":<..>, "uuid":<..>, "sessionId":<..>}' lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/执行听记指令-发起AI听记录音
输入 / CLI 输出
输入
dws minutes +record-stop --id x --session-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cmd": "end",
+    "sessionId": "x",
+    "uuid": "x"
+  },
+  "product": "minutes",
+  "tool": "执行听记指令-发起AI听记录音"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cmd": "end",
+    "sessionId": "x",
+    "uuid": "x"
+  },
+  "product": "minutes",
+  "tool": "执行听记指令-发起AI听记录音"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1130ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test minutes +record-stop --id DWSREALTESTNOSUCHID0000000000000 --session-id DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "aiAgentTestRunCmdUnknownError",
+    "server_key": "minutes",
+    "trace_id": "2127d89817840999735397508e0757"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "aiAgentTestRunCmdUnknownError",
+    "server_key": "minutes",
+    "trace_id": "2127d89817840999735397508e0757"
+  }
+}
dws minutes +replace-batch --id <id> --pair <pair>write
对一条妙记(听记)批量执行多组文字替换(原文=>替换)
dws mcp minutes <tool>dws minutes +replace-batch --id <id> --pair <pair>write复合/智能型
对一条妙记(听记)批量执行多组文字替换(原文=>替换)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark minutes 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);替换规则 "x" 缺少分隔符 "=>",应为 "原文=>替换"
输入 / CLI 输出
输入
dws minutes +replace-batch --id x --pair x --yes
stdout
(空)
stderr / error
替换规则 "x" 缺少分隔符 "=>",应为 "原文=>替换"
最终用于判定的返回
替换规则 "x" 缺少分隔符 "=>",应为 "原文=>替换"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=941ms;real-backend-safe-negative-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test minutes +replace-batch --id __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__ --pair '测试=>测试' --yes --format json
真实 stdout
{
+  "applied": 0,
+  "failed": 1,
+  "results": [
+    {
+      "error": "[UNCLASSIFIED] business error: success=false\n  hint: Use --verbose for detailed error logs",
+      "originalText": "测试",
+      "replacedText": "测试"
+    }
+  ],
+  "taskUuid": "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__",
+  "total": 1
+}
真实 stderr / error
(空)
真实返回
{
+  "applied": 0,
+  "failed": 1,
+  "results": [
+    {
+      "error": "[UNCLASSIFIED] business error: success=false\n  hint: Use --verbose for detailed error logs",
+      "originalText": "测试",
+      "replacedText": "测试"
+    }
+  ],
+  "taskUuid": "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__",
+  "total": 1
+}
dws minutes +transcript --keyword <keyword> --direction <direction>read
取我最新一条妙记(听记)的逐字稿(语音转写原文)
dws mcp minutes get_minutes_transcription --json '{"belongingConditionId":<..>, "maxResults":<..>, "taskUuid":<..>, "direction":<..>}'dws minutes +transcript --keyword <keyword> --direction <direction>read复合/智能型
取我最新一条妙记(听记)的逐字稿(语音转写原文)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 get_minutes_transcription lark minutes 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;minutes/list_by_keyword_and_time_range;暂无妙记
输入 / CLI 输出
输入
dws minutes +transcript --keyword x --direction x --yes
stdout
(空)
stderr / error
暂无妙记
最终用于判定的返回
暂无妙记
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1096ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
缺妙记/听记真实 fixture / 需真实 fixture,非 CLI 可直接修
+当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。
真实输入
/private/tmp/dws-real-test minutes +transcript --keyword '测试' --direction older --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "暂无妙记"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "暂无妙记"
+  }
+}

todo · 13 个 · ↔ lark task

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ - - + + + - - + + + - - + + + - - + + + + + + + + - - + + + - - + + + - - + + + - - + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws todo +assign --to <to> --task <task> --due <due>write
按姓名给某人创建并指派一条待办(自动解析 userId)
dws mcp todo create_personal_todo --json '{"subject":<..>, "executorIds":<..>, "PersonalTodoCreateVO":<..>}'dws todo +assign --to <to> --task <task> --due <due>write复合/智能型
按姓名给某人创建并指派一条待办(自动解析 userId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 create_personal_todo lark-cli task +assign已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws todo +assign --to x --task x --due x --yes
stdout
(空)
stderr / error
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1651ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +assign --to '冬翔' --task 'DWS shortcut 真实测试 20260715 assign,可忽略' --due 2026-07-16T10:00:00+08:00 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "result": {
+    "subject": "DWS shortcut 真实测试 20260715 assign,可忽略",
+    "taskId": "55037683708"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "result": {
+    "subject": "DWS shortcut 真实测试 20260715 assign,可忽略",
+    "taskId": "55037683708"
+  },
+  "success": true
+}
dws todo +assign-multi --to <to> --task <task>write
把一条待办按姓名一次性指派给多个人(自动把每个姓名解析成 userId)
dws mcp todo create_personal_todo --json '{"PersonalTodoCreateVO":<..>, "subject":<..>, "executorIds":<..>, "executors":<..>, "count":<..>}'dws todo +assign-multi --to <to> --task <task>write复合/智能型
把一条待办按姓名一次性指派给多个人(自动把每个姓名解析成 userId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 create_personal_todo lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/search_contact_by_key_word;以下执行人姓名无法唯一解析,已中止、未创建任何待办: +x: 通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
输入 / CLI 输出
输入
dws todo +assign-multi --to x --task x --yes
stdout
(空)
stderr / error
以下执行人姓名无法唯一解析,已中止、未创建任何待办:
+x: 通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
最终用于判定的返回
以下执行人姓名无法唯一解析,已中止、未创建任何待办:
+x: 通讯录里没找到叫 "x" 的人;换个更完整的姓名再试。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2445ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +assign-multi --to '冬翔,克谨,怒龙' --task 'DWS shortcut 真实测试 20260715 assign-multi,可忽略' --yes --format json
真实 stdout
{
+  "arguments": [],
+  "result": {
+    "subject": "DWS shortcut 真实测试 20260715 assign-multi,可忽略",
+    "taskId": "55037747621"
+  },
+  "success": true
+}
+{
+  "count": 3,
+  "executors": [
+    "夏东翔(103262)",
+    "黄渊卓(519019)",
+    "刘力(075771)"
+  ],
+  "subject": "DWS shortcut 真实测试 20260715 assign-multi,可忽略"
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "result": {
+    "subject": "DWS shortcut 真实测试 20260715 assign-multi,可忽略",
+    "taskId": "55037747621"
+  },
+  "success": true
+}
+{
+  "count": 3,
+  "executors": [
+    "夏东翔(103262)",
+    "黄渊卓(519019)",
+    "刘力(075771)"
+  ],
+  "subject": "DWS shortcut 真实测试 20260715 assign-multi,可忽略"
+}
dws todo +created-todosread
列出我创建的待办(我作为创建人 creator 发起的待办,而非分配给我执行的)
dws mcp todo <tool>dws todo +created-todosread复合/智能型
列出我创建的待办(我作为创建人 creator 发起的待办,而非分配给我执行的)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;todo/get_user_todos_in_current_org
输入 / CLI 输出
输入
dws todo +created-todos --yes
stdout
{
+  "created": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "created": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1733ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +created-todos --yes --format json
真实 stdout
{
+  "created": []
+}
真实 stderr / error
(空)
真实返回
{
+  "created": []
+}
dws todo +due-todayread
列出我今天到期的待办
dws mcp todo <tool>dws todo +due-todayread复合/智能型
列出我今天到期的待办
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark task 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);非法的 role-type "x",合法取值:creator, executor, participant
输入 / CLI 输出
输入
dws todo +due-today --role-types x --yes
stdout
(空)
stderr / error
非法的 role-type "x",合法取值:creator, executor, participant
最终用于判定的返回
非法的 role-type "x",合法取值:creator, executor, participant
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1145ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test todo +due-today --role-types executor --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "今天没有到期的待办"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "今天没有到期的待办"
+  }
+}
dws todo +get --task-id <task-id>read
查询待办详情
dws mcp todo get_todo_detail --json '{"taskId":<..>}' lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;todo/get_todo_detail
输入 / CLI 输出
输入
dws todo +get --task-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "taskId": "x"
+  },
+  "product": "todo",
+  "tool": "get_todo_detail"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "taskId": "x"
+  },
+  "product": "todo",
+  "tool": "get_todo_detail"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3658ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +get --task-id 55119034912 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "todoDetailModel": {
+      "activities": [
+        {
+          "action": "task.self.done",
+          "activityId": "14314572403",
+          "creatorId": 5255888716
+        },
+        {
+          "action": "task.create",
+          "activityId": "14178655650",
+          "creatorId": 2669375904
+        }
+      ],
+      "bizTag": "tb_group_task",
+      "createdTime": 1784017216974,
+      "creatorId": "2669375904",
+      "creatorInfo": {
+        "name": "李龙",
+        "nick": "粤腾",
+        "userId": 2669375904
+      },
+      "detailUrl": {
+        "appUrl": "https://n.dingtalk.com/dingding/dd-todo/detail/index.html?dd_darkmode=true\u0026android_scroll=false\u0026dd_mini_app_id=5000000004746689\u0026dt_editor=true\u0026dd_full_screen=true\u0026showmenu=false\u0026dd_progress=false\u0026dd_amplify=false\u0026newPage=true\u0026at_iframe=1\u0026from=homePage\u0026taskId=55119034912\u0026bizTag=tb_group_task\u0026cid=75985350515#/detail",
+        "pcUrl": "https://n.dingtalk.com/dingding/dd-todo/detail/index.html?dd_darkmode=true\u0026android_scroll=false\u0026dd_mini_app_id=5000000004746689\u0026dt_editor=true\u0026dd_full_screen=true\u0026showmenu=false\u0026dd_progress=false\u0026dd_amplify=false\u0026newPage=true\u0026at_iframe=1\u0026from=homePage\u0026taskId=55119034912\u0026bizTag=tb_group_task\u0026cid=75985350515#/detail"
+      },
+      "dueTime": 1784044740651,
+      "executorIds": [
+        "41129894",
+        "5255888716",
+        "447869",
+        "512653609",
+        "2669375904"
+      ],
+      "executorInfos": [
+        {
+          "name": "梓寻",
+          "nick": "梓寻",
+          "userId": 41129894
+        },
+        {
+          "name": "陈绪",
+          "nick": "陈叙",
+          "userId": 5255888716
+        },
+        {
+          "name": "徐洪鑫",
+          "nick": "崇幻",
+          "userId": 447869
+        },
+        {
+          "name": "董鑫阳",
+          "nick": "念晨",
+          "userId": 512653609
+        },
+        {
+          "name": "李龙",
+          "nick": "粤腾",
+          "userId": 2669375904
+        }
+      ],
+      "finishTime": 0,
+      "isDone": false,
+      "modifiedTime": 1784017216974,
+      "modifierId": "2669375904",
+      "orgId": 439446171,
+      "participantIds": [
+        "41129894",
+        "5255888716",
+        "447869",
+        "512653609",
+        "2669375904"
+      ],
+      "participantInfos": [
+        {
+          "name": "梓寻",
+          "nick": "梓寻",
+          "userId": 41129894
+        },
+        {
+          "name": "陈绪",
+          "nick": "陈叙",
+          "userId": 5255888716
+        },
+        {
+          "name": "徐洪鑫",
+          "nick": "崇幻",
+          "userId": 447869
+        },
+        {
+          "name": "董鑫阳",
+          "nick": "念晨",
+          "userId": 512653609
+        },
+        {
+          "name": "李龙",
+          "nick": "粤腾",
+          "userId": 2669375904
+        }
+      ],
+      "priority": 20,
+      "source": "conversation",
+      "subject": "中控Ai营销各Agent蓝图场景故事动线输出1-2页PPT",
+      "taskId": "55119034912",
+      "tenantId": "75985350515",
+      "tenantType": "group"
+    }
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "todoDetailModel": {
+      "activities": [
+        {
+          "action": "task.self.done",
+          "activityId": "14314572403",
+          "creatorId": 5255888716
+        },
+        {
+          "action": "task.create",
+          "activityId": "14178655650",
+          "creatorId": 2669375904
+        }
+      ],
+      "bizTag": "tb_group_task",
+      "createdTime": 1784017216974,
+      "creatorId": "2669375904",
+      "creatorInfo": {
+        "name": "李龙",
+        "nick": "粤腾",
+        "userId": 2669375904
+      },
+      "detailUrl": {
+        "appUrl": "https://n.dingtalk.com/dingding/dd-todo/detail/index.html?dd_darkmode=true\u0026android_scroll=false\u0026dd_mini_app_id=5000000004746689\u0026dt_editor=true\u0026dd_full_screen=true\u0026showmenu=false\u0026dd_progress=false\u0026dd_amplify=false\u0026newPage=true\u0026at_iframe=1\u0026from=homePage\u0026taskId=55119034912\u0026bizTag=tb_group_task\u0026cid=75985350515#/detail",
+        "pcUrl": "https://n.dingtalk.com/dingding/dd-todo/detail/index.html?dd_darkmode=true\u0026android_scroll=false\u0026dd_mini_app_id=5000000004746689\u0026dt_editor=true\u0026dd_full_screen=true\u0026showmenu=false\u0026dd_progress=false\u0026dd_amplify=false\u0026newPage=true\u0026at_iframe=1\u0026from=homePage\u0026taskId=55119034912\u0026bizTag=tb_group_task\u0026cid=75985350515#/detail"
+      },
+      "dueTime": 1784044740651,
+      "executorIds": [
+        "41129894",
+        "5255888716",
+        "447869",
+        "512653609",
+        "2669375904"
+      ],
+      "executorInfos": [
+        {
+          "name": "梓寻",
+          "nick": "梓寻",
+          "userId": 41129894
+        },
+        {
+          "name": "陈绪",
+          "nick": "陈叙",
+          "userId": 5255888716
+        },
+        {
+          "name": "徐洪鑫",
+          "nick": "崇幻",
+          "userId": 447869
+        },
+        {
+          "name": "董鑫阳",
+          "nick": "念晨",
+          "userId": 512653609
+        },
+        {
+          "name": "李龙",
+          "nick": "粤腾",
+          "userId": 2669375904
+        }
+      ],
+      "finishTime": 0,
+      "isDone": false,
+      "modifiedTime": 1784017216974,
+      "modifierId": "2669375904",
+      "orgId": 439446171,
+      "participantIds": [
+        "41129894",
+        "5255888716",
+        "447869",
+        "512653609",
+        "2669375904"
+      ],
+      "participantInfos": [
+        {
+          "name": "梓寻",
+          "nick": "梓寻",
+          "userId": 41129894
+        },
+        {
+          "name": "陈绪",
+          "nick": "陈叙",
+          "userId": 5255888716
+        },
+        {
+          "name": "徐洪鑫",
+          "nick": "崇幻",
+          "userId": 447869
+        },
+        {
+          "name": "董鑫阳",
+          "nick": "念晨",
+          "userId": 512653609
+        },
+        {
+          "name": "李龙",
+          "nick": "粤腾",
+          "userId": 2669375904
+        }
+      ],
+      "priority": 20,
+      "source": "conversation",
+      "subject": "中控Ai营销各Agent蓝图场景故事动线输出1-2页PPT",
+      "taskId": "55119034912",
+      "tenantId": "75985350515",
+      "tenantType": "group"
+    }
+  },
+  "success": true
+}
dws todo +get-my-tasks --page <page> --size <size> --status <status> --priority <priority> --role-types <role-types> --plan-finish-start <plan-finish-start> --plan-finish-end <plan-finish-end>read
查询当前组织下我的待办列表
dws mcp todo <tool> lark-cli task +get-my-tasks已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;todo/get_user_todos_in_current_org
输入 / CLI 输出
输入
dws todo +get-my-tasks --page x --size x --status true --priority x --role-types x --plan-finish-start 1 --plan-finish-end 1 --yes
stdout
{
+  "count": 0,
+  "todos": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "todos": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1475ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +get-my-tasks --page 1 --size 10 --status false --priority x --role-types executor --plan-finish-start 1 --plan-finish-end 1 --yes --format json
真实 stdout
{
+  "count": 0,
+  "todos": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "todos": []
+}
dws todo +list-attachment --task-id <task-id>read
查询待办任务的附件列表
dws mcp todo <tool> lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;todo/list_todo_attachment
输入 / CLI 输出
输入
dws todo +list-attachment --task-id x --yes
stdout
{
+  "attachments": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "attachments": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3413ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +list-attachment --task-id 55119034912 --yes --format json
真实 stdout
{
+  "attachments": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "attachments": [],
+  "count": 0
+}
dws todo +list-comment --task-id <task-id> --page <page> --size <size>read
查询待办评论列表
dws mcp todo <tool> lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;todo/list_todo_comment
输入 / CLI 输出
输入
dws todo +list-comment --task-id x --page x --size x --yes
stdout
{
+  "comments": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "comments": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2191ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +list-comment --task-id 55119034912 --page 1 --size 10 --yes --format json
真实 stdout
{
+  "comments": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "comments": [],
+  "count": 0
+}
dws todo +list-sub --task-id <task-id>read
查询子待办列表
dws mcp todo <tool> lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;todo/list_sub_tasks
输入 / CLI 输出
输入
dws todo +list-sub --task-id x --yes
stdout
{
+  "count": 0,
+  "subTasks": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "subTasks": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1940ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +list-sub --task-id 55119034912 --yes --format json
真实 stdout
{
+  "count": 0,
+  "subTasks": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "subTasks": []
+}
dws todo +overdueread
列出我已过期未完成的待办
dws mcp todo <tool>dws todo +overdueread复合/智能型
列出我已过期未完成的待办
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;todo/get_user_todos_in_current_org
输入 / CLI 输出
输入
dws todo +overdue --yes
stdout
{
+  "overdue": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "overdue": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1240ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test todo +overdue --yes --format json
真实 stdout
{
+  "overdue": []
+}
真实 stderr / error
(空)
真实返回
{
+  "overdue": []
+}
dws todo +related-tasksread
一次性列出与我相关的全部待办(我作为创建人/执行人/参与人三种角色的并集,按 taskId 去重)
dws mcp todo <tool>dws todo +related-tasksread复合/智能型
一次性列出与我相关的全部待办(我作为创建人/执行人/参与人三种角色的并集,按 taskId 去重)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark task 无同名命令(能力/命名不同)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);非法的 role-type "x",合法取值:creator, executor, participant
输入 / CLI 输出
输入
dws todo +related-tasks --role-types x --status x --yes
stdout
(空)
stderr / error
非法的 role-type "x",合法取值:creator, executor, participant
最终用于判定的返回
非法的 role-type "x",合法取值:creator, executor, participant
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1122ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test todo +related-tasks --role-types executor --status false --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没有与你相关的待办(creator/executor/participant 三种角色下均为空)"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没有与你相关的待办(creator/executor/participant 三种角色下均为空)"
+  }
+}
dws todo +remind --task <task> --at <at>write
给自己创建一条带截止/提醒时间的待办
dws mcp todo create_personal_todo --json '{"subject":<..>, "PersonalTodoCreateVO":<..>}'dws todo +remind --task <task> --at <at>write复合/智能型
给自己创建一条带截止/提醒时间的待办
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 create_personal_todo lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;contact/get_current_user_profile;无法解析当前登录用户的 userId,无法给自己创建待办
输入 / CLI 输出
输入
dws todo +remind --task x --at x --yes
stdout
(空)
stderr / error
无法解析当前登录用户的 userId,无法给自己创建待办
最终用于判定的返回
无法解析当前登录用户的 userId,无法给自己创建待办
真实后端测试输入 / 输出真实后端成功
exit=0;duration=4240ms;real-backend-manual-write; no --mock; no --dry-run; cleanup: taskId 55042039022 deleted successfully
真实输入
/private/tmp/dws-real-test todo +remind --task 'DWS shortcut 修复复测 20260715 remind,可忽略' --at 2026-07-16T10:00:00+08:00 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "result": {
+    "subject": "DWS shortcut 修复复测 20260715 remind,可忽略",
+    "taskId": "55042039022"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "result": {
+    "subject": "DWS shortcut 修复复测 20260715 remind,可忽略",
+    "taskId": "55042039022"
+  },
+  "success": true
+}
dws todo +todo-done --task <task>write
按标题关键词把我的某条待办标记完成(自动定位 taskId)
dws mcp todo update_todo_done_status --json '{"roleTypes":<..>, "taskId":<..>, "isDone":<..>}'dws todo +todo-done --task <task>write复合/智能型
按标题关键词把我的某条待办标记完成(自动定位 taskId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 update_todo_done_status lark task 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;todo/get_user_todos_in_current_org;没找到匹配待办:标题里没有 "x" 的待办。
输入 / CLI 输出
输入
dws todo +todo-done --task x --yes
stdout
(空)
stderr / error
没找到匹配待办:标题里没有 "x" 的待办。
最终用于判定的返回
没找到匹配待办:标题里没有 "x" 的待办。
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1771ms;real-backend-safe-negative-write; no --mock; no --dry-run
前置真实资源准备
为 todo +todo-done 创建当前账号自己的临时待办 fixture
+input: /private/tmp/dws-real-test todo +remind --task 'DWS shortcut 真实测试待办 20260715-160449' --at 2026-07-22T10:15:00+08:00 --yes --format json
+exit=0;duration=2611ms
+stdout:
+{
+  "arguments": [],
+  "result": {
+    "subject": "DWS shortcut 真实测试待办 20260715-160449",
+    "taskId": "55055639461"
+  },
+  "success": true
+}
+stderr:
+(空)
真实输入
/private/tmp/dws-real-test todo +todo-done --task 'DWS shortcut 真实测试待办 20260715-160449' --yes --format json
真实 stdout
{
+  "result": {
+    "success": true
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "result": {
+    "success": true
+  },
+  "success": true
+}

mail · 10 个 · ↔ lark mail

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + - - + + + + - - + + + - - + + + + + + - - + + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws mail +contact-list --email <email> --limit <limit> --cursor <cursor>read
列出指定邮箱的所有邮件联系人
dws mcp mail <tool> lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/list_user_mail_contacts
输入 / CLI 输出
输入
dws mail +contact-list --email x --limit x --cursor x --yes
stdout
{
+  "contacts": [],
+  "count": 0
+}
stderr / error
(空)
最终用于判定的返回
{
+  "contacts": [],
+  "count": 0
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3284ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +contact-list --email xinyang.dxy@alibaba-inc.com --limit 10 --cursor '' --yes --format json
真实 stdout
{
+  "contacts": [],
+  "count": 0
+}
真实 stderr / error
(空)
真实返回
{
+  "contacts": [],
+  "count": 0
+}
dws mail +find-mail-user --query <query> --limit <limit>read
按关键词搜索邮箱联系人并投影列表(姓名/昵称/邮箱/工号等)
dws mcp mail <tool>dws mail +find-mail-user --query <query> --limit <limit>read复合/智能型
按关键词搜索邮箱联系人并投影列表(姓名/昵称/邮箱/工号等)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/search_mail_users;没搜到邮箱联系人
输入 / CLI 输出
输入
dws mail +find-mail-user --query x --limit 1 --yes
stdout
(空)
stderr / error
没搜到邮箱联系人
最终用于判定的返回
没搜到邮箱联系人
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3666ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +find-mail-user --query '董鑫阳' --limit 10 --yes --format json
真实 stdout
{
+  "count": 1,
+  "users": [
+    {
+      "email": "xinyang.dxy@alibaba-inc.com",
+      "employeeNo": "202397",
+      "id": "----.l------oBfPl:0:----HI-----HWk9nI",
+      "jobTitle": "",
+      "name": "董鑫阳",
+      "nickname": "念晨",
+      "workLocation": "浙江-杭州"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 1,
+  "users": [
+    {
+      "email": "xinyang.dxy@alibaba-inc.com",
+      "employeeNo": "202397",
+      "id": "----.l------oBfPl:0:----HI-----HWk9nI",
+      "jobTitle": "",
+      "name": "董鑫阳",
+      "nickname": "念晨",
+      "workLocation": "浙江-杭州"
+    }
+  ]
+}
dws mail +folder-list --email <email> --folder <folder>read
列出顶层文件夹或指定父文件夹下的子文件夹
dws mcp mail <tool> lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/list_folders
输入 / CLI 输出
输入
dws mail +folder-list --email x --folder x --yes
stdout
{
+  "count": 0,
+  "folders": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "folders": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3643ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +folder-list --email xinyang.dxy@alibaba-inc.com --folder 2 --yes --format json
真实 stdout
{
+  "count": 0,
+  "folders": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "folders": []
+}
dws mail +recent-mail --limit <limit> --email <email> --folder <folder>read
列出收件箱近期邮件会话并投影列表(主题/发件人/时间/threadId)
dws mcp mail <tool>dws mail +recent-mail --limit <limit> --email <email> --folder <folder>read复合/智能型
列出收件箱近期邮件会话并投影列表(主题/发件人/时间/threadId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/list_mailbox_threads;最近没有邮件
输入 / CLI 输出
输入
dws mail +recent-mail --limit 1 --email x --folder x --yes
stdout
(空)
stderr / error
最近没有邮件
最终用于判定的返回
最近没有邮件
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2724ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +recent-mail --limit 10 --email xinyang.dxy@alibaba-inc.com --folder 2 --yes --format json
真实 stdout
{
+  "count": 10,
+  "mails": [
+    {
+      "date": "2026-07-15T06:37:28Z",
+      "from": [
+        "work@alibaba-inc.com"
+      ],
+      "subject": "牛康佳(随风)的数据权限申请流程 / NIU, Kangjia's apply data permission  ",
+      "threadId": "DzzzzyJeBJL---.iLmnRnm"
+    },
+    {
+      "date": "2026-07-15T06:35:49Z",
+      "from": [
+        "work@alibaba-inc.com"
+      ],
+      "subject": "changefree:diamond应用【albert-agent-2】变更 ",
+      "threadId": "DzzzzyJo3ZK---.hyYf9dO"
+    },
+    {
+      "date": "2026-07-15T06:00:39Z",
+      "from": [
+        "安全服务中心 <snotice@alibaba-inc.com>"
+      ],
+      "subject": "您的名下有1个风险尚未修复,请立即修复! You have 1 vulnerabilities that have not been fixed, please fix them as soon as possible!",
+      "threadId": "DzzzzyKaAwA---.g643XXa"
+    },
+    {
+      "date": "2026-07-15T05:48:41Z",
+      "from": [
+        "aone@alibaba-inc.com <aone@alibaba-inc.com>"
+      ],
+      "subject": "[Aone]应用albert-agent-2预发发布成功",
+      "threadId": "DzzzzyJi7OS---.iCFAI0A"
+    },
+    {
+      "date": "2026-07-15T02:54:00Z",
+      "from": [
+        "work@alibaba-inc.com"
+      ],
+      "subject": "代成俊(璟琦)的数据权限申请流程 / DAI, Chengjun's apply data permission  ",
+      "threadId": "DzzzzyKTIMD---.gOEBekI"
+    },
+    {
+      "date": "2026-07-15T02:51:12Z",
+      "from": [
+        "work@alibaba-inc.com"
+      ],
+      "subject": "陈梦媛(星莫)的数据权限申请流程 / CHEN, Mengyuan's apply data permission  ",
+      "threadId": "DzzzzyKIHke---.goV93L."
+    },
+    {
+      "date": "2026-07-15T02:06:21Z",
+      "from": [
+        "dingtalk_recruitment@alibaba-inc.com"
+      ],
+      "subject": "【校招】简历即将超期/[Campus Recruitment] Resumes Are About to Expire",
+      "threadId": "DzzzzyJjBhI---.i911RPE"
+    },
+    {
+      "date": "2026-07-15T02:00:05Z",
+      "from": [
+        "dingtalk_recruitment@alibaba-inc.com"
+      ],
+      "subject": "【校招】2026-07-15 面试邀约任务通知/【Campus Recruitment】 2026-07-15 Interview Invitation Task Notice",
+      "threadId": "DzzzzyJeFNO---.iLVkwOD"
+    },
+    {
+      "date": "2026-07-15T01:42:44Z",
+      "from": [
+        "ATA技小蜜 <ATA@alibaba-inc.com>"
+      ],
+      "subject": "【ATA每日精选】【天猫数字分身】(上篇) - AI Native 组织协作与研发的暗物质",
+      "threadId": "DzzzzyJeFdf---.iLWDlI4"
+    },
+    {
+      "date": "2026-07-14T18:24:45Z",
+      "from": [
+        "postmaster@alibaba-inc.com"
+      ],
+      "subject": "垃圾邮件提醒2026年7月15日",
+      "threadId": "DzzzzyJeM2G---.iLDMDRq"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 10,
+  "mails": [
+    {
+      "date": "2026-07-15T06:37:28Z",
+      "from": [
+        "work@alibaba-inc.com"
+      ],
+      "subject": "牛康佳(随风)的数据权限申请流程 / NIU, Kangjia's apply data permission  ",
+      "threadId": "DzzzzyJeBJL---.iLmnRnm"
+    },
+    {
+      "date": "2026-07-15T06:35:49Z",
+      "from": [
+        "work@alibaba-inc.com"
+      ],
+      "subject": "changefree:diamond应用【albert-agent-2】变更 ",
+      "threadId": "DzzzzyJo3ZK---.hyYf9dO"
+    },
+    {
+      "date": "2026-07-15T06:00:39Z",
+      "from": [
+        "安全服务中心 <snotice@alibaba-inc.com>"
+      ],
+      "subject": "您的名下有1个风险尚未修复,请立即修复! You have 1 vulnerabilities that have not been fixed, please fix them as soon as possible!",
+      "threadId": "DzzzzyKaAwA---.g643XXa"
+    },
+    {
+      "date": "2026-07-15T05:48:41Z",
+      "from": [
+        "aone@alibaba-inc.com <aone@alibaba-inc.com>"
+      ],
+      "subject": "[Aone]应用albert-agent-2预发发布成功",
+      "threadId": "DzzzzyJi7OS---.iCFAI0A"
+    },
+    {
+      "date": "2026-07-15T02:54:00Z",
+      "from": [
+        "work@alibaba-inc.com"
+      ],
+      "subject": "代成俊(璟琦)的数据权限申请流程 / DAI, Chengjun's apply data permission  ",
+      "threadId": "DzzzzyKTIMD---.gOEBekI"
+    },
+    {
+      "date": "2026-07-15T02:51:12Z",
+      "from": [
+        "work@alibaba-inc.com"
+      ],
+      "subject": "陈梦媛(星莫)的数据权限申请流程 / CHEN, Mengyuan's apply data permission  ",
+      "threadId": "DzzzzyKIHke---.goV93L."
+    },
+    {
+      "date": "2026-07-15T02:06:21Z",
+      "from": [
+        "dingtalk_recruitment@alibaba-inc.com"
+      ],
+      "subject": "【校招】简历即将超期/[Campus Recruitment] Resumes Are About to Expire",
+      "threadId": "DzzzzyJjBhI---.i911RPE"
+    },
+    {
+      "date": "2026-07-15T02:00:05Z",
+      "from": [
+        "dingtalk_recruitment@alibaba-inc.com"
+      ],
+      "subject": "【校招】2026-07-15 面试邀约任务通知/【Campus Recruitment】 2026-07-15 Interview Invitation Task Notice",
+      "threadId": "DzzzzyJeFNO---.iLVkwOD"
+    },
+    {
+      "date": "2026-07-15T01:42:44Z",
+      "from": [
+        "ATA技小蜜 <ATA@alibaba-inc.com>"
+      ],
+      "subject": "【ATA每日精选】【天猫数字分身】(上篇) - AI Native 组织协作与研发的暗物质",
+      "threadId": "DzzzzyJeFdf---.iLWDlI4"
+    },
+    {
+      "date": "2026-07-14T18:24:45Z",
+      "from": [
+        "postmaster@alibaba-inc.com"
+      ],
+      "subject": "垃圾邮件提醒2026年7月15日",
+      "threadId": "DzzzzyJeM2G---.iLDMDRq"
+    }
+  ]
+}
dws mail +search-mail --query <query> --email <email> --size <size>read
按 KQL 关键词搜索邮件并投影列表(主题/发件人/时间/messageId)
dws mcp mail <tool>dws mail +search-mail --query <query> --email <email> --size <size>read复合/智能型
按 KQL 关键词搜索邮件并投影列表(主题/发件人/时间/messageId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/search_emails
输入 / CLI 输出
输入
dws mail +search-mail --query x --email x --size x --yes
stdout
{
+  "email": "x",
+  "messages": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "email": "x",
+  "messages": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1985ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +search-mail --query 'subject:测试' --email xinyang.dxy@alibaba-inc.com --size 10 --yes --format json
真实 stdout
{
+  "email": "xinyang.dxy@alibaba-inc.com",
+  "messages": [
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNklS",
+      "subject": "[Aone]实验室[lippi-calladmin单元测试]的构建[#1723]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkml",
+      "subject": "[Aone]实验室[mozi-engine-admin单元测试-Jacoco]的构建[#2611]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNknb",
+      "subject": "[Aone]实验室[lippi-calladmin单元测试]的构建[#1646]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkoy",
+      "subject": "[Aone]实验室[mozi-engine-admin单元测试-Jacoco]的构建[#2609]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkp.",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1498]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkp0",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1497]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkpJ",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1493]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkpL",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1492]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkph",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1491]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkpj",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1490]失败"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "email": "xinyang.dxy@alibaba-inc.com",
+  "messages": [
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNklS",
+      "subject": "[Aone]实验室[lippi-calladmin单元测试]的构建[#1723]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkml",
+      "subject": "[Aone]实验室[mozi-engine-admin单元测试-Jacoco]的构建[#2611]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNknb",
+      "subject": "[Aone]实验室[lippi-calladmin单元测试]的构建[#1646]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkoy",
+      "subject": "[Aone]实验室[mozi-engine-admin单元测试-Jacoco]的构建[#2609]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkp.",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1498]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkp0",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1497]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkpJ",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1493]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkpL",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1492]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkph",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1491]失败"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkpj",
+      "subject": "[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1490]失败"
+    }
+  ]
+}
dws mail +tag-list --email <email>read
列出指定邮箱下的所有邮件标签
dws mcp mail <tool> lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/list_tags
输入 / CLI 输出
输入
dws mail +tag-list --email x --yes
stdout
{
+  "count": 0,
+  "tags": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "tags": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2606ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +tag-list --email xinyang.dxy@alibaba-inc.com --yes --format json
真实 stdout
{
+  "count": 3,
+  "tags": [
+    {
+      "id": "1",
+      "name": "Flagged",
+      "parentId": "0"
+    },
+    {
+      "id": "2",
+      "name": "Completed",
+      "parentId": "0"
+    },
+    {
+      "id": "3",
+      "name": "task",
+      "parentId": "0"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 3,
+  "tags": [
+    {
+      "id": "1",
+      "name": "Flagged",
+      "parentId": "0"
+    },
+    {
+      "id": "2",
+      "name": "Completed",
+      "parentId": "0"
+    },
+    {
+      "id": "3",
+      "name": "task",
+      "parentId": "0"
+    }
+  ]
+}
dws mail +template-list --email <email> --limit <limit> --cursor <cursor>read
列出指定邮箱的所有邮件模板
dws mcp mail <tool> lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/list_user_message_templates
输入 / CLI 输出
输入
dws mail +template-list --email x --limit x --cursor x --yes
stdout
{
+  "count": 0,
+  "templates": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "templates": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3083ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +template-list --email xinyang.dxy@alibaba-inc.com --limit 10 --cursor '' --yes --format json
真实 stdout
{
+  "count": 0,
+  "templates": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "templates": []
+}
dws mail +thread-list --email <email> --folder <folder> --limit <limit> --cursor <cursor> --start <start> --end <end> --ascending <ascending>read
列出指定邮箱文件夹下的邮件会话(thread)
dws mcp mail <tool> lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/list_mailbox_threads
输入 / CLI 输出
输入
dws mail +thread-list --email x --folder x --limit 1 --cursor x --start x --end x --ascending --yes
stdout
{
+  "count": 0,
+  "threads": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "threads": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=6434ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +thread-list --email xinyang.dxy@alibaba-inc.com --folder 2 --limit 10 --cursor '' --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --ascending --yes --format json
真实 stdout
{
+  "count": 0,
+  "threads": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "threads": []
+}
dws mail +unread-mail --email <email> --size <size>read
列出未读邮件并投影列表(主题/发件人/时间/messageId)
dws mcp mail <tool>dws mail +unread-mail --email <email> --size <size>read复合/智能型
列出未读邮件并投影列表(主题/发件人/时间/messageId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/search_emails
输入 / CLI 输出
输入
dws mail +unread-mail --email x --size x --yes
stdout
{
+  "email": "x",
+  "messages": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "email": "x",
+  "messages": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3469ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +unread-mail --email xinyang.dxy@alibaba-inc.com --size 10 --yes --format json
真实 stdout
{
+  "email": "xinyang.dxy@alibaba-inc.com",
+  "messages": [
+    {
+      "date": null,
+      "from": "work@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk0",
+      "subject": "牛康佳(随风)的数据权限申请流程 / NIU, Kangjia's apply data permission  "
+    },
+    {
+      "date": null,
+      "from": "work@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk1",
+      "subject": "changefree:diamond应用【albert-agent-2】变更 "
+    },
+    {
+      "date": null,
+      "from": "安全服务中心 <snotice@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk2",
+      "subject": "您的名下有1个风险尚未修复,请立即修复! You have 1 vulnerabilities that have not been fixed, please fix them as soon as possible!"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk3",
+      "subject": "[Aone]应用albert-agent-2预发发布成功"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk4",
+      "subject": "[Aone]应用albert-agent-2预发发布成功"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk5",
+      "subject": "[Aone]应用albert-agent-2预发发布成功"
+    },
+    {
+      "date": null,
+      "from": "work@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk6",
+      "subject": "代成俊(璟琦)的数据权限申请流程 / DAI, Chengjun's apply data permission  "
+    },
+    {
+      "date": null,
+      "from": "work@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk7",
+      "subject": "陈梦媛(星莫)的数据权限申请流程 / CHEN, Mengyuan's apply data permission  "
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk8",
+      "subject": "[Aone]应用albert-agent-2预发发布成功"
+    },
+    {
+      "date": null,
+      "from": "dingtalk_recruitment@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk9",
+      "subject": "【校招】简历即将超期/[Campus Recruitment] Resumes Are About to Expire"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "email": "xinyang.dxy@alibaba-inc.com",
+  "messages": [
+    {
+      "date": null,
+      "from": "work@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk0",
+      "subject": "牛康佳(随风)的数据权限申请流程 / NIU, Kangjia's apply data permission  "
+    },
+    {
+      "date": null,
+      "from": "work@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk1",
+      "subject": "changefree:diamond应用【albert-agent-2】变更 "
+    },
+    {
+      "date": null,
+      "from": "安全服务中心 <snotice@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk2",
+      "subject": "您的名下有1个风险尚未修复,请立即修复! You have 1 vulnerabilities that have not been fixed, please fix them as soon as possible!"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk3",
+      "subject": "[Aone]应用albert-agent-2预发发布成功"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk4",
+      "subject": "[Aone]应用albert-agent-2预发发布成功"
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk5",
+      "subject": "[Aone]应用albert-agent-2预发发布成功"
+    },
+    {
+      "date": null,
+      "from": "work@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk6",
+      "subject": "代成俊(璟琦)的数据权限申请流程 / DAI, Chengjun's apply data permission  "
+    },
+    {
+      "date": null,
+      "from": "work@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk7",
+      "subject": "陈梦媛(星莫)的数据权限申请流程 / CHEN, Mengyuan's apply data permission  "
+    },
+    {
+      "date": null,
+      "from": "aone@alibaba-inc.com <aone@alibaba-inc.com>",
+      "messageId": "DzzzzzzNkk8",
+      "subject": "[Aone]应用albert-agent-2预发发布成功"
+    },
+    {
+      "date": null,
+      "from": "dingtalk_recruitment@alibaba-inc.com",
+      "messageId": "DzzzzzzNkk9",
+      "subject": "【校招】简历即将超期/[Campus Recruitment] Resumes Are About to Expire"
+    }
+  ]
+}
dws mail +user-search --keyword <keyword> --employee-no <employee-no> --email <email> --cursor <cursor> --limit <limit>read
按关键词或工号搜索邮箱用户(仅企业邮箱)
dws mcp mail <tool> lark mail 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;mail/search_mail_users
输入 / CLI 输出
输入
dws mail +user-search --keyword x --employee-no x --email x --cursor x --limit x --yes
stdout
{
+  "count": 0,
+  "users": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "users": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2836ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test mail +user-search --keyword '董鑫阳' --employee-no 202397 --email xinyang.dxy@alibaba-inc.com --cursor '' --limit 10 --yes --format json
真实 stdout
{
+  "count": 1,
+  "users": [
+    {
+      "email": "xinyang.dxy@alibaba-inc.com",
+      "employeeNo": "202397",
+      "name": "董鑫阳",
+      "userId": "----.l------oBfPl:0:----HI-----HWk9nI"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 1,
+  "users": [
+    {
+      "email": "xinyang.dxy@alibaba-inc.com",
+      "employeeNo": "202397",
+      "name": "董鑫阳",
+      "userId": "----.l------oBfPl:0:----HI-----HWk9nI"
+    }
+  ]
+}

oa · 10 个 · 钉钉特有 · lark 无对应

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ - - + + + - - + + + + + + + + - - + + + - - + + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws oa +approve-by --keyword <keyword> --comment <comment>write
按关键词把我的一条待审批单据一键通过(自动定位实例与任务 ID)
dws mcp oa approve_processInstance --json '{"starTime":<..>, "endTime":<..>, "query":<..>, "processInstanceId":<..>, "taskId":<..>}'dws oa +approve-by --keyword <keyword> --comment <comment>write复合/智能型
按关键词把我的一条待审批单据一键通过(自动定位实例与任务 ID)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 approve_processInstance 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/list_pending_approvals;没找到待审批单据:待我处理的审批里没有标题/单号包含 "x" 的单据。
输入 / CLI 输出
输入
dws oa +approve-by --keyword x --comment x --yes
stdout
(空)
stderr / error
没找到待审批单据:待我处理的审批里没有标题/单号包含 "x" 的单据。
最终用于判定的返回
没找到待审批单据:待我处理的审批里没有标题/单号包含 "x" 的单据。
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1318ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test oa +approve-by --keyword __DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_20260715-151724__ --comment 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没找到待审批单据:待我处理的审批里没有标题/单号包含 \"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_20260715-151724__\" 的单据。"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没找到待审批单据:待我处理的审批里没有标题/单号包含 \"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_20260715-151724__\" 的单据。"
+  }
+}
dws oa +done-approvals --limit <limit>read
只读列出我已处理过的审批任务(审批历史)并投影为可读列表
dws mcp oa <tool>dws oa +done-approvals --limit <limit>read复合/智能型
只读列出我已处理过的审批任务(审批历史)并投影为可读列表
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/get_done_tasks;没有已处理的审批记录
输入 / CLI 输出
输入
dws oa +done-approvals --limit 1 --yes
stdout
(空)
stderr / error
没有已处理的审批记录
最终用于判定的返回
没有已处理的审批记录
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1244ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test oa +done-approvals --limit 10 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没有已处理的审批记录"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没有已处理的审批记录"
+  }
+}
dws oa +list-cc --page <page> --limit <limit> --query <query>read
获取抄送当前用户的审批单列表
dws mcp oa <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/get_noticed_instances
输入 / CLI 输出
输入
dws oa +list-cc --page x --limit x --query x --yes
stdout
{
+  "count": 0,
+  "instances": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "instances": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=8468ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test oa +list-cc --page 1 --limit 10 --query '测试' --yes --format json
真实 stdout
{
+  "count": 0,
+  "instances": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "instances": []
+}
dws oa +list-executed --page <page> --limit <limit> --query <query>read
获取当前用户已经处理过的审批单列表
dws mcp oa <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/get_done_tasks
输入 / CLI 输出
输入
dws oa +list-executed --page x --limit x --query x --yes
stdout
{
+  "count": 0,
+  "instances": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "instances": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=29589ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test oa +list-executed --page 1 --limit 10 --query '测试' --yes --format json
真实 stdout
{
+  "count": 0,
+  "instances": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "instances": []
+}
dws oa +list-forms --cursor <cursor> --limit <limit>read
获取当前用户可见的审批表单列表
dws mcp oa <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/list_user_visible_process
输入 / CLI 输出
输入
dws oa +list-forms --cursor 1 --limit 1 --yes
stdout
{
+  "count": 0,
+  "forms": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "forms": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=25611ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test oa +list-forms --cursor 0 --limit 10 --yes --format json
真实 stdout
{
+  "count": 0,
+  "forms": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "forms": []
+}
dws oa +list-pending --start <start> --end <end> --page <page> --limit <limit> --query <query>read
查询待我处理的审批(时间范围为 epoch 毫秒)
dws mcp oa <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/list_pending_approvals
输入 / CLI 输出
输入
dws oa +list-pending --start 1 --end 1 --page x --limit x --query x --yes
stdout
{
+  "count": 0,
+  "instances": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "instances": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=8328ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test oa +list-pending --start 1783494851348 --end 1784099651348 --page 1 --limit 10 --query '测试' --yes --format json
真实 stdout
{
+  "count": 0,
+  "instances": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "instances": []
+}
dws oa +list-submitted --page <page> --limit <limit> --query <query>read
获取当前用户已发起的审批单列表
dws mcp oa <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/get_submitted_instances
输入 / CLI 输出
输入
dws oa +list-submitted --page x --limit x --query x --yes
stdout
{
+  "count": 0,
+  "instances": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "instances": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=12793ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test oa +list-submitted --page 1 --limit 10 --query '测试' --yes --format json
真实 stdout
{
+  "count": 0,
+  "instances": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "instances": []
+}
dws oa +my-initiated --query <query> --page <page> --limit <limit>read
列出我发起(提交)的审批单据
dws mcp oa <tool>dws oa +my-initiated --query <query> --page <page> --limit <limit>read复合/智能型
列出我发起(提交)的审批单据
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/get_submitted_instances
输入 / CLI 输出
输入
dws oa +my-initiated --query x --page 1 --limit 1 --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "pageNumber": 1,
+    "pageSize": 1,
+    "query": "x"
+  },
+  "product": "oa",
+  "tool": "get_submitted_instances"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "pageNumber": 1,
+    "pageSize": 1,
+    "query": "x"
+  },
+  "product": "oa",
+  "tool": "get_submitted_instances"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3564ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test oa +my-initiated --query '测试' --page 1 --limit 10 --yes --format json
真实 stdout
{
+  "result": {
+    "values": []
+  },
+  "success": "true"
+}
真实 stderr / error
(空)
真实返回
{
+  "result": {
+    "values": []
+  },
+  "success": "true"
+}
dws oa +pending --limit <limit>read
只读列出待我审批的审批任务并投影为可读列表(只看不批)
dws mcp oa <tool>dws oa +pending --limit <limit>read复合/智能型
只读列出待我审批的审批任务并投影为可读列表(只看不批)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/list_pending_approvals;当前没有待我审批的任务
输入 / CLI 输出
输入
dws oa +pending --limit 1 --yes
stdout
(空)
stderr / error
当前没有待我审批的任务
最终用于判定的返回
当前没有待我审批的任务
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1357ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test oa +pending --limit 10 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "当前没有待我审批的任务"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "当前没有待我审批的任务"
+  }
+}
dws oa +search-forms --query <query>read
按关键字模糊搜索当前用户可见的审批表单
dws mcp oa <tool> 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;oa/search_form
输入 / CLI 输出
输入
dws oa +search-forms --query x --yes
stdout
{
+  "count": 0,
+  "forms": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "forms": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1759ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test oa +search-forms --query '测试' --yes --format json
真实 stdout
{
+  "count": 0,
+  "forms": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "forms": []
+}

drive · 9 个 · ↔ lark drive

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + - - + + + + + + + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws drive +copy --node <node> --folder <folder> --workspace <workspace>write
复制文件/文档到指定位置
dws mcp doc copy_document --json '{"nodeId":<..>, "targetFolderId":<..>, "workspaceId":<..>}' lark drive 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/copy_document
输入 / CLI 输出
输入
dws drive +copy --node x --folder x --workspace x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "copy_document"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "copy_document"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1329ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test drive +copy --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --yes --format json
真实 stdout
{
+  "docUrl": "https://alidocs.dingtalk.com/i/nodes/np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+  "message": "节点复制成功,已复制到目标文件夹。sourceNodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ,新节点 ID: np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+  "nodeId": "np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "docUrl": "https://alidocs.dingtalk.com/i/nodes/np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+  "message": "节点复制成功,已复制到目标文件夹。sourceNodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ,新节点 ID: np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+  "nodeId": "np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+  "success": true
+}
dws drive +download --node <node> --space-id <space-id>read
获取钉盘文件下载链接
dws mcp drive download_file --json '{"fileId":<..>, "spaceId":<..>}' lark-cli drive +download已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;drive/download_file
输入 / CLI 输出
输入
dws drive +download --node x --space-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "fileId": "x",
+    "spaceId": "x"
+  },
+  "product": "drive",
+  "tool": "download_file"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "fileId": "x",
+    "spaceId": "x"
+  },
+  "product": "drive",
+  "tool": "download_file"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1192ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test drive +download --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --space-id 1 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 该文件类型不支持通过 download_file 下载。download_file 仅支持普通文件(如 PDF、Word、Excel 等),不支持钉钉在线文档/表格/脑图等在线编辑类型。如需导出在线文档内容,请使用钉钉文档导出相关接口。 (operation: drive/download_file)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.document.typeIllegal",
+    "server_key": "drive",
+    "trace_id": "0bab027317840997956923965e08c9"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] 该文件类型不支持通过 download_file 下载。download_file 仅支持普通文件(如 PDF、Word、Excel 等),不支持钉钉在线文档/表格/脑图等在线编辑类型。如需导出在线文档内容,请使用钉钉文档导出相关接口。 (operation: drive/download_file)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.document.typeIllegal",
+    "server_key": "drive",
+    "trace_id": "0bab027317840997956923965e08c9"
+  }
+}
dws drive +find-file --query <query>read
按名称关键词搜索钉盘文件并投影关键字段(只读)
dws mcp drive <tool>dws drive +find-file --query <query>read复合/智能型
按名称关键词搜索钉盘文件并投影关键字段(只读)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark drive 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;drive/search_files
输入 / CLI 输出
输入
dws drive +find-file --query x --yes
stdout
{
+  "files": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "files": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1913ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test drive +find-file --query '测试' --yes --format json
真实 stdout
{
+  "files": [
+    {
+      "dentryId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "fileSize": 0,
+      "name": "DWS shortcut 真实测试文档 20260715",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "fileSize": 0,
+      "name": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "fileSize": 0,
+      "name": "文件扫描测试 -20260414",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "fileSize": 0,
+      "name": "文件扫描测试(25)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "fileSize": 0,
+      "name": "文件扫描测试(5)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "fileSize": 0,
+      "name": "文件扫描测试(24)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "fileSize": 0,
+      "name": "文件扫描测试(22)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "fileSize": 0,
+      "name": "文件扫描测试(26)(2)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+      "fileSize": 0,
+      "name": "DWS shortcut 真实测试文档 20260715(2)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+      "fileSize": 0,
+      "name": "DWS shortcut 真实测试文档 20260715(1)",
+      "type": "ALIDOC"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "files": [
+    {
+      "dentryId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "fileSize": 0,
+      "name": "DWS shortcut 真实测试文档 20260715",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "fileSize": 0,
+      "name": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "fileSize": 0,
+      "name": "文件扫描测试 -20260414",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "fileSize": 0,
+      "name": "文件扫描测试(25)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "fileSize": 0,
+      "name": "文件扫描测试(5)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "fileSize": 0,
+      "name": "文件扫描测试(24)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "fileSize": 0,
+      "name": "文件扫描测试(22)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "fileSize": 0,
+      "name": "文件扫描测试(26)(2)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l",
+      "fileSize": 0,
+      "name": "DWS shortcut 真实测试文档 20260715(2)",
+      "type": "ALIDOC"
+    },
+    {
+      "dentryId": "7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3",
+      "fileSize": 0,
+      "name": "DWS shortcut 真实测试文档 20260715(1)",
+      "type": "ALIDOC"
+    }
+  ]
+}
dws drive +info --node <node> --space-id <space-id>read
获取钉盘文件/文件夹元数据
dws mcp drive get_file_info --json '{"fileId":<..>, "spaceId":<..>}' lark drive 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;drive/get_file_info
输入 / CLI 输出
输入
dws drive +info --node x --space-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "fileId": "x",
+    "spaceId": "x"
+  },
+  "product": "drive",
+  "tool": "get_file_info"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "fileId": "x",
+    "spaceId": "x"
+  },
+  "product": "drive",
+  "tool": "get_file_info"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2605ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test drive +info --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --space-id 1 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "createTime": 1784082107000,
+    "dentryId": "228840832141",
+    "docUrl": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+    "extension": "adoc",
+    "fileId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+    "fileSize": 0,
+    "message": "该文件属于钉钉文档(在线文档/表格/脑图等),通过钉盘接口获取的元数据(如文件名称)可能不准确。建议使用钉钉文档相关接口获取更准确的文档信息。",
+    "modifyTime": 1784082137000,
+    "name": "7691256802.adoc",
+    "path": "/6342122716/7691256801/7691256802.adoc",
+    "status": "NORMAL",
+    "type": "ALIDOC"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "createTime": 1784082107000,
+    "dentryId": "228840832141",
+    "docUrl": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+    "extension": "adoc",
+    "fileId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+    "fileSize": 0,
+    "message": "该文件属于钉钉文档(在线文档/表格/脑图等),通过钉盘接口获取的元数据(如文件名称)可能不准确。建议使用钉钉文档相关接口获取更准确的文档信息。",
+    "modifyTime": 1784082137000,
+    "name": "7691256802.adoc",
+    "path": "/6342122716/7691256801/7691256802.adoc",
+    "status": "NORMAL",
+    "type": "ALIDOC"
+  },
+  "success": true
+}
dws drive +list --space-id <space-id> --folder <folder> --limit <limit> --cursor <cursor> --order-by <order-by> --order <order> --thumbnail <thumbnail>read
列出钉盘文件/文件夹
dws mcp drive <tool> lark drive 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;drive/list_files
输入 / CLI 输出
输入
dws drive +list --space-id x --folder x --limit 1 --cursor x --order-by x --order x --thumbnail --yes
stdout
{
+  "count": 0,
+  "files": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "files": []
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1090ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test drive +list --space-id 1 --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --limit 10 --cursor 0 --order-by name --order asc --thumbnail --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] parentId 不属于指定的 spaceId,请确认 parentId 和 spaceId 属于同一个钉盘空间。\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "paramError",
+    "server_key": "drive",
+    "trace_id": "2106d98117840997968627612e087b"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] parentId 不属于指定的 spaceId,请确认 parentId 和 spaceId 属于同一个钉盘空间。\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "paramError",
+    "server_key": "drive",
+    "trace_id": "2106d98117840997968627612e087b"
+  }
+}
dws drive +move --node <node> --folder <folder> --workspace <workspace>write
移动文件/文档到指定位置
dws mcp doc move_document --json '{"nodeId":<..>, "targetFolderId":<..>, "workspaceId":<..>}' lark-cli drive +move已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/move_document
输入 / CLI 输出
输入
dws drive +move --node x --folder x --workspace x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "move_document"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "move_document"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=3380ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test drive +move --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --yes --format json
真实 stdout
{
+  "docUrl": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "message": "节点移动成功,已移动到目标文件夹。nodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ",
+  "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "docUrl": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "message": "节点移动成功,已移动到目标文件夹。nodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ",
+  "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+  "success": true
+}
dws drive +recent --operate-type <operate-type> --creator-type <creator-type> --limit <limit> --cursor <cursor>read
获取最近访问/编辑的文档列表
dws mcp doc <tool> lark drive 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/get_recent_list
输入 / CLI 输出
输入
dws drive +recent --operate-type 1 --creator-type 1 --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "items": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "items": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2087ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test drive +recent --operate-type 1 --creator-type 1 --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "count": 0,
+  "hasMore": false,
+  "items": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "hasMore": false,
+  "items": []
+}
dws drive +search --query <query> --target <target> --file-types <file-types> --extensions <extensions> --creator-uids <creator-uids> --created-from <created-from> --created-to <created-to> --modified-from <modified-from> --modified-to <modified-to> --limit <limit> --cursor <cursor>read
搜索钉盘文件
dws mcp drive <tool> lark-cli drive +search已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;drive/search_files
输入 / CLI 输出
输入
dws drive +search --query x --target file --file-types x --extensions x --creator-uids x --created-from 1 --created-to 1 --modified-from 1 --modified-to 1 --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "files": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "files": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2091ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test drive +search --query '测试' --target file --file-types alidoc --extensions x --creator-uids x --created-from 1 --created-to 1 --modified-from 1 --modified-to 1 --limit 10 --cursor 0 --yes --format json
真实 stdout
{
+  "count": 0,
+  "files": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "files": []
+}
dws drive +search-docs --query <query> --limit <limit>read
搜索文档空间文档
dws mcp doc <tool> lark drive 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/search_documents
输入 / CLI 输出
输入
dws drive +search-docs --query x --limit 1 --yes
stdout
{
+  "count": 0,
+  "docs": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "docs": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2507ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test drive +search-docs --query '测试' --limit 10 --yes --format json
真实 stdout
{
+  "count": 10,
+  "docs": [
+    {
+      "name": "DWS shortcut 真实测试文档 20260715",
+      "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space"
+    },
+    {
+      "name": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03",
+      "nodeId": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试 -20260414",
+      "nodeId": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(25)",
+      "nodeId": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(5)",
+      "nodeId": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(24)",
+      "nodeId": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(22)",
+      "nodeId": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(26)(2)",
+      "nodeId": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space"
+    },
+    {
+      "name": "悟空DWS全部测试账号信息",
+      "nodeId": "X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space"
+    },
+    {
+      "name": "测试",
+      "nodeId": "1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE",
+      "type": "folder",
+      "url": "https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 10,
+  "docs": [
+    {
+      "name": "DWS shortcut 真实测试文档 20260715",
+      "nodeId": "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space"
+    },
+    {
+      "name": "🧪测试 工作区目录扫描 - 2026-04-27 21:27:03",
+      "nodeId": "yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试 -20260414",
+      "nodeId": "3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(25)",
+      "nodeId": "QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(5)",
+      "nodeId": "Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(24)",
+      "nodeId": "OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(22)",
+      "nodeId": "OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space"
+    },
+    {
+      "name": "文件扫描测试(26)(2)",
+      "nodeId": "l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space"
+    },
+    {
+      "name": "悟空DWS全部测试账号信息",
+      "nodeId": "X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ",
+      "type": "file",
+      "url": "https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space"
+    },
+    {
+      "name": "测试",
+      "nodeId": "1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE",
+      "type": "folder",
+      "url": "https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space"
+    }
+  ]
+}

wiki · 7 个 · ↔ lark wiki

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + + - - + + + + + - - + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws wiki +node-copy --workspace <workspace> --node <node> --folder <folder>write
复制知识库节点
dws mcp doc copy_document --json '{"nodeId":<..>, "workspaceId":<..>, "targetFolderId":<..>}' lark-cli wiki +node-copy已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/copy_document
输入 / CLI 输出
输入
dws wiki +node-copy --workspace x --node x --folder x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "copy_document"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "copy_document"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1000ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test wiki +node-copy --workspace DWSREALTESTNOSUCHID0000000000000 --node DWSREALTESTNOSUCHID0000000000000 --folder DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc/copy_document)\n  hint: Document may have been deleted or moved",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.inputArgs.invalid",
+    "server_key": "doc",
+    "trace_id": "0bb7c36217840999769818495e0779"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc/copy_document)\n  hint: Document may have been deleted or moved",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.inputArgs.invalid",
+    "server_key": "doc",
+    "trace_id": "0bb7c36217840999769818495e0779"
+  }
+}
dws wiki +node-list --workspace <workspace> --folder <folder> --limit <limit> --cursor <cursor>read
列出知识库节点
dws mcp doc <tool> lark-cli wiki +node-list已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;wiki/list_nodes
输入 / CLI 输出
输入
dws wiki +node-list --workspace x --folder x --limit 1 --cursor x --yes
stdout
{
+  "count": 0,
+  "nodes": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "nodes": []
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1120ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test wiki +node-list --workspace DWSREALREADNOSUCHID0000000000000 --folder DWSREALREADNOSUCHID0000000000000 --limit 10 --cursor 0 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "wiki",
+    "technical_detail": "PARAM_ERROR - 未找到指定工具",
+    "trace_id": "2132f5ca17840998189126304e08d9"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] business error: success=false\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "wiki",
+    "technical_detail": "PARAM_ERROR - 未找到指定工具",
+    "trace_id": "2132f5ca17840998189126304e08d9"
+  }
+}
dws wiki +node-move --workspace <workspace> --node <node> --folder <folder>write
移动知识库节点
dws mcp doc move_document --json '{"nodeId":<..>, "workspaceId":<..>, "targetFolderId":<..>}' lark wiki 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;doc/move_document
输入 / CLI 输出
输入
dws wiki +node-move --workspace x --node x --folder x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "move_document"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "targetFolderId": "x",
+    "workspaceId": "x"
+  },
+  "product": "doc",
+  "tool": "move_document"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1053ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test wiki +node-move --workspace DWSREALTESTNOSUCHID0000000000000 --node DWSREALTESTNOSUCHID0000000000000 --folder DWSREALTESTNOSUCHID0000000000000 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc/move_document)\n  hint: Document may have been deleted or moved",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.inputArgs.invalid",
+    "server_key": "doc",
+    "trace_id": "0bb7c36217840999780286509e07fe"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc/move_document)\n  hint: Document may have been deleted or moved",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "invalidRequest.inputArgs.invalid",
+    "server_key": "doc",
+    "trace_id": "0bb7c36217840999780286509e07fe"
+  }
+}
dws wiki +resolve-space --name <name>read
按名称搜索知识空间并解析出唯一 spaceId(只读)
dws mcp wiki <tool>dws wiki +resolve-space --name <name>read复合/智能型
按名称搜索知识空间并解析出唯一 spaceId(只读)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark wiki 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;wiki/search_wikiSpaces;没有找到名称包含 x 的知识空间
输入 / CLI 输出
输入
dws wiki +resolve-space --name x --yes
stdout
(空)
stderr / error
没有找到名称包含 x 的知识空间
最终用于判定的返回
没有找到名称包含 x 的知识空间
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1533ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test wiki +resolve-space --name 'DWS shortcut 真实测试' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没有找到名称包含 DWS shortcut 真实测试 的知识空间"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没有找到名称包含 DWS shortcut 真实测试 的知识空间"
+  }
+}
dws wiki +space-list --type <type> --limit <limit> --cursor <cursor>read
列出组织 / 个人知识库
dws mcp wiki <tool> lark-cli wiki +space-list已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;wiki/list_wikiSpaces
输入 / CLI 输出
输入
dws wiki +space-list --type orgWikiSpace --limit x --cursor x --yes
stdout
{
+  "count": 0,
+  "spaces": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "spaces": []
+}
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=759ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test wiki +space-list --type ALL --limit 10 --cursor 0 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "参数 --type 取值 \"ALL\" 不合法,允许值:orgWikiSpace, myWikiSpace"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "参数 --type 取值 \"ALL\" 不合法,允许值:orgWikiSpace, myWikiSpace"
+  }
+}
dws wiki +space-search --query <query> --limit <limit>read
搜索知识库
dws mcp wiki <tool> lark wiki 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;wiki/search_wikiSpaces
输入 / CLI 输出
输入
dws wiki +space-search --query x --limit x --yes
stdout
{
+  "count": 0,
+  "spaces": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "spaces": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1951ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test wiki +space-search --query '测试' --limit 10 --yes --format json
真实 stdout
{
+  "count": 0,
+  "spaces": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "spaces": []
+}
dws wiki +wiki-new-doc --space <space> --title <title>write
在指定名称的知识库下新建一个文档节点(自动按空间名解析 workspaceId)
dws mcp wiki <tool>dws wiki +wiki-new-doc --space <space> --title <title>write复合/智能型
在指定名称的知识库下新建一个文档节点(自动按空间名解析 workspaceId)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚 lark wiki 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;wiki/search_wikiSpaces;没找到名为 "x" 的知识库;换个更完整/精确的空间名再试。
输入 / CLI 输出
输入
dws wiki +wiki-new-doc --space x --title x --yes
stdout
(空)
stderr / error
没找到名为 "x" 的知识库;换个更完整/精确的空间名再试。
最终用于判定的返回
没找到名为 "x" 的知识库;换个更完整/精确的空间名再试。
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1152ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
缺真实资源 fixture / 需真实 fixture,非 CLI 可直接修
+真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。
真实输入
/private/tmp/dws-real-test wiki +wiki-new-doc --space __DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__ --title 'DWS shortcut 真实测试 20260715-151724' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没找到名为 \"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__\" 的知识库;换个更完整/精确的空间名再试。"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "没找到名为 \"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__\" 的知识库;换个更完整/精确的空间名再试。"
+  }
+}

ding · 5 个 · 钉钉特有 · lark 无对应

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws ding +list --cursor <cursor> --type <type>read
查询 DING 消息列表
dws mcp im list_ding_messages --json '{"type":<..>, "cursor":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_ding_messages
输入 / CLI 输出
输入
dws ding +list --cursor 1 --type x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "cursor": 1,
+    "type": "x"
+  },
+  "product": "im",
+  "tool": "list_ding_messages"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "cursor": 1,
+    "type": "x"
+  },
+  "product": "im",
+  "tool": "list_ding_messages"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1459ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test ding +list --cursor 0 --type ALL --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "dingMessages": [
+      {
+        "openDingId": "5D73E3AC29C780072D1CD56C6874ACC2",
+        "sendTime": "2026-07-14 20:30:06",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "6DE6EC00AEBEF6839CA5F309371550DA",
+        "sendTime": "2026-07-10 16:17:20",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "4DE0B0D90A94683CE1A9E12CBBB82883",
+        "sendTime": "2026-07-10 12:38:47",
+        "senderNick": "思敏"
+      },
+      {
+        "openDingId": "B1CF538F2A3CAD8F78E863BCFF10E90F",
+        "sendTime": "2026-07-10 11:47:07",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "72D79962A868374366AF4FCA6946D49F",
+        "sendTime": "2026-07-10 11:44:27",
+        "senderNick": "汀葻"
+      },
+      {
+        "openDingId": "A290A8F6D35CC8E712E3E4C30D915263",
+        "sendTime": "2026-07-10 11:10:52",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "7B7BA69E68F85A3948B70A1BD79C9DF2",
+        "sendTime": "2026-07-09 20:43:36",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "0D59FF6F871900140BD65422184C410C",
+        "sendTime": "2026-07-09 17:25:36",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "B6072FCC82D85A343EE7834A70293F09",
+        "sendTime": "2026-07-09 16:37:54",
+        "senderNick": "王玮(哈瑞)"
+      },
+      {
+        "openDingId": "91DFBF0D54B7A0DCC8F7EAF58560586C",
+        "sendTime": "2026-07-09 15:17:19",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "EA1F2A52C13954855A3D0D7A32A973F6",
+        "sendTime": "2026-07-09 11:52:15",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "340C8FD58735886D44B5EA46921F8AAD",
+        "sendTime": "2026-07-07 11:48:58",
+        "senderNick": "穆伦"
+      },
+      {
+        "openDingId": "A389AD2799303C13C15BB6EF014D3B39",
+        "sendTime": "2026-07-07 11:34:34",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "A26385411682C6C5042D775B25DA8F08",
+        "sendTime": "2026-07-06 11:37:05",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "C42A8B86D5453197F79645460E0B7A99",
+        "sendTime": "2026-07-03 17:41:43",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "5AEF5D3CF756F23345F86FF5E7544E73",
+        "sendTime": "2026-07-03 15:40:52",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "EA0E39C793A943797EEDEA9B00740A72",
+        "sendTime": "2026-07-03 14:40:23",
+        "senderNick": "粤腾"
+      },
+      {
+        "openDingId": "753EC85C1FA6E50D82EB5C19940F340E",
+        "sendTime": "2026-07-02 20:26:38",
+        "senderNick": "思敏"
+      },
+      {
+        "openDingId": "782B702452A410EC6D30ADC9D4E95FDB",
+        "sendTime": "2026-07-02 09:49:45",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "983C2C5A65CAE1A86D8C6BC272E73D11",
+        "sendTime": "2026-07-02 09:48:09",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "40B84F9DF18DE299C2B2D712E7D01114",
+        "sendTime": "2026-06-29 17:59:37",
+        "senderNick": "穆伦"
+      },
+      {
+        "openDingId": "F799B63D8EDDB7915C80159BD355704F",
+        "sendTime": "2026-06-25 19:53:17",
+        "senderNick": "文靖"
+      },
+      {
+        "openDingId": "33C1238264ACA098634569396F60EE7A",
+        "sendTime": "2026-06-25 18:10:19",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "2A05EE1E37F7EB023C3146819156E9A8",
+        "sendTime": "2026-06-25 11:49:24",
+        "senderNick": "穆伦"
+      },
+      {
+        "openDingId": "29FBFA46D6F07ED25378F2871E24A1DC",
+        "sendTime": "2026-06-24 12:00:32",
+        "senderNick": "云欢"
+      },
+      {
+        "openDingId": "2CE4C4F3EE8C332884FA1673C064921C",
+        "sendTime": "2026-06-22 20:47:14",
+        "senderNick": "黎常"
+      },
+      {
+        "openDingId": "8A2B1A1F7E508B2F08A52FEDD9365843",
+        "sendTime": "2026-06-18 13:41:19",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "7F7671C7853D88C92DE6EE0A671CB57B",
+        "sendTime": "2026-06-17 10:52:34",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "9539E8D27A51F204197E326F94650279",
+        "sendTime": "2026-06-16 11:50:18",
+        "senderNick": "穆伦"
+      },
+      {
+        "openDingId": "DE9E8FAFC8125BC715B999AC4267E2CA",
+        "sendTime": "2026-06-15 21:35:40",
+        "senderNick": "西渐(主用钉)"
+      },
+      {
+        "openDingId": "A5D83E673DC5A97F38D95F3E135C7824",
+        "sendTime": "2026-06-12 22:08:36",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "5360613B1FC2389E8435CFABC57CC012",
+        "sendTime": "2026-06-12 13:51:21",
+        "senderNick": "鱼非"
+      },
+      {
+        "openDingId": "3AB6395324A62CB2B4B513D0A02F67FA",
+        "sendTime": "2026-06-11 11:23:39",
+        "senderNick": "徐潇扬"
+      },
+      {
+        "openDingId": "FB9FB2808D6ADF7464F5F1ACBA8A6704",
+        "sendTime": "2026-06-11 09:51:55",
+        "senderNick": "徐潇扬"
+      },
+      {
+        "openDingId": "4D094E702716D4A46015CDC12B8F216B",
+        "sendTime": "2026-06-10 22:04:05",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "74E2B3EB36EE99E6D88744F6B2C4C265",
+        "sendTime": "2026-06-10 18:14:48",
+        "senderNick": "古榕"
+      },
+      {
+        "openDingId": "CAEF5614C47B65CDF10AED44BDFC7D9F",
+        "sendTime": "2026-06-10 16:02:42",
+        "senderNick": "徐潇扬"
+      },
+      {
+        "openDingId": "F2C3A0F51AC502E84AECB932C227AAED",
+        "sendTime": "2026-06-09 17:43:20",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "8AB2C3B891D931D8D650D41CA6205BCE",
+        "sendTime": "2026-06-09 15:50:23",
+        "senderNick": "可菡"
+      },
+      {
+        "openDingId": "0456CE6A50FD2902B68D772DA37A96BC",
+        "sendTime": "2026-06-09 09:45:43",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "6CB0E9E1D2CC344CB9217C97550BC6C6",
+        "sendTime": "2026-06-08 21:42:37",
+        "senderNick": "林弈"
+      },
+      {
+        "openDingId": "0DEFB0942003A059C230BE1D262CAC8C",
+        "sendTime": "2026-06-08 21:27:39",
+        "senderNick": "林弈"
+      },
+      {
+        "openDingId": "6B600C709E7468700F208B5DBB7ED888",
+        "sendTime": "2026-06-08 15:42:05",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "B3502CC153C09A27AADE63A0BDF94C4A",
+        "sendTime": "2026-06-05 17:38:44",
+        "senderNick": "慧德"
+      },
+      {
+        "openDingId": "07EC05F3E019605304D3C8216C6F7A32",
+        "sendTime": "2026-06-05 17:19:52",
+        "senderNick": "弈宇(Alpha)"
+      },
+      {
+        "openDingId": "1C25016699ADE6DE66C6C9ECAE8C83B2",
+        "sendTime": "2026-06-05 14:46:54",
+        "senderNick": "弈宇(Alpha)"
+      },
+      {
+        "openDingId": "AF79C95530607985A95866F7DE45F45E",
+        "sendTime": "2026-06-05 14:39:48",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "4BFEE560E26AA24C1966A4D6EB722B89",
+        "sendTime": "2026-06-05 09:28:42",
+        "senderNick": "慧德"
+      },
+      {
+        "openDingId": "B7F170045D3C6CC9D37DE356276BF084",
+        "sendTime": "2026-06-04 23:07:57",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "A04A3D9659BD8FBDCF0C5E28EB2314F7",
+        "sendTime": "2026-06-04 17:30:21",
+        "senderNick": "念晨"
+      }
+    ],
+    "hasMore": true,
+    "nextCursor": 1780565411433
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "dingMessages": [
+      {
+        "openDingId": "5D73E3AC29C780072D1CD56C6874ACC2",
+        "sendTime": "2026-07-14 20:30:06",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "6DE6EC00AEBEF6839CA5F309371550DA",
+        "sendTime": "2026-07-10 16:17:20",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "4DE0B0D90A94683CE1A9E12CBBB82883",
+        "sendTime": "2026-07-10 12:38:47",
+        "senderNick": "思敏"
+      },
+      {
+        "openDingId": "B1CF538F2A3CAD8F78E863BCFF10E90F",
+        "sendTime": "2026-07-10 11:47:07",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "72D79962A868374366AF4FCA6946D49F",
+        "sendTime": "2026-07-10 11:44:27",
+        "senderNick": "汀葻"
+      },
+      {
+        "openDingId": "A290A8F6D35CC8E712E3E4C30D915263",
+        "sendTime": "2026-07-10 11:10:52",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "7B7BA69E68F85A3948B70A1BD79C9DF2",
+        "sendTime": "2026-07-09 20:43:36",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "0D59FF6F871900140BD65422184C410C",
+        "sendTime": "2026-07-09 17:25:36",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "B6072FCC82D85A343EE7834A70293F09",
+        "sendTime": "2026-07-09 16:37:54",
+        "senderNick": "王玮(哈瑞)"
+      },
+      {
+        "openDingId": "91DFBF0D54B7A0DCC8F7EAF58560586C",
+        "sendTime": "2026-07-09 15:17:19",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "EA1F2A52C13954855A3D0D7A32A973F6",
+        "sendTime": "2026-07-09 11:52:15",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "340C8FD58735886D44B5EA46921F8AAD",
+        "sendTime": "2026-07-07 11:48:58",
+        "senderNick": "穆伦"
+      },
+      {
+        "openDingId": "A389AD2799303C13C15BB6EF014D3B39",
+        "sendTime": "2026-07-07 11:34:34",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "A26385411682C6C5042D775B25DA8F08",
+        "sendTime": "2026-07-06 11:37:05",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "C42A8B86D5453197F79645460E0B7A99",
+        "sendTime": "2026-07-03 17:41:43",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "5AEF5D3CF756F23345F86FF5E7544E73",
+        "sendTime": "2026-07-03 15:40:52",
+        "senderNick": "楠者"
+      },
+      {
+        "openDingId": "EA0E39C793A943797EEDEA9B00740A72",
+        "sendTime": "2026-07-03 14:40:23",
+        "senderNick": "粤腾"
+      },
+      {
+        "openDingId": "753EC85C1FA6E50D82EB5C19940F340E",
+        "sendTime": "2026-07-02 20:26:38",
+        "senderNick": "思敏"
+      },
+      {
+        "openDingId": "782B702452A410EC6D30ADC9D4E95FDB",
+        "sendTime": "2026-07-02 09:49:45",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "983C2C5A65CAE1A86D8C6BC272E73D11",
+        "sendTime": "2026-07-02 09:48:09",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "40B84F9DF18DE299C2B2D712E7D01114",
+        "sendTime": "2026-06-29 17:59:37",
+        "senderNick": "穆伦"
+      },
+      {
+        "openDingId": "F799B63D8EDDB7915C80159BD355704F",
+        "sendTime": "2026-06-25 19:53:17",
+        "senderNick": "文靖"
+      },
+      {
+        "openDingId": "33C1238264ACA098634569396F60EE7A",
+        "sendTime": "2026-06-25 18:10:19",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "2A05EE1E37F7EB023C3146819156E9A8",
+        "sendTime": "2026-06-25 11:49:24",
+        "senderNick": "穆伦"
+      },
+      {
+        "openDingId": "29FBFA46D6F07ED25378F2871E24A1DC",
+        "sendTime": "2026-06-24 12:00:32",
+        "senderNick": "云欢"
+      },
+      {
+        "openDingId": "2CE4C4F3EE8C332884FA1673C064921C",
+        "sendTime": "2026-06-22 20:47:14",
+        "senderNick": "黎常"
+      },
+      {
+        "openDingId": "8A2B1A1F7E508B2F08A52FEDD9365843",
+        "sendTime": "2026-06-18 13:41:19",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "7F7671C7853D88C92DE6EE0A671CB57B",
+        "sendTime": "2026-06-17 10:52:34",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "9539E8D27A51F204197E326F94650279",
+        "sendTime": "2026-06-16 11:50:18",
+        "senderNick": "穆伦"
+      },
+      {
+        "openDingId": "DE9E8FAFC8125BC715B999AC4267E2CA",
+        "sendTime": "2026-06-15 21:35:40",
+        "senderNick": "西渐(主用钉)"
+      },
+      {
+        "openDingId": "A5D83E673DC5A97F38D95F3E135C7824",
+        "sendTime": "2026-06-12 22:08:36",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "5360613B1FC2389E8435CFABC57CC012",
+        "sendTime": "2026-06-12 13:51:21",
+        "senderNick": "鱼非"
+      },
+      {
+        "openDingId": "3AB6395324A62CB2B4B513D0A02F67FA",
+        "sendTime": "2026-06-11 11:23:39",
+        "senderNick": "徐潇扬"
+      },
+      {
+        "openDingId": "FB9FB2808D6ADF7464F5F1ACBA8A6704",
+        "sendTime": "2026-06-11 09:51:55",
+        "senderNick": "徐潇扬"
+      },
+      {
+        "openDingId": "4D094E702716D4A46015CDC12B8F216B",
+        "sendTime": "2026-06-10 22:04:05",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "74E2B3EB36EE99E6D88744F6B2C4C265",
+        "sendTime": "2026-06-10 18:14:48",
+        "senderNick": "古榕"
+      },
+      {
+        "openDingId": "CAEF5614C47B65CDF10AED44BDFC7D9F",
+        "sendTime": "2026-06-10 16:02:42",
+        "senderNick": "徐潇扬"
+      },
+      {
+        "openDingId": "F2C3A0F51AC502E84AECB932C227AAED",
+        "sendTime": "2026-06-09 17:43:20",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "8AB2C3B891D931D8D650D41CA6205BCE",
+        "sendTime": "2026-06-09 15:50:23",
+        "senderNick": "可菡"
+      },
+      {
+        "openDingId": "0456CE6A50FD2902B68D772DA37A96BC",
+        "sendTime": "2026-06-09 09:45:43",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "6CB0E9E1D2CC344CB9217C97550BC6C6",
+        "sendTime": "2026-06-08 21:42:37",
+        "senderNick": "林弈"
+      },
+      {
+        "openDingId": "0DEFB0942003A059C230BE1D262CAC8C",
+        "sendTime": "2026-06-08 21:27:39",
+        "senderNick": "林弈"
+      },
+      {
+        "openDingId": "6B600C709E7468700F208B5DBB7ED888",
+        "sendTime": "2026-06-08 15:42:05",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "B3502CC153C09A27AADE63A0BDF94C4A",
+        "sendTime": "2026-06-05 17:38:44",
+        "senderNick": "慧德"
+      },
+      {
+        "openDingId": "07EC05F3E019605304D3C8216C6F7A32",
+        "sendTime": "2026-06-05 17:19:52",
+        "senderNick": "弈宇(Alpha)"
+      },
+      {
+        "openDingId": "1C25016699ADE6DE66C6C9ECAE8C83B2",
+        "sendTime": "2026-06-05 14:46:54",
+        "senderNick": "弈宇(Alpha)"
+      },
+      {
+        "openDingId": "AF79C95530607985A95866F7DE45F45E",
+        "sendTime": "2026-06-05 14:39:48",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "4BFEE560E26AA24C1966A4D6EB722B89",
+        "sendTime": "2026-06-05 09:28:42",
+        "senderNick": "慧德"
+      },
+      {
+        "openDingId": "B7F170045D3C6CC9D37DE356276BF084",
+        "sendTime": "2026-06-04 23:07:57",
+        "senderNick": "念晨"
+      },
+      {
+        "openDingId": "A04A3D9659BD8FBDCF0C5E28EB2314F7",
+        "sendTime": "2026-06-04 17:30:21",
+        "senderNick": "念晨"
+      }
+    ],
+    "hasMore": true,
+    "nextCursor": 1780565411433
+  },
+  "success": true
+}
dws ding +recall-personal --id <id>high-risk-write
撤回本人发起的 DING
dws mcp im recall_personal_ding --json '{"openDingId":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/recall_personal_ding
输入 / CLI 输出
输入
dws ding +recall-personal --id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openDingId": "x"
+  },
+  "product": "im",
+  "tool": "recall_personal_ding"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openDingId": "x"
+  },
+  "product": "im",
+  "tool": "recall_personal_ding"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1415ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test ding +recall-personal --id 8508193BEA49427AA9FFE94EB9D6B28E --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {},
+  "success": true
+}
dws ding +receiver-status --ding-id <ding-id>read
查询 DING 消息接收人已读状态
dws mcp im list_ding_receiver_status --json '{"openDingId":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/list_ding_receiver_status
输入 / CLI 输出
输入
dws ding +receiver-status --ding-id x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openDingId": "x"
+  },
+  "product": "im",
+  "tool": "list_ding_receiver_status"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openDingId": "x"
+  },
+  "product": "im",
+  "tool": "list_ding_receiver_status"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1823ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test ding +receiver-status --ding-id 5D73E3AC29C780072D1CD56C6874ACC2 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "receivers": [
+      {
+        "confirmedStatus": 1,
+        "openDingId": "5D73E3AC29C780072D1CD56C6874ACC2",
+        "receiverNick": "粤腾"
+      }
+    ]
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "receivers": [
+      {
+        "confirmedStatus": 1,
+        "openDingId": "5D73E3AC29C780072D1CD56C6874ACC2",
+        "receiverNick": "粤腾"
+      }
+    ]
+  },
+  "success": true
+}
dws ding +send-by-message --group <group> --message-id <message-id> --users <users> --type <type> --uuid <uuid>write
针对某条消息发起 DING 提醒
dws mcp im send_ding_by_message --json '{"openConversationId":<..>, "openMessageId":<..>, "receiverOpenDingTalkIds":<..>, "remindType":<..>, "uuid":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/send_ding_by_message
输入 / CLI 输出
输入
dws ding +send-by-message --group x --message-id x --users x --type x --uuid x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x",
+    "receiverOpenDingTalkIds": [
+      "x"
+    ],
+    "remindType": "x",
+    "uuid": "x"
+  },
+  "product": "im",
+  "tool": "send_ding_by_message"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "openConversationId": "x",
+    "openMessageId": "x",
+    "receiverOpenDingTalkIds": [
+      "x"
+    ],
+    "remindType": "x",
+    "uuid": "x"
+  },
+  "product": "im",
+  "tool": "send_ding_by_message"
+}
真实后端测试输入 / 输出真实后端返回错误
exit=1;duration=1058ms;real-backend-safe-negative-write; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test ding +send-by-message --group cidDWSREALTESTNOSUCHCONV --message-id DWSREALTESTNOSUCHID0000000000000 --users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --type FIXED --uuid dws-shortcut-real-negative-20260715-151724 --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] remindType非法,合法值:APP/SMS/PHONE (operation: im/send_ding_by_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999678466213e0853"
+  }
+}
真实返回
{
+  "error": {
+    "category": "api",
+    "code": 1,
+    "hint": "The API returned a business-level error. Check required parameters and values.",
+    "message": "[UNCLASSIFIED] remindType非法,合法值:APP/SMS/PHONE (operation: im/send_ding_by_message)\n  hint: Use --verbose for detailed error logs",
+    "operation": "tools/call",
+    "reason": "business_error",
+    "server_error_code": "PARAM_ERROR",
+    "server_key": "im",
+    "trace_id": "0b5deb3217840999678466213e0853"
+  }
+}
dws ding +send-personal --users <users> --content <content> --type <type> --uuid <uuid>write
以本人身份发送 DING 给指定人
dws mcp im send_personal_ding --json '{"receiverOpenDingTalkIds":<..>, "content":<..>, "remindType":<..>, "uuid":<..>}' 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;im/send_personal_ding
输入 / CLI 输出
输入
dws ding +send-personal --users x --content x --type x --uuid x --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "content": "x",
+    "receiverOpenDingTalkIds": [
+      "x"
+    ],
+    "remindType": "x",
+    "uuid": "x"
+  },
+  "product": "im",
+  "tool": "send_personal_ding"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "content": "x",
+    "receiverOpenDingTalkIds": [
+      "x"
+    ],
+    "remindType": "x",
+    "uuid": "x"
+  },
+  "product": "im",
+  "tool": "send_personal_ding"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1338ms;real-backend-manual-write; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test ding +send-personal --users 103262 --content 'DWS shortcut 真实测试 20260715:验证 ding +send-personal,请忽略。' --type app --uuid dws-shortcut-ding-20260715-001 --yes --format json
真实 stdout
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openDingId": "8508193BEA49427AA9FFE94EB9D6B28E"
+  },
+  "success": true
+}
真实 stderr / error
(空)
真实返回
{
+  "arguments": [],
+  "errorCode": null,
+  "errorMsg": null,
+  "result": {
+    "openDingId": "8508193BEA49427AA9FFE94EB9D6B28E"
+  },
+  "success": true
+}

report · 3 个 · 钉钉特有 · lark 无对应

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + + - - + + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws report +inbox-list --start <start> --end <end> --cursor <cursor> --size <size> --sender-user-ids <sender-user-ids>read
列出我收到的日报(按时间范围分页)
dws mcp report <tool> 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--start 时间格式无效,需 ISO-8601(如 2026-03-10T00:00:00+08:00): parsing time "x" as "2006-01-02T15:04:05Z07:00": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws report +inbox-list --start x --end x --cursor 1 --size 1 --sender-user-ids x --yes
stdout
(空)
stderr / error
--start 时间格式无效,需 ISO-8601(如 2026-03-10T00:00:00+08:00): parsing time "x" as "2006-01-02T15:04:05Z07:00": cannot parse "x" as "2006"
最终用于判定的返回
--start 时间格式无效,需 ISO-8601(如 2026-03-10T00:00:00+08:00): parsing time "x" as "2006-01-02T15:04:05Z07:00": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=2130ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test report +inbox-list --start 2026-07-08T15:14:39+08:00 --end 2026-07-15T15:14:39+08:00 --cursor 0 --size 1 --sender-user-ids x --yes --format json
真实 stdout
{
+  "count": 0,
+  "reports": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "reports": []
+}
dws report +outbox-list --cursor <cursor> --size <size> --start <start> --end <end> --modified-start <modified-start> --modified-end <modified-end> --template-name <template-name>read
列出我发出的日报(可选时间/模版名过滤)
dws mcp report <tool> 无对应(钉钉特有服务)实测校验拦截
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 0;tool 已校验;无 MCP 调用(校验前拦截);--start 时间格式无效,需 ISO-8601(如 2026-03-10T00:00:00+08:00): parsing time "x" as "2006-01-02T15:04:05Z07:00": cannot parse "x" as "2006"
输入 / CLI 输出
输入
dws report +outbox-list --cursor 1 --size 1 --start x --end x --modified-start x --modified-end x --template-name x --yes
stdout
(空)
stderr / error
--start 时间格式无效,需 ISO-8601(如 2026-03-10T00:00:00+08:00): parsing time "x" as "2006-01-02T15:04:05Z07:00": cannot parse "x" as "2006"
最终用于判定的返回
--start 时间格式无效,需 ISO-8601(如 2026-03-10T00:00:00+08:00): parsing time "x" as "2006-01-02T15:04:05Z07:00": cannot parse "x" as "2006"
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1584ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test report +outbox-list --cursor 0 --size 1 --start 2026-07-08T15:14:41+08:00 --end 2026-07-15T15:14:41+08:00 --modified-start 2026-07-08T15:14:41+08:00 --modified-end 2026-07-15T15:14:41+08:00 --yes --format json
真实 stdout
{
+  "count": 0,
+  "reports": []
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 0,
+  "reports": []
+}
dws report +report-latest --keyword <keyword>read
取我最新提交的一篇日志/汇报详情(钉钉原生)
dws mcp report get_report_entry_details --json '{"cursor":<..>, "size":<..>, "startTime":<..>, "endTime":<..>, "report_id":<..>}'dws report +report-latest --keyword <keyword>read复合/智能型
取我最新提交的一篇日志/汇报详情(钉钉原生)
复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚;入口工具 get_report_entry_details 无对应(钉钉特有服务)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;report/get_send_report_list;暂无日志
输入 / CLI 输出
输入
dws report +report-latest --keyword x --yes
stdout
(空)
stderr / error
暂无日志
最终用于判定的返回
暂无日志
真实后端测试输入 / 输出真实后端返回错误
exit=3;duration=1259ms;real-backend-read; no --mock; no --dry-run
失败归因 / 可修复性
输入或业务校验失败 / 需区分测试输入或后端规则
+命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。
真实输入
/private/tmp/dws-real-test report +report-latest --keyword '测试' --yes --format json
真实 stdout
(空)
真实 stderr / error
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "暂无日志"
+  }
+}
真实返回
{
+  "error": {
+    "category": "validation",
+    "code": 3,
+    "message": "暂无日志"
+  }
+}

sheet · 2 个 · ↔ lark sheets

- - +
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
+ + +
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
dws sheet +list-sheets --node <node>read
获取表格文档中全部工作表列表
dws mcp sheet <tool> lark sheets 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;sheet/get_all_sheets
输入 / CLI 输出
输入
dws sheet +list-sheets --node x --yes
stdout
{
+  "count": 0,
+  "sheets": []
+}
stderr / error
(空)
最终用于判定的返回
{
+  "count": 0,
+  "sheets": []
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1690ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test sheet +list-sheets --node mweZ92PV6O36dZbnsMZx70ylJxEKBD6p --yes --format json
真实 stdout
{
+  "count": 1,
+  "sheets": [
+    {
+      "sheetId": "kgqie6hm",
+      "title": "Sheet1"
+    }
+  ]
+}
真实 stderr / error
(空)
真实返回
{
+  "count": 1,
+  "sheets": [
+    {
+      "sheetId": "kgqie6hm",
+      "title": "Sheet1"
+    }
+  ]
+}
dws sheet +read --node <node> --sheet-id <sheet-id> --range <range> --value-render-option <value-render-option>read
读取工作表指定范围的结构化单元格数据
dws mcp sheet get_cell_infos --json '{"nodeId":<..>, "sheetId":<..>, "range":<..>, "valueRenderOption":<..>}' lark sheets 无同名命令(能力/命名不同)已实测装配
cobra 实际执行 + fake MCP 拦截,零网络/零副作用;调用数 1;tool 已校验;sheet/get_cell_infos
输入 / CLI 输出
输入
dws sheet +read --node x --sheet-id x --range x --value-render-option formatted_value --yes
stdout
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "range": "x",
+    "sheetId": "x",
+    "valueRenderOption": "formatted_value"
+  },
+  "product": "sheet",
+  "tool": "get_cell_infos"
+}
stderr / error
(空)
最终用于判定的返回
{
+  "_fake": true,
+  "args": {
+    "nodeId": "x",
+    "range": "x",
+    "sheetId": "x",
+    "valueRenderOption": "formatted_value"
+  },
+  "product": "sheet",
+  "tool": "get_cell_infos"
+}
真实后端测试输入 / 输出真实后端成功
exit=0;duration=1589ms;real-backend-read; no --mock; no --dry-run
真实输入
/private/tmp/dws-real-test sheet +read --node DWSREALREADNOSUCHID0000000000000 --sheet-id x --range x --value-render-option formatted_value --yes --format json
真实 stdout
null
真实 stderr / error
(空)
真实返回
null
\ No newline at end of file diff --git a/docs/shortcut-error-review.html b/docs/shortcut-error-review.html new file mode 100644 index 00000000..d935fea0 --- /dev/null +++ b/docs/shortcut-error-review.html @@ -0,0 +1,279 @@ + + + + + +Shortcut 真实测试失败逐项 review + + + +
+

Shortcut 真实测试失败逐项 review

+
由 scripts/gen_shortcut_error_review.py 从真实测试结果生成;目标是把每个失败项落到“应该改哪里”。
+
+
+
+Read:204 条,成功 162,失败 41,超时 0。 +Write:162 条,成功 48,失败 114,超时 0。 +判定口径:如果 fake MCP 已看到字段但真实后端仍报 required,按后端/MCP schema 映射处理;如果真实后端报资源无效/不存在,按 fixture 处理;权限类不在 CLI 中绕过。 +
+ +
41
Read 失败
+
114
Write 失败
+
156
逐项 review
+
72
测试数据/fixture
+
22
权限/应用配置
+
33
后端/MCP schema
+
+

按错误类型

+ + + + + +
类型数量
输入/业务校验36
后端/MCP33
缺 AI 表格 fixture31
缺真实资源30
鉴权/权限22
缺妙记 fixture3
敏感/高风险暂缓1
+

按要改哪里

+ + + + + + + +
要改哪里数量
测试数据72
后端/MCP schema33
权限/应用配置22
测试输入/业务校验13
后端业务/测试 fixture11
测试输入2
人工安全确认1
测试输入/shortcut 枚举1
测试输入/业务规则1
+
+ + +

缺真实资源复盘 · 可自造/可查资源处理结果

+ + + + + + + + + + + + + + + + +
命令/范围处理状态本次实际排查/造数结果后续建议
chat +group-members已补齐查到真实群名 `浅曦-kida,Dennis,秋画`,runner 已改为用群名而不是 openConversationId;真实回归成功。无需后续动作。
chat +messages-mget已补齐复用真实单聊消息 `msgEuOor1PmFBNlx9M06N9z1Q==`;真实回归成功。无需后续动作。
chat +messages-read-status已补齐复用真实单聊会话 `cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=` 与同一 openMessageId;真实回归成功。无需后续动作。
chat +messages-query-send-status已补齐复用真实发送返回的 openTaskId;真实回归成功。无需后续动作。
ding +receiver-status已补齐先只读 `ding +list` 找到已有 openDingId,再查询 receiver status;没有新发 DING,真实回归成功。无需后续动作。
sheet +list-sheets已自造创建临时在线表格 `DWS shortcut 真实测试表格 20260715`,nodeId=`mweZ92PV6O36dZbnsMZx70ylJxEKBD6p`;真实回归成功。后续可保留为稳定 fixture,或测试结束后人工清理。
todo +todo-done已自造并修复 CLIrunner 会先创建当前账号自己的临时待办,再执行 `todo +todo-done`;同时修复了 todo 列表 pageSize=50 返回空、响应多层 result unwrap 不稳的问题;真实回归成功。无需后续动作;代码已有单测覆盖 nested result。
contact +by-mobile已按用户授权补齐使用用户指定手机号 `13161187007` 作为真实 fixture;runner 只在该命令上替换 mobile,不扩散到其它服务。真实回归成功后该项将从失败列表移除;若后续要脱敏公开报告,可再加展示层脱敏。
attendance +get-class / +get-group / +get-group-filtered不建议自造`attendance +search-class` 与 `+search-group --type FIXED` 均返回空;创建班次/考勤组会改组织考勤配置,属于高影响业务数据。需要考勤后端/业务同学提供可读测试班次与考勤组 ID。
chat +chat-get-by-id暂未找到该 shortcut 只接受数字 groupId;真实群列表只返回 openConversationId,没有数字群号字段。需要 IM 后端提供可用数字 groupId,或评估是否新增 openConversationId 形态的 shortcut。
chat +messages-resource-url暂未自造需要真实含 mediaId 的图片/文件/视频消息;当前文本消息无法产生 resource-id。可在测试群发一条图片/文件消息并提取 mediaId 后补 fixture;注意会产生群消息。
chat +thread-replies暂未自造需要真实话题消息 topicId;普通群消息不能替代。需要话题群 fixture,或由 IM 同学提供当前账号可访问 topicId。
aitable +dashboard-share-get真实资源仍失败已有真实 base/dashboard,但 share-get 返回 404 `Failed to get dashboard share config`;更像分享配置未开启或后端接口行为问题。需要 AI 表格/后端确认如何创建/开启 dashboard share fixture,或修正 404 语义。
write 类 delete/recall/approve/wiki move/copy 等不自动自造这些命令即便能造资源,也会涉及删除、撤回、审批通过、知识库移动/复制等高影响动作。需要逐项授权和专门测试空间/机器人/审批单据,不建议混在批量回归里自动跑。
+ + +

Read 失败逐项 · 42 条

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#命令风险类型要改哪里具体改法验证方式operationtrace_id证据
1aitable +base-get-primary-doc-idread后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"-1","message":"no record","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to query cell doc for record 1015oH3OXy in table…
2aitable +chart-share-getread鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `aitable +chart-share-get`;若仍是 permission,再看 trace_id。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"403","message":"Forbidden","retryable":false,"type":"AUTH_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to get chart share config for chart widget-dlxFo…
3aitable +dashboard-share-getread缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `aitable +dashboard-share-get`。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"Not Found","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to get dashboard share config for dashboard KY9…
4aitable +export-dataread后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"taskId cannot be combined with scope, format, tableId or viewId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,…
5aitable +record-primary-doc-getread后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"-1","message":"no record","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to query cell doc for record 1015oH3OXy in table…
6aitable +role-getread后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"roleId is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to get role because roleId …
7aitable +workflow-getread后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"GET_WORKFLOW_ERROR","message":"调用远程服务业务异常","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to get workflow in base 'gpG2Nd…
8aitable +workflow-listread后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"LIST_WORKFLOWS_ERROR","message":"biz error","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to list workflows in base 'gpG…
9attendance +get-classread缺真实资源测试数据替换为真实考勤班次/考勤组/员工/假期等资源 ID;当前 no-such ID 只能验证负向路径。先用考勤列表/管理后台拿真实 ID,再重跑该 attendance 命令。tools/call2127d89817840997588238831e0757[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_class_detail) hint: Use --verbose for detailed error logs
10attendance +get-global-settingread鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `attendance +get-global-setting`;若仍是 permission,再看 trace_id。tools/call2104a64c17840997604718062e085e[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/query_global_setting) hint: Use --verbose for detailed error logs
11attendance +get-groupread缺真实资源测试数据替换为真实考勤班次/考勤组/员工/假期等资源 ID;当前 no-such ID 只能验证负向路径。先用考勤列表/管理后台拿真实 ID,再重跑该 attendance 命令。tools/call0b5deb3217840997620512305e08ef[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_detail) hint: Use --verbose for detailed error logs
12attendance +get-group-filteredread缺真实资源测试数据替换为真实考勤班次/考勤组/员工/假期等资源 ID;当前 no-such ID 只能验证负向路径。先用考勤列表/管理后台拿真实 ID,再重跑该 attendance 命令。tools/call2104a64c17840997638062468e08c7[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_filtered_detail) hint: Use --verbose for detailed error logs
13attendance +get-leave-balanceread输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `attendance +get-leave-balance` 并比较 stdout/stderr。tools/call2104a64c17840997652901307e081a[UNCLASSIFIED] 亲,假期类型没有余额 (operation: attendance-wukong/get_leave_balance_quota) hint: Use --verbose for detailed error logs
14attendance +list-report-columnsread鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `attendance +list-report-columns`;若仍是 permission,再看 trace_id。tools/call2127d89817840997666188472e0756[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_report_columns) hint: Use --verbose for detailed error logs
15attendance +query-report-leaveread鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `attendance +query-report-leave`;若仍是 permission,再看 trace_id。tools/call2104a64c17840997679973065e085f[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_leave_time_by_leave_names) hint: Use --verbose for detailed error logs
16calendar +find-roomread输入/业务校验测试输入会议室类命令需要真实 roomId 或更小会议室分组;修改 runner 先定位会议室/分组,再喂给查询命令。用真实 roomId/分组重跑 calendar room/freebusy 命令。tools/call0bb7c36217840997694975303e0758[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。 hint: Use --verbose for detailed error logs
17calendar +room-findread输入/业务校验测试输入会议室类命令需要真实 roomId 或更小会议室分组;修改 runner 先定位会议室/分组,再喂给查询命令。用真实 roomId/分组重跑 calendar room/freebusy 命令。tools/call2104a64c17840997709913005e0819[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。 (operation: calendar/query_available_meeting_room) hint: Use --verbose for detailed error logs
18chat +category-list-conversationsread输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `chat +category-list-conversations` 并比较 stdout/stderr。tools/call0bb7c36217840997724375834e0758[UNCLASSIFIED] listConversationsByCategoryV2 error hint: Use --verbose for detailed error logs
19chat +chat-get-by-idread缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `chat +chat-get-by-id`。tools/call2127d89817840997739165535e07bd[UNCLASSIFIED] verifyGroupId error: The group id does not exit (operation: im/get_conv_info_by_group_id) hint: Use --verbose for detailed error logs
20chat +chat-members-getread后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2127d89817840997754345760e07bd[UNCLASSIFIED] openCid or cid is required (operation: im/list_group_member_by_ids) hint: Use --verbose for detailed error logs
21chat +chat-messagesread后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2104a64c17840997767792656e085e[UNCLASSIFIED] openCid or cid is required hint: Use --verbose for detailed error logs
22chat +messages-listread后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2127d89817840997797873841e0757[UNCLASSIFIED] openCid or cid is required hint: Use --verbose for detailed error logs
23chat +messages-resource-urlread缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `chat +messages-resource-url`。tools/call2127d89817840997855423145e07dd[UNCLASSIFIED] failed to get download url for resourceId: x (operation: im/get_resource_download_url) hint: Use --verbose for detailed error logs
24chat +search-msgread输入/业务校验测试数据准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。造数后重跑,预期从 validation empty result 变为成功。tools/call0b5deb3217840997866824643e0853[UNCLASSIFIED] 当前用户暂无消息搜索权益,无法执行本次搜索。请提示用户开通消息搜索权益后重试。 hint: Use --verbose for detailed error logs
25chat +thread-repliesread缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `chat +thread-replies`。tools/call0b5deb3217840997883504915e0853[UNCLASSIFIED] failed to decrypt openConvThreadId hint: Use --verbose for detailed error logs
26contact +get-rosterread鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `contact +get-roster`;若仍是 permission,再看 trace_id。tools/call2106d98117840997920166915e087b[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/get_authorized_emp_rosterInfo) hint: Use --verbose for detailed error logs
27contact +list-roster-fieldsread鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `contact +list-roster-fields`;若仍是 permission,再看 trace_id。tools/call213ee25c17840997934295673e08e2[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/list_authorized_roster_fields) hint: Use --verbose for detailed error logs
28devapp +credentials-getread敏感/高风险暂缓人工安全确认该项涉及敏感读取或无安全负向目标,不适合自动用真实资源跑;需要在安全环境逐项人工确认。人工确认后单独重跑 `devapp +credentials-get`,并避免在报告中泄露密钥/凭证。--该命令会读取真实应用凭证/密钥;不能用真实 app 自动执行。当前仅用占位 ID 验证负向路径,真实成功需人工在安全环境单独确认。
29drive +downloadread输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `drive +download` 并比较 stdout/stderr。tools/call0bab027317840997956923965e08c9[UNCLASSIFIED] 该文件类型不支持通过 download_file 下载。download_file 仅支持普通文件(如 PDF、Word、Excel 等),不支持钉钉在线文档/表格/脑图等在线编辑类型。如需导出在线文档内容,请使用钉钉文档导出相关接口。 (operation: drive/download_file) hint: Use --verbose for detailed error logs
30drive +listread输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `drive +list` 并比较 stdout/stderr。tools/call2106d98117840997968627612e087b[UNCLASSIFIED] parentId 不属于指定的 spaceId,请确认 parentId 和 spaceId 属于同一个钉盘空间。 hint: Use --verbose for detailed error logs
31minutes +action-itemsread缺妙记 fixture测试数据准备当前账号可见的真实妙记/听记/录制会话,或把 runner 的搜索关键词改成必然能命中的会议产物。用真实 taskUuid/note/minutes 资源重跑 minutes 命令。--暂无妙记
32minutes +latest-minutesread缺妙记 fixture测试数据准备当前账号可见的真实妙记/听记/录制会话,或把 runner 的搜索关键词改成必然能命中的会议产物。用真实 taskUuid/note/minutes 资源重跑 minutes 命令。--暂无妙记
33minutes +minutes-searchread输入/业务校验测试数据准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。造数后重跑,预期从 validation empty result 变为成功。--没搜到妙记
34minutes +transcriptread缺妙记 fixture测试数据准备当前账号可见的真实妙记/听记/录制会话,或把 runner 的搜索关键词改成必然能命中的会议产物。用真实 taskUuid/note/minutes 资源重跑 minutes 命令。--暂无妙记
35oa +done-approvalsread输入/业务校验测试数据准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。造数后重跑,预期从 validation empty result 变为成功。--没有已处理的审批记录
36oa +pendingread输入/业务校验测试数据准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。造数后重跑,预期从 validation empty result 变为成功。--当前没有待我审批的任务
37report +report-latestread输入/业务校验测试数据准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。造数后重跑,预期从 validation empty result 变为成功。--暂无日志
38todo +due-todayread输入/业务校验测试数据准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。造数后重跑,预期从 validation empty result 变为成功。--今天没有到期的待办
39todo +related-tasksread输入/业务校验测试数据准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。造数后重跑,预期从 validation empty result 变为成功。--没有与你相关的待办(creator/executor/participant 三种角色下均为空)
40wiki +node-listread输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call2132f5ca17840998189126304e08d9[UNCLASSIFIED] business error: success=false hint: Use --verbose for detailed error logs
41wiki +resolve-spaceread输入/业务校验测试数据准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。造数后重跑,预期从 validation empty result 变为成功。--没有找到名称包含 DWS shortcut 真实测试 的知识空间
42wiki +space-listread输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `wiki +space-list` 并比较 stdout/stderr。--参数 --type 取值 "ALL" 不合法,允许值:orgWikiSpace, myWikiSpace
+ + +

Write 失败逐项 · 114 条

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#命令风险类型要改哪里具体改法验证方式operationtrace_id证据
1aitable +advperm-disablehigh-risk-write鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `aitable +advperm-disable`;若仍是 permission,再看 trace_id。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to set adv…
2aitable +advperm-enablewrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `aitable +advperm-enable`;若仍是 permission,再看 trace_id。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to set adv…
3aitable +attachment-uploadwrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"BASE_NOT_FOUND","message":"Specified base does not exist, has been deleted, or is inaccessible","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":t…
4aitable +base-copywrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":null,"message":"Invalid source baseId: DWSREALTESTNOSUCHID0000000000000","retryable":null,"type":"USER_ERROR"},"meta":{},"status":"error","success":true,"summary":"Invalid sou…
5aitable +base-deletehigh-risk-write缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `aitable +base-delete`。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"52600003","message":"Data not found","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to delete base DWSREALTESTNOSUCHID000…
6aitable +base-updatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"BASE_NOT_FOUND","message":"Specified base does not exist, has been deleted, or is inaccessible","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":t…
7aitable +chart-deletehigh-risk-write缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to delete …
8aitable +chart-share-updatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update …
9aitable +chart-updatewrite后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"config is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update chart because con…
10aitable +dashboard-arrangewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to align d…
11aitable +dashboard-deletehigh-risk-write缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to delete …
12aitable +dashboard-share-updatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update …
13aitable +dashboard-updatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update …
14aitable +field-deletehigh-risk-write后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"getDentryDTO returns null","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to get current field info befor…
15aitable +field-updatewrite后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"getDentryDTO returns null","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to get current field info for u…
16aitable +form-deletehigh-risk-write缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to delete …
17aitable +form-field-hidewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update …
18aitable +form-field-updatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update …
19aitable +form-share-updatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update …
20aitable +form-updatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update …
21aitable +import-datawrite缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `aitable +import-data`。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_IMPORT_ID","message":"importId not found: either invalid or expired","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"impo…
22aitable +import-uploadwrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"无法解析 baseId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"无效的 baseId","trace_id":"0bab027317840998…
23aitable +record-deletehigh-risk-write后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"getDentryDTO returns null","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to delete records","trace_id":"…
24aitable +record-primary-doc-createwrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"RESOLVE_DOC_ID_ERROR","message":"Failed to resolve docId from baseId","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to c…
25aitable +record-updatewrite后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_RECORDS","message":"records must contain at least one writable record","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Fa…
26aitable +record-upsertwrite后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMETER","message":"records is required and must not be empty","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"records …
27aitable +role-createwrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to create …
28aitable +role-deletehigh-risk-write后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"roleId is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to delete role because role…
29aitable +role-updatewrite后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"roleId is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to patch role because roleI…
30aitable +section-createwrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to create …
31aitable +section-deletehigh-risk-write缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to delete …
32aitable +section-move-nodewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to move no…
33aitable +section-renamewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to rename …
34aitable +section-reorderwrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to reorder…
35aitable +table-deletehigh-risk-write缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"BASE_NOT_FOUND","message":"Specified base does not exist, has been deleted, or is inaccessible","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":t…
36aitable +table-updatewrite后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"404","message":"getDentryDTO returns null","retryable":true,"type":"SYSTEM_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update table DWSREALTESTNOSU…
37aitable +view-deletehigh-risk-write缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to delete …
38aitable +view-duplicatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to duplica…
39aitable +view-lockwrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to lock_or…
40aitable +view-set-fill-color-rulewrite后端/MCP后端/MCP schema修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_PARAMS","message":"conditionalFormats is required","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to set fill col…
41aitable +view-set-frozen-colswrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to set fro…
42aitable +view-set-row-heightwrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to set cel…
43aitable +view-updatewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"INVALID_BASE_ID","message":"baseId cannot be resolved to docId","retryable":false,"type":"INPUT_ERROR"},"meta":{},"status":"error","success":true,"summary":"Failed to update …
44aitable +workflow-disablehigh-risk-write缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"BASE_NOT_FOUND","message":"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid","retryable":false,"type":"INPUT_ERROR"},"meta":{},"sta…
45aitable +workflow-enablewrite缺 AI 表格 fixture测试数据准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。--[MCP_TOOL_ERROR] {"data":{},"error":{"code":"BASE_NOT_FOUND","message":"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid","retryable":false,"type":"INPUT_ERROR"},"meta":{},"sta…
46attendance +boss-checkwrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call213ee25c17840998998942184e087d[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/boss_check) hint: Use --verbose for detailed error logs
47attendance +create-classwrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call0bab027317840999009926838e090b[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_class_setting) hint: Use --verbose for detailed error logs
48attendance +create-groupwrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call2106d98117840999021121258e08b8[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_group_setting) hint: Use --verbose for detailed error logs
49attendance +import-schedulewrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call2104a64c17840999034845189e085e[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/generateTurnSchedule) hint: Use --verbose for detailed error logs
50attendance +save-leave-balancewrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `attendance +save-leave-balance`;若仍是 permission,再看 trace_id。tools/call2127d89817840999045751134e079c[UNCLASSIFIED] 无权更新指定员工的假期余额 (operation: attendance-wukong/update_leave_balance) hint: Use --verbose for detailed error logs
51attendance +update-classwrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call0b5deb3217840999058236471e08b5[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_class_setting) hint: Use --verbose for detailed error logs
52attendance +update-groupwrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call0b5deb3217840999068826691e087a[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_setting) hint: Use --verbose for detailed error logs
53attendance +update-group-memberswrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call2127d89817840999081094644e07dd[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_member) hint: Use --verbose for detailed error logs
54attendance +update-leave-typewrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `attendance +update-leave-type`;若仍是 permission,再看 trace_id。tools/call0bb7c36217840999093924897e07fe[RESOURCE_NOT_FOUND] Requested resource not found (operation: attendance-wukong/save_leave_type) hint: Check if the resource exists or if your account has permission
55calendar +respond-eventwrite缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `calendar +respond-event`。tools/call0bb7c36217840999105062121e07db[UNCLASSIFIED] code: 300000, developerMessage: Event does not exist. (operation: calendar/respond) hint: Use --verbose for detailed error logs
56chat +category-add-conversationwrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `chat +category-add-conversation`;若仍是 permission,再看 trace_id。tools/call0b5deb3217840999117776203e08f9[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/add_conv_to_categories) hint: Check if the resource exists or if your account has permission
57chat +category-remove-conversationwrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `chat +category-remove-conversation`;若仍是 permission,再看 trace_id。tools/call2104a64c17840999130466520e085e[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/remove_conv_from_categories) hint: Check if the resource exists or if your account has permission
58chat +chat-add-botwrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `chat +chat-add-bot`;若仍是 permission,再看 trace_id。tools/call2104a64c17840999144193460e08c7[RESOURCE_NOT_FOUND] Requested resource not found (operation: bot/add_robot_to_group) hint: Check if the resource exists or if your account has permission
59chat +chat-audit-joinwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call0bb7c36217840999154832733e0758[UNCLASSIFIED] applicantUid is required (operation: im/audit_join_group) hint: Use --verbose for detailed error logs
60chat +chat-mute-memberwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2104a64c17840999166036583e08a3[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_group_member_mute_list) hint: Use --verbose for detailed error logs
61chat +chat-quitwrite输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `chat +chat-quit` 并比较 stdout/stderr。tools/call0bb7c36217840999176728426e0779[UNCLASSIFIED] listBaseConversationByIds error (operation: im/quit_group) hint: Use --verbose for detailed error logs
62chat +chat-remove-bothigh-risk-write缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `chat +chat-remove-bot`。tools/call0b5deb3217840999189888305e08b5[UNCLASSIFIED] 无效的会话 (operation: bot/remove_robot_in_group) hint: Use --verbose for detailed error logs
63chat +chat-role-removehigh-risk-write输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `chat +chat-role-remove` 并比较 stdout/stderr。tools/call2127d89817840999200483204e079c[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_group_role) hint: Use --verbose for detailed error logs
64chat +chat-role-remove-userwrite输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `chat +chat-role-remove-user` 并比较 stdout/stderr。tools/call2127d89817840999211317952e0757[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_user_roles) hint: Use --verbose for detailed error logs
65chat +chat-transfer-ownerwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call0b5deb3217840999222318863e087a[UNCLASSIFIED] openConversationId is required (operation: im/transfer_group_owner) hint: Use --verbose for detailed error logs
66chat +chat-update-iconwrite输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `chat +chat-update-icon` 并比较 stdout/stderr。tools/call2104a64c17840999232478654e0819[UNCLASSIFIED] listBaseConversationByIds error (operation: im/update_group_icon) hint: Use --verbose for detailed error logs
67chat +chat-update-settingswrite输入/业务校验测试输入/shortcut 枚举把测试输入的 setting-key 从 x 改为后端支持的 key;同时可在 shortcut flag 上补 enum,避免用户传非法 key。改 runner 后重跑;如果补 enum,跑 shortcut 单测确认校验文案。tools/call2127d89817840999244326971e07dd[UNCLASSIFIED] unsupported setting key: x (operation: im/update_group_settings) hint: Use --verbose for detailed error logs
68chat +conversation-clear-messageshigh-risk-write后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2127d89817840999254816721e079b[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_messages) hint: Use --verbose for detailed error logs
69chat +conversation-clear-red-pointwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2104a64c17840999265511295e085f[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_red_point) hint: Use --verbose for detailed error logs
70chat +conversation-hidewrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2127d89817840999276117140e079b[UNCLASSIFIED] openConversationId or cid is required (operation: im/hide_conversation) hint: Use --verbose for detailed error logs
71chat +conversation-mark-readwrite缺真实资源测试数据替换为当前账号真实可访问的群/会话 openConversationId;如果用真实群仍报“无效”,再查 IM 后端解析。先用 `chat +my-groups` 或群搜索拿真实会话 ID,再重跑。tools/call2127d89817840999287654280e07bd[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/mark_message_read) hint: Use --verbose for detailed error logs
72chat +conversation-mark-unreadwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call0bb7c36217840999298744910e0758[UNCLASSIFIED] openConversationId or cid is required (operation: im/mark_conversation_unread) hint: Use --verbose for detailed error logs
73chat +conversation-mutewrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2104a64c17840999309241865e085f[UNCLASSIFIED] openConversationId is required (operation: im/update_notification_off) hint: Use --verbose for detailed error logs
74chat +conversation-mute-at-allwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2127d89817840999320028068e07dd[UNCLASSIFIED] openConversationId is required (operation: im/update_at_all_notification_off) hint: Use --verbose for detailed error logs
75chat +conversation-mute-red-envelopewrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call0bb7c36217840999330228283e07fe[UNCLASSIFIED] openConversationId is required (operation: im/update_red_env_notification_off) hint: Use --verbose for detailed error logs
76chat +conversation-set-topwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2127d89817840999341302961e07fe[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_top_conversation) hint: Use --verbose for detailed error logs
77chat +messages-add-emojiwrite缺真实资源测试数据替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。tools/call2127d89817840999352941910e0756[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_emoji_reaction) hint: Use --verbose for detailed error logs
78chat +messages-add-text-emotionwrite缺真实资源测试数据替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。tools/call0b5deb3217840999362862711e08b5[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_text_emotion) hint: Use --verbose for detailed error logs
79chat +messages-batch-recall-by-botwrite缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `chat +messages-batch-recall-by-bot`。tools/call2104a64c17840999373456305e0817[UNCLASSIFIED] business error: success=false (operation: bot/batch_recall_robot_users_msg) hint: Use --verbose for detailed error logs
80chat +messages-batch-send-by-botwrite缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `chat +messages-batch-send-by-bot`。tools/call0bb7c36217840999385748776e0757[UNCLASSIFIED] business error: success=false (operation: bot/batch_send_robot_msg_to_users) hint: Use --verbose for detailed error logs
81chat +messages-combine-forwardwrite缺真实资源测试数据替换为当前账号真实可访问的群/会话 openConversationId;如果用真实群仍报“无效”,再查 IM 后端解析。先用 `chat +my-groups` 或群搜索拿真实会话 ID,再重跑。tools/call2104a64c17840999396596163e08ee[UNCLASSIFIED] srcOpenCid无效,无法解析为cid (operation: im/combine_forward_messages) hint: Use --verbose for detailed error logs
82chat +messages-create-text-emotionwrite输入/业务校验测试输入/业务规则换成后端支持的文字表情组合,或把该命令保留为业务负向;CLI 不应绕过后端限制。用一个真实可保存的表情模板重跑。tools/call0b5deb3217840999407422891e08cd[UNCLASSIFIED] 暂不支持保存该文字表情 (operation: im/create_text_emotion) hint: Use --verbose for detailed error logs
83chat +messages-forwardwrite缺真实资源测试数据替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。tools/call2104a64c17840999417966407e08ee[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_message) hint: Use --verbose for detailed error logs
84chat +messages-forward-topicwrite缺真实资源测试数据替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。tools/call2127d89817840999428541474e07dd[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_topic) hint: Use --verbose for detailed error logs
85chat +messages-recallwrite缺真实资源测试数据替换为当前账号真实可访问的群/会话 openConversationId;如果用真实群仍报“无效”,再查 IM 后端解析。先用 `chat +my-groups` 或群搜索拿真实会话 ID,再重跑。tools/call2104a64c17840999441138103e08c7[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/recall_message) hint: Use --verbose for detailed error logs
86chat +messages-recall-by-botwrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call2104a64c17840999454382709e08a3[UNCLASSIFIED] business error: success=false (operation: bot/recall_robot_group_message) hint: Use --verbose for detailed error logs
87chat +messages-remove-emojiwrite缺真实资源测试数据替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。tools/call0b5deb3217840999467733059e08f9[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_emoji_reaction) hint: Use --verbose for detailed error logs
88chat +messages-remove-text-emotionwrite缺真实资源测试数据替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。tools/call0b5deb3217840999478923406e087f[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_text_emotion) hint: Use --verbose for detailed error logs
89chat +messages-send-by-botwrite缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `chat +messages-send-by-bot`。tools/call0b5deb3217840999494005921e08ef[UNCLASSIFIED] business error: success=false (operation: bot/send_robot_group_message) hint: Use --verbose for detailed error logs
90chat +messages-send-cardwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2104a64c17840999509255753e081a[UNCLASSIFIED] receiverUid和openConversationId不能同时为空 (operation: im/create_and_send_card) hint: Use --verbose for detailed error logs
91chat +messages-set-pinwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call0bb7c36217840999521117991e0758[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_pin_message) hint: Use --verbose for detailed error logs
92chat +messages-set-topwrite缺真实资源测试数据替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。tools/call2104a64c17840999532438476e0817[UNCLASSIFIED] openMessageId解密失败 (operation: im/set_top_message) hint: Use --verbose for detailed error logs
93chat +messages-unset-pinwrite后端/MCP后端/MCP schemaCLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。tools/call2104a64c17840999544428103e08ee[UNCLASSIFIED] openConversationId or cid is required (operation: im/unset_pin_message) hint: Use --verbose for detailed error logs
94chat +messages-unset-topwrite缺真实资源测试数据替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。tools/call0b5deb3217840999554154221e08f9[UNCLASSIFIED] openMessageId解密失败 (operation: im/unset_top_message) hint: Use --verbose for detailed error logs
95devapp +event-subscribewrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `devapp +event-subscribe`;若仍是 permission,再看 trace_id。tools/call2104a64c17840999564022020e08c7[UNCLASSIFIED] 当前用户没有应用事件订阅权限 (operation: devapp/subscribe_dev_app_events) hint: Use --verbose for detailed error logs
96devapp +event-unsubscribehigh-risk-write鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `devapp +event-unsubscribe`;若仍是 permission,再看 trace_id。tools/call0bb7c36217840999575698500e07db[UNCLASSIFIED] business error: success=false (operation: devapp/unsubscribe_dev_app_events) hint: Use --verbose for detailed error logs
97devapp +permission-addwrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `devapp +permission-add`;若仍是 permission,再看 trace_id。tools/call2127d89817840999587758457e079c[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/apply_dev_app_permissions) hint: Use --verbose for detailed error logs
98devapp +permission-removehigh-risk-write鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `devapp +permission-remove`;若仍是 permission,再看 trace_id。tools/call2104a64c17840999598445247e085e[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/remove_dev_app_permissions) hint: Use --verbose for detailed error logs
99devapp +robot-configwrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `devapp +robot-config`;若仍是 permission,再看 trace_id。tools/call0bb7c36217840999609828961e07db[UNCLASSIFIED] business error: success=false (operation: devapp/set_extension_robot_config) hint: Use --verbose for detailed error logs
100devapp +robot-disablehigh-risk-write鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `devapp +robot-disable`;若仍是 permission,再看 trace_id。tools/call2104a64c17840999620461113e08ee[UNCLASSIFIED] business error: success=false (operation: devapp/disable_dev_app_robot) hint: Use --verbose for detailed error logs
101devapp +robot-enablewrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `devapp +robot-enable`;若仍是 permission,再看 trace_id。tools/call0bb7c36217840999632641525e0758[UNCLASSIFIED] business error: success=false (operation: devapp/enable_dev_app_robot) hint: Use --verbose for detailed error logs
102devapp +security-configwrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `devapp +security-config`;若仍是 permission,再看 trace_id。tools/call2104a64c17840999645522046e0817[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/update_dev_app_security_config) hint: Use --verbose for detailed error logs
103devapp +version-createwrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call0b5deb3217840999656705920e0853[UNCLASSIFIED] business error: success=false (operation: devapp/create_dev_app_version) hint: Use --verbose for detailed error logs
104devapp +version-publishwrite输入/业务校验后端业务/测试 fixture后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。tools/call2127d89817840999667906017e075d[UNCLASSIFIED] business error: success=false (operation: devapp/publish_dev_app_version) hint: Use --verbose for detailed error logs
105ding +send-by-messagewrite输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `ding +send-by-message` 并比较 stdout/stderr。tools/call0b5deb3217840999678466213e0853[UNCLASSIFIED] remindType非法,合法值:APP/SMS/PHONE (operation: im/send_ding_by_message) hint: Use --verbose for detailed error logs
106doc +comment-create-inlinewrite缺真实资源测试数据替换为真实文档/节点 ID;文档评论、分享、版本等命令需要资源存在且账号可访问。用真实 doc/node 重跑;若仍失败再看 doc/doc-comment 工具字段。tools/call2127d89817840999689931893e079c[TABLE_NOT_FOUND] Requested resource not found (operation: doc-comment/create_inline_comment) hint: Document may have been deleted or moved
107doc +template-applywrite鉴权/权限权限/应用配置给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。补权限后重跑 `doc +template-apply`;若仍是 permission,再看 trace_id。tools/call2127d89817840999701186954e0757[RESOURCE_NOT_FOUND] Requested resource not found (operation: doc/apply_doc_template) hint: Check if the resource exists or if your account has permission
108minutes +record-pausewrite输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `minutes +record-pause` 并比较 stdout/stderr。tools/call0bb7c36217840999713124987e0757[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音) hint: Use --verbose for detailed error logs
109minutes +record-resumewrite输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `minutes +record-resume` 并比较 stdout/stderr。tools/call0bb7c36217840999724452848e0758[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音) hint: Use --verbose for detailed error logs
110minutes +record-stopwrite输入/业务校验测试输入/业务校验当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。重跑 `minutes +record-stop` 并比较 stdout/stderr。tools/call2127d89817840999735397508e0757[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音) hint: Use --verbose for detailed error logs
111oa +approve-bywrite缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `oa +approve-by`。--没找到待审批单据:待我处理的审批里没有标题/单号包含 "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_20260715-151724__" 的单据。
112wiki +node-copywrite缺真实资源测试数据替换为真实文档/节点 ID;文档评论、分享、版本等命令需要资源存在且账号可访问。用真实 doc/node 重跑;若仍失败再看 doc/doc-comment 工具字段。tools/call0bb7c36217840999769818495e0779[TABLE_NOT_FOUND] Requested resource not found (operation: doc/copy_document) hint: Document may have been deleted or moved
113wiki +node-movewrite缺真实资源测试数据替换为真实文档/节点 ID;文档评论、分享、版本等命令需要资源存在且账号可访问。用真实 doc/node 重跑;若仍失败再看 doc/doc-comment 工具字段。tools/call0bb7c36217840999780286509e07fe[TABLE_NOT_FOUND] Requested resource not found (operation: doc/move_document) hint: Document may have been deleted or moved
114wiki +wiki-new-docwrite缺真实资源测试数据把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。准备 fixture 后重跑 `wiki +wiki-new-doc`。--没找到名为 "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__" 的知识库;换个更完整/精确的空间名再试。
+ +
+ + diff --git a/docs/shortcut-next-release-hidden.json b/docs/shortcut-next-release-hidden.json new file mode 100644 index 00000000..4fe2b780 --- /dev/null +++ b/docs/shortcut-next-release-hidden.json @@ -0,0 +1,1722 @@ +{ + "generated_at": "2026-07-15T16:44:43.822237", + "count": 156, + "results": [ + { + "suite": "read", + "service": "aitable", + "command": "+base-get-primary-doc-id", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"-1\",\"message\":\"no record\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to query cell doc for record 1015oH3OXy in table…" + }, + { + "suite": "read", + "service": "aitable", + "command": "+chart-share-get", + "risk": "read", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"403\",\"message\":\"Forbidden\",\"retryable\":false,\"type\":\"AUTH_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get chart share config for chart widget-dlxFo…" + }, + { + "suite": "read", + "service": "aitable", + "command": "+dashboard-share-get", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"Not Found\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get dashboard share config for dashboard KY9…" + }, + { + "suite": "read", + "service": "aitable", + "command": "+export-data", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"taskId cannot be combined with scope, format, tableId or viewId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,…" + }, + { + "suite": "read", + "service": "aitable", + "command": "+record-primary-doc-get", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"-1\",\"message\":\"no record\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to query cell doc for record 1015oH3OXy in table…" + }, + { + "suite": "read", + "service": "aitable", + "command": "+role-get", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get role because roleId …" + }, + { + "suite": "read", + "service": "aitable", + "command": "+workflow-get", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"GET_WORKFLOW_ERROR\",\"message\":\"调用远程服务业务异常\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get workflow in base 'gpG2Nd…" + }, + { + "suite": "read", + "service": "aitable", + "command": "+workflow-list", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"LIST_WORKFLOWS_ERROR\",\"message\":\"biz error\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to list workflows in base 'gpG…" + }, + { + "suite": "read", + "service": "attendance", + "command": "+get-class", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_class_detail) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "attendance", + "command": "+get-global-setting", + "risk": "read", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/query_global_setting) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "attendance", + "command": "+get-group", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_detail) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "attendance", + "command": "+get-group-filtered", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_filtered_detail) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "attendance", + "command": "+get-leave-balance", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] 亲,假期类型没有余额 (operation: attendance-wukong/get_leave_balance_quota) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "attendance", + "command": "+list-report-columns", + "risk": "read", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_report_columns) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "attendance", + "command": "+query-report-leave", + "risk": "read", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_leave_time_by_leave_names) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "calendar", + "command": "+find-room", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。 hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "calendar", + "command": "+room-find", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。 (operation: calendar/query_available_meeting_room) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "chat", + "command": "+category-list-conversations", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] listConversationsByCategoryV2 error hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "chat", + "command": "+chat-get-by-id", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] verifyGroupId error: The group id does not exit (operation: im/get_conv_info_by_group_id) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "chat", + "command": "+chat-members-get", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openCid or cid is required (operation: im/list_group_member_by_ids) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "chat", + "command": "+chat-messages", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openCid or cid is required hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "chat", + "command": "+messages-list", + "risk": "read", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openCid or cid is required hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "chat", + "command": "+messages-resource-url", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] failed to get download url for resourceId: x (operation: im/get_resource_download_url) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "chat", + "command": "+search-msg", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] 当前用户暂无消息搜索权益,无法执行本次搜索。请提示用户开通消息搜索权益后重试。 hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "chat", + "command": "+thread-replies", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] failed to decrypt openConvThreadId hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "contact", + "command": "+get-roster", + "risk": "read", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/get_authorized_emp_rosterInfo) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "contact", + "command": "+list-roster-fields", + "risk": "read", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/list_authorized_roster_fields) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "devapp", + "command": "+credentials-get", + "risk": "read", + "status": "held", + "failure_category": "held", + "fixability": "manual-approval", + "diagnosis": "高风险或无安全目标,需人工逐项授权后执行。", + "evidence": "该命令会读取真实应用凭证/密钥;不能用真实 app 自动执行。当前仅用占位 ID 验证负向路径,真实成功需人工在安全环境单独确认。" + }, + { + "suite": "read", + "service": "drive", + "command": "+download", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] 该文件类型不支持通过 download_file 下载。download_file 仅支持普通文件(如 PDF、Word、Excel 等),不支持钉钉在线文档/表格/脑图等在线编辑类型。如需导出在线文档内容,请使用钉钉文档导出相关接口。 (operation: drive/download_file) hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "drive", + "command": "+list", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] parentId 不属于指定的 spaceId,请确认 parentId 和 spaceId 属于同一个钉盘空间。 hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "minutes", + "command": "+action-items", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-minutes-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。", + "evidence": "暂无妙记" + }, + { + "suite": "read", + "service": "minutes", + "command": "+latest-minutes", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-minutes-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。", + "evidence": "暂无妙记" + }, + { + "suite": "read", + "service": "minutes", + "command": "+minutes-search", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "没搜到妙记" + }, + { + "suite": "read", + "service": "minutes", + "command": "+transcript", + "risk": "read", + "status": "real-error", + "failure_category": "missing-real-minutes-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。", + "evidence": "暂无妙记" + }, + { + "suite": "read", + "service": "oa", + "command": "+done-approvals", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "没有已处理的审批记录" + }, + { + "suite": "read", + "service": "oa", + "command": "+pending", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "当前没有待我审批的任务" + }, + { + "suite": "read", + "service": "report", + "command": "+report-latest", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "暂无日志" + }, + { + "suite": "read", + "service": "todo", + "command": "+due-today", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "今天没有到期的待办" + }, + { + "suite": "read", + "service": "todo", + "command": "+related-tasks", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "没有与你相关的待办(creator/executor/participant 三种角色下均为空)" + }, + { + "suite": "read", + "service": "wiki", + "command": "+node-list", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false hint: Use --verbose for detailed error logs" + }, + { + "suite": "read", + "service": "wiki", + "command": "+resolve-space", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "没有找到名称包含 DWS shortcut 真实测试 的知识空间" + }, + { + "suite": "read", + "service": "wiki", + "command": "+space-list", + "risk": "read", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "参数 --type 取值 \"ALL\" 不合法,允许值:orgWikiSpace, myWikiSpace" + }, + { + "suite": "write", + "service": "aitable", + "command": "+advperm-disable", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set adv…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+advperm-enable", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set adv…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+attachment-upload", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":t…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+base-copy", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":null,\"message\":\"Invalid source baseId: DWSREALTESTNOSUCHID0000000000000\",\"retryable\":null,\"type\":\"USER_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Invalid sou…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+base-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"52600003\",\"message\":\"Data not found\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete base DWSREALTESTNOSUCHID000…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+base-update", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":t…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+chart-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+chart-share-update", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+chart-update", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"config is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update chart because con…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+dashboard-arrange", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to align d…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+dashboard-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+dashboard-share-update", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+dashboard-update", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+field-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get current field info befor…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+field-update", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to get current field info for u…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+form-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+form-field-hide", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+form-field-update", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+form-share-update", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+form-update", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+import-data", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_IMPORT_ID\",\"message\":\"importId not found: either invalid or expired\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"impo…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+import-upload", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"无法解析 baseId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"无效的 baseId\",\"trace_id\":\"0bab027317840998…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+record-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete records\",\"trace_id\":\"…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+record-primary-doc-create", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"RESOLVE_DOC_ID_ERROR\",\"message\":\"Failed to resolve docId from baseId\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to c…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+record-update", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_RECORDS\",\"message\":\"records must contain at least one writable record\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Fa…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+record-upsert", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMETER\",\"message\":\"records is required and must not be empty\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"records …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+role-create", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to create …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+role-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete role because role…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+role-update", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"roleId is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to patch role because roleI…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+section-create", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to create …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+section-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+section-move-node", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to move no…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+section-rename", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to rename …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+section-reorder", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to reorder…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+table-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Specified base does not exist, has been deleted, or is inaccessible\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":t…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+table-update", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"404\",\"message\":\"getDentryDTO returns null\",\"retryable\":true,\"type\":\"SYSTEM_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update table DWSREALTESTNOSU…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+view-delete", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to delete …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+view-duplicate", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to duplica…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+view-lock", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to lock_or…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+view-set-fill-color-rule", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_PARAMS\",\"message\":\"conditionalFormats is required\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set fill col…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+view-set-frozen-cols", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set fro…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+view-set-row-height", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to set cel…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+view-update", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"INVALID_BASE_ID\",\"message\":\"baseId cannot be resolved to docId\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"status\":\"error\",\"success\":true,\"summary\":\"Failed to update …" + }, + { + "suite": "write", + "service": "aitable", + "command": "+workflow-disable", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"sta…" + }, + { + "suite": "write", + "service": "aitable", + "command": "+workflow-enable", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + "evidence": "[MCP_TOOL_ERROR] {\"data\":{},\"error\":{\"code\":\"BASE_NOT_FOUND\",\"message\":\"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid\",\"retryable\":false,\"type\":\"INPUT_ERROR\"},\"meta\":{},\"sta…" + }, + { + "suite": "write", + "service": "attendance", + "command": "+boss-check", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/boss_check) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "attendance", + "command": "+create-class", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_class_setting) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "attendance", + "command": "+create-group", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_group_setting) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "attendance", + "command": "+import-schedule", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/generateTurnSchedule) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "attendance", + "command": "+save-leave-balance", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] 无权更新指定员工的假期余额 (operation: attendance-wukong/update_leave_balance) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "attendance", + "command": "+update-class", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_class_setting) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "attendance", + "command": "+update-group", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_setting) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "attendance", + "command": "+update-group-members", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_member) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "attendance", + "command": "+update-leave-type", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: attendance-wukong/save_leave_type) hint: Check if the resource exists or if your account has permission" + }, + { + "suite": "write", + "service": "calendar", + "command": "+respond-event", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] code: 300000, developerMessage: Event does not exist. (operation: calendar/respond) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+category-add-conversation", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/add_conv_to_categories) hint: Check if the resource exists or if your account has permission" + }, + { + "suite": "write", + "service": "chat", + "command": "+category-remove-conversation", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/remove_conv_from_categories) hint: Check if the resource exists or if your account has permission" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-add-bot", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: bot/add_robot_to_group) hint: Check if the resource exists or if your account has permission" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-audit-join", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "dry-run 已证明 CLI 装配了 applicantUid/inviterUid;真实后端仍报 applicantUid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] applicantUid is required (operation: im/audit_join_group) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-mute-member", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_group_member_mute_list) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-quit", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/quit_group) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-remove-bot", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] 无效的会话 (operation: bot/remove_robot_in_group) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-role-remove", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_group_role) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-role-remove-user", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_user_roles) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-transfer-owner", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId is required (operation: im/transfer_group_owner) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-update-icon", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] listBaseConversationByIds error (operation: im/update_group_icon) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+chat-update-settings", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] unsupported setting key: x (operation: im/update_group_settings) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-clear-messages", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_messages) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-clear-red-point", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_red_point) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-hide", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/hide_conversation) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-mark-read", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/mark_message_read) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-mark-unread", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/mark_conversation_unread) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-mute", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId is required (operation: im/update_notification_off) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-mute-at-all", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId is required (operation: im/update_at_all_notification_off) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-mute-red-envelope", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId is required (operation: im/update_red_env_notification_off) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+conversation-set-top", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_top_conversation) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-add-emoji", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_emoji_reaction) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-add-text-emotion", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_text_emotion) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-batch-recall-by-bot", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: bot/batch_recall_robot_users_msg) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-batch-send-by-bot", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: bot/batch_send_robot_msg_to_users) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-combine-forward", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] srcOpenCid无效,无法解析为cid (operation: im/combine_forward_messages) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-create-text-emotion", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] 暂不支持保存该文字表情 (operation: im/create_text_emotion) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-forward", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-forward-topic", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_topic) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-recall", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/recall_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-recall-by-bot", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: bot/recall_robot_group_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-remove-emoji", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_emoji_reaction) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-remove-text-emotion", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_text_emotion) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-send-by-bot", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: bot/send_robot_group_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-send-card", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "dry-run 已证明 CLI 装配了 receiverUid;真实后端仍报 receiverUid/openConversationId 为空,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] receiverUid和openConversationId不能同时为空 (operation: im/create_and_send_card) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-set-pin", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_pin_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-set-top", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/set_top_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-unset-pin", + "risk": "write", + "status": "real-error", + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + "evidence": "[UNCLASSIFIED] openConversationId or cid is required (operation: im/unset_pin_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "chat", + "command": "+messages-unset-top", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[UNCLASSIFIED] openMessageId解密失败 (operation: im/unset_top_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+event-subscribe", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] 当前用户没有应用事件订阅权限 (operation: devapp/subscribe_dev_app_events) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+event-unsubscribe", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: devapp/unsubscribe_dev_app_events) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+permission-add", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/apply_dev_app_permissions) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+permission-remove", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/remove_dev_app_permissions) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+robot-config", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: devapp/set_extension_robot_config) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+robot-disable", + "risk": "high-risk-write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: devapp/disable_dev_app_robot) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+robot-enable", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: devapp/enable_dev_app_robot) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+security-config", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/update_dev_app_security_config) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+version-create", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: devapp/create_dev_app_version) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "devapp", + "command": "+version-publish", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] business error: success=false (operation: devapp/publish_dev_app_version) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "ding", + "command": "+send-by-message", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] remindType非法,合法值:APP/SMS/PHONE (operation: im/send_ding_by_message) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "doc", + "command": "+comment-create-inline", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc-comment/create_inline_comment) hint: Document may have been deleted or moved" + }, + { + "suite": "write", + "service": "doc", + "command": "+template-apply", + "risk": "write", + "status": "real-error", + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + "evidence": "[RESOURCE_NOT_FOUND] Requested resource not found (operation: doc/apply_doc_template) hint: Check if the resource exists or if your account has permission" + }, + { + "suite": "write", + "service": "minutes", + "command": "+record-pause", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "minutes", + "command": "+record-resume", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "minutes", + "command": "+record-stop", + "risk": "write", + "status": "real-error", + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + "evidence": "[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音) hint: Use --verbose for detailed error logs" + }, + { + "suite": "write", + "service": "oa", + "command": "+approve-by", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "没找到待审批单据:待我处理的审批里没有标题/单号包含 \"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_20260715-151724__\" 的单据。" + }, + { + "suite": "write", + "service": "wiki", + "command": "+node-copy", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc/copy_document) hint: Document may have been deleted or moved" + }, + { + "suite": "write", + "service": "wiki", + "command": "+node-move", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "[TABLE_NOT_FOUND] Requested resource not found (operation: doc/move_document) hint: Document may have been deleted or moved" + }, + { + "suite": "write", + "service": "wiki", + "command": "+wiki-new-doc", + "risk": "write", + "status": "real-error", + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + "evidence": "没找到名为 \"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__\" 的知识库;换个更完整/精确的空间名再试。" + } + ] +} \ No newline at end of file diff --git a/docs/shortcut-next-release-hidden.md b/docs/shortcut-next-release-hidden.md new file mode 100644 index 00000000..ac85e762 --- /dev/null +++ b/docs/shortcut-next-release-hidden.md @@ -0,0 +1,168 @@ +# 本期隐藏、下期修复的 shortcut 清单 + +生成时间:`2026-07-15T16:44:43` + +来源:`docs/shortcut-real-read-results.json` 与 `docs/shortcut-real-write-results.json`。 + +口径:最新真实后端测试结果不是 `real-ok` 的 shortcut,本期不对外 release;代码保留,并通过 `internal/shortcut/release_hidden_generated.go` 标记为 Hidden,后续补 fixture / 修后端 / 修 CLI 后再放开。 + +总计:156 条。 + +| # | suite | shortcut | risk | status | category | fixability | 下期处理依据 | +|---:|---|---|---|---|---|---|---| +| 1 | read | `aitable +base-get-primary-doc-id` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 2 | read | `aitable +chart-share-get` | read | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 3 | read | `aitable +dashboard-share-get` | read | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 4 | read | `aitable +export-data` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 5 | read | `aitable +record-primary-doc-get` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 6 | read | `aitable +role-get` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 7 | read | `aitable +workflow-get` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 8 | read | `aitable +workflow-list` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 9 | read | `attendance +get-class` | read | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 10 | read | `attendance +get-global-setting` | read | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 11 | read | `attendance +get-group` | read | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 12 | read | `attendance +get-group-filtered` | read | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 13 | read | `attendance +get-leave-balance` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 14 | read | `attendance +list-report-columns` | read | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 15 | read | `attendance +query-report-leave` | read | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 16 | read | `calendar +find-room` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 17 | read | `calendar +room-find` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 18 | read | `chat +category-list-conversations` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 19 | read | `chat +chat-get-by-id` | read | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 20 | read | `chat +chat-members-get` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 21 | read | `chat +chat-messages` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 22 | read | `chat +messages-list` | read | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 23 | read | `chat +messages-resource-url` | read | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 24 | read | `chat +search-msg` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 25 | read | `chat +thread-replies` | read | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 26 | read | `contact +get-roster` | read | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 27 | read | `contact +list-roster-fields` | read | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 28 | read | `devapp +credentials-get` | read | held | held | manual-approval | 高风险或无安全目标,需人工逐项授权后执行。 | +| 29 | read | `drive +download` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 30 | read | `drive +list` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 31 | read | `minutes +action-items` | read | real-error | missing-real-minutes-fixture | not-cli-fixable-without-fixture | 当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。 | +| 32 | read | `minutes +latest-minutes` | read | real-error | missing-real-minutes-fixture | not-cli-fixable-without-fixture | 当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。 | +| 33 | read | `minutes +minutes-search` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 34 | read | `minutes +transcript` | read | real-error | missing-real-minutes-fixture | not-cli-fixable-without-fixture | 当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。 | +| 35 | read | `oa +done-approvals` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 36 | read | `oa +pending` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 37 | read | `report +report-latest` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 38 | read | `todo +due-today` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 39 | read | `todo +related-tasks` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 40 | read | `wiki +node-list` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 41 | read | `wiki +resolve-space` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 42 | read | `wiki +space-list` | read | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 43 | write | `aitable +advperm-disable` | high-risk-write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 44 | write | `aitable +advperm-enable` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 45 | write | `aitable +attachment-upload` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 46 | write | `aitable +base-copy` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 47 | write | `aitable +base-delete` | high-risk-write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 48 | write | `aitable +base-update` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 49 | write | `aitable +chart-delete` | high-risk-write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 50 | write | `aitable +chart-share-update` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 51 | write | `aitable +chart-update` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 52 | write | `aitable +dashboard-arrange` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 53 | write | `aitable +dashboard-delete` | high-risk-write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 54 | write | `aitable +dashboard-share-update` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 55 | write | `aitable +dashboard-update` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 56 | write | `aitable +field-delete` | high-risk-write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 57 | write | `aitable +field-update` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 58 | write | `aitable +form-delete` | high-risk-write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 59 | write | `aitable +form-field-hide` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 60 | write | `aitable +form-field-update` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 61 | write | `aitable +form-share-update` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 62 | write | `aitable +form-update` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 63 | write | `aitable +import-data` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 64 | write | `aitable +import-upload` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 65 | write | `aitable +record-delete` | high-risk-write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 66 | write | `aitable +record-primary-doc-create` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 67 | write | `aitable +record-update` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 68 | write | `aitable +record-upsert` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 69 | write | `aitable +role-create` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 70 | write | `aitable +role-delete` | high-risk-write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 71 | write | `aitable +role-update` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 72 | write | `aitable +section-create` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 73 | write | `aitable +section-delete` | high-risk-write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 74 | write | `aitable +section-move-node` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 75 | write | `aitable +section-rename` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 76 | write | `aitable +section-reorder` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 77 | write | `aitable +table-delete` | high-risk-write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 78 | write | `aitable +table-update` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 79 | write | `aitable +view-delete` | high-risk-write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 80 | write | `aitable +view-duplicate` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 81 | write | `aitable +view-lock` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 82 | write | `aitable +view-set-fill-color-rule` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | 后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。 | +| 83 | write | `aitable +view-set-frozen-cols` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 84 | write | `aitable +view-set-row-height` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 85 | write | `aitable +view-update` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 86 | write | `aitable +workflow-disable` | high-risk-write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 87 | write | `aitable +workflow-enable` | write | real-error | missing-real-aitable-fixture | not-cli-fixable-without-fixture | AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。 | +| 88 | write | `attendance +boss-check` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 89 | write | `attendance +create-class` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 90 | write | `attendance +create-group` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 91 | write | `attendance +import-schedule` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 92 | write | `attendance +save-leave-balance` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 93 | write | `attendance +update-class` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 94 | write | `attendance +update-group` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 95 | write | `attendance +update-group-members` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 96 | write | `attendance +update-leave-type` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 97 | write | `calendar +respond-event` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 98 | write | `chat +category-add-conversation` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 99 | write | `chat +category-remove-conversation` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 100 | write | `chat +chat-add-bot` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 101 | write | `chat +chat-audit-join` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | dry-run 已证明 CLI 装配了 applicantUid/inviterUid;真实后端仍报 applicantUid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 102 | write | `chat +chat-mute-member` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 103 | write | `chat +chat-quit` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 104 | write | `chat +chat-remove-bot` | high-risk-write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 105 | write | `chat +chat-role-remove` | high-risk-write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 106 | write | `chat +chat-role-remove-user` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 107 | write | `chat +chat-transfer-owner` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 108 | write | `chat +chat-update-icon` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 109 | write | `chat +chat-update-settings` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 110 | write | `chat +conversation-clear-messages` | high-risk-write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 111 | write | `chat +conversation-clear-red-point` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 112 | write | `chat +conversation-hide` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 113 | write | `chat +conversation-mark-read` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 114 | write | `chat +conversation-mark-unread` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 115 | write | `chat +conversation-mute` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 116 | write | `chat +conversation-mute-at-all` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 117 | write | `chat +conversation-mute-red-envelope` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 118 | write | `chat +conversation-set-top` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 119 | write | `chat +messages-add-emoji` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 120 | write | `chat +messages-add-text-emotion` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 121 | write | `chat +messages-batch-recall-by-bot` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 122 | write | `chat +messages-batch-send-by-bot` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 123 | write | `chat +messages-combine-forward` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 124 | write | `chat +messages-create-text-emotion` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 125 | write | `chat +messages-forward` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 126 | write | `chat +messages-forward-topic` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 127 | write | `chat +messages-recall` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 128 | write | `chat +messages-recall-by-bot` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 129 | write | `chat +messages-remove-emoji` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 130 | write | `chat +messages-remove-text-emotion` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 131 | write | `chat +messages-send-by-bot` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 132 | write | `chat +messages-send-card` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | dry-run 已证明 CLI 装配了 receiverUid;真实后端仍报 receiverUid/openConversationId 为空,优先按 MCP schema/服务端字段映射问题处理。 | +| 133 | write | `chat +messages-set-pin` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 134 | write | `chat +messages-set-top` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 135 | write | `chat +messages-unset-pin` | write | real-error | backend-or-mcp-error | not-cli-fixable-first | fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。 | +| 136 | write | `chat +messages-unset-top` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 137 | write | `devapp +event-subscribe` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 138 | write | `devapp +event-unsubscribe` | high-risk-write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 139 | write | `devapp +permission-add` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 140 | write | `devapp +permission-remove` | high-risk-write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 141 | write | `devapp +robot-config` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 142 | write | `devapp +robot-disable` | high-risk-write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 143 | write | `devapp +robot-enable` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 144 | write | `devapp +security-config` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 145 | write | `devapp +version-create` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 146 | write | `devapp +version-publish` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 147 | write | `ding +send-by-message` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 148 | write | `doc +comment-create-inline` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 149 | write | `doc +template-apply` | write | real-error | auth-or-permission | not-cli-fixable | 真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。 | +| 150 | write | `minutes +record-pause` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 151 | write | `minutes +record-resume` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 152 | write | `minutes +record-stop` | write | real-error | input-or-business-validation | test-input-or-backend-rule | 命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。 | +| 153 | write | `oa +approve-by` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 154 | write | `wiki +node-copy` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 155 | write | `wiki +node-move` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | +| 156 | write | `wiki +wiki-new-doc` | write | real-error | missing-real-resource | not-cli-fixable-without-fixture | 真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。 | diff --git a/docs/shortcut-real-read-results.json b/docs/shortcut-real-read-results.json new file mode 100644 index 00000000..78bc5f82 --- /dev/null +++ b/docs/shortcut-real-read-results.json @@ -0,0 +1,4974 @@ +{ + "generated_at": "2026-07-15T16:13:24.234893", + "summary": { + "total": 204, + "ok": 162, + "error": 41, + "timeout": 0, + "held": 1 + }, + "failure_categories": { + "input-or-business-validation": 16, + "backend-or-mcp-error": 9, + "missing-real-resource": 7, + "auth-or-permission": 6, + "missing-real-minutes-fixture": 3, + "held": 1 + }, + "results": [ + { + "service": "aitable", + "command": "+base-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +base-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json", + "args": [ + "aitable", + "+base-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"baseName\": \"Real共创版设备去向登记\",\n \"dashboards\": [\n {\n \"chartCount\": 8,\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\",\n \"dashboardName\": \"仪表盘\",\n \"meta\": {}\n }\n ],\n \"documents\": [],\n \"tables\": [\n {\n \"tableId\": \"hERWDMS\",\n \"tableName\": \"Mac Mini\"\n },\n {\n \"tableId\": \"k8d898q\",\n \"tableName\": \"手机\"\n },\n {\n \"tableId\": \"zyLRwwa\",\n \"tableName\": \"SIM卡\"\n },\n {\n \"tableId\": \"L53jNZz\",\n \"tableName\": \"机箱\"\n },\n {\n \"tableId\": \"zTiHNDL\",\n \"tableName\": \"磁吸片\"\n },\n {\n \"tableId\": \"anMdihs\",\n \"tableName\": \"手机线\"\n }\n ]\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Got base 'Real共创版设备去向登记' with 6 table(s). URL rules: AI 表格访问地址: https://docs.dingtalk.com/i/nodes/{baseId}; AI 表格数据表访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}; AI 表格仪表盘访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{dashboardId}; AI 表格说明文档地址: https://pre-alidocs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{documentId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1773 + }, + { + "service": "aitable", + "command": "+base-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +base-list --limit 10 --cursor 0 --yes --format json", + "args": [ + "aitable", + "+base-list", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"bases\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1289 + }, + { + "service": "aitable", + "command": "+base-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +base-search --query '测试' --cursor 0 --yes --format json", + "args": [ + "aitable", + "+base-search", + "--query", + "测试", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"bases\": [\n {\n \"baseId\": \"yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-27 21:27:03\"\n },\n {\n \"baseId\": \"3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm\",\n \"baseName\": \"文件扫描测试 -20260414\"\n },\n {\n \"baseId\": \"QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N\",\n \"baseName\": \"文件扫描测试(25)\"\n },\n {\n \"baseId\": \"Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq\",\n \"baseName\": \"文件扫描测试(5)\"\n },\n {\n \"baseId\": \"OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4\",\n \"baseName\": \"文件扫描测试(24)\"\n },\n {\n \"baseId\": \"OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4\",\n \"baseName\": \"文件扫描测试(22)\"\n },\n {\n \"baseId\": \"l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4\",\n \"baseName\": \"文件扫描测试(26)(2)\"\n },\n {\n \"baseId\": \"MyQA2dXW7oOA63Yac5lMpzxkWzlwrZgb\",\n \"baseName\": \"文件扫描测试\"\n },\n {\n \"baseId\": \"9E05BDRVQePjzLkZtyX1L6vmV63zgkYA\",\n \"baseName\": \"工作目录文件扫描测试\"\n },\n {\n \"baseId\": \"y20BglGWOGQgpOj6u0GaqL3EWA7depqY\",\n \"baseName\": \"case-0055-数据导入测试\"\n },\n {\n \"baseId\": \"14dA3GK8gkP4oNl0cKqRz7jy89ekBD76\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-22 19:41:26\"\n },\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSGLpk7EdJMwvDqPk\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-22 18:41:20\"\n },\n {\n \"baseId\": \"7dx2rn0Jbakrq9O5t2GbL30XVMGjLRb3\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-22 16:33:50\"\n },\n {\n \"baseId\": \"OG9lyrgJPL7M2ONQSzPgGxwvJzN67Mw4\",\n \"baseName\": \"case-0052-临时测试\"\n },\n {\n \"baseId\": \"wva2dxOW4kO6dpRac0jppNE58bkz3BRL\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-21 22:11:30\"\n },\n {\n \"baseId\": \"0eMKjyp81MrAdNmPu4NvYXAE8xAZB1Gv\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-20 21:24:44\"\n },\n {\n \"baseId\": \"dxXB52LJqwZrolvyFMkR2MDPWqjMp697\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-20 16:53:48\"\n },\n {\n \"baseId\": \"bva6QBXJwZenolNyS2Gwg2NxVn4qY5Pr\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-20 15:53:56\"\n },\n {\n \"baseId\": \"bva6QBXJwZenolNyS2G3bNnOVn4qY5Pr\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-20 09:09:21\"\n },\n {\n \"baseId\": \"pYLaezmVNGmDXOMxuGjwevPqJrMqPxX6\",\n \"baseName\": \"🧪测试 工作区目录扫描 - 2026-04-20 08:09:11\"\n }\n ],\n \"count\": 20\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1628 + }, + { + "service": "aitable", + "command": "+chart-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +chart-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --dashboard-id KY9tlWg5NEHgfs8WT6IO2 --chart-id widget-dlxFo0tNSImp4ITpDn5fQ --yes --format json", + "args": [ + "aitable", + "+chart-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--dashboard-id", + "KY9tlWg5NEHgfs8WT6IO2", + "--chart-id", + "widget-dlxFo0tNSImp4ITpDn5fQ", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"widget-dlxFo0tNSImp4ITpDn5fQ\",\n \"chartName\": \"各业务线未部署数\",\n \"chartType\": \"BAR\",\n \"config\": {\n \"axisLabelShow\": false,\n \"categoryAxisMaxRatio\": \"0.3\",\n \"chartType\": \"BAR\",\n \"colors\": \"COLOR_PALETTE_1\",\n \"dimension\": [\n {\n \"value\": \"rjwzzIu\"\n }\n ],\n \"fillType\": \"solid\",\n \"filter\": [],\n \"gridShow\": false,\n \"group\": [\n {\n \"value\": \"none\"\n }\n ],\n \"label\": true,\n \"labelHideOverlap\": true,\n \"legend\": \"top\",\n \"measure\": [\n {\n \"externalValue\": [\n {\n \"type\": \"formula\",\n \"value\": \"count\"\n }\n ],\n \"value\": \"kFwb8br\"\n }\n ],\n \"measureType\": \"field\",\n \"nullValue\": \"ignore\",\n \"sheet\": \"hERWDMS\",\n \"sortRule\": \"asc\",\n \"view\": \"\",\n \"xAbbr\": {\n \"abbr\": \"\",\n \"decimal\": \"\",\n \"numberType\": \"default\"\n },\n \"xAxisLabel\": true,\n \"xAxisLabelRotate\": \"auto\",\n \"xAxisLine\": false,\n \"xAxisShow\": true,\n \"xSortBy\": \"x\",\n \"xSortCustom\": [],\n \"yAbbr\": {\n \"abbr\": \"\",\n \"decimal\": \"\",\n \"numberType\": \"default\"\n },\n \"yAxisLabel\": true,\n \"yAxisLine\": false,\n \"yAxisRange\": {\n \"range\": [],\n \"type\": \"absolute\"\n },\n \"yAxisShow\": true,\n \"yRightAbbr\": {\n \"abbr\": \"\",\n \"decimal\": \"\",\n \"numberType\": \"default\"\n },\n \"ySortCustom\": []\n },\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\",\n \"layout\": {\n \"h\": 5,\n \"i\": \"widget-dlxFo0tNSImp4ITpDn5fQ\",\n \"w\": 6,\n \"x\": 0,\n \"y\": 4\n }\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Got chart widget-dlxFo0tNSImp4ITpDn5fQ\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1038 + }, + { + "service": "aitable", + "command": "+chart-widgets-example", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +chart-widgets-example --yes --format json", + "args": [ + "aitable", + "+chart-widgets-example", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": \"// 注意\\n// 1. 下述 JSON 示例中的注释(// 开头的注释)仅用于说明,实际使用时请删除,否则会导致解析错误\\n// 2. 所有图表类型的 widget config 示例,key 是图表类型,value 是对应的完整 config\\n// 3. 创建图表时,必需使用示例中的图表类型和配置格式\\n\\n\\n{\\n// 聚合列表视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"AGGREGATE_LIST_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"AGGREGATE_LIST_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"聚合列表视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 列表自定义配置,用于设置聚合列表的自定义样式和行为\\n \\\"listCustom\\\": {},\\n // 列表配置,用于设置聚合列表的显示方式和布局\\n \\\"listConfig\\\": {},\\n // 字段聚合映射,用于设置字段的聚合方式(如 sum、count、avg 等)\\n \\\"fieldAggregateMap\\\": {},\\n // 工具栏配置,用于控制聚合列表视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示分组按钮\\n \\\"enableGroup\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n },\\n },\\n// AI 分析卡片配置格式,必须按照此格式配置,否则会导致解析错误\\n // 注意:AI 分析卡片不依赖数据表,无需配置 sheet / view / filter\\n \\\"AI_ANALYZE\\\": {\\n // 必填,图表类型,固定值 \\\"AI_ANALYZE\\\"\\n \\\"chartType\\\": \\\"AI_ANALYZE\\\",\\n // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\\n \\\"name\\\": \\\"AI 分析卡片\\\",\\n // 可选,AI 提示词,用自然语言描述希望 AI 分析的内容和问题,\\n // 例如:\\\"分析本月各产品线的销售额趋势,找出增长最快的类别并给出建议\\\"\\n \\\"prompt\\\": \\\"\\\",\\n // 可选,需要 AI 参考分析的图表 ID 列表,数组中每个元素必须是当前仪表盘中已存在的图表 ID;\\n // 不填或传空数组时 AI 将基于提示词独立分析,不关联具体图表数据\\n \\\"analyzeChartIds\\\": [],\\n // 可选,指定 AI 模型 ID;不填时使用系统默认模型\\n \\\"modelId\\\": \\\"\\\",\\n // 只读,AI 生成的 Markdown 分析内容,由系统写入,创建时无需填写\\n \\\"content\\\": \\\"\\\",\\n // 只读,AI 分析结果的最后更新时间戳(毫秒),由系统写入,创建时无需填写\\n \\\"lastUpdatedAt\\\": null\\n },\\n// 面积图配置格式\\n \\\"AREA\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"AREA\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"面积图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_date_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"smooth\\\": false,\\n \\\"symbolType\\\": \\\"always\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"label\\\": false,\\n \\\"xAxisShow\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"filter\\\": []\\n }\\n// 条形图配置格式\\n \\\"BAR\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"BAR\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"条形图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"record-count\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"nullValue\\\": \\\"ignore\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"gridShow\\\": false,\\n \\\"label\\\": true,\\n \\\"labelHideOverlap\\\": true,\\n \\\"xAxisShow\\\": true,\\n \\\"xAxisLine\\\": false,\\n \\\"xAxisLabel\\\": true,\\n \\\"categoryAxisMaxRatio\\\": \\\"0.3\\\",\\n \\\"yAxisShow\\\": true,\\n \\\"yAxisLine\\\": false,\\n \\\"yAxisLabel\\\": true,\\n \\\"fillType\\\": \\\"solid\\\",\\n \\\"filter\\\": []\\n }\\n// 按钮配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"BUTTON\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"BUTTON\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"按钮\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n // 可选,按钮样式类型,合法值有:type1 到 type10,默认为 type1\\n \\\"buttonStyleType\\\": \\\"type1\\\",\\n // 可选,边框宽度,默认为 1\\n \\\"borderWidth\\\": 1,\\n // 可选,按钮大小,合法值有:default(默认)/ small(小)/ large(大),默认为 default\\n \\\"buttonSize\\\": \\\"default\\\",\\n // 可选,按钮图标,合法值有:link / download / refresh 等\\n \\\"buttonIcon\\\": \\\"link\\\",\\n // 可选,按钮图标背景类型,合法值有:light(浅色)/ dark(深色),默认为 light\\n \\\"buttonIconBackgroundType\\\": \\\"light\\\",\\n // 可选,按钮字体配置\\n \\\"buttonFontSetting\\\": {\\n // 字体大小,默认为 14\\n \\\"size\\\": 14,\\n // 字体颜色\\n \\\"color\\\": \\\"\\\",\\n // 字间距,默认为 0\\n \\\"letterSpacing\\\": 0,\\n // 是否加粗,默认为 false\\n \\\"bold\\\": false,\\n // 是否斜体,默认为 false\\n \\\"italic\\\": false,\\n // 是否下划线,默认为 false\\n \\\"underline\\\": false\\n }\\n },\\n// 日历视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"CALENDAR_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"CALENDAR_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"日历视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 视图分组配置,用于设置视图的默认分组规则\\n \\\"viewGroup\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 日历自定义配置,这是日历视图的核心配置\\n \\\"calendarCustom\\\": {\\n // 必填,显示字段 ID(必须是该表中真实存在的字段 ID)\\n // 用于在日历中显示事件标题或描述\\n \\\"displayFieldId\\\": \\\"fld_text_01\\\",\\n // 必填,开始时间字段 ID(必须是该表中真实存在的日期字段 ID)\\n // 用于设置事件的开始时间\\n \\\"startField\\\": \\\"fld_date_01\\\",\\n // 必填,结束时间字段 ID(必须是该表中真实存在的日期字段 ID)\\n // 用于设置事件的结束时间\\n \\\"endField\\\": \\\"fld_date_02\\\",\\n // 标记配置,用于在日历中添加特殊标记或样式\\n \\\"markers\\\": [],\\n // 时间轴刻度,合法值有:day(日)/ week(周)/ month(月)\\n // 用于设置日历的显示粒度\\n \\\"timelineScale\\\": \\\"month\\\",\\n // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\\n \\\"widthMap\\\": {},\\n // 单元格高度,单位为像素,默认为 32\\n \\\"cellHeight\\\": 32\\n },\\n // 工具栏配置,用于控制日历视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示分组按钮\\n \\\"enableGroup\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n // 是否显示编辑记录按钮\\n \\\"enableEditRecord\\\": false\\n },\\n },\\n// 卡片列表视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"CARD_LIST_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"CARD_LIST_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"卡片列表视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 列表自定义配置,用于设置卡片列表的自定义样式和行为\\n \\\"listCustom\\\": {},\\n // 列表配置,用于设置卡片列表的显示方式和布局\\n \\\"listConfig\\\": {},\\n // 工具栏配置,用于控制卡片列表视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n },\\n },\\n// 折叠列表视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"COLLAPSIBLE_LIST_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"COLLAPSIBLE_LIST_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"折叠列表视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 列表自定义配置,用于设置折叠列表的自定义样式和行为\\n \\\"listCustom\\\": {},\\n // 列表配置,用于设置折叠列表的显示方式和布局\\n \\\"listConfig\\\": {},\\n // 工具栏配置,用于控制折叠列表视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示分组按钮\\n \\\"enableGroup\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n },\\n },\\n// 组合布局配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"COMPOSITE_LAYOUT\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"COMPOSITE_LAYOUT\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"组合布局\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\"\\n // 组合布局容器,无特殊配置字段,用于承载其他图表组件\\n },\\n// 组合图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"COMPOSITION\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"COMPOSITION\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"组合图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ],\\n \\\"composition\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"HISTOGRAM\\\",\\n \\\"yAxisPosition\\\": \\\"left\\\"\\n }\\n },\\n {\\n \\\"value\\\": \\\"fld_number_02\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"average\\\"\\n }\\n ],\\n \\\"composition\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"LINE\\\",\\n \\\"yAxisPosition\\\": \\\"right\\\"\\n }\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_date_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"gridShow\\\": false,\\n \\\"label\\\": true,\\n \\\"xAxisShow\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"filter\\\": []\\n },\\n// ═══════════════════════════════════════════════════════════════════\\n // 图表类型:倒计时(COUNTDOWN)\\n // 别名/同义词:倒计时、正计时、计时器、倒计时卡片\\n // 用途:用于展示距离某个目标日期的剩余时间或已过时间,\\n // 支持倒计时和正计时两种模式。适合展示活动截止时间、\\n // 项目里程碑、重要日期提醒等场景。\\n // ═══════════════════════════════════════════════════════════════════\\n // ⚠️ 重要注意事项:\\n // 1. fixedDatetime 必须是毫秒时间戳(如 1746028800000),不是日期字符串(如 \\\"2026-05-01\\\")!\\n // 2. unit 是一个对象(Object),不是字符串!不要写成 \\\"天\\\" 或 \\\"day\\\"!\\n // 3. 背景色字段名是 \\\"background\\\",不是 \\\"backgroundColor\\\"\\n // 4. 时间数字颜色字段名是 \\\"timeColor\\\",不是 \\\"numberColor\\\"\\n // 5. 描述文字颜色字段名是 \\\"descColor\\\",不是 \\\"titleColor\\\"\\n // 6. 不存在 \\\"countdownType\\\"、\\\"endDate\\\"、\\\"numberColor\\\"、\\\"titleColor\\\" 等字段,使用这些字段会导致图表渲染异常\\n \\\"COUNTDOWN\\\": {\\n // 必填,图表类型,固定值 \\\"COUNTDOWN\\\"\\n \\\"chartType\\\": \\\"COUNTDOWN\\\",\\n // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\\n \\\"name\\\": \\\"倒计时\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": null,\\n // 可选,描述文本,显示在倒计时数字上方\\n \\\"desc\\\": \\\"倒计时\\\",\\n // 必填,数据来源类型,合法值:fixed(固定日期时间)/ field(从数据表日期字段取值)\\n \\\"sourceType\\\": \\\"fixed\\\",\\n // sourceType = \\\"fixed\\\" 时必填,目标日期的毫秒时间戳\\n // ⚠️ 必须是毫秒时间戳数字(如 1746028800000),不是日期字符串(如 \\\"2026-05-01\\\")!\\n // 示例:2026-05-01 00:00:00 → 1746028800000\\n \\\"fixedDatetime\\\": 1746028800000,\\n // sourceType = \\\"field\\\" 时填写,日期字段的 fieldId\\n \\\"fieldId\\\": null,\\n // sourceType = \\\"field\\\" 时填写,日期选择方式,合法值:earliest(最早日期)/ latest(最晚日期)\\n \\\"fieldChoice\\\": \\\"earliest\\\",\\n // 必填,计时模式,合法值:countdown(倒计时,目标时间在未来)/ countup(正计时,目标时间在过去)\\n \\\"timingMode\\\": \\\"countdown\\\",\\n // 必填,显示的时间单位开关(是一个对象,不是字符串!)\\n // ⚠️ 不要写成 \\\"天\\\" 或 \\\"day\\\",必须是如下对象格式:\\n \\\"unit\\\": {\\n // 是否显示月,默认 false\\n \\\"month\\\": false,\\n // 是否显示周,默认 false\\n \\\"week\\\": false,\\n // 是否显示天,默认 true\\n \\\"day\\\": true,\\n // 是否显示小时,默认 true\\n \\\"hour\\\": true,\\n // 是否显示分钟,默认 true\\n \\\"minute\\\": true,\\n // 是否显示秒,默认 true\\n \\\"second\\\": true\\n },\\n\\n // ── 样式配置 ──────────────────────────────────────────────────────────────\\n // 可选,卡片背景颜色(⚠️ 字段名是 \\\"background\\\",不是 \\\"backgroundColor\\\")\\n \\\"background\\\": \\\"\\\",\\n // 可选,描述文字颜色(⚠️ 字段名是 \\\"descColor\\\",不是 \\\"titleColor\\\")\\n \\\"descColor\\\": \\\"\\\",\\n // 可选,时间块背景颜色\\n \\\"timeBlockColor\\\": \\\"\\\",\\n // 可选,倒计时数字颜色(⚠️ 字段名是 \\\"timeColor\\\",不是 \\\"numberColor\\\")\\n \\\"timeColor\\\": \\\"\\\",\\n // 可选,计时完成是否显示动效,默认 false\\n \\\"showFinishEffect\\\": false\\n },\\n// 详情列表视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"DETAIL_LIST_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"DETAIL_LIST_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"详情列表视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 列表自定义配置,用于设置详情列表的自定义样式和行为\\n \\\"listCustom\\\": {},\\n // 列表配置,用于设置详情列表的显示方式和布局\\n \\\"listConfig\\\": {},\\n // 工具栏配置,用于控制详情列表视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n },\\n },\\n// 嵌入网页配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"EMBED_WEBPAGE\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"EMBED_WEBPAGE\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"嵌入网页\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n // 必填,嵌入的网页 URL(必须是有效的 URL 地址)\\n \\\"url\\\": \\\"https://example.com\\\"\\n },\\n// 漏斗图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"FUNNEL\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"FUNNEL\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"漏斗图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"record-count\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\"\\n }\\n ],\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"sumValue\\\": true,\\n \\\"funnelType\\\": \\\"normal\\\",\\n \\\"filter\\\": []\\n },\\n// 画册视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"GALLERY_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"GALLERY_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"画册视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 画册自定义配置,用于设置画册的显示样式\\n \\\"galleryCustom\\\": {\\n // 卡片设置,用于配置画册中卡片的显示方式\\n \\\"cardSetting\\\": {\\n // 封面模式,合法值有:none(无封面)/ cover(封面)等\\n \\\"coverMode\\\": \\\"none\\\"\\n }\\n },\\n // 工具栏配置,用于控制画册视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n // 是否显示编辑记录按钮\\n \\\"enableEditRecord\\\": false\\n },\\n },\\n// 甘特视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"GANTT_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"GANTT_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"甘特视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 视图分组配置,用于设置视图的默认分组规则\\n \\\"viewGroup\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 是否折叠网格,默认为 false\\n \\\"collapsedGrid\\\": false,\\n // 甘特自定义配置,这是甘特视图的核心配置\\n \\\"ganttCustom\\\": {\\n // 必填,显示字段 ID(必须是该表中真实存在的字段 ID)\\n // 用于在甘特图中显示任务名称或描述\\n \\\"displayFieldId\\\": \\\"fld_text_01\\\",\\n // 必填,开始时间字段 ID(必须是该表中真实存在的日期字段 ID)\\n // 用于设置任务的开始时间\\n \\\"startField\\\": \\\"fld_date_01\\\",\\n // 必填,结束时间字段 ID(必须是该表中真实存在的日期字段 ID)\\n // 用于设置任务的结束时间\\n \\\"endField\\\": \\\"fld_date_02\\\",\\n // 标记配置,用于在甘特图中添加里程碑或重要时间点\\n \\\"markers\\\": [],\\n // 时间轴刻度,合法值有:day(日)/ week(周)/ month(月)/ quarter(季)/ year(年)\\n // 用于设置甘特图的时间轴显示粒度\\n \\\"timelineScale\\\": \\\"month\\\",\\n // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\\n \\\"widthMap\\\": {},\\n // 单元格高度,单位为像素,默认为 32\\n \\\"cellHeight\\\": 32\\n },\\n // 工具栏配置,用于控制甘特视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示分组按钮\\n \\\"enableGroup\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n // 是否显示编辑记录按钮\\n \\\"enableEditRecord\\\": false\\n },\\n },\\n// 表格视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"GRID_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"GRID_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"表格视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 视图分组配置,用于设置视图的默认分组规则\\n \\\"viewGroup\\\": [],\\n // 单元格高度,单位为像素,默认为 32\\n \\\"cellHeight\\\": 32,\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列宽度映射,key 为 fieldId,value 为列宽度(像素)\\n \\\"widthMap\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 冻结列数,默认为 1,表示冻结左侧的列数\\n \\\"frozenColCount\\\": 1,\\n // 工具栏配置,用于控制表格视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示分组按钮\\n \\\"enableGroup\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 创建行按钮的文本内容\\n \\\"createRowText\\\": \\\"\\\",\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n // 是否显示编辑记录按钮\\n \\\"enableEditRecord\\\": false\\n },\\n },\\n// ═══════════════════════════════════════════════════════════════════\\n // 图表类型:柱状图(HISTOGRAM)\\n // 别名/同义词:竖向柱图、垂直柱图、分组柱图\\n // 用途:以垂直柱子展示多个分类维度的数值对比,适合比较不同类别之间的\\n // 数量差异,如各月销售额对比、各部门人数对比、各产品销量排名等。\\n // 核心特征:有 X 轴(分类维度)和 Y 轴(数值),每个类别对应一根柱子。\\n // 与\\\"统计数字(SUMMARY)\\\"的关键区别:\\n // - 柱状图(HISTOGRAM):展示多个分类的对比,有坐标轴,是\\\"多值图表\\\"\\n // - 统计数字(SUMMARY):只展示一个聚合数字,无坐标轴,是\\\"单值卡片\\\"\\n // 重要:当用户说\\\"柱状图\\\"、\\\"柱图\\\"、\\\"分组柱图\\\"时,\\n // 必须使用 chartType = \\\"HISTOGRAM\\\",不要使用 SUMMARY 或其他图表类型。\\n // ═══════════════════════════════════════════════════════════════════\\n \\\"HISTOGRAM\\\": {\\n // 必填,图表类型,固定值 \\\"HISTOGRAM\\\"(柱状图)\\n \\\"chartType\\\": \\\"HISTOGRAM\\\",\\n // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\\n \\\"name\\\": \\\"柱状图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"record-count\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"group\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_02\\\"\\n }\\n ],\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"xSortCustom\\\": [],\\n \\\"ySortCustom\\\": [],\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"nullValue\\\": \\\"ignore\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"gridShow\\\": false,\\n \\\"axisLabelShow\\\": false,\\n \\\"label\\\": true,\\n \\\"labelHideOverlap\\\": true,\\n \\\"xAxisShow\\\": true,\\n \\\"xAxisLine\\\": false,\\n \\\"xAxisLabel\\\": true,\\n \\\"xAxisLabelRotate\\\": \\\"auto\\\",\\n \\\"categoryAxisMaxRatio\\\": \\\"0.2\\\",\\n \\\"yAxisShow\\\": true,\\n \\\"yAxisLine\\\": false,\\n \\\"yAxisLabel\\\": true,\\n \\\"fillType\\\": \\\"solid\\\",\\n \\\"yAxisRange\\\": {\\n \\\"type\\\": \\\"absolute\\\",\\n \\\"range\\\": []\\n },\\n \\\"xAbbr\\\": {\\n \\\"numberType\\\": \\\"default\\\",\\n \\\"abbr\\\": \\\"\\\",\\n \\\"decimal\\\": \\\"\\\"\\n },\\n \\\"yAbbr\\\": {\\n \\\"numberType\\\": \\\"default\\\",\\n \\\"abbr\\\": \\\"\\\",\\n \\\"decimal\\\": \\\"\\\"\\n },\\n \\\"yRightAbbr\\\": {\\n \\\"numberType\\\": \\\"default\\\",\\n \\\"abbr\\\": \\\"\\\",\\n \\\"decimal\\\": \\\"\\\"\\n },\\n \\\"filter\\\": []\\n }\\n// ═══════════════════════════════════════════════════════════════════\\n // 图表类型:图片(IMAGE)\\n // 别名/同义词:图片卡、图片展示、图片轮播、Banner 图\\n // 用途:在仪表盘中展示一张或多张静态图片,支持多图轮播(滑动/淡入淡出),\\n // 可为每张图片配置标题、描述和点击跳转链接。适合展示品牌 Banner、\\n // 产品图、说明图、装饰图等不依赖数据表的纯图片内容。\\n // 重要:当用户说\\\"图片\\\"、\\\"图片卡\\\"、\\\"图片展示\\\"、\\\"Banner\\\"、\\\"轮播图\\\"时,\\n // 必须使用 chartType = \\\"IMAGE\\\",不要使用其他图表类型。\\n // 此图表类型不依赖数据表,无需配置 sheet / view / filter。\\n // ═══════════════════════════════════════════════════════════════════\\n \\\"IMAGE\\\": {\\n // 必填,图表类型,固定值 \\\"IMAGE\\\"(图片)\\n \\\"chartType\\\": \\\"IMAGE\\\",\\n // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\\n \\\"name\\\": \\\"图片\\\",\\n // 必填,图片列表,至少包含一张图片;多张图片时支持轮播\\n \\\"img_images\\\": [\\n {\\n // 必填,图片的访问 URL\\n \\\"url\\\": \\\"https://example.com/image.png\\\",\\n // 可选,图片标题,显示在图片上方(需 img_showImgText=true)\\n \\\"title\\\": \\\"\\\",\\n // 可选,图片描述,显示在标题下方(需 img_showImgText=true)\\n \\\"desc\\\": \\\"\\\",\\n // 可选,点击图片后跳转的链接 URL\\n \\\"toUrl\\\": \\\"\\\",\\n // 必填,图片填充模式,合法值:cover(裁剪铺满)/ contain(等比缩放留白)/ fill(拉伸铺满)\\n \\\"fillMode\\\": \\\"cover\\\"\\n }\\n ],\\n // 可选,是否在图片上显示标题和描述文字,默认 true;\\n // 设为 false 时 img_titleStyle / img_descStyle / img_textAlign 均不生效\\n \\\"img_showImgText\\\": true,\\n // 可选,图片文字的对齐位置,合法值:\\n // leftTop / top / rightTop / left / center / right / leftBottom / bottom / rightBottom\\n \\\"img_textAlign\\\": \\\"center\\\",\\n // 可选,图片标题的字体样式(仅 img_showImgText=true 时生效)\\n \\\"img_titleStyle\\\": {\\n // 字体大小(px),合法范围 16~56,步长 4\\n \\\"size\\\": 16,\\n // 字体颜色,十六进制色值,如 \\\"#FFFFFF\\\"\\n \\\"color\\\": \\\"\\\",\\n // 是否加粗\\n \\\"bold\\\": true,\\n // 是否斜体\\n \\\"italic\\\": false,\\n // 是否下划线\\n \\\"underline\\\": false\\n },\\n // 可选,图片描述的字体样式(仅 img_showImgText=true 时生效)\\n \\\"img_descStyle\\\": {\\n // 字体大小(px),合法范围 16~56,步长 4\\n \\\"size\\\": 14,\\n // 字体颜色,十六进制色值\\n \\\"color\\\": \\\"\\\",\\n // 是否加粗\\n \\\"bold\\\": false,\\n // 是否斜体\\n \\\"italic\\\": false,\\n // 是否下划线\\n \\\"underline\\\": false\\n },\\n // 可选,多图时是否自动轮播,默认 false;单张图片时此配置无效\\n \\\"img_autoPlay\\\": false,\\n // 可选,多图轮播切换动效,合法值:slide(滑动)/ fade(淡入淡出),默认 slide;单张图片时无效\\n \\\"img_imgTransitionType\\\": \\\"slide\\\",\\n // 可选,多图自动轮播间隔(秒),合法范围 0.1~1000,默认 1;仅 img_autoPlay=true 时生效\\n \\\"img_imgTransitionInterval\\\": 1\\n },\\n// 看板视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"KANBAN_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"KANBAN_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"看板视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 看板自定义配置,这是看板视图的核心配置\\n \\\"kanbanCustom\\\": {\\n // 分组基础配置,用于设置看板的分组字段\\n \\\"groupBase\\\": {\\n // 必填,分组字段 ID(必须是该表中真实存在的字段 ID)\\n // 看板将按照此字段的值进行分组显示\\n \\\"baseFieldId\\\": \\\"fld_select_01\\\"\\n }\\n },\\n // 工具栏配置,用于控制看板视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n // 是否显示编辑记录按钮\\n \\\"enableEditRecord\\\": false\\n },\\n },\\n// 排行榜配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"LEADERBOARD\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"LEADERBOARD\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"排行榜\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"record-count\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_text_01\\\"\\n }\\n ],\\n \\\"showType\\\": \\\"podium\\\", // 展示类型:podium 领奖台/list 列表\\n \\\"showCount\\\": 10, // 显示条数\\n \\\"hideValue\\\": false,\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"filter\\\": []\\n },\\n// 折线图配置格式\\n \\\"LINE\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"LINE\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"折线图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_date_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"nullValue\\\": \\\"ignore\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"gridShow\\\": false,\\n \\\"label\\\": true,\\n \\\"labelHideOverlap\\\": true,\\n \\\"smooth\\\": false,\\n \\\"symbolType\\\": \\\"always\\\",\\n \\\"xAxisShow\\\": true,\\n \\\"xAxisLine\\\": false,\\n \\\"xAxisLabel\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"yAxisLine\\\": false,\\n \\\"yAxisLabel\\\": true,\\n \\\"fillType\\\": \\\"solid\\\",\\n \\\"filter\\\": []\\n }\\n// 抽奖配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"LOTTERY\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"LOTTERY\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"抽奖\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n // 必填,指标类型,合法值有:record-count(记录数)/ field(字段)\\n \\\"measureType\\\": \\\"record-count\\\",\\n // 必填,指标配置数组\\n \\\"measure\\\": [],\\n // 可选,输出表 ID,用于记录中奖结果\\n \\\"outputSheet\\\": \\\"\\\",\\n // 可选,滚动速度,默认为 5\\n \\\"speed\\\": 5,\\n // 可选,字体大小,默认为 20\\n \\\"fontSize\\\": 20,\\n // 可选,颜色主题,合法值有:COLOR_PALETTE_1 到 COLOR_PALETTE_10\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n // 必填,奖项配置数组,每个元素格式为 [数量, 名称]\\n \\\"gameRounds\\\": [\\n [\\n 1,\\n \\\"一等奖\\\"\\n ]\\n ],\\n // 可选,是否包含已中奖者,默认为 false\\n \\\"includeWinners\\\": false\\n },\\n// 跑马灯配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"MARQUEE\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"MARQUEE\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"跑马灯\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n // 可选,滚动文本内容\\n \\\"content\\\": \\\"这是一条滚动消息\\\",\\n // 可选,字体大小,默认为 14\\n \\\"fontSize\\\": 14,\\n // 可选,滚动速度,数值越小速度越快,默认为 50\\n \\\"speed\\\": 50,\\n // 可选,字体配置\\n \\\"fontSetting\\\": {\\n // 字体颜色\\n \\\"color\\\": \\\"\\\",\\n // 是否加粗,默认为 false\\n \\\"bold\\\": false,\\n // 是否斜体,默认为 false\\n \\\"italic\\\": false,\\n // 是否下划线,默认为 false\\n \\\"underline\\\": false\\n }\\n },\\n// NPS评分配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"NPS\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"NPS\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"NPS评分\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\"\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\"\\n }\\n ],\\n \\\"showLabel\\\": true,\\n \\\"showList\\\": false,\\n \\\"threshold\\\": [ // 评分阈值数组\\n 2,\\n 3\\n ],\\n \\\"colorSetName\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"filter\\\": []\\n },\\n// 百分比堆叠面积图配置格式\\n \\\"PERCENT_STACKED_AREA\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"PERCENT_STACKED_AREA\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"百分比堆叠面积图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_date_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"group\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\"\\n }\\n ],\\n \\\"smooth\\\": false,\\n \\\"symbolType\\\": \\\"always\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"label\\\": true,\\n \\\"xAxisShow\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"filter\\\": []\\n }\\n// 百分比堆叠条形图配置格式\\n \\\"PERCENT_STACKED_BAR\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"PERCENT_STACKED_BAR\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"百分比堆叠条形图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"group\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_02\\\"\\n }\\n ],\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"label\\\": true,\\n \\\"xAxisShow\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"categoryAxisMaxRatio\\\": \\\"0.3\\\",\\n \\\"filter\\\": []\\n }\\n// 百分比堆叠柱状图配置格式\\n \\\"PERCENT_STACKED_HISTOGRAM\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"PERCENT_STACKED_HISTOGRAM\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"百分比堆叠柱状图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"group\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_02\\\"\\n }\\n ],\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"label\\\": true,\\n \\\"xAxisShow\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"filter\\\": []\\n }\\n// 饼图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"PIE\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"PIE\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"饼图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\", // 必须使用示例中的默认值如 COLOR_PALETTE_1,禁止自行编造\\n \\\"legend\\\": \\\"none\\\",\\n \\\"label\\\": true, // 必须设为 true 以默认显示数据标签\\n \\\"innerRadius\\\": 0, // 内半径,0 为实心饼图\\n \\\"outerRadius\\\": 60, // 外半径百分比\\n \\\"filter\\\": []\\n },\\n// 透视表配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"PIVOT\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"PIVOT\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"透视表\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 透视表配置,这是透视表的核心配置\\n \\\"pivotConfig\\\": {\\n // 必填,rows 是行字段列表,至少要有一个行字段,\\n // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\\n // 如果多层分组,行字段列表中多个字段的 fieldId 依次对应每层分组的字段 ID\\n \\\"rows\\\": [\\n {\\n // 必填,行字段 ID(必须是该表中真实存在的字段 ID)\\n \\\"fld\\\": \\\"fld_01\\\",\\n // 可选,排序方式,合法值有:1(升序)和 -1(降序),默认为 1 升序\\n \\\"srt\\\": 1\\n }\\n ],\\n // 可选,columns 是列字段列表,默认为空数组,\\n // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\\n // 如果多层分组,列字段列表中多个字段的 fieldId 依次对应每层分组的字段 ID\\n \\\"columns\\\": [\\n {\\n // 必填,列字段 ID(必须是该表中真实存在的字段 ID)\\n \\\"fld\\\": \\\"fld_02\\\",\\n // 可选,排序方式,合法值有:1(升序)和 -1(降序),默认为 1 升序\\n \\\"srt\\\": 1\\n }\\n ],\\n // 必填,values 是值字段列表,至少要有一个值字段,\\n // 每个字段配置中 fieldId 必须是该表中真实存在的字段 ID\\n // 值字段,是用于计算值的字段,通常是数值字段,但也可以是其他类型的字段(如文本字段),具体取决于聚合函数的要求\\n \\\"values\\\": [\\n {\\n // 必填,值字段 ID(必须是该表中真实存在的字段 ID)\\n \\\"fld\\\": \\\"fld_03\\\",\\n //必填,聚合函数,合法值有:sum /count / count_distinct / avg / min / max / median / population_variance / sample_variance / population_stddev / sample_stddev / first / last / range / mode / sum_of_squares / harmonic_mean / geometric_mean / interquartile_range / centered_mean / weighted_mean / kurtosis / skewness / quartile_median / range_median / coefficient_of_variation / adjusted_stddev / weighted_sum / weighted_count / weighted_count_distinct / weighted_avg / centered_weighted_mean / weighted_harmonic_mean / weighted_geometric_mean / weighted_range / weighted_range_median / weighted_interquartile_range / weighted_quartile_median / weighted_centered_mean / weighted_adjusted_stddev\\n \\\"agg\\\": \\\"sum\\\",\\n //可选,后聚合函数,合法值有:default / percent_of_row_total / percent_of_col_total / percent_of_grand_total\\n \\\"pgg\\\": \\\"string\\\",\\n //可选,格式化函数,合法值有:default / percentage / thousands / currency / scientific / fixed / integer\\n \\\"fmt\\\": \\\"\\\",\\n //可选,字段别名\\n \\\"als\\\": \\\"string\\\"\\n }\\n ],\\n // 是否显示行总计,默认为 true\\n \\\"rowTotals\\\": true,\\n // 是否显示列总计,默认为 true\\n \\\"columnTotals\\\": true\\n },\\n \\\"pivotStyle\\\": {\\n // 可选,透视表在卡片中的对齐方式,合法值有: start(上部)/ center(中间)\\n \\\"verticalAlign\\\": \\\"start\\\"\\n }\\n },\\n// 地图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"PLOT_MAP\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"PLOT_MAP\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"地图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 地图配置,这是地图的核心配置\\n \\\"plotMapConfig\\\": {\\n // 数据源配置\\n \\\"source\\\": {\\n // 数据源类型,合法值有:view(视图)\\n \\\"type\\\": \\\"view\\\",\\n // 数据源名称,格式为 \\\"sheetId:viewId\\\"\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"sheet_001:view_001\\\"\\n },\\n // 渲染器类型,合法值有:marker(标记点)/ heatmap(热力图)等\\n // 用于设置地图的渲染方式\\n \\\"renderer\\\": \\\"marker\\\",\\n // 处理器,用于对数据进行预处理\\n \\\"processor\\\": \\\"\\\",\\n // 维度配置,用于设置地图的维度字段(如地理位置字段)\\n \\\"dimensions\\\": [\\n {\\n // 必填,维度字段 ID(必须是该表中真实存在的字段 ID)\\n // 通常为位置字段,用于在地图上定位\\n \\\"fieldId\\\": \\\"fld_location_01\\\"\\n }\\n ],\\n // 度量配置,用于设置地图的度量字段(如数值字段)\\n \\\"measures\\\": [\\n {\\n // 必填,度量字段 ID(必须是该表中真实存在的字段 ID)\\n // 用于在地图上显示数值大小或颜色\\n \\\"fieldId\\\": \\\"fld_number_01\\\"\\n }\\n ],\\n // 样式配置,用于设置地图的显示样式\\n \\\"styles\\\": []\\n },\\n },\\n// ═══════════════════════════════════════════════════════════════════\\n // 图表类型:进度图(PROGRESS)\\n // 别名/同义词:进度条、进度环、进度卡、进度图表\\n // 用途:用于展示某项目标的完成进度,支持当前值 vs 目标值的对比,\\n // 可视化呈现完成百分比。适合展示销售目标达成率、任务完成度、\\n // 日期时间进度等场景。\\n // 重要:当用户说\\\"进度图\\\"、\\\"进度条\\\"、\\\"进度环\\\"、\\\"目标完成度\\\"时,\\n // 必须使用 chartType = \\\"PROGRESS\\\",不要使用其他图表类型。\\n // ═══════════════════════════════════════════════════════════════════\\n //\\n // ⚠️⚠️⚠️ 极其重要的注意事项(不遵守会导致图表渲染报错):\\n //\\n // 1. currentMeasure / targetMeasure 的格式是一个对象(Object),绝对不是数组(Array)!\\n // 不要使用普通图表的 measure 数组格式 [{ externalValue, value }],否则图表会报错!\\n //\\n // 2. 必须包含以下顶层通用字段,否则图表校验会失败并报「表格字段发生变化」错误:\\n // - \\\"measureType\\\": \\\"record-count\\\" ← 必填!缺少此字段图表必定报错\\n // - \\\"sheet\\\": \\\"\\u003csheetId\\u003e\\\" ← 必填!设置为 currentSheet 相同的值\\n // - \\\"view\\\": \\\"\\\" ← 必填!设置为空字符串\\n // - \\\"filter\\\": [] ← 必填!设置为空数组\\n //\\n // 3. currentFilter / targetFilter 中的每个筛选条件必须包含 \\\"link\\\" 字段:\\n // 正确:{ \\\"fieldId\\\": \\\"xxx\\\", \\\"symbol\\\": \\\"EQ\\\", \\\"value\\\": \\\"yyy\\\", \\\"link\\\": \\\"AND\\\" }\\n // 错误:{ \\\"fieldId\\\": \\\"xxx\\\", \\\"symbol\\\": \\\"EQ\\\", \\\"value\\\": \\\"yyy\\\" } ← 缺少 link!\\n // 注意:单选字段的 value 必须是选项的 ID(如 \\\"PO5PWsAqQi\\\"),不能是选项的显示文本(如 \\\"影院观影\\\")!\\n // 使用文本作为 value 会导致筛选条件无法匹配任何记录,当前值始终为 0。\\n //\\n // 4. 即使 targetSource 为 \\\"custom\\\",也必须提供 targetSheet、targetView、targetFilter、targetMeasure 的默认值\\n // 即使 currentSource 为 \\\"custom\\\",也必须提供 currentSheet、currentView、currentFilter、currentMeasure 的默认值\\n //\\n // 5. 必须包含 numberFormat 和 fixedCount 字段,否则当前值/目标值会显示异常(数值被乘以100、出现双%%、文案被挤掉不显示):\\n // - \\\"numberFormat\\\": { \\\"digits\\\": 0, \\\"format\\\": \\\"number\\\", \\\"thousandSeparator\\\": true } ← format 必须是 \\\"number\\\"!\\n // - \\\"fixedCount\\\": 0\\n //\\n \\\"PROGRESS\\\": {\\n // ── 顶层通用字段(必填,缺少会导致图表校验失败)─────────────────────────\\n // 必填,图表类型,固定值 \\\"PROGRESS\\\"(进度图)\\n \\\"chartType\\\": \\\"PROGRESS\\\",\\n // ⚠️ 必填,统计类型,进度图固定为 \\\"record-count\\\"\\n \\\"measureType\\\": \\\"record-count\\\",\\n // ⚠️ 必填,顶层数据表 ID,设置为 currentSheet 相同的值\\n \\\"sheet\\\": \\\"\\u003csheetId\\u003e\\\",\\n // ⚠️ 必填,顶层视图 ID,设置为空字符串\\n \\\"view\\\": \\\"\\\",\\n // ⚠️ 必填,顶层筛选条件,设置为空数组\\n \\\"filter\\\": [],\\n\\n // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\\n \\\"name\\\": \\\"进度图\\\",\\n // 必填,数据类型,合法值:number(数值进度)/ date(日期进度)\\n \\\"dataType\\\": \\\"number\\\",\\n // 必填,图表形状,合法值:bar(条形)/ semi-circle(半环)/ circle(圆环)\\n \\\"progressType\\\": \\\"bar\\\",\\n\\n // ── 目标值配置 ──────────────────────────────────────────────────────────\\n // 目标值来源,合法值:custom(自定义数值)/ sheet(从数据表字段聚合)\\n \\\"targetSource\\\": \\\"custom\\\",\\n // targetSource = \\\"custom\\\" 时填写,目标值的固定数值字符串\\n \\\"target\\\": \\\"500\\\",\\n // 必填,目标值来源的数据表 ID,即使 targetSource = \\\"custom\\\" 也要填写,设置为 currentSheet 相同的值\\n \\\"targetSheet\\\": \\\"\\u003csheetId\\u003e\\\",\\n // 必填,目标值来源的视图 ID,设置为空字符串\\n \\\"targetView\\\": \\\"\\\",\\n // 必填,目标值来源的过滤条件,targetSource = \\\"custom\\\" 时设置为空数组\\n \\\"targetFilter\\\": [],\\n // 必填,目标值聚合字段配置,targetSource = \\\"custom\\\" 时设置为默认值\\n // ⚠️ 格式必须是对象,不是数组!详见下方 currentMeasure 的格式说明,targetMeasure 格式完全相同\\n \\\"targetMeasure\\\": { \\\"type\\\": \\\"record-count\\\", \\\"fields\\\": [] },\\n // 可选,目标值的标签文字,显示在目标值旁边\\n \\\"targetText\\\": \\\"\\\",\\n\\n // ── 当前值配置 ──────────────────────────────────────────────────────────\\n // 当前值来源,合法值:custom(自定义数值)/ sheet(从数据表字段聚合)\\n \\\"currentSource\\\": \\\"custom\\\",\\n // currentSource = \\\"custom\\\" 时填写,当前值的固定数值字符串\\n \\\"current\\\": \\\"100\\\",\\n // 必填,当前值来源的数据表 ID\\n \\\"currentSheet\\\": \\\"\\u003csheetId\\u003e\\\",\\n // 必填,当前值来源的视图 ID,设置为空字符串表示全部数据\\n \\\"currentView\\\": \\\"\\\",\\n // 必填,当前值来源的过滤条件,currentSource = \\\"custom\\\" 时设置为空数组\\n // ⚠️ 每个筛选条件必须包含 \\\"link\\\" 字段!格式:\\n // { \\\"fieldId\\\": \\\"\\u003cfieldId\\u003e\\\", \\\"symbol\\\": \\\"EQ\\\", \\\"value\\\": \\\"\\u003c选项ID\\u003e\\\", \\\"link\\\": \\\"AND\\\" }\\n // 多个条件时,第一个条件的 link 也必须填 \\\"AND\\\"\\n \\\"currentFilter\\\": [],\\n // 必填,当前值聚合字段配置\\n // ═══════════════════════════════════════════════════════════════════\\n // ⚠️⚠️⚠️ 极其重要:currentMeasure 是一个 Object,不是 Array!\\n // 绝对不要写成 [{ externalValue: [...], value: \\\"xxx\\\" }] 这种数组格式!\\n // 正确格式如下:\\n //\\n // 方式一:记录计数(统计满足条件的记录总数)\\n // { \\\"type\\\": \\\"record-count\\\", \\\"fields\\\": [] }\\n //\\n // 方式二:字段聚合(对某个字段做聚合计算)\\n // { \\\"type\\\": \\\"field\\\", \\\"fields\\\": [{ \\\"value\\\": \\\"\\u003cfieldId\\u003e\\\", \\\"formula\\\": \\\"\\u003c聚合函数\\u003e\\\" }] }\\n // formula 合法值:count / unique-count / sum / average / max / min\\n //\\n // 错误示例(绝对禁止):\\n // [{ \\\"externalValue\\\": [{ \\\"type\\\": \\\"formula\\\", \\\"value\\\": \\\"count\\\" }], \\\"value\\\": \\\"fieldId\\\" }]\\n // ═══════════════════════════════════════════════════════════════════\\n \\\"currentMeasure\\\": { \\\"type\\\": \\\"record-count\\\", \\\"fields\\\": [] },\\n // 可选,当前值的标签文字,显示在当前值旁边\\n \\\"currentText\\\": \\\"\\\",\\n\\n // ── 数值格式配置 ──────────────────────────────────────────────────────────\\n // ⚠️ 必填,百分比小数位数,缺少会导致小数位数异常,默认填 0\\n \\\"fixedCount\\\": 0,\\n // ⚠️ 必填,数字格式化配置(作用于当前值和目标值的显示)\\n // 缺少此字段会导致数值显示异常(数值被乘以100、出现双%%符号、文案被挤掉不显示)\\n \\\"numberFormat\\\": {\\n // 小数位数,默认 0\\n \\\"digits\\\": 0,\\n // ⚠️ 格式类型,进度图必须填 \\\"number\\\"!绝对不要填 \\\"percent\\\",否则数值会被乘以100并多出%符号\\n // 合法值:number / percent / thousand,进度图固定填 \\\"number\\\"\\n \\\"format\\\": \\\"number\\\",\\n // 是否显示千位分隔符\\n \\\"thousandSeparator\\\": true\\n },\\n // 可选,数值单位,如 \\\"¥\\\" / \\\"$\\\" / \\\"人\\\" / \\\"%\\\" 等自定义字符串,不填则无单位\\n \\\"modifier\\\": \\\"\\\",\\n // 可选,单位位置,合法值:left(左)/ right(右),默认 left\\n \\\"modifierPosition\\\": \\\"left\\\",\\n // 可选,目标方向,合法值:increase(越大越好)/ decrease(越小越好),影响进度条配色逻辑\\n \\\"targetDirection\\\": \\\"increase\\\",\\n\\n // ── 日期进度(dataType = \\\"date\\\")专属配置 ────────────────────────────────\\n // 目标日期范围,合法值:month(本月)/ quarter(本季度)/ year(今年)/ custom(自定义)\\n \\\"targetDateSelected\\\": \\\"month\\\",\\n // targetDateSelected = \\\"custom\\\" 时填写,自定义目标日期范围 [开始时间戳, 结束时间戳]\\n \\\"targetDateRange\\\": null,\\n // 当前日期,合法值:today(今日)/ yesterday(昨日)/ custom(自定义)\\n \\\"currentDateSelected\\\": \\\"today\\\",\\n // currentDateSelected = \\\"custom\\\" 时填写,自定义当前日期时间戳\\n \\\"currentDate\\\": null,\\n // 日期格式,如 \\\"YYYY-MM-DD\\\",仅在 targetDateSelected 或 currentDateSelected 为 custom 时生效\\n \\\"dateFormat\\\": \\\"YYYY-MM-DD\\\",\\n\\n // ── 样式配置 ──────────────────────────────────────────────────────────────\\n // 可选,卡片背景颜色,十六进制色值,如 \\\"#F0F5FF\\\"\\n \\\"background\\\": \\\"\\\",\\n // 可选,百分比数字颜色,十六进制色值,如 \\\"#1677FF\\\"\\n \\\"percentageColor\\\": \\\"\\\",\\n // 可选,进度条填充颜色,支持两种形式:\\n // 1. 固定色值字符串,如 \\\"#1677FF\\\",或渐变色 \\\"linear-gradient(...)\\\"(圆环图支持渐变)\\n // 2. 条件配色对象(根据百分比区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\\n \\\"strokeColor\\\": \\\"\\\",\\n // 可选,进度条背景颜色\\n \\\"strokeBgColor\\\": \\\"\\\",\\n // 可选,当前值文字颜色(仅 dataType=number 时生效)\\n \\\"currentColor\\\": \\\"\\\",\\n // 可选,目标值文字颜色\\n \\\"targetColor\\\": \\\"\\\"\\n },\\n// 查询页配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"QUERY_PAGE\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"QUERY_PAGE\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"查询页\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"\\\",\\n // 查询页无其他特殊配置字段,\\n // 主要用于提供数据查询和展示的基础功能\\n },\\n// 雷达图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"RADAR\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"RADAR\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"雷达图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"xSortBy\\\": \\\"y\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"radarShape\\\": \\\"circle\\\",\\n \\\"isFilled\\\": true,\\n \\\"gridShow\\\": true,\\n \\\"yAxisLine\\\": true,\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"label\\\": true,\\n \\\"filter\\\": []\\n },\\n// 富文本配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"RICH_TEXT\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"RICH_TEXT\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"富文本\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n // 可选,富文本内容,支持 HTML 格式\\n \\\"content\\\": \\\"\\\"\\n },\\n// 玫瑰图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"ROSE\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"ROSE\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"玫瑰图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"none\\\",\\n \\\"label\\\": true,\\n \\\"innerRadius\\\": 0,\\n \\\"outerRadius\\\": 60,\\n \\\"filter\\\": []\\n },\\n// 散点图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"SCATTER\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"SCATTER\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"散点图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_02\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"smooth\\\": false,\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"gridShow\\\": false,\\n \\\"label\\\": false,\\n \\\"xAxisShow\\\": true,\\n \\\"xAxisLine\\\": false,\\n \\\"xAxisLabel\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"yAxisLine\\\": false,\\n \\\"yAxisLabel\\\": true,\\n \\\"filter\\\": []\\n },\\n// 筛选器配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"SLICER\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"SLICER\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"筛选器\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n // 可选,筛选器样式,合法值有:button(按钮)/ dropdown(下拉),默认为 button\\n \\\"sli_filterStyle\\\": \\\"button\\\",\\n // 可选,排序方式,合法值有:asc(升序)/ desc(降序),默认为 asc\\n \\\"sli_orderBy\\\": \\\"asc\\\",\\n // 可选,是否多选,默认为 true\\n \\\"sli_multiple\\\": true,\\n // 可选,是否显示数量,默认为 true\\n \\\"sli_showCount\\\": true,\\n // 可选,日期操作符,合法值有:BEFORE / AFTER / BETWEEN 等\\n \\\"sli_dateOperator\\\": \\\"BEFORE\\\",\\n // 可选,数字操作符,合法值有:EQ(等于)/ NE(不等于)/ GT(大于)等\\n \\\"sli_numberOperator\\\": \\\"EQ\\\",\\n // 可选,关联到图表的方式,合法值有:auto(自动)/ manual(手动),默认为 auto\\n \\\"sli_2Chart\\\": \\\"auto\\\",\\n // 可选,关联到其他筛选器的方式,合法值有:auto(自动)/ manual(手动),默认为 auto\\n \\\"sli_2Slicer\\\": \\\"auto\\\",\\n // 可选,对齐方式,合法值有:top(顶部)/ bottom(底部),默认为 top\\n \\\"sli_align\\\": \\\"top\\\",\\n // 可选,选择样式,合法值有:1 / 2 / 3 等,默认为 1\\n \\\"sli_selectStyle\\\": \\\"1\\\",\\n // 必填,绑定的字段 ID(必须是该表中真实存在的字段 ID)\\n \\\"sli_fieldId\\\": \\\"fld_select_01\\\"\\n },\\n// 堆叠面积图配置格式\\n \\\"STACKED_AREA\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"STACKED_AREA\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"堆叠面积图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_date_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"group\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\"\\n }\\n ],\\n \\\"smooth\\\": false,\\n \\\"symbolType\\\": \\\"always\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"label\\\": false,\\n \\\"xAxisShow\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"filter\\\": []\\n }\\n// 堆叠条形图配置格式\\n \\\"STACKED_BAR\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"STACKED_BAR\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"堆叠条形图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"group\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_02\\\"\\n }\\n ],\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"bottom\\\",\\n \\\"label\\\": false,\\n \\\"xAxisShow\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"categoryAxisMaxRatio\\\": \\\"0.3\\\",\\n \\\"filter\\\": []\\n }\\n// 堆叠柱状图配置格式\\n \\\"STACKED_HISTOGRAM\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"STACKED_HISTOGRAM\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"堆叠柱状图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_date_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"group\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\"\\n }\\n ],\\n \\\"xSortBy\\\": \\\"x\\\",\\n \\\"sortRule\\\": \\\"asc\\\",\\n \\\"nullValue\\\": \\\"ignore\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"bottom\\\",\\n \\\"gridShow\\\": false,\\n \\\"label\\\": false,\\n \\\"labelHideOverlap\\\": true,\\n \\\"xAxisShow\\\": true,\\n \\\"xAxisLine\\\": false,\\n \\\"xAxisLabel\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"yAxisLine\\\": false,\\n \\\"yAxisLabel\\\": true,\\n \\\"fillType\\\": \\\"solid\\\",\\n \\\"filter\\\": []\\n }\\n// 堆叠折线图配置格式\\n \\\"STACKED_LINE\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"STACKED_LINE\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"堆叠折线图\\\",\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_date_01\\\",\\n \\\"externalValue\\\": []\\n }\\n ],\\n \\\"group\\\": [\\n {\\n \\\"value\\\": \\\"fld_select_01\\\"\\n }\\n ],\\n \\\"smooth\\\": false,\\n \\\"symbolType\\\": \\\"always\\\",\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"legend\\\": \\\"top\\\",\\n \\\"label\\\": false,\\n \\\"xAxisShow\\\": true,\\n \\\"yAxisShow\\\": true,\\n \\\"filter\\\": []\\n }\\n// 标准列表视图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"STANDARD_LIST_VIEW\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"STANDARD_LIST_VIEW\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"标准列表视图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId\\n \\\"view\\\": \\\"view_001\\\",\\n // 无 filter 时请传空数组,\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置) 中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 视图排序配置,用于设置视图的默认排序规则\\n \\\"viewSort\\\": [],\\n // 隐藏字段配置,key 为 fieldId,value 为 true/false\\n \\\"hiddenFields\\\": {},\\n // 列排序配置,用于设置列的显示顺序\\n \\\"columnSort\\\": [],\\n // 列表自定义配置,用于设置列表的自定义样式和行为\\n \\\"listCustom\\\": {},\\n // 列表配置,用于设置列表的显示方式和布局\\n \\\"listConfig\\\": {},\\n // 字段聚合映射,用于设置字段的聚合方式\\n \\\"fieldAggregateMap\\\": {},\\n // 工具栏配置,用于控制标准列表视图中工具栏的功能按钮\\n \\\"toolbarConfig\\\": {\\n // 是否显示创建行按钮\\n \\\"enableCreateRow\\\": false,\\n // 是否显示筛选按钮\\n \\\"enableFilter\\\": true,\\n // 是否显示分组按钮\\n \\\"enableGroup\\\": true,\\n // 是否显示排序按钮\\n \\\"enableSort\\\": true,\\n // 是否显示查找按钮\\n \\\"enableFind\\\": true,\\n // 是否显示详情记录按钮\\n \\\"enableDetailRecord\\\": true,\\n // 是否显示编辑记录按钮\\n \\\"enableEditRecord\\\": false\\n },\\n },\\n// ═══════════════════════════════════════════════════════════════════\\n // 图表类型:指标卡(STATISTICS)\\n // 别名/同义词:KPI 卡、指标图、数据指标卡、关键指标卡\\n // 用途:以大号数字展示核心指标,并可附加环同比(与上期对比的涨跌幅)\\n // 和趋势折线图,适合展示销售额、DAU、转化率等需要对比分析的 KPI 指标。\\n // 与\\\"统计数字(SUMMARY)\\\"的区别:指标卡支持环同比对比和趋势图,\\n // 功能更丰富;统计数字仅展示单一数字,更简洁。\\n // 重要:当用户说\\\"指标卡\\\"、\\\"KPI 卡\\\"、\\\"指标图\\\"、\\\"关键指标\\\"、\\\"带趋势的数字\\\"时,\\n // 必须使用 chartType = \\\"STATISTICS\\\",不要使用其他图表类型。\\n // ═══════════════════════════════════════════════════════════════════\\n \\\"STATISTICS\\\": {\\n // 必填,图表类型,固定值 \\\"STATISTICS\\\"(指标卡)\\n \\\"chartType\\\": \\\"STATISTICS\\\",\\n // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\\n \\\"name\\\": \\\"指标卡\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时为 null,传入时必须是该表中真实存在的 viewId\\n \\\"view\\\": null,\\n // 无 filter 时请传空数组;\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置)中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 统计指标配置,measureType 与 measure 二选一:\\n // measureType = \\\"record-count\\\" 时统计记录总数,无需填 measure;\\n // measureType = \\\"field\\\" 时需填 measure,指定聚合字段和聚合函数\\n \\\"measureType\\\": \\\"field\\\",\\n // 可选,当 measureType = \\\"field\\\" 时必填,指定聚合字段\\n \\\"measure\\\": [\\n {\\n // 必填,字段 ID(必须是该表中真实存在的数值类字段 ID)\\n \\\"value\\\": \\\"fld_number_01\\\",\\n // 必填,聚合函数配置\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n // formula 合法值:count (计数), unique-count (去重计数), sum (求和), average (平均值), max (最大值), min (最小值)'\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n // 可选,指标说明文字,显示在数值下方\\n \\\"desc\\\": \\\"\\\",\\n // 可选,数字格式化配置\\n \\\"numberFormat\\\": {\\n // 小数位数,默认 0\\n \\\"digits\\\": 0,\\n // 格式类型,合法值:number / percent / thousand\\n \\\"format\\\": \\\"number\\\",\\n // 是否显示千位分隔符\\n \\\"thousandSeparator\\\": true\\n },\\n // 可选,是否显示环同比,默认 false\\n \\\"showComparison\\\": false,\\n // 可选,showComparison=true 时填写,环同比对比的日期字段 ID\\n \\\"comparisonField\\\": null,\\n // 可选,环同比时间范围,如 \\\"this_week\\\" / \\\"this_month\\\" / \\\"this_year\\\"\\n \\\"comparisonDateRange\\\": null,\\n // 可选,环同比类型,合法值:sequential(环比)/ year-on-year(同比)/ month-on-month(月比)/ week-on-week(周比)/ custom(自定义)\\n \\\"comparisonType\\\": \\\"sequential\\\",\\n // 可选,时间统计方式,合法值:same_period(同期)/ cumulative(累计)\\n \\\"comparisonPeriodType\\\": \\\"same_period\\\",\\n // 可选,环同比计算类型,合法值:difference-rate(差值率)/ difference-value(差值)/ original-value(原值)\\n \\\"comparisonCalculationType\\\": \\\"difference-rate\\\",\\n // 可选,环同比布局方向(仅 showComparison=true 且 showTrend=false 时生效),合法值:bottom(下方)/ right(右侧)\\n \\\"comparisonLayout\\\": \\\"bottom\\\",\\n // 可选,是否显示趋势图,默认 false\\n \\\"showTrend\\\": false,\\n // 可选,showTrend=true 时填写,趋势图使用的日期字段 ID\\n \\\"trendField\\\": null,\\n // 可选,趋势图时间范围,如 \\\"this_week\\\" / \\\"this_month\\\" / \\\"this_year\\\"\\n \\\"trendDateRange\\\": null,\\n // 可选,趋势图布局方向(仅 showTrend=true 且 showComparison=false 时生效),合法值:bottom(下方)/ right(右侧)\\n \\\"trendLayout\\\": \\\"bottom\\\",\\n // 可选,趋势图颜色,十六进制色值,如 \\\"#1677FF\\\"\\n \\\"trendColor\\\": \\\"\\\",\\n // 可选,环同比图标样式,合法值:1 / 2 / 3 / 4 / 5 / 6 / 7 / 8\\n \\\"iconStyle\\\": \\\"5\\\",\\n // 可选,卡片标题颜色,十六进制色值\\n \\\"titleColor\\\": \\\"\\\",\\n // 可选,指标说明文字颜色,十六进制色值\\n \\\"descColor\\\": \\\"\\\",\\n // 可选,环同比描述颜色,十六进制色值\\n \\\"comparisonDescColor\\\": \\\"\\\",\\n // 可选,数值颜色配置,支持两种形式:\\n // 1. 固定色值字符串,如 \\\"#1677FF\\\",或渐变色 \\\"linear-gradient(...)\\\"\\n // 2. 条件配色对象(根据数值区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\\n \\\"colors\\\": \\\"\\\"\\n },\\n// ═══════════════════════════════════════════════════════════════════\\n // 图表类型:统计数字(SUMMARY)\\n // 别名/同义词:汇总数字、统计卡、数字卡、计数卡\\n // 用途:以大号数字形式展示单一聚合指标(如记录总数、字段求和/均值等),\\n // 是最简洁的数据汇总展示方式,适合展示总销售额、总订单数、平均分等。\\n // 与其他图表的关键区别:\\n // - 与\\\"指标卡(STATISTICS)\\\"的区别:统计数字更简洁,无环同比、无趋势图;\\n // 指标卡功能更丰富,支持环同比对比和趋势折线图。\\n // - 与\\\"柱状图(HISTOGRAM)\\\"的关键区别:统计数字只展示一个聚合数字(单值卡片),\\n // 无坐标轴、无分类对比;柱状图展示多个分类的数值对比,有 X/Y 轴(多值图表)。\\n // 重要:当用户说\\\"统计数字\\\"、\\\"汇总数字\\\"、\\\"数字卡\\\"、\\\"计数\\\"、\\\"总数\\\"时,\\n // 必须使用 chartType = \\\"SUMMARY\\\",不要使用 HISTOGRAM 或其他图表类型。\\n // ═══════════════════════════════════════════════════════════════════\\n \\\"SUMMARY\\\": {\\n // 必填,图表类型,固定值 \\\"SUMMARY\\\"(统计数字)\\n \\\"chartType\\\": \\\"SUMMARY\\\",\\n // 必填,卡片标题,用户在仪表盘中看到的图表名称,应准确且见名知意\\n \\\"name\\\": \\\"统计数字\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时为 null,传入时必须是该表中真实存在的 viewId\\n \\\"view\\\": null,\\n // 无 filter 时请传空数组;\\n // 如果传入 filter,可参考 dashboard-config-example(仪表盘示例配置)中 filters 的 filter 格式,\\n // 注意 filter 中的 fieldId 必须是该表中真实存在的字段 ID\\n \\\"filter\\\": [],\\n // 统计指标配置,measureType 与 measure 二选一:\\n // measureType = \\\"record-count\\\" 时统计记录总数,无需填 measure;\\n // measureType = \\\"field\\\" 时需填 measure,指定聚合字段和聚合函数\\n \\\"measureType\\\": \\\"field\\\",\\n // 可选,当 measureType = \\\"field\\\" 时必填,指定聚合字段\\n \\\"measure\\\": [\\n {\\n // 必填,字段 ID(必须是该表中真实存在的数值类字段 ID)\\n \\\"value\\\": \\\"fld_number_01\\\",\\n // 必填,聚合函数配置\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n // formula 合法值:count (计数), unique-count (去重计数), sum (求和), average (平均值), max (最大值), min (最小值)'\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n // 可选,数字格式化配置\\n \\\"numberFormat\\\": {\\n // 小数位数,默认 0\\n \\\"digits\\\": 0,\\n // 格式类型,合法值:number / percent / thousand\\n \\\"format\\\": \\\"number\\\",\\n // 是否显示千位分隔符\\n \\\"thousandSeparator\\\": true\\n },\\n // 可选,指标说明文字,由用户在编辑器中输入,传给服务端后显示在数值下方\\n \\\"desc\\\": \\\"\\\",\\n // 可选,数值颜色配置,支持两种形式:\\n // 1. 固定色值字符串,如 \\\"#1677FF\\\",或渐变色 \\\"linear-gradient(...)\\\"\\n // 2. 条件配色对象(根据数值区间动态变色),格式参考 dashboard-config-example 中的 colors 配置\\n \\\"colors\\\": \\\"\\\"\\n },\\n// 标签页配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"TABS\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"TABS\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"标签页\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n // 可选,标签页样式类型,合法值有:type1 到 type10,默认为 type1\\n \\\"tabsStyleType\\\": \\\"type1\\\",\\n // 可选,标签页对齐方式,合法值有:left(左对齐)/ center(居中)/ right(右对齐),默认为 left\\n \\\"tabsAlignType\\\": \\\"left\\\",\\n // 可选,默认激活的标签页 ID,必须与 tabs 数组中的某个 id 匹配\\n \\\"activeTabId\\\": \\\"tab_001\\\",\\n // 必填,标签页数组\\n \\\"tabs\\\": [\\n {\\n // 必填,标签页 ID(必须唯一)\\n \\\"id\\\": \\\"tab_001\\\",\\n // 必填,标签页名称\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"标签页 1\\\"\\n },\\n {\\n \\\"id\\\": \\\"tab_002\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"标签页 2\\\"\\n },\\n {\\n \\\"id\\\": \\\"tab_003\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"标签页 3\\\"\\n }\\n ]\\n },\\n// 词云图配置格式,必须按照此格式配置,否则会导致解析错误\\n \\\"WORD_CLOUD\\\": {\\n // 必填,图表的类型,不传或传错图表将渲染异常\\n \\\"chartType\\\": \\\"WORD_CLOUD\\\",\\n // 必填,图表的名称,是仪表盘中用户看到的图表卡片的标题,应该准确且见名知意\\n \\\"name\\\": \\\"词云图\\\",\\n // 必填,数据表 ID(必须是真实存在的 tableId),可通过 get_base 获取\\n \\\"sheet\\\": \\\"sheet_001\\\",\\n // 可选,视图 ID,不传时直接 null 或 undefined,如果传 viewId 必须是真实存在的 viewId)\\n \\\"view\\\": \\\"view_001\\\",\\n \\\"measureType\\\": \\\"field\\\",\\n \\\"measure\\\": [\\n {\\n \\\"value\\\": \\\"fld_number_01\\\",\\n \\\"externalValue\\\": [\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"value\\\": \\\"sum\\\"\\n }\\n ]\\n }\\n ],\\n \\\"dimension\\\": [\\n {\\n \\\"value\\\": \\\"fld_text_01\\\"\\n }\\n ],\\n \\\"disableParticiple\\\": false, // 是否禁用分词\\n \\\"colors\\\": \\\"COLOR_PALETTE_1\\\",\\n \\\"filter\\\": []\\n },\\n}\\n\",\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Dashboard widgets config example returned. Each key is a chart type (e.g. HISTOGRAM, PIE), and the value is the corresponding widget config example. Use the matching chart type's config as a reference when calling create_chart.\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1286 + }, + { + "service": "aitable", + "command": "+dashboard-config-example", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +dashboard-config-example --yes --format json", + "args": [ + "aitable", + "+dashboard-config-example", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": \"// 注意\\n// 1. 下述 JSON 示例中的注释(// 开头的注释)仅用于说明,实际使用时请删除,否则会导致解析错误\\n// 2. 当一个仪表盘创建完成,并添加图表完成后,检查一下布局,如果有空白或不对齐的图表,请调用 update_chart 优化布局\\n// 3. 当一个仪表盘完整创建后,包括图表也添加完成后,可通过 get_dashboard 接口查看仪表盘详情,检查布局是合适(没有空白或不对齐),如果有问题,调用 update_chart 优化布局\\n// 4. 仪表盘创建好并优化布局后,向用户输出仪表盘链接 URL(注意是仪表盘 URL),方便用户直接访问和使用仪表盘\\n\\n{\\n // 服务端自动生成,调用方传入会被忽略\\n \\\"id\\\": \\\"dashboard_001\\\",\\n // 必填,dashboard 名称,是整个仪表盘的标题,一定要传入,且清晰明确,方便用户使用\\n \\\"name\\\": \\\"示例仪表盘\\\",\\n // 必须使用本示例中的默认主题,禁止自行编造,随意生成的主题无法解析和渲染\\n \\\"theme\\\": {\\n // 必须为 DEFAULT\\n \\\"key\\\": \\\"DEFAULT\\\",\\n // 主题背景色,大部分情况下「传入 null 或 undefined」,使用默认即可\\n \\\"background\\\": null,\\n \\\"image\\\": \\\"\\\"\\n },\\n // 可选,全局筛选条件数组;每个元素对应一张数据表的筛选规则\\n \\\"filters\\\": [\\n {\\n // 要筛选的数据表 ID(必须是真实存在的 tableId)\\n \\\"sheetId\\\": \\\"sheet_001\\\",\\n // 筛选条件数组;第一个条件的 link 必须为 null,后续条件用 \\\"AND\\\" 或 \\\"OR\\\" 连接\\n \\\"filter\\\": [\\n {\\n // 要筛选的字段 ID(必须是该表中真实存在的 fieldId)\\n \\\"fieldId\\\": \\\"fld_001\\\",\\n // 条件连接符:第一个条件必须为 null,后续条件为 \\\"AND\\\" 或 \\\"OR\\\"\\n \\\"link\\\": null,\\n // 固定为 1\\n \\\"version\\\": 1,\\n // 比较符号,合法值按字段类型分组如下:\\n // 文本类: EQ(等于), NE(不等于), CONTAIN(包含), EXCLUSIVE(不包含) — value 为字符串\\n // 数字类: EQ, NE, GT(大于), LT(小于), GTE(大于等于), LTE(小于等于) — value 为数字\\n // 日期类: DATE_EQ(日期等于), BEFORE(早于), AFTER(晚于), NOT_AFTER(不晚于), NOT_BEFORE(不早于) — value 为 \\\"yyyy-MM-dd\\\" 格式字符串\\n // 选项类: ANY_OF(包含任一), ALL_OF(包含全部), NONE_OF(不包含任一) — value 为选项 ID 字符串数组,如 [\\\"opt_001\\\", \\\"opt_002\\\"]\\n // 存在性: EXIST(有值), UN_EXIST(无值) — value 为 null\\n \\\"symbol\\\": \\\"EQ\\\",\\n // value 的类型取决于 symbol,参见上方说明\\n \\\"value\\\": \\\"已完成\\\"\\n }\\n ]\\n }\\n ],\\n // 图表布局数组;创建时会被忽略(默认空数组),更新时有效\\n // 每个元素描述一个图表在网格中的位置和尺寸\\n // layout 的更新,需要通过 update_chart 接口更新到每个图表上,update_chart 接口会自动根据 layout 调整仪表盘布局\\n // 无法通过 update_dashboard 接口直接更新布局,必须通过 update_chart 接口更新图表来间接更新布局\\n \\\"layout\\\": [\\n {\\n // 对应的 widget/chart ID\\n \\\"i\\\": \\\"widget_001\\\",\\n // 横坐标(列位置,从 0 开始,取值范围 0~11)\\n \\\"x\\\": 0,\\n // 纵坐标(行位置,从 0 开始,无上限)\\n \\\"y\\\": 0,\\n // 宽度(占几列,网格总宽 12 列,取值范围 1~12,同一行所有图表的 w 之和应等于 12)\\n \\\"w\\\": 12,\\n // 高度(占几行,取值范围 1~N,同一行的图表必须保持相同高度)\\n \\\"h\\\": 6,\\n // 最小宽度(可选,限制用户拖拽缩放的下限)\\n \\\"minW\\\": 4,\\n // 最小高度(可选,限制用户拖拽缩放的下限)\\n \\\"minH\\\": 3,\\n // 可选,所属分组 ID(用于 COMPOSITE_LAYOUT 组合布局,不使用分组时省略)\\n \\\"parentId\\\": \\\"group_001\\\"\\n }\\n ]\\n}\",\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Dashboard config example returned. The 'id' field is for structure reference only; it will be auto-generated by the server when creating a dashboard. The 'layout' field is ignored when creating (defaults to empty array), but effective when updating.\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1064 + }, + { + "service": "aitable", + "command": "+dashboard-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +dashboard-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --dashboard-id KY9tlWg5NEHgfs8WT6IO2 --yes --format json", + "args": [ + "aitable", + "+dashboard-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--dashboard-id", + "KY9tlWg5NEHgfs8WT6IO2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartCount\": 8,\n \"charts\": [\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"widget-dlxFo0tNSImp4ITpDn5fQ\",\n \"chartName\": \"各业务线未部署数\",\n \"chartType\": \"BAR\",\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\"\n },\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"widget-OQW55ZoOPT3abjYxQbdBo\",\n \"chartName\": \"部署完成率\",\n \"chartType\": \"PIE\",\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\"\n },\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"0ed6ae150c7e43508d504b741ca1b19a\",\n \"chartName\": \"设备付费情况分布\",\n \"chartType\": \"PIE\",\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\"\n },\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"widget-dqjTHaYZdhbSTwRk3JEjI\",\n \"chartName\": \"领取人未部署排行\",\n \"chartType\": \"LEADERBOARD\",\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\"\n },\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"widget-qqMeLF69BEVnKCglPUPRw\",\n \"chartName\": \"验证情况分析\",\n \"chartType\": \"BAR\",\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\"\n },\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"widget-tIkpYHZqciaEu0ypokSEt\",\n \"chartName\": \"部署时间趋势\",\n \"chartType\": \"LINE\",\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\"\n },\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"widget-PcnRUOqW5RzJHFZ1BxQJe\",\n \"chartName\": \"客户未部署分布\",\n \"chartType\": \"HISTOGRAM\",\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\"\n },\n {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"chartId\": \"widget-8LICblz3EqyoLbkyM22Bw\",\n \"chartName\": \"付费状态漏斗\",\n \"chartType\": \"FUNNEL\",\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\"\n }\n ],\n \"dashboardId\": \"KY9tlWg5NEHgfs8WT6IO2\",\n \"dashboardName\": \"仪表盘\",\n \"filters\": [],\n \"layout\": [\n {\n \"h\": 4,\n \"i\": \"widget-05w7XiwviqQgWrMxmvP20\",\n \"w\": 12,\n \"x\": 0,\n \"y\": 0\n },\n {\n \"h\": 5,\n \"i\": \"widget-dlxFo0tNSImp4ITpDn5fQ\",\n \"w\": 6,\n \"x\": 0,\n \"y\": 4\n },\n {\n \"h\": 5,\n \"i\": \"widget-PcnRUOqW5RzJHFZ1BxQJe\",\n \"w\": 6,\n \"x\": 6,\n \"y\": 4\n },\n {\n \"h\": 5,\n \"i\": \"widget-qqMeLF69BEVnKCglPUPRw\",\n \"w\": 6,\n \"x\": 0,\n \"y\": 9\n },\n {\n \"h\": 5,\n \"i\": \"widget-tIkpYHZqciaEu0ypokSEt\",\n \"w\": 6,\n \"x\": 6,\n \"y\": 9\n },\n {\n \"h\": 5,\n \"i\": \"widget-OQW55ZoOPT3abjYxQbdBo\",\n \"w\": 4,\n \"x\": 0,\n \"y\": 14\n },\n {\n \"h\": 5,\n \"i\": \"widget-dqjTHaYZdhbSTwRk3JEjI\",\n \"w\": 4,\n \"x\": 4,\n \"y\": 14\n },\n {\n \"h\": 5,\n \"i\": \"widget-8LICblz3EqyoLbkyM22Bw\",\n \"w\": 4,\n \"x\": 8,\n \"y\": 14\n },\n {\n \"h\": 4,\n \"i\": \"0ed6ae150c7e43508d504b741ca1b19a\",\n \"w\": 6,\n \"x\": 0,\n \"y\": 0\n }\n ],\n \"meta\": {}\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Got dashboard KY9tlWg5NEHgfs8WT6IO2. URL rules: AI 表格仪表盘访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=applicationId%3D{dashboardId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1179 + }, + { + "service": "aitable", + "command": "+field-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +field-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --field-ids 01ZM8y7 --yes --format json", + "args": [ + "aitable", + "+field-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--field-ids", + "01ZM8y7", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"fields\": [\n {\n \"aiConfig\": {\n \"autoRecompute\": false,\n \"computeOnEmptyRef\": false,\n \"enableThinking\": false,\n \"enableWebSearch\": false,\n \"imageConfig\": {\n \"aiGeneratedWatermark\": true,\n \"count\": 1,\n \"resolution\": \"1024*1024\"\n },\n \"outputType\": \"text\",\n \"prompt\": [\n {\n \"type\": \"text\",\n \"value\": \"你是一位贴心的文字识别助手,当用户需要识别图片中的文字时(如菜单、传单、说明书),清晰识别出内容。\\n\\n执行前严格验证输入:\\n- 如果未提供图片,立即回复:\\\"请上传需要识别文字的图片,我帮您快速查看内容!\\\"\\n- 如果图片模糊/黑暗,回复:\\\"图片不太清楚,建议:1) 重新拍摄 2) 对准文字区域 3) 确保光线充足\\\"\\n当输入有效时,按以下规则生成结果(禁用任何技术格式):\\n1. 识别原则(像真人一样读图)\\n - 严格按阅读顺序朗读文字,保留原换行与空格\\n - 模糊处标注\\\"(看不清)\\\",不猜测内容(例:\\\"价(格)\\\")\\n - 保留所有标点、符号和大小写(如\\\"¥25\\\"不改为\\\"25元\\\")\\n - 表格按\\\"从左到右、从上到下\\\"顺序朗读\\n2. 输出格式要求(必须遵守)\\n - 禁用JSON/XML/代码块,仅用**模拟纸质文档**的直观格式\\n - 示例(基于用户输入):\\n 欢迎光临\\n ABC咖啡店\\n 今日特惠:\\n 拿铁 ¥25\\n 卡布奇诺 ¥28\\n 营业时间:8:00-22:00\\n3. 关键控制规则\\n - 排版还原:用空行分隔段落,保留项目符号(如\\\"•\\\")\\n - 模糊处理:单个模糊字符→\\\"(看不清)\\\",连续模糊→\\\"(此处有文字但看不清)\\\"\\n - 语言提示:仅列出主要语言(如\\\"中文为主,含少量英文\\\")\\n - 空结果处理:写\\\"未检测到清晰文字,请检查图片\\\"\\n - 绝对禁止:不添加任何解释(如\\\"根据OCR技术...\\\")\\n4. 禁止行为\\n × 生成任何JSON/XML代码 \\n × 使用术语如\\\"full_text\\\"、\\\"lines\\\" \\n × 修改原始文字内容(如\\\"¥25\\\"不改为\\\"25元\\\")\\n\\n下面是你要总结和分析的原始内容\"\n },\n {\n \"fieldId\": \"2hfk5Hd\",\n \"type\": \"fieldRef\"\n },\n {\n \"type\": \"text\",\n \"value\": \",只保留识别结果中的“序列号”或者“Serial No\\\"\"\n }\n ],\n \"type\": \"ai-agent\"\n },\n \"fieldId\": \"01ZM8y7\",\n \"fieldName\": \"序列号\",\n \"type\": \"text\"\n }\n ]\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Got 1 fields from table hERWDMS\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1402 + }, + { + "service": "aitable", + "command": "+find-record", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +find-record --base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table hERWDMS --query '测试' --yes --format json", + "args": [ + "aitable", + "+find-record", + "--base", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table", + "hERWDMS", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"nextCursor\": \"oXh7WgGooe\",\n \"records\": [\n {\n \"cells\": {\n \"01ZM8y7\": \"N0QWY69QN4\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4048.HEIC.JPG\",\n \"resourceId\": \"479e4321-3d6a-42f0-91de-583c6ea41d9f\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5268e3736ebad509e7fcef9dcd108f495a911ef939606b63dc103944eb9062bae7f23148f19bc87f4\",\n \"size\": 1753393,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"8LVOssPz6Q\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"CDQD7CN97V\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4054.HEIC.JPG\",\n \"resourceId\": \"7d68adf9-ec88-4192-8728-5de240f17fc8\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d57cd5cd33059ea9b3d2766775dd1ba8096b8c5a9cb3defd6f5321c276624c51f602fba57aca34bc6d\",\n \"size\": 1801325,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\\nAI营销借用\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"133206\"\n }\n ]\n },\n \"recordId\": \"AjOk0hu1pe\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"RY7LCW719Q\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4213.HEIC.JPG\",\n \"resourceId\": \"0022f2cc-bd93-49f0-8039-04ac2909dd32\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d59a2750fefa807e0cfc41158e98407c864f1745537f406fcb0e02c76b1696b84f8bac5e1298eba711\",\n \"size\": 1763574,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"DUDacJdQ2X\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"D54X6C7WH6\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"image.png\",\n \"resourceId\": \"e7dea77f-0f65-4266-a3fd-e401b80a9582\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5d45d39275c65656906af57b60be7002feaf431efea862523554a56545a2e6ac55d17ee7f4c9382c9\",\n \"size\": 9795238,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ],\n \"ty1M3J4\": {\n \"markdown\": \"已归还\\n\"\n }\n },\n \"recordId\": \"Dt8KZX7Nt2\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"MN7V04VVD4\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4044.HEIC.JPG\",\n \"resourceId\": \"82903e20-99ca-4497-8596-64b8a9511347\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5585fe6169387aa3767c7e8d94f1e6b2bdcb910b90a359120b13c8f9d1a59101157155a75536e1183\",\n \"size\": 1965625,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"FA0TZMthqI\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"CYY9PQRXJ5\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4216.HEIC.JPG\",\n \"resourceId\": \"3dfd0bec-a06a-4580-a9a2-b8ae450df2a4\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d52f04469c6bb09596caffbbac393c775d8db27175749aef18fb6444ef163ea9d17fb0a232eda6495f\",\n \"size\": 2290335,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"IyGa4g01n1\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"K30F574N0W\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4071.HEIC.JPG\",\n \"resourceId\": \"8f970cbb-9e4d-4abb-bc2e-bae127a6231a\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5988e57da667e94ed89271196611e117503f232ffda40509efa8b2836f86122df894b0282d28e9bd0\",\n \"size\": 1883600,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"UJwTYA3uNw\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"Y7CXVJ9XWD\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4072.HEIC.JPG\",\n \"resourceId\": \"68b711bd-e972-445a-be79-bf4954b52000\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d581be5bba89215dfa8bf27c7a750a77959fc36654d351427344ca8cee273282f51f530a2b9381f2f5\",\n \"size\": 1856927,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"Uygc2paXj3\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"GMQW2JLWVY\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4214.HEIC.JPG\",\n \"resourceId\": \"ca4deb91-17d6-43e7-9812-72101643deb9\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d57860f934d7f4ae4fd1379962b8f251e8357d71880d1389e2b613f13514ac39fcfcb2a6a1fcb68a65\",\n \"size\": 1640058,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"ewj09NwU1z\",\n \"name\": \"AI招聘\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"429676\"\n }\n ]\n },\n \"recordId\": \"Xjj4e7GgG8\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"Y0V7Y2N2YD\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4074.HEIC.JPG\",\n \"resourceId\": \"5b8d3006-280e-41af-a4b0-3320e6a5d596\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5f3f03272cd3d6f49910031a2e873f763b035f6f21d03abba7ab038475a5ab532635226d96df6a64e\",\n \"size\": 1964512,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"Y056lsOG61\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"P24GFQN7YT\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4033.HEIC.JPG\",\n \"resourceId\": \"38656067-b7b7-45fd-8bea-64f4c89dc4f7\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d50c8666278c495a44ef70265cd8adb7f504b841c8f61607d92f11852026cd92eff88db6bf5a5d630c\",\n \"size\": 2028953,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"YVaPzcuGBa\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"N7Q33L77WR\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"image.png\",\n \"resourceId\": \"4abf67c0-ad03-4a81-a3db-3794d15453e9\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d53aa03710ddc5973e4df2b4d6c72f04177dd7b5a30206f588777548a9d514bbd2a1bdc9489688a5fb\",\n \"size\": 9870487,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"hXTMF9el7v\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"HFk9Y9TYQD\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4043.HEIC.JPG\",\n \"resourceId\": \"d6786a91-bca7-4c09-8225-9503cb66610f\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5fe8628219f060fbe50542a5616689036033b038792e8d5a77e12f7fc37630879073a357b1dacf1ae\",\n \"size\": 2110186,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试\",\n \"6B78kgr\": \"2\",\n \"ARoUEWW\": {\n \"id\": \"P6GYJKc3t0\",\n \"name\": \"未付费\"\n },\n \"Str3hFF\": {\n \"id\": \"m4Y2qZ07Yk\",\n \"name\": \"领取两台\"\n },\n \"ZoCsF67\": \"2026-02-09T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"lpH5zwRv5D\",\n \"name\": \"AI差旅\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"151705\"\n }\n ]\n },\n \"recordId\": \"kk7eQt1kJB\"\n },\n {\n \"cells\": {\n \"01ZM8y7\": \"TX6377KGFH\",\n \"2hfk5Hd\": [\n {\n \"filename\": \"IMG_4064.HEIC.JPG\",\n \"resourceId\": \"850e1a7f-aa0a-4ba8-9b54-5bc9c66a5a63\",\n \"resourceUrl\": \"/core/api/resources/img/5eecdaf48460cde5e74cc918372d9be934282a6fcde347f775b8339e1c4c24834322b4c2cdd63b4d6b58639871ed7e1ba156a98577f418d5716c6100d05323cbd2151a4b9cf8174b09cf0ac1af356178c4572bfa55a8c065f499293f0f9b00e2\",\n \"size\": 1963615,\n \"type\": \"image\",\n \"url\": \"[REDACTED_OSS_URL]\"\n }\n ],\n \"47bTcjO\": \"内部测试--恒飞\",\n \"ARoUEWW\": {\n \"id\": \"Zw0fFCNl8e\",\n \"name\": \"付费\"\n },\n \"ZoCsF67\": \"2026-01-23T00:00:00+08:00\",\n \"j1Zwe1c\": [\n {\n \"id\": \"s9UKjSzdLg\",\n \"name\": \"业务方自主\"\n }\n ],\n \"kFwb8br\": {\n \"id\": \"1ZiuS5Wlgz\",\n \"name\": \"内部部署\"\n },\n \"rjwzzIu\": [\n {\n \"id\": \"ewj09NwU1z\",\n \"name\": \"AI招聘\"\n }\n ],\n \"t9n9SDE\": [\n {\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"userId\": \"103262\"\n }\n ],\n \"ty1M3J4\": {\n \"markdown\": \"目前看设备离线\\n\"\n }\n },\n \"recordId\": \"oXh7WgGooe\"\n }\n ]\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Successfully queried 14 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2849 + }, + { + "service": "aitable", + "command": "+form-field-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +form-field-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id lmeV1cb --yes --format json", + "args": [ + "aitable", + "+form-field-list", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--view-id", + "lmeV1cb", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"fields\": [\n {\n \"fieldId\": \"t9n9SDE\",\n \"hidden\": false,\n \"name\": \"领取人\",\n \"required\": true,\n \"type\": \"user\"\n },\n {\n \"fieldId\": \"j1Zwe1c\",\n \"hidden\": false,\n \"name\": \"验证情况\",\n \"required\": true,\n \"type\": \"multipleSelect\"\n },\n {\n \"fieldId\": \"2hfk5Hd\",\n \"hidden\": false,\n \"name\": \"商品图片\",\n \"required\": false,\n \"type\": \"file\"\n },\n {\n \"fieldId\": \"ZoCsF67\",\n \"hidden\": false,\n \"name\": \"领取时间\",\n \"required\": true,\n \"type\": \"date\"\n },\n {\n \"fieldId\": \"47bTcjO\",\n \"hidden\": false,\n \"name\": \"交付客户\",\n \"required\": true,\n \"type\": \"text\"\n },\n {\n \"description\": \"填写:客户业务介绍,老板是谁,实际使用部门,使用人数,主要解决客户什么问题,客户原声\",\n \"fieldId\": \"3p4hbFh\",\n \"hidden\": false,\n \"name\": \"客户背景\",\n \"required\": true,\n \"type\": \"richText\"\n }\n ],\n \"tableId\": \"hERWDMS\",\n \"viewId\": \"lmeV1cb\"\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Found 6 field(s) in form view lmeV1cb\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1139 + }, + { + "service": "aitable", + "command": "+form-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +form-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --yes --format json", + "args": [ + "aitable", + "+form-list", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 2,\n \"forms\": [\n {\n \"viewId\": \"lmeV1cb\",\n \"viewName\": \"设备登记\"\n },\n {\n \"viewId\": \"HaFV1LW\",\n \"viewName\": \"客户使用情况\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1003 + }, + { + "service": "aitable", + "command": "+form-share-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +form-share-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id lmeV1cb --yes --format json", + "args": [ + "aitable", + "+form-share-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--view-id", + "lmeV1cb", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"anonymousSubmit\": false,\n \"authTypeCode\": 0,\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"enabled\": true,\n \"formName\": \"Mac Mini领取信息登记\",\n \"loadLastSubmit\": true,\n \"punished\": false,\n \"replyNotice\": false,\n \"shareFormUuid\": \"v01ZWGl05mvrY0PMn34_hERWDMS_lmeV1cb\",\n \"status\": 1,\n \"submitTimesUserLimit\": 0,\n \"tableId\": \"hERWDMS\",\n \"viewId\": \"lmeV1cb\"\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Fetched share form config for view lmeV1cb: enabled=true\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1067 + }, + { + "service": "aitable", + "command": "+list-tables", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +list-tables --base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json", + "args": [ + "aitable", + "+list-tables", + "--base", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"tables\": [\n {\n \"tableId\": \"hERWDMS\",\n \"tableName\": \"Mac Mini\"\n },\n {\n \"tableId\": \"k8d898q\",\n \"tableName\": \"手机\"\n },\n {\n \"tableId\": \"zyLRwwa\",\n \"tableName\": \"SIM卡\"\n },\n {\n \"tableId\": \"L53jNZz\",\n \"tableName\": \"机箱\"\n },\n {\n \"tableId\": \"zTiHNDL\",\n \"tableName\": \"磁吸片\"\n },\n {\n \"tableId\": \"anMdihs\",\n \"tableName\": \"手机线\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1452 + }, + { + "service": "aitable", + "command": "+record-history-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +record-history-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-id 1015oH3OXy --offset 1 --limit 10 --yes --format json", + "args": [ + "aitable", + "+record-history-list", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--record-id", + "1015oH3OXy", + "--offset", + "1", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"histories\": [\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{\\\"47bTcjO\\\":{\\\"dataType\\\":\\\"STRING\\\",\\\"value\\\":\\\"山东梅格彤\\\"}}\",\n \"oldValue\": \"{\\\"47bTcjO\\\":{\\\"dataType\\\":\\\"STRING\\\",\\\"value\\\":\\\"内部测试\\\"}}\",\n \"operateTime\": 1772700326253,\n \"type\": \"row\",\n \"version\": 2455\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{\\\"ARoUEWW\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"identifier\\\":\\\"Zw0fFCNl8e\\\",\\\"sequence\\\":\\\"Zw0fFCNl8e\\\",\\\"data\\\":\\\"Zw0fFCNl8e\\\",\\\"filterFactor\\\":\\\"Zw0fFCNl8e\\\"}}}\",\n \"oldValue\": \"{\\\"ARoUEWW\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"sequence\\\":\\\"P6GYJKc3t0\\\",\\\"identifier\\\":\\\"P6GYJKc3t0\\\",\\\"data\\\":\\\"P6GYJKc3t0\\\",\\\"filterFactor\\\":\\\"P6GYJKc3t0\\\"}}}\",\n \"operateTime\": 1772700311648,\n \"type\": \"row\",\n \"version\": 2454\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{\\\"kFwb8br\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"identifier\\\":\\\"uvZmbeb5RH\\\",\\\"sequence\\\":\\\"uvZmbeb5RH\\\",\\\"data\\\":\\\"uvZmbeb5RH\\\",\\\"filterFactor\\\":\\\"uvZmbeb5RH\\\"}}}\",\n \"oldValue\": \"{}\",\n \"operateTime\": 1772700308342,\n \"type\": \"row\",\n \"version\": 2453\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{}\",\n \"oldValue\": \"{\\\"kFwb8br\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"sequence\\\":\\\"1ZiuS5Wlgz\\\",\\\"identifier\\\":\\\"1ZiuS5Wlgz\\\",\\\"data\\\":\\\"1ZiuS5Wlgz\\\",\\\"filterFactor\\\":\\\"1ZiuS5Wlgz\\\"}}}\",\n \"operateTime\": 1772700305961,\n \"type\": \"row\",\n \"version\": 2452\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{}\",\n \"oldValue\": \"{\\\"ty1M3J4\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"sequence\\\":\\\"给不挠了\\\",\\\"identifier\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"给不挠了\\\\\\\"]]]]\\\",\\\"data\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"给不挠了\\\\\\\"]]]]\\\",\\\"filterFactor\\\":[\\\"给不挠了\\\"]}}}\",\n \"operateTime\": 1772700303480,\n \"type\": \"row\",\n \"version\": 2451\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{\\\"ty1M3J4\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"identifier\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"给不挠了\\\\\\\"]]]]\\\",\\\"sequence\\\":\\\"给不挠了\\\",\\\"data\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"给不挠了\\\\\\\"]]]]\\\",\\\"filterFactor\\\":[\\\"给不挠了\\\"]}}}\",\n \"oldValue\": \"{\\\"ty1M3J4\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"sequence\\\":\\\"闲置\\\",\\\"identifier\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"闲置\\\\\\\"]]]]\\\",\\\"data\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"闲置\\\\\\\"]]]]\\\",\\\"filterFactor\\\":[\\\"闲置\\\"]}}}\",\n \"operateTime\": 1772003207333,\n \"type\": \"row\",\n \"version\": 2377\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{\\\"ty1M3J4\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"identifier\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"闲置\\\\\\\"]]]]\\\",\\\"sequence\\\":\\\"闲置\\\",\\\"data\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"闲置\\\\\\\"]]]]\\\",\\\"filterFactor\\\":[\\\"闲置\\\"]}}}\",\n \"oldValue\": \"{\\\"ty1M3J4\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"identifier\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"目前查是离线\\\\\\\"]]]]\\\",\\\"sequence\\\":\\\"目前查是离线\\\",\\\"data\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"目前查是离线\\\\\\\"]]]]\\\",\\\"filterFactor\\\":[\\\"目前查是离线\\\"]}}}\",\n \"operateTime\": 1770990377587,\n \"type\": \"row\",\n \"version\": 2241\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{\\\"kFwb8br\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"identifier\\\":\\\"1ZiuS5Wlgz\\\",\\\"sequence\\\":\\\"1ZiuS5Wlgz\\\",\\\"data\\\":\\\"1ZiuS5Wlgz\\\",\\\"filterFactor\\\":\\\"1ZiuS5Wlgz\\\"}}}\",\n \"oldValue\": \"{}\",\n \"operateTime\": 1770875502420,\n \"type\": \"row\",\n \"version\": 2162\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{}\",\n \"oldValue\": \"{\\\"kFwb8br\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"identifier\\\":\\\"8G9fnUmdKY\\\",\\\"sequence\\\":\\\"8G9fnUmdKY\\\",\\\"data\\\":\\\"8G9fnUmdKY\\\",\\\"filterFactor\\\":\\\"8G9fnUmdKY\\\"}}}\",\n \"operateTime\": 1770875501255,\n \"type\": \"row\",\n \"version\": 2161\n },\n {\n \"action\": \"updateRecords\",\n \"newValue\": \"{\\\"ty1M3J4\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"identifier\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"目前查是离线\\\\\\\"]]]]\\\",\\\"sequence\\\":\\\"目前查是离线\\\",\\\"data\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"目前查是离线\\\\\\\"]]]]\\\",\\\"filterFactor\\\":[\\\"目前查是离线\\\"]}}}\",\n \"oldValue\": \"{\\\"ty1M3J4\\\":{\\\"dataType\\\":\\\"OBJECT\\\",\\\"value\\\":{\\\"sequence\\\":\\\"\\\",\\\"identifier\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"\\\\\\\"]]]]\\\",\\\"data\\\":\\\"[\\\\\\\"root\\\\\\\",{},[\\\\\\\"p\\\\\\\",{},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"text\\\\\\\"},[\\\\\\\"span\\\\\\\",{\\\\\\\"data-type\\\\\\\":\\\\\\\"leaf\\\\\\\"},\\\\\\\"\\\\\\\"]]]]\\\",\\\"filterFactor\\\":[\\\"\\\"]}}}\",\n \"operateTime\": 1770868083188,\n \"type\": \"row\",\n \"version\": 2139\n }\n ]\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Got 10 history record(s) for record 1015oH3OXy\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1156 + }, + { + "service": "aitable", + "command": "+record-query", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +record-query --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-ids 1015oH3OXy --field-ids 01ZM8y7 --filters '{}' --sort '[]' --query '测试' --limit 10 --cursor 0 --yes --format json", + "args": [ + "aitable", + "+record-query", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--record-ids", + "1015oH3OXy", + "--field-ids", + "01ZM8y7", + "--filters", + "{}", + "--sort", + "[]", + "--query", + "测试", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {},\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Successfully queried 0 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1241 + }, + { + "service": "aitable", + "command": "+record-query-empty", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +record-query-empty --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --limit 10 --cursor 0 --yes --format json", + "args": [ + "aitable", + "+record-query-empty", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"nextCursor\": \"4lLnbs69uY\",\n \"records\": []\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Scanned 10 record(s) from table hERWDMS in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk, 0 of them are empty.\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2057 + }, + { + "service": "aitable", + "command": "+record-share-links", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +record-share-links --base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table hERWDMS --record-ids 1015oH3OXy --view-id qvGDAH2 --yes --format json", + "args": [ + "aitable", + "+record-share-links", + "--base", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table", + "hERWDMS", + "--record-ids", + "1015oH3OXy", + "--view-id", + "qvGDAH2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"base\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"batches\": 1,\n \"items\": [\n {\n \"recordId\": \"1015oH3OXy\",\n \"shareUrl\": \"https://alidocs.dingtalk.com/notable/record?dentryUuid=gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk&sheetId=hERWDMS&rowId=1015oH3OXy&viewId=qvGDAH2\"\n }\n ],\n \"table\": \"hERWDMS\",\n \"total\": 1\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1249 + }, + { + "service": "aitable", + "command": "+record-share-url", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +record-share-url --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-ids 1015oH3OXy --view-id qvGDAH2 --yes --format json", + "args": [ + "aitable", + "+record-share-url", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--record-ids", + "1015oH3OXy", + "--view-id", + "qvGDAH2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"items\": [\n {\n \"recordId\": \"1015oH3OXy\",\n \"shareUrl\": \"https://alidocs.dingtalk.com/notable/record?dentryUuid=gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\\u0026sheetId=hERWDMS\\u0026rowId=1015oH3OXy\\u0026viewId=qvGDAH2\"\n }\n ]\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Got share urls for 1 record(s)\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1130 + }, + { + "service": "aitable", + "command": "+resolve-base", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +resolve-base --name 'Real共创版设备去向登记' --yes --format json", + "args": [ + "aitable", + "+resolve-base", + "--name", + "Real共创版设备去向登记", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"name\": \"Real共创版设备去向登记\",\n \"resolved\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1228 + }, + { + "service": "aitable", + "command": "+resolve-table", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +resolve-table --base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --name 'Mac Mini' --yes --format json", + "args": [ + "aitable", + "+resolve-table", + "--base", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--name", + "Mac Mini", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"base\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"name\": \"Mac Mini\",\n \"resolved\": true,\n \"tableId\": \"hERWDMS\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1425 + }, + { + "service": "aitable", + "command": "+role-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +role-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json", + "args": [ + "aitable", + "+role-list", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"defaultRole\": {\n \"mode\": 2\n },\n \"enabled\": true,\n \"roles\": [\n {\n \"name\": \"所有者\",\n \"roleId\": \"owner\",\n \"roleType\": \"5000\",\n \"subRoles\": [],\n \"system\": true\n },\n {\n \"name\": \"管理员\",\n \"roleId\": \"manager\",\n \"roleType\": \"4000\",\n \"subRoles\": [],\n \"system\": true\n },\n {\n \"name\": \"可查看角色\",\n \"roleId\": \"10181777133\",\n \"roleType\": \"custom\",\n \"subRoles\": [\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 255\n },\n \"display\": {\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置\",\n \"targetTypeLabel\": \"仪表盘\"\n },\n \"targetId\": \"KY9tlWg5NEHgfs8WT6IO2\",\n \"targetType\": \"dashboard\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"hERWDMS\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"k8d898q\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"zyLRwwa\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"L53jNZz\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"zTiHNDL\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"anMdihs\",\n \"targetType\": \"sheet\"\n }\n ],\n \"system\": false\n },\n {\n \"name\": \"notable_biz_advanced_permission_role_editor\",\n \"roleId\": \"10181777134\",\n \"roleType\": \"system_editor\",\n \"subRoles\": [\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 255\n },\n \"display\": {\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置\",\n \"targetTypeLabel\": \"仪表盘\"\n },\n \"targetId\": \"KY9tlWg5NEHgfs8WT6IO2\",\n \"targetType\": \"dashboard\"\n },\n {\n \"authLevel\": \"manage\",\n \"display\": {\n \"authLevelLabel\": \"可管理\",\n \"permissionScopeNote\": \"可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断\",\n \"targetTypeLabel\": \"数据表\"\n },\n \"targetId\": \"hERWDMS\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"manage\",\n \"display\": {\n \"authLevelLabel\": \"可管理\",\n \"permissionScopeNote\": \"可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断\",\n \"targetTypeLabel\": \"数据表\"\n },\n \"targetId\": \"k8d898q\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"manage\",\n \"display\": {\n \"authLevelLabel\": \"可管理\",\n \"permissionScopeNote\": \"可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断\",\n \"targetTypeLabel\": \"数据表\"\n },\n \"targetId\": \"zyLRwwa\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"manage\",\n \"display\": {\n \"authLevelLabel\": \"可管理\",\n \"permissionScopeNote\": \"可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断\",\n \"targetTypeLabel\": \"数据表\"\n },\n \"targetId\": \"L53jNZz\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"manage\",\n \"display\": {\n \"authLevelLabel\": \"可管理\",\n \"permissionScopeNote\": \"可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断\",\n \"targetTypeLabel\": \"数据表\"\n },\n \"targetId\": \"zTiHNDL\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"manage\",\n \"display\": {\n \"authLevelLabel\": \"可管理\",\n \"permissionScopeNote\": \"可管理级别下,数据表拥有全部操作权限,actions/rows/cells 仅作为配置回显,不参与权限判断\",\n \"targetTypeLabel\": \"数据表\"\n },\n \"targetId\": \"anMdihs\",\n \"targetType\": \"sheet\"\n }\n ],\n \"system\": true\n },\n {\n \"name\": \"notable_biz_advanced_permission_role_reader\",\n \"roleId\": \"10181777135\",\n \"roleType\": \"system_reader\",\n \"subRoles\": [\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 255\n },\n \"display\": {\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,该目标可见但不可编辑,无细粒度 actions/rows/cells 配置\",\n \"targetTypeLabel\": \"仪表盘\"\n },\n \"targetId\": \"KY9tlWg5NEHgfs8WT6IO2\",\n \"targetType\": \"dashboard\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"hERWDMS\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"k8d898q\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"zyLRwwa\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"L53jNZz\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"zTiHNDL\",\n \"targetType\": \"sheet\"\n },\n {\n \"authLevel\": \"read\",\n \"config\": {\n \"actions\": 268435455\n },\n \"display\": {\n \"actionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ],\n \"actionsNote\": \"actions 位图取哨兵值 0x0FFFFFFF,在仅查看级别下表示视图配置项可见,不代表可对视图执行操作\",\n \"authLevelLabel\": \"仅查看\",\n \"permissionScopeNote\": \"仅查看级别下,actions/rows/cells 描述的是可见数据范围,不代表实际可执行的操作\",\n \"targetTypeLabel\": \"数据表\",\n \"viewActionsLabels\": [\n \"新增视图\",\n \"删除视图\",\n \"修改视图\"\n ]\n },\n \"targetId\": \"anMdihs\",\n \"targetType\": \"sheet\"\n }\n ],\n \"system\": true\n }\n ]\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Listed 5 roles for base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1483 + }, + { + "service": "aitable", + "command": "+section-list-empty", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +section-list-empty --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json", + "args": [ + "aitable", + "+section-list-empty", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"items\": [],\n \"total\": 0\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Found 0 empty sections in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1202 + }, + { + "service": "aitable", + "command": "+section-list-nodes", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +section-list-nodes --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --yes --format json", + "args": [ + "aitable", + "+section-list-nodes", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"items\": [\n {\n \"nodeId\": \"L53jNZz\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"zTiHNDL\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"TG566ix\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"hERWDMS-HaFV1LW\",\n \"nodeType\": \"form_view\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"KY9tlWg5NEHgfs8WT6IO2\",\n \"nodeType\": \"dashboard\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"TWB385A\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"hERWDMS-lmeV1cb\",\n \"nodeType\": \"form_view\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"anMdihs\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"qid57iq\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"k8d898q-mkGX58x\",\n \"nodeType\": \"form_view\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"k8d898q\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"zyLRwwa\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n },\n {\n \"nodeId\": \"hERWDMS\",\n \"nodeType\": \"sheet\",\n \"parentSectionId\": \"\"\n }\n ],\n \"total\": 13\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Found 13 nsheet nodes in base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 969 + }, + { + "service": "aitable", + "command": "+table-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +table-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-ids x --yes --format json", + "args": [ + "aitable", + "+table-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-ids", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"tables\": []\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Got 0 tables from base gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk. Requested tableIds not returned: x. URL rules: AI 表格数据表访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}; AI 表格视图访问地址: https://docs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}%26viewId%3D{viewId}. User-facing guidance: 面向用户时要以人为本、友好直观,优先展示 **实体名称**、可点击链接和必要上下文,尽量隐藏 `baseId`、`tableId`、`viewId`、`dashboardId`、`documentId` 等技术细节;除非用户明确索要或排障必须,否则不要直接呈现这些 ID。\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1301 + }, + { + "service": "aitable", + "command": "+template-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +template-search --query '测试' --limit 10 --cursor 0 --yes --format json", + "args": [ + "aitable", + "+template-search", + "--query", + "测试", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 2,\n \"templates\": [\n {\n \"templateId\": \"513\",\n \"templateName\": \"随堂小测试\"\n },\n {\n \"templateId\": \"425\",\n \"templateName\": \"随堂小测试\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 953 + }, + { + "service": "aitable", + "command": "+view-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +view-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-ids qvGDAH2 --yes --format json", + "args": [ + "aitable", + "+view-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--view-ids", + "qvGDAH2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 1,\n \"views\": [\n {\n \"viewId\": \"qvGDAH2\",\n \"viewName\": \"Mac Mini\",\n \"viewType\": \"Grid\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1137 + }, + { + "service": "aitable", + "command": "+view-get-frozen-cols", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +view-get-frozen-cols --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id qvGDAH2 --yes --format json", + "args": [ + "aitable", + "+view-get-frozen-cols", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--view-id", + "qvGDAH2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"count\": 1,\n \"tableId\": \"hERWDMS\",\n \"viewId\": \"qvGDAH2\"\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"Frozen column count of view 'Mac Mini' is 1\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1097 + }, + { + "service": "aitable", + "command": "+view-get-lock", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +view-get-lock --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id qvGDAH2 --yes --format json", + "args": [ + "aitable", + "+view-get-lock", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--view-id", + "qvGDAH2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"locked\": false,\n \"tableId\": \"hERWDMS\",\n \"viewId\": \"qvGDAH2\"\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"View 'Mac Mini' is unlocked\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1063 + }, + { + "service": "aitable", + "command": "+view-get-row-height", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test aitable +view-get-row-height --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --view-id qvGDAH2 --yes --format json", + "args": [ + "aitable", + "+view-get-row-height", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--view-id", + "qvGDAH2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"data\": {\n \"baseId\": \"gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk\",\n \"tableId\": \"hERWDMS\",\n \"viewId\": \"qvGDAH2\"\n },\n \"error\": {},\n \"meta\": {},\n \"status\": \"success\",\n \"success\": true,\n \"summary\": \"View 'Mac Mini' has no explicit cell height\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1284 + }, + { + "service": "attendance", + "command": "+check-record", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +check-record --users 202397 --start 2026-07-14 --end 2026-07-15 --yes --format json", + "args": [ + "attendance", + "+check-record", + "--users", + "202397", + "--start", + "2026-07-14", + "--end", + "2026-07-15", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": [],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 998 + }, + { + "service": "attendance", + "command": "+check-result", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +check-result --users 202397 --start 2026-07-14 --end 2026-07-15 --offset 1 --limit 10 --yes --format json", + "args": [ + "attendance", + "+check-result", + "--users", + "202397", + "--start", + "2026-07-14", + "--end", + "2026-07-15", + "--offset", + "1", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": [],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1134 + }, + { + "service": "attendance", + "command": "+get-adjustment-rule", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +get-adjustment-rule --adjustment-id 1 --yes --format json", + "args": [ + "attendance", + "+get-adjustment-rule", + "--adjustment-id", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"success\": true,\n \"有效期类型\": \"工作日\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 950 + }, + { + "service": "attendance", + "command": "+get-approve-template", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +get-approve-template --type leave --yes --format json", + "args": [ + "attendance", + "+get-approve-template", + "--type", + "leave", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": [\n {\n \"approveType\": \"LEAVE\",\n \"formName\": \"请假\",\n \"processCode\": \"PROC-940F2B1F-845D-4F39-A92E-FA5F45D1BF87\",\n \"submitUrl\": \"dingtalk://dingtalkclient/action/openapp?app_id=-4\\u0026container_type=work_platform\\u0026corpid=ding8196cd9a2b2405da24f2f5cc6abecb85\\u0026ddtab=true\\u0026redirect_type=jump\\u0026redirect_url=https%3A%2F%2Faflow.dingtalk.com%2Fdingtalk%2Fmobile%2Fhomepage.htm%3FappUuid%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26backcontrol%3Dfalse%26corpid%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26dd_progress%3Dfalse%26dd_share%3Dfalse%26ddtab%3Dtrue%26showmenu%3Dfalse%23%2Fcustom%3Fpcredirect%3Dself%26processCode%3DPROC-940F2B1F-845D-4F39-A92E-FA5F45D1BF87\"\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1080 + }, + { + "service": "attendance", + "command": "+get-checkin-record", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +get-checkin-record --operator-corp-id x --operator-staff-id 202397 --staff-ids 202397 --start '2026-07-15 10:00:00' --end '2026-07-15 16:00:00' --yes --format json", + "args": [ + "attendance", + "+get-checkin-record", + "--operator-corp-id", + "x", + "--operator-staff-id", + "202397", + "--staff-ids", + "202397", + "--start", + "2026-07-15 10:00:00", + "--end", + "2026-07-15 16:00:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"result\": {\n \"list\": []\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1116 + }, + { + "service": "attendance", + "command": "+get-leave-records", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +get-leave-records --user 202397 --leave-code 731ed089-62ff-4734-a6c7-3c8fcc8294fc --start 2026-07-14 --end 2026-07-15 --yes --format json", + "args": [ + "attendance", + "+get-leave-records", + "--user", + "202397", + "--leave-code", + "731ed089-62ff-4734-a6c7-3c8fcc8294fc", + "--start", + "2026-07-14", + "--end", + "2026-07-15", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": [],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1009 + }, + { + "service": "attendance", + "command": "+get-overtime-rule", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +get-overtime-rule --overtime-id 1 --yes --format json", + "args": [ + "attendance", + "+get-overtime-rule", + "--overtime-id", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": [\n {\n \"advanceSettingDays\": [],\n \"content\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"durationSettings\": {\n \"holiday\": {\n \"calcType\": 1,\n \"durationType\": 1,\n \"holidayPlanOvertimeRedress\": null,\n \"holidayPlanOvertimeRedressBy\": null,\n \"holidayPlanVacationRate\": null,\n \"overtimeRedress\": true,\n \"overtimeRedressBy\": \"vacation\",\n \"roundType\": null,\n \"settings\": {},\n \"skipTime\": \"none\",\n \"skipTimeByDurations\": [],\n \"skipTimeByFrames\": [],\n \"stepType\": null,\n \"stepValue\": null,\n \"vacationRate\": \"1.0\",\n \"warningSettings\": [],\n \"workMinutesPerDay\": null\n },\n \"restDay\": {\n \"calcType\": 1,\n \"durationType\": 1,\n \"holidayPlanOvertimeRedress\": null,\n \"holidayPlanOvertimeRedressBy\": null,\n \"holidayPlanVacationRate\": null,\n \"overtimeRedress\": true,\n \"overtimeRedressBy\": \"vacation\",\n \"roundType\": null,\n \"settings\": {},\n \"skipTime\": \"none\",\n \"skipTimeByDurations\": [],\n \"skipTimeByFrames\": [],\n \"stepType\": null,\n \"stepValue\": null,\n \"vacationRate\": \"1.0\",\n \"warningSettings\": [],\n \"workMinutesPerDay\": null\n },\n \"workDay\": {\n \"calcType\": 1,\n \"durationType\": 1,\n \"holidayPlanOvertimeRedress\": null,\n \"holidayPlanOvertimeRedressBy\": null,\n \"holidayPlanVacationRate\": null,\n \"overtimeRedress\": true,\n \"overtimeRedressBy\": \"vacation\",\n \"roundType\": null,\n \"settings\": {\n \"calcTypeBetweenDutyWorktime\": null,\n \"durationTypeBetweenDutyWorktime\": null,\n \"dutyWorktimeLieuTypeVacationCode\": null,\n \"dutyWorktimeOvertimeRedress\": null,\n \"dutyWorktimeOvertimeRedressBy\": null,\n \"dutyWorktimeVacationRate\": null,\n \"enableAfterOffDuty\": true,\n \"enableBeforeOnDuty\": true,\n \"enableBetweenDuty\": true,\n \"enableBetweenDutyWorktime\": null,\n \"startTime\": null,\n \"timeUnit\": null,\n \"timeUnitAfterOffDuty\": 30,\n \"timeUnitBeforeOnDuty\": 30,\n \"timeUnitBetweenDuty\": 0,\n \"timeUnitBetweenDutyWorktime\": null\n },\n \"skipTime\": \"none\",\n \"skipTimeByDurations\": [],\n \"skipTimeByFrames\": [],\n \"stepType\": null,\n \"stepValue\": null,\n \"vacationRate\": \"1.0\",\n \"warningSettings\": [],\n \"workMinutesPerDay\": null\n }\n },\n \"groupIdAndNames\": [],\n \"id\": 941615052,\n \"isDefault\": null,\n \"name\": \"以审批时间计算加班\",\n \"overtimeCheckSetting\": {},\n \"overtimeDivisions\": [],\n \"owner\": null,\n \"ownerList\": [],\n \"roundType\": \"floor\",\n \"scopes\": null,\n \"settingId\": 941615052,\n \"stepType\": 0,\n \"stepValue\": \"1.0\",\n \"warningSettings\": [],\n \"workMinutesPerDay\": 480\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 961 + }, + { + "service": "attendance", + "command": "+get-schedule", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +get-schedule --users 202397 --start 2026-07-14 --end 2026-07-15 --yes --format json", + "args": [ + "attendance", + "+get-schedule", + "--users", + "202397", + "--start", + "2026-07-14", + "--end", + "2026-07-15", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": [],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 929 + }, + { + "service": "attendance", + "command": "+get-self-setting", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +get-self-setting --setting-scene checkRemind --user 202397 --yes --format json", + "args": [ + "attendance", + "+get-self-setting", + "--setting-scene", + "checkRemind", + "--user", + "202397", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": {\n \"bossMonthReportType\": null,\n \"bossPushStartMin\": null,\n \"bossWeekReportType\": null,\n \"canUpdateOffDuty\": null,\n \"checkRemindSetting\": {},\n \"checkRemindUserOffDuty\": true,\n \"checkRemindUserOnDuty\": true,\n \"checkResultMsg\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"enableOffdutyCheckRemindOfPc\": true,\n \"enableOndutyCheckRemindOfPc\": true,\n \"fastCheckLateNeedConfirm\": null,\n \"lackRemindUser\": null,\n \"lackSendTodoMsg\": null,\n \"offdutyCheckType\": null,\n \"offdutyRemindEndMin\": null,\n \"offdutyRemindStartMin\": null,\n \"ondutyCheckType\": null,\n \"ondutyRemindEndMin\": null,\n \"ondutyRemindStartMin\": null,\n \"personDailyReportSwitch\": null,\n \"personMonthReportType\": null,\n \"personWeekReportType\": null,\n \"userId\": \"202397\",\n \"vibrationRemindSwitch\": null,\n \"voiceRemindSwitch\": null\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 989 + }, + { + "service": "attendance", + "command": "+get-summary", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +get-summary --user 202397 --date 2026-07-15 --stats-type week --yes --format json", + "args": [ + "attendance", + "+get-summary", + "--user", + "202397", + "--date", + "2026-07-15", + "--stats-type", + "week", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"errorCode\": \"0\",\n \"errorMessage\": \"success\",\n \"result\": {\n \"items\": [\n {\n \"name\": \"平均工时\",\n \"remark\": \"0小时\",\n \"unit\": \"小时\"\n },\n {\n \"name\": \"出勤天数\",\n \"remark\": \"0天\",\n \"unit\": null\n },\n {\n \"name\": \"出勤班次\",\n \"remark\": \"0个\",\n \"unit\": null\n },\n {\n \"name\": \"休息天数\",\n \"remark\": \"0天\",\n \"unit\": null\n },\n {\n \"name\": \"迟到\",\n \"remark\": \"0次\",\n \"unit\": \"次\"\n },\n {\n \"name\": \"早退\",\n \"remark\": \"0次\",\n \"unit\": \"次\"\n },\n {\n \"name\": \"缺卡\",\n \"remark\": \"0次\",\n \"unit\": \"次\"\n },\n {\n \"name\": \"旷工\",\n \"remark\": \"0天\",\n \"unit\": null\n },\n {\n \"name\": \"外勤\",\n \"remark\": \"0次\",\n \"unit\": null\n },\n {\n \"name\": \"加班\",\n \"remark\": \"0小时\",\n \"unit\": null\n },\n {\n \"name\": \"补卡申请\",\n \"remark\": \"0次\",\n \"unit\": null\n }\n ]\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1315 + }, + { + "service": "attendance", + "command": "+list-approve", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +list-approve --users 202397 --types leave --start 2026-07-14 --end 2026-07-15 --yes --format json", + "args": [ + "attendance", + "+list-approve", + "--users", + "202397", + "--types", + "leave", + "--start", + "2026-07-14", + "--end", + "2026-07-15", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": [],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1208 + }, + { + "service": "attendance", + "command": "+list-leave-types", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +list-leave-types --yes --format json", + "args": [ + "attendance", + "+list-leave-types", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"result\": [\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"754f72b4-0476-4e7d-ae4c-c46486268c5c\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"事假\",\n \"leaveStatisticType\": \"freedom\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_hour\",\n \"leaveViewUnit\": \"hour\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"a49f333e-275b-489a-8ec7-2c2000b81f35\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"调休\",\n \"leaveStatisticType\": \"balance_cycle_freedom\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_hour\",\n \"leaveViewUnit\": \"hour\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"5c4380ea-6f9c-4955-bbe6-bc0d114e4676\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"病假\",\n \"leaveStatisticType\": \"freedom\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_hour\",\n \"leaveViewUnit\": \"hour\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"731ed089-62ff-4734-a6c7-3c8fcc8294fc\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"年假\",\n \"leaveStatisticType\": \"balance_cycle\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_day\",\n \"leaveViewUnit\": \"halfDay\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"8a551c65-d3e1-4671-9eaf-78dd4645b8c3\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"产假\",\n \"leaveStatisticType\": \"once_max\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_day\",\n \"leaveViewUnit\": \"day\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"904d3f51-1f73-4161-a50a-300d0009676d\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"陪产假\",\n \"leaveStatisticType\": \"once_max\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_day\",\n \"leaveViewUnit\": \"day\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"05e2ba99-1916-4be9-8166-54f6a652e3bc\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"婚假\",\n \"leaveStatisticType\": \"once_max\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_day\",\n \"leaveViewUnit\": \"day\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"b168cb41-fbca-4f28-8234-fc62e0b66a2b\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"例假\",\n \"leaveStatisticType\": \"once_max\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_day\",\n \"leaveViewUnit\": \"halfDay\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"9daf653b-b3dd-46ef-a2b0-dd160bbf08c4\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"丧假\",\n \"leaveStatisticType\": \"once_max\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_day\",\n \"leaveViewUnit\": \"day\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n },\n {\n \"allRecordCleanTime\": null,\n \"bizType\": null,\n \"corpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\",\n \"exsitFlag\": \"y\",\n \"gmtCreate\": 1650879712000,\n \"gmtModified\": 1650879712000,\n \"leaveBalanceRuleVO\": {},\n \"leaveCertificate\": {},\n \"leaveCode\": \"3730df36-c05c-45e7-bac1-26b2ba137a25\",\n \"leaveCycleStatisticInfoVO\": {},\n \"leaveHourCeil\": null,\n \"leaveName\": \"哺乳假\",\n \"leaveStatisticType\": \"freedom\",\n \"leaveStatus\": \"on\",\n \"leaveTimeCeil\": null,\n \"leaveTimeCeilMinUnit\": null,\n \"leaveUnit\": \"percent_hour\",\n \"leaveViewUnit\": \"hour\",\n \"maxLeaveTime\": null,\n \"minLeaveHour\": null,\n \"naturalDayLeave\": false,\n \"orderId\": null,\n \"paidLeave\": false,\n \"perHoursInDay\": 0,\n \"remindRuleVO\": {},\n \"source\": \"inner\",\n \"submitTimeRuleVO\": {},\n \"sysFlag\": \"n\",\n \"userId\": null,\n \"version\": \"1\",\n \"visibilityRules\": [],\n \"whenCanLeave\": \"entry\"\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1107 + }, + { + "service": "attendance", + "command": "+my-attendance", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +my-attendance --yes --format json", + "args": [ + "attendance", + "+my-attendance", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": [],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1169 + }, + { + "service": "attendance", + "command": "+query-report-data", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +query-report-data --users 202397 --columns 1001 --start '2026-07-15 10:00:00' --end '2026-07-15 16:00:00' --yes --format json", + "args": [ + "attendance", + "+query-report-data", + "--users", + "202397", + "--columns", + "1001", + "--start", + "2026-07-15 10:00:00", + "--end", + "2026-07-15 16:00:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": [],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 998 + }, + { + "service": "attendance", + "command": "+search-adjustment-rule", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +search-adjustment-rule --query '测试' --page 1 --limit 10 --yes --format json", + "args": [ + "attendance", + "+search-adjustment-rule", + "--query", + "测试", + "--page", + "1", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"rules\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 985 + }, + { + "service": "attendance", + "command": "+search-class", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +search-class --query '测试' --filter-type ALL --page 1 --limit 10 --yes --format json", + "args": [ + "attendance", + "+search-class", + "--query", + "测试", + "--filter-type", + "ALL", + "--page", + "1", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"classes\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1043 + }, + { + "service": "attendance", + "command": "+search-group", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +search-group --query '测试' --type FIXED --query-position --query-ble --page 1 --limit 10 --yes --format json", + "args": [ + "attendance", + "+search-group", + "--query", + "测试", + "--type", + "FIXED", + "--query-position", + "--query-ble", + "--page", + "1", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"groups\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 939 + }, + { + "service": "attendance", + "command": "+search-overtime-rule", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +search-overtime-rule --query '测试' --page 1 --limit 10 --yes --format json", + "args": [ + "attendance", + "+search-overtime-rule", + "--query", + "测试", + "--page", + "1", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"rules\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 997 + }, + { + "service": "attendance", + "command": "+this-month", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test attendance +this-month --yes --format json", + "args": [ + "attendance", + "+this-month", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"code\": \"0\",\n \"message\": \"success\",\n \"result\": [],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1108 + }, + { + "service": "calendar", + "command": "+agenda", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +agenda --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --calendar-id primary --cursor '' --limit 10 --yes --format json", + "args": [ + "calendar", + "+agenda", + "--start", + "2026-07-16T10:00:00+08:00", + "--end", + "2026-07-16T11:00:00+08:00", + "--calendar-id", + "primary", + "--cursor", + "", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 1,\n \"events\": [\n {\n \"end\": {\n \"date\": null,\n \"dateTime\": \"2026-07-16T10:00:00+08:00\",\n \"timeZone\": \"Asia/Shanghai\"\n },\n \"eventId\": \"THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000\",\n \"location\": \"B310\",\n \"start\": {\n \"date\": null,\n \"dateTime\": \"2026-07-16T09:15:00+08:00\",\n \"timeZone\": \"Asia/Shanghai\"\n },\n \"status\": \"confirmed\",\n \"summary\": \"中控专属钉&AI项目早会\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2094 + }, + { + "service": "calendar", + "command": "+attendee-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +attendee-list --event THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000 --calendar-id primary --yes --format json", + "args": [ + "calendar", + "+attendee-list", + "--event", + "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000", + "--calendar-id", + "primary", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"attendees\": [\n {\n \"displayName\": \"秦天\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"崇幻(主用钉)\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"恩澈主用钉\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"楠者\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"栩铭-主账号\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"思敏\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"念晨\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"杨淑平\",\n \"responseStatus\": \"declined\"\n },\n {\n \"displayName\": \"李伟韬\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"王琳\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"千启\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"粤腾\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"石涤\",\n \"responseStatus\": \"declined\"\n },\n {\n \"displayName\": \"陈叙\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"李畅(主用钉)\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"徐海儿\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"袁航\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"王伟明\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"巫利华\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"张彪\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"舒畅\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"王晓璇\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"孙茂林\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"尤福海\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"杨凯\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"杨二磊\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"姚俊杰\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"王鑫杰\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"毛金权\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"王国红\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"刘刚\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"王福超\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"张海蛟\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"方胜新\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"邵嘉铭\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"孙龙飞\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"刘琦\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"申展\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"李光辉\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"蒋志恒\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"籍敏\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"黄徐贤\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"王继光\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"裴美娟\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"闫铎功\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"陈江义\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"刘颖\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"杨旭[工作号]\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"刘少军\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"王贵\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"付玉强\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"张振奎\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"武永江\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"沈体峰\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"孔维娜\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"王东亮\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"李鑫\",\n \"responseStatus\": \"accepted\"\n },\n {\n \"displayName\": \"张磊\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"朱晓闪\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"吴斌\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"陈露鑫\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"陈永纯\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"李所清\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"盛超\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"王军超\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"曲宁涛\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"方美\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"杨帆\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"万以华\",\n \"responseStatus\": \"needsAction\"\n },\n {\n \"displayName\": \"毕晨\",\n \"responseStatus\": \"accepted\"\n }\n ],\n \"count\": 70\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1144 + }, + { + "service": "calendar", + "command": "+book-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +book-list --yes --format json", + "args": [ + "calendar", + "+book-list", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"calendars\": [\n {\n \"calendarId\": \"primary\",\n \"description\": null,\n \"privilege\": \"owner\",\n \"summary\": \"我的日历(钉钉)\",\n \"type\": \"primary\"\n }\n ],\n \"count\": 1\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1033 + }, + { + "service": "calendar", + "command": "+book-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +book-search --query '测试' --yes --format json", + "args": [ + "calendar", + "+book-search", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"calendars\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1036 + }, + { + "service": "calendar", + "command": "+conflicts", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +conflicts --in-days 1 --yes --format json", + "args": [ + "calendar", + "+conflicts", + "--in-days", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"conflictCount\": 0,\n \"conflicts\": [],\n \"date\": \"2026-07-16\",\n \"eventCount\": 3,\n \"hasConflict\": false\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2369 + }, + { + "service": "calendar", + "command": "+free", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +free --who '冬翔' --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --yes --format json", + "args": [ + "calendar", + "+free", + "--who", + "冬翔", + "--start", + "2026-07-16T10:00:00+08:00", + "--end", + "2026-07-16T11:00:00+08:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"busy\": [],\n \"free\": true,\n \"userId\": \"103262\",\n \"who\": \"夏东翔\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1697 + }, + { + "service": "calendar", + "command": "+free-slots", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +free-slots --in-days 1 --from 9 --to 18 --yes --format json", + "args": [ + "calendar", + "+free-slots", + "--in-days", + "1", + "--from", + "9", + "--to", + "18", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"allBusy\": false,\n \"date\": \"2026-07-16\",\n \"freeSlots\": [\n {\n \"durationMin\": 15,\n \"end\": \"09:15\",\n \"start\": \"09:00\"\n },\n {\n \"durationMin\": 480,\n \"end\": \"18:00\",\n \"start\": \"10:00\"\n }\n ],\n \"slotCount\": 2,\n \"window\": \"09:00-18:00\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2195 + }, + { + "service": "calendar", + "command": "+freebusy", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +freebusy --users 103262 --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --yes --format json", + "args": [ + "calendar", + "+freebusy", + "--users", + "103262", + "--start", + "2026-07-16T10:00:00+08:00", + "--end", + "2026-07-16T11:00:00+08:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"result\": [\n {\n \"error\": null,\n \"roomId\": null,\n \"scheduleItems\": [],\n \"userId\": \"103262\"\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1154 + }, + { + "service": "calendar", + "command": "+my-free", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +my-free --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --yes --format json", + "args": [ + "calendar", + "+my-free", + "--start", + "2026-07-16T10:00:00+08:00", + "--end", + "2026-07-16T11:00:00+08:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"busy\": [\n {\n \"end\": \"2026-07-16T10:00:00+08:00\",\n \"start\": \"2026-07-16T09:15:00+08:00\"\n }\n ],\n \"free\": false,\n \"userId\": \"202397\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1406 + }, + { + "service": "calendar", + "command": "+next-event", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +next-event --yes --format json", + "args": [ + "calendar", + "+next-event", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"event\": {\n \"end\": \"2026-07-15 21:15\",\n \"eventId\": \"cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000\",\n \"start\": \"2026-07-15 21:00\",\n \"title\": \"循环提醒:项目每日工作进展同步\"\n }\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 5504 + }, + { + "service": "calendar", + "command": "+room-groups", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +room-groups --limit 10 --page 1 --yes --format json", + "args": [ + "calendar", + "+room-groups", + "--limit", + "10", + "--page", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"groups\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1224 + }, + { + "service": "calendar", + "command": "+room-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +room-search --room-name x --yes --format json", + "args": [ + "calendar", + "+room-search", + "--room-name", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"rooms\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1298 + }, + { + "service": "calendar", + "command": "+suggest-time", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +suggest-time --with '冬翔' --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --duration x --yes --format json", + "args": [ + "calendar", + "+suggest-time", + "--with", + "冬翔", + "--start", + "2026-07-16T10:00:00+08:00", + "--end", + "2026-07-16T11:00:00+08:00", + "--duration", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"suggestions\": [\n {\n \"end\": \"2026-07-16T10:30:00+08:00\",\n \"start\": \"2026-07-16T10:00:00+08:00\"\n },\n {\n \"end\": \"2026-07-16T11:00:00+08:00\",\n \"start\": \"2026-07-16T10:30:00+08:00\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1711 + }, + { + "service": "calendar", + "command": "+today", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +today --yes --format json", + "args": [ + "calendar", + "+today", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"events\": [\n {\n \"end\": \"2026-07-15 10:00\",\n \"eventId\": \"THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000\",\n \"location\": \"B310\",\n \"start\": \"2026-07-15 09:15\",\n \"title\": \"中控专属钉&AI项目早会\"\n },\n {\n \"end\": \"2026-07-15 21:15\",\n \"eventId\": \"cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000\",\n \"start\": \"2026-07-15 21:00\",\n \"title\": \"循环提醒:项目每日工作进展同步\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1951 + }, + { + "service": "calendar", + "command": "+tomorrow", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +tomorrow --yes --format json", + "args": [ + "calendar", + "+tomorrow", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"events\": [\n {\n \"end\": \"2026-07-16 10:00\",\n \"eventId\": \"THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000\",\n \"location\": \"B310\",\n \"start\": \"2026-07-16 09:15\",\n \"title\": \"中控专属钉&AI项目早会\"\n },\n {\n \"end\": \"2026-07-16 20:00\",\n \"eventId\": \"cVRhbUZsMzZscU1XQjd0NURFaEdnZz09\",\n \"location\": \"张功馆·桐庐菜(未来星宸永福店)\",\n \"start\": \"2026-07-16 18:00\",\n \"title\": \"搜问&搜索团队聚餐\"\n },\n {\n \"end\": \"2026-07-16 21:15\",\n \"eventId\": \"cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784206800000\",\n \"start\": \"2026-07-16 21:00\",\n \"title\": \"循环提醒:项目每日工作进展同步\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2254 + }, + { + "service": "calendar", + "command": "+week", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +week --yes --format json", + "args": [ + "calendar", + "+week", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"events\": [\n {\n \"end\": \"2026-07-13 10:00\",\n \"eventId\": \"THN4YUtOTlplYU9sZzd2czE4YURLQT09_1783905300000\",\n \"location\": \"B310\",\n \"start\": \"2026-07-13 09:15\",\n \"title\": \"中控专属钉&AI项目早会\"\n },\n {\n \"end\": \"2026-07-13 15:30\",\n \"eventId\": \"UTFidStpV3JUcnVQRDhHZThjZVJGQT09\",\n \"start\": \"2026-07-13 15:00\",\n \"title\": \"llm-wiki的能力共创快速对一下使用说明\"\n },\n {\n \"end\": \"2026-07-13 16:15\",\n \"eventId\": \"bjZWVmlieHVpUUJJMm15RGFUMlRIZz09\",\n \"start\": \"2026-07-13 15:30\",\n \"title\": \"聊聊\"\n },\n {\n \"end\": \"2026-07-13 16:30\",\n \"eventId\": \"elVnVE45K1YvcStEbEpvM2RxbGVYQT09\",\n \"location\": \"2003\",\n \"start\": \"2026-07-13 16:00\",\n \"title\": \"AI技术平台小周会\"\n },\n {\n \"end\": \"2026-07-13 18:00\",\n \"eventId\": \"RXJDc2RMNzNPWkRZRnpzTU1NZ1Nsdz09_1783933200000\",\n \"location\": \"B310\",\n \"start\": \"2026-07-13 17:00\",\n \"title\": \"AI营销周会\"\n },\n {\n \"end\": \"2026-07-13 21:15\",\n \"eventId\": \"cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1783947600000\",\n \"start\": \"2026-07-13 21:00\",\n \"title\": \"循环提醒:项目每日工作进展同步\"\n },\n {\n \"end\": \"2026-07-14 10:00\",\n \"eventId\": \"THN4YUtOTlplYU9sZzd2czE4YURLQT09_1783991700000\",\n \"location\": \"B310\",\n \"start\": \"2026-07-14 09:15\",\n \"title\": \"中控专属钉&AI项目早会\"\n },\n {\n \"end\": \"2026-07-14 14:30\",\n \"eventId\": \"d1BpNmZOVkdJaFY5dXdIVE9SdkZPQT09\",\n \"location\": \"D1-2001\",\n \"start\": \"2026-07-14 13:30\",\n \"title\": \"简单聊一聊\"\n },\n {\n \"end\": \"2026-07-14 20:30\",\n \"eventId\": \"ZUtBTlQxNjY3TnJKM0JpVEx2T1Ardz09\",\n \"location\": \"D1-2004\",\n \"start\": \"2026-07-14 19:30\",\n \"title\": \"盘一下算法 x 搜索搜问合作\"\n },\n {\n \"end\": \"2026-07-14 21:15\",\n \"eventId\": \"cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784034000000\",\n \"start\": \"2026-07-14 21:00\",\n \"title\": \"循环提醒:项目每日工作进展同步\"\n },\n {\n \"end\": \"2026-07-15 10:00\",\n \"eventId\": \"THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000\",\n \"location\": \"B310\",\n \"start\": \"2026-07-15 09:15\",\n \"title\": \"中控专属钉&AI项目早会\"\n },\n {\n \"end\": \"2026-07-15 21:15\",\n \"eventId\": \"cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784120400000\",\n \"start\": \"2026-07-15 21:00\",\n \"title\": \"循环提醒:项目每日工作进展同步\"\n },\n {\n \"end\": \"2026-07-16 10:00\",\n \"eventId\": \"THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784164500000\",\n \"location\": \"B310\",\n \"start\": \"2026-07-16 09:15\",\n \"title\": \"中控专属钉&AI项目早会\"\n },\n {\n \"end\": \"2026-07-16 20:00\",\n \"eventId\": \"cVRhbUZsMzZscU1XQjd0NURFaEdnZz09\",\n \"location\": \"张功馆·桐庐菜(未来星宸永福店)\",\n \"start\": \"2026-07-16 18:00\",\n \"title\": \"搜问&搜索团队聚餐\"\n },\n {\n \"end\": \"2026-07-16 21:15\",\n \"eventId\": \"cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784206800000\",\n \"start\": \"2026-07-16 21:00\",\n \"title\": \"循环提醒:项目每日工作进展同步\"\n },\n {\n \"end\": \"2026-07-17 10:00\",\n \"eventId\": \"THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784250900000\",\n \"location\": \"B310\",\n \"start\": \"2026-07-17 09:15\",\n \"title\": \"中控专属钉&AI项目早会\"\n },\n {\n \"end\": \"2026-07-17 18:00\",\n \"eventId\": \"bmVEbnArV25ITStSQlE5WU1QOHhJUT09_1784278800000\",\n \"location\": \"项目室(D1-1604)\",\n \"start\": \"2026-07-17 17:00\",\n \"title\": \"模型算法团队周会\"\n },\n {\n \"end\": \"2026-07-17 21:15\",\n \"eventId\": \"cy81YjB1eW1yMW9SeWRVdHNDVWFhZz09_1784293200000\",\n \"start\": \"2026-07-17 21:00\",\n \"title\": \"循环提醒:项目每日工作进展同步\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 6589 + }, + { + "service": "chat", + "command": "+at-me", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +at-me --days 7 --yes --format json", + "args": [ + "chat", + "+at-me", + "--days", + "7", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"messages\": [\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"粤腾\",\n \"text\": \"@梓寻 @崇幻(主用钉) @陈叙 @念晨 明天下午给孙总的蓝图汇报,最后一part是对本次AI营销项目的建议和求助。大家可以把每个模块目前遇到的问题和困难(例如:需要客户提供的资源、需求落地的阻力等),单独反馈给我。\",\n \"time\": \"2026-07-15 14:29:53\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"@念晨 这个知识蓝图好了么?客户想先看一下材料\",\n \"time\": \"2026-07-15 13:41:25\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"@念晨 @杨淑平 \\n1、**生产环境:补充一下是否需要域名**[图片消息](mediaId=@lQLPJxN0PcmAzMfNBfDNCuKwMJ8nHWzNI30KKoLRQapEAQ)**2、测试环境:**\\n(1)需要几台服务器,配置保持跟生产一样,还是改一下\\n(2)测试环境是否需要域名,(测试环境就写是否需要好了,可以让客户随机分配下)[图片消息](mediaId=@lQLPJwPJXqYLLMfNBf7NCqCw5iUu-ba7L7IKKoLRQapEAA)\",\n \"time\": \"2026-07-15 10:19:17\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"栩铭-主账号\",\n \"text\": \"@徐洪鑫(崇幻(主用钉)) @董鑫阳(念晨) @陈绪(陈叙) @杨淑平 @梓寻 \\n需要申请 测试服务器环境的同学,在https://alidocs.dingtalk.com/i/nodes/PwkYGxZV3ZEBnPvwI92oDm9rWAgozOKL?utm_scene=team_space&iframeQuery=sheet_range%3Dkgqie6hm_0_11_9_3 “测试环境”Sheet页登记下\\n需要域名的,填写在新增的“域名”栏目\",\n \"time\": \"2026-07-15 09:50:16\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"粤腾\",\n \"text\": \"@梓寻 @陈叙 @崇幻(主用钉) @念晨 各业务场景的蓝图素材还请大家统一补充到钉钉文档中 https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPzYvRArmHv23ye4kWzN67Mw4\",\n \"time\": \"2026-07-14 22:44:59\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"@崇幻(主用钉) @陈叙 @念晨 @杨淑平 今日进展和明日计划记得发一下哈,\\n\\n另外再看一下情报助手、活动助手、解决方案助手、专家Agent什么时候可以让中控一线人员在自己的电脑上运行(最小MVP版本),要给下时间\",\n \"time\": \"2026-07-14 21:35:38\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"@念晨 选李龙就是@粤腾 批啦[憨笑]\",\n \"time\": \"2026-07-14 20:33:28\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"粤腾\",\n \"text\": \"@崇幻(主用钉) @念晨 @梓寻 @陈叙 如果大家明天上午方便,最好能来中控现场,蓝图规划和场景demo录制两个事现场对齐高效输出。[抱拳]\",\n \"time\": \"2026-07-14 19:13:20\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"粤腾\",\n \"text\": \"@崇幻(主用钉) @陈叙 @梓寻 @念晨 明天要给新的分管It和营销业务副总裁孙总汇报整体项目蓝图规划,辛苦大家今天内把每个模块用户故事动线(产品原型图,demo界面,场景等)串起来的相关素材放到知识库。https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYrlp4LN6IBEylmR48akx1Z5N?corpId=ding5bb1eba46e6a17d94ac5d6980864d335&utm_medium=im_card&iframeQuery=utm_medium%3Dim_card%26utm_source%3Dim&utm_scene=team_space&utm_source=im\",\n \"time\": \"2026-07-14 16:28:06\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"@念晨 @陈叙 会议室在 E307\",\n \"time\": \"2026-07-14 13:12:04\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"崇幻这边可以现场演示,@念晨 @陈叙 你俩下午赶的过来么?\",\n \"time\": \"2026-07-14 11:13:17\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"@念晨 @粤腾 @梓寻 @陈叙 @崇幻(主用钉) 崔总突然下午要看项目整体进度,需要汇报每个子项目的情况,大概2点半这样。\",\n \"time\": \"2026-07-14 11:11:28\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"@念晨 明日计划给你加个知识蓝图输出中,然后约客户周三对焦哈\",\n \"time\": \"2026-07-13 23:14:03\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"千启\",\n \"text\": \"@陈叙 @念晨 @杨淑平 今日进展和明天计划记得同步下[送花花]\",\n \"time\": \"2026-07-13 21:40:08\"\n },\n {\n \"conversation\": \"【内】中控每日工作进展汇总群\",\n \"sender\": \"粤腾\",\n \"text\": \"还差一个情报助理和 知识库与中控制标Agent打通。 @杨淑平 情报助理看下周三能做到什么程度。 @念晨 知识库与中控制标Agent打通 需要在7 18 的demo演示中打通么。\",\n \"time\": \"2026-07-13 16:43:23\"\n },\n {\n \"conversation\": \"算法团队mentor群(内部讨论群)\",\n \"sender\": \"璟琦(主用钉)\",\n \"text\": \"@董鑫阳(念晨) https://acl.alibaba-inc.com/permission/datapermission/applyDetail.htm?spm=21540d8c.6248353e.0.0.6ae2264c9zDMFB&flowId=3cd438c0-2cee-4eac-a763-4625dbf2b51d\",\n \"time\": \"2026-07-15 10:54:23\"\n },\n {\n \"conversation\": \"算法团队mentor群(内部讨论群)\",\n \"sender\": \"九韶\",\n \"text\": \"@董鑫阳(念晨) 给你留了一个目标, 你抓紧更新,进去。 我给大哥先发一般\",\n \"time\": \"2026-07-14 16:15:16\"\n },\n {\n \"conversation\": \"算法团队mentor群(内部讨论群)\",\n \"sender\": \"璟琦(主用钉)\",\n \"text\": \"@董鑫阳(念晨) 你补一下 中控 及 专家agent 的部分\",\n \"time\": \"2026-07-14 15:48:29\"\n },\n {\n \"conversation\": \"算法团队mentor群(内部讨论群)\",\n \"sender\": \"璟琦(主用钉)\",\n \"text\": \"@董鑫阳(念晨) cli实现的时候这里面的能力最好都支持\",\n \"time\": \"2026-07-14 10:49:39\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"筱淘\",\n \"text\": \"@董鑫阳(念晨) 让客户再等等 明天见客户\",\n \"time\": \"2026-07-15 09:48:49\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 没事,下次星爷的美人鱼2要在2028年上映了,到时候我们再一起翘班去\",\n \"time\": \"2026-07-15 09:41:06\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@卢翮(龙衔) @董鑫阳(念晨) 去么去么\",\n \"time\": \"2026-07-15 09:22:09\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) @蒋志刚(穆伦) @卢翮(龙衔) 去么,去么\",\n \"time\": \"2026-07-15 09:16:18\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 哪个 HR 问你\",\n \"time\": \"2026-07-15 09:10:25\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"穆伦\",\n \"text\": \"@Dennis(念晨) 为啥这么问呢?你们那边没有好的位置?\",\n \"time\": \"2026-07-15 09:05:14\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"筱淘\",\n \"text\": \"@董鑫阳(念晨) 还等什么 来吧\",\n \"time\": \"2026-07-15 09:00:21\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 害怕\",\n \"time\": \"2026-07-14 22:01:18\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"穆伦\",\n \"text\": \"@Dennis(念晨) 展开说说\",\n \"time\": \"2026-07-14 16:39:26\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"龙衔\",\n \"text\": \"@董鑫阳(念晨) 聊啥\",\n \"time\": \"2026-07-14 16:36:03\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"穆伦\",\n \"text\": \"@Dennis(念晨) 什么评价\",\n \"time\": \"2026-07-14 16:33:04\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 我就说旁边有个车神经的滴滴我\",\n \"time\": \"2026-07-14 13:04:30\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 赛银\",\n \"time\": \"2026-07-14 12:51:33\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 刚才出来的车是你的呀\",\n \"time\": \"2026-07-14 12:51:27\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 你最后一条为什么只出现一半\",\n \"time\": \"2026-07-14 10:27:07\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) iPad or Mac?\",\n \"time\": \"2026-07-14 10:23:28\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"龙衔\",\n \"text\": \"@董鑫阳(念晨) 走,请你吃面\",\n \"time\": \"2026-07-13 18:26:51\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"龙衔\",\n \"text\": \"@董鑫阳(念晨) 茶叶忘了给你了 下次吃饭吧 头大 脑子不够了\",\n \"time\": \"2026-07-13 14:14:22\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 下午你来\",\n \"time\": \"2026-07-13 11:37:02\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 你是开个新卡,还是试试筱淘那个100多的\",\n \"time\": \"2026-07-13 11:33:47\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨)\",\n \"time\": \"2026-07-13 11:32:43\"\n },\n {\n \"conversation\": \"AI全栈\",\n \"sender\": \"怒龙\",\n \"text\": \"@董鑫阳(念晨) 我给你开个卡?\",\n \"time\": \"2026-07-13 11:28:36\"\n },\n {\n \"conversation\": \"元智,九韶,璟琦(主用钉),念晨\",\n \"sender\": \"元智\",\n \"text\": \"@董鑫阳(念晨) 给力,scope更大了\",\n \"time\": \"2026-07-14 15:39:19\"\n },\n {\n \"conversation\": \"元智,九韶,璟琦(主用钉),念晨\",\n \"sender\": \"九韶\",\n \"text\": \"@董鑫阳(念晨) 汇报过了吗? 怎么样?\",\n \"time\": \"2026-07-14 15:19:43\"\n },\n {\n \"conversation\": \"[会议群]销售知识库方案讨论\",\n \"sender\": \"赵瑞(玖霄)\",\n \"text\": \"我来约你时间@念晨\",\n \"time\": \"2026-07-14 12:37:23\"\n },\n {\n \"conversation\": \"[会议群]销售知识库方案讨论\",\n \"sender\": \"迦卢\",\n \"text\": \"@赵瑞(玖霄) 你把需求和@念晨 对焦下\",\n \"time\": \"2026-07-14 12:25:15\"\n },\n {\n \"conversation\": \"[会议群]销售知识库方案讨论\",\n \"sender\": \"迦卢\",\n \"text\": \"@赵瑞(玖霄) @念晨 是知识库这边的技术架构师,目前还没有产品,但是他来进行和我们共创\",\n \"time\": \"2026-07-13 17:48:48\"\n },\n {\n \"conversation\": \"FDE Go\",\n \"sender\": \"冬翔\",\n \"text\": \"@董鑫阳(念晨) 你的Claude还是不能用?\",\n \"time\": \"2026-07-14 10:22:12\"\n },\n {\n \"conversation\": \"FDE Go\",\n \"sender\": \"黎常\",\n \"text\": \"@董鑫阳(念晨) 这个确实太傻逼了,放着好好优势不用\",\n \"time\": \"2026-07-14 09:55:49\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2787 + }, + { + "service": "chat", + "command": "+bot-find", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +bot-find --query '测试' --limit 10 --cursor '' --yes --format json", + "args": [ + "chat", + "+bot-find", + "--query", + "测试", + "--limit", + "10", + "--cursor", + "", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"bots\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1312 + }, + { + "service": "chat", + "command": "+bot-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +bot-search --page 1 --size 1 --name 'DWS shortcut 真实测试' --yes --format json", + "args": [ + "chat", + "+bot-search", + "--page", + "1", + "--size", + "1", + "--name", + "DWS shortcut 真实测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"robots\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1191 + }, + { + "service": "chat", + "command": "+category-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +category-list --yes --format json", + "args": [ + "chat", + "+category-list", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"categories\": [\n {\n \"categoryId\": 1561691365563,\n \"title\": \"大型摸鱼现场\"\n },\n {\n \"categoryId\": 1761880390389,\n \"title\": \"悟空\"\n },\n {\n \"categoryId\": 1561692216352,\n \"title\": \"钉钉\"\n },\n {\n \"categoryId\": 1761880350586,\n \"title\": \"RELU\"\n },\n {\n \"categoryId\": 1767577825401,\n \"title\": \"X Project\"\n },\n {\n \"categoryId\": 1770100726133,\n \"title\": \"A1合作\"\n },\n {\n \"categoryId\": 1764209474291,\n \"title\": \"CodeAgent\"\n },\n {\n \"categoryId\": 1764818531490,\n \"title\": \"DeepResearch\"\n },\n {\n \"categoryId\": 1765771015868,\n \"title\": \"J Project\"\n },\n {\n \"categoryId\": 1761881089886,\n \"title\": \"客户服务\"\n }\n ],\n \"count\": 10\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1326 + }, + { + "service": "chat", + "command": "+chat-bots", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-bots --group cid3Jijzhe2aqs9ysOXjhi05g== --yes --format json", + "args": [ + "chat", + "+chat-bots", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"bots\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 907 + }, + { + "service": "chat", + "command": "+chat-invite-url", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-invite-url --group cid3Jijzhe2aqs9ysOXjhi05g== --expires-seconds 1 --yes --format json", + "args": [ + "chat", + "+chat-invite-url", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--expires-seconds", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"inviteUrl\": \"https://qr.dingtalk.com/action/joingroup?code=v1,k1,Rj9aR+97xuRdK0cKsvoU/daj0MZj7p02n7pETjkgcMo=\\u0026_dt_no_comment=1\\u0026origin=11\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 958 + }, + { + "service": "chat", + "command": "+chat-list-all", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-list-all --limit 10 --cursor 0 --yes --format json", + "args": [ + "chat", + "+chat-list-all", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 9,\n \"groups\": [\n {\n \"name\": \"浅曦-kida,Dennis,秋画\",\n \"openConversationId\": \"cid3Jijzhe2aqs9ysOXjhi05g==\"\n },\n {\n \"name\": \"Dennis,梨岚,浅曦,秋画\",\n \"openConversationId\": \"cidBRb3r823j/rs8mGdPervyQ==\"\n },\n {\n \"name\": \"HISTORE_DINGDING_VOIP_APP\",\n \"openConversationId\": \"cid68WRQRLAWFUvSWPjFTxQEg==\"\n },\n {\n \"name\": \"钉钉19届应届生校招群\",\n \"openConversationId\": \"cidsXjWvcYMguAWhhE6x1PsRw==\"\n },\n {\n \"name\": \"钉钉尖角班第21期欢迎你!\",\n \"openConversationId\": \"cid2YTSHeguqsO/PjSu33/IRA==\"\n },\n {\n \"name\": \"钉子户\",\n \"openConversationId\": \"cidCVNiNIaY1vsA6Hp0rUvk7w==\"\n },\n {\n \"name\": \"应用通知\",\n \"openConversationId\": \"cidPrcdDg1wZb3/0oQRIWxVRw==\"\n },\n {\n \"name\": \"三口之家\",\n \"openConversationId\": \"cid8eLJsKOY3EwulLUqD3jVbA==\"\n },\n {\n \"name\": \"工作通知:三口之家\",\n \"openConversationId\": \"cidAHnUfD5n2F+Ybdsqeu9ymQ==\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1043 + }, + { + "service": "chat", + "command": "+chat-list-join-requests", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-list-join-requests --limit 10 --cursor 0 --yes --format json", + "args": [ + "chat", + "+chat-list-join-requests", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"hasMore\": false,\n \"nextCursor\": 0,\n \"records\": []\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 960 + }, + { + "service": "chat", + "command": "+chat-list-mine", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-list-mine --role OWNER --limit 10 --exclude-muted --yes --format json", + "args": [ + "chat", + "+chat-list-mine", + "--role", + "OWNER", + "--limit", + "10", + "--exclude-muted", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 10,\n \"groups\": [\n {\n \"name\": \"DING_VIBE_CODING没统计到token的问题\",\n \"openConversationId\": \"cidl/foiVj/HRZjBxQI4+Y81g==\"\n },\n {\n \"name\": \"钉钉 EveryDay X RELU 共创\",\n \"openConversationId\": \"cid7XlLm5toebOyqw0J3GJfmA==\"\n },\n {\n \"name\": \"中控测试\",\n \"openConversationId\": \"cidwnTdZmw2YMznZKLOmws9VQ==\"\n },\n {\n \"name\": \"国粹候选人\",\n \"openConversationId\": \"cidw+0WK0/N8nrKwvcgpg6AJQ==\"\n },\n {\n \"name\": \"X 项目算法支持\",\n \"openConversationId\": \"cidbDGRPLyhdI1/b85MiUSz5Q==\"\n },\n {\n \"name\": \"悟空 Agent Runtime Scrum\",\n \"openConversationId\": \"cidCAHeQDMT93RTArxiqBJLiA==\"\n },\n {\n \"name\": \"电商刊登接入CodeAgent\",\n \"openConversationId\": \"cid6IhuGpSIpuosGTGusYUc2g==\"\n },\n {\n \"name\": \"0529机器人 && 移动端中控问题跟进\",\n \"openConversationId\": \"cidXMfbCGTSiHzLLaRV5WDXgw==\"\n },\n {\n \"name\": \"念晨,伊玲,双数\",\n \"openConversationId\": \"cid/xM8a62lWiQGkfgLi4kfhA==\"\n },\n {\n \"name\": \"方齐,念晨,向尘\",\n \"openConversationId\": \"cidpG74/BF0DPbkIHS42XPZZg==\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1799 + }, + { + "service": "chat", + "command": "+chat-role-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-role-list --group cid3Jijzhe2aqs9ysOXjhi05g== --yes --format json", + "args": [ + "chat", + "+chat-role-list", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"roles\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 928 + }, + { + "service": "chat", + "command": "+chat-role-query-user", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-role-query-user --group cid3Jijzhe2aqs9ysOXjhi05g== --user '冬翔' --yes --format json", + "args": [ + "chat", + "+chat-role-query-user", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--user", + "冬翔", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"roles\": []\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 958 + }, + { + "service": "chat", + "command": "+chat-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-search --query '测试' --limit 10 --cursor 0 --exclude-muted --yes --format json", + "args": [ + "chat", + "+chat-search", + "--query", + "测试", + "--limit", + "10", + "--cursor", + "0", + "--exclude-muted", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"groups\": [\n {\n \"channel\": false,\n \"createAt\": \"2026-06-09 09:21:07\",\n \"extension\": {\n \"newCSpaceIdIM\": \"29001572040\"\n },\n \"groupType\": \"INTERNAL_GROUP\",\n \"memberCount\": 4,\n \"openConversationId\": \"cidYmSrmbqMM/OseCzcs4cJdg==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"title\": \"测试群已废弃\"\n },\n {\n \"channel\": false,\n \"createAt\": \"2026-06-09 09:21:00\",\n \"extension\": {\n \"newCSpaceIdIM\": \"29001813316\"\n },\n \"groupType\": \"INTERNAL_GROUP\",\n \"memberCount\": 3,\n \"openConversationId\": \"cidSIMPP2TD6HZcn1nO0mVNoA==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"title\": \"测试群已废弃\"\n },\n {\n \"channel\": false,\n \"createAt\": \"2026-05-13 16:22:30\",\n \"extension\": {\n \"newCSpaceIdIM\": \"28540426059\"\n },\n \"groupType\": \"INTERNAL_GROUP\",\n \"memberCount\": 70,\n \"openConversationId\": \"cidU38vTWZbweyBRT71Md/KJQ==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3UXSDzdMWL3Ls3VUvhTCwbT\",\n \"title\": \"测试项目沟通群\"\n },\n {\n \"channel\": false,\n \"createAt\": \"2026-04-24 11:49:36\",\n \"extension\": {\n \"newCSpaceIdIM\": \"28740101247\"\n },\n \"groupType\": \"INTERNAL_GROUP\",\n \"memberCount\": 2,\n \"openConversationId\": \"cidOpAz1EH8TLuD9H1Who48pw==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"title\": \"测试项目沟通群\"\n },\n {\n \"channel\": false,\n \"createAt\": \"2026-06-26 14:05:19\",\n \"extension\": {\n \"newCSpaceIdIM\": \"29101779299\"\n },\n \"groupType\": \"INTERNAL_GROUP\",\n \"memberCount\": 2,\n \"openConversationId\": \"cidp+Oj7m1gJnx+bCtTn3vhcQ==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"title\": \"Spur测试\"\n },\n {\n \"channel\": false,\n \"createAt\": \"2026-07-02 11:26:29\",\n \"extension\": {\n \"newCSpaceIdIM\": \"29137611383\"\n },\n \"groupType\": \"NEW_EXTERNAL_GROUP\",\n \"memberCount\": 1,\n \"openConversationId\": \"cidwnTdZmw2YMznZKLOmws9VQ==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"title\": \"中控测试\"\n },\n {\n \"channel\": false,\n \"createAt\": \"2026-06-09 11:03:12\",\n \"extension\": {\n \"newCSpaceIdIM\": \"29002815625\"\n },\n \"groupType\": \"INTERNAL_GROUP\",\n \"memberCount\": 2,\n \"openConversationId\": \"cid3hq0VEj6C6FtEtDsWCtNwg==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"title\": \"评测复盘讨论群-测试\"\n },\n {\n \"channel\": true,\n \"createAt\": \"2026-03-24 18:10:34\",\n \"extension\": {\n \"newCSpaceIdIM\": \"28494427717\"\n },\n \"groupType\": \"NEW_EXTERNAL_GROUP\",\n \"memberCount\": 2628,\n \"openConversationId\": \"cidm6kkku3iW/ddE/DuoWOEnQ==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3XSNFHTUgOrXFyf7hpLIgii2\",\n \"title\": \"悟空问题反馈群\"\n },\n {\n \"channel\": false,\n \"createAt\": \"2026-05-13 16:23:30\",\n \"extension\": {\n \"newCSpaceIdIM\": \"28540433569\"\n },\n \"groupType\": \"INTERNAL_GROUP\",\n \"memberCount\": 71,\n \"openConversationId\": \"cidzoNLz/wgp7gRm/mRph+MxA==\",\n \"ownerOpenDingtalkId\": \"D1jIqGatuH3UXSDzdMWL3Ls3VUvhTCwbT\",\n \"title\": \"日常消息同步群\"\n }\n ],\n \"hasMore\": true,\n \"nextCursor\": \"da8b2b5ea0a50c4ae90dcf38edde9f52425c3bb1dd7cb1eddf53e7db6b73b3c4299e03fd01b0cf917b20e2f46a4f5e13bb7a1bd722cf6c4a372c6971d3c37fb7a3301ae0e438d2556a38ae1fc9c6ee9c110732c3d5d829998a367dc7ebd3a0f639e2dc0841255be944cf07a406575e4cbee22cfca7f309a6bba4d6c35f7d3bd05ce9af894fd2f107f264c0c16d61f6c778e2c2e5c3ea05bc0f77ae6cd7bf402f77218ef7439e2483e5348b3cc40b6a28eeb87bc58925bff5a69d0b080d3818ef1eed93958ffb401cb286b4e885564950f46fa42ad85b4161fd5752f840865648c4e2a89a26f8e241ee476d17a8a2352feb4e1f7d97b28d69aeba429b1e6565fd9acc3e2aa71ec6c05d0a31d90c451aa3\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1176 + }, + { + "service": "chat", + "command": "+conversation-info", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +conversation-info --group cid3Jijzhe2aqs9ysOXjhi05g== --open-dingtalk-id x --yes --format json", + "args": [ + "chat", + "+conversation-info", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--open-dingtalk-id", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"conversationInfo\": {\n \"createAt\": \"2018-11-13 12:39:07\",\n \"extension\": {\n \"newCSpaceIdIM\": \"1090404636\"\n },\n \"memberCount\": 3,\n \"openConversationId\": \"cid3Jijzhe2aqs9ysOXjhi05g==\",\n \"ownerNick\": \"浅曦\",\n \"singleChat\": false,\n \"title\": \"浅曦-kida,Dennis,秋画\"\n }\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 942 + }, + { + "service": "chat", + "command": "+conversation-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +conversation-list --limit 10 --cursor 0 --exclude-muted --yes --format json", + "args": [ + "chat", + "+conversation-list", + "--limit", + "10", + "--cursor", + "0", + "--exclude-muted", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"conversations\": [\n {\n \"conversationName\": \"AI全栈\",\n \"openConversationId\": \"cidGAcU1FHD+D2n3W6d+SXuhw==\"\n },\n {\n \"conversationName\": \"念晨\",\n \"openConversationId\": \"cidLw95vHkBXGePhIxRvleOUOtxfWW7v5vcWfa2fdxfxyg=\"\n },\n {\n \"conversationName\": \"九韶\",\n \"openConversationId\": \"cidJdiIbpqCvEjbCuwHaHwR4A==\"\n },\n {\n \"conversationName\": \"战友会\",\n \"openConversationId\": \"cidK7s9XRz94DFkk4raOLduFw==\"\n },\n {\n \"conversationName\": \"生煎包\",\n \"openConversationId\": \"cid2CMDRvYP+Aw5ioOfP+se4+txfWW7v5vcWfa2fdxfxyg=\"\n },\n {\n \"conversationName\": \"Wukong & Real 日志群\",\n \"openConversationId\": \"ciddYsoBxGQrFWR5zJ8lnpPBg==\"\n },\n {\n \"conversationName\": \"粤腾\",\n \"openConversationId\": \"cid72F2hVHMoijoL1CvmWp1ImIo0AJKl0bni7qLL0B05PA=\"\n },\n {\n \"conversationName\": \"算法团队全员群\",\n \"openConversationId\": \"cidXMThCvAfn35/JRu/JOr6BA==\"\n },\n {\n \"conversationName\": \"汇量问题反馈✖️skill/mcp\",\n \"openConversationId\": \"cidTm/YDFJ/jgGFYFe3UF6dzA==\"\n },\n {\n \"conversationName\": \"亲橙park舒婷水果优惠1群\",\n \"openConversationId\": \"cid9LvgVwAlIvDBduIER4jFQg==\"\n }\n ],\n \"count\": 10\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2857 + }, + { + "service": "chat", + "command": "+conversation-list-top", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +conversation-list-top --limit 10 --cursor 0 --exclude-muted --yes --format json", + "args": [ + "chat", + "+conversation-list-top", + "--limit", + "10", + "--cursor", + "0", + "--exclude-muted", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"conversations\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1091 + }, + { + "service": "chat", + "command": "+messages-list-direct", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +messages-list-direct --user 103262 --time '2026-07-15 10:00:00' --forward --limit 10 --yes --format json", + "args": [ + "chat", + "+messages-list-direct", + "--user", + "103262", + "--time", + "2026-07-15 10:00:00", + "--forward", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 4,\n \"messages\": [\n {\n \"createTime\": \"2026-07-15 11:02:04\",\n \"messageId\": \"msgmsdyW4xAGL0iXVc9mR4V0g==\",\n \"senderId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"text\": \"[文档](https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO)\\nDWS shortcut 修复复测 20260715:验证 doc +share-doc,请忽略。\"\n },\n {\n \"createTime\": \"2026-07-15 11:01:49\",\n \"messageId\": \"msgj2fRqVeyvOLxrZ5EntlMIA==\",\n \"senderId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"text\": \"DWS shortcut 修复复测 20260715:验证 chat +broadcast,请忽略。\"\n },\n {\n \"createTime\": \"2026-07-15 11:01:34\",\n \"messageId\": \"msgEuOor1PmFBNlx9M06N9z1Q==\",\n \"senderId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"text\": \"DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。\"\n },\n {\n \"createTime\": \"2026-07-15 10:12:31\",\n \"messageId\": \"msg4cdzVyqpmXc9WAxnR3lcYQ==\",\n \"senderId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"text\": \"-1\\nDWS shortcut 真实测试 20260715 日程,可忽略\\nAsia/Shanghai\\ndingtalk://dingtalkclient/action/switchtab?index=1&name=ding&type=calendar&targetDateTime=1784172600000\\n1\\n1784173500000\\n日历使用手册\\n0\\ndingtalk://dingtalkclient/page/calendar_detail?uniqueId=c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09&corpId=ding8196cd9a2b2405da24f2f5cc6abecb85&from=im_card&redirect_url=https%3A%2F%2Fn.dingtalk.com%2Fdingding%2Fcalendar%2Fdetail%2Findex.html%3Fdd_full_screen%3Dtrue%26dd_progress%3Dfalse%26dd_darkmode%3Dtrue%26%26dd_android_full%3Dtrue%26uniqueId%3Dc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09%26corpId%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26from%3Dim_card\\n0\\n0\\n了解详情\\n1784172600000\\n1\\n439446171\\n1784172600000\\n1784081621092b363beb2-0536-4131-b9ca-935571fca90d\\ndingtalk://dingtalkclient/page/link?url=https%3A%2F%2Falidocs.dingtalk.com%2Fi%2Fp%2FY7kmbokZp3pgGLq2%2Fdocs%2F7Y36k14mK9AV3pKq5zA1J5NqapjblR2D\\nfalse\\n0\\n512653609\\n999\\n1784173500000\\ndingtalk://dingtalkclient/page/calendar_detail?uniqueId=c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09&corpId=ding8196cd9a2b2405da24f2f5cc6abecb85&from=im_card&redirect_url=https%3A%2F%2Fn.dingtalk.com%2Fdingding%2Fcalendar%2Fdetail%2Findex.html%3Fdd_full_screen%3Dtrue%26dd_progress%3Dfalse%26dd_darkmode%3Dtrue%26%26dd_android_full%3Dtrue%26uniqueId%3Dc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09%26corpId%3Dding8196cd9a2b2405da24f2f5cc6abecb85%26from%3Dim_card\\nc0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1386 + }, + { + "service": "chat", + "command": "+messages-list-pin", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +messages-list-pin --open-conversation-id cid3Jijzhe2aqs9ysOXjhi05g== --cursor 0 --size 1 --yes --format json", + "args": [ + "chat", + "+messages-list-pin", + "--open-conversation-id", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--cursor", + "0", + "--size", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"pins\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1105 + }, + { + "service": "chat", + "command": "+messages-list-unread-conversations", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +messages-list-unread-conversations --count 1 --exclude-muted --yes --format json", + "args": [ + "chat", + "+messages-list-unread-conversations", + "--count", + "1", + "--exclude-muted", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"conversations\": [\n {\n \"conversationId\": \"ciddYsoBxGQrFWR5zJ8lnpPBg==\",\n \"title\": \"Wukong & Real 日志群\"\n }\n ],\n \"count\": 1\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1575 + }, + { + "service": "chat", + "command": "+my-groups", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +my-groups --type ALL --yes --format json", + "args": [ + "chat", + "+my-groups", + "--type", + "ALL", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"groups\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1499 + }, + { + "service": "chat", + "command": "+unread-chats", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +unread-chats --count 1 --exclude-muted --yes --format json", + "args": [ + "chat", + "+unread-chats", + "--count", + "1", + "--exclude-muted", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"conversations\": [\n {\n \"conversationId\": \"ciddYsoBxGQrFWR5zJ8lnpPBg==\",\n \"name\": \"Wukong & Real 日志群\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1649 + }, + { + "service": "contact", + "command": "+dept-members", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +dept-members --dept '模型算法' --yes --format json", + "args": [ + "contact", + "+dept-members", + "--dept", + "模型算法", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"deptUserList\": [\n {\n \"userInfo\": {\n \"name\": \"冯铖喆\",\n \"userId\": \"453559\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"何佳瑶\",\n \"userId\": \"548493\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"陈梦媛\",\n \"userId\": \"378607\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"张俊韶\",\n \"userId\": \"030386\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"陈邦杰\",\n \"userId\": \"489149\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"王昊东\",\n \"userId\": \"548778\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"岑锦锋\",\n \"userId\": \"547857\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"彭智韩\",\n \"userId\": \"478801\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"王迎湃\",\n \"userId\": \"543875\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"段旭彬\",\n \"userId\": \"550582\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"牛康佳\",\n \"userId\": \"484887\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"符咏畅\",\n \"userId\": \"519483\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"代成俊\",\n \"userId\": \"167095\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"黄渊卓\",\n \"userId\": \"519019\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"董鑫阳\",\n \"userId\": \"202397\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"崔佳骐\",\n \"userId\": \"534975\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"郑琪欣\",\n \"userId\": \"543310\"\n }\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1539 + }, + { + "service": "contact", + "command": "+list-dept-members", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +list-dept-members --depts x --yes --format json", + "args": [ + "contact", + "+list-dept-members", + "--depts", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"members\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 965 + }, + { + "service": "contact", + "command": "+list-followings", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +list-followings --yes --format json", + "args": [ + "contact", + "+list-followings", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 13,\n \"followings\": [\n {\n \"openDingTalkId\": \"D1jIqGatuH3UbjK1S0jAZJrukgiPdVtRlZ\"\n },\n {\n \"openDingTalkId\": \"DS8iSxaOjF5pjvmTc3wM85awiEiE\"\n },\n {\n \"openDingTalkId\": \"D1jIqGatuH3UrNUuSZbqakTnUpQ3uwcViS\"\n },\n {\n \"openDingTalkId\": \"D1jIqGatuH3X0M3DbwmJLFJDaK7t2NhxA\"\n },\n {\n \"openDingTalkId\": \"D51G4GOo4SMLvmTc3wM85awiEiE\"\n },\n {\n \"openDingTalkId\": \"DHpuMVMNL77HvmTc3wM85awiEiE\"\n },\n {\n \"openDingTalkId\": \"DO3r8ZwxEZ7iSvmTc3wM85awiEiE\"\n },\n {\n \"openDingTalkId\": \"DbQkLTHgGzOiSvmTc3wM85awiEiE\"\n },\n {\n \"openDingTalkId\": \"D1jIqGatuH3UgB25OaELcBlHqiPGB82YtU\"\n },\n {\n \"openDingTalkId\": \"D8y2OTDIEjFjWZ8DyfnKC9lug4rSiPJt8I\"\n },\n {\n \"openDingTalkId\": \"DepgurAiSOr3bvpshro641ZyKOpvhZI2tI\"\n },\n {\n \"openDingTalkId\": \"DtMlaaX4m2p8qiPOT4eDpd1MUBtiiFg6Xhx\"\n },\n {\n \"openDingTalkId\": \"D1jIqGatuH3U4ekOiiRj3wcvSfoaqqfvEb\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1658 + }, + { + "service": "contact", + "command": "+list-role-members", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +list-role-members --id DWSREALREADNOSUCHID0000000000000 --yes --format json", + "args": [ + "contact", + "+list-role-members", + "--id", + "DWSREALREADNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"members\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1162 + }, + { + "service": "contact", + "command": "+list-roles", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +list-roles --yes --format json", + "args": [ + "contact", + "+list-roles", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"roles\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1227 + }, + { + "service": "contact", + "command": "+list-sub-depts", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +list-sub-depts --dept 842379556 --yes --format json", + "args": [ + "contact", + "+list-sub-depts", + "--dept", + "842379556", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"depts\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1217 + }, + { + "service": "contact", + "command": "+lookup", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +lookup --name '冬翔' --yes --format json", + "args": [ + "contact", + "+lookup", + "--name", + "冬翔", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"result\": [\n {\n \"isAdmin\": true,\n \"orgEmployeeModel\": {\n \"depts\": [\n {\n \"deptId\": 996530034,\n \"deptName\": \"AI终端与创新\"\n }\n ],\n \"jobNumber\": \"103262\",\n \"labels\": [\n {\n \"groupName\": \"默认\",\n \"id\": 2679876691,\n \"name\": \"子管理员\",\n \"tagGroupCode\": \"2679876691\"\n },\n {\n \"groupName\": \"默认\",\n \"id\": 2679876693,\n \"name\": \"主管\",\n \"tagGroupCode\": \"2679876693\"\n }\n ],\n \"orgAuthEmail\": null,\n \"orgId\": null,\n \"orgMasterDisplayName\": \"朱鸿\",\n \"orgMasterUserId\": \"024083\",\n \"orgName\": \"钉钉\",\n \"orgTitle\": \"\",\n \"orgUserId\": \"103262\",\n \"orgUserName\": \"夏东翔\",\n \"positions\": [\n {\n \"deptId\": 996530034,\n \"isMain\": true,\n \"managerDisplayName\": null,\n \"managerStaffId\": null,\n \"title\": null,\n \"workStation\": \"浙江-杭州-阿里中心·杭州未科 \"\n }\n ]\n }\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1698 + }, + { + "service": "contact", + "command": "+me", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +me --yes --format json", + "args": [ + "contact", + "+me", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"dept\": \"模型算法\",\n \"mobile\": \"13161187007\",\n \"name\": \"董鑫阳\",\n \"org\": \"钉钉\",\n \"userId\": \"202397\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1072 + }, + { + "service": "contact", + "command": "+org", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +org --name '冬翔' --yes --format json", + "args": [ + "contact", + "+org", + "--name", + "冬翔", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"result\": {\n \"deptId\": 996530034,\n \"deptName\": \"AI终端与创新\",\n \"memberCount\": 5\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1627 + }, + { + "service": "contact", + "command": "+resolve-dept", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +resolve-dept --name '模型算法' --yes --format json", + "args": [ + "contact", + "+resolve-dept", + "--name", + "模型算法", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"deptId\": \"842379556\",\n \"name\": \"技术平台-模型算法\",\n \"resolved\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1186 + }, + { + "service": "contact", + "command": "+search-mobile", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +search-mobile --mobile 13000000000 --yes --format json", + "args": [ + "contact", + "+search-mobile", + "--mobile", + "13000000000", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"users\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1415 + }, + { + "service": "contact", + "command": "+search-user", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +search-user --query '测试' --yes --format json", + "args": [ + "contact", + "+search-user", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 4,\n \"users\": [\n {\n \"flowerName\": null,\n \"name\": null,\n \"openDingTalkId\": \"Dn3FQ9n3oCiiNviSya2usICjFug4rSiPJt8I\",\n \"title\": null,\n \"userId\": null\n },\n {\n \"flowerName\": null,\n \"name\": null,\n \"openDingTalkId\": \"Dxud965XFNRyGCOG0Bwk0pVug4rSiPJt8I\",\n \"title\": null,\n \"userId\": null\n },\n {\n \"flowerName\": null,\n \"name\": null,\n \"openDingTalkId\": \"D1jIqGatuH3VffnYwNdg1p2LlYiSf05oYii\",\n \"title\": null,\n \"userId\": null\n },\n {\n \"flowerName\": null,\n \"name\": \"测试\",\n \"openDingTalkId\": \"D1jIqGatuH3WSeoELOC89rgTx03b5vNii1\",\n \"title\": \"\",\n \"userId\": \"036230684122903146\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1419 + }, + { + "service": "contact", + "command": "+team", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +team --name '冬翔' --yes --format json", + "args": [ + "contact", + "+team", + "--name", + "冬翔", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"deptUserList\": [\n {\n \"userInfo\": {\n \"name\": \"黄文杰\",\n \"userId\": \"106261\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"夏东翔\",\n \"userId\": \"103262\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"何伟楠\",\n \"userId\": \"106201\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"汪鑫\",\n \"userId\": \"323179\"\n }\n },\n {\n \"userInfo\": {\n \"name\": \"刘光宇\",\n \"userId\": \"112161\"\n }\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1738 + }, + { + "service": "devapp", + "command": "+event-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +event-list --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --keyword '测试' --cursor '' --page-size 10 --yes --format json", + "args": [ + "devapp", + "+event-list", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--keyword", + "测试", + "--cursor", + "", + "--page-size", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"events\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1214 + }, + { + "service": "devapp", + "command": "+get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +get --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --yes --format json", + "args": [ + "devapp", + "+get", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"appKey\": \"dingdtqbtxgtn2r5uyge\",\n \"appStatus\": \"normal\",\n \"canDelete\": true,\n \"canUpdate\": true,\n \"creator\": \"董鑫阳\",\n \"desc\": \"DTDennisLobster\",\n \"gmtCreate\": \"2026-03-06 10:41:40\",\n \"gmtModified\": \"2026-03-06 10:41:40\",\n \"icon\": \"@lADPDfmVQafoVxrMyMzI\",\n \"iconUrl\": \"https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg\",\n \"name\": \"DTDennisLobster\",\n \"supportHarmony\": false,\n \"unifiedAppId\": \"678f27ec-4339-49d8-9c49-371b284bf552\",\n \"versionStatus\": \"INIT\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1268 + }, + { + "service": "devapp", + "command": "+list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +list --name 'DWS shortcut 真实测试' --app-key x --app-group-id 1 --creator x --robot-name x --develop-type 1 --filter-cool-app 1 --sort-type x --sort-order x --cursor '' --page-size 10 --yes --format json", + "args": [ + "devapp", + "+list", + "--name", + "DWS shortcut 真实测试", + "--app-key", + "x", + "--app-group-id", + "1", + "--creator", + "x", + "--robot-name", + "x", + "--develop-type", + "1", + "--filter-cool-app", + "1", + "--sort-type", + "x", + "--sort-order", + "x", + "--cursor", + "", + "--page-size", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"apps\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 8524 + }, + { + "service": "devapp", + "command": "+member-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +member-list --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --yes --format json", + "args": [ + "devapp", + "+member-list", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"members\": [\n {\n \"memberType\": \"OWNER\",\n \"name\": \"董鑫阳\",\n \"userId\": \"202397\"\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1404 + }, + { + "service": "devapp", + "command": "+permission-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +permission-list --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --keyword '测试' --auth-status ALL --cursor '' --page-size 10 --yes --format json", + "args": [ + "devapp", + "+permission-list", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--keyword", + "测试", + "--auth-status", + "ALL", + "--cursor", + "", + "--page-size", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"permissions\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1578 + }, + { + "service": "devapp", + "command": "+robot-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +robot-get --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --yes --format json", + "args": [ + "devapp", + "+robot-get", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"configured\": false,\n \"message\": \"应用未配置机器人。\",\n \"robotStatus\": \"UNCONFIGURED\",\n \"unifiedAppId\": \"678f27ec-4339-49d8-9c49-371b284bf552\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1204 + }, + { + "service": "devapp", + "command": "+version-check-approval", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +version-check-approval --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --version-id 4743accb-45e2-4bc9-8c96-74fc62ace2e8 --yes --format json", + "args": [ + "devapp", + "+version-check-approval", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--version-id", + "4743accb-45e2-4bc9-8c96-74fc62ace2e8", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"approvalCandidates\": [\n {\n \"mainAdmin\": false,\n \"name\": \"王军\",\n \"userId\": \"084896\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"尤坤\",\n \"userId\": \"425982\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"贺汝坤\",\n \"userId\": \"453209\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"倪爽\",\n \"userId\": \"443841\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"谢传贵\",\n \"userId\": \"014823\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"史伟民\",\n \"userId\": \"188288\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"郭迪\",\n \"userId\": \"452337\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"周子杰\",\n \"userId\": \"312753\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"刘畅\",\n \"userId\": \"068373\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"张磊\",\n \"userId\": \"371811\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"霍俊龙\",\n \"userId\": \"068428\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"李晓军\",\n \"userId\": \"004897\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"姚海龙\",\n \"userId\": \"107578\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"王丽丽\",\n \"userId\": \"246929\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"李恺杰\",\n \"userId\": \"272720\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"夏东翔\",\n \"userId\": \"103262\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"朱鸿\",\n \"userId\": \"024083\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"叶冬\",\n \"userId\": \"371817\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"任卿\",\n \"userId\": \"006792\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"彭家俊\",\n \"userId\": \"225893\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"刘蓓蓓\",\n \"userId\": \"074268\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"王耀波\",\n \"userId\": \"220629\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"夏烈阳\",\n \"userId\": \"176371\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"魏玉科\",\n \"userId\": \"061331\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"张晨阳\",\n \"userId\": \"244717\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"李祎嵩\",\n \"userId\": \"238863\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"吕思霖\",\n \"userId\": \"193021\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"宋宜涛\",\n \"userId\": \"037168\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"李红军\",\n \"userId\": \"133206\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"沈运亮\",\n \"userId\": \"101595\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"桂明月\",\n \"userId\": \"077725\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"吴芳祥\",\n \"userId\": \"074360\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"赵召航\",\n \"userId\": \"044473\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"黄文奇\",\n \"userId\": \"270175\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"董金威\",\n \"userId\": \"085729\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"孙博文\",\n \"userId\": \"034766\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"朱通\",\n \"userId\": \"327979\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"王帅军\",\n \"userId\": \"061731\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"王海旭\",\n \"userId\": \"273048\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"欧阳德仁\",\n \"userId\": \"167272\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"冯汝伟\",\n \"userId\": \"124456\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"刘啸天\",\n \"userId\": \"314418\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"杨期\",\n \"userId\": \"028611\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"宋华青\",\n \"userId\": \"054469\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"俞福春\",\n \"userId\": \"424920\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"汤素文\",\n \"userId\": \"088045\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"王摧\",\n \"userId\": \"141842\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"王鸣霏\",\n \"userId\": \"184163\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"王兵\",\n \"userId\": \"135976\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"周剑云\",\n \"userId\": \"164217\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"沈国勋\",\n \"userId\": \"026247\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"高阿娜\",\n \"userId\": \"001423\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"王森\",\n \"userId\": \"045981\"\n },\n {\n \"mainAdmin\": false,\n \"name\": \"林朋\",\n \"userId\": \"236891\"\n }\n ],\n \"approvalMode\": \"SELECT_APPROVER\",\n \"approvalSubmitted\": false,\n \"publishable\": false,\n \"published\": false,\n \"requiresApproval\": true,\n \"sensitive\": false,\n \"unifiedAppId\": \"678f27ec-4339-49d8-9c49-371b284bf552\",\n \"version\": \"1.0.0\",\n \"versionId\": \"4743accb-45e2-4bc9-8c96-74fc62ace2e8\",\n \"versionStatus\": \"INIT\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2081 + }, + { + "service": "devapp", + "command": "+version-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +version-get --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --version-id 4743accb-45e2-4bc9-8c96-74fc62ace2e8 --yes --format json", + "args": [ + "devapp", + "+version-get", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--version-id", + "4743accb-45e2-4bc9-8c96-74fc62ace2e8", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"abilityList\": [],\n \"approvalMode\": \"SELECT_APPROVER\",\n \"description\": \"1.0.0\",\n \"enterpriseSelfBuiltAudit\": false,\n \"gmtCreate\": \"2026-03-06 10:43:01\",\n \"requiresApproval\": true,\n \"scopeList\": [\n \"qyapi_robot_sendmsg\",\n \"Card.Instance.Write\",\n \"Card.Streaming.Write\"\n ],\n \"sensitiveScopeList\": [],\n \"unifiedAppId\": \"678f27ec-4339-49d8-9c49-371b284bf552\",\n \"version\": \"1.0.0\",\n \"versionId\": \"4743accb-45e2-4bc9-8c96-74fc62ace2e8\",\n \"versionStatus\": \"INIT\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1738 + }, + { + "service": "devapp", + "command": "+version-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +version-list --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --cursor '' --page-size 10 --yes --format json", + "args": [ + "devapp", + "+version-list", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--cursor", + "", + "--page-size", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 1,\n \"versions\": [\n {\n \"desc\": \"1.0.0\",\n \"gmtCreate\": 1772764981000,\n \"status\": \"INIT\",\n \"version\": \"1.0.0\",\n \"versionId\": \"4743accb-45e2-4bc9-8c96-74fc62ace2e8\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1349 + }, + { + "service": "devapp", + "command": "+version-status", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +version-status --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --version-id 4743accb-45e2-4bc9-8c96-74fc62ace2e8 --yes --format json", + "args": [ + "devapp", + "+version-status", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--version-id", + "4743accb-45e2-4bc9-8c96-74fc62ace2e8", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"unifiedAppId\": \"678f27ec-4339-49d8-9c49-371b284bf552\",\n \"version\": \"1.0.0\",\n \"versionId\": \"4743accb-45e2-4bc9-8c96-74fc62ace2e8\",\n \"versionStatus\": \"INIT\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2272 + }, + { + "service": "devapp", + "command": "+webapp-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +webapp-get --unified-app-id 678f27ec-4339-49d8-9c49-371b284bf552 --yes --format json", + "args": [ + "devapp", + "+webapp-get", + "--unified-app-id", + "678f27ec-4339-49d8-9c49-371b284bf552", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"configured\": false,\n \"message\": \"未配置网页应用入口,请使用 webapp config 设置 homepageUrl、pcHomepageUrl 或 ompUrl。\",\n \"unifiedAppId\": \"678f27ec-4339-49d8-9c49-371b284bf552\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1576 + }, + { + "service": "ding", + "command": "+list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test ding +list --cursor 0 --type ALL --yes --format json", + "args": [ + "ding", + "+list", + "--cursor", + "0", + "--type", + "ALL", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"dingMessages\": [\n {\n \"openDingId\": \"5D73E3AC29C780072D1CD56C6874ACC2\",\n \"sendTime\": \"2026-07-14 20:30:06\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"6DE6EC00AEBEF6839CA5F309371550DA\",\n \"sendTime\": \"2026-07-10 16:17:20\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"4DE0B0D90A94683CE1A9E12CBBB82883\",\n \"sendTime\": \"2026-07-10 12:38:47\",\n \"senderNick\": \"思敏\"\n },\n {\n \"openDingId\": \"B1CF538F2A3CAD8F78E863BCFF10E90F\",\n \"sendTime\": \"2026-07-10 11:47:07\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"72D79962A868374366AF4FCA6946D49F\",\n \"sendTime\": \"2026-07-10 11:44:27\",\n \"senderNick\": \"汀葻\"\n },\n {\n \"openDingId\": \"A290A8F6D35CC8E712E3E4C30D915263\",\n \"sendTime\": \"2026-07-10 11:10:52\",\n \"senderNick\": \"楠者\"\n },\n {\n \"openDingId\": \"7B7BA69E68F85A3948B70A1BD79C9DF2\",\n \"sendTime\": \"2026-07-09 20:43:36\",\n \"senderNick\": \"楠者\"\n },\n {\n \"openDingId\": \"0D59FF6F871900140BD65422184C410C\",\n \"sendTime\": \"2026-07-09 17:25:36\",\n \"senderNick\": \"楠者\"\n },\n {\n \"openDingId\": \"B6072FCC82D85A343EE7834A70293F09\",\n \"sendTime\": \"2026-07-09 16:37:54\",\n \"senderNick\": \"王玮(哈瑞)\"\n },\n {\n \"openDingId\": \"91DFBF0D54B7A0DCC8F7EAF58560586C\",\n \"sendTime\": \"2026-07-09 15:17:19\",\n \"senderNick\": \"楠者\"\n },\n {\n \"openDingId\": \"EA1F2A52C13954855A3D0D7A32A973F6\",\n \"sendTime\": \"2026-07-09 11:52:15\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"340C8FD58735886D44B5EA46921F8AAD\",\n \"sendTime\": \"2026-07-07 11:48:58\",\n \"senderNick\": \"穆伦\"\n },\n {\n \"openDingId\": \"A389AD2799303C13C15BB6EF014D3B39\",\n \"sendTime\": \"2026-07-07 11:34:34\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"A26385411682C6C5042D775B25DA8F08\",\n \"sendTime\": \"2026-07-06 11:37:05\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"C42A8B86D5453197F79645460E0B7A99\",\n \"sendTime\": \"2026-07-03 17:41:43\",\n \"senderNick\": \"楠者\"\n },\n {\n \"openDingId\": \"5AEF5D3CF756F23345F86FF5E7544E73\",\n \"sendTime\": \"2026-07-03 15:40:52\",\n \"senderNick\": \"楠者\"\n },\n {\n \"openDingId\": \"EA0E39C793A943797EEDEA9B00740A72\",\n \"sendTime\": \"2026-07-03 14:40:23\",\n \"senderNick\": \"粤腾\"\n },\n {\n \"openDingId\": \"753EC85C1FA6E50D82EB5C19940F340E\",\n \"sendTime\": \"2026-07-02 20:26:38\",\n \"senderNick\": \"思敏\"\n },\n {\n \"openDingId\": \"782B702452A410EC6D30ADC9D4E95FDB\",\n \"sendTime\": \"2026-07-02 09:49:45\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"983C2C5A65CAE1A86D8C6BC272E73D11\",\n \"sendTime\": \"2026-07-02 09:48:09\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"40B84F9DF18DE299C2B2D712E7D01114\",\n \"sendTime\": \"2026-06-29 17:59:37\",\n \"senderNick\": \"穆伦\"\n },\n {\n \"openDingId\": \"F799B63D8EDDB7915C80159BD355704F\",\n \"sendTime\": \"2026-06-25 19:53:17\",\n \"senderNick\": \"文靖\"\n },\n {\n \"openDingId\": \"33C1238264ACA098634569396F60EE7A\",\n \"sendTime\": \"2026-06-25 18:10:19\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"2A05EE1E37F7EB023C3146819156E9A8\",\n \"sendTime\": \"2026-06-25 11:49:24\",\n \"senderNick\": \"穆伦\"\n },\n {\n \"openDingId\": \"29FBFA46D6F07ED25378F2871E24A1DC\",\n \"sendTime\": \"2026-06-24 12:00:32\",\n \"senderNick\": \"云欢\"\n },\n {\n \"openDingId\": \"2CE4C4F3EE8C332884FA1673C064921C\",\n \"sendTime\": \"2026-06-22 20:47:14\",\n \"senderNick\": \"黎常\"\n },\n {\n \"openDingId\": \"8A2B1A1F7E508B2F08A52FEDD9365843\",\n \"sendTime\": \"2026-06-18 13:41:19\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"7F7671C7853D88C92DE6EE0A671CB57B\",\n \"sendTime\": \"2026-06-17 10:52:34\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"9539E8D27A51F204197E326F94650279\",\n \"sendTime\": \"2026-06-16 11:50:18\",\n \"senderNick\": \"穆伦\"\n },\n {\n \"openDingId\": \"DE9E8FAFC8125BC715B999AC4267E2CA\",\n \"sendTime\": \"2026-06-15 21:35:40\",\n \"senderNick\": \"西渐(主用钉)\"\n },\n {\n \"openDingId\": \"A5D83E673DC5A97F38D95F3E135C7824\",\n \"sendTime\": \"2026-06-12 22:08:36\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"5360613B1FC2389E8435CFABC57CC012\",\n \"sendTime\": \"2026-06-12 13:51:21\",\n \"senderNick\": \"鱼非\"\n },\n {\n \"openDingId\": \"3AB6395324A62CB2B4B513D0A02F67FA\",\n \"sendTime\": \"2026-06-11 11:23:39\",\n \"senderNick\": \"徐潇扬\"\n },\n {\n \"openDingId\": \"FB9FB2808D6ADF7464F5F1ACBA8A6704\",\n \"sendTime\": \"2026-06-11 09:51:55\",\n \"senderNick\": \"徐潇扬\"\n },\n {\n \"openDingId\": \"4D094E702716D4A46015CDC12B8F216B\",\n \"sendTime\": \"2026-06-10 22:04:05\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"74E2B3EB36EE99E6D88744F6B2C4C265\",\n \"sendTime\": \"2026-06-10 18:14:48\",\n \"senderNick\": \"古榕\"\n },\n {\n \"openDingId\": \"CAEF5614C47B65CDF10AED44BDFC7D9F\",\n \"sendTime\": \"2026-06-10 16:02:42\",\n \"senderNick\": \"徐潇扬\"\n },\n {\n \"openDingId\": \"F2C3A0F51AC502E84AECB932C227AAED\",\n \"sendTime\": \"2026-06-09 17:43:20\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"8AB2C3B891D931D8D650D41CA6205BCE\",\n \"sendTime\": \"2026-06-09 15:50:23\",\n \"senderNick\": \"可菡\"\n },\n {\n \"openDingId\": \"0456CE6A50FD2902B68D772DA37A96BC\",\n \"sendTime\": \"2026-06-09 09:45:43\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"6CB0E9E1D2CC344CB9217C97550BC6C6\",\n \"sendTime\": \"2026-06-08 21:42:37\",\n \"senderNick\": \"林弈\"\n },\n {\n \"openDingId\": \"0DEFB0942003A059C230BE1D262CAC8C\",\n \"sendTime\": \"2026-06-08 21:27:39\",\n \"senderNick\": \"林弈\"\n },\n {\n \"openDingId\": \"6B600C709E7468700F208B5DBB7ED888\",\n \"sendTime\": \"2026-06-08 15:42:05\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"B3502CC153C09A27AADE63A0BDF94C4A\",\n \"sendTime\": \"2026-06-05 17:38:44\",\n \"senderNick\": \"慧德\"\n },\n {\n \"openDingId\": \"07EC05F3E019605304D3C8216C6F7A32\",\n \"sendTime\": \"2026-06-05 17:19:52\",\n \"senderNick\": \"弈宇(Alpha)\"\n },\n {\n \"openDingId\": \"1C25016699ADE6DE66C6C9ECAE8C83B2\",\n \"sendTime\": \"2026-06-05 14:46:54\",\n \"senderNick\": \"弈宇(Alpha)\"\n },\n {\n \"openDingId\": \"AF79C95530607985A95866F7DE45F45E\",\n \"sendTime\": \"2026-06-05 14:39:48\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"4BFEE560E26AA24C1966A4D6EB722B89\",\n \"sendTime\": \"2026-06-05 09:28:42\",\n \"senderNick\": \"慧德\"\n },\n {\n \"openDingId\": \"B7F170045D3C6CC9D37DE356276BF084\",\n \"sendTime\": \"2026-06-04 23:07:57\",\n \"senderNick\": \"念晨\"\n },\n {\n \"openDingId\": \"A04A3D9659BD8FBDCF0C5E28EB2314F7\",\n \"sendTime\": \"2026-06-04 17:30:21\",\n \"senderNick\": \"念晨\"\n }\n ],\n \"hasMore\": true,\n \"nextCursor\": 1780565411433\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1459 + }, + { + "service": "doc", + "command": "+comment-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +comment-list --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --limit 10 --type global --yes --format json", + "args": [ + "doc", + "+comment-list", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--limit", + "10", + "--type", + "global", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"commentList\": [\n {\n \"commentKey\": \"1784082136009b316ba6c48ad41ad92a8b6905406a17c\",\n \"content\": \"DWS shortcut 真实测试 20260715:验证 doc +comment-create,可忽略。\",\n \"createTime\": 1784082136009,\n \"isGlobal\": true,\n \"isSolved\": false,\n \"quote\": null,\n \"updateTime\": 1784082136009\n },\n {\n \"commentKey\": \"1784082170012979f5c547f7a49e88a6c1dd718bbb304\",\n \"content\": \"DWS shortcut 真实测试 20260715:验证 doc +comment-reply,可忽略。\",\n \"createTime\": 1784082170012,\n \"isGlobal\": true,\n \"isSolved\": false,\n \"quote\": null,\n \"updateTime\": 1784082170012\n }\n ],\n \"hasMore\": false,\n \"logId\": \"213ee25c17840994077796280e0923\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2579 + }, + { + "service": "doc", + "command": "+export-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +export-get --job-id 29346731713 --yes --format json", + "args": [ + "doc", + "+export-get", + "--job-id", + "29346731713", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"downloadUrl\": \"[REDACTED_OSS_URL]\",\n \"jobId\": \"29346731713\",\n \"logId\": \"2132f5ca17840994092582121e08d9\",\n \"message\": \"Export job completed. The file is ready for download via the downloadUrl.\",\n \"status\": \"success\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1379 + }, + { + "service": "doc", + "command": "+export-submit", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +export-submit --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --export-format docx --yes --format json", + "args": [ + "doc", + "+export-submit", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--export-format", + "docx", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"jobId\": \"29346731713\",\n \"logId\": \"2132f5ca17840994104887005e08d8\",\n \"message\": \"Export job submitted successfully. Use query_export_job with jobId '29346731713' to check the export status and get the download link.\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1573 + }, + { + "service": "doc", + "command": "+find-doc", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +find-doc --query '测试' --limit 10 --yes --format json", + "args": [ + "doc", + "+find-doc", + "--query", + "测试", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 10,\n \"documents\": [\n {\n \"title\": \"DWS shortcut 真实测试文档 20260715\",\n \"token\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space\"\n },\n {\n \"title\": \"🧪测试 工作区目录扫描 - 2026-04-27 21:27:03\",\n \"token\": \"yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space\"\n },\n {\n \"title\": \"文件扫描测试 -20260414\",\n \"token\": \"3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space\"\n },\n {\n \"title\": \"文件扫描测试(25)\",\n \"token\": \"QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space\"\n },\n {\n \"title\": \"文件扫描测试(5)\",\n \"token\": \"Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space\"\n },\n {\n \"title\": \"文件扫描测试(24)\",\n \"token\": \"OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space\"\n },\n {\n \"title\": \"文件扫描测试(22)\",\n \"token\": \"OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space\"\n },\n {\n \"title\": \"文件扫描测试(26)(2)\",\n \"token\": \"l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space\"\n },\n {\n \"title\": \"悟空DWS全部测试账号信息\",\n \"token\": \"X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space\"\n },\n {\n \"title\": \"测试\",\n \"token\": \"1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE\",\n \"type\": \"\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2146 + }, + { + "service": "doc", + "command": "+list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +list --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --limit 10 --yes --format json", + "args": [ + "doc", + "+list", + "--folder", + "Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 10,\n \"nodes\": [\n {\n \"name\": \"DWS shortcut 真实测试文档 20260715(2)\",\n \"nodeId\": \"np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l?utm_scene=person_space\"\n },\n {\n \"name\": \"DWS shortcut 真实测试文档 20260715\",\n \"nodeId\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space\"\n },\n {\n \"name\": \"DWS shortcut 真实测试文档 20260715(1)\",\n \"nodeId\": \"7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3?utm_scene=person_space\"\n },\n {\n \"name\": \"知识库对接调研问卷-供各业务系统填写\",\n \"nodeId\": \"R4GpnMqJzOP0oLp6skZ0Kmvp8Ke0xjE3\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/R4GpnMqJzOP0oLp6skZ0Kmvp8Ke0xjE3?utm_scene=person_space\"\n },\n {\n \"name\": \"无标题文档(2)\",\n \"nodeId\": \"X6GRezwJlYxMoDeBsgX95gYj8dqbropQ\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsgX95gYj8dqbropQ?utm_scene=person_space\"\n },\n {\n \"name\": \"hi\",\n \"nodeId\": \"1zknDm0WRz0NZeXQu01lGOdmWBQEx5rG\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/1zknDm0WRz0NZeXQu01lGOdmWBQEx5rG?utm_scene=person_space\"\n },\n {\n \"name\": \"T(2)\",\n \"nodeId\": \"dxXB52LJqwZrolvyFKLy25D9WqjMp697\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/dxXB52LJqwZrolvyFKLy25D9WqjMp697?utm_scene=person_space\"\n },\n {\n \"name\": \"T(1)\",\n \"nodeId\": \"mweZ92PV6O36dZbnsML6RyaAJxEKBD6p\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/mweZ92PV6O36dZbnsML6RyaAJxEKBD6p?utm_scene=person_space\"\n },\n {\n \"name\": \"T\",\n \"nodeId\": \"4lgGw3P8vwYmoljyFg90Z2X9W5daZ90D\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/4lgGw3P8vwYmoljyFg90Z2X9W5daZ90D?utm_scene=person_space\"\n },\n {\n \"name\": \"念晨与hugozhu的会话 2026年06月22日\",\n \"nodeId\": \"GZLxjv9VGGDA9Ro2u6yKZ7BxV6EDybno\",\n \"nodeType\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/GZLxjv9VGGDA9Ro2u6yKZ7BxV6EDybno?utm_scene=person_space\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2075 + }, + { + "service": "doc", + "command": "+search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +search --query '测试' --limit 10 --cursor 0 --yes --format json", + "args": [ + "doc", + "+search", + "--query", + "测试", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 10,\n \"documents\": [\n {\n \"docType\": \"adoc\",\n \"modifiedTime\": null,\n \"name\": \"DWS shortcut 真实测试文档 20260715\",\n \"nodeId\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space\"\n },\n {\n \"docType\": \"able\",\n \"modifiedTime\": null,\n \"name\": \"🧪测试 工作区目录扫描 - 2026-04-27 21:27:03\",\n \"nodeId\": \"yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space\"\n },\n {\n \"docType\": \"able\",\n \"modifiedTime\": null,\n \"name\": \"文件扫描测试 -20260414\",\n \"nodeId\": \"3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space\"\n },\n {\n \"docType\": \"able\",\n \"modifiedTime\": null,\n \"name\": \"文件扫描测试(25)\",\n \"nodeId\": \"QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space\"\n },\n {\n \"docType\": \"able\",\n \"modifiedTime\": null,\n \"name\": \"文件扫描测试(5)\",\n \"nodeId\": \"Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space\"\n },\n {\n \"docType\": \"able\",\n \"modifiedTime\": null,\n \"name\": \"文件扫描测试(24)\",\n \"nodeId\": \"OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space\"\n },\n {\n \"docType\": \"able\",\n \"modifiedTime\": null,\n \"name\": \"文件扫描测试(22)\",\n \"nodeId\": \"OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space\"\n },\n {\n \"docType\": \"able\",\n \"modifiedTime\": null,\n \"name\": \"文件扫描测试(26)(2)\",\n \"nodeId\": \"l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space\"\n },\n {\n \"docType\": \"adoc\",\n \"modifiedTime\": null,\n \"name\": \"悟空DWS全部测试账号信息\",\n \"nodeId\": \"X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space\"\n },\n {\n \"docType\": \"folder\",\n \"modifiedTime\": null,\n \"name\": \"测试\",\n \"nodeId\": \"1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1911 + }, + { + "service": "doc", + "command": "+template-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +template-list --source MY --limit 10 --cursor 0 --yes --format json", + "args": [ + "doc", + "+template-list", + "--source", + "MY", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"hasMore\": false,\n \"logId\": \"213ee25c17840994183018652e08e2\",\n \"message\": \"成功获取 3 个模版。\",\n \"success\": true,\n \"templates\": [\n {\n \"coverUrl\": \"[REDACTED_OSS_URL]\",\n \"description\": null,\n \"templateId\": \"494040872345\",\n \"title\": \"接口定义模版v1.0\",\n \"usedCount\": null\n },\n {\n \"coverUrl\": \"[REDACTED_OSS_URL]\",\n \"description\": null,\n \"templateId\": \"494801282345\",\n \"title\": \"接口定义与描述模版\",\n \"usedCount\": null\n },\n {\n \"coverUrl\": \"[REDACTED_OSS_URL]\",\n \"description\": null,\n \"templateId\": \"111001402345\",\n \"title\": \"2023届钉钉音视频春招海报\",\n \"usedCount\": null\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1370 + }, + { + "service": "doc", + "command": "+template-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +template-search --query '测试' --source MY --limit 10 --cursor 0 --yes --format json", + "args": [ + "doc", + "+template-search", + "--query", + "测试", + "--source", + "MY", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"hasMore\": false,\n \"logId\": \"213ee25c17840994199004331e08a0\",\n \"message\": \"未找到与「测试」相关的模版,请尝试其他关键词。\",\n \"success\": true,\n \"templates\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1576 + }, + { + "service": "doc", + "command": "+version-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +version-list --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --limit 10 --cursor 0 --yes --format json", + "args": [ + "doc", + "+version-list", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"hasMore\": false,\n \"success\": true,\n \"versions\": [\n {\n \"createTime\": \"2026-07-15T10:21:47+08:00\",\n \"type\": \"AUTO_SAVE\",\n \"updateTime\": \"2026-07-15T10:21:47+08:00\",\n \"userId\": \"202397\",\n \"version\": 0\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2069 + }, + { + "service": "drive", + "command": "+find-file", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test drive +find-file --query '测试' --yes --format json", + "args": [ + "drive", + "+find-file", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"files\": [\n {\n \"dentryId\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"fileSize\": 0,\n \"name\": \"DWS shortcut 真实测试文档 20260715\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r\",\n \"fileSize\": 0,\n \"name\": \"🧪测试 工作区目录扫描 - 2026-04-27 21:27:03\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm\",\n \"fileSize\": 0,\n \"name\": \"文件扫描测试 -20260414\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N\",\n \"fileSize\": 0,\n \"name\": \"文件扫描测试(25)\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq\",\n \"fileSize\": 0,\n \"name\": \"文件扫描测试(5)\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4\",\n \"fileSize\": 0,\n \"name\": \"文件扫描测试(24)\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4\",\n \"fileSize\": 0,\n \"name\": \"文件扫描测试(22)\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4\",\n \"fileSize\": 0,\n \"name\": \"文件扫描测试(26)(2)\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l\",\n \"fileSize\": 0,\n \"name\": \"DWS shortcut 真实测试文档 20260715(2)\",\n \"type\": \"ALIDOC\"\n },\n {\n \"dentryId\": \"7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3\",\n \"fileSize\": 0,\n \"name\": \"DWS shortcut 真实测试文档 20260715(1)\",\n \"type\": \"ALIDOC\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1913 + }, + { + "service": "drive", + "command": "+info", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test drive +info --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --space-id 1 --yes --format json", + "args": [ + "drive", + "+info", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--space-id", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"createTime\": 1784082107000,\n \"dentryId\": \"228840832141\",\n \"docUrl\": \"https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"extension\": \"adoc\",\n \"fileId\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"fileSize\": 0,\n \"message\": \"该文件属于钉钉文档(在线文档/表格/脑图等),通过钉盘接口获取的元数据(如文件名称)可能不准确。建议使用钉钉文档相关接口获取更准确的文档信息。\",\n \"modifyTime\": 1784082137000,\n \"name\": \"7691256802.adoc\",\n \"path\": \"/6342122716/7691256801/7691256802.adoc\",\n \"status\": \"NORMAL\",\n \"type\": \"ALIDOC\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2605 + }, + { + "service": "drive", + "command": "+recent", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test drive +recent --operate-type 1 --creator-type 1 --limit 10 --cursor 0 --yes --format json", + "args": [ + "drive", + "+recent", + "--operate-type", + "1", + "--creator-type", + "1", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"hasMore\": false,\n \"items\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2087 + }, + { + "service": "drive", + "command": "+search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test drive +search --query '测试' --target file --file-types alidoc --extensions x --creator-uids x --created-from 1 --created-to 1 --modified-from 1 --modified-to 1 --limit 10 --cursor 0 --yes --format json", + "args": [ + "drive", + "+search", + "--query", + "测试", + "--target", + "file", + "--file-types", + "alidoc", + "--extensions", + "x", + "--creator-uids", + "x", + "--created-from", + "1", + "--created-to", + "1", + "--modified-from", + "1", + "--modified-to", + "1", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"files\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2091 + }, + { + "service": "drive", + "command": "+search-docs", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test drive +search-docs --query '测试' --limit 10 --yes --format json", + "args": [ + "drive", + "+search-docs", + "--query", + "测试", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 10,\n \"docs\": [\n {\n \"name\": \"DWS shortcut 真实测试文档 20260715\",\n \"nodeId\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO?utm_scene=person_space\"\n },\n {\n \"name\": \"🧪测试 工作区目录扫描 - 2026-04-27 21:27:03\",\n \"nodeId\": \"yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/yQod3RxJKQz4jm9xS4kw7dnmWkb4Mw9r?utm_scene=person_space\"\n },\n {\n \"name\": \"文件扫描测试 -20260414\",\n \"nodeId\": \"3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/3NwLYZXWyrmRolXLcZ7QaMDkVkyEqBQm?utm_scene=person_space\"\n },\n {\n \"name\": \"文件扫描测试(25)\",\n \"nodeId\": \"QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/QPGYqjpJYRyab0nxsZ7a9L5R8akx1Z5N?utm_scene=person_space\"\n },\n {\n \"name\": \"文件扫描测试(5)\",\n \"nodeId\": \"Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/Exel2BLV5gOAdXr1umNwXGBA8gk9rpMq?utm_scene=person_space\"\n },\n {\n \"name\": \"文件扫描测试(24)\",\n \"nodeId\": \"OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzqYlPzmJzN67Mw4?utm_scene=person_space\"\n },\n {\n \"name\": \"文件扫描测试(22)\",\n \"nodeId\": \"OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/OG9lyrgJPL7M2ONQSzQ4k0bRJzN67Mw4?utm_scene=person_space\"\n },\n {\n \"name\": \"文件扫描测试(26)(2)\",\n \"nodeId\": \"l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/l6Pm2Db8DQyAKmGkS90GX4ndWxLq0Ee4?utm_scene=person_space\"\n },\n {\n \"name\": \"悟空DWS全部测试账号信息\",\n \"nodeId\": \"X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ\",\n \"type\": \"file\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/X6GRezwJlYxMoDeBsQkxqNQ38dqbropQ?utm_scene=team_space\"\n },\n {\n \"name\": \"测试\",\n \"nodeId\": \"1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE\",\n \"type\": \"folder\",\n \"url\": \"https://alidocs.dingtalk.com/i/nodes/1OQX0akWmBejogd0TvQ7oN4oVGlDd3mE?utm_scene=team_space\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2507 + }, + { + "service": "mail", + "command": "+contact-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +contact-list --email xinyang.dxy@alibaba-inc.com --limit 10 --cursor '' --yes --format json", + "args": [ + "mail", + "+contact-list", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--limit", + "10", + "--cursor", + "", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"contacts\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3284 + }, + { + "service": "mail", + "command": "+find-mail-user", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +find-mail-user --query '董鑫阳' --limit 10 --yes --format json", + "args": [ + "mail", + "+find-mail-user", + "--query", + "董鑫阳", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 1,\n \"users\": [\n {\n \"email\": \"xinyang.dxy@alibaba-inc.com\",\n \"employeeNo\": \"202397\",\n \"id\": \"----.l------oBfPl:0:----HI-----HWk9nI\",\n \"jobTitle\": \"\",\n \"name\": \"董鑫阳\",\n \"nickname\": \"念晨\",\n \"workLocation\": \"浙江-杭州\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3666 + }, + { + "service": "mail", + "command": "+folder-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +folder-list --email xinyang.dxy@alibaba-inc.com --folder 2 --yes --format json", + "args": [ + "mail", + "+folder-list", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--folder", + "2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"folders\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3643 + }, + { + "service": "mail", + "command": "+recent-mail", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +recent-mail --limit 10 --email xinyang.dxy@alibaba-inc.com --folder 2 --yes --format json", + "args": [ + "mail", + "+recent-mail", + "--limit", + "10", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--folder", + "2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 10,\n \"mails\": [\n {\n \"date\": \"2026-07-15T06:37:28Z\",\n \"from\": [\n \"work@alibaba-inc.com\"\n ],\n \"subject\": \"牛康佳(随风)的数据权限申请流程 / NIU, Kangjia's apply data permission \",\n \"threadId\": \"DzzzzyJeBJL---.iLmnRnm\"\n },\n {\n \"date\": \"2026-07-15T06:35:49Z\",\n \"from\": [\n \"work@alibaba-inc.com\"\n ],\n \"subject\": \"changefree:diamond应用【albert-agent-2】变更 \",\n \"threadId\": \"DzzzzyJo3ZK---.hyYf9dO\"\n },\n {\n \"date\": \"2026-07-15T06:00:39Z\",\n \"from\": [\n \"安全服务中心 \"\n ],\n \"subject\": \"您的名下有1个风险尚未修复,请立即修复! You have 1 vulnerabilities that have not been fixed, please fix them as soon as possible!\",\n \"threadId\": \"DzzzzyKaAwA---.g643XXa\"\n },\n {\n \"date\": \"2026-07-15T05:48:41Z\",\n \"from\": [\n \"aone@alibaba-inc.com \"\n ],\n \"subject\": \"[Aone]应用albert-agent-2预发发布成功\",\n \"threadId\": \"DzzzzyJi7OS---.iCFAI0A\"\n },\n {\n \"date\": \"2026-07-15T02:54:00Z\",\n \"from\": [\n \"work@alibaba-inc.com\"\n ],\n \"subject\": \"代成俊(璟琦)的数据权限申请流程 / DAI, Chengjun's apply data permission \",\n \"threadId\": \"DzzzzyKTIMD---.gOEBekI\"\n },\n {\n \"date\": \"2026-07-15T02:51:12Z\",\n \"from\": [\n \"work@alibaba-inc.com\"\n ],\n \"subject\": \"陈梦媛(星莫)的数据权限申请流程 / CHEN, Mengyuan's apply data permission \",\n \"threadId\": \"DzzzzyKIHke---.goV93L.\"\n },\n {\n \"date\": \"2026-07-15T02:06:21Z\",\n \"from\": [\n \"dingtalk_recruitment@alibaba-inc.com\"\n ],\n \"subject\": \"【校招】简历即将超期/[Campus Recruitment] Resumes Are About to Expire\",\n \"threadId\": \"DzzzzyJjBhI---.i911RPE\"\n },\n {\n \"date\": \"2026-07-15T02:00:05Z\",\n \"from\": [\n \"dingtalk_recruitment@alibaba-inc.com\"\n ],\n \"subject\": \"【校招】2026-07-15 面试邀约任务通知/【Campus Recruitment】 2026-07-15 Interview Invitation Task Notice\",\n \"threadId\": \"DzzzzyJeFNO---.iLVkwOD\"\n },\n {\n \"date\": \"2026-07-15T01:42:44Z\",\n \"from\": [\n \"ATA技小蜜 \"\n ],\n \"subject\": \"【ATA每日精选】【天猫数字分身】(上篇) - AI Native 组织协作与研发的暗物质\",\n \"threadId\": \"DzzzzyJeFdf---.iLWDlI4\"\n },\n {\n \"date\": \"2026-07-14T18:24:45Z\",\n \"from\": [\n \"postmaster@alibaba-inc.com\"\n ],\n \"subject\": \"垃圾邮件提醒2026年7月15日\",\n \"threadId\": \"DzzzzyJeM2G---.iLDMDRq\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2724 + }, + { + "service": "mail", + "command": "+search-mail", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +search-mail --query 'subject:测试' --email xinyang.dxy@alibaba-inc.com --size 10 --yes --format json", + "args": [ + "mail", + "+search-mail", + "--query", + "subject:测试", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--size", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"email\": \"xinyang.dxy@alibaba-inc.com\",\n \"messages\": [\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNklS\",\n \"subject\": \"[Aone]实验室[lippi-calladmin单元测试]的构建[#1723]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkml\",\n \"subject\": \"[Aone]实验室[mozi-engine-admin单元测试-Jacoco]的构建[#2611]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNknb\",\n \"subject\": \"[Aone]实验室[lippi-calladmin单元测试]的构建[#1646]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkoy\",\n \"subject\": \"[Aone]实验室[mozi-engine-admin单元测试-Jacoco]的构建[#2609]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkp.\",\n \"subject\": \"[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1498]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkp0\",\n \"subject\": \"[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1497]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkpJ\",\n \"subject\": \"[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1493]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkpL\",\n \"subject\": \"[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1492]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkph\",\n \"subject\": \"[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1491]失败\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkpj\",\n \"subject\": \"[Aone]实验室[mozi-channel-admin-单元测试]的构建[#1490]失败\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1985 + }, + { + "service": "mail", + "command": "+tag-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +tag-list --email xinyang.dxy@alibaba-inc.com --yes --format json", + "args": [ + "mail", + "+tag-list", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 3,\n \"tags\": [\n {\n \"id\": \"1\",\n \"name\": \"Flagged\",\n \"parentId\": \"0\"\n },\n {\n \"id\": \"2\",\n \"name\": \"Completed\",\n \"parentId\": \"0\"\n },\n {\n \"id\": \"3\",\n \"name\": \"task\",\n \"parentId\": \"0\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2606 + }, + { + "service": "mail", + "command": "+template-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +template-list --email xinyang.dxy@alibaba-inc.com --limit 10 --cursor '' --yes --format json", + "args": [ + "mail", + "+template-list", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--limit", + "10", + "--cursor", + "", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"templates\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3083 + }, + { + "service": "mail", + "command": "+thread-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +thread-list --email xinyang.dxy@alibaba-inc.com --folder 2 --limit 10 --cursor '' --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --ascending --yes --format json", + "args": [ + "mail", + "+thread-list", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--folder", + "2", + "--limit", + "10", + "--cursor", + "", + "--start", + "2026-07-16T10:00:00+08:00", + "--end", + "2026-07-16T11:00:00+08:00", + "--ascending", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"threads\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 6434 + }, + { + "service": "mail", + "command": "+unread-mail", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +unread-mail --email xinyang.dxy@alibaba-inc.com --size 10 --yes --format json", + "args": [ + "mail", + "+unread-mail", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--size", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"email\": \"xinyang.dxy@alibaba-inc.com\",\n \"messages\": [\n {\n \"date\": null,\n \"from\": \"work@alibaba-inc.com\",\n \"messageId\": \"DzzzzzzNkk0\",\n \"subject\": \"牛康佳(随风)的数据权限申请流程 / NIU, Kangjia's apply data permission \"\n },\n {\n \"date\": null,\n \"from\": \"work@alibaba-inc.com\",\n \"messageId\": \"DzzzzzzNkk1\",\n \"subject\": \"changefree:diamond应用【albert-agent-2】变更 \"\n },\n {\n \"date\": null,\n \"from\": \"安全服务中心 \",\n \"messageId\": \"DzzzzzzNkk2\",\n \"subject\": \"您的名下有1个风险尚未修复,请立即修复! You have 1 vulnerabilities that have not been fixed, please fix them as soon as possible!\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkk3\",\n \"subject\": \"[Aone]应用albert-agent-2预发发布成功\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkk4\",\n \"subject\": \"[Aone]应用albert-agent-2预发发布成功\"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkk5\",\n \"subject\": \"[Aone]应用albert-agent-2预发发布成功\"\n },\n {\n \"date\": null,\n \"from\": \"work@alibaba-inc.com\",\n \"messageId\": \"DzzzzzzNkk6\",\n \"subject\": \"代成俊(璟琦)的数据权限申请流程 / DAI, Chengjun's apply data permission \"\n },\n {\n \"date\": null,\n \"from\": \"work@alibaba-inc.com\",\n \"messageId\": \"DzzzzzzNkk7\",\n \"subject\": \"陈梦媛(星莫)的数据权限申请流程 / CHEN, Mengyuan's apply data permission \"\n },\n {\n \"date\": null,\n \"from\": \"aone@alibaba-inc.com \",\n \"messageId\": \"DzzzzzzNkk8\",\n \"subject\": \"[Aone]应用albert-agent-2预发发布成功\"\n },\n {\n \"date\": null,\n \"from\": \"dingtalk_recruitment@alibaba-inc.com\",\n \"messageId\": \"DzzzzzzNkk9\",\n \"subject\": \"【校招】简历即将超期/[Campus Recruitment] Resumes Are About to Expire\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3469 + }, + { + "service": "mail", + "command": "+user-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test mail +user-search --keyword '董鑫阳' --employee-no 202397 --email xinyang.dxy@alibaba-inc.com --cursor '' --limit 10 --yes --format json", + "args": [ + "mail", + "+user-search", + "--keyword", + "董鑫阳", + "--employee-no", + "202397", + "--email", + "xinyang.dxy@alibaba-inc.com", + "--cursor", + "", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 1,\n \"users\": [\n {\n \"email\": \"xinyang.dxy@alibaba-inc.com\",\n \"employeeNo\": \"202397\",\n \"name\": \"董鑫阳\",\n \"userId\": \"----.l------oBfPl:0:----HI-----HWk9nI\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2836 + }, + { + "service": "minutes", + "command": "+detail", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test minutes +detail --id DWSREALREADNOSUCHID0000000000000 --artifacts basic --direction older --yes --format json", + "args": [ + "minutes", + "+detail", + "--id", + "DWSREALREADNOSUCHID0000000000000", + "--artifacts", + "basic", + "--direction", + "older", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"basic\": {\n \"error\": \"[UNCLASSIFIED] taskUuid is invalid\\n hint: Use --verbose for detailed error logs\"\n },\n \"taskUuid\": \"DWSREALREADNOSUCHID0000000000000\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2608 + }, + { + "service": "minutes", + "command": "+list-all", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test minutes +list-all --query '测试' --limit 10 --cursor 0 --yes --format json", + "args": [ + "minutes", + "+list-all", + "--query", + "测试", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"minutes\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 23790 + }, + { + "service": "minutes", + "command": "+list-mine", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test minutes +list-mine --query '测试' --limit 10 --cursor 0 --yes --format json", + "args": [ + "minutes", + "+list-mine", + "--query", + "测试", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"minutes\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 27516 + }, + { + "service": "oa", + "command": "+list-cc", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test oa +list-cc --page 1 --limit 10 --query '测试' --yes --format json", + "args": [ + "oa", + "+list-cc", + "--page", + "1", + "--limit", + "10", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"instances\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 8468 + }, + { + "service": "oa", + "command": "+list-executed", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test oa +list-executed --page 1 --limit 10 --query '测试' --yes --format json", + "args": [ + "oa", + "+list-executed", + "--page", + "1", + "--limit", + "10", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"instances\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 29589 + }, + { + "service": "oa", + "command": "+list-forms", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test oa +list-forms --cursor 0 --limit 10 --yes --format json", + "args": [ + "oa", + "+list-forms", + "--cursor", + "0", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"forms\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 25611 + }, + { + "service": "oa", + "command": "+list-pending", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test oa +list-pending --start 1783494851348 --end 1784099651348 --page 1 --limit 10 --query '测试' --yes --format json", + "args": [ + "oa", + "+list-pending", + "--start", + "1783494851348", + "--end", + "1784099651348", + "--page", + "1", + "--limit", + "10", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"instances\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 8328 + }, + { + "service": "oa", + "command": "+list-submitted", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test oa +list-submitted --page 1 --limit 10 --query '测试' --yes --format json", + "args": [ + "oa", + "+list-submitted", + "--page", + "1", + "--limit", + "10", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"instances\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 12793 + }, + { + "service": "oa", + "command": "+my-initiated", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test oa +my-initiated --query '测试' --page 1 --limit 10 --yes --format json", + "args": [ + "oa", + "+my-initiated", + "--query", + "测试", + "--page", + "1", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"result\": {\n \"values\": []\n },\n \"success\": \"true\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3564 + }, + { + "service": "oa", + "command": "+search-forms", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test oa +search-forms --query '测试' --yes --format json", + "args": [ + "oa", + "+search-forms", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"forms\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1759 + }, + { + "service": "report", + "command": "+inbox-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test report +inbox-list --start 2026-07-08T15:14:39+08:00 --end 2026-07-15T15:14:39+08:00 --cursor 0 --size 1 --sender-user-ids x --yes --format json", + "args": [ + "report", + "+inbox-list", + "--start", + "2026-07-08T15:14:39+08:00", + "--end", + "2026-07-15T15:14:39+08:00", + "--cursor", + "0", + "--size", + "1", + "--sender-user-ids", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"reports\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2130 + }, + { + "service": "report", + "command": "+outbox-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test report +outbox-list --cursor 0 --size 1 --start 2026-07-08T15:14:41+08:00 --end 2026-07-15T15:14:41+08:00 --modified-start 2026-07-08T15:14:41+08:00 --modified-end 2026-07-15T15:14:41+08:00 --yes --format json", + "args": [ + "report", + "+outbox-list", + "--cursor", + "0", + "--size", + "1", + "--start", + "2026-07-08T15:14:41+08:00", + "--end", + "2026-07-15T15:14:41+08:00", + "--modified-start", + "2026-07-08T15:14:41+08:00", + "--modified-end", + "2026-07-15T15:14:41+08:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"reports\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1584 + }, + { + "service": "sheet", + "command": "+read", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test sheet +read --node DWSREALREADNOSUCHID0000000000000 --sheet-id x --range x --value-render-option formatted_value --yes --format json", + "args": [ + "sheet", + "+read", + "--node", + "DWSREALREADNOSUCHID0000000000000", + "--sheet-id", + "x", + "--range", + "x", + "--value-render-option", + "formatted_value", + "--yes", + "--format", + "json" + ], + "stdout": "null", + "stderr": "", + "exit_code": 0, + "duration_ms": 1589 + }, + { + "service": "todo", + "command": "+created-todos", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +created-todos --yes --format json", + "args": [ + "todo", + "+created-todos", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"created\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1733 + }, + { + "service": "todo", + "command": "+get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +get --task-id 55119034912 --yes --format json", + "args": [ + "todo", + "+get", + "--task-id", + "55119034912", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"todoDetailModel\": {\n \"activities\": [\n {\n \"action\": \"task.self.done\",\n \"activityId\": \"14314572403\",\n \"creatorId\": 5255888716\n },\n {\n \"action\": \"task.create\",\n \"activityId\": \"14178655650\",\n \"creatorId\": 2669375904\n }\n ],\n \"bizTag\": \"tb_group_task\",\n \"createdTime\": 1784017216974,\n \"creatorId\": \"2669375904\",\n \"creatorInfo\": {\n \"name\": \"李龙\",\n \"nick\": \"粤腾\",\n \"userId\": 2669375904\n },\n \"detailUrl\": {\n \"appUrl\": \"https://n.dingtalk.com/dingding/dd-todo/detail/index.html?dd_darkmode=true\\u0026android_scroll=false\\u0026dd_mini_app_id=5000000004746689\\u0026dt_editor=true\\u0026dd_full_screen=true\\u0026showmenu=false\\u0026dd_progress=false\\u0026dd_amplify=false\\u0026newPage=true\\u0026at_iframe=1\\u0026from=homePage\\u0026taskId=55119034912\\u0026bizTag=tb_group_task\\u0026cid=75985350515#/detail\",\n \"pcUrl\": \"https://n.dingtalk.com/dingding/dd-todo/detail/index.html?dd_darkmode=true\\u0026android_scroll=false\\u0026dd_mini_app_id=5000000004746689\\u0026dt_editor=true\\u0026dd_full_screen=true\\u0026showmenu=false\\u0026dd_progress=false\\u0026dd_amplify=false\\u0026newPage=true\\u0026at_iframe=1\\u0026from=homePage\\u0026taskId=55119034912\\u0026bizTag=tb_group_task\\u0026cid=75985350515#/detail\"\n },\n \"dueTime\": 1784044740651,\n \"executorIds\": [\n \"41129894\",\n \"5255888716\",\n \"447869\",\n \"512653609\",\n \"2669375904\"\n ],\n \"executorInfos\": [\n {\n \"name\": \"梓寻\",\n \"nick\": \"梓寻\",\n \"userId\": 41129894\n },\n {\n \"name\": \"陈绪\",\n \"nick\": \"陈叙\",\n \"userId\": 5255888716\n },\n {\n \"name\": \"徐洪鑫\",\n \"nick\": \"崇幻\",\n \"userId\": 447869\n },\n {\n \"name\": \"董鑫阳\",\n \"nick\": \"念晨\",\n \"userId\": 512653609\n },\n {\n \"name\": \"李龙\",\n \"nick\": \"粤腾\",\n \"userId\": 2669375904\n }\n ],\n \"finishTime\": 0,\n \"isDone\": false,\n \"modifiedTime\": 1784017216974,\n \"modifierId\": \"2669375904\",\n \"orgId\": 439446171,\n \"participantIds\": [\n \"41129894\",\n \"5255888716\",\n \"447869\",\n \"512653609\",\n \"2669375904\"\n ],\n \"participantInfos\": [\n {\n \"name\": \"梓寻\",\n \"nick\": \"梓寻\",\n \"userId\": 41129894\n },\n {\n \"name\": \"陈绪\",\n \"nick\": \"陈叙\",\n \"userId\": 5255888716\n },\n {\n \"name\": \"徐洪鑫\",\n \"nick\": \"崇幻\",\n \"userId\": 447869\n },\n {\n \"name\": \"董鑫阳\",\n \"nick\": \"念晨\",\n \"userId\": 512653609\n },\n {\n \"name\": \"李龙\",\n \"nick\": \"粤腾\",\n \"userId\": 2669375904\n }\n ],\n \"priority\": 20,\n \"source\": \"conversation\",\n \"subject\": \"中控Ai营销各Agent蓝图场景故事动线输出1-2页PPT\",\n \"taskId\": \"55119034912\",\n \"tenantId\": \"75985350515\",\n \"tenantType\": \"group\"\n }\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3658 + }, + { + "service": "todo", + "command": "+get-my-tasks", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +get-my-tasks --page 1 --size 10 --status false --priority x --role-types executor --plan-finish-start 1 --plan-finish-end 1 --yes --format json", + "args": [ + "todo", + "+get-my-tasks", + "--page", + "1", + "--size", + "10", + "--status", + "false", + "--priority", + "x", + "--role-types", + "executor", + "--plan-finish-start", + "1", + "--plan-finish-end", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"todos\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1475 + }, + { + "service": "todo", + "command": "+list-attachment", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +list-attachment --task-id 55119034912 --yes --format json", + "args": [ + "todo", + "+list-attachment", + "--task-id", + "55119034912", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"attachments\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3413 + }, + { + "service": "todo", + "command": "+list-comment", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +list-comment --task-id 55119034912 --page 1 --size 10 --yes --format json", + "args": [ + "todo", + "+list-comment", + "--task-id", + "55119034912", + "--page", + "1", + "--size", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"comments\": [],\n \"count\": 0\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2191 + }, + { + "service": "todo", + "command": "+list-sub", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +list-sub --task-id 55119034912 --yes --format json", + "args": [ + "todo", + "+list-sub", + "--task-id", + "55119034912", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"subTasks\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1940 + }, + { + "service": "todo", + "command": "+overdue", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +overdue --yes --format json", + "args": [ + "todo", + "+overdue", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"overdue\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1240 + }, + { + "service": "wiki", + "command": "+space-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test wiki +space-search --query '测试' --limit 10 --yes --format json", + "args": [ + "wiki", + "+space-search", + "--query", + "测试", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"spaces\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1951 + }, + { + "service": "aitable", + "command": "+base-get-primary-doc-id", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +base-get-primary-doc-id --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-id 1015oH3OXy --yes --format json", + "args": [ + "aitable", + "+base-get-primary-doc-id", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--record-id", + "1015oH3OXy", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"-1\\\",\\\"message\\\":\\\"no record\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to query cell doc for record 1015oH3OXy in table hERWDMS\\\",\\\"trace_id\\\":\\\"0b5deb3217840997466255627e08ee\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1929, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+chart-share-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +chart-share-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --dashboard-id KY9tlWg5NEHgfs8WT6IO2 --chart-id widget-dlxFo0tNSImp4ITpDn5fQ --yes --format json", + "args": [ + "aitable", + "+chart-share-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--dashboard-id", + "KY9tlWg5NEHgfs8WT6IO2", + "--chart-id", + "widget-dlxFo0tNSImp4ITpDn5fQ", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"403\\\",\\\"message\\\":\\\"Forbidden\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"AUTH_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to get chart share config for chart widget-dlxFo0tNSImp4ITpDn5fQ: [403] Forbidden\\\",\\\"trace_id\\\":\\\"2127d89817840997481396653e075d\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1584, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "aitable", + "command": "+dashboard-share-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +dashboard-share-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --dashboard-id KY9tlWg5NEHgfs8WT6IO2 --yes --format json", + "args": [ + "aitable", + "+dashboard-share-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--dashboard-id", + "KY9tlWg5NEHgfs8WT6IO2", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"404\\\",\\\"message\\\":\\\"Not Found\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to get dashboard share config for dashboard KY9tlWg5NEHgfs8WT6IO2\\\",\\\"trace_id\\\":\\\"0bb7c36217840997497315836e07fe\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1472, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "aitable", + "command": "+export-data", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +export-data --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --task-id DWSREALREADNOSUCHID0000000000000 --scope all --format excel --table-id hERWDMS --view-id qvGDAH2 --timeout-ms 1 --yes", + "args": [ + "aitable", + "+export-data", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--task-id", + "DWSREALREADNOSUCHID0000000000000", + "--scope", + "all", + "--format", + "excel", + "--table-id", + "hERWDMS", + "--view-id", + "qvGDAH2", + "--timeout-ms", + "1", + "--yes" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_PARAMS\\\",\\\"message\\\":\\\"taskId cannot be combined with scope, format, tableId or viewId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to continue export because taskId mode cannot include create-task params\\\",\\\"trace_id\\\":\\\"2104a64c17840997514714448e0817\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1754, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+record-primary-doc-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +record-primary-doc-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --table-id hERWDMS --record-id 1015oH3OXy --yes --format json", + "args": [ + "aitable", + "+record-primary-doc-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--table-id", + "hERWDMS", + "--record-id", + "1015oH3OXy", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"-1\\\",\\\"message\\\":\\\"no record\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to query cell doc for record 1015oH3OXy in table hERWDMS\\\",\\\"trace_id\\\":\\\"2127d89817840997528393730e079c\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1344, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+role-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +role-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --role-id x --yes --format json", + "args": [ + "aitable", + "+role-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--role-id", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_PARAMS\\\",\\\"message\\\":\\\"roleId is required\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to get role because roleId is missing\\\",\\\"trace_id\\\":\\\"2104a64c17840997542904838e0817\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1450, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+workflow-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +workflow-get --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --workflow-id DWSREALREADNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+workflow-get", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--workflow-id", + "DWSREALREADNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"GET_WORKFLOW_ERROR\\\",\\\"message\\\":\\\"调用远程服务业务异常\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to get workflow in base 'gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk' due to an unexpected error\\\",\\\"trace_id\\\":\\\"2104a64c17840997556363676e08ee\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1535, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+workflow-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +workflow-list --base-id gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk --limit 10 --offset 1 --yes --format json", + "args": [ + "aitable", + "+workflow-list", + "--base-id", + "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk", + "--limit", + "10", + "--offset", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"LIST_WORKFLOWS_ERROR\\\",\\\"message\\\":\\\"biz error\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to list workflows in base 'gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk' due to an unexpected error\\\",\\\"trace_id\\\":\\\"2127d89817840997572427879e075d\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1540, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "attendance", + "command": "+get-class", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +get-class --class-id 1 --yes --format json", + "args": [ + "attendance", + "+get-class", + "--class-id", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_class_detail)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"rule not found\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"2127d89817840997588238831e0757\"\n }\n}", + "exit_code": 1, + "duration_ms": 1492, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "attendance", + "command": "+get-global-setting", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +get-global-setting --setting-scene checkRemind --scope '企业' --yes --format json", + "args": [ + "attendance", + "+get-global-setting", + "--setting-scene", + "checkRemind", + "--scope", + "企业", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/query_global_setting)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"NO_PERMISSION\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"2104a64c17840997604718062e085e\"\n }\n}", + "exit_code": 1, + "duration_ms": 1635, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "attendance", + "command": "+get-group", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +get-group --group-id 1 --yes --format json", + "args": [ + "attendance", + "+get-group", + "--group-id", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_detail)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"rule not found\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"0b5deb3217840997620512305e08ef\"\n }\n}", + "exit_code": 1, + "duration_ms": 1568, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "attendance", + "command": "+get-group-filtered", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +get-group-filtered --group-id 1 --member --position --wifi --bles --yes --format json", + "args": [ + "attendance", + "+get-group-filtered", + "--group-id", + "1", + "--member", + "--position", + "--wifi", + "--bles", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_group_filtered_detail)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"rule not found\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"2104a64c17840997638062468e08c7\"\n }\n}", + "exit_code": 1, + "duration_ms": 1746, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "attendance", + "command": "+get-leave-balance", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +get-leave-balance --users 202397 --leave-code 731ed089-62ff-4734-a6c7-3c8fcc8294fc --yes --format json", + "args": [ + "attendance", + "+get-leave-balance", + "--users", + "202397", + "--leave-code", + "731ed089-62ff-4734-a6c7-3c8fcc8294fc", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 亲,假期类型没有余额 (operation: attendance-wukong/get_leave_balance_quota)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"2002\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"2104a64c17840997652901307e081a\"\n }\n}", + "exit_code": 1, + "duration_ms": 1479, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "attendance", + "command": "+list-report-columns", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +list-report-columns --yes --format json", + "args": [ + "attendance", + "+list-report-columns", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_report_columns)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"AUTH_ERROR\",\n \"server_key\": \"attendance-wukong\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"6001\\\",\\\"errorMsg\\\":\\\"无权限操作\\\"} \",\n \"trace_id\": \"2127d89817840997666188472e0756\"\n }\n}", + "exit_code": 1, + "duration_ms": 1351, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "attendance", + "command": "+query-report-leave", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +query-report-leave --users 202397 --leave-names '年假' --start '2026-07-15 10:00:00' --end '2026-07-15 16:00:00' --yes --format json", + "args": [ + "attendance", + "+query-report-leave", + "--users", + "202397", + "--leave-names", + "年假", + "--start", + "2026-07-15 10:00:00", + "--end", + "2026-07-15 16:00:00", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/get_leave_time_by_leave_names)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"AUTH_ERROR\",\n \"server_key\": \"attendance-wukong\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"6001\\\",\\\"errorMsg\\\":\\\"无权限操作\\\"} \",\n \"trace_id\": \"2104a64c17840997679973065e085f\"\n }\n}", + "exit_code": 1, + "duration_ms": 1373, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "calendar", + "command": "+find-room", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test calendar +find-room --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --yes --format json", + "args": [ + "calendar", + "+find-room", + "--start", + "2026-07-16T10:00:00+08:00", + "--end", + "2026-07-16T11:00:00+08:00", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"458019\",\n \"server_key\": \"calendar\",\n \"trace_id\": \"0bb7c36217840997694975303e0758\"\n }\n}", + "exit_code": 1, + "duration_ms": 1498, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "calendar", + "command": "+room-find", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test calendar +room-find --start 2026-07-16T10:00:00+08:00 --end 2026-07-16T11:00:00+08:00 --available --group-id x --room-name x --limit 10 --page 1 --yes --format json", + "args": [ + "calendar", + "+room-find", + "--start", + "2026-07-16T10:00:00+08:00", + "--end", + "2026-07-16T11:00:00+08:00", + "--available", + "--group-id", + "x", + "--room-name", + "x", + "--limit", + "10", + "--page", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 查询范围内的会议室数量,超过上限100,请选择更小范围的分组进行查询。 (operation: calendar/query_available_meeting_room)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"458019\",\n \"server_key\": \"calendar\",\n \"trace_id\": \"2104a64c17840997709913005e0819\"\n }\n}", + "exit_code": 1, + "duration_ms": 1504, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+category-list-conversations", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +category-list-conversations --category-id 1 --exclude-muted --yes --format json", + "args": [ + "chat", + "+category-list-conversations", + "--category-id", + "1", + "--exclude-muted", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] listConversationsByCategoryV2 error\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"0bb7c36217840997724375834e0758\"\n }\n}", + "exit_code": 1, + "duration_ms": 1445, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+chat-get-by-id", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-get-by-id --group-id 1 --yes --format json", + "args": [ + "chat", + "+chat-get-by-id", + "--group-id", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] verifyGroupId error: The group id does not exit (operation: im/get_conv_info_by_group_id)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840997739165535e07bd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1462, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+chat-members-get", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-members-get --id DWSREALREADNOSUCHID0000000000000 --users '冬翔' --yes --format json", + "args": [ + "chat", + "+chat-members-get", + "--id", + "DWSREALREADNOSUCHID0000000000000", + "--users", + "冬翔", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openCid or cid is required (operation: im/list_group_member_by_ids)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840997754345760e07bd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1518, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+chat-messages", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-messages --group cid3Jijzhe2aqs9ysOXjhi05g== --time '2026-07-15 10:00:00' --limit 10 --direction older --yes --format json", + "args": [ + "chat", + "+chat-messages", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--time", + "2026-07-15 10:00:00", + "--limit", + "10", + "--direction", + "older", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openCid or cid is required\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"chat\",\n \"trace_id\": \"2104a64c17840997767792656e085e\"\n }\n}", + "exit_code": 1, + "duration_ms": 1328, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+messages-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-list --group cid3Jijzhe2aqs9ysOXjhi05g== --time '2026-07-15 10:00:00' --forward --limit 10 --yes --format json", + "args": [ + "chat", + "+messages-list", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--time", + "2026-07-15 10:00:00", + "--forward", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openCid or cid is required\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"chat\",\n \"trace_id\": \"2127d89817840997797873841e0757\"\n }\n}", + "exit_code": 1, + "duration_ms": 1480, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+messages-resource-url", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-resource-url --type mediaId --resource-id x --message-id DWSREALREADNOSUCHID0000000000000 --open-conversation-id cid3Jijzhe2aqs9ysOXjhi05g== --yes --format json", + "args": [ + "chat", + "+messages-resource-url", + "--type", + "mediaId", + "--resource-id", + "x", + "--message-id", + "DWSREALREADNOSUCHID0000000000000", + "--open-conversation-id", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] failed to get download url for resourceId: x (operation: im/get_resource_download_url)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"RESOURCE_NOT_FOUND\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840997855423145e07dd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1264, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+search-msg", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +search-msg --group cid3Jijzhe2aqs9ysOXjhi05g== --query '测试' --days 7 --yes --format json", + "args": [ + "chat", + "+search-msg", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--query", + "测试", + "--days", + "7", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 当前用户暂无消息搜索权益,无法执行本次搜索。请提示用户开通消息搜索权益后重试。\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"SearchRightsDenied\",\n \"server_key\": \"chat\",\n \"trace_id\": \"0b5deb3217840997866824643e0853\"\n }\n}", + "exit_code": 1, + "duration_ms": 1519, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+thread-replies", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +thread-replies --group cid3Jijzhe2aqs9ysOXjhi05g== --topic-id x --time '2026-07-15 10:00:00' --limit 10 --yes --format json", + "args": [ + "chat", + "+thread-replies", + "--group", + "cid3Jijzhe2aqs9ysOXjhi05g==", + "--topic-id", + "x", + "--time", + "2026-07-15 10:00:00", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] failed to decrypt openConvThreadId\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"chat\",\n \"trace_id\": \"0b5deb3217840997883504915e0853\"\n }\n}", + "exit_code": 1, + "duration_ms": 1582, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "contact", + "command": "+get-roster", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test contact +get-roster --staff-id x --fields x --yes --format json", + "args": [ + "contact", + "+get-roster", + "--staff-id", + "x", + "--fields", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/get_authorized_emp_rosterInfo)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"2001\",\n \"server_key\": \"hrmregister\",\n \"trace_id\": \"2106d98117840997920166915e087b\"\n }\n}", + "exit_code": 1, + "duration_ms": 1895, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "contact", + "command": "+list-roster-fields", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test contact +list-roster-fields --yes --format json", + "args": [ + "contact", + "+list-roster-fields", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 操作人无花名册管理权限 (operation: hrmregister/list_authorized_roster_fields)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"2001\",\n \"server_key\": \"hrmregister\",\n \"trace_id\": \"213ee25c17840997934295673e08e2\"\n }\n}", + "exit_code": 1, + "duration_ms": 1305, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+credentials-get", + "risk": "read", + "method": "held; sensitive credential read", + "status": "held", + "input": "", + "args": [], + "stdout": "", + "stderr": "该命令会读取真实应用凭证/密钥;不能用真实 app 自动执行。当前仅用占位 ID 验证负向路径,真实成功需人工在安全环境单独确认。", + "exit_code": null, + "duration_ms": 0, + "failure_category": "held", + "fixability": "manual-approval", + "diagnosis": "高风险或无安全目标,需人工逐项授权后执行。" + }, + { + "service": "drive", + "command": "+download", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test drive +download --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --space-id 1 --yes --format json", + "args": [ + "drive", + "+download", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--space-id", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 该文件类型不支持通过 download_file 下载。download_file 仅支持普通文件(如 PDF、Word、Excel 等),不支持钉钉在线文档/表格/脑图等在线编辑类型。如需导出在线文档内容,请使用钉钉文档导出相关接口。 (operation: drive/download_file)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"invalidRequest.document.typeIllegal\",\n \"server_key\": \"drive\",\n \"trace_id\": \"0bab027317840997956923965e08c9\"\n }\n}", + "exit_code": 1, + "duration_ms": 1192, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "drive", + "command": "+list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test drive +list --space-id 1 --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --limit 10 --cursor 0 --order-by name --order asc --thumbnail --yes --format json", + "args": [ + "drive", + "+list", + "--space-id", + "1", + "--folder", + "Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ", + "--limit", + "10", + "--cursor", + "0", + "--order-by", + "name", + "--order", + "asc", + "--thumbnail", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] parentId 不属于指定的 spaceId,请确认 parentId 和 spaceId 属于同一个钉盘空间。\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"paramError\",\n \"server_key\": \"drive\",\n \"trace_id\": \"2106d98117840997968627612e087b\"\n }\n}", + "exit_code": 1, + "duration_ms": 1090, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "minutes", + "command": "+action-items", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test minutes +action-items --yes --format json", + "args": [ + "minutes", + "+action-items", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"暂无妙记\"\n }\n}", + "exit_code": 3, + "duration_ms": 1286, + "failure_category": "missing-real-minutes-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。" + }, + { + "service": "minutes", + "command": "+latest-minutes", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test minutes +latest-minutes --keyword '测试' --yes --format json", + "args": [ + "minutes", + "+latest-minutes", + "--keyword", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"暂无妙记\"\n }\n}", + "exit_code": 3, + "duration_ms": 8499, + "failure_category": "missing-real-minutes-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。" + }, + { + "service": "minutes", + "command": "+list-shared", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test minutes +list-shared --query '测试' --limit 10 --cursor 0 --yes --format json", + "args": [ + "minutes", + "+list-shared", + "--query", + "测试", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 0,\n \"minutes\": []\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1362 + }, + { + "service": "minutes", + "command": "+minutes-search", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test minutes +minutes-search --query '测试' --yes --format json", + "args": [ + "minutes", + "+minutes-search", + "--query", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"没搜到妙记\"\n }\n}", + "exit_code": 3, + "duration_ms": 1150, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "minutes", + "command": "+transcript", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test minutes +transcript --keyword '测试' --direction older --yes --format json", + "args": [ + "minutes", + "+transcript", + "--keyword", + "测试", + "--direction", + "older", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"暂无妙记\"\n }\n}", + "exit_code": 3, + "duration_ms": 1096, + "failure_category": "missing-real-minutes-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。" + }, + { + "service": "oa", + "command": "+done-approvals", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test oa +done-approvals --limit 10 --yes --format json", + "args": [ + "oa", + "+done-approvals", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"没有已处理的审批记录\"\n }\n}", + "exit_code": 3, + "duration_ms": 1244, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "oa", + "command": "+pending", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test oa +pending --limit 10 --yes --format json", + "args": [ + "oa", + "+pending", + "--limit", + "10", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"当前没有待我审批的任务\"\n }\n}", + "exit_code": 3, + "duration_ms": 1357, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "report", + "command": "+report-latest", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test report +report-latest --keyword '测试' --yes --format json", + "args": [ + "report", + "+report-latest", + "--keyword", + "测试", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"暂无日志\"\n }\n}", + "exit_code": 3, + "duration_ms": 1259, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "todo", + "command": "+due-today", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test todo +due-today --role-types executor --yes --format json", + "args": [ + "todo", + "+due-today", + "--role-types", + "executor", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"今天没有到期的待办\"\n }\n}", + "exit_code": 3, + "duration_ms": 1145, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "todo", + "command": "+related-tasks", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test todo +related-tasks --role-types executor --status false --yes --format json", + "args": [ + "todo", + "+related-tasks", + "--role-types", + "executor", + "--status", + "false", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"没有与你相关的待办(creator/executor/participant 三种角色下均为空)\"\n }\n}", + "exit_code": 3, + "duration_ms": 1122, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "wiki", + "command": "+node-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test wiki +node-list --workspace DWSREALREADNOSUCHID0000000000000 --folder DWSREALREADNOSUCHID0000000000000 --limit 10 --cursor 0 --yes --format json", + "args": [ + "wiki", + "+node-list", + "--workspace", + "DWSREALREADNOSUCHID0000000000000", + "--folder", + "DWSREALREADNOSUCHID0000000000000", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"wiki\",\n \"technical_detail\": \"PARAM_ERROR - 未找到指定工具\",\n \"trace_id\": \"2132f5ca17840998189126304e08d9\"\n }\n}", + "exit_code": 1, + "duration_ms": 1120, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "wiki", + "command": "+resolve-space", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test wiki +resolve-space --name 'DWS shortcut 真实测试' --yes --format json", + "args": [ + "wiki", + "+resolve-space", + "--name", + "DWS shortcut 真实测试", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"没有找到名称包含 DWS shortcut 真实测试 的知识空间\"\n }\n}", + "exit_code": 3, + "duration_ms": 1533, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "wiki", + "command": "+space-list", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test wiki +space-list --type ALL --limit 10 --cursor 0 --yes --format json", + "args": [ + "wiki", + "+space-list", + "--type", + "ALL", + "--limit", + "10", + "--cursor", + "0", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"参数 --type 取值 \\\"ALL\\\" 不合法,允许值:orgWikiSpace, myWikiSpace\"\n }\n}", + "exit_code": 3, + "duration_ms": 759, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+group-members", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +group-members --group '浅曦-kida,Dennis,秋画' --yes --format json", + "args": [ + "chat", + "+group-members", + "--group", + "浅曦-kida,Dennis,秋画", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 3,\n \"members\": [\n {\n \"name\": \"\",\n \"nick\": \"秋画\",\n \"openDingtalkId\": \"DpDC43OwfSyzvpshro641ZyKOpvhZI2tI\",\n \"role\": \"普通成员\"\n },\n {\n \"name\": \"\",\n \"nick\": \"浅曦\",\n \"openDingtalkId\": \"DiPbzolsu3XcIqiPOT4eDpd1MUBtiiFg6Xhx\",\n \"role\": \"群主\"\n },\n {\n \"name\": \"\",\n \"nick\": \"念晨\",\n \"openDingtalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"role\": \"普通成员\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1955 + }, + { + "service": "chat", + "command": "+messages-mget", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +messages-mget --msg-ids msgEuOor1PmFBNlx9M06N9z1Q== --yes --format json", + "args": [ + "chat", + "+messages-mget", + "--msg-ids", + "msgEuOor1PmFBNlx9M06N9z1Q==", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"messages\": [\n {\n \"content\": \"DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。\",\n \"createTime\": \"2026-07-15 11:01:34\",\n \"openConversationId\": \"cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=\",\n \"openMessageId\": \"msgEuOor1PmFBNlx9M06N9z1Q==\",\n \"sender\": \"念晨\",\n \"senderOpenDingTalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\"\n }\n ]\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1461 + }, + { + "service": "chat", + "command": "+messages-query-send-status", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +messages-query-send-status --open-task-id y/wM6Lo+9GbIqtILYPv1BZDcMW+2FgnqskgcpdOiMdM= --yes --format json", + "args": [ + "chat", + "+messages-query-send-status", + "--open-task-id", + "y/wM6Lo+9GbIqtILYPv1BZDcMW+2FgnqskgcpdOiMdM=", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"openConversationId\": \"cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=\",\n \"openMessageId\": \"msgEuOor1PmFBNlx9M06N9z1Q==\",\n \"sendStatus\": \"SUCCESS\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1312 + }, + { + "service": "chat", + "command": "+messages-read-status", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +messages-read-status --conversation-id cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI= --message-id msgEuOor1PmFBNlx9M06N9z1Q== --users '冬翔' --yes --format json", + "args": [ + "chat", + "+messages-read-status", + "--conversation-id", + "cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=", + "--message-id", + "msgEuOor1PmFBNlx9M06N9z1Q==", + "--users", + "冬翔", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"memberReadStatusList\": [\n {\n \"openDingTalkId\": \"DAdiiQDqzH1DEqiPOT4eDpd1MUBtiiFg6Xhx\",\n \"readStatus\": \"READ\",\n \"readTime\": \"2026-07-15 11:53:31\",\n \"userNick\": \"冬翔\"\n },\n {\n \"openDingTalkId\": \"D1jIqGatuH3UykpdYxJGSS1ug4rSiPJt8I\",\n \"readStatus\": \"READ\",\n \"readTime\": \"2026-07-15 11:01:35\",\n \"userNick\": \"念晨\"\n }\n ],\n \"messageStatus\": \"SUCCESS\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1376 + }, + { + "service": "ding", + "command": "+receiver-status", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test ding +receiver-status --ding-id 5D73E3AC29C780072D1CD56C6874ACC2 --yes --format json", + "args": [ + "ding", + "+receiver-status", + "--ding-id", + "5D73E3AC29C780072D1CD56C6874ACC2", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"receivers\": [\n {\n \"confirmedStatus\": 1,\n \"openDingId\": \"5D73E3AC29C780072D1CD56C6874ACC2\",\n \"receiverNick\": \"粤腾\"\n }\n ]\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1823 + }, + { + "service": "sheet", + "command": "+list-sheets", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test sheet +list-sheets --node mweZ92PV6O36dZbnsMZx70ylJxEKBD6p --yes --format json", + "args": [ + "sheet", + "+list-sheets", + "--node", + "mweZ92PV6O36dZbnsMZx70ylJxEKBD6p", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"count\": 1,\n \"sheets\": [\n {\n \"sheetId\": \"kgqie6hm\",\n \"title\": \"Sheet1\"\n }\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1690 + }, + { + "service": "contact", + "command": "+by-mobile", + "risk": "read", + "method": "real-backend-read; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test contact +by-mobile --mobile 13161187007 --yes --format json", + "args": [ + "contact", + "+by-mobile", + "--mobile", + "13161187007", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"result\": [\n {\n \"isAdmin\": false,\n \"orgEmployeeModel\": {\n \"depts\": [\n {\n \"deptId\": 842379556,\n \"deptName\": \"模型算法\"\n }\n ],\n \"jobNumber\": \"202397\",\n \"labels\": [],\n \"orgAuthEmail\": null,\n \"orgId\": null,\n \"orgMasterDisplayName\": \"张俊韶\",\n \"orgMasterUserId\": \"030386\",\n \"orgName\": \"钉钉\",\n \"orgTitle\": \"\",\n \"orgUserId\": \"202397\",\n \"orgUserName\": \"董鑫阳\",\n \"positions\": [\n {\n \"deptId\": 842379556,\n \"isMain\": true,\n \"managerDisplayName\": null,\n \"managerStaffId\": null,\n \"title\": null,\n \"workStation\": \"浙江-杭州-阿里中心·杭州未科 D1-20-015\"\n }\n ]\n }\n }\n ],\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1884 + } + ] +} \ No newline at end of file diff --git a/docs/shortcut-real-write-results.json b/docs/shortcut-real-write-results.json new file mode 100644 index 00000000..c56136fa --- /dev/null +++ b/docs/shortcut-real-write-results.json @@ -0,0 +1,4456 @@ +{ + "generated_at": "2026-07-15T16:04:54.178709", + "summary": { + "total": 162, + "ok": 48, + "error": 114, + "timeout": 0, + "held": 0 + }, + "failure_categories": { + "missing-real-aitable-fixture": 31, + "backend-or-mcp-error": 24, + "missing-real-resource": 23, + "input-or-business-validation": 20, + "auth-or-permission": 16 + }, + "results": [ + { + "service": "todo", + "command": "+assign", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +assign --to '冬翔' --task 'DWS shortcut 真实测试 20260715 assign,可忽略' --due 2026-07-16T10:00:00+08:00 --yes --format json", + "args": [ + "todo", + "+assign", + "--to", + "冬翔", + "--task", + "DWS shortcut 真实测试 20260715 assign,可忽略", + "--due", + "2026-07-16T10:00:00+08:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"result\": {\n \"subject\": \"DWS shortcut 真实测试 20260715 assign,可忽略\",\n \"taskId\": \"55037683708\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1651, + "recorded_at": "2026-07-15T10:12:09.374178" + }, + { + "service": "todo", + "command": "+assign-multi", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +assign-multi --to '冬翔,克谨,怒龙' --task 'DWS shortcut 真实测试 20260715 assign-multi,可忽略' --yes --format json", + "args": [ + "todo", + "+assign-multi", + "--to", + "冬翔,克谨,怒龙", + "--task", + "DWS shortcut 真实测试 20260715 assign-multi,可忽略", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"result\": {\n \"subject\": \"DWS shortcut 真实测试 20260715 assign-multi,可忽略\",\n \"taskId\": \"55037747621\"\n },\n \"success\": true\n}\n{\n \"count\": 3,\n \"executors\": [\n \"夏东翔(103262)\",\n \"黄渊卓(519019)\",\n \"刘力(075771)\"\n ],\n \"subject\": \"DWS shortcut 真实测试 20260715 assign-multi,可忽略\"\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2445, + "recorded_at": "2026-07-15T10:12:11.927124" + }, + { + "service": "calendar", + "command": "+book", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +book --title 'DWS shortcut 真实测试 20260715 日程,可忽略' --start 2026-07-16T11:00:00+08:00 --end 2026-07-16T11:15:00+08:00 --with '冬翔,克谨,怒龙' --yes --format json", + "args": [ + "calendar", + "+book", + "--title", + "DWS shortcut 真实测试 20260715 日程,可忽略", + "--start", + "2026-07-16T11:00:00+08:00", + "--end", + "2026-07-16T11:15:00+08:00", + "--with", + "冬翔,克谨,怒龙", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"result\": {\n \"attendees\": [\n {\n \"displayName\": \"怒龙\",\n \"optional\": false,\n \"responseStatus\": \"needsAction\",\n \"self\": false\n },\n {\n \"displayName\": \"冬翔\",\n \"optional\": false,\n \"responseStatus\": \"needsAction\",\n \"self\": false\n },\n {\n \"displayName\": \"念晨\",\n \"optional\": false,\n \"responseStatus\": \"accepted\",\n \"self\": true\n },\n {\n \"displayName\": \"黄渊卓(克谨)\",\n \"optional\": false,\n \"responseStatus\": \"needsAction\",\n \"self\": false\n }\n ],\n \"categories\": [],\n \"createTime\": \"2026-07-15 10:12:30\",\n \"end\": {\n \"dateTime\": \"2026-07-16T11:15:00+08:00\",\n \"timeZone\": \"Asia/Shanghai\"\n },\n \"extendedProperties\": {\n \"sharedProperties\": {\n \"belongCorpId\": \"ding8196cd9a2b2405da24f2f5cc6abecb85\"\n }\n },\n \"freeBusy\": \"BUSY\",\n \"iCalUID\": \"c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09\",\n \"id\": \"c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09\",\n \"isAllDay\": false,\n \"meetingRooms\": [],\n \"onlineMeetingInfo\": {\n \"conferenceId\": \"c76abd52-29bb-4183-85d3-bcf91debe3e4\",\n \"extraInfo\": {\n \"phones\": \"[\\\"+862381045152\\\",\\\"+862381045153\\\"]\",\n \"roomCode\": \"131 508 161\"\n },\n \"internalExtraInfo\": {\n \"urlForCalDAV\": \"dingtalk://dingtalkclient/page/videoConfFromSystemCalendar?confId=c76abd52-29bb-4183-85d3-bcf91debe3e4\\u0026calendarId=24714119393\"\n },\n \"type\": \"dingtalk\",\n \"url\": \"dingtalk://dingtalkclient/page/videoConfFromCalendar?confId=c76abd52-29bb-4183-85d3-bcf91debe3e4\\u0026calendarId=24714119393\"\n },\n \"organizer\": {\n \"displayName\": \"念晨\",\n \"optional\": false,\n \"self\": true\n },\n \"reminders\": [\n {\n \"method\": \"dingtalk\",\n \"minutes\": 15\n }\n ],\n \"start\": {\n \"dateTime\": \"2026-07-16T11:00:00+08:00\",\n \"timeZone\": \"Asia/Shanghai\"\n },\n \"status\": \"confirmed\",\n \"summary\": \"DWS shortcut 真实测试 20260715 日程,可忽略\",\n \"updateTime\": \"2026-07-15 10:12:31\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2909, + "recorded_at": "2026-07-15T10:12:31.399705" + }, + { + "service": "calendar", + "command": "+reschedule", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +reschedule --event c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09 --start 2026-07-16T11:30:00+08:00 --end 2026-07-16T11:45:00+08:00 --yes --format json", + "args": [ + "calendar", + "+reschedule", + "--event", + "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09", + "--start", + "2026-07-16T11:30:00+08:00", + "--end", + "2026-07-16T11:45:00+08:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1960, + "recorded_at": "2026-07-15T10:13:18.426070" + }, + { + "service": "calendar", + "command": "+invite", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +invite --event c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09 --with '冬翔' --yes --format json", + "args": [ + "calendar", + "+invite", + "--event", + "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09", + "--with", + "冬翔", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2033, + "recorded_at": "2026-07-15T10:13:23.127843" + }, + { + "service": "calendar", + "command": "+cancel-event", + "risk": "high-risk-write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test calendar +cancel-event --event c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09 --yes --format json", + "args": [ + "calendar", + "+cancel-event", + "--event", + "c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"action\": \"about_to_cancel\",\n \"eventId\": \"c0YxQWVyWDFiTjB6MHdmczVvNUZ5dz09\",\n \"title\": \"DWS shortcut 真实测试 20260715 日程,可忽略\"\n}\n{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1369, + "recorded_at": "2026-07-15T10:13:40.867196" + }, + { + "service": "chat", + "command": "+category-create", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +category-create --title 'DWS测0715' --yes --format json", + "args": [ + "chat", + "+category-create", + "--title", + "DWS测0715", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"categoryId\": 1784081668329\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 959, + "recorded_at": "2026-07-15T10:14:28.325931" + }, + { + "service": "chat", + "command": "+category-rename", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +category-rename --category-id 1784081668329 --title 'DWS改0715' --yes --format json", + "args": [ + "chat", + "+category-rename", + "--category-id", + "1784081668329", + "--title", + "DWS改0715", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1225, + "recorded_at": "2026-07-15T10:14:58.751623" + }, + { + "service": "chat", + "command": "+category-delete", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +category-delete --category-id 1784081668329 --yes --format json", + "args": [ + "chat", + "+category-delete", + "--category-id", + "1784081668329", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"success\": true\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1378, + "recorded_at": "2026-07-15T10:15:00.095333" + }, + { + "service": "chat", + "command": "+send-to-group", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +send-to-group --group 'DWS测0715' --text 'DWS shortcut 真实测试 20260715:验证 chat +send-to-group,请忽略。' --yes --format json", + "args": [ + "chat", + "+send-to-group", + "--group", + "DWS测0715", + "--text", + "DWS shortcut 真实测试 20260715:验证 chat +send-to-group,请忽略。", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"openTaskId\": \"tECwJpPL2sAnZwUZhjTFhNWleCgSp0GSMPlGkMUIL5Q=\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1854, + "recorded_at": "2026-07-15T10:16:22.214033" + }, + { + "service": "chat", + "command": "+chat-update-nick", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-update-nick --group cidXgIVDDzZE7kdQ+bcp3gWNw== --nick 'DWS测试' --yes --format json", + "args": [ + "chat", + "+chat-update-nick", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--nick", + "DWS测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1478, + "recorded_at": "2026-07-15T10:16:22.730031" + }, + { + "service": "chat", + "command": "+chat-update-alias", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-update-alias --group cidXgIVDDzZE7kdQ+bcp3gWNw== --alias-title 'DWS群备注' --yes --format json", + "args": [ + "chat", + "+chat-update-alias", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--alias-title", + "DWS群备注", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1298, + "recorded_at": "2026-07-15T10:16:23.398622" + }, + { + "service": "chat", + "command": "+chat-mute", + "risk": "write", + "method": "real-backend-manual-write cleanup/unmute; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-mute --group cidXgIVDDzZE7kdQ+bcp3gWNw== --off --yes --format json", + "args": [ + "chat", + "+chat-mute", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--off", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1252, + "recorded_at": "2026-07-15T10:16:43.375260" + }, + { + "service": "chat", + "command": "+chat-set-history", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-set-history --group cidXgIVDDzZE7kdQ+bcp3gWNw== --option RECENT_100 --yes --format json", + "args": [ + "chat", + "+chat-set-history", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--option", + "RECENT_100", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1219, + "recorded_at": "2026-07-15T10:17:31.670629" + }, + { + "service": "chat", + "command": "+chat-role-add", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-role-add --group cidXgIVDDzZE7kdQ+bcp3gWNw== --name 'DWS测试角色' --yes --format json", + "args": [ + "chat", + "+chat-role-add", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--name", + "DWS测试角色", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"openRoleId\": \"role9G67RdPFmhF1VxBpguhr1QiEiE\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1281, + "recorded_at": "2026-07-15T10:17:33.706668" + }, + { + "service": "chat", + "command": "+chat-set-admin", + "risk": "write", + "method": "real-backend-manual-write cleanup/unset-admin; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-set-admin --group cidXgIVDDzZE7kdQ+bcp3gWNw== --users 103262 --off --yes --format json", + "args": [ + "chat", + "+chat-set-admin", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--users", + "103262", + "--off", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1554, + "recorded_at": "2026-07-15T10:17:54.361957" + }, + { + "service": "chat", + "command": "+chat-role-update", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-role-update --group cidXgIVDDzZE7kdQ+bcp3gWNw== --role-id role9G67RdPFmhF1VxBpguhr1QiEiE --name 'DWS角色改' --yes --format json", + "args": [ + "chat", + "+chat-role-update", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--role-id", + "role9G67RdPFmhF1VxBpguhr1QiEiE", + "--name", + "DWS角色改", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1366, + "recorded_at": "2026-07-15T10:18:16.042372" + }, + { + "service": "chat", + "command": "+chat-role-set-user", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-role-set-user --group cidXgIVDDzZE7kdQ+bcp3gWNw== --user 103262 --role-ids role9G67RdPFmhF1VxBpguhr1QiEiE --yes --format json", + "args": [ + "chat", + "+chat-role-set-user", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--user", + "103262", + "--role-ids", + "role9G67RdPFmhF1VxBpguhr1QiEiE", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1355, + "recorded_at": "2026-07-15T10:18:18.422186" + }, + { + "service": "doc", + "command": "+version-save", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +version-save --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --yes --format json", + "args": [ + "doc", + "+version-save", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"message\": \"文档版本已成功保存。\",\n \"savedVersion\": 1,\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1853, + "recorded_at": "2026-07-15T10:22:15.539141" + }, + { + "service": "doc", + "command": "+comment-create", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +comment-create --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --content 'DWS shortcut 真实测试 20260715:验证 doc +comment-create,可忽略。' --yes --format json", + "args": [ + "doc", + "+comment-create", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--content", + "DWS shortcut 真实测试 20260715:验证 doc +comment-create,可忽略。", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"commentKey\": \"1784082136009b316ba6c48ad41ad92a8b6905406a17c\",\n \"logId\": \"2132f5ca17840821358717098e08d7\",\n \"message\": \"评论创建成功。commentKey: 1784082136009b316ba6c48ad41ad92a8b6905406a17c\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2263, + "recorded_at": "2026-07-15T10:22:16.077531" + }, + { + "service": "doc", + "command": "+doc-append", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +doc-append --doc P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --text 'DWS shortcut 真实测试 20260715:验证 doc +doc-append。' --yes --format json", + "args": [ + "doc", + "+doc-append", + "--doc", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--text", + "DWS shortcut 真实测试 20260715:验证 doc +doc-append。", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"logId\": \"213ee25c17840821367055154e08a0\",\n \"message\": \"内容已成功追加到文档末尾,原有内容保持不变。\",\n \"mode\": \"append\",\n \"nodeId\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2892, + "recorded_at": "2026-07-15T10:22:17.006167" + }, + { + "service": "doc", + "command": "+comment-reply", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +comment-reply --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --comment-key 1784082136009b316ba6c48ad41ad92a8b6905406a17c --content 'DWS shortcut 真实测试 20260715:验证 doc +comment-reply,可忽略。' --yes --format json", + "args": [ + "doc", + "+comment-reply", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--comment-key", + "1784082136009b316ba6c48ad41ad92a8b6905406a17c", + "--content", + "DWS shortcut 真实测试 20260715:验证 doc +comment-reply,可忽略。", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"commentKey\": \"1784082170012979f5c547f7a49e88a6c1dd718bbb304\",\n \"logId\": \"2106d98117840821697518379e089c\",\n \"message\": \"回复评论成功。commentKey: 1784082170012979f5c547f7a49e88a6c1dd718bbb304\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1553, + "recorded_at": "2026-07-15T10:22:50.048965" + }, + { + "service": "doc", + "command": "+copy", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +copy --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --yes --format json", + "args": [ + "doc", + "+copy", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--folder", + "Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"docUrl\": \"https://alidocs.dingtalk.com/i/nodes/7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3\",\n \"message\": \"节点复制成功,已复制到目标文件夹。sourceNodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ,新节点 ID: 7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3\",\n \"nodeId\": \"7dx2rn0Jbakrq9O5tZvQ1bG9VMGjLRb3\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1531, + "recorded_at": "2026-07-15T10:23:13.821964" + }, + { + "service": "doc", + "command": "+move", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +move --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --yes --format json", + "args": [ + "doc", + "+move", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--folder", + "Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"docUrl\": \"https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"message\": \"节点移动成功,已移动到目标文件夹。nodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ\",\n \"nodeId\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1087, + "recorded_at": "2026-07-15T10:23:15.362080" + }, + { + "service": "doc", + "command": "+version-revert", + "risk": "high-risk-write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +version-revert --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --version 1 --yes --format json", + "args": [ + "doc", + "+version-revert", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--version", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"message\": \"文档已成功回滚到指定版本。\",\n \"revertedToVersion\": 1,\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2065, + "recorded_at": "2026-07-15T10:23:20.422266" + }, + { + "service": "chat", + "command": "+chat-dismiss", + "risk": "high-risk-write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +chat-dismiss --group cidXgIVDDzZE7kdQ+bcp3gWNw== --yes --format json", + "args": [ + "chat", + "+chat-dismiss", + "--group", + "cidXgIVDDzZE7kdQ+bcp3gWNw==", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1120, + "recorded_at": "2026-07-15T10:30:27.746562" + }, + { + "service": "devapp", + "command": "+create", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +create --name 'DWS测试应用0715' --desc 'DWS shortcut 真实测试,可删除' --yes --format json", + "args": [ + "devapp", + "+create", + "--name", + "DWS测试应用0715", + "--desc", + "DWS shortcut 真实测试,可删除", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"appKey\": \"dingyqsdchocxp3xrfm3\",\n \"desc\": \"DWS shortcut 真实测试,可删除\",\n \"icon\": \"@lADPDfmVQafoVxrMyMzI\",\n \"iconUrl\": \"https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg\",\n \"name\": \"DWS测试应用0715\",\n \"unifiedAppId\": \"c5a8e611-1555-44a0-ba8d-9617ab599692\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1464, + "recorded_at": "2026-07-15T10:31:40.493231" + }, + { + "service": "devapp", + "command": "+update", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +update --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --name 'DWS测试应用0715改' --desc 'DWS shortcut 真实测试已更新' --yes --format json", + "args": [ + "devapp", + "+update", + "--unified-app-id", + "c5a8e611-1555-44a0-ba8d-9617ab599692", + "--name", + "DWS测试应用0715改", + "--desc", + "DWS shortcut 真实测试已更新", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"appKey\": \"dingyqsdchocxp3xrfm3\",\n \"desc\": \"DWS shortcut 真实测试已更新\",\n \"icon\": \"@lADPDfmVQafoVxrMyMzI\",\n \"iconUrl\": \"https://i01.lw.aliimg.com/media/lADPDfmVQafoVxrMyMzI_200_200.jpg\",\n \"message\": \"应用基础信息更新成功。\",\n \"name\": \"DWS测试应用0715改\",\n \"success\": true,\n \"unifiedAppId\": \"c5a8e611-1555-44a0-ba8d-9617ab599692\",\n \"updatedFields\": [\n \"name\",\n \"desc\"\n ],\n \"versionStatus\": \"INIT\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 5611, + "recorded_at": "2026-07-15T10:32:10.163399" + }, + { + "service": "devapp", + "command": "+disable", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +disable --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --yes --format json", + "args": [ + "devapp", + "+disable", + "--unified-app-id", + "c5a8e611-1555-44a0-ba8d-9617ab599692", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"message\": \"应用已停用。\",\n \"success\": true,\n \"unifiedAppId\": \"c5a8e611-1555-44a0-ba8d-9617ab599692\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2583, + "recorded_at": "2026-07-15T10:32:10.606118" + }, + { + "service": "devapp", + "command": "+member-add", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +member-add --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --user-ids 103262 --member-type DEVELOPER --yes --format json", + "args": [ + "devapp", + "+member-add", + "--unified-app-id", + "c5a8e611-1555-44a0-ba8d-9617ab599692", + "--user-ids", + "103262", + "--member-type", + "DEVELOPER", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"memberType\": \"DEVELOPER\",\n \"operation\": \"ADDED\",\n \"success\": true,\n \"unifiedAppId\": \"c5a8e611-1555-44a0-ba8d-9617ab599692\",\n \"userIds\": [\n \"103262\"\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2393, + "recorded_at": "2026-07-15T10:32:10.630577" + }, + { + "service": "devapp", + "command": "+enable", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +enable --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --yes --format json", + "args": [ + "devapp", + "+enable", + "--unified-app-id", + "c5a8e611-1555-44a0-ba8d-9617ab599692", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"message\": \"应用已启用。\",\n \"success\": true,\n \"unifiedAppId\": \"c5a8e611-1555-44a0-ba8d-9617ab599692\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1506, + "recorded_at": "2026-07-15T10:32:41.282567" + }, + { + "service": "devapp", + "command": "+member-remove", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +member-remove --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --user-ids 103262 --member-type DEVELOPER --yes --format json", + "args": [ + "devapp", + "+member-remove", + "--unified-app-id", + "c5a8e611-1555-44a0-ba8d-9617ab599692", + "--user-ids", + "103262", + "--member-type", + "DEVELOPER", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"memberType\": \"DEVELOPER\",\n \"operation\": \"REMOVED\",\n \"success\": true,\n \"unifiedAppId\": \"c5a8e611-1555-44a0-ba8d-9617ab599692\",\n \"userIds\": [\n \"103262\"\n ]\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1188, + "recorded_at": "2026-07-15T10:32:45.215035" + }, + { + "service": "devapp", + "command": "+webapp-config", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +webapp-config --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --h5-page-type pc --homepage-url https://example.invalid/dws --pc-homepage-url https://example.invalid/dws-pc --omp-url https://example.invalid/omp --yes --format json", + "args": [ + "devapp", + "+webapp-config", + "--unified-app-id", + "c5a8e611-1555-44a0-ba8d-9617ab599692", + "--h5-page-type", + "pc", + "--homepage-url", + "https://example.invalid/dws", + "--pc-homepage-url", + "https://example.invalid/dws-pc", + "--omp-url", + "https://example.invalid/omp", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"configured\": true,\n \"h5PageType\": \"pc\",\n \"homepageUrl\": \"https://example.invalid/dws\",\n \"message\": \"网页应用配置成功。\",\n \"ompUrl\": \"https://example.invalid/omp\",\n \"pcHomepageUrl\": \"https://example.invalid/dws-pc\",\n \"success\": true,\n \"unifiedAppId\": \"c5a8e611-1555-44a0-ba8d-9617ab599692\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 4926, + "recorded_at": "2026-07-15T10:33:17.930444" + }, + { + "service": "devapp", + "command": "+delete", + "risk": "high-risk-write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test devapp +delete --unified-app-id c5a8e611-1555-44a0-ba8d-9617ab599692 --yes --format json", + "args": [ + "devapp", + "+delete", + "--unified-app-id", + "c5a8e611-1555-44a0-ba8d-9617ab599692", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"deleted\": true,\n \"message\": \"应用删除成功。\",\n \"success\": true,\n \"unifiedAppId\": \"c5a8e611-1555-44a0-ba8d-9617ab599692\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2868, + "recorded_at": "2026-07-15T10:33:37.241949" + }, + { + "service": "drive", + "command": "+move", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test drive +move --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --yes --format json", + "args": [ + "drive", + "+move", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--folder", + "Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"docUrl\": \"https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"message\": \"节点移动成功,已移动到目标文件夹。nodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ\",\n \"nodeId\": \"P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 3380, + "recorded_at": "2026-07-15T10:34:07.475044" + }, + { + "service": "drive", + "command": "+copy", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test drive +copy --node P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --folder Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ --yes --format json", + "args": [ + "drive", + "+copy", + "--node", + "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--folder", + "Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"docUrl\": \"https://alidocs.dingtalk.com/i/nodes/np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l\",\n \"message\": \"节点复制成功,已复制到目标文件夹。sourceNodeId: P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO,targetFolderId: Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ,新节点 ID: np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l\",\n \"nodeId\": \"np9zOoBVBy2AdzEjuP40bzg4W1DK0g6l\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1329, + "recorded_at": "2026-07-15T10:34:08.215467" + }, + { + "service": "ding", + "command": "+send-personal", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test ding +send-personal --users 103262 --content 'DWS shortcut 真实测试 20260715:验证 ding +send-personal,请忽略。' --type app --uuid dws-shortcut-ding-20260715-001 --yes --format json", + "args": [ + "ding", + "+send-personal", + "--users", + "103262", + "--content", + "DWS shortcut 真实测试 20260715:验证 ding +send-personal,请忽略。", + "--type", + "app", + "--uuid", + "dws-shortcut-ding-20260715-001", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"openDingId\": \"8508193BEA49427AA9FFE94EB9D6B28E\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1338, + "recorded_at": "2026-07-15T10:34:35.058320" + }, + { + "service": "ding", + "command": "+recall-personal", + "risk": "high-risk-write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test ding +recall-personal --id 8508193BEA49427AA9FFE94EB9D6B28E --yes --format json", + "args": [ + "ding", + "+recall-personal", + "--id", + "8508193BEA49427AA9FFE94EB9D6B28E", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1415, + "recorded_at": "2026-07-15T10:34:51.767409" + }, + { + "service": "minutes", + "command": "+record-start", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test minutes +record-start --session-id __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__ --yes --format json", + "args": [ + "minutes", + "+record-start", + "--session-id", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"cmd\": \"create\",\n \"operatorUid\": 512653609,\n \"sessionId\": \"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__\",\n \"uid\": 512653609\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 821 + }, + { + "service": "minutes", + "command": "+replace-batch", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test minutes +replace-batch --id __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__ --pair '测试=>测试' --yes --format json", + "args": [ + "minutes", + "+replace-batch", + "--id", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__", + "--pair", + "测试=>测试", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"applied\": 0,\n \"failed\": 1,\n \"results\": [\n {\n \"error\": \"[UNCLASSIFIED] business error: success=false\\n hint: Use --verbose for detailed error logs\",\n \"originalText\": \"测试\",\n \"replacedText\": \"测试\"\n }\n ],\n \"taskUuid\": \"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__\",\n \"total\": 1\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 941 + }, + { + "service": "chat", + "command": "+messages-send-by-webhook", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +messages-send-by-webhook --token __DWS_SHORTCUT_REAL_TEST_NO_SUCH_WEBHOOK_TOKEN__ --title 'DWS shortcut 真实测试 20260715-104025' --text 'DWS shortcut 真实测试 20260715-104025,安全负向输入,请忽略。' --at-all --at-mobiles x --at-users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --yes --format json", + "args": [ + "chat", + "+messages-send-by-webhook", + "--token", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_WEBHOOK_TOKEN__", + "--title", + "DWS shortcut 真实测试 20260715-104025", + "--text", + "DWS shortcut 真实测试 20260715-104025,安全负向输入,请忽略。", + "--at-all", + "--at-mobiles", + "x", + "--at-users", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"errcode\": \"300005\",\n \"errmsg\": \"token is not exist\",\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 925 + }, + { + "service": "chat", + "command": "+messages-update-card", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +messages-update-card --biz-id __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__ --content 'DWS shortcut 真实测试 20260715-104025,安全负向输入,请忽略。' --flow-status 1 --yes --format json", + "args": [ + "chat", + "+messages-update-card", + "--biz-id", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ID__", + "--content", + "DWS shortcut 真实测试 20260715-104025,安全负向输入,请忽略。", + "--flow-status", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 934 + }, + { + "service": "chat", + "command": "+conversation-clear-all-red-point", + "risk": "high-risk-write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +conversation-clear-all-red-point --yes --format json", + "args": [ + "chat", + "+conversation-clear-all-red-point", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {},\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 13459, + "recorded_at": "2026-07-15T10:45:08.066989" + }, + { + "service": "chat", + "command": "+dm", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +dm --to '冬翔' --text 'DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。' --yes --format json", + "args": [ + "chat", + "+dm", + "--to", + "冬翔", + "--text", + "DWS shortcut 修复复测 20260715:验证 chat +dm,请忽略。", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"openTaskId\": \"y/wM6Lo+9GbIqtILYPv1BZDcMW+2FgnqskgcpdOiMdM=\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2547, + "recorded_at": "2026-07-15T11:01:34.725515" + }, + { + "service": "chat", + "command": "+broadcast", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test chat +broadcast --to '冬翔,克谨,怒龙' --text 'DWS shortcut 修复复测 20260715:验证 chat +broadcast,请忽略。' --yes --format json", + "args": [ + "chat", + "+broadcast", + "--to", + "冬翔,克谨,怒龙", + "--text", + "DWS shortcut 修复复测 20260715:验证 chat +broadcast,请忽略。", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"failedCount\": 0,\n \"sent\": [\n \"夏东翔\",\n \"黄渊卓\",\n \"刘力\"\n ],\n \"sentCount\": 3\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2388, + "recorded_at": "2026-07-15T11:01:50.250374" + }, + { + "service": "doc", + "command": "+share-doc", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test doc +share-doc --to '冬翔' --url https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO --note 'DWS shortcut 修复复测 20260715:验证 doc +share-doc,请忽略。' --yes --format json", + "args": [ + "doc", + "+share-doc", + "--to", + "冬翔", + "--url", + "https://alidocs.dingtalk.com/i/nodes/P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO", + "--note", + "DWS shortcut 修复复测 20260715:验证 doc +share-doc,请忽略。", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"errorCode\": null,\n \"errorMsg\": null,\n \"result\": {\n \"openTaskId\": \"30ETViSW+9qhs7fBO9cbeSocHjj2iUZL4firJPz/h/I=\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1943, + "recorded_at": "2026-07-15T11:02:04.791099" + }, + { + "service": "todo", + "command": "+remind", + "risk": "write", + "method": "real-backend-manual-write; no --mock; no --dry-run; cleanup: taskId 55042039022 deleted successfully", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +remind --task 'DWS shortcut 修复复测 20260715 remind,可忽略' --at 2026-07-16T10:00:00+08:00 --yes --format json", + "args": [ + "todo", + "+remind", + "--task", + "DWS shortcut 修复复测 20260715 remind,可忽略", + "--at", + "2026-07-16T10:00:00+08:00", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"arguments\": [],\n \"result\": {\n \"subject\": \"DWS shortcut 修复复测 20260715 remind,可忽略\",\n \"taskId\": \"55042039022\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 4240, + "recorded_at": "2026-07-15T11:02:27.012678", + "cleanup": { + "input": "/private/tmp/dws-real-test todo task delete --task-id 55042039022 --yes --format json", + "stdout": "{\n \"result\": {\n \"success\": true\n },\n \"success\": true\n}", + "exit_code": 0, + "note": "真实复测创建的临时待办已删除" + } + }, + { + "service": "aitable", + "command": "+advperm-disable", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +advperm-disable --base-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+advperm-disable", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to set advanced permission for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998455921653e08de\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1447, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "aitable", + "command": "+advperm-enable", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +advperm-enable --base-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+advperm-enable", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to set advanced permission for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"0bab027317840998469916877e08c8\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1358, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "aitable", + "command": "+attachment-upload", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +attachment-upload --base-id DWSREALTESTNOSUCHID0000000000000 --file-name dws-shortcut-real-20260715-151724.txt --size 1 --mime-type text/plain --yes --format json", + "args": [ + "aitable", + "+attachment-upload", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--file-name", + "dws-shortcut-real-20260715-151724.txt", + "--size", + "1", + "--mime-type", + "text/plain", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"BASE_NOT_FOUND\\\",\\\"message\\\":\\\"Specified base does not exist, has been deleted, or is inaccessible\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to prepare attachment upload: base does not exist or is inaccessible\\\",\\\"trace_id\\\":\\\"213ee25c17840998481228948e087f\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1131, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+base-copy", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +base-copy --base-id DWSREALTESTNOSUCHID0000000000000 --target-folder-id x --only-struct --yes --format json", + "args": [ + "aitable", + "+base-copy", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--target-folder-id", + "x", + "--only-struct", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":null,\\\"message\\\":\\\"Invalid source baseId: DWSREALTESTNOSUCHID0000000000000\\\",\\\"retryable\\\":null,\\\"type\\\":\\\"USER_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Invalid source baseId\\\",\\\"trace_id\\\":\\\"213ee25c17840998493715617e08e2\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1318, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+base-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +base-delete --base-id DWSREALTESTNOSUCHID0000000000000 --reason 'DWS shortcut 真实测试安全负向清理' --yes --format json", + "args": [ + "aitable", + "+base-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--reason", + "DWS shortcut 真实测试安全负向清理", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"52600003\\\",\\\"message\\\":\\\"Data not found\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete base DWSREALTESTNOSUCHID0000000000000. Check whether the base still exists, the caller still has access, and the baseId is from get_base/search_bases before retrying.\\\",\\\"trace_id\\\":\\\"2132f5ca17840998505858640e0874\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1124, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "aitable", + "command": "+base-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +base-update --base-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --desc 'DWS shortcut 真实测试描述,可删除' --yes --format json", + "args": [ + "aitable", + "+base-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--desc", + "DWS shortcut 真实测试描述,可删除", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"BASE_NOT_FOUND\\\",\\\"message\\\":\\\"Specified base does not exist, has been deleted, or is inaccessible\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update base because base does not exist or is inaccessible\\\",\\\"trace_id\\\":\\\"2132f5ca17840998518767946e08b6\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1318, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+chart-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +chart-delete --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --chart-id DWSREALTESTNOSUCHID0000000000000 --reason 'DWS shortcut 真实测试安全负向清理' --yes --format json", + "args": [ + "aitable", + "+chart-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dashboard-id", + "DWSREALTESTNOSUCHID0000000000000", + "--chart-id", + "DWSREALTESTNOSUCHID0000000000000", + "--reason", + "DWS shortcut 真实测试安全负向清理", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete chart DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"0bab027317840998530143696e08c9\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1154, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+chart-share-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +chart-share-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --chart-id DWSREALTESTNOSUCHID0000000000000 --enabled --share-type PUBLIC --allow-back-to-doc --yes --format json", + "args": [ + "aitable", + "+chart-share-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dashboard-id", + "DWSREALTESTNOSUCHID0000000000000", + "--chart-id", + "DWSREALTESTNOSUCHID0000000000000", + "--enabled", + "--share-type", + "PUBLIC", + "--allow-back-to-doc", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update chart share for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"0bab027317840998541842968e094d\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1175, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+chart-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +chart-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --chart-id DWSREALTESTNOSUCHID0000000000000 --config '{}' --layout '{}' --yes --format json", + "args": [ + "aitable", + "+chart-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dashboard-id", + "DWSREALTESTNOSUCHID0000000000000", + "--chart-id", + "DWSREALTESTNOSUCHID0000000000000", + "--config", + "{}", + "--layout", + "{}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_PARAMS\\\",\\\"message\\\":\\\"config is required\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update chart because config is missing\\\",\\\"trace_id\\\":\\\"2106d98117840998553244877e08df\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1102, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+dashboard-arrange", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +dashboard-arrange --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+dashboard-arrange", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dashboard-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to align dashboard for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2132f5ca17840998564478222e08d8\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1141, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+dashboard-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +dashboard-delete --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --reason 'DWS shortcut 真实测试安全负向清理' --yes --format json", + "args": [ + "aitable", + "+dashboard-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dashboard-id", + "DWSREALTESTNOSUCHID0000000000000", + "--reason", + "DWS shortcut 真实测试安全负向清理", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete dashboard DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998577042546e0941\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1247, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+dashboard-share-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +dashboard-share-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --enabled --share-type PUBLIC --allow-back-to-doc --yes --format json", + "args": [ + "aitable", + "+dashboard-share-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dashboard-id", + "DWSREALTESTNOSUCHID0000000000000", + "--enabled", + "--share-type", + "PUBLIC", + "--allow-back-to-doc", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update dashboard share for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2132f5ca17840998588081246e0853\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1115, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+dashboard-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +dashboard-update --base-id DWSREALTESTNOSUCHID0000000000000 --dashboard-id DWSREALTESTNOSUCHID0000000000000 --config '{}' --name 'DWS shortcut 真实测试 20260715-151724' --yes --format json", + "args": [ + "aitable", + "+dashboard-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dashboard-id", + "DWSREALTESTNOSUCHID0000000000000", + "--config", + "{}", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update dashboard DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998599403187e08b8\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1157, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+field-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +field-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+field-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--field-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"404\\\",\\\"message\\\":\\\"getDentryDTO returns null\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to get current field info before delete\\\",\\\"trace_id\\\":\\\"0bab027317840998611338768e08c8\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1157, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+field-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +field-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --config '{}' --ai-config '{}' --yes --format json", + "args": [ + "aitable", + "+field-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--field-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--config", + "{}", + "--ai-config", + "{}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"404\\\",\\\"message\\\":\\\"getDentryDTO returns null\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to get current field info for update\\\",\\\"trace_id\\\":\\\"213ee25c17840998623207342e08e2\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1196, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+form-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +form-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+form-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete form view for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"213ee25c17840998636217552e08e2\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1290, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+form-field-hide", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +form-field-hide --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --hidden --yes --format json", + "args": [ + "aitable", + "+form-field-hide", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--field-id", + "DWSREALTESTNOSUCHID0000000000000", + "--hidden", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update form field hidden for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998649456212e08df\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1312, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+form-field-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +form-field-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --required --field-description 'DWS shortcut 真实测试字段说明' --yes --format json", + "args": [ + "aitable", + "+form-field-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--field-id", + "DWSREALTESTNOSUCHID0000000000000", + "--required", + "--field-description", + "DWS shortcut 真实测试字段说明", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update form field config for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"213ee25c17840998660847932e08e2\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1153, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+form-share-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +form-share-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --enabled true --yes --format json", + "args": [ + "aitable", + "+form-share-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--enabled", + "true", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update share form for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"213ee25c17840998675755538e087d\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1573, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+form-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +form-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --title 'DWS shortcut 真实测试 20260715-151724' --description 'DWS shortcut 真实测试描述,可删除' --yes --format json", + "args": [ + "aitable", + "+form-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--title", + "DWS shortcut 真实测试 20260715-151724", + "--description", + "DWS shortcut 真实测试描述,可删除", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update form info for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2132f5ca17840998688302645e0853\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1141, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+import-data", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +import-data --import-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --timeout 1 --header-row 1 --src-sheet-name x --field-mapping '{}' --yes --format json", + "args": [ + "aitable", + "+import-data", + "--import-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--timeout", + "1", + "--header-row", + "1", + "--src-sheet-name", + "x", + "--field-mapping", + "{}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_IMPORT_ID\\\",\\\"message\\\":\\\"importId not found: either invalid or expired\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"importId「DWSREALTESTNOSUCHID0000000000000」无效或已过期(有效期 1 小时)。请勿重试相同 importId。需重新上传:① 调用 prepare_import_upload 获取新的 uploadUrl 和 importId;② 通过 HTTP PUT 将原始文件字节流上传至 uploadUrl;除非 uploadUrl 明确要求,否则不要额外附带 Content-Type 等自定义请求头;③ 调用 import_data 传入新的 importId。\\\",\\\"trace_id\\\":\\\"213ee25c17840998700326443e0944\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1227, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "aitable", + "command": "+import-upload", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +import-upload --base-id DWSREALTESTNOSUCHID0000000000000 --file-name dws-shortcut-real-20260715-151724.txt --file-size 1 --yes --format json", + "args": [ + "aitable", + "+import-upload", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--file-name", + "dws-shortcut-real-20260715-151724.txt", + "--file-size", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"无法解析 baseId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"无效的 baseId\\\",\\\"trace_id\\\":\\\"0bab027317840998713075490e096e\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1302, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+record-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +record-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --record-ids DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+record-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--record-ids", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"404\\\",\\\"message\\\":\\\"getDentryDTO returns null\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete records\\\",\\\"trace_id\\\":\\\"2132f5ca17840998724753149e0853\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1159, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+record-primary-doc-create", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +record-primary-doc-create --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --field-id DWSREALTESTNOSUCHID0000000000000 --record-id 999999999999 --yes --format json", + "args": [ + "aitable", + "+record-primary-doc-create", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--field-id", + "DWSREALTESTNOSUCHID0000000000000", + "--record-id", + "999999999999", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"RESOLVE_DOC_ID_ERROR\\\",\\\"message\\\":\\\"Failed to resolve docId from baseId\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to create cell doc because baseId cannot be resolved to docId\\\",\\\"trace_id\\\":\\\"213ee25c17840998736256985e0944\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1150, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+record-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +record-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --records '[{\"recordId\":\"recDWSREALTEST\",\"cells\":{}}]' --yes --format json", + "args": [ + "aitable", + "+record-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--records", + "[{\"recordId\":\"recDWSREALTEST\",\"cells\":{}}]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_RECORDS\\\",\\\"message\\\":\\\"records must contain at least one writable record\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update records because no valid writable records remain for table DWSREALTESTNOSUCHID0000000000000. Skipped records with empty cells (1): recDWSREALTEST\\\",\\\"trace_id\\\":\\\"0bab027317840998747383236e090b\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1144, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+record-upsert", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +record-upsert --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --records '[]' --yes --format json", + "args": [ + "aitable", + "+record-upsert", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--records", + "[]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_PARAMETER\\\",\\\"message\\\":\\\"records is required and must not be empty\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"records is required and must not be empty\\\",\\\"trace_id\\\":\\\"2106d98117840998759832182e087b\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1173, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+role-create", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +role-create --base-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --role-type x --flow-type x --sub-roles '[]' --yes --format json", + "args": [ + "aitable", + "+role-create", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--role-type", + "x", + "--flow-type", + "x", + "--sub-roles", + "[]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to create role for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"0bab027317840998770933580e090b\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1130, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+role-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +role-delete --base-id DWSREALTESTNOSUCHID0000000000000 --role-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+role-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--role-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_PARAMS\\\",\\\"message\\\":\\\"roleId is required\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete role because roleId is missing\\\",\\\"trace_id\\\":\\\"2106d98117840998782482701e089c\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1150, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+role-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +role-update --base-id DWSREALTESTNOSUCHID0000000000000 --role-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --role-type x --flow-type x --sub-roles '[]' --yes --format json", + "args": [ + "aitable", + "+role-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--role-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--role-type", + "x", + "--flow-type", + "x", + "--sub-roles", + "[]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_PARAMS\\\",\\\"message\\\":\\\"roleId is required\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to patch role because roleId is missing\\\",\\\"trace_id\\\":\\\"2132f5ca17840998794483634e08d8\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1209, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+section-create", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +section-create --base-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --parent-section-id DWSREALTESTNOSUCHID0000000000000 --index 1 --yes --format json", + "args": [ + "aitable", + "+section-create", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--parent-section-id", + "DWSREALTESTNOSUCHID0000000000000", + "--index", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to create section for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2132f5ca17840998805556786e08d9\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1117, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+section-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +section-delete --base-id DWSREALTESTNOSUCHID0000000000000 --section-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+section-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--section-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete section for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998817023336e087a\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1111, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+section-move-node", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +section-move-node --base-id DWSREALTESTNOSUCHID0000000000000 --node-id DWSREALTESTNOSUCHID0000000000000 --new-parent-section-id DWSREALTESTNOSUCHID0000000000000 --target-index 1 --yes --format json", + "args": [ + "aitable", + "+section-move-node", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--node-id", + "DWSREALTESTNOSUCHID0000000000000", + "--new-parent-section-id", + "DWSREALTESTNOSUCHID0000000000000", + "--target-index", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to move node for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998828667800e0920\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1186, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+section-rename", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +section-rename --base-id DWSREALTESTNOSUCHID0000000000000 --section-id DWSREALTESTNOSUCHID0000000000000 --new-name 'DWS shortcut 真实测试 20260715-151724' --yes --format json", + "args": [ + "aitable", + "+section-rename", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--section-id", + "DWSREALTESTNOSUCHID0000000000000", + "--new-name", + "DWS shortcut 真实测试 20260715-151724", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to rename section for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"213ee25c17840998840692547e08e2\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1259, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+section-reorder", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +section-reorder --base-id DWSREALTESTNOSUCHID0000000000000 --section-id DWSREALTESTNOSUCHID0000000000000 --target-index 1 --yes --format json", + "args": [ + "aitable", + "+section-reorder", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--section-id", + "DWSREALTESTNOSUCHID0000000000000", + "--target-index", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to reorder section for base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2132f5ca17840998853157434e08d9\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1193, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+table-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +table-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --reason 'DWS shortcut 真实测试安全负向清理' --yes --format json", + "args": [ + "aitable", + "+table-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--reason", + "DWS shortcut 真实测试安全负向清理", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"BASE_NOT_FOUND\\\",\\\"message\\\":\\\"Specified base does not exist, has been deleted, or is inaccessible\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete table because base does not exist or is inaccessible\\\",\\\"trace_id\\\":\\\"2132f5ca17840998865048372e0852\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1199, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+table-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +table-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --description 'DWS shortcut 真实测试描述,可删除' --record-name-key task --yes --format json", + "args": [ + "aitable", + "+table-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--description", + "DWS shortcut 真实测试描述,可删除", + "--record-name-key", + "task", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"404\\\",\\\"message\\\":\\\"getDentryDTO returns null\\\",\\\"retryable\\\":true,\\\"type\\\":\\\"SYSTEM_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update table DWSREALTESTNOSUCHID0000000000000 in base DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"213ee25c17840998877246229e087f\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1249, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+view-delete", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +view-delete --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+view-delete", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to delete view DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998889051250e08df\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1236, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+view-duplicate", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +view-duplicate --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --new-name 'DWS shortcut 真实测试 20260715-151724' --yes --format json", + "args": [ + "aitable", + "+view-duplicate", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--new-name", + "DWS shortcut 真实测试 20260715-151724", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to duplicate view DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2132f5ca17840998901765467e0853\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1160, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+view-lock", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +view-lock --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --off --yes --format json", + "args": [ + "aitable", + "+view-lock", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--off", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to lock_or_unlock view DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998913717245e0941\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1215, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+view-set-fill-color-rule", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +view-set-fill-color-rule --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --json '{}' --yes --format json", + "args": [ + "aitable", + "+view-set-fill-color-rule", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--json", + "{}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_PARAMS\\\",\\\"message\\\":\\\"conditionalFormats is required\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to set fill color rule because conditionalFormats is missing\\\",\\\"trace_id\\\":\\\"2106d98117840998924181709e08df\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1046, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。" + }, + { + "service": "aitable", + "command": "+view-set-frozen-cols", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +view-set-frozen-cols --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --count 1 --yes --format json", + "args": [ + "aitable", + "+view-set-frozen-cols", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--count", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to set frozen columns for view DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998935988648e08de\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1149, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+view-set-row-height", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +view-set-row-height --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --cell-height 1 --yes --format json", + "args": [ + "aitable", + "+view-set-row-height", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--cell-height", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to set cell height for view DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"2106d98117840998949428245e08b8\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1345, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+view-update", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +view-update --base-id DWSREALTESTNOSUCHID0000000000000 --table-id DWSREALTESTNOSUCHID0000000000000 --view-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --desc '{}' --config '{}' --yes --format json", + "args": [ + "aitable", + "+view-update", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--table-id", + "DWSREALTESTNOSUCHID0000000000000", + "--view-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--desc", + "{}", + "--config", + "{}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"INVALID_BASE_ID\\\",\\\"message\\\":\\\"baseId cannot be resolved to docId\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to update view DWSREALTESTNOSUCHID0000000000000\\\",\\\"trace_id\\\":\\\"213ee25c17840998961487395e087f\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1331, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+workflow-disable", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +workflow-disable --base-id DWSREALTESTNOSUCHID0000000000000 --workflow-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+workflow-disable", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--workflow-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"BASE_NOT_FOUND\\\",\\\"message\\\":\\\"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to disable workflow because base 'DWSREALTESTNOSUCHID0000000000000' could not be found\\\",\\\"trace_id\\\":\\\"213ee25c17840998975738372e087e\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1320, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "aitable", + "command": "+workflow-enable", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test aitable +workflow-enable --base-id DWSREALTESTNOSUCHID0000000000000 --workflow-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "aitable", + "+workflow-enable", + "--base-id", + "DWSREALTESTNOSUCHID0000000000000", + "--workflow-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"internal\",\n \"code\": 1,\n \"message\": \"[MCP_TOOL_ERROR] {\\\"data\\\":{},\\\"error\\\":{\\\"code\\\":\\\"BASE_NOT_FOUND\\\",\\\"message\\\":\\\"Cannot resolve base 'DWSREALTESTNOSUCHID0000000000000', please check if the baseId is valid\\\",\\\"retryable\\\":false,\\\"type\\\":\\\"INPUT_ERROR\\\"},\\\"meta\\\":{},\\\"status\\\":\\\"error\\\",\\\"success\\\":true,\\\"summary\\\":\\\"Failed to enable workflow because base 'DWSREALTESTNOSUCHID0000000000000' could not be found\\\",\\\"trace_id\\\":\\\"0bab027317840998987508899e094d\\\"}\"\n }\n}", + "exit_code": 1, + "duration_ms": 1171, + "failure_category": "missing-real-aitable-fixture", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。" + }, + { + "service": "attendance", + "command": "+boss-check", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +boss-check --plan-id 999999999999 --result-id 999999999999 --time 2026-07-22T10:00:00+08:00 --result Normal --absent-min 1 --remark 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --yes --format json", + "args": [ + "attendance", + "+boss-check", + "--plan-id", + "999999999999", + "--result-id", + "999999999999", + "--time", + "2026-07-22T10:00:00+08:00", + "--result", + "Normal", + "--absent-min", + "1", + "--remark", + "DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/boss_check)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"C0002\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"213ee25c17840998998942184e087d\"\n }\n}", + "exit_code": 1, + "duration_ms": 1136, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "attendance", + "command": "+create-class", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +create-class --name 'DWS shortcut 真实测试 20260715-151724' --owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --class-vo '{\"sections\":[{\"times\":[{\"checkType\":\"OnDuty\",\"checkTime\":\"09:00\",\"across\":0},{\"checkType\":\"OffDuty\",\"checkTime\":\"18:00\",\"across\":0}]}]}' --yes --format json", + "args": [ + "attendance", + "+create-class", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--owner", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--class-vo", + "{\"sections\":[{\"times\":[{\"checkType\":\"OnDuty\",\"checkTime\":\"09:00\",\"across\":0},{\"checkType\":\"OffDuty\",\"checkTime\":\"18:00\",\"across\":0}]}]}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_class_setting)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"S0001\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"0bab027317840999009926838e090b\"\n }\n}", + "exit_code": 1, + "duration_ms": 1148, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "attendance", + "command": "+create-group", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +create-group --name 'DWS shortcut 真实测试 20260715-151724' --type FIXED --owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --group-vo '{\"defaultClassId\":999999999999,\"workDayClassList\":[999999999999,999999999999,999999999999,999999999999,999999999999,0,0]}' --yes --format json", + "args": [ + "attendance", + "+create-group", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--type", + "FIXED", + "--owner", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--group-vo", + "{\"defaultClassId\":999999999999,\"workDayClassList\":[999999999999,999999999999,999999999999,999999999999,999999999999,0,0]}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/create_group_setting)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"S0001\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"2106d98117840999021121258e08b8\"\n }\n}", + "exit_code": 1, + "duration_ms": 1201, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "attendance", + "command": "+import-schedule", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +import-schedule --group-id 999999999999 --schedules '[{\"userId\":\"202397\",\"workDate\":\"2026-07-16 09:00:00\",\"classId\":999999999999,\"isRest\":\"N\"}]' --yes --format json", + "args": [ + "attendance", + "+import-schedule", + "--group-id", + "999999999999", + "--schedules", + "[{\"userId\":\"202397\",\"workDate\":\"2026-07-16 09:00:00\",\"classId\":999999999999,\"isRest\":\"N\"}]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/generateTurnSchedule)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"S0003\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"2104a64c17840999034845189e085e\"\n }\n}", + "exit_code": 1, + "duration_ms": 1271, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "attendance", + "command": "+save-leave-balance", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +save-leave-balance --target __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --leave-code DWSREALTESTNOSUCHID0000000000000 --num 1 --reason 'DWS shortcut 真实测试安全负向清理' --start 2026-07-16 --end 2026-08-14 --yes --format json", + "args": [ + "attendance", + "+save-leave-balance", + "--target", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--leave-code", + "DWSREALTESTNOSUCHID0000000000000", + "--num", + "1", + "--reason", + "DWS shortcut 真实测试安全负向清理", + "--start", + "2026-07-16", + "--end", + "2026-08-14", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 无权更新指定员工的假期余额 (operation: attendance-wukong/update_leave_balance)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PERMISSION_DENIED\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"2127d89817840999045751134e079c\"\n }\n}", + "exit_code": 1, + "duration_ms": 1081, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "attendance", + "command": "+update-class", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +update-class --class-id 999999999999 --name 'DWS shortcut 真实测试 20260715-151724' --owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --class-vo '{\"sections\":[{\"times\":[{\"checkType\":\"OnDuty\",\"checkTime\":\"09:00\",\"across\":0},{\"checkType\":\"OffDuty\",\"checkTime\":\"18:00\",\"across\":0}]}]}' --yes --format json", + "args": [ + "attendance", + "+update-class", + "--class-id", + "999999999999", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--owner", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--class-vo", + "{\"sections\":[{\"times\":[{\"checkType\":\"OnDuty\",\"checkTime\":\"09:00\",\"across\":0},{\"checkType\":\"OffDuty\",\"checkTime\":\"18:00\",\"across\":0}]}]}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_class_setting)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"S0001\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"0b5deb3217840999058236471e08b5\"\n }\n}", + "exit_code": 1, + "duration_ms": 1248, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "attendance", + "command": "+update-group", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +update-group --group-id 999999999999 --name 'DWS shortcut 真实测试 20260715-151724' --type FIXED --owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --enable-outside-check true --class-ids '[999999999999]' --group-vo '{\"defaultClassId\":999999999999,\"workDayClassList\":[999999999999,999999999999,999999999999,999999999999,999999999999,0,0]}' --yes --format json", + "args": [ + "attendance", + "+update-group", + "--group-id", + "999999999999", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--type", + "FIXED", + "--owner", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--enable-outside-check", + "true", + "--class-ids", + "[999999999999]", + "--group-vo", + "{\"defaultClassId\":999999999999,\"workDayClassList\":[999999999999,999999999999,999999999999,999999999999,999999999999,0,0]}", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_setting)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"S0001\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"0b5deb3217840999068826691e087a\"\n }\n}", + "exit_code": 1, + "duration_ms": 1175, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "attendance", + "command": "+update-group-members", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +update-group-members --group-id 999999999999 --add-users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --remove-users '' --add-extra-users '' --remove-extra-users '' --add-depts '' --remove-depts '' --yes --format json", + "args": [ + "attendance", + "+update-group-members", + "--group-id", + "999999999999", + "--add-users", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--remove-users", + "", + "--add-extra-users", + "", + "--remove-extra-users", + "", + "--add-depts", + "", + "--remove-depts", + "", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: attendance-wukong/update_group_member)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"S0002\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"2127d89817840999081094644e07dd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1170, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "attendance", + "command": "+update-leave-type", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test attendance +update-leave-type --leave-code DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --unit day --paid --per-hours 1 --when-can-leave entry --visibility-rules '[{\"type\":\"dept\",\"visible\":[\"-1\"]}]' --yes --format json", + "args": [ + "attendance", + "+update-leave-type", + "--leave-code", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--unit", + "day", + "--paid", + "--per-hours", + "1", + "--when-can-leave", + "entry", + "--visibility-rules", + "[{\"type\":\"dept\",\"visible\":[\"-1\"]}]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[RESOURCE_NOT_FOUND] Requested resource not found (operation: attendance-wukong/save_leave_type)\\n hint: Check if the resource exists or if your account has permission\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"INVALID_PARAMS\",\n \"server_key\": \"attendance-wukong\",\n \"trace_id\": \"0bb7c36217840999093924897e07fe\"\n }\n}", + "exit_code": 1, + "duration_ms": 1208, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "calendar", + "command": "+respond-event", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test calendar +respond-event --event x --response accept --yes --format json", + "args": [ + "calendar", + "+respond-event", + "--event", + "x", + "--response", + "accept", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] code: 300000, developerMessage: Event does not exist. (operation: calendar/respond)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"300000\",\n \"server_key\": \"calendar\",\n \"trace_id\": \"0bb7c36217840999105062121e07db\"\n }\n}", + "exit_code": 1, + "duration_ms": 1217, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+category-add-conversation", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +category-add-conversation --group cidDWSREALTESTNOSUCHCONV --category-ids 999999999999 --yes --format json", + "args": [ + "chat", + "+category-add-conversation", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--category-ids", + "999999999999", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/add_conv_to_categories)\\n hint: Check if the resource exists or if your account has permission\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"0b5deb3217840999117776203e08f9\"\n }\n}", + "exit_code": 1, + "duration_ms": 1213, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "chat", + "command": "+category-remove-conversation", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +category-remove-conversation --group cidDWSREALTESTNOSUCHCONV --category-ids 999999999999 --yes --format json", + "args": [ + "chat", + "+category-remove-conversation", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--category-ids", + "999999999999", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[RESOURCE_NOT_FOUND] Requested resource not found (operation: im/remove_conv_from_categories)\\n hint: Check if the resource exists or if your account has permission\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999130466520e085e\"\n }\n}", + "exit_code": 1, + "duration_ms": 1309, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "chat", + "command": "+chat-add-bot", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-add-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+chat-add-bot", + "--robot-code", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__", + "--id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[RESOURCE_NOT_FOUND] Requested resource not found (operation: bot/add_robot_to_group)\\n hint: Check if the resource exists or if your account has permission\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"500025\",\n \"server_key\": \"bot\",\n \"trace_id\": \"2104a64c17840999144193460e08c7\"\n }\n}", + "exit_code": 1, + "duration_ms": 1273, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "chat", + "command": "+chat-audit-join", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-audit-join --group cidDWSREALTESTNOSUCHCONV --record-id 999999999999 --applicant 103262 --inviter 519019 --status AuditApprove --description 'DWS shortcut 真实测试描述,可删除' --yes --format json", + "args": [ + "chat", + "+chat-audit-join", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--record-id", + "999999999999", + "--applicant", + "103262", + "--inviter", + "519019", + "--status", + "AuditApprove", + "--description", + "DWS shortcut 真实测试描述,可删除", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] applicantUid is required (operation: im/audit_join_group)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"0bb7c36217840999154832733e0758\"\n }\n}", + "exit_code": 1, + "duration_ms": 1073, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "dry-run 已证明 CLI 装配了 applicantUid/inviterUid;真实后端仍报 applicantUid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+chat-mute-member", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-mute-member --group cidDWSREALTESTNOSUCHCONV --users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --mute-time 1 --off --yes --format json", + "args": [ + "chat", + "+chat-mute-member", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--users", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--mute-time", + "1", + "--off", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_group_member_mute_list)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999166036583e08a3\"\n }\n}", + "exit_code": 1, + "duration_ms": 1139, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+chat-quit", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-quit --group cidDWSREALTESTNOSUCHCONV --yes --format json", + "args": [ + "chat", + "+chat-quit", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] listBaseConversationByIds error (operation: im/quit_group)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"0bb7c36217840999176728426e0779\"\n }\n}", + "exit_code": 1, + "duration_ms": 1162, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+chat-remove-bot", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-remove-bot --id DWSREALTESTNOSUCHID0000000000000 --bot-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+chat-remove-bot", + "--id", + "DWSREALTESTNOSUCHID0000000000000", + "--bot-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 无效的会话 (operation: bot/remove_robot_in_group)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"500009\",\n \"server_key\": \"bot\",\n \"trace_id\": \"0b5deb3217840999189888305e08b5\"\n }\n}", + "exit_code": 1, + "duration_ms": 1220, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+chat-role-remove", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-role-remove --group cidDWSREALTESTNOSUCHCONV --role-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+chat-role-remove", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--role-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_group_role)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999200483204e079c\"\n }\n}", + "exit_code": 1, + "duration_ms": 1054, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+chat-role-remove-user", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-role-remove-user --group cidDWSREALTESTNOSUCHCONV --user __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --role-ids DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+chat-role-remove-user", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--user", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--role-ids", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] listBaseConversationByIds error (operation: im/remove_custom_user_roles)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999211317952e0757\"\n }\n}", + "exit_code": 1, + "duration_ms": 1104, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+chat-transfer-owner", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-transfer-owner --group cidDWSREALTESTNOSUCHCONV --new-owner __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --yes --format json", + "args": [ + "chat", + "+chat-transfer-owner", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--new-owner", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId is required (operation: im/transfer_group_owner)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"0b5deb3217840999222318863e087a\"\n }\n}", + "exit_code": 1, + "duration_ms": 1054, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+chat-update-icon", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-update-icon --group cidDWSREALTESTNOSUCHCONV --icon-media-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+chat-update-icon", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--icon-media-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] listBaseConversationByIds error (operation: im/update_group_icon)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999232478654e0819\"\n }\n}", + "exit_code": 1, + "duration_ms": 1023, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+chat-update-settings", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +chat-update-settings --group cidDWSREALTESTNOSUCHCONV --setting-key x --status 1 --yes --format json", + "args": [ + "chat", + "+chat-update-settings", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--setting-key", + "x", + "--status", + "1", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] unsupported setting key: x (operation: im/update_group_settings)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999244326971e07dd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1184, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+conversation-clear-messages", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-clear-messages --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json", + "args": [ + "chat", + "+conversation-clear-messages", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_messages)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999254816721e079b\"\n }\n}", + "exit_code": 1, + "duration_ms": 1065, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+conversation-clear-red-point", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-clear-red-point --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json", + "args": [ + "chat", + "+conversation-clear-red-point", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId or cid is required (operation: im/clear_conversation_red_point)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999265511295e085f\"\n }\n}", + "exit_code": 1, + "duration_ms": 1044, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+conversation-hide", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-hide --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json", + "args": [ + "chat", + "+conversation-hide", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId or cid is required (operation: im/hide_conversation)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999276117140e079b\"\n }\n}", + "exit_code": 1, + "duration_ms": 1064, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+conversation-mark-read", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-mark-read --conversation-id cidDWSREALTESTNOSUCHCONV --message-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+conversation-mark-read", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--message-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/mark_message_read)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999287654280e07bd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1162, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+conversation-mark-unread", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-mark-unread --conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json", + "args": [ + "chat", + "+conversation-mark-unread", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId or cid is required (operation: im/mark_conversation_unread)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"0bb7c36217840999298744910e0758\"\n }\n}", + "exit_code": 1, + "duration_ms": 1090, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+conversation-mute", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-mute --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json", + "args": [ + "chat", + "+conversation-mute", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--off", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId is required (operation: im/update_notification_off)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999309241865e085f\"\n }\n}", + "exit_code": 1, + "duration_ms": 1052, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+conversation-mute-at-all", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-mute-at-all --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json", + "args": [ + "chat", + "+conversation-mute-at-all", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--off", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId is required (operation: im/update_at_all_notification_off)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999320028068e07dd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1110, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+conversation-mute-red-envelope", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-mute-red-envelope --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json", + "args": [ + "chat", + "+conversation-mute-red-envelope", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--off", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId is required (operation: im/update_red_env_notification_off)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"0bb7c36217840999330228283e07fe\"\n }\n}", + "exit_code": 1, + "duration_ms": 1001, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+conversation-set-top", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +conversation-set-top --conversation-id cidDWSREALTESTNOSUCHCONV --off --yes --format json", + "args": [ + "chat", + "+conversation-set-top", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--off", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_top_conversation)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999341302961e07fe\"\n }\n}", + "exit_code": 1, + "duration_ms": 1102, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+messages-add-emoji", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-add-emoji --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --emoji '👍' --yes --format json", + "args": [ + "chat", + "+messages-add-emoji", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--emoji", + "👍", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_emoji_reaction)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999352941910e0756\"\n }\n}", + "exit_code": 1, + "duration_ms": 1170, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-add-text-emotion", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-add-text-emotion --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --emotion-id DWSREALTESTNOSUCHID0000000000000 --emotion-name 'DWS测试表情' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --background-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-add-text-emotion", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--emotion-id", + "DWSREALTESTNOSUCHID0000000000000", + "--emotion-name", + "DWS测试表情", + "--text", + "DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。", + "--background-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/add_text_emotion)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"0b5deb3217840999362862711e08b5\"\n }\n}", + "exit_code": 1, + "duration_ms": 992, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-batch-recall-by-bot", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-batch-recall-by-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --keys DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-batch-recall-by-bot", + "--robot-code", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__", + "--keys", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: bot/batch_recall_robot_users_msg)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"retryable\": true,\n \"server_error_code\": \"ERROR\",\n \"server_key\": \"bot\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"dingOpenErrcode\\\":400014,\\\"errorMsg\\\":\\\"错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确;\\\"} \",\n \"trace_id\": \"2104a64c17840999373456305e0817\"\n }\n}", + "exit_code": 1, + "duration_ms": 1085, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-batch-send-by-bot", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-batch-send-by-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --title 'DWS shortcut 真实测试 20260715-151724' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --open-dingtalk-ids '' --at-all --yes --format json", + "args": [ + "chat", + "+messages-batch-send-by-bot", + "--robot-code", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__", + "--title", + "DWS shortcut 真实测试 20260715-151724", + "--text", + "DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。", + "--users", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--open-dingtalk-ids", + "", + "--at-all", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: bot/batch_send_robot_msg_to_users)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"retryable\": true,\n \"server_error_code\": \"ERROR\",\n \"server_key\": \"bot\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。root.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"dingOpenErrcode\\\":400106,\\\"errorMsg\\\":\\\"错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确;\\\"} \",\n \"trace_id\": \"0bb7c36217840999385748776e0757\"\n }\n}", + "exit_code": 1, + "duration_ms": 1211, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-combine-forward", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-combine-forward --src-conversation-id cidDWSREALTESTNOSUCHCONV --msg-ids DWSREALTESTNOSUCHID0000000000000 --dest-conversation-id cidDWSREALTESTNOSUCHCONV --uuid dws-shortcut-real-negative-20260715-151724 --yes --format json", + "args": [ + "chat", + "+messages-combine-forward", + "--src-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-ids", + "DWSREALTESTNOSUCHID0000000000000", + "--dest-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--uuid", + "dws-shortcut-real-negative-20260715-151724", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] srcOpenCid无效,无法解析为cid (operation: im/combine_forward_messages)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999396596163e08ee\"\n }\n}", + "exit_code": 1, + "duration_ms": 1075, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-create-text-emotion", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-create-text-emotion --emotion-name 'DWS测试表情' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --background-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-create-text-emotion", + "--emotion-name", + "DWS测试表情", + "--text", + "DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。", + "--background-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 暂不支持保存该文字表情 (operation: im/create_text_emotion)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"400519\",\n \"server_key\": \"im\",\n \"trace_id\": \"0b5deb3217840999407422891e08cd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1054, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+messages-forward", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-forward --src-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --dest-conversation-id cidDWSREALTESTNOSUCHCONV --uuid dws-shortcut-real-negative-20260715-151724 --yes --format json", + "args": [ + "chat", + "+messages-forward", + "--src-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dest-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--uuid", + "dws-shortcut-real-negative-20260715-151724", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999417966407e08ee\"\n }\n}", + "exit_code": 1, + "duration_ms": 1090, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-forward-topic", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-forward-topic --src-msg-id DWSREALTESTNOSUCHID0000000000000 --src-conversation-id cidDWSREALTESTNOSUCHCONV --src-thread-id DWSREALTESTNOSUCHID0000000000000 --dest-conversation-id cidDWSREALTESTNOSUCHCONV --yes --format json", + "args": [ + "chat", + "+messages-forward-topic", + "--src-msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--src-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--src-thread-id", + "DWSREALTESTNOSUCHID0000000000000", + "--dest-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openMessageId解密失败 (operation: im/forward_topic)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2127d89817840999428541474e07dd\"\n }\n}", + "exit_code": 1, + "duration_ms": 1043, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-recall", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-recall --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-recall", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId无效,无法解析为cid (operation: im/recall_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999441138103e08c7\"\n }\n}", + "exit_code": 1, + "duration_ms": 1247, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-recall-by-bot", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-recall-by-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --group cidDWSREALTESTNOSUCHCONV --keys DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-recall-by-bot", + "--robot-code", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--keys", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: bot/recall_robot_group_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"bot\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。DingOpenResult.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"dingOpenErrcode\\\":400012,\\\"errorMsg\\\":\\\"错误描述:无效的openConversationId此参数的示例值如\\\\\\\"cidl1B8RVUFmkXXXXXX\\\\\\\";解决方案:请检查拼写是否正确;参考链接:请参考本接口对应文档查看参数的获取方式,或者在https://open.dingtalk.com/ 查询如何获取对应的参数\\\"} \",\n \"trace_id\": \"2104a64c17840999454382709e08a3\"\n }\n}", + "exit_code": 1, + "duration_ms": 1317, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "chat", + "command": "+messages-remove-emoji", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-remove-emoji --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --emoji '👍' --yes --format json", + "args": [ + "chat", + "+messages-remove-emoji", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--emoji", + "👍", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_emoji_reaction)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"0b5deb3217840999467733059e08f9\"\n }\n}", + "exit_code": 1, + "duration_ms": 1347, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-remove-text-emotion", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-remove-text-emotion --conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --emotion-id DWSREALTESTNOSUCHID0000000000000 --emotion-name 'DWS测试表情' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --background-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-remove-text-emotion", + "--conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--emotion-id", + "DWSREALTESTNOSUCHID0000000000000", + "--emotion-name", + "DWS测试表情", + "--text", + "DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。", + "--background-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] invalid openMsgId: DWSREALTESTNOSUCHID0000000000000 (operation: im/remove_text_emotion)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"0b5deb3217840999478923406e087f\"\n }\n}", + "exit_code": 1, + "duration_ms": 1210, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-send-by-bot", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-send-by-bot --robot-code __DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__ --group cidDWSREALTESTNOSUCHCONV --title 'DWS shortcut 真实测试 20260715-151724' --text 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --at-user-ids __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --at-open-dingtalk-ids '' --at-all --yes --format json", + "args": [ + "chat", + "+messages-send-by-bot", + "--robot-code", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--title", + "DWS shortcut 真实测试 20260715-151724", + "--text", + "DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。", + "--at-user-ids", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--at-open-dingtalk-ids", + "", + "--at-all", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: bot/send_robot_group_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"BUSINESS_ERROR\",\n \"server_key\": \"bot\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。DingOpenResult.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"400004\\\",\\\"errorMsg\\\":\\\"robotCode对应的机器人模板不存在\\\"} \",\n \"trace_id\": \"0b5deb3217840999494005921e08ef\"\n }\n}", + "exit_code": 1, + "duration_ms": 1436, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-send-card", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-send-card --receiver 103262 --yes --format json", + "args": [ + "chat", + "+messages-send-card", + "--receiver", + "103262", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] receiverUid和openConversationId不能同时为空 (operation: im/create_and_send_card)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999509255753e081a\"\n }\n}", + "exit_code": 1, + "duration_ms": 1502, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "dry-run 已证明 CLI 装配了 receiverUid;真实后端仍报 receiverUid/openConversationId 为空,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+messages-set-pin", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-set-pin --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-set-pin", + "--open-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId or cid is required (operation: im/set_pin_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"0bb7c36217840999521117991e0758\"\n }\n}", + "exit_code": 1, + "duration_ms": 1217, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+messages-set-top", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-set-top --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-set-top", + "--open-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openMessageId解密失败 (operation: im/set_top_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999532438476e0817\"\n }\n}", + "exit_code": 1, + "duration_ms": 1121, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "chat", + "command": "+messages-unset-pin", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-unset-pin --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-unset-pin", + "--open-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openConversationId or cid is required (operation: im/unset_pin_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"1001\",\n \"server_key\": \"im\",\n \"trace_id\": \"2104a64c17840999544428103e08ee\"\n }\n}", + "exit_code": 1, + "duration_ms": 1185, + "failure_category": "backend-or-mcp-error", + "fixability": "not-cli-fixable-first", + "diagnosis": "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。" + }, + { + "service": "chat", + "command": "+messages-unset-top", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test chat +messages-unset-top --open-conversation-id cidDWSREALTESTNOSUCHCONV --msg-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "chat", + "+messages-unset-top", + "--open-conversation-id", + "cidDWSREALTESTNOSUCHCONV", + "--msg-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] openMessageId解密失败 (operation: im/unset_top_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"0b5deb3217840999554154221e08f9\"\n }\n}", + "exit_code": 1, + "duration_ms": 963, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "devapp", + "command": "+event-subscribe", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +event-subscribe --unified-app-id DWSREALTESTNOSUCHID0000000000000 --event-codes '[]' --yes --format json", + "args": [ + "devapp", + "+event-subscribe", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--event-codes", + "[]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 当前用户没有应用事件订阅权限 (operation: devapp/subscribe_dev_app_events)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"503\",\n \"server_key\": \"devapp\",\n \"trace_id\": \"2104a64c17840999564022020e08c7\"\n }\n}", + "exit_code": 1, + "duration_ms": 1034, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+event-unsubscribe", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +event-unsubscribe --unified-app-id DWSREALTESTNOSUCHID0000000000000 --event-codes '[]' --yes --format json", + "args": [ + "devapp", + "+event-unsubscribe", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--event-codes", + "[]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: devapp/unsubscribe_dev_app_events)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"AUTH_ERROR\",\n \"server_key\": \"devapp\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"503\\\",\\\"errorMsg\\\":\\\"当前用户没有应用事件订阅权限\\\"} \",\n \"trace_id\": \"0bb7c36217840999575698500e07db\"\n }\n}", + "exit_code": 1, + "duration_ms": 1134, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+permission-add", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +permission-add --unified-app-id DWSREALTESTNOSUCHID0000000000000 --scope-values '[]' --yes --format json", + "args": [ + "devapp", + "+permission-add", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--scope-values", + "[]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/apply_dev_app_permissions)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"503\",\n \"server_key\": \"devapp\",\n \"trace_id\": \"2127d89817840999587758457e079c\"\n }\n}", + "exit_code": 1, + "duration_ms": 1186, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+permission-remove", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +permission-remove --unified-app-id DWSREALTESTNOSUCHID0000000000000 --scope-values '[]' --yes --format json", + "args": [ + "devapp", + "+permission-remove", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--scope-values", + "[]", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/remove_dev_app_permissions)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"503\",\n \"server_key\": \"devapp\",\n \"trace_id\": \"2104a64c17840999598445247e085e\"\n }\n}", + "exit_code": 1, + "duration_ms": 1061, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+robot-config", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +robot-config --unified-app-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --brief x --desc 'DWS shortcut 真实测试描述,可删除' --icon-media-id DWSREALTESTNOSUCHID0000000000000 --outgoing-url https://example.invalid/dws-shortcut-real-test --event-callback-url https://example.invalid/dws-shortcut-real-test --mode HTTPS --skills '[]' --add-scope --disable-ssl-verify --yes --format json", + "args": [ + "devapp", + "+robot-config", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--brief", + "x", + "--desc", + "DWS shortcut 真实测试描述,可删除", + "--icon-media-id", + "DWSREALTESTNOSUCHID0000000000000", + "--outgoing-url", + "https://example.invalid/dws-shortcut-real-test", + "--event-callback-url", + "https://example.invalid/dws-shortcut-real-test", + "--mode", + "HTTPS", + "--skills", + "[]", + "--add-scope", + "--disable-ssl-verify", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: devapp/set_extension_robot_config)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"AUTH_ERROR\",\n \"server_key\": \"devapp\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"503\\\",\\\"errorMsg\\\":\\\"当前用户没有应用机器人配置权限\\\"} \",\n \"trace_id\": \"0bb7c36217840999609828961e07db\"\n }\n}", + "exit_code": 1, + "duration_ms": 1167, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+robot-disable", + "risk": "high-risk-write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +robot-disable --unified-app-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "devapp", + "+robot-disable", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: devapp/disable_dev_app_robot)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"AUTH_ERROR\",\n \"server_key\": \"devapp\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"503\\\",\\\"errorMsg\\\":\\\"当前用户没有应用机器人配置权限\\\"} \",\n \"trace_id\": \"2104a64c17840999620461113e08ee\"\n }\n}", + "exit_code": 1, + "duration_ms": 1062, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+robot-enable", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +robot-enable --unified-app-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "devapp", + "+robot-enable", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: devapp/enable_dev_app_robot)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"AUTH_ERROR\",\n \"server_key\": \"devapp\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"503\\\",\\\"errorMsg\\\":\\\"当前用户没有应用机器人配置权限\\\"} \",\n \"trace_id\": \"0bb7c36217840999632641525e0758\"\n }\n}", + "exit_code": 1, + "duration_ms": 1306, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+security-config", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +security-config --unified-app-id DWSREALTESTNOSUCHID0000000000000 --ip-whitelist 127.0.0.1 --redirect-urls https://example.invalid/dws-shortcut-real-test --sso-urls https://example.invalid/dws-shortcut-real-test --yes --format json", + "args": [ + "devapp", + "+security-config", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--ip-whitelist", + "127.0.0.1", + "--redirect-urls", + "https://example.invalid/dws-shortcut-real-test", + "--sso-urls", + "https://example.invalid/dws-shortcut-real-test", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] 当前用户没有开发者身份 (operation: devapp/update_dev_app_security_config)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"503\",\n \"server_key\": \"devapp\",\n \"trace_id\": \"2104a64c17840999645522046e0817\"\n }\n}", + "exit_code": 1, + "duration_ms": 1205, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "devapp", + "command": "+version-create", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +version-create --unified-app-id DWSREALTESTNOSUCHID0000000000000 --version 0.0.1-dws-real-test --desc 'DWS shortcut 真实测试描述,可删除' --yes --format json", + "args": [ + "devapp", + "+version-create", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--version", + "0.0.1-dws-real-test", + "--desc", + "DWS shortcut 真实测试描述,可删除", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: devapp/create_dev_app_version)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"BUSINESS_ERROR\",\n \"server_key\": \"devapp\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"450001\\\"} \",\n \"trace_id\": \"0b5deb3217840999656705920e0853\"\n }\n}", + "exit_code": 1, + "duration_ms": 1157, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "devapp", + "command": "+version-publish", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test devapp +version-publish --unified-app-id DWSREALTESTNOSUCHID0000000000000 --version-id DWSREALTESTNOSUCHID0000000000000 --confirmed-sensitive --approver-user-id __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --yes --format json", + "args": [ + "devapp", + "+version-publish", + "--unified-app-id", + "DWSREALTESTNOSUCHID0000000000000", + "--version-id", + "DWSREALTESTNOSUCHID0000000000000", + "--confirmed-sensitive", + "--approver-user-id", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] business error: success=false (operation: devapp/publish_dev_app_version)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"BUSINESS_ERROR\",\n \"server_key\": \"devapp\",\n \"technical_detail\": \"iPaaS 调用失败: 调用远程服务业务异常, 出参校验不通过。ServiceResult.success当前值:false, 预期值:true,所有值:{\\\"success\\\":false,\\\"errorCode\\\":\\\"450001\\\"} \",\n \"trace_id\": \"2127d89817840999667906017e075d\"\n }\n}", + "exit_code": 1, + "duration_ms": 1071, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "ding", + "command": "+send-by-message", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test ding +send-by-message --group cidDWSREALTESTNOSUCHCONV --message-id DWSREALTESTNOSUCHID0000000000000 --users __DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__ --type FIXED --uuid dws-shortcut-real-negative-20260715-151724 --yes --format json", + "args": [ + "ding", + "+send-by-message", + "--group", + "cidDWSREALTESTNOSUCHCONV", + "--message-id", + "DWSREALTESTNOSUCHID0000000000000", + "--users", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__", + "--type", + "FIXED", + "--uuid", + "dws-shortcut-real-negative-20260715-151724", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] remindType非法,合法值:APP/SMS/PHONE (operation: im/send_ding_by_message)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"PARAM_ERROR\",\n \"server_key\": \"im\",\n \"trace_id\": \"0b5deb3217840999678466213e0853\"\n }\n}", + "exit_code": 1, + "duration_ms": 1058, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "doc", + "command": "+comment-create-inline", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test doc +comment-create-inline --node DWSREALTESTNOSUCHID0000000000000 --content 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --block-id DWSREALTESTNOSUCHID0000000000000 --start 0 --end 1 --selected-text 'DWS测试' --mention x --yes --format json", + "args": [ + "doc", + "+comment-create-inline", + "--node", + "DWSREALTESTNOSUCHID0000000000000", + "--content", + "DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。", + "--block-id", + "DWSREALTESTNOSUCHID0000000000000", + "--start", + "0", + "--end", + "1", + "--selected-text", + "DWS测试", + "--mention", + "x", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[TABLE_NOT_FOUND] Requested resource not found (operation: doc-comment/create_inline_comment)\\n hint: Document may have been deleted or moved\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"invalidRequest.inputArgs.invalid\",\n \"server_key\": \"doc-comment\",\n \"trace_id\": \"2127d89817840999689931893e079c\"\n }\n}", + "exit_code": 1, + "duration_ms": 1183, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "doc", + "command": "+template-apply", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test doc +template-apply --template-id DWSREALTESTNOSUCHID0000000000000 --name 'DWS shortcut 真实测试 20260715-151724' --folder DWSREALTESTNOSUCHID0000000000000 --workspace DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "doc", + "+template-apply", + "--template-id", + "DWSREALTESTNOSUCHID0000000000000", + "--name", + "DWS shortcut 真实测试 20260715-151724", + "--folder", + "DWSREALTESTNOSUCHID0000000000000", + "--workspace", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[RESOURCE_NOT_FOUND] Requested resource not found (operation: doc/apply_doc_template)\\n hint: Check if the resource exists or if your account has permission\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"invalidRequest.inputArgs.invalid\",\n \"server_key\": \"doc\",\n \"trace_id\": \"2127d89817840999701186954e0757\"\n }\n}", + "exit_code": 1, + "duration_ms": 1093, + "failure_category": "auth-or-permission", + "fixability": "not-cli-fixable", + "diagnosis": "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。" + }, + { + "service": "minutes", + "command": "+record-pause", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test minutes +record-pause --id DWSREALTESTNOSUCHID0000000000000 --session-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "minutes", + "+record-pause", + "--id", + "DWSREALTESTNOSUCHID0000000000000", + "--session-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"aiAgentTestRunCmdUnknownError\",\n \"server_key\": \"minutes\",\n \"trace_id\": \"0bb7c36217840999713124987e0757\"\n }\n}", + "exit_code": 1, + "duration_ms": 1233, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "minutes", + "command": "+record-resume", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test minutes +record-resume --id DWSREALTESTNOSUCHID0000000000000 --session-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "minutes", + "+record-resume", + "--id", + "DWSREALTESTNOSUCHID0000000000000", + "--session-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"aiAgentTestRunCmdUnknownError\",\n \"server_key\": \"minutes\",\n \"trace_id\": \"0bb7c36217840999724452848e0758\"\n }\n}", + "exit_code": 1, + "duration_ms": 1074, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "minutes", + "command": "+record-stop", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test minutes +record-stop --id DWSREALTESTNOSUCHID0000000000000 --session-id DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "minutes", + "+record-stop", + "--id", + "DWSREALTESTNOSUCHID0000000000000", + "--session-id", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[UNCLASSIFIED] aiAgentTestRunCmdUnknownError (operation: minutes/执行听记指令-发起AI听记录音)\\n hint: Use --verbose for detailed error logs\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"aiAgentTestRunCmdUnknownError\",\n \"server_key\": \"minutes\",\n \"trace_id\": \"2127d89817840999735397508e0757\"\n }\n}", + "exit_code": 1, + "duration_ms": 1130, + "failure_category": "input-or-business-validation", + "fixability": "test-input-or-backend-rule", + "diagnosis": "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。" + }, + { + "service": "oa", + "command": "+approve-by", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test oa +approve-by --keyword __DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_20260715-151724__ --comment 'DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。' --yes --format json", + "args": [ + "oa", + "+approve-by", + "--keyword", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_20260715-151724__", + "--comment", + "DWS shortcut 真实测试 20260715-151724,安全负向输入,请忽略。", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"没找到待审批单据:待我处理的审批里没有标题/单号包含 \\\"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_20260715-151724__\\\" 的单据。\"\n }\n}", + "exit_code": 3, + "duration_ms": 1318, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "wiki", + "command": "+node-copy", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test wiki +node-copy --workspace DWSREALTESTNOSUCHID0000000000000 --node DWSREALTESTNOSUCHID0000000000000 --folder DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "wiki", + "+node-copy", + "--workspace", + "DWSREALTESTNOSUCHID0000000000000", + "--node", + "DWSREALTESTNOSUCHID0000000000000", + "--folder", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[TABLE_NOT_FOUND] Requested resource not found (operation: doc/copy_document)\\n hint: Document may have been deleted or moved\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"invalidRequest.inputArgs.invalid\",\n \"server_key\": \"doc\",\n \"trace_id\": \"0bb7c36217840999769818495e0779\"\n }\n}", + "exit_code": 1, + "duration_ms": 1000, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "wiki", + "command": "+node-move", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test wiki +node-move --workspace DWSREALTESTNOSUCHID0000000000000 --node DWSREALTESTNOSUCHID0000000000000 --folder DWSREALTESTNOSUCHID0000000000000 --yes --format json", + "args": [ + "wiki", + "+node-move", + "--workspace", + "DWSREALTESTNOSUCHID0000000000000", + "--node", + "DWSREALTESTNOSUCHID0000000000000", + "--folder", + "DWSREALTESTNOSUCHID0000000000000", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"api\",\n \"code\": 1,\n \"hint\": \"The API returned a business-level error. Check required parameters and values.\",\n \"message\": \"[TABLE_NOT_FOUND] Requested resource not found (operation: doc/move_document)\\n hint: Document may have been deleted or moved\",\n \"operation\": \"tools/call\",\n \"reason\": \"business_error\",\n \"server_error_code\": \"invalidRequest.inputArgs.invalid\",\n \"server_key\": \"doc\",\n \"trace_id\": \"0bb7c36217840999780286509e07fe\"\n }\n}", + "exit_code": 1, + "duration_ms": 1053, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "wiki", + "command": "+wiki-new-doc", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-error", + "input": "/private/tmp/dws-real-test wiki +wiki-new-doc --space __DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__ --title 'DWS shortcut 真实测试 20260715-151724' --yes --format json", + "args": [ + "wiki", + "+wiki-new-doc", + "--space", + "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__", + "--title", + "DWS shortcut 真实测试 20260715-151724", + "--yes", + "--format", + "json" + ], + "stdout": "", + "stderr": "{\n \"error\": {\n \"category\": \"validation\",\n \"code\": 3,\n \"message\": \"没找到名为 \\\"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__\\\" 的知识库;换个更完整/精确的空间名再试。\"\n }\n}", + "exit_code": 3, + "duration_ms": 1152, + "failure_category": "missing-real-resource", + "fixability": "not-cli-fixable-without-fixture", + "diagnosis": "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。" + }, + { + "service": "todo", + "command": "+todo-done", + "risk": "write", + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": "real-ok", + "input": "/private/tmp/dws-real-test todo +todo-done --task 'DWS shortcut 真实测试待办 20260715-160449' --yes --format json", + "args": [ + "todo", + "+todo-done", + "--task", + "DWS shortcut 真实测试待办 20260715-160449", + "--yes", + "--format", + "json" + ], + "stdout": "{\n \"result\": {\n \"success\": true\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 1771, + "setup": { + "purpose": "为 todo +todo-done 创建当前账号自己的临时待办 fixture", + "input": "/private/tmp/dws-real-test todo +remind --task 'DWS shortcut 真实测试待办 20260715-160449' --at 2026-07-22T10:15:00+08:00 --yes --format json", + "stdout": "{\n \"arguments\": [],\n \"result\": {\n \"subject\": \"DWS shortcut 真实测试待办 20260715-160449\",\n \"taskId\": \"55055639461\"\n },\n \"success\": true\n}", + "stderr": "", + "exit_code": 0, + "duration_ms": 2611 + } + } + ] +} \ No newline at end of file diff --git a/internal/helpers/chat.go b/internal/helpers/chat.go index d31690d7..632b8f9e 100644 --- a/internal/helpers/chat.go +++ b/internal/helpers/chat.go @@ -1372,9 +1372,10 @@ func newChatCommand() *cobra.Command { timeVal := mustGetFlag(cmd, "time") if groupID != "" { toolArgs := map[string]any{ - "openconversation_id": groupID, - "time": timeVal, - "forward": forward, + "openCid": groupID, + "cid": groupID, + "time": timeVal, + "forward": forward, } if v := chatIntFlagOrFallback(cmd, "limit", "size"); v > 0 { toolArgs["limit"] = v @@ -1500,14 +1501,13 @@ func newChatCommand() *cobra.Command { openDingTalkID = userID userID = "" } - // 数字 userId 尝试 lookup 转换为 openDingTalkId,让所有消息类型(文本/媒体)都走 openDingTalkId 路径 - // lookup 失败时降级保留 userID,由下游用 receiverUserId 发送 + // 数字 userId 尝试 lookup 转换为 openDingTalkId,让所有消息类型(文本/媒体)都走 openDingTalkId 路径。 + // 真实后端的 send_personal_message 单聊路径稳定接受 receiverOpenDingTalkId; + // userId/uid 直传会被服务端判定为空,因此解析失败时直接返回明确错误。 if userID != "" { resolved, err := resolveOpenDingTalkID(cmd.Context(), userID) if err != nil { - if commandBoolFlag(cmd, "debug") || commandBoolFlag(cmd, "verbose") { - fmt.Fprintf(os.Stderr, "[debug] resolveOpenDingTalkID(%q) failed: %v, falling back to receiverUserId\n", userID, err) - } + return fmt.Errorf("cannot resolve --user %q to openDingTalkId: %w; pass --open-dingtalk-id instead", userID, err) } else { if commandBoolFlag(cmd, "debug") || commandBoolFlag(cmd, "verbose") { fmt.Fprintf(os.Stderr, "[debug] resolved userID=%q to openDingTalkId=%q\n", userID, resolved) @@ -1611,7 +1611,7 @@ func newChatCommand() *cobra.Command { } else if openDingTalkID != "" { params["receiverOpenDingTalkId"] = openDingTalkID } else if userID != "" { - params["receiverUserId"] = userID + params["receiverUid"] = userID } else { return fmt.Errorf("--group, --user or --open-dingtalk-id is required for media messages") } @@ -1667,10 +1667,10 @@ func newChatCommand() *cobra.Command { if userID != "" { directContentJSON, _ := marshalJSONRaw(map[string]string{"title": title, "text": text}) directMsgParams := map[string]any{ - "receiverUserId": userID, - "msgType": "markdown", - "content": string(directContentJSON), - "clawType": clawType, + "receiverUid": userID, + "msgType": "markdown", + "content": string(directContentJSON), + "clawType": clawType, } if msgUuid != "" { directMsgParams["uuid"] = msgUuid @@ -4334,8 +4334,8 @@ status 可选值: AuditIgnore — 忽略(服务端拒绝,不可用) AuditRefuse — 拒绝(服务端拒绝,不可用) AuditBlock — 拒绝且不再接受该用户的申请(服务端拒绝,不可用)`, - Example: ` dws chat group audit-join-validation --group --record-id 123456 --applicant --inviter --status AuditApprove - dws chat group audit-join-validation --group --record-id 123456 --applicant --inviter --status AuditDelete --description "不符合入群条件" + Example: ` dws chat group audit-join-validation --group --record-id 123456 --applicant --inviter --status AuditApprove + dws chat group audit-join-validation --group --record-id 123456 --applicant --inviter --status AuditDelete --description "不符合入群条件" # 查询入群验证记录: dws chat group list-join-validations`, RunE: func(cmd *cobra.Command, args []string) error { if err := validateRequiredFlags(cmd, "group", "record-id", "applicant", "inviter", "status"); err != nil { @@ -4346,11 +4346,11 @@ status 可选值: return fmt.Errorf("--record-id must be a valid integer: %w", err) } toolArgs := map[string]any{ - "openConversationId": mustGetFlag(cmd, "group"), - "applyRecordId": recordID, - "applicantOpenDingTalkId": mustGetFlag(cmd, "applicant"), - "inviterOpenDingTalkId": mustGetFlag(cmd, "inviter"), - "status": mustGetFlag(cmd, "status"), + "openConversationId": mustGetFlag(cmd, "group"), + "applyRecordId": recordID, + "applicantUid": mustGetFlag(cmd, "applicant"), + "inviterUid": mustGetFlag(cmd, "inviter"), + "status": mustGetFlag(cmd, "status"), } if v, _ := cmd.Flags().GetString("description"); v != "" { toolArgs["auditDescription"] = v @@ -4364,9 +4364,9 @@ status 可选值: _ = chatGroupAuditJoinValidationCmd.MarkFlagRequired("record-id") chatGroupAuditJoinValidationCmd.Flags().String("status", "", "审批动作,真机仅 AuditApprove/AuditDelete 可用;AuditIgnore/AuditRefuse/AuditBlock 服务端拒绝 (必填)") _ = chatGroupAuditJoinValidationCmd.MarkFlagRequired("status") - chatGroupAuditJoinValidationCmd.Flags().String("applicant", "", "申请人 openDingTalkId (必填)") + chatGroupAuditJoinValidationCmd.Flags().String("applicant", "", "申请人 userId (必填)") _ = chatGroupAuditJoinValidationCmd.MarkFlagRequired("applicant") - chatGroupAuditJoinValidationCmd.Flags().String("inviter", "", "邀请人 openDingTalkId (必填)") + chatGroupAuditJoinValidationCmd.Flags().String("inviter", "", "邀请人 userId (必填)") _ = chatGroupAuditJoinValidationCmd.MarkFlagRequired("inviter") chatGroupAuditJoinValidationCmd.Flags().String("description", "", "审批说明(可选)") diff --git a/internal/helpers/helpers.go b/internal/helpers/helpers.go index 8cd14dea..f53bc35b 100644 --- a/internal/helpers/helpers.go +++ b/internal/helpers/helpers.go @@ -459,9 +459,34 @@ func buildMinimalPATJSON(code string) string { // isBusinessError checks if a parsed JSON body represents a business-level error. func isBusinessError(body map[string]any) bool { - if _, ok := body["error"].(string); ok { + if v, ok := body["error"]; ok { + switch t := v.(type) { + case string: + if strings.TrimSpace(t) != "" { + return true + } + case map[string]any: + if len(t) > 0 { + return true + } + case []any: + if len(t) > 0 { + return true + } + default: + if t != nil { + return true + } + } + } + if v, ok := body["status"].(string); ok && strings.EqualFold(strings.TrimSpace(v), "error") { return true } + for _, key := range []string{"errorCode", "error_code", "code"} { + if isErrorCodeValue(body[key]) { + return true + } + } if v, ok := body["success"].(bool); ok && !v { return true } @@ -471,6 +496,32 @@ func isBusinessError(body map[string]any) bool { return false } +func isErrorCodeValue(v any) bool { + switch t := v.(type) { + case string: + code := strings.TrimSpace(t) + if code == "" { + return false + } + switch strings.ToLower(code) { + case "0", "ok", "success", "succeed": + return false + default: + return true + } + case float64: + return t != 0 + case int: + return t != 0 + case int64: + return t != 0 + case json.Number: + return strings.TrimSpace(t.String()) != "" && t.String() != "0" + default: + return false + } +} + // isNotLoggedInError checks if the error body indicates missing authentication. func isNotLoggedInError(body map[string]any) bool { if errMsg, ok := body["error"].(string); ok { diff --git a/internal/helpers/helpers_error_test.go b/internal/helpers/helpers_error_test.go new file mode 100644 index 00000000..81c0ecc7 --- /dev/null +++ b/internal/helpers/helpers_error_test.go @@ -0,0 +1,41 @@ +package helpers + +import "testing" + +func TestIsBusinessErrorRecognizesRealErrorEnvelopes(t *testing.T) { + cases := []map[string]any{ + {"status": "error", "success": true, "error": map[string]any{"code": "INVALID_BASE_ID"}}, + {"success": true, "errorCode": "1001"}, + {"success": true, "error": []any{"failed"}}, + {"success": false}, + } + for _, tc := range cases { + if !isBusinessError(tc) { + t.Fatalf("isBusinessError(%v) = false, want true", tc) + } + } +} + +func TestIsBusinessErrorAllowsSuccessEnvelope(t *testing.T) { + body := map[string]any{ + "success": true, + "errorCode": nil, + "errorMsg": nil, + "result": map[string]any{"ok": true}, + } + if isBusinessError(body) { + t.Fatalf("isBusinessError(%v) = true, want false", body) + } +} + +func TestIsBusinessErrorAllowsCodeZeroSuccessEnvelope(t *testing.T) { + body := map[string]any{ + "success": true, + "code": "0", + "message": "success", + "result": []any{}, + } + if isBusinessError(body) { + t.Fatalf("isBusinessError(%v) = true, want false", body) + } +} diff --git a/internal/shortcut/chat/chat_conversation.go b/internal/shortcut/chat/chat_conversation.go index 8e5df36a..618e1c41 100644 --- a/internal/shortcut/chat/chat_conversation.go +++ b/internal/shortcut/chat/chat_conversation.go @@ -63,6 +63,7 @@ var ConversationSetTop = shortcut.Shortcut{ Execute: func(rt *shortcut.RuntimeContext) error { return rt.CallMCP("set_top_conversation", map[string]any{ "openConversationId": rt.Str("conversation-id"), + "cid": rt.Str("conversation-id"), "top": !rt.Bool("off"), }) }, @@ -84,6 +85,7 @@ var ConversationMute = shortcut.Shortcut{ Execute: func(rt *shortcut.RuntimeContext) error { return rt.CallMCP("update_notification_off", map[string]any{ "openConversationId": rt.Str("conversation-id"), + "cid": rt.Str("conversation-id"), "mute": !rt.Bool("off"), }) }, @@ -105,6 +107,7 @@ var ConversationMuteAtAll = shortcut.Shortcut{ Execute: func(rt *shortcut.RuntimeContext) error { return rt.CallMCP("update_at_all_notification_off", map[string]any{ "openConversationId": rt.Str("conversation-id"), + "cid": rt.Str("conversation-id"), "mute": !rt.Bool("off"), }) }, @@ -126,6 +129,7 @@ var ConversationMuteRedEnvelope = shortcut.Shortcut{ Execute: func(rt *shortcut.RuntimeContext) error { return rt.CallMCP("update_red_env_notification_off", map[string]any{ "openConversationId": rt.Str("conversation-id"), + "cid": rt.Str("conversation-id"), "mute": !rt.Bool("off"), }) }, @@ -144,7 +148,10 @@ var ConversationMarkUnread = shortcut.Shortcut{ }, Tips: []string{`dws chat +conversation-mark-unread --conversation-id `}, Execute: func(rt *shortcut.RuntimeContext) error { - return rt.CallMCP("mark_conversation_unread", map[string]any{"openConversationId": rt.Str("conversation-id")}) + return rt.CallMCP("mark_conversation_unread", map[string]any{ + "openConversationId": rt.Str("conversation-id"), + "cid": rt.Str("conversation-id"), + }) }, } @@ -161,7 +168,10 @@ var ConversationClearRedPoint = shortcut.Shortcut{ }, Tips: []string{`dws chat +conversation-clear-red-point --conversation-id `}, Execute: func(rt *shortcut.RuntimeContext) error { - return rt.CallMCP("clear_conversation_red_point", map[string]any{"openConversationId": rt.Str("conversation-id")}) + return rt.CallMCP("clear_conversation_red_point", map[string]any{ + "openConversationId": rt.Str("conversation-id"), + "cid": rt.Str("conversation-id"), + }) }, } @@ -399,7 +409,10 @@ var ConversationClearMessages = shortcut.Shortcut{ }, Tips: []string{`dws chat +conversation-clear-messages --conversation-id `}, Execute: func(rt *shortcut.RuntimeContext) error { - return rt.CallMCP("clear_conversation_messages", map[string]any{"openConversationId": rt.Str("conversation-id")}) + return rt.CallMCP("clear_conversation_messages", map[string]any{ + "openConversationId": rt.Str("conversation-id"), + "cid": rt.Str("conversation-id"), + }) }, } @@ -437,7 +450,10 @@ var ConversationHide = shortcut.Shortcut{ }, Tips: []string{`dws chat +conversation-hide --conversation-id `}, Execute: func(rt *shortcut.RuntimeContext) error { - return rt.CallMCP("hide_conversation", map[string]any{"openConversationId": rt.Str("conversation-id")}) + return rt.CallMCP("hide_conversation", map[string]any{ + "openConversationId": rt.Str("conversation-id"), + "cid": rt.Str("conversation-id"), + }) }, } diff --git a/internal/shortcut/chat/chat_group.go b/internal/shortcut/chat/chat_group.go index 714f7b63..449836ef 100644 --- a/internal/shortcut/chat/chat_group.go +++ b/internal/shortcut/chat/chat_group.go @@ -64,6 +64,7 @@ var ChatMembersGet = shortcut.Shortcut{ Execute: func(rt *shortcut.RuntimeContext) error { return rt.CallMCP("list_group_member_by_ids", map[string]any{ "openConversationId": rt.Str("id"), + "cid": rt.Str("id"), "memberOpenDingTalkIds": rt.StrSlice("users"), }) }, @@ -87,7 +88,10 @@ var ChatTransferOwner = shortcut.Shortcut{ Tips: []string{`dws chat +chat-transfer-owner --group --new-owner `}, Execute: func(rt *shortcut.RuntimeContext) error { newOwner := rt.Str("new-owner") - params := map[string]any{"openConversationId": rt.Str("group")} + params := map[string]any{ + "openConversationId": rt.Str("group"), + "cid": rt.Str("group"), + } if isOpenID(newOwner) { params["newOwnerOpenDingTalkId"] = newOwner } else { @@ -111,7 +115,10 @@ var ChatInviteURL = shortcut.Shortcut{ }, Tips: []string{`dws chat +chat-invite-url --group `}, Execute: func(rt *shortcut.RuntimeContext) error { - params := map[string]any{"openConversationId": rt.Str("group")} + params := map[string]any{ + "openConversationId": rt.Str("group"), + "cid": rt.Str("group"), + } if rt.Changed("expires-seconds") { params["expiresSeconds"] = rt.Int("expires-seconds") } @@ -457,24 +464,24 @@ var ChatAuditJoin = shortcut.Shortcut{ Command: "+chat-audit-join", Product: "im", Description: "审批入群验证(通过/拒绝/删除/忽略/拉黑)", - Intent: "当你要处理某条入群申请时使用;会实际执行通过/拒绝/删除/忽略/拉黑动作,需传群 openConversationId、recordId、申请人与邀请人 openDingTalkId 及 status。", + Intent: "当你要处理某条入群申请时使用;会实际执行通过/拒绝/删除/忽略/拉黑动作,需传群 openConversationId、recordId、申请人与邀请人 userId 及 status。", Risk: shortcut.RiskWrite, Flags: []shortcut.Flag{ {Name: "group", Type: shortcut.FlagString, Desc: "群 openConversationId", Required: true}, {Name: "record-id", Type: shortcut.FlagInt, Desc: "申请记录 ID", Required: true}, - {Name: "applicant", Type: shortcut.FlagString, Desc: "申请人 openDingTalkId", Required: true}, - {Name: "inviter", Type: shortcut.FlagString, Desc: "邀请人 openDingTalkId", Required: true}, + {Name: "applicant", Type: shortcut.FlagString, Desc: "申请人 userId", Required: true}, + {Name: "inviter", Type: shortcut.FlagString, Desc: "邀请人 userId", Required: true}, {Name: "status", Type: shortcut.FlagString, Desc: "审批动作", Required: true, Enum: []string{"AuditApprove", "AuditDelete", "AuditIgnore", "AuditRefuse", "AuditBlock"}}, {Name: "description", Type: shortcut.FlagString, Desc: "审批说明"}, }, - Tips: []string{`dws chat +chat-audit-join --group --record-id 123 --applicant --inviter --status AuditApprove`}, + Tips: []string{`dws chat +chat-audit-join --group --record-id 123 --applicant --inviter --status AuditApprove`}, Execute: func(rt *shortcut.RuntimeContext) error { params := map[string]any{ - "openConversationId": rt.Str("group"), - "applyRecordId": rt.Int("record-id"), - "applicantOpenDingTalkId": rt.Str("applicant"), - "inviterOpenDingTalkId": rt.Str("inviter"), - "status": rt.Str("status"), + "openConversationId": rt.Str("group"), + "applyRecordId": rt.Int("record-id"), + "applicantUid": rt.Str("applicant"), + "inviterUid": rt.Str("inviter"), + "status": rt.Str("status"), } if rt.Changed("description") { params["auditDescription"] = rt.Str("description") @@ -661,6 +668,7 @@ var ChatMuteMember = shortcut.Shortcut{ off := rt.Bool("off") params := map[string]any{ "openConversationId": rt.Str("group"), + "cid": rt.Str("group"), "mute": !off, } if len(userIDs) > 0 { diff --git a/internal/shortcut/chat/chat_message.go b/internal/shortcut/chat/chat_message.go index e575b4c9..fe9cd185 100644 --- a/internal/shortcut/chat/chat_message.go +++ b/internal/shortcut/chat/chat_message.go @@ -214,9 +214,10 @@ var MessagesList = shortcut.Shortcut{ Tips: []string{`dws chat +messages-list --group --time "2025-03-01 00:00:00"`}, Execute: func(rt *shortcut.RuntimeContext) error { params := map[string]any{ - "openconversation_id": rt.Str("group"), - "time": rt.Str("time"), - "forward": rt.Bool("forward"), + "openCid": rt.Str("group"), + "cid": rt.Str("group"), + "time": rt.Str("time"), + "forward": rt.Bool("forward"), } if rt.Int("limit") > 0 { params["limit"] = rt.Int("limit") @@ -638,11 +639,11 @@ var MessagesSendCard = shortcut.Shortcut{ Command: "+messages-send-card", Product: "im", Description: "创建并推送流式卡片(需配合 messages-update-card)", - Intent: "当你要发送一张可后续流式更新的卡片消息(如 AI 逐字输出)时使用;会实际推送卡片并返回 bizId,群 openConversationId 或单聊接收者 openDingTalkId 二选一,配合 messages-update-card 更新。", + Intent: "当你要发送一张可后续流式更新的卡片消息(如 AI 逐字输出)时使用;会实际推送卡片并返回 bizId,群 openConversationId 或单聊接收者 userId 二选一,配合 messages-update-card 更新。", Risk: shortcut.RiskWrite, Flags: []shortcut.Flag{ {Name: "group", Type: shortcut.FlagString, Desc: "群 openConversationId(与 --receiver 互斥)"}, - {Name: "receiver", Type: shortcut.FlagString, Desc: "单聊接收者 openDingTalkId(与 --group 互斥)"}, + {Name: "receiver", Type: shortcut.FlagString, Desc: "单聊接收者 userId(与 --group 互斥)"}, }, Tips: []string{`dws chat +messages-send-card --group `}, Execute: func(rt *shortcut.RuntimeContext) error { @@ -658,7 +659,7 @@ var MessagesSendCard = shortcut.Shortcut{ if group != "" { params["openConversationId"] = group } else { - params["receiverOpenDingTalkId"] = receiver + params["receiverUid"] = receiver } return rt.CallMCP("create_and_send_card", params) }, @@ -809,6 +810,7 @@ var MessagesSetPin = shortcut.Shortcut{ Execute: func(rt *shortcut.RuntimeContext) error { return rt.CallMCP("set_pin_message", map[string]any{ "openConversationId": rt.Str("open-conversation-id"), + "cid": rt.Str("open-conversation-id"), "openMessageId": rt.Str("msg-id"), }) }, @@ -830,6 +832,7 @@ var MessagesUnsetPin = shortcut.Shortcut{ Execute: func(rt *shortcut.RuntimeContext) error { return rt.CallMCP("unset_pin_message", map[string]any{ "openConversationId": rt.Str("open-conversation-id"), + "cid": rt.Str("open-conversation-id"), "openMessageId": rt.Str("msg-id"), }) }, @@ -850,7 +853,10 @@ var MessagesListPin = shortcut.Shortcut{ }, Tips: []string{`dws chat +messages-list-pin --open-conversation-id `}, Execute: func(rt *shortcut.RuntimeContext) error { - params := map[string]any{"openConversationId": rt.Str("open-conversation-id")} + params := map[string]any{ + "openConversationId": rt.Str("open-conversation-id"), + "cid": rt.Str("open-conversation-id"), + } if rt.Changed("cursor") { params["cursor"] = rt.Str("cursor") } diff --git a/internal/shortcut/register.go b/internal/shortcut/register.go index 83e6a3b1..b24c348d 100644 --- a/internal/shortcut/register.go +++ b/internal/shortcut/register.go @@ -28,6 +28,9 @@ var allShortcuts []Shortcut // Register adds one or more shortcuts to the built-in registry. Call from a // service package's init(). func Register(shortcuts ...Shortcut) { + for i := range shortcuts { + shortcuts[i] = applyReleaseGate(shortcuts[i]) + } allShortcuts = append(allShortcuts, shortcuts...) } diff --git a/internal/shortcut/release_gate.go b/internal/shortcut/release_gate.go new file mode 100644 index 00000000..2916cfc7 --- /dev/null +++ b/internal/shortcut/release_gate.go @@ -0,0 +1,23 @@ +// Copyright 2026 Alibaba Group +// Licensed under the Apache License, Version 2.0 + +package shortcut + +func releaseHiddenKey(service, command string) string { + return service + "\x00" + command +} + +func applyReleaseGate(s Shortcut) Shortcut { + if _, ok := ReleaseHiddenReason(s.Service, s.Command); ok { + s.Hidden = true + } + return s +} + +// ReleaseHiddenReason reports why a shortcut is hidden from public discovery in +// this release. Hidden shortcuts remain invocable by exact command path so the +// implementation can be kept and repaired in the next iteration. +func ReleaseHiddenReason(service, command string) (string, bool) { + reason, ok := releaseHiddenShortcuts[releaseHiddenKey(service, command)] + return reason, ok +} diff --git a/internal/shortcut/release_hidden_generated.go b/internal/shortcut/release_hidden_generated.go new file mode 100644 index 00000000..81caae44 --- /dev/null +++ b/internal/shortcut/release_hidden_generated.go @@ -0,0 +1,166 @@ +// Code generated by scripts/gen_shortcut_release_hidden.py; DO NOT EDIT. + +package shortcut + +// releaseHiddenShortcuts contains shortcuts intentionally hidden from +// public discovery in this release because their latest real-backend +// test did not pass. The command implementations remain registered and +// invocable by exact path for internal follow-up testing. +var releaseHiddenShortcuts = map[string]string{ + "aitable\u0000+base-get-primary-doc-id": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+chart-share-get": "read real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "aitable\u0000+dashboard-share-get": "read real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+export-data": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+record-primary-doc-get": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+role-get": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+workflow-get": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+workflow-list": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "attendance\u0000+get-class": "read real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "attendance\u0000+get-global-setting": "read real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "attendance\u0000+get-group": "read real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "attendance\u0000+get-group-filtered": "read real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "attendance\u0000+get-leave-balance": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "attendance\u0000+list-report-columns": "read real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "attendance\u0000+query-report-leave": "read real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "calendar\u0000+find-room": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "calendar\u0000+room-find": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+category-list-conversations": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+chat-get-by-id": "read real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+chat-members-get": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+chat-messages": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+messages-list": "read real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+messages-resource-url": "read real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+search-msg": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+thread-replies": "read real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "contact\u0000+get-roster": "read real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "contact\u0000+list-roster-fields": "read real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+credentials-get": "read real test not passed; status=held; category=held; fixability=manual-approval", + "drive\u0000+download": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "drive\u0000+list": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "minutes\u0000+action-items": "read real test not passed; status=real-error; category=missing-real-minutes-fixture; fixability=not-cli-fixable-without-fixture", + "minutes\u0000+latest-minutes": "read real test not passed; status=real-error; category=missing-real-minutes-fixture; fixability=not-cli-fixable-without-fixture", + "minutes\u0000+minutes-search": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "minutes\u0000+transcript": "read real test not passed; status=real-error; category=missing-real-minutes-fixture; fixability=not-cli-fixable-without-fixture", + "oa\u0000+done-approvals": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "oa\u0000+pending": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "report\u0000+report-latest": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "todo\u0000+due-today": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "todo\u0000+related-tasks": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "wiki\u0000+node-list": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "wiki\u0000+resolve-space": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "wiki\u0000+space-list": "read real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "aitable\u0000+advperm-disable": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "aitable\u0000+advperm-enable": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "aitable\u0000+attachment-upload": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+base-copy": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+base-delete": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+base-update": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+chart-delete": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+chart-share-update": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+chart-update": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+dashboard-arrange": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+dashboard-delete": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+dashboard-share-update": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+dashboard-update": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+field-delete": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+field-update": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+form-delete": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+form-field-hide": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+form-field-update": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+form-share-update": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+form-update": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+import-data": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+import-upload": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+record-delete": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+record-primary-doc-create": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+record-update": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+record-upsert": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+role-create": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+role-delete": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+role-update": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+section-create": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+section-delete": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+section-move-node": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+section-rename": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+section-reorder": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+table-delete": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+table-update": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+view-delete": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+view-duplicate": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+view-lock": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+view-set-fill-color-rule": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "aitable\u0000+view-set-frozen-cols": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+view-set-row-height": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+view-update": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+workflow-disable": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "aitable\u0000+workflow-enable": "write real test not passed; status=real-error; category=missing-real-aitable-fixture; fixability=not-cli-fixable-without-fixture", + "attendance\u0000+boss-check": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "attendance\u0000+create-class": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "attendance\u0000+create-group": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "attendance\u0000+import-schedule": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "attendance\u0000+save-leave-balance": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "attendance\u0000+update-class": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "attendance\u0000+update-group": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "attendance\u0000+update-group-members": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "attendance\u0000+update-leave-type": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "calendar\u0000+respond-event": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+category-add-conversation": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "chat\u0000+category-remove-conversation": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "chat\u0000+chat-add-bot": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "chat\u0000+chat-audit-join": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+chat-mute-member": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+chat-quit": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+chat-remove-bot": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+chat-role-remove": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+chat-role-remove-user": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+chat-transfer-owner": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+chat-update-icon": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+chat-update-settings": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+conversation-clear-messages": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+conversation-clear-red-point": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+conversation-hide": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+conversation-mark-read": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+conversation-mark-unread": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+conversation-mute": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+conversation-mute-at-all": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+conversation-mute-red-envelope": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+conversation-set-top": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+messages-add-emoji": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-add-text-emotion": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-batch-recall-by-bot": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-batch-send-by-bot": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-combine-forward": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-create-text-emotion": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+messages-forward": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-forward-topic": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-recall": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-recall-by-bot": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "chat\u0000+messages-remove-emoji": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-remove-text-emotion": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-send-by-bot": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-send-card": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+messages-set-pin": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+messages-set-top": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "chat\u0000+messages-unset-pin": "write real test not passed; status=real-error; category=backend-or-mcp-error; fixability=not-cli-fixable-first", + "chat\u0000+messages-unset-top": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "devapp\u0000+event-subscribe": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+event-unsubscribe": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+permission-add": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+permission-remove": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+robot-config": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+robot-disable": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+robot-enable": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+security-config": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "devapp\u0000+version-create": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "devapp\u0000+version-publish": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "ding\u0000+send-by-message": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "doc\u0000+comment-create-inline": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "doc\u0000+template-apply": "write real test not passed; status=real-error; category=auth-or-permission; fixability=not-cli-fixable", + "minutes\u0000+record-pause": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "minutes\u0000+record-resume": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "minutes\u0000+record-stop": "write real test not passed; status=real-error; category=input-or-business-validation; fixability=test-input-or-backend-rule", + "oa\u0000+approve-by": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "wiki\u0000+node-copy": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "wiki\u0000+node-move": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", + "wiki\u0000+wiki-new-doc": "write real test not passed; status=real-error; category=missing-real-resource; fixability=not-cli-fixable-without-fixture", +} diff --git a/internal/shortcut/shortcut_test.go b/internal/shortcut/shortcut_test.go index 5cf8ddcb..c5431d60 100644 --- a/internal/shortcut/shortcut_test.go +++ b/internal/shortcut/shortcut_test.go @@ -153,7 +153,7 @@ func TestCallMCPDataRejectsLikelyWriteUnderDryRun(t *testing.T) { } rt := &RuntimeContext{cmd: cmd, shortcut: Shortcut{Service: "chat"}} - _, err := rt.CallMCPData("chat", "send_personal_message", map[string]any{"receiverUserId": "u"}) + _, err := rt.CallMCPData("chat", "send_personal_message", map[string]any{"receiverUid": "u"}) if err == nil { t.Fatal("expected likely write guard error") } diff --git a/internal/shortcut/smart/broadcast.go b/internal/shortcut/smart/broadcast.go index 13f5569d..a3265bb4 100644 --- a/internal/shortcut/smart/broadcast.go +++ b/internal/shortcut/smart/broadcast.go @@ -24,8 +24,8 @@ import ( // Broadcast: send the SAME single-chat message to several people by NAME. // -// Steps: split the --to name CSV → resolve each name to a unique userId → -// send an individual single-chat message to each resolved user. Names that +// Steps: split the --to name CSV → resolve each name to a unique user → +// send an individual single-chat message to each user's openDingTalkId. Names that // fail to resolve (unknown / ambiguous) are collected and reported at the end // without aborting delivery to the others. Replaces manually running // `chat +dm` once per recipient. @@ -37,7 +37,7 @@ var Broadcast = shortcut.Shortcut{ Product: "chat", Description: "按姓名逐一给多个人群发同一条单聊消息(自动解析 userId、逐个发送)", Intent: "当你想把同一条通知一次性单聊发给多位同事、但只知道他们的姓名不想逐个查 userId 时使用;" + - "内部把姓名列表逐个解析成唯一 userId 后,对每个人单独发一条单聊消息,并汇总成功/失败人数。" + + "内部把姓名列表逐个解析成唯一用户后,用 openDingTalkId 对每个人单独发一条单聊消息,并汇总成功/失败人数。" + "某个姓名匹配不到人或匹配到多人时,会跳过该人并在结尾报出,不影响其他人收到消息。会真实发出多条消息。", Risk: shortcut.RiskWrite, Flags: []shortcut.Flag{ @@ -71,6 +71,10 @@ var Broadcast = shortcut.Shortcut{ failed = append(failed, fmt.Sprintf("%s(%s)", name, err.Error())) continue } + if user.openDingTalkID == "" { + failed = append(failed, fmt.Sprintf("%s(通讯录结果缺少 openDingTalkId)", name)) + continue + } // Step 2 — send the single-chat message to this recipient. Under // --dry-run we still resolve names (a read) but never send: record the @@ -80,9 +84,9 @@ var Broadcast = shortcut.Shortcut{ continue } if _, err := rt.CallMCPWriteData("chat", "send_personal_message", map[string]any{ - "receiverUserId": user.userID, - "msgType": "markdown", - "content": string(content), + "receiverOpenDingTalkId": user.openDingTalkID, + "msgType": "markdown", + "content": string(content), }); err != nil { failed = append(failed, fmt.Sprintf("%s(发送失败:%s)", name, err.Error())) continue diff --git a/internal/shortcut/smart/chat_messages.go b/internal/shortcut/smart/chat_messages.go index 5c6aa9a7..80a2f107 100644 --- a/internal/shortcut/smart/chat_messages.go +++ b/internal/shortcut/smart/chat_messages.go @@ -25,7 +25,7 @@ import ( // // Steps: // 1. depending on whether --group or --user is given, call either -// list_conversation_message_v2 (group; param openconversation_id) or +// list_conversation_message_v2 (group; param openCid) or // list_individual_chat_message (single chat; param userId) on the chat // server — tool names and param keys copied verbatim from chat.go's // `dws chat message list` call sites; @@ -68,8 +68,8 @@ var ChatMessages = shortcut.Shortcut{ }, Execute: func(rt *shortcut.RuntimeContext) error { // Step 1 — build params and pick the right tool. Param keys - // (openconversation_id / userId / time / forward / limit) are copied - // verbatim from chat.go's `dws chat message list` call sites. + // (openCid/cid / userId / time / forward / limit) match the MCP server + // schema for group and direct message listing. var tool string params := map[string]any{} @@ -93,7 +93,8 @@ var ChatMessages = shortcut.Shortcut{ if rt.Str("group") != "" { tool = "list_conversation_message_v2" - params["openconversation_id"] = rt.Str("group") + params["openCid"] = rt.Str("group") + params["cid"] = rt.Str("group") } else { tool = "list_individual_chat_message" params["userId"] = rt.Str("user") diff --git a/internal/shortcut/smart/dm.go b/internal/shortcut/smart/dm.go index 297a4814..ad265351 100644 --- a/internal/shortcut/smart/dm.go +++ b/internal/shortcut/smart/dm.go @@ -20,14 +20,15 @@ package smart import ( "encoding/json" + apperrors "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/errors" "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/shortcut" ) // DM: message a person by NAME, no ID juggling. // -// Steps: resolve name → single userId (disambiguate on multiple matches) → send -// a single-chat message. Replaces `contact +search-user` (copy userId) → -// `chat +messages-send --user `. +// Steps: resolve name → single user (disambiguate on multiple matches) → send +// a single-chat message via openDingTalkId. Replaces `contact +search-user` +// (copy openDingTalkId) → `chat +messages-send --open-dingtalk-id `. // // dws chat +dm --to 张三 --text "周报发我一下" var DM = shortcut.Shortcut{ @@ -36,7 +37,7 @@ var DM = shortcut.Shortcut{ Product: "chat", Description: "按姓名直接给某人发单聊消息(自动解析 userId)", Intent: "当你只知道对方姓名、想直接发一条单聊消息而不想先查 userId 时使用;" + - "内部先按姓名搜通讯录解析出唯一 userId 再发送,姓名匹配到多人时会列出候选让你区分。会真实发出消息。", + "内部先按姓名搜通讯录解析出唯一用户,并用其 openDingTalkId 发送,姓名匹配到多人时会列出候选让你区分。会真实发出消息。", Risk: shortcut.RiskWrite, Flags: []shortcut.Flag{ {Name: "to", Type: shortcut.FlagString, Desc: "收件人姓名/花名", Required: true}, @@ -51,13 +52,16 @@ var DM = shortcut.Shortcut{ if err != nil { return err } + if user.openDingTalkID == "" { + return apperrors.NewValidation("通讯录结果缺少 openDingTalkId,无法发送单聊消息;请改用 chat +messages-send --open-dingtalk-id") + } // Step 2 — send the single-chat message. content, _ := json.Marshal(map[string]string{"title": text, "text": text}) return rt.CallMCP("send_personal_message", map[string]any{ - "receiverUserId": user.userID, - "msgType": "markdown", - "content": string(content), + "receiverOpenDingTalkId": user.openDingTalkID, + "msgType": "markdown", + "content": string(content), }) }, } diff --git a/internal/shortcut/smart/remind.go b/internal/shortcut/smart/remind.go index 96dec855..7addc82f 100644 --- a/internal/shortcut/smart/remind.go +++ b/internal/shortcut/smart/remind.go @@ -22,8 +22,8 @@ import ( ) // Remind: create a personal todo for YOURSELF with an optional due/reminder time, -// in one command. No name resolution and no executorIds — a personal todo without -// executorIds defaults to the current user. +// in one command. It resolves the current user and explicitly passes executorIds; +// the real todo backend does not reliably default a missing executor to "me". // // Steps: take --task as the subject, and (optionally) parse --at into epoch // milliseconds (mirroring the todo helper's parseISOTimeToMillis, which stores @@ -37,7 +37,7 @@ var Remind = shortcut.Shortcut{ Product: "todo", Description: "给自己创建一条带截止/提醒时间的待办", Intent: "当你想给自己记一件事、并(可选)设一个截止/提醒时间,又不想先查自己的 userId 时使用;" + - "内部直接创建个人待办,不传 executorIds 时默认执行人就是你自己,--at 会按 ISO8601 解析为截止时间。会真实创建待办。", + "内部先解析当前登录用户的 userId,再显式设置 executorIds,--at 会按 ISO8601 解析为截止时间。会真实创建待办。", Risk: shortcut.RiskWrite, Flags: []shortcut.Flag{ {Name: "task", Type: shortcut.FlagString, Desc: "待办标题/内容", Required: true}, @@ -45,10 +45,18 @@ var Remind = shortcut.Shortcut{ }, Tips: []string{`dws todo +remind --task "交周报" --at 2026-03-10T18:00:00+08:00`}, Execute: func(rt *shortcut.RuntimeContext) error { - // subject is the only required field; a personal todo with no executorIds - // is created for the current user. + profile, err := rt.CallMCPData("contact", "get_current_user_profile", nil) + if err != nil { + return err + } + userID := myAttendanceCurrentUserID(profile) + if userID == "" { + return apperrors.NewValidation("无法解析当前登录用户的 userId,无法给自己创建待办") + } + vo := map[string]any{ - "subject": rt.Str("task"), + "subject": rt.Str("task"), + "executorIds": []string{userID}, } // Optional due/reminder time. The todo helper feeds --due through diff --git a/internal/shortcut/smart/resolve.go b/internal/shortcut/smart/resolve.go index 97f84931..2db48b6c 100644 --- a/internal/shortcut/smart/resolve.go +++ b/internal/shortcut/smart/resolve.go @@ -24,8 +24,9 @@ import ( // contactUser is the minimal identity a smart shortcut needs after resolving a // name. type contactUser struct { - userID string - name string + userID string + openDingTalkID string + name string } // resolveUser turns a human name into a single unique contact, the "name → ID" @@ -53,8 +54,8 @@ func resolveUser(rt *shortcut.RuntimeContext, name string) (contactUser, error) return users[0], nil } -// extractUsers pulls {userId, name} out of a search_contact_by_key_word response -// ({"result": [ {userId, name, ...} ]}). +// extractUsers pulls {userId, openDingTalkId, name} out of a +// search_contact_by_key_word response ({"result": [ {userId, name, ...} ]}). func extractUsers(data map[string]any) []contactUser { raw, ok := data["result"].([]any) if !ok { @@ -71,7 +72,11 @@ func extractUsers(data map[string]any) []contactUser { continue } nm, _ := m["name"].(string) - out = append(out, contactUser{userID: id, name: nm}) + openID, _ := m["openDingTalkId"].(string) + if openID == "" { + openID, _ = m["openDingtalkId"].(string) + } + out = append(out, contactUser{userID: id, openDingTalkID: openID, name: nm}) } return out } diff --git a/internal/shortcut/smart/share_doc.go b/internal/shortcut/smart/share_doc.go index 0e3f6a7d..2269a598 100644 --- a/internal/shortcut/smart/share_doc.go +++ b/internal/shortcut/smart/share_doc.go @@ -17,15 +17,17 @@ import ( "encoding/json" "strings" + apperrors "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/errors" "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/shortcut" ) // ShareDoc: send a document link to a person by NAME, no ID juggling. // -// Steps: resolve name → single userId (disambiguate on multiple matches) → -// build a Markdown message that links to the document → send it as a single-chat -// message. This is a pure "share a link" flow: it does not touch any doc tool, -// it just delivers the URL you already have straight to the recipient's inbox. +// Steps: resolve name → single user (disambiguate on multiple matches) → +// build a Markdown message that links to the document → send it to the user's +// openDingTalkId as a single-chat message. This is a pure "share a link" flow: +// it does not touch any doc tool, it just delivers the URL you already have +// straight to the recipient's inbox. // // dws doc +share-doc --to 张三 --url https://docs.dingtalk.com/xxx --note "帮忙过一下" var ShareDoc = shortcut.Shortcut{ @@ -34,7 +36,7 @@ var ShareDoc = shortcut.Shortcut{ Product: "chat", Description: "按姓名把文档链接私信发给某人(自动解析 userId)", Intent: "当你手上已经有一个文档链接、想直接私信发给某个人而不必先查 userId 时使用;" + - "内部先按姓名搜通讯录解析出唯一 userId,再把链接拼成一条 Markdown 消息发出去," + + "内部先按姓名搜通讯录解析出唯一用户,再用 openDingTalkId 把链接拼成一条 Markdown 消息发出去," + "姓名匹配到多人时会列出候选让你区分。只发链接、不读取或改动文档本身,会真实发出消息。", Risk: shortcut.RiskWrite, Flags: []shortcut.Flag{ @@ -52,6 +54,9 @@ var ShareDoc = shortcut.Shortcut{ if err != nil { return err } + if user.openDingTalkID == "" { + return apperrors.NewValidation("通讯录结果缺少 openDingTalkId,无法发送文档分享消息;请改用 chat +messages-send --open-dingtalk-id") + } // Step 2 — build a Markdown message linking to the document. text := shareDocBuildText(url, note) @@ -60,9 +65,9 @@ var ShareDoc = shortcut.Shortcut{ // Step 3 — deliver it as a single-chat message. return rt.CallMCP("send_personal_message", map[string]any{ - "receiverUserId": user.userID, - "msgType": "markdown", - "content": string(content), + "receiverOpenDingTalkId": user.openDingTalkID, + "msgType": "markdown", + "content": string(content), }) }, } diff --git a/internal/shortcut/smart/todo_done.go b/internal/shortcut/smart/todo_done.go index 26b1f796..fa9ad169 100644 --- a/internal/shortcut/smart/todo_done.go +++ b/internal/shortcut/smart/todo_done.go @@ -113,21 +113,34 @@ func shortcutTodoMatch(cards []map[string]any, keyword string) []shortcutTodoCar return out } -// shortcutTodoCards pulls the todoCards list out of the response, probing the -// common container shape {"result": {"todoCards": [...]}} first, then a bare -// top-level todoCards as a fallback. +// shortcutTodoCards pulls the todoCards list out of the response, probing +// wrapper layers defensively. Real MCP responses may arrive as either +// {"result":{"todoCards":[...]}} or {"result":{"result":{"todoCards":[...]}}} +// depending on the call path, so do not assume a single fixed wrapper. func shortcutTodoCards(data map[string]any) []map[string]any { - if r, ok := data["result"].(map[string]any); ok { - if arr, ok := r["todoCards"].([]any); ok { - return shortcutTodoToMaps(arr) - } - } - if arr, ok := data["todoCards"].([]any); ok { + if arr := shortcutTodoFindCards(data, 0); arr != nil { return shortcutTodoToMaps(arr) } return nil } +func shortcutTodoFindCards(m map[string]any, depth int) []any { + if depth > 4 { + return nil + } + if arr, ok := m["todoCards"].([]any); ok { + return arr + } + for _, k := range []string{"result", "data"} { + if child, ok := m[k].(map[string]any); ok { + if arr := shortcutTodoFindCards(child, depth+1); arr != nil { + return arr + } + } + } + return nil +} + func shortcutTodoToMaps(arr []any) []map[string]any { out := make([]map[string]any, 0, len(arr)) for _, it := range arr { diff --git a/internal/shortcut/smart/todo_done_test.go b/internal/shortcut/smart/todo_done_test.go new file mode 100644 index 00000000..175860b7 --- /dev/null +++ b/internal/shortcut/smart/todo_done_test.go @@ -0,0 +1,32 @@ +// Copyright 2026 Alibaba Group +// Licensed under the Apache License, Version 2.0 + +package smart + +import "testing" + +func TestShortcutTodoCardsUnwrapsNestedResult(t *testing.T) { + data := map[string]any{ + "result": map[string]any{ + "result": map[string]any{ + "todoCards": []any{ + map[string]any{ + "subject": "DWS shortcut 真实测试待办", + "taskId": "55155814691", + }, + }, + }, + }, + } + + cards := shortcutTodoCards(data) + if len(cards) != 1 { + t.Fatalf("len(cards)=%d, want 1", len(cards)) + } + if got := cards[0]["subject"]; got != "DWS shortcut 真实测试待办" { + t.Fatalf("subject=%v", got) + } + if got := cards[0]["taskId"]; got != "55155814691" { + t.Fatalf("taskId=%v", got) + } +} diff --git a/internal/shortcut/smart/todo_shared.go b/internal/shortcut/smart/todo_shared.go index 44383bff..81d4d8ef 100644 --- a/internal/shortcut/smart/todo_shared.go +++ b/internal/shortcut/smart/todo_shared.go @@ -19,12 +19,14 @@ import ( "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/shortcut" ) -// todoPageSize is the per-page fetch size for get_user_todos_in_current_org, -// matching helpers.todo list. todoMaxPages caps total pages so a runaway list -// can never loop unbounded (40 * 50 = 2000 todos, well past any realistic +// todoPageSize is the per-page fetch size for get_user_todos_in_current_org. +// The real backend currently returns an empty page for pageSize=50 while +// pageSize=20 works, so keep this aligned with the public +get-my-tasks default +// instead of pushing the maximum. todoMaxPages caps total pages so a runaway +// list can never loop unbounded (40 * 20 = 800 todos, well past any realistic // backlog a single user filters/matches against). const ( - todoPageSize = 50 + todoPageSize = 20 todoMaxPages = 40 ) diff --git a/internal/shortcut/usage/command.go b/internal/shortcut/usage/command.go index d4e9981e..a023a4f8 100644 --- a/internal/shortcut/usage/command.go +++ b/internal/shortcut/usage/command.go @@ -48,19 +48,26 @@ func newListCommand() *cobra.Command { Short: "列出内建 shortcut", RunE: func(cmd *cobra.Command, _ []string) error { svc, _ := cmd.Flags().GetString("service") + includeHidden, _ := cmd.Flags().GetBool("include-hidden") type row struct { - Service string `json:"service"` - Command string `json:"command"` - Product string `json:"product"` - Risk string `json:"risk"` - Description string `json:"description"` - Intent string `json:"intent,omitempty"` + Service string `json:"service"` + Command string `json:"command"` + Product string `json:"product"` + Risk string `json:"risk"` + Description string `json:"description"` + Intent string `json:"intent,omitempty"` + Hidden bool `json:"hidden,omitempty"` + HiddenReason string `json:"hiddenReason,omitempty"` } var rows []row for _, s := range shortcut.All() { if svc != "" && s.Service != svc { continue } + hiddenReason, hiddenByRelease := shortcut.ReleaseHiddenReason(s.Service, s.Command) + if s.Hidden && !includeHidden { + continue + } product := s.Product if product == "" { product = s.Service @@ -69,7 +76,19 @@ func newListCommand() *cobra.Command { if risk == "" { risk = string(shortcut.RiskRead) } - rows = append(rows, row{s.Service, s.Command, product, risk, s.Description, s.Intent}) + item := row{ + Service: s.Service, + Command: s.Command, + Product: product, + Risk: risk, + Description: s.Description, + Intent: s.Intent, + Hidden: s.Hidden, + } + if hiddenByRelease { + item.HiddenReason = hiddenReason + } + rows = append(rows, item) } return output.WriteCommandPayload(cmd, map[string]any{ "count": len(rows), @@ -78,6 +97,7 @@ func newListCommand() *cobra.Command { }, } cmd.Flags().String("service", "", "只列出指定服务的 shortcut") + cmd.Flags().Bool("include-hidden", false, "包含本期隐藏、仅内部复测用的 shortcut") return cmd } diff --git a/scripts/gen_shortcut_backend_mcp_issues.py b/scripts/gen_shortcut_backend_mcp_issues.py new file mode 100644 index 00000000..8188a8ca --- /dev/null +++ b/scripts/gen_shortcut_backend_mcp_issues.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +"""Generate a backend/MCP issue handoff report from real shortcut results.""" + +from __future__ import annotations + +import json +import re +from collections import defaultdict +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +READ_PATH = ROOT / "docs" / "shortcut-real-read-results.json" +WRITE_PATH = ROOT / "docs" / "shortcut-real-write-results.json" +OUT_PATH = ROOT / "docs" / "shortcut-backend-mcp-issues.md" + + +def load(path: Path) -> dict[str, Any]: + return json.loads(path.read_text(encoding="utf-8")) + + +def squish(text: str, limit: int = 300) -> str: + text = re.sub(r"\s+", " ", text or "").strip() + if len(text) <= limit: + return text + return text[: limit - 1] + "…" + + +def parse_payload(row: dict[str, Any]) -> dict[str, Any]: + for key in ("stderr", "stdout"): + raw = (row.get(key) or "").strip() + if not raw: + continue + try: + value = json.loads(raw) + except json.JSONDecodeError: + continue + if isinstance(value, dict): + err = value.get("error") + if isinstance(err, dict): + return err + return value + return {} + + +def message(row: dict[str, Any]) -> str: + payload = parse_payload(row) + msg = payload.get("message") + if isinstance(msg, str) and msg: + return msg + return (row.get("stderr") or row.get("stdout") or "").strip() + + +def operation(row: dict[str, Any]) -> str: + payload = parse_payload(row) + op = payload.get("operation") + if isinstance(op, str) and op: + return op + msg = message(row) + match = re.search(r"\(operation:\s*([^)]+)\)", msg) + return match.group(1) if match else "-" + + +def trace_id(row: dict[str, Any]) -> str: + payload = parse_payload(row) + value = payload.get("trace_id") or payload.get("traceId") + if value: + return str(value) + msg = message(row) + match = re.search(r'"trace_id":"([^"]+)"', msg) + return match.group(1) if match else "-" + + +def issue_key(row: dict[str, Any]) -> str: + service = row.get("service") + command = row.get("command") + msg = message(row).lower() + op = operation(row) + + if service == "chat" and "receiveruid" in msg: + return "chat-receiveruid-mapping" + if service == "chat" and "applicantuid" in msg: + return "chat-applicantuid-mapping" + if service == "chat" and ("opencid" in msg or "openconversationid" in msg): + return "chat-conversation-id-mapping" + if service == "aitable" and "success\":true" in msg and "error" in msg: + if "roleid is required" in msg: + return "aitable-role-id-mapping" + if "getdentrydto returns null" in msg: + return "aitable-notfound-as-system-error" + if "workflow" in msg or "workflow" in op: + return "aitable-workflow-system-error" + if command in {"+base-get-primary-doc-id", "+record-primary-doc-get"}: + return "aitable-primary-doc-system-error" + return "aitable-success-true-error-envelope" + return f"{service}-other-backend-mcp" + + +ISSUE_META = { + "chat-conversation-id-mapping": { + "title": "Chat/IM 会话 ID 字段在 MCP/后端映射中疑似丢失", + "owner": "IM MCP / IM 后端字段映射", + "priority": "P1", + "summary": "CLI 已传 group/conversation-id/open-conversation-id(部分 case 使用真实 cid),后端仍报 openCid/openConversationId/cid required。", + "expect": "MCP schema/网关应接受并透传 openConversationId/openCid/cid 中的兼容字段;如果资源无效,应返回“无效会话”,而不是 required。", + }, + "chat-receiveruid-mapping": { + "title": "Chat card 发送 receiverUid 疑似未从 receiver 透传", + "owner": "IM MCP / card 发送参数映射", + "priority": "P1", + "summary": "CLI 传入 receiver=103262,后端仍报 receiverUid 和 openConversationId 不能同时为空。", + "expect": "receiver 应映射为 receiverUid,或 schema 明确要求 receiverUid;真实入参不应在 MCP 层丢失。", + }, + "chat-applicantuid-mapping": { + "title": "Chat 入群审批 applicantUid/inviterUid 疑似未透传", + "owner": "IM MCP / 入群审批参数映射", + "priority": "P1", + "summary": "CLI 传入 applicant=103262、inviter=519019,后端仍报 applicantUid required。", + "expect": "applicant/inviter 应映射为 applicantUid/inviterUid;如果 recordId/group 无效,应返回对应资源错误而不是 applicantUid 缺失。", + }, + "aitable-success-true-error-envelope": { + "title": "AI 表格 MCP 错误 envelope 语义不一致:success=true 但 error 非空/status=error", + "owner": "AI 表格 MCP wrapper", + "priority": "P1", + "summary": "多条 AI 表格命令返回 MCP_TOOL_ERROR,内部 JSON 同时出现 success=true、status=error、error 非空。", + "expect": "只要 error 非空或 status=error,success 应为 false,外层也应按业务错误返回稳定错误码/trace。", + }, + "aitable-role-id-mapping": { + "title": "AI 表格 roleId 参数疑似未被 MCP 正确读取", + "owner": "AI 表格 MCP role 接口", + "priority": "P1", + "summary": "CLI 已传 --role-id,但 MCP 返回 roleId is required。", + "expect": "role-id/roleId 字段应被正确映射;如果 role 不存在,返回 ROLE_NOT_FOUND,而不是 required。", + }, + "aitable-notfound-as-system-error": { + "title": "AI 表格无效 Base/Table/Field/Record 被包装成 SYSTEM_ERROR", + "owner": "AI 表格 MCP wrapper / 后端错误码", + "priority": "P2", + "summary": "安全负向 ID 下,部分写接口返回 getDentryDTO returns null、type=SYSTEM_ERROR、retryable=true。", + "expect": "资源不存在应返回 INPUT_ERROR/NOT_FOUND 且 retryable=false,避免误导调用方重试。", + }, + "aitable-workflow-system-error": { + "title": "AI 表格 Workflow 查询在真实 Base 下返回系统级错误", + "owner": "AI 表格 Workflow MCP / 后端", + "priority": "P1", + "summary": "使用真实可访问 Base 查询 workflow list/get,返回 LIST_WORKFLOWS_ERROR/GET_WORKFLOW_ERROR。", + "expect": "无 workflow 时应返回空列表或 WORKFLOW_NOT_FOUND;有后端异常时需提供稳定错误码和可排查 trace。", + }, + "aitable-primary-doc-system-error": { + "title": "AI 表格记录主文档查询在真实 record 下返回 no record/SYSTEM_ERROR", + "owner": "AI 表格 primary doc MCP / 后端", + "priority": "P2", + "summary": "record-query 已能查到真实 recordId,但 primary-doc 查询返回 no record、type=SYSTEM_ERROR。", + "expect": "若该记录无主文档,应返回空/未创建;若 recordId 语义不匹配,应返回明确参数错误,不应是系统错误。", + }, +} + + +def collect() -> list[dict[str, Any]]: + rows: list[dict[str, Any]] = [] + for suite, path in (("read", READ_PATH), ("write", WRITE_PATH)): + data = load(path) + for row in data.get("results", []): + if row.get("failure_category") == "backend-or-mcp-error": + item = dict(row) + item["suite"] = suite + rows.append(item) + return rows + + +def render_case(row: dict[str, Any]) -> str: + return ( + f"| `{row['suite']}` | `{row.get('service')} {row.get('command')}` | " + f"`{operation(row)}` | `{trace_id(row)}` | {squish(message(row), 180)} |\n" + f"| | input | | | `{row.get('input') or ''}` |\n" + ) + + +def main() -> int: + rows = collect() + grouped: dict[str, list[dict[str, Any]]] = defaultdict(list) + for row in rows: + grouped[issue_key(row)].append(row) + + lines: list[str] = [] + lines.append("# Shortcut 真实测试:后端 / MCP 问题整理\n") + lines.append("这份报告只汇总 `failure_category = backend-or-mcp-error` 的 case,已尽量排除权限、缺真实资源、当前账号无数据等噪音。\n") + lines.append("## 总览\n") + lines.append(f"- Backend/MCP case 总数:{len(rows)}") + lines.append(f"- 聚合问题数:{len(grouped)}") + lines.append("- 复现口径:真实 dws CLI;无 mock;无 dry-run;命令输入和 trace_id 均来自真实测试结果。\n") + + lines.append("## 建议优先看\n") + priority_order = [ + "chat-conversation-id-mapping", + "chat-receiveruid-mapping", + "chat-applicantuid-mapping", + "aitable-success-true-error-envelope", + "aitable-workflow-system-error", + "aitable-role-id-mapping", + "aitable-primary-doc-system-error", + "aitable-notfound-as-system-error", + ] + for idx, key in enumerate([k for k in priority_order if k in grouped], 1): + meta = ISSUE_META.get(key, {}) + lines.append(f"{idx}. [{meta.get('priority', 'P2')}] {meta.get('title', key)}({len(grouped[key])} case)") + lines.append("") + + for key in [k for k in priority_order if k in grouped] + [k for k in grouped if k not in priority_order]: + cases = grouped[key] + meta = ISSUE_META.get(key, { + "title": key, + "owner": "待确认", + "priority": "P2", + "summary": "未归入已知聚合类型,需要按 case 单独排查。", + "expect": "请根据 operation/trace_id 判断是 schema、字段映射还是后端错误语义问题。", + }) + lines.append(f"## {meta['title']}\n") + lines.append(f"- 优先级:{meta['priority']}") + lines.append(f"- 建议 owner:{meta['owner']}") + lines.append(f"- 现象:{meta['summary']}") + lines.append(f"- 期望:{meta['expect']}") + lines.append(f"- 涉及 case:{len(cases)}\n") + lines.append("| 套件 | shortcut | operation | trace_id | 证据 |") + lines.append("|---|---|---|---|---|") + for row in cases: + lines.append(render_case(row).rstrip()) + lines.append("") + + OUT_PATH.write_text("\n".join(lines), encoding="utf-8") + print(f"written: {OUT_PATH}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/gen_shortcut_comparison.py b/scripts/gen_shortcut_comparison.py index 3a1dd3e7..ec832c03 100644 --- a/scripts/gen_shortcut_comparison.py +++ b/scripts/gen_shortcut_comparison.py @@ -3,7 +3,7 @@ # shortcut — the dws `+command`, the equivalent lark-cli command, and the raw # dws native `dws mcp ...` combination it replaces. Data is extracted directly # from source so it stays truthful. -import os, re, glob, html, json +import os, re, glob, html, json, subprocess ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SC_DIR = os.path.join(ROOT, "internal", "shortcut") @@ -26,12 +26,26 @@ LARK_MAP = { "aisearch": None, "live": None, "devdoc": None, } +# lark-cli services that are intentionally not mapped to DWS shortcuts today. +# These are platform/product-model gaps, not just missing wrapper work. +LARK_PLATFORM_ONLY = { + "okr": "飞书 OKR 是独立目标管理产品;当前 DWS / 钉钉 MCP 没有等价的 OKR 周期、目标、指标和进展对象,不能只靠 wrapper 复刻。", + "vc": "飞书 VC 暴露会议加入/离开、会中事件、消息、录制等对象;当前 DWS 没有一套干净的钉钉会议 MCP tool 可等价承接,已有事件能力也不是同一套会议生命周期语义。", + "slides": "飞书 Slides 是原生演示文稿对象,支持页面替换、截图、XML 和媒体上传;当前 DWS 没有钉钉幻灯片对象模型与页面级 MCP 能力。", + "markdown": "lark-cli 的 markdown shortcut 绑定飞书云文档/云盘里的 Markdown 工作流;当前 DWS 没有等价的钉钉 Markdown 云文档资源与 patch/diff/overwrite API。", + "whiteboard": "飞书 Whiteboard 有独立画板节点、查询和结构化更新能力;当前 DWS 没有钉钉画板节点 schema 或对应 MCP tool。", + "note": "飞书 Note 是会议纪要直查对象,可按 note_id 取详情和逐字稿;DWS 的 minutes 能力属于钉钉妙记/听记,资源 ID、权限和数据模型不同,不能保证等价。", + "event": "飞书 event shortcut 面向 lark-cli 的事件订阅模型;DWS 的钉钉事件/机器人连接模型不同,目前没有沉淀成同参数、同语义的 shortcut。", +} + def load_lark(): out = {} - for svc in set(v for v in LARK_MAP.values() if v): + services = set(v for v in LARK_MAP.values() if v) | set(LARK_PLATFORM_ONLY) + for svc in services: cmds = set() for f in glob.glob(os.path.join(LARK, svc, "*.go")): - if f.endswith("_test.go"): + base = os.path.basename(f) + if f.endswith("_test.go") or base.startswith("register"): continue try: txt = open(f, encoding="utf-8").read() @@ -94,7 +108,8 @@ def parse_block(block, pkg, consts=None): if k not in seen: seen.add(k); keys.append(k) return dict(service=svc, command=cmd, product=product, desc=desc, risk=risk, - tool=tool, flags=flags, keys=keys) + tool=tool, flags=flags, keys=keys, + layer="smart" if pkg == "smart" else "atomic") def collect(): items = [] @@ -120,6 +135,9 @@ def shortcut_cmd(it): return s def raw_cmd(it): + if it["layer"] == "smart": + primary = f";入口工具 {it['tool']}" if it["tool"] else "" + return f"复合编排:多次 MCP 调用 / 分页、消歧、聚合或回滚{primary}" if not it["tool"]: return f"dws mcp {it['product']} " if not it["keys"]: @@ -140,7 +158,187 @@ def lark_cmd(it, lark): RISK_CLS = {"read": "rk-r", "write": "rk-w", "high-risk-write": "rk-h"} -def gen_html(items, lark): +def load_test_matrix(): + env = os.environ.copy() + env.setdefault("GOCACHE", "/private/tmp/dws_gocache") + cmd = ["go", "run", "./scripts/gen_shortcut_test_matrix.go"] + raw = subprocess.check_output(cmd, cwd=ROOT, env=env, text=True) + data = json.loads(raw) + by_cmd = { + (r["service"], r["command"]): r + for r in data.get("results", []) + } + return data, by_cmd + +def load_real_matrix(filename): + path = os.path.join(ROOT, "docs", filename) + if not os.path.exists(path): + return None, {} + with open(path, encoding="utf-8") as f: + data = json.load(f) + by_cmd = { + (r["service"], r["command"]): r + for r in data.get("results", []) + } + return data, by_cmd + +def load_real_read_matrix(): + return load_real_matrix("shortcut-real-read-results.json") + +def load_real_write_matrix(): + return load_real_matrix("shortcut-real-write-results.json") + +def matrix_summary(data): + if not data: + return {} + if isinstance(data.get("summary"), dict): + return data["summary"] + return data + +FAILURE_CATEGORY_LABELS = { + "auth-or-permission": "权限 / 鉴权不足", + "backend-business-rule": "后端业务规则限制", + "backend-or-mcp-error": "后端 / MCP 内部错误", + "cli-error-envelope": "CLI 错误 envelope 未转非零退出", + "held": "人工授权后执行", + "input-or-business-validation": "输入或业务校验失败", + "missing-real-aitable-fixture": "缺 AI 表格真实 fixture", + "missing-real-minutes-fixture": "缺妙记/听记真实 fixture", + "missing-real-resource": "缺真实资源 fixture", + "timeout": "真实后端超时", + "unclassified-real-error": "未分类真实错误", +} + +FIXABILITY_LABELS = { + "cli-wrapper-fix-needed": "需要 CLI / helper 修", + "fixed": "已成功", + "manual-approval": "需人工授权", + "needs-rerun": "需单独复测", + "needs-triage": "需继续排查", + "not-cli-fixable": "非 CLI 可修", + "not-cli-fixable-first": "优先后端 / MCP 排查", + "not-cli-fixable-without-fixture": "需真实 fixture,非 CLI 可直接修", + "test-input-or-backend-rule": "需区分测试输入或后端规则", +} + +def failure_category_table(data): + cats = (data or {}).get("failure_categories") or {} + if not cats: + return '

暂无失败归因。

' + rows = ['', + ''] + notes = { + "auth-or-permission": "账号、应用 scope 或资源权限不足;需要授权/换账号/配置应用权限。", + "backend-business-rule": "后端业务规则限制,CLI 只能避免误导或提示用户换场景。", + "backend-or-mcp-error": "服务端/MCP 返回内部错误,报告保留原始输出供后端排查。", + "cli-error-envelope": "这是 CLI 层可继续修的类型:业务错误不应 exit 0。", + "held": "无安全负向目标或高风险动作,需人工逐项确认。", + "input-or-business-validation": "命令真实进入校验;可能是安全负向输入触发,也可能需要更完整 fixture。", + "missing-real-aitable-fixture": "AI 表格命令依赖真实 Base/Table/View/Record 等资源。", + "missing-real-minutes-fixture": "妙记/听记命令依赖当前账号可见的真实会议产物。", + "missing-real-resource": "资源、消息、群、文档、单据等真实对象不存在。", + "timeout": "需要单独扩大超时或排查网络/后端响应。", + "unclassified-real-error": "暂未自动归因,需要人工继续看 stdout/stderr。", + } + for key, count in cats.items(): + rows.append(f'') + rows.append('
失败归因数量说明
{html.escape(FAILURE_CATEGORY_LABELS.get(key, key))}{count}{html.escape(notes.get(key, ""))}
') + return "\n".join(rows) + +TEST_CLS = { + "assembled": "test-ok", + "validation-blocked": "test-warn", + "failed": "test-bad", +} + +def real_html(it, real_tests): + r = real_tests.get((it["service"], it["command"])) + if r: + cls = "test-ok" if r.get("status") == "real-ok" else ("test-bad" if r.get("status") == "timeout" else "test-warn") + label = {"real-ok": "真实后端成功", "real-error": "真实后端返回错误", "timeout": "真实后端超时", "held": "待真实执行"}.get(r.get("status"), r.get("status", "unknown")) + stdout = r.get("stdout") or "" + stderr = r.get("stderr") or "" + output = stdout or stderr or "(空)" + method = r.get("method") or "real-backend; no --mock; no --dry-run" + category = r.get("failure_category") or "" + fixability = r.get("fixability") or "" + diagnosis = r.get("diagnosis") or "" + setup = r.get("setup") if isinstance(r.get("setup"), dict) else None + setup_html = "" + if setup: + setup_html = ( + f'
前置真实资源准备
' + f'
{html.escape(setup.get("purpose") or "—")}\n'
+                f'input: {html.escape(setup.get("input") or "")}\n'
+                f'exit={html.escape(str(setup.get("exit_code")))};duration={html.escape(str(setup.get("duration_ms")))}ms\n'
+                f'stdout:\n{html.escape(setup.get("stdout") or "(空)")}\n'
+                f'stderr:\n{html.escape(setup.get("stderr") or "(空)")}
' + ) + diagnosis_html = "" + if category or fixability or diagnosis: + diagnosis_html = ( + f'
失败归因 / 可修复性
' + f'
{html.escape(FAILURE_CATEGORY_LABELS.get(category, category) or "—")} / '
+                f'{html.escape(FIXABILITY_LABELS.get(fixability, fixability) or "—")}\n'
+                f'{html.escape(diagnosis or "—")}
' + ) + return ( + '
真实后端测试输入 / 输出' + f'{html.escape(label)}' + f'
exit={r.get("exit_code")};duration={r.get("duration_ms")}ms;{html.escape(method)}
' + f'{diagnosis_html}' + f'{setup_html}' + f'
真实输入
{html.escape(r.get("input", ""))}
' + f'
真实 stdout
{html.escape(stdout or "(空)")}
' + f'
真实 stderr / error
{html.escape(stderr or "(空)")}
' + f'
真实返回
{html.escape(output)}
' + '
' + ) + if it["risk"] == "read": + return '
真实后端测试输入 / 输出未覆盖
此 read shortcut 未出现在真实只读测试结果中。
' + return ( + '
真实后端测试输入 / 输出' + '待分批真实执行写入' + '
该命令是 write / high-risk-write。真实执行会修改线上数据;本轮采用临时测试资源和测试人员分批推进,未覆盖到的命令会继续补测。
' + '
' + ) + +def test_html(it, tests, real_tests): + r = tests.get((it["service"], it["command"])) + if not r: + return '未测试
测试矩阵没有覆盖到此命令。
' + cls = TEST_CLS.get(r.get("status"), "test-bad") + status_label = { + "assembled": "已实测装配", + "validation-blocked": "实测校验拦截", + "failed": "失败", + }.get(r.get("status"), r.get("status", "unknown")) + tools = r.get("tools") or [] + tool_txt = "、".join(tools) if tools else "无 MCP 调用(校验前拦截)" + verified = "tool 已校验" if r.get("tool_verified") else "tool 未通过校验" + method = "cobra 实际执行 + fake MCP 拦截,零网络/零副作用" + err = r.get("error", "") + err_html = f';{html.escape(err)}' if err else "" + stdout = r.get("stdout") or "" + stderr = r.get("stderr") or "" + output = stdout or stderr or err or "(无 stdout/stderr;命令在校验前停止或无内容输出)" + io_block = ( + '
输入 / CLI 输出' + f'
输入
{html.escape(r.get("input", ""))}
' + f'
stdout
{html.escape(stdout or "(空)")}
' + f'
stderr / error
{html.escape((stderr or err) or "(空)")}
' + f'
最终用于判定的返回
{html.escape(output)}
' + '
' + ) + return ( + f'{html.escape(status_label)}' + f'
{html.escape(method)};调用数 {r.get("call_count", 0)};' + f'{html.escape(verified)};{html.escape(tool_txt)}{err_html}
' + f'{io_block}' + f'{real_html(it, real_tests)}' + ) + +def gen_html(items, lark, matrix, tests, real_read_matrix, real_write_matrix, real_tests): by_svc = {} for it in items: by_svc.setdefault(it["service"], []).append(it) @@ -148,6 +346,33 @@ def gen_html(items, lark): hit = sum(1 for it in items if lark_cmd(it, lark)[0] == "hit") dss = sum(1 for it in items if LARK_MAP.get(it["service"]) is None) + smart = [it for it in items if it["layer"] == "smart"] + atomic_count = len(items) - len(smart) + smart_by_svc = {} + for it in smart: + smart_by_svc.setdefault(it["service"], []).append(it) + lark_platform_only = { + svc: sorted(lark.get(svc, set())) + for svc in sorted(LARK_PLATFORM_ONLY) + if lark.get(svc) + } + lark_platform_only_count = sum(len(cmds) for cmds in lark_platform_only.values()) + test_total = matrix.get("total", 0) + test_assembled = matrix.get("assembled", 0) + test_validation = matrix.get("validation_blocked", 0) + test_failed = matrix.get("failed", 0) + test_tool_bad = matrix.get("tool_verification_bad", 0) + real_read_summary = matrix_summary(real_read_matrix) + real_write_summary = matrix_summary(real_write_matrix) + real_total = real_read_summary.get("total", 0) + real_ok = real_read_summary.get("ok", 0) + real_error = real_read_summary.get("error", 0) + real_timeout = real_read_summary.get("timeout", 0) + real_write_total = real_write_summary.get("total", 0) + real_write_ok = real_write_summary.get("ok", 0) + real_write_error = real_write_summary.get("error", 0) + real_write_timeout = real_write_summary.get("timeout", 0) + real_write_held = real_write_summary.get("held", 0) P = [] P.append(f''' @@ -165,6 +390,15 @@ h1{{margin:0 0 6px;font-size:25px}} .sub{{color:var(--muted);font-size:13px}} .note{{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:12px 16px;margin:22px 0;color:var(--muted);font-size:13px}} .note b{{color:var(--ink)}} h2{{font-size:18px;margin:34px 0 4px;padding-top:10px}} h2 .c{{color:var(--muted);font-size:14px;font-weight:400}} +.section-lead{{color:var(--muted);max-width:980px;margin:7px 0 14px}} +.card-grid{{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px;margin:12px 0 24px}} +.card{{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:13px 15px}} +.card h3{{margin:0 0 8px;font-size:14px;color:var(--accent)}} +.smart-list{{list-style:none;padding:0;margin:0;display:grid;gap:7px}} +.smart-list li{{border-top:1px solid var(--line);padding-top:7px}} +.smart-list li:first-child{{border-top:0;padding-top:0}} +.smart-list code{{color:#d3a7ff}} .smart-desc{{display:block;color:var(--muted);font-size:11.5px;margin-top:1px}} +.why td:first-child{{color:#9aa8bb}} .why td:nth-child(2){{color:#dce7f7}} table{{width:100%;border-collapse:collapse;margin:10px 0 6px;background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;table-layout:fixed}} th,td{{padding:9px 11px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top;word-break:break-all}} th{{background:#1b2536;color:var(--muted);font-size:12px;font-weight:600}} @@ -175,6 +409,13 @@ code{{font-family:"SF Mono",Menlo,Consolas,monospace;font-size:12.5px}} .desc{{color:var(--muted);font-size:11.5px;margin-top:3px}} .rk{{display:inline-block;font-size:10px;padding:0 6px;border-radius:10px;margin-left:6px;vertical-align:1px}} .rk-r{{background:#12321d;color:#66d38a}} .rk-w{{background:#3a2f10;color:#e2b23c}} .rk-h{{background:#3a1414;color:#f27272}} +.smart-badge{{display:inline-block;font-size:10px;padding:0 6px;border-radius:10px;margin-left:6px;vertical-align:1px;background:#35204d;color:#d3a7ff}} +.test-ok,.test-warn,.test-bad{{display:inline-block;font-size:10px;padding:0 6px;border-radius:10px;vertical-align:1px}} +.test-ok{{background:#12321d;color:#66d38a}} .test-warn{{background:#3a2f10;color:#e2b23c}} .test-bad{{background:#3a1414;color:#f27272}} +.test-err{{color:#d5a429}} +details.io{{margin-top:6px}} details.io summary{{cursor:pointer;color:#8fd3ff;font-size:11.5px}} +.io-label{{color:#9aa8bb;font-size:11px;margin-top:6px}} +details.io pre{{white-space:pre-wrap;word-break:break-word;background:#101827;border:1px solid var(--line);border-radius:6px;padding:7px;margin:3px 0 6px;color:#c7cfdb;max-height:260px;overflow:auto;font-size:11px}} .lk-none{{color:#6b7890}} .lk-miss{{color:var(--yellow)}} .lk-hit{{color:var(--green)}} footer{{color:var(--muted);text-align:center;font-size:12px;margin-top:36px}} @@ -182,31 +423,126 @@ footer{{color:var(--muted);text-align:center;font-size:12px;margin-top:36px}}
每个 shortcut:dws +命令 vs lark-cli vs dws 原生 MCP 组合 · 源码自动提取
{len(items)}
shortcut 总数
+
{len(smart)}
复合 / 智能型
+
{atomic_count}
原子型
{len(order)}
服务
{hit}
lark 同名可对齐
{dss}
钉钉特有(无 lark)
+
{lark_platform_only_count}
lark 平台特有
+
{test_total}
逐条实测覆盖
+
{real_total}
真实只读后端测试
+
{real_write_total}
真实写入后端测试
读表说明:① dws shortcut = 新增的精选命令(<xxx> 为参数占位)。 -② dws 原生 MCP 组合 = 该 shortcut 底层等价的裸命令,需手拼 JSON —— 直观体现 shortcut 的收敛价值。 -③ lark-cli = 飞书对应命令:绿色=同名可对齐;黄色=lark 有该服务但命名/能力不同;灰色=钉钉特有服务,lark 无对应。因两边 API 不同,仅同名项做逐一对齐。
+② 原生 MCP / 编排说明:原子型展示等价裸命令;复合型说明其分页、消歧、多步调用、聚合或回滚职责。 +③ lark-cli = 飞书对应命令:绿色=同名可对齐;黄色=lark 有该服务但命名/能力不同;灰色=钉钉特有服务,lark 无对应。因两边 API 不同,仅同名项做逐一对齐。 +④ 复合/智能型 = 不只是参数改名,内部包含多次调用、跨服务 ID 解析、分页、消歧、聚合、投影、批处理或失败回滚。 +⑤ lark 平台特有 = 飞书有独立产品对象或事件模型,但当前 DWS / 钉钉 MCP 没有等价资源,不能通过简单封装实现。 +⑥ 实际测试情况 = 每条 dws shortcut 都通过真实 cobra 命令树执行;fake MCP 拦截所有后端调用,因此不发网络、不写线上数据。绿色=已装配到 MCP 调用;黄色=synthetic 参数被命令自身校验正确拦截;红色=失败。每行都可展开查看本次测试的 CLI 输入、stdout、stderr/error。 +⑦ 真实后端测试 = 用真实 dws 二进制、真实登录态、真实后端执行(无 --mock、无 --dry-run),逐条记录真实输入与真实 stdout/stderr。read 已全量覆盖;write / high-risk-write 按临时测试资源和测试人员分批推进,未覆盖项会继续补测。 +⑧ 逐项失败 review = shortcut-error-review.html 已把每个真实失败逐条标出“要改哪里 / 具体改法 / 验证方式”。
''') + P.append(f'

逐条实际测试矩阵 · {test_total} / {len(items)} 覆盖

') + P.append(f'

本页每一条 dws shortcut 都有测试记录。测试由 scripts/gen_shortcut_test_matrix.go 生成:逐条喂入合成参数,实际执行 cobra 命令树,所有 MCP 调用由 fake caller 拦截并记录 product/tool/args,同时捕获每条命令的 CLI 输入、stdout、stderr/error,确保零网络、零副作用。结果:{test_assembled} 条已装配到真实 MCP tool,{test_validation} 条被自身校验按预期拦截,失败 {test_failed} 条,tool ground truth 校验失败 {test_tool_bad} 条。

') + P.append(''' +''') + P.append(f'') + P.append(f'') + P.append(f'') + P.append('
测试类型数量含义副作用边界
已实测装配{test_assembled}命令实际执行到 MCP 调用组装路径,并记录 product/tool/argsfake MCP 拦截,不访问后端,不写数据
实测校验拦截{test_validation}命令实际执行到自身校验链路,synthetic 参数被合法拒绝校验前停止,无 MCP 调用
失败{test_failed}panic、无调用无错误、或 tool ground truth 未通过必须为 0 才允许生成报告
') + + P.append(f'

真实后端只读测试 · {real_total} / 204 read 覆盖

') + P.append(f'

这一层不使用 mock,也不使用 dry-run:用临时构建的真实 dws 二进制和当前 profile 登录态执行 read shortcut,并捕获真实 stdout/stderr。结果:成功 {real_ok} 条,真实后端/参数/鉴权错误 {real_error} 条,超时 {real_timeout} 条。大量错误并不代表命令未执行,而是后端真实返回了 not_authenticated、参数校验、资源不存在或权限/业务错误;这些原始输出已逐条写在主表展开项中。

') + P.append(''' +''') + P.append(f'') + P.append(f'') + P.append(f'') + P.append('
真实测试类型数量含义副作用边界
真实后端成功{real_ok}命令真实访问后端并 exit 0仅 read 命令
真实后端返回错误{real_error}命令真实访问后端或真实执行本地校验后返回错误;stdout/stderr 已逐条记录仅 read 命令
真实后端超时{real_timeout}超过测试超时时间仅 read 命令
') + P.append('

只读真实失败归因

') + P.append(failure_category_table(real_read_matrix)) + + P.append(f'

真实后端写入测试 · {real_write_total} / 162 write 覆盖中

') + P.append(f'

这一层同样不使用 mock,也不使用 dry-run:用真实 dws 二进制、当前登录态、临时测试资源以及测试人员(冬翔、克谨、怒龙)分批执行 write / high-risk-write shortcut。当前已记录 {real_write_total} 条:成功 {real_write_ok} 条,真实后端/参数/业务错误 {real_write_error} 条,超时 {real_write_timeout} 条,待执行 {real_write_held} 条。写入类的失败同样保留真实 stdout/stderr,便于定位是 shortcut 参数投影问题、后端业务约束还是权限限制。

') + P.append(''' +''') + P.append(f'') + P.append(f'') + P.append(f'') + P.append('
真实测试类型数量含义副作用边界
真实后端成功{real_write_ok}命令真实访问后端并 exit 0临时资源 / 测试人员
真实后端返回错误{real_write_error}命令真实访问后端或真实执行本地校验后返回错误;stdout/stderr 已逐条记录临时资源 / 测试人员
真实后端超时{real_write_timeout}超过测试超时时间需单独复测
') + P.append('

写入真实失败归因

') + P.append(failure_category_table(real_write_matrix)) + + P.append(f'

非复合 / 智能型 shortcut 为什么也要写? · {atomic_count} 个

') + P.append('

原子型 shortcut 不是在宣称“新增了底层能力”,而是在 MCP tool 之上提供一层稳定、可发现、可测试的用户入口。它的价值边界要讲清楚:有增量就保留,纯重复就删除。

') + P.append(''' + + + + + + + +
必要性没有原子型 shortcut 时保留原子型 shortcut 的价值
补齐命令面空白有些 MCP tool 没有对应的 dws <svc> <verb> helper,只能走裸 dws mcp ... --json把真实可用的底层能力挂到产品命令树里,用户和 Agent 不必手写 JSON
参数收敛调用者要记服务端字段名、嵌套 JSON、枚举和必填关系收敛成命名 flag、默认值和校验,降低误填与 prompt 猜参概率
Intent / Help / 可发现性MCP schema 偏接口视角,Agent 需要先理解 tool 再判断何时使用每条 shortcut 都带任务化描述,可被 --help、dws shortcut list 和 Agent 规划直接利用
统一安全与输出入口读写风险、dry-run、format / jq / fields 等能力分散到调用者侧复用 shortcut 框架的 risk 分级、dry-run 通道和统一输出契约
稳定投影底层响应 envelope 冗长且字段不稳定,常把噪声暴露给用户对一部分读类命令保留干净投影,只输出用户真正要看的字段
对齐与治理无法判断与 lark-cli、helper、MCP tool 的覆盖差异,也难以做后续去重形成可枚举的命令面,便于生成报告、做 GSB 对比和持续 prune
''') + P.append('
保留标准:原子型 shortcut 必须至少满足“补 helper 空白”或“提供投影/校验/Intent 等体验增量”。本轮已删除 213 条仅换名字、无投影增量、且 helper 已覆盖的纯重复 wrapper;所以这里的原子型不是为了凑数量,而是为了把仍有价值的底层能力变成稳定入口。
') + + P.append(f'

复合 / 智能型 shortcut · {len(smart)} 个

') + P.append('

这组命令面向完整用户意图,例如“按姓名发消息”“找共同空闲时间”“找到最新妙记并取逐字稿”。其中一部分是真正的多 MCP / 跨服务编排,另一部分是单服务内的分页、过滤、批处理和稳定输出;两者都不是普通 API 别名。

') + P.append('
') + for svc in sorted(smart_by_svc, key=lambda s: (-len(smart_by_svc[s]), s)): + rows = sorted(smart_by_svc[svc], key=lambda x: x["command"]) + P.append(f'

{html.escape(svc)} · {len(rows)}

    ') + for it in rows: + P.append(f'
  • dws {html.escape(it["service"])} {html.escape(it["command"])}{html.escape(it["desc"])}
  • ') + P.append('
') + P.append('
') + + P.append('

为什么不只提供 API 形态?

') + P.append('

API/MCP 形态以服务端资源和接口为中心;shortcut 以用户任务为中心。单独封装的价值不是少写几个字符,而是把稳定的客户端语义、保护措施和多步流程变成可测试契约。

') + P.append(''' + + + + + + + + +
维度直接 API / MCP单独 shortcut 封装
输入语义要求调用者理解服务端字段名、类型、枚举和 JSON 结构提供面向任务的 flags、默认值、枚举、时间解析和跨字段校验
ID 与上下文通常先查 userId、deptId、eventId、baseId,再复制到下一次调用可按姓名/标题解析、唯一性消歧,并自动串联后续操作
多步一致性调用者自行处理部分成功、重试、回滚与中间结果集中实现 fan-out、分页、去重、partial failure 和必要回滚
安全写接口裸露,dry-run 和确认逻辑由每个调用者重复实现统一 risk 分级、确认提示、dry-run 计划和高风险保护
输出契约响应 envelope 和字段随底层工具而异,常含大量噪声稳定投影关键字段,并统一支持 format / jq / fields
Agent 可发现性模型需先理解 API schema,再自己规划完整调用链Intent、示例和窄参数面直接表达“什么时候用、会发生什么”
演进隔离上游参数或响应变化会扩散到所有脚本和 Agent prompt在一个经过测试的适配层吸收兼容变化
''') + P.append('
它不是 API 的替代品。 对一次性、低频、需要完整底层字段或刚上线尚未沉淀的能力,仍应直接调用 API/MCP。只有当封装提供明确增量——复合编排、校验、安全、稳定投影或高频意图——才值得保留;纯粹改名且没有增量的 wrapper 应删除或不新增。
') + + P.append(f'

lark 平台特有 shortcut · {lark_platform_only_count} 个

') + P.append('

这批不是“DWS 少写了几个 shortcut”,而是飞书平台有对应的一等产品对象或事件模型,当前钉钉 MCP/DWS 没有同语义承接点。后续只有在钉钉开放对应 API、或 DWS 接入等价 MCP tool 后,才适合再做 shortcut。

') + P.append('
') + for svc, cmds in lark_platform_only.items(): + reason = LARK_PLATFORM_ONLY[svc] + P.append(f'

lark {html.escape(svc)} · {len(cmds)}

') + P.append(f'
{html.escape(reason)}
') + P.append('
    ') + for cmd in cmds: + P.append(f'
  • lark-cli {html.escape(svc)} {html.escape(cmd)}
  • ') + P.append('
') + P.append('
') + for svc in order: rows = by_svc[svc] lsvc = LARK_MAP.get(svc) lbl = f"↔ lark {lsvc}" if lsvc else "钉钉特有 · lark 无对应" P.append(f'

{html.escape(svc)} · {len(rows)} 个 · {lbl}

') - P.append('') - P.append('') + P.append('
dws shortcut(新增)dws 原生 MCP 组合(等价裸命令)lark-cli 对应
') + P.append('') for it in sorted(rows, key=lambda x: x["command"]): rk = RISK_CLS.get(it["risk"], "rk-r") lk_cls, lk_txt = lark_cmd(it, lark) lk_html = f'{html.escape(lk_txt)}' if lk_cls == "hit" else f'{html.escape(lk_txt)}' + smart_badge = '复合/智能型' if it["layer"] == "smart" else "" P.append("") - P.append(f'') + P.append(f'') P.append(f'') P.append(f'') + P.append(f'') P.append("") P.append("
dws shortcut(新增)原生 MCP / 编排说明lark-cli 对应实际测试情况
{html.escape(shortcut_cmd(it))}{it["risk"]}
{html.escape(it["desc"])}
{html.escape(shortcut_cmd(it))}{it["risk"]}{smart_badge}
{html.escape(it["desc"])}
{html.escape(raw_cmd(it))}{lk_html}{test_html(it, tests, real_tests)}
") @@ -216,13 +552,28 @@ footer{{color:var(--muted);text-align:center;font-size:12px;margin-top:36px}} def main(): lark = load_lark() items = collect() - out = gen_html(items, lark) + matrix, tests = load_test_matrix() + real_read_matrix, real_read_tests = load_real_read_matrix() + real_write_matrix, real_write_tests = load_real_write_matrix() + real_tests = {} + real_tests.update(real_read_tests) + real_tests.update(real_write_tests) + if matrix.get("failed", 0) or matrix.get("tool_verification_bad", 0): + raise SystemExit(f"shortcut test matrix failed: failed={matrix.get('failed')} tool_bad={matrix.get('tool_verification_bad')}") + out = gen_html(items, lark, matrix, tests, real_read_matrix, real_write_matrix, real_tests) dst = os.path.join(ROOT, "docs", "shortcut-comparison.html") open(dst, "w", encoding="utf-8").write(out) hit = sum(1 for it in items if lark_cmd(it, lark)[0] == "hit") miss = sum(1 for it in items if lark_cmd(it, lark)[0] == "miss") none = sum(1 for it in items if lark_cmd(it, lark)[0] == "none") print(f"shortcuts={len(items)} lark_hit={hit} lark_miss={miss} dingtalk_specific={none}") + print(f"tests={matrix.get('total')} assembled={matrix.get('assembled')} validation_blocked={matrix.get('validation_blocked')} failed={matrix.get('failed')} tool_bad={matrix.get('tool_verification_bad')}") + if real_read_matrix: + s = matrix_summary(real_read_matrix) + print(f"real_read_tests={s.get('total')} ok={s.get('ok')} error={s.get('error')} timeout={s.get('timeout')}") + if real_write_matrix: + s = matrix_summary(real_write_matrix) + print(f"real_write_tests={s.get('total')} ok={s.get('ok')} error={s.get('error')} timeout={s.get('timeout')} held={s.get('held')}") print("written:", dst) if __name__ == "__main__": diff --git a/scripts/gen_shortcut_error_review.py b/scripts/gen_shortcut_error_review.py new file mode 100644 index 00000000..ec1be10c --- /dev/null +++ b/scripts/gen_shortcut_error_review.py @@ -0,0 +1,449 @@ +#!/usr/bin/env python3 +"""Generate a per-error review report from real shortcut test results.""" + +from __future__ import annotations + +import json +import re +from collections import Counter +import html +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +READ_PATH = ROOT / "docs" / "shortcut-real-read-results.json" +WRITE_PATH = ROOT / "docs" / "shortcut-real-write-results.json" +OUT_PATH = ROOT / "docs" / "shortcut-error-review.html" + + +CATEGORY_LABELS = { + "auth-or-permission": "鉴权/权限", + "backend-business-rule": "后端业务规则", + "backend-or-mcp-error": "后端/MCP", + "input-or-business-validation": "输入/业务校验", + "missing-real-aitable-fixture": "缺 AI 表格 fixture", + "missing-real-minutes-fixture": "缺妙记 fixture", + "missing-real-resource": "缺真实资源", + "held": "敏感/高风险暂缓", +} + + +RESOURCE_AUDIT = [ + ("chat +group-members", "已补齐", "查到真实群名 `浅曦-kida,Dennis,秋画`,runner 已改为用群名而不是 openConversationId;真实回归成功。", "无需后续动作。"), + ("chat +messages-mget", "已补齐", "复用真实单聊消息 `msgEuOor1PmFBNlx9M06N9z1Q==`;真实回归成功。", "无需后续动作。"), + ("chat +messages-read-status", "已补齐", "复用真实单聊会话 `cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=` 与同一 openMessageId;真实回归成功。", "无需后续动作。"), + ("chat +messages-query-send-status", "已补齐", "复用真实发送返回的 openTaskId;真实回归成功。", "无需后续动作。"), + ("ding +receiver-status", "已补齐", "先只读 `ding +list` 找到已有 openDingId,再查询 receiver status;没有新发 DING,真实回归成功。", "无需后续动作。"), + ("sheet +list-sheets", "已自造", "创建临时在线表格 `DWS shortcut 真实测试表格 20260715`,nodeId=`mweZ92PV6O36dZbnsMZx70ylJxEKBD6p`;真实回归成功。", "后续可保留为稳定 fixture,或测试结束后人工清理。"), + ("todo +todo-done", "已自造并修复 CLI", "runner 会先创建当前账号自己的临时待办,再执行 `todo +todo-done`;同时修复了 todo 列表 pageSize=50 返回空、响应多层 result unwrap 不稳的问题;真实回归成功。", "无需后续动作;代码已有单测覆盖 nested result。"), + ("contact +by-mobile", "已按用户授权补齐", "使用用户指定手机号 `13161187007` 作为真实 fixture;runner 只在该命令上替换 mobile,不扩散到其它服务。", "真实回归成功后该项将从失败列表移除;若后续要脱敏公开报告,可再加展示层脱敏。"), + ("attendance +get-class / +get-group / +get-group-filtered", "不建议自造", "`attendance +search-class` 与 `+search-group --type FIXED` 均返回空;创建班次/考勤组会改组织考勤配置,属于高影响业务数据。", "需要考勤后端/业务同学提供可读测试班次与考勤组 ID。"), + ("chat +chat-get-by-id", "暂未找到", "该 shortcut 只接受数字 groupId;真实群列表只返回 openConversationId,没有数字群号字段。", "需要 IM 后端提供可用数字 groupId,或评估是否新增 openConversationId 形态的 shortcut。"), + ("chat +messages-resource-url", "暂未自造", "需要真实含 mediaId 的图片/文件/视频消息;当前文本消息无法产生 resource-id。", "可在测试群发一条图片/文件消息并提取 mediaId 后补 fixture;注意会产生群消息。"), + ("chat +thread-replies", "暂未自造", "需要真实话题消息 topicId;普通群消息不能替代。", "需要话题群 fixture,或由 IM 同学提供当前账号可访问 topicId。"), + ("aitable +dashboard-share-get", "真实资源仍失败", "已有真实 base/dashboard,但 share-get 返回 404 `Failed to get dashboard share config`;更像分享配置未开启或后端接口行为问题。", "需要 AI 表格/后端确认如何创建/开启 dashboard share fixture,或修正 404 语义。"), + ("write 类 delete/recall/approve/wiki move/copy 等", "不自动自造", "这些命令即便能造资源,也会涉及删除、撤回、审批通过、知识库移动/复制等高影响动作。", "需要逐项授权和专门测试空间/机器人/审批单据,不建议混在批量回归里自动跑。"), +] + + +def load(path: Path) -> dict[str, Any]: + return json.loads(path.read_text(encoding="utf-8")) + + +def squish(text: str, limit: int = 180) -> str: + text = re.sub(r"\s+", " ", text or "").strip() + if len(text) <= limit: + return text + return text[: limit - 1] + "…" + + +def error_text(row: dict[str, Any]) -> str: + return f"{row.get('stderr') or ''}\n{row.get('stdout') or ''}" + + +def parse_error_payload(row: dict[str, Any]) -> dict[str, Any]: + for key in ("stderr", "stdout"): + raw = (row.get(key) or "").strip() + if not raw: + continue + try: + value = json.loads(raw) + except json.JSONDecodeError: + continue + if isinstance(value, dict): + err = value.get("error") + if isinstance(err, dict): + return err + return value + return {} + + +def operation(row: dict[str, Any]) -> str: + payload = parse_error_payload(row) + op = payload.get("operation") + if isinstance(op, str) and op: + return op + msg = payload.get("message") + if isinstance(msg, str): + m = re.search(r"\(operation:\s*([^)]+)\)", msg) + if m: + return m.group(1) + return "-" + + +def trace_id(row: dict[str, Any]) -> str: + payload = parse_error_payload(row) + tid = payload.get("trace_id") or payload.get("traceId") + return str(tid) if tid else "-" + + +def evidence(row: dict[str, Any]) -> str: + payload = parse_error_payload(row) + msg = payload.get("message") + if isinstance(msg, str) and msg.strip(): + return squish(msg, 220) + return squish(error_text(row), 220) + + +def action_for(row: dict[str, Any], suite: str) -> tuple[str, str, str]: + """Return (owner, action, verification) for one failing row.""" + category = row.get("failure_category") or "unclassified" + service = row.get("service") or "" + command = row.get("command") or "" + text = error_text(row).lower() + msg = evidence(row) + + if category == "auth-or-permission": + return ( + "权限/应用配置", + "给当前登录账号、DWS 应用或对应资源补齐权限/scope;本仓库 shortcut 不应绕过权限。拿 trace_id 给服务端/开放平台排查具体 scope。", + f"补权限后重跑 `{service} {command}`;若仍是 permission,再看 trace_id。", + ) + + if category == "missing-real-aitable-fixture": + return ( + "测试数据", + "准备真实 Base/Table/View/Field/Record/Role/Chart/Dashboard 等 fixture,并把真实 ID 写入真实测试 runner;当前安全负向 ID 只能证明调用链,不可能成功。", + "fixture 准备好后重跑对应 aitable 命令;预期从 not_found/invalid_base_id 变为成功或更具体业务错误。", + ) + + if category == "missing-real-minutes-fixture": + return ( + "测试数据", + "准备当前账号可见的真实妙记/听记/录制会话,或把 runner 的搜索关键词改成必然能命中的会议产物。", + "用真实 taskUuid/note/minutes 资源重跑 minutes 命令。", + ) + + if category == "missing-real-resource": + if "opencid" in text or "openconversationid" in text: + return ( + "测试数据", + "替换为当前账号真实可访问的群/会话 openConversationId;如果用真实群仍报“无效”,再查 IM 后端解析。", + "先用 `chat +my-groups` 或群搜索拿真实会话 ID,再重跑。", + ) + if "openmessageid" in text or "openmsgid" in text or "invalid openmsgid" in text: + return ( + "测试数据", + "替换为真实 openMessageId,并保证消息属于当前账号可访问会话;当前 no-such ID 只能验证负向路径。", + "先用消息列表拿 messageId,再重跑消息详情/状态/撤回类命令。", + ) + if service == "attendance": + return ( + "测试数据", + "替换为真实考勤班次/考勤组/员工/假期等资源 ID;当前 no-such ID 只能验证负向路径。", + "先用考勤列表/管理后台拿真实 ID,再重跑该 attendance 命令。", + ) + if service == "contact": + return ( + "测试数据", + "替换为当前组织通讯录中真实存在的人、手机号、部门或花名册对象;当前占位查询不会命中。", + "用真实姓名/手机号/部门重跑 contact 命令。", + ) + if "table_not_found" in text or "node" in text or "doc" in text: + return ( + "测试数据", + "替换为真实文档/节点 ID;文档评论、分享、版本等命令需要资源存在且账号可访问。", + "用真实 doc/node 重跑;若仍失败再看 doc/doc-comment 工具字段。", + ) + return ( + "测试数据", + "把 runner 里的安全负向 ID 换成真实资源 ID;当前错误说明调用已进后端,但资源不存在。", + f"准备 fixture 后重跑 `{service} {command}`。", + ) + + if category == "backend-or-mcp-error": + if service == "chat" and ( + "opencid" in text + or "openconversationid" in text + or "receiveruid" in text + or "applicantuid" in text + ): + return ( + "后端/MCP schema", + "CLI fake MCP 已证明字段已装配;需要修 MCP tool schema 或网关字段映射,确认 openConversationId/openCid/cid、receiverUid、applicantUid 等字段没有在 schema 校验/转发时被丢弃。", + "修 MCP 后不改 shortcut,直接重跑真实命令;预期错误从 required 变为资源无效或成功。", + ) + if service == "aitable": + return ( + "后端/MCP schema", + "修 aitable MCP wrapper 的参数校验和错误语义:不要返回 success=true+error;对 required 字段给出 CLI 可识别的参数名,系统错误要带 retryable/trace。", + "MCP 修完后重跑该 aitable 命令,并确认 stdout JSON 不再出现 success=true 但 error 非空。", + ) + return ( + "后端/MCP 服务", + "优先修服务端/MCP 内部错误或 schema 映射;CLI 当前只能如实暴露错误,不应吞掉或伪造成功。", + "服务端修复后按 trace_id/operation 重跑同一命令。", + ) + + if category == "backend-business-rule": + return ( + "测试账号/业务规则", + "按后端业务规则换账号或换场景;例如组织者不能响应自己的日程邀请,这不是 CLI bug。", + "用满足业务角色的账号重跑。", + ) + + if category == "held": + return ( + "人工安全确认", + "该项涉及敏感读取或无安全负向目标,不适合自动用真实资源跑;需要在安全环境逐项人工确认。", + f"人工确认后单独重跑 `{service} {command}`,并避免在报告中泄露密钥/凭证。", + ) + + if category == "input-or-business-validation": + if "没有找到名称包含" in msg or "没搜到" in msg or "暂无" in msg or "没有已处理" in msg or "当前没有" in msg or "今天没有" in msg or "没有与你相关" in msg: + return ( + "测试数据", + "准备能命中的真实数据,或把 runner 查询词改成当前账号一定存在的对象;shortcut 本身不需要改。", + "造数后重跑,预期从 validation empty result 变为成功。", + ) + if "roomid invalid" in text or "会议室数量,超过上限100" in msg: + return ( + "测试输入", + "会议室类命令需要真实 roomId 或更小会议室分组;修改 runner 先定位会议室/分组,再喂给查询命令。", + "用真实 roomId/分组重跑 calendar room/freebusy 命令。", + ) + if "token decode create_at fail" in text: + return ( + "测试输入", + "calendarId 不能用占位/primary;runner 应先通过日历列表拿真实 calendarId,再用于 agenda。", + "用真实 calendarId 重跑 `calendar +agenda`。", + ) + if "unsupported setting key" in text: + return ( + "测试输入/shortcut 枚举", + "把测试输入的 setting-key 从 x 改为后端支持的 key;同时可在 shortcut flag 上补 enum,避免用户传非法 key。", + "改 runner 后重跑;如果补 enum,跑 shortcut 单测确认校验文案。", + ) + if "暂不支持保存该文字表情" in msg: + return ( + "测试输入/业务规则", + "换成后端支持的文字表情组合,或把该命令保留为业务负向;CLI 不应绕过后端限制。", + "用一个真实可保存的表情模板重跑。", + ) + if "opentaskid解密失败" in text: + return ( + "测试数据", + "消息发送状态查询需要真实 openTaskId;先真实发送/获取任务 ID,再作为 fixture 输入。", + "用真实 openTaskId 重跑。", + ) + if "taskid is null" in text: + return ( + "后端/MCP schema", + "CLI 已传 task-id 但后端看到 null,优先查 todo MCP 参数映射;若 schema 只认嵌套 request,需要同步修改 shortcut 参数投影。", + "用 dry-run/fake MCP 对比真实 trace,确认 taskId 是否在 MCP 层丢失。", + ) + if "system error" in text or "mcp_server_error" in text or "系统繁忙" in msg: + return ( + "后端服务", + "服务端返回系统繁忙/内部错误;CLI 侧可增加重试提示,但根因需要服务端修。", + "稍后重跑并带 trace_id 给服务端。", + ) + if "business error: success=false" in text or "business error: code" in text: + return ( + "后端业务/测试 fixture", + "后端只返回 success=false,信息不足;先准备真实合法 fixture,若仍无细节,需要后端补充错误码/错误信息。", + "用真实资源重跑;若仍 success=false,把 operation+trace_id 给后端。", + ) + return ( + "测试输入/业务校验", + "当前命令已进入后端业务校验;先把测试输入换成真实合法 fixture,再判断是否需要改 shortcut。", + f"重跑 `{service} {command}` 并比较 stdout/stderr。", + ) + + return ( + "待人工 triage", + "当前分类不足,需要结合 trace_id、operation 和完整 stdout/stderr 单独查。", + "先复现单条命令,再决定改 CLI、runner 还是后端。", + ) + + +def esc(value: Any) -> str: + return html.escape(str(value), quote=True) + + +def table_rows(rows: list[dict[str, Any]], suite: str) -> list[str]: + out: list[str] = [] + for idx, row in enumerate(rows, 1): + owner, action, verify = action_for(row, suite) + category = CATEGORY_LABELS.get(row.get("failure_category"), row.get("failure_category", "-")) + cmd = f"{row.get('service')} {row.get('command')}" + out.append( + "" + f"{idx}" + f"{esc(cmd)}" + f"{esc(row.get('risk') or '-')}" + f"{esc(category)}" + f"{esc(owner)}" + f"{esc(action)}" + f"{esc(verify)}" + f"{esc(operation(row))}" + f"{esc(trace_id(row))}" + f"{esc(evidence(row))}" + "" + ) + return out + + +def stat_cards(read: dict[str, Any], write: dict[str, Any], read_errors: list[dict[str, Any]], write_errors: list[dict[str, Any]]) -> str: + all_errors = read_errors + write_errors + owner_counts = Counter(action_for(row, "all")[0] for row in all_errors) + category_counts = Counter(CATEGORY_LABELS.get(row.get("failure_category"), row.get("failure_category", "-")) for row in all_errors) + cards = [ + ("Read 失败", read["summary"]["error"]), + ("Write 失败", write["summary"]["error"]), + ("逐项 review", len(all_errors)), + ("测试数据/fixture", owner_counts.get("测试数据", 0)), + ("权限/应用配置", owner_counts.get("权限/应用配置", 0)), + ("后端/MCP schema", owner_counts.get("后端/MCP schema", 0)), + ] + card_html = "\n".join(f'
{esc(v)}
{esc(k)}
' for k, v in cards) + category_rows = "\n".join( + f"{esc(k)}{esc(v)}" + for k, v in category_counts.most_common() + ) + owner_rows = "\n".join( + f"{esc(k)}{esc(v)}" + for k, v in owner_counts.most_common() + ) + return f""" +
{card_html}
+
+

按错误类型

{category_rows}
类型数量
+

按要改哪里

{owner_rows}
要改哪里数量
+
+""" + + +def render_table(title: str, rows: list[dict[str, Any]], suite: str) -> str: + body = "\n".join(table_rows(rows, suite)) + return f""" +

{esc(title)} · {len(rows)} 条

+ + + + + +{body} + +
#命令风险类型要改哪里具体改法验证方式operationtrace_id证据
+""" + + +def render_resource_audit() -> str: + rows = "\n".join( + "" + f"{esc(cmd)}" + f"{esc(status)}" + f"{esc(finding)}" + f"{esc(next_step)}" + "" + for cmd, status, finding, next_step in RESOURCE_AUDIT + ) + return f""" +

缺真实资源复盘 · 可自造/可查资源处理结果

+ + +{rows} +
命令/范围处理状态本次实际排查/造数结果后续建议
+""" + + +def render() -> str: + read = load(READ_PATH) + write = load(WRITE_PATH) + read_errors = [r for r in read["results"] if r.get("status") != "real-ok"] + write_errors = [r for r in write["results"] if r.get("status") != "real-ok"] + + return f""" + + + + +Shortcut 真实测试失败逐项 review + + + +
+

Shortcut 真实测试失败逐项 review

+
由 scripts/gen_shortcut_error_review.py 从真实测试结果生成;目标是把每个失败项落到“应该改哪里”。
+
+
+
+Read:{esc(read['summary']['total'])} 条,成功 {esc(read['summary']['ok'])},失败 {esc(read['summary']['error'])},超时 {esc(read['summary']['timeout'])}。 +Write:{esc(write['summary']['total'])} 条,成功 {esc(write['summary']['ok'])},失败 {esc(write['summary']['error'])},超时 {esc(write['summary']['timeout'])}。 +判定口径:如果 fake MCP 已看到字段但真实后端仍报 required,按后端/MCP schema 映射处理;如果真实后端报资源无效/不存在,按 fixture 处理;权限类不在 CLI 中绕过。 +
+{stat_cards(read, write, read_errors, write_errors)} +{render_resource_audit()} +{render_table("Read 失败逐项", read_errors, "read")} +{render_table("Write 失败逐项", write_errors, "write")} +
+ + +""" + + +def main() -> int: + OUT_PATH.write_text(render(), encoding="utf-8") + print(f"written: {OUT_PATH}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/gen_shortcut_release_hidden.py b/scripts/gen_shortcut_release_hidden.py new file mode 100644 index 00000000..9ecd9520 --- /dev/null +++ b/scripts/gen_shortcut_release_hidden.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +"""Generate the release-hidden shortcut list from real test results. + +Shortcuts whose latest real-backend result is not `real-ok` are kept in source +code but hidden from public discovery for this release. The generated Go file +is a release gate; the Markdown/JSON files are the handoff list for the next +iteration. +""" + +from __future__ import annotations + +import datetime as dt +import json +import re +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +READ_PATH = ROOT / "docs" / "shortcut-real-read-results.json" +WRITE_PATH = ROOT / "docs" / "shortcut-real-write-results.json" +GO_PATH = ROOT / "internal" / "shortcut" / "release_hidden_generated.go" +MD_PATH = ROOT / "docs" / "shortcut-next-release-hidden.md" +JSON_PATH = ROOT / "docs" / "shortcut-next-release-hidden.json" + + +def load(path: Path) -> dict[str, Any]: + return json.loads(path.read_text(encoding="utf-8")) + + +def squish(text: str, limit: int = 180) -> str: + text = re.sub(r"\s+", " ", text or "").strip() + if len(text) <= limit: + return text + return text[: limit - 1] + "…" + + +def error_text(row: dict[str, Any]) -> str: + return f"{row.get('stderr') or ''}\n{row.get('stdout') or ''}" + + +def parse_error_payload(row: dict[str, Any]) -> dict[str, Any]: + for key in ("stderr", "stdout"): + raw = (row.get(key) or "").strip() + if not raw: + continue + try: + value = json.loads(raw) + except json.JSONDecodeError: + continue + if isinstance(value, dict): + err = value.get("error") + if isinstance(err, dict): + return err + return value + return {} + + +def evidence(row: dict[str, Any]) -> str: + payload = parse_error_payload(row) + msg = payload.get("message") + if isinstance(msg, str) and msg.strip(): + return squish(msg, 220) + return squish(error_text(row), 220) + + +def collect() -> list[dict[str, Any]]: + out: list[dict[str, Any]] = [] + for suite, path in (("read", READ_PATH), ("write", WRITE_PATH)): + data = load(path) + for row in data.get("results", []): + if row.get("status") == "real-ok": + continue + out.append({ + "suite": suite, + "service": row.get("service") or "", + "command": row.get("command") or "", + "risk": row.get("risk") or "", + "status": row.get("status") or "", + "failure_category": row.get("failure_category") or "unclassified", + "fixability": row.get("fixability") or "", + "diagnosis": row.get("diagnosis") or "", + "evidence": evidence(row), + }) + out.sort(key=lambda r: (r["suite"], r["service"], r["command"])) + return out + + +def go_quote(s: str) -> str: + return json.dumps(s, ensure_ascii=False) + + +def write_go(rows: list[dict[str, Any]]) -> None: + lines = [ + "// Code generated by scripts/gen_shortcut_release_hidden.py; DO NOT EDIT.", + "", + "package shortcut", + "", + "// releaseHiddenShortcuts contains shortcuts intentionally hidden from", + "// public discovery in this release because their latest real-backend", + "// test did not pass. The command implementations remain registered and", + "// invocable by exact path for internal follow-up testing.", + "var releaseHiddenShortcuts = map[string]string{", + ] + for row in rows: + key = f"{row['service']}\x00{row['command']}" + reason = ( + f"{row['suite']} real test not passed; " + f"status={row['status']}; category={row['failure_category']}; " + f"fixability={row['fixability'] or '-'}" + ) + lines.append(f"\t{go_quote(key)}: {go_quote(reason)},") + lines.extend(["}", ""]) + GO_PATH.write_text("\n".join(lines), encoding="utf-8") + + +def md_escape(s: str) -> str: + return str(s).replace("|", "\\|").replace("\n", "
") + + +def write_md(rows: list[dict[str, Any]]) -> None: + generated = dt.datetime.now().isoformat(timespec="seconds") + lines = [ + "# 本期隐藏、下期修复的 shortcut 清单", + "", + f"生成时间:`{generated}`", + "", + "来源:`docs/shortcut-real-read-results.json` 与 `docs/shortcut-real-write-results.json`。", + "", + "口径:最新真实后端测试结果不是 `real-ok` 的 shortcut,本期不对外 release;代码保留,并通过 `internal/shortcut/release_hidden_generated.go` 标记为 Hidden,后续补 fixture / 修后端 / 修 CLI 后再放开。", + "", + f"总计:{len(rows)} 条。", + "", + "| # | suite | shortcut | risk | status | category | fixability | 下期处理依据 |", + "|---:|---|---|---|---|---|---|---|", + ] + for idx, row in enumerate(rows, 1): + shortcut = f"{row['service']} {row['command']}" + basis = row["diagnosis"] or row["evidence"] + lines.append( + f"| {idx} | {md_escape(row['suite'])} | `{md_escape(shortcut)}` | " + f"{md_escape(row['risk'])} | {md_escape(row['status'])} | " + f"{md_escape(row['failure_category'])} | {md_escape(row['fixability'])} | " + f"{md_escape(squish(basis, 160))} |" + ) + lines.append("") + MD_PATH.write_text("\n".join(lines), encoding="utf-8") + + +def write_json(rows: list[dict[str, Any]]) -> None: + payload = { + "generated_at": dt.datetime.now().isoformat(), + "count": len(rows), + "results": rows, + } + JSON_PATH.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") + + +def main() -> int: + rows = collect() + write_go(rows) + write_md(rows) + write_json(rows) + print(f"hidden={len(rows)}") + print(f"written: {GO_PATH}") + print(f"written: {MD_PATH}") + print(f"written: {JSON_PATH}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/gen_shortcut_test_matrix.go b/scripts/gen_shortcut_test_matrix.go new file mode 100644 index 00000000..91897686 --- /dev/null +++ b/scripts/gen_shortcut_test_matrix.go @@ -0,0 +1,314 @@ +// Copyright 2026 Alibaba Group +// Licensed under the Apache License, Version 2.0. + +// gen_shortcut_test_matrix executes every registered built-in shortcut through +// the real cobra command tree with a fake MCP caller. It records whether each +// command safely assembles an MCP call (zero network / zero side effect) or is +// intentionally stopped by its own validation. The JSON output is consumed by +// scripts/gen_shortcut_comparison.py so the HTML report can show per-command +// test status instead of only aggregate coverage. +package main + +import ( + "context" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "regexp" + "sort" + "strings" + + "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/helpers" + "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/shortcut" + "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/shortcut/builtin" + "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/pkg/edition" + "github.com/spf13/cobra" +) + +type mcpCall struct { + Product string `json:"product"` + Tool string `json:"tool"` + Args map[string]any `json:"args,omitempty"` +} + +type fakeCaller struct { + calls []mcpCall +} + +func (f *fakeCaller) reset() { f.calls = nil } + +func (f *fakeCaller) CallTool(_ context.Context, product, tool string, args map[string]any) (*edition.ToolResult, error) { + f.calls = append(f.calls, mcpCall{Product: product, Tool: tool, Args: args}) + payload := map[string]any{ + "_fake": true, + "product": product, + "tool": tool, + "args": args, + } + b, _ := json.Marshal(payload) + return &edition.ToolResult{Content: []edition.ContentBlock{{Type: "text", Text: string(b)}}}, nil +} + +func (f *fakeCaller) Format() string { return "json" } +func (f *fakeCaller) DryRun() bool { return false } +func (f *fakeCaller) Fields() string { return "" } +func (f *fakeCaller) JQ() string { return "" } + +type commandResult struct { + Service string `json:"service"` + Command string `json:"command"` + Risk string `json:"risk"` + Method string `json:"method"` + Status string `json:"status"` + Input string `json:"input"` + Args []string `json:"args"` + Stdout string `json:"stdout,omitempty"` + Stderr string `json:"stderr,omitempty"` + Calls []mcpCall `json:"calls,omitempty"` + CallCount int `json:"call_count"` + Tools []string `json:"tools,omitempty"` + ToolVerified bool `json:"tool_verified"` + Error string `json:"error,omitempty"` + Note string `json:"note"` +} + +type matrix struct { + Total int `json:"total"` + Assembled int `json:"assembled"` + ValidationBlocked int `json:"validation_blocked"` + Failed int `json:"failed"` + ToolVerificationBad int `json:"tool_verification_bad"` + Results []commandResult `json:"results"` +} + +func realToolSet() map[string]bool { + files, _ := filepath.Glob("internal/helpers/*.go") + wordRe := regexp.MustCompile(`[A-Za-z][A-Za-z0-9_]{2,}`) + cjkRe := regexp.MustCompile(`"([^"]*\p{Han}[^"]*)"`) + set := map[string]bool{} + for _, f := range files { + data, err := os.ReadFile(f) + if err != nil { + continue + } + s := string(data) + for _, m := range wordRe.FindAllString(s, -1) { + set[m] = true + } + for _, m := range cjkRe.FindAllStringSubmatch(s, -1) { + set[m[1]] = true + } + } + return set +} + +func synthArgs(s shortcut.Shortcut) []string { + args := []string{s.Service, s.Command} + for _, f := range s.Flags { + switch { + case len(f.Enum) > 0: + args = append(args, "--"+f.Name, f.Enum[0]) + case f.Type == shortcut.FlagBool: + args = append(args, "--"+f.Name) + case f.Type == shortcut.FlagInt: + args = append(args, "--"+f.Name, "1") + default: + args = append(args, "--"+f.Name, "x") + } + } + return append(args, "--yes") +} + +func newRoot() *cobra.Command { + root := &cobra.Command{Use: "dws", SilenceUsage: true, SilenceErrors: true} + root.SetOut(io.Discard) + root.SetErr(io.Discard) + root.PersistentFlags().Bool("yes", false, "") + root.PersistentFlags().Bool("dry-run", false, "") + root.PersistentFlags().String("format", "json", "") + root.AddCommand(builtin.Commands()...) + return root +} + +func uniqueTools(calls []mcpCall) []string { + seen := map[string]bool{} + var out []string + for _, c := range calls { + name := c.Product + "/" + c.Tool + if !seen[name] { + seen[name] = true + out = append(out, name) + } + } + sort.Strings(out) + return out +} + +func riskString(s shortcut.Shortcut) string { + if s.Risk == "" { + return string(shortcut.RiskRead) + } + return string(s.Risk) +} + +func setCommandOutput(cmd *cobra.Command, out, errOut io.Writer) { + cmd.SetOut(out) + cmd.SetErr(errOut) + for _, child := range cmd.Commands() { + setCommandOutput(child, out, errOut) + } +} + +func runCaptured(fake *fakeCaller, root *cobra.Command, args []string) (stdout, stderr string, err error, panicValue any) { + stdoutFile, err := os.CreateTemp("", "dws-shortcut-stdout-*.txt") + if err != nil { + return "", "", err, nil + } + defer os.Remove(stdoutFile.Name()) + stderrFile, err := os.CreateTemp("", "dws-shortcut-stderr-*.txt") + if err != nil { + stdoutFile.Close() + return "", "", err, nil + } + defer os.Remove(stderrFile.Name()) + + oldStdout := os.Stdout + oldStderr := os.Stderr + os.Stdout = stdoutFile + os.Stderr = stderrFile + defer func() { + os.Stdout = oldStdout + os.Stderr = oldStderr + }() + + helpers.InitDeps(fake) + setCommandOutput(root, stdoutFile, stderrFile) + root.SetArgs(args) + err = func() (e error) { + defer func() { + if r := recover(); r != nil { + panicValue = r + } + }() + return root.Execute() + }() + + stdoutFile.Sync() + stderrFile.Sync() + outBytes, _ := os.ReadFile(stdoutFile.Name()) + errBytes, _ := os.ReadFile(stderrFile.Name()) + stdoutFile.Close() + stderrFile.Close() + return string(outBytes), string(errBytes), err, panicValue +} + +func shellQuote(arg string) string { + if arg == "" { + return "''" + } + if strings.ContainsAny(arg, " \t\n'\"\\$`") { + return "'" + strings.ReplaceAll(arg, "'", "'\\''") + "'" + } + return arg +} + +func commandLine(args []string) string { + parts := make([]string, 0, len(args)+1) + parts = append(parts, "dws") + for _, arg := range args { + parts = append(parts, shellQuote(arg)) + } + return strings.Join(parts, " ") +} + +func main() { + fake := &fakeCaller{} + helpers.InitDeps(fake) + root := newRoot() + real := realToolSet() + + all := shortcut.All() + results := make([]commandResult, 0, len(all)) + out := matrix{Total: len(all)} + + for _, s := range all { + args := synthArgs(s) + fake.reset() + stdout, stderr, err, panicValue := runCaptured(fake, root, args) + + res := commandResult{ + Service: s.Service, + Command: s.Command, + Risk: riskString(s), + Method: "cobra+fake-mcp-zero-side-effect", + Input: commandLine(args), + Args: append([]string(nil), args...), + Stdout: strings.TrimSpace(stdout), + Stderr: strings.TrimSpace(stderr), + Calls: append([]mcpCall(nil), fake.calls...), + } + res.CallCount = len(res.Calls) + res.Tools = uniqueTools(res.Calls) + res.ToolVerified = true + for _, call := range res.Calls { + if call.Tool == "" || !real[call.Tool] { + res.ToolVerified = false + } + } + + switch { + case panicValue != nil: + res.Status = "failed" + res.Error = fmt.Sprintf("panic: %v", panicValue) + res.Note = "测试失败:执行时发生 panic。" + out.Failed++ + case len(fake.calls) > 0: + res.Status = "assembled" + if err != nil { + res.Error = err.Error() + res.Note = "已实际执行到 MCP 组装/调用路径;fake MCP 已拦截,无网络、无副作用;后续因合成响应不足产生错误,不影响装配验证。" + } else { + res.Note = "已实际执行到 MCP 组装/调用路径;fake MCP 已拦截,无网络、无副作用。" + } + out.Assembled++ + case err != nil: + res.Status = "validation-blocked" + res.Error = err.Error() + res.Note = "已实际执行到命令校验链路;synthetic 参数被该命令自身校验拦截,属于预期的零副作用验证结果。" + out.ValidationBlocked++ + default: + res.Status = "failed" + res.Note = "测试失败:命令无错误返回但未组装 MCP 调用。" + out.Failed++ + } + if !res.ToolVerified { + out.ToolVerificationBad++ + if res.Error != "" { + res.Error += "; " + } + res.Error += "tool literal not found in helper ground truth" + } + res.Error = strings.TrimSpace(res.Error) + results = append(results, res) + } + + sort.Slice(results, func(i, j int) bool { + if results[i].Service == results[j].Service { + return results[i].Command < results[j].Command + } + return results[i].Service < results[j].Service + }) + out.Results = results + + enc := json.NewEncoder(os.Stdout) + enc.SetIndent("", " ") + if err := enc.Encode(out); err != nil { + fmt.Fprintf(os.Stderr, "encode matrix: %v\n", err) + os.Exit(1) + } + if out.Failed > 0 || out.ToolVerificationBad > 0 { + os.Exit(1) + } +} diff --git a/scripts/record_real_shortcut_run.py b/scripts/record_real_shortcut_run.py new file mode 100644 index 00000000..f8a856e1 --- /dev/null +++ b/scripts/record_real_shortcut_run.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +"""Run one shortcut command and append its real CLI result to a JSON report.""" + +from __future__ import annotations + +import argparse +import datetime as dt +import json +import shlex +import subprocess +import time +from pathlib import Path + +from shortcut_real_result import classify_failure, summarize_failure_categories, classify_real_status, summarize_results + + +ROOT = Path(__file__).resolve().parents[1] +OUT_PATH = ROOT / "docs" / "shortcut-real-write-results.json" + + +def load_report() -> dict: + if not OUT_PATH.exists(): + return { + "generated_at": dt.datetime.now().isoformat(), + "summary": {"total": 0, "ok": 0, "error": 0, "timeout": 0, "held": 0}, + "results": [], + } + return json.loads(OUT_PATH.read_text(encoding="utf-8")) + + +def shell_join(cmd: list[str]) -> str: + return " ".join(shlex.quote(x) for x in cmd) + + +def main() -> int: + p = argparse.ArgumentParser() + p.add_argument("--service", required=True) + p.add_argument("--command", required=True) + p.add_argument("--risk", default="write") + p.add_argument("--method", default="real-backend-manual-write; no --mock; no --dry-run") + p.add_argument("--timeout", type=int, default=35) + p.add_argument("argv", nargs=argparse.REMAINDER) + ns = p.parse_args() + argv = ns.argv + if argv and argv[0] == "--": + argv = argv[1:] + if not argv: + raise SystemExit("missing command argv") + + started = time.time() + status = "real-error" + stdout = "" + stderr = "" + exit_code = None + try: + proc = subprocess.run(argv, text=True, capture_output=True, timeout=ns.timeout) + stdout = proc.stdout.strip() + stderr = proc.stderr.strip() + exit_code = proc.returncode + status = classify_real_status(exit_code, stdout) + except subprocess.TimeoutExpired as e: + status = "timeout" + if isinstance(e.stdout, str): + stdout = e.stdout.strip() + if isinstance(e.stderr, str): + stderr = e.stderr.strip() + duration_ms = int((time.time() - started) * 1000) + + report = load_report() + # Replace previous result for the same shortcut only when this manual run is + # more specific than a broad held/negative placeholder. + result = { + "service": ns.service, + "command": ns.command, + "risk": ns.risk, + "method": ns.method, + "status": status, + "input": shell_join(argv), + "args": argv[1:], + "stdout": stdout, + "stderr": stderr, + "exit_code": exit_code, + "duration_ms": duration_ms, + "recorded_at": dt.datetime.now().isoformat(), + } + category, fixability, note = classify_failure(result) + if category != "passed": + result["failure_category"] = category + result["fixability"] = fixability + result["diagnosis"] = note + old = report.get("results", []) + old = [r for r in old if not (r.get("service") == ns.service and r.get("command") == ns.command)] + old.append(result) + report["results"] = old + report["summary"] = summarize_results(old, include_held=True) + report["failure_categories"] = summarize_failure_categories(old) + report["generated_at"] = dt.datetime.now().isoformat() + OUT_PATH.write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8") + print(json.dumps(result, ensure_ascii=False, indent=2)) + return 0 if status == "real-ok" else 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/run_shortcut_real_read_matrix.py b/scripts/run_shortcut_real_read_matrix.py new file mode 100644 index 00000000..26479091 --- /dev/null +++ b/scripts/run_shortcut_real_read_matrix.py @@ -0,0 +1,479 @@ +#!/usr/bin/env python3 +"""Run every read shortcut against the real DWS backend. + +This launches the built CLI once per read shortcut. It does not use --mock and +does not use --dry-run. Inputs are synthetic but realistic where a shortcut +expects a name, date, or query; resource identifiers remain test placeholders +when no resource has been created for that command. +""" + +from __future__ import annotations + +import datetime as dt +import argparse +import json +import os +import shlex +import subprocess +import time +from pathlib import Path + +from shortcut_real_result import ( + classify_failure, + sanitize_result, + summarize_failure_categories, + classify_real_status, + summarize_results, +) + + +ROOT = Path(__file__).resolve().parents[1] +MATRIX_PATH = Path("/private/tmp/dws-shortcut-matrix.json") +OUT_PATH = ROOT / "docs" / "shortcut-real-read-results.json" +BIN = os.environ.get("DWS_REAL_TEST_BIN", "/private/tmp/dws-real-test") +DEVAPP_FIXTURE_ID = "678f27ec-4339-49d8-9c49-371b284bf552" +DEVAPP_FIXTURE_VERSION_ID = "4743accb-45e2-4bc9-8c96-74fc62ace2e8" +CHAT_FIXTURE_OPEN_CONVERSATION_ID = "cid3Jijzhe2aqs9ysOXjhi05g==" +CHAT_FIXTURE_GROUP_NAME = "浅曦-kida,Dennis,秋画" +CHAT_FIXTURE_DM_OPEN_CONVERSATION_ID = "cidie1367hAfBxqipzE59k5sknHLrHmvYkw98NADhfnjPI=" +CHAT_FIXTURE_OPEN_MESSAGE_ID = "msgEuOor1PmFBNlx9M06N9z1Q==" +CHAT_FIXTURE_OPEN_TASK_ID = "y/wM6Lo+9GbIqtILYPv1BZDcMW+2FgnqskgcpdOiMdM=" +CALENDAR_FIXTURE_EVENT_ID = "THN4YUtOTlplYU9sZzd2czE4YURLQT09_1784078100000" +DOC_FIXTURE_NODE_ID = "P0MALyR8knpgo9GycY7ZlMxlJ3bzYmDO" +DOC_FIXTURE_FOLDER_ID = "Amq4vjg89ZOAdqyaSMKpApXdW3kdP0wQ" +DOC_FIXTURE_EXPORT_JOB_ID = "29346731713" +SHEET_FIXTURE_NODE_ID = "mweZ92PV6O36dZbnsMZx70ylJxEKBD6p" +DING_FIXTURE_OPEN_DING_ID = "5D73E3AC29C780072D1CD56C6874ACC2" +CONTACT_FIXTURE_MOBILE = "13161187007" +AITABLE_FIXTURE_BASE_ID = "gpG2NdyVXQyZ0OmoSbd1vbA6JMwvDqPk" +AITABLE_FIXTURE_TABLE_ID = "hERWDMS" +AITABLE_FIXTURE_VIEW_ID = "qvGDAH2" +AITABLE_FIXTURE_FORM_VIEW_ID = "lmeV1cb" +AITABLE_FIXTURE_FIELD_ID = "01ZM8y7" +AITABLE_FIXTURE_RECORD_ID = "1015oH3OXy" +AITABLE_FIXTURE_DASHBOARD_ID = "KY9tlWg5NEHgfs8WT6IO2" +AITABLE_FIXTURE_CHART_ID = "widget-dlxFo0tNSImp4ITpDn5fQ" + +HELD_CASES = { + ("devapp", "+credentials-get"): + "该命令会读取真实应用凭证/密钥;不能用真实 app 自动执行。当前仅用占位 ID 验证负向路径,真实成功需人工在安全环境单独确认。", +} + + +def ensure_matrix() -> dict: + env = os.environ.copy() + env.setdefault("GOCACHE", "/private/tmp/dws_gocache") + raw = subprocess.check_output( + ["go", "run", "./scripts/gen_shortcut_test_matrix.go"], + cwd=ROOT, + env=env, + text=True, + ) + MATRIX_PATH.write_text(raw, encoding="utf-8") + return json.loads(raw) + + +def replace_flag_values(args: list[str], service: str, command: str) -> list[str]: + today = dt.date.today() + start = (dt.datetime.now() + dt.timedelta(days=1)).replace(hour=10, minute=0, second=0, microsecond=0).isoformat() + "+08:00" + end = (dt.datetime.now() + dt.timedelta(days=1)).replace(hour=11, minute=0, second=0, microsecond=0).isoformat() + "+08:00" + no_id = "DWSREALREADNOSUCHID0000000000000" + no_conv = "cidDWSREALREADNOSUCHCONV" + day = str(today) + yesterday = str(today - dt.timedelta(days=1)) + datetime_start = dt.datetime.now().replace(hour=10, minute=0, second=0, microsecond=0).strftime("%Y-%m-%d %H:%M:%S") + datetime_end = (dt.datetime.now() + dt.timedelta(hours=1)).replace(minute=0, second=0, microsecond=0).strftime("%Y-%m-%d %H:%M:%S") + replacements = { + "name": "DWS shortcut 真实测试", + "query": "测试", + "keyword": "测试", + "q": "测试", + "text": "测试", + "title": "测试", + "phone": "13000000000", + "mobile": "13000000000", + "user": "冬翔", + "users": "冬翔", + "to": "冬翔", + "with": "冬翔", + "who": "冬翔", + "dept": "模型算法", + "dept-id": "842379556", + "department-id": "842379556", + "start": start, + "end": end, + "from": str(today - dt.timedelta(days=7)), + "to-date": str(today), + "date": str(today), + "time": datetime_start, + "days": "7", + "types": "leave", + "columns": "1001", + "limit": "10", + "page": "1", + "page-size": "10", + "cursor": "0", + "calendar-id": "primary", + "event": no_id, + "type": "ALL", + "types": "leave", + "columns": "1001", + "role-types": "executor", + "status": "false", + "artifacts": "basic", + "direction": "older", + "file-types": "alidoc", + "order-by": "name", + "order": "asc", + "space-id": "1", + "space": "测试", + "base": no_id, + "base-id": no_id, + "table": no_id, + "table-id": no_id, + "view-id": no_id, + "record-id": no_id, + "record-ids": no_id, + "field-id": no_id, + "dashboard-id": no_id, + "chart-id": no_id, + "workflow-id": no_id, + "node": no_id, + "doc": no_id, + "folder": no_id, + "workspace": no_id, + "group": no_conv, + "conversation-id": no_conv, + "open-conversation-id": no_conv, + "message-id": no_id, + "msg-id": no_id, + "id": no_id, + "session-id": no_id, + "process-instance-id": no_id, + "task-id": no_id, + "template-id": no_id, + "mail-id": no_id, + "filters": "{}", + "sort": "[]", + } + if service == "calendar" and command == "+free-slots": + replacements["from"] = "9" + replacements["to"] = "18" + if service == "calendar": + replacements["event"] = CALENDAR_FIXTURE_EVENT_ID + replacements["cursor"] = "" + if command == "+freebusy": + replacements["users"] = "103262" + if service == "doc" and command == "+comment-list": + replacements["type"] = "global" + if service == "doc": + replacements["node"] = DOC_FIXTURE_NODE_ID + replacements["doc"] = DOC_FIXTURE_NODE_ID + replacements["folder"] = DOC_FIXTURE_FOLDER_ID + replacements["job-id"] = DOC_FIXTURE_EXPORT_JOB_ID + if service == "drive": + replacements["node"] = DOC_FIXTURE_NODE_ID + replacements["folder"] = DOC_FIXTURE_FOLDER_ID + if service == "todo": + replacements["task-id"] = "55119034912" + replacements["size"] = "10" + if service == "aitable": + replacements["name"] = "Real共创版设备去向登记" + replacements["base"] = AITABLE_FIXTURE_BASE_ID + replacements["base-id"] = AITABLE_FIXTURE_BASE_ID + replacements["table"] = AITABLE_FIXTURE_TABLE_ID + replacements["table-id"] = AITABLE_FIXTURE_TABLE_ID + replacements["view-id"] = AITABLE_FIXTURE_VIEW_ID + replacements["view-ids"] = AITABLE_FIXTURE_VIEW_ID + replacements["field-id"] = AITABLE_FIXTURE_FIELD_ID + replacements["field-ids"] = AITABLE_FIXTURE_FIELD_ID + replacements["record-id"] = AITABLE_FIXTURE_RECORD_ID + replacements["record-ids"] = AITABLE_FIXTURE_RECORD_ID + replacements["dashboard-id"] = AITABLE_FIXTURE_DASHBOARD_ID + replacements["chart-id"] = AITABLE_FIXTURE_CHART_ID + if command.startswith("+form-"): + replacements["view-id"] = AITABLE_FIXTURE_FORM_VIEW_ID + if command == "+resolve-table": + replacements["name"] = "Mac Mini" + if service == "ding" and command == "+list": + replacements["type"] = "ALL" + if service == "ding" and command == "+receiver-status": + replacements["ding-id"] = DING_FIXTURE_OPEN_DING_ID + if service == "contact" and command == "+list-sub-depts": + replacements["dept"] = "842379556" + if service == "contact": + replacements["name"] = "冬翔" + if command == "+by-mobile": + replacements["mobile"] = CONTACT_FIXTURE_MOBILE + if command == "+resolve-dept": + replacements["name"] = "模型算法" + if service == "oa": + now_ms = int(dt.datetime.now().timestamp() * 1000) + replacements["start"] = str(now_ms - 7 * 24 * 60 * 60 * 1000) + replacements["end"] = str(now_ms) + replacements["page"] = "1" + replacements["limit"] = "10" + if service == "report": + replacements["start"] = (dt.datetime.now() - dt.timedelta(days=7)).replace(microsecond=0).isoformat() + "+08:00" + replacements["end"] = dt.datetime.now().replace(microsecond=0).isoformat() + "+08:00" + replacements["modified-start"] = replacements["start"] + replacements["modified-end"] = replacements["end"] + if service == "attendance": + replacements.update({ + "user": "202397", + "users": "202397", + "staff-ids": "202397", + "operator-staff-id": "202397", + "leave-code": "731ed089-62ff-4734-a6c7-3c8fcc8294fc", + "leave-names": "年假", + "start": yesterday, + "end": day, + "from": yesterday, + "to-date": day, + "date": day, + }) + if command in {"+get-checkin-record", "+query-report-data", "+query-report-leave"}: + replacements["start"] = datetime_start + replacements["end"] = datetime_end + if command == "+get-approve-template": + replacements["type"] = "leave" + if command == "+search-group": + replacements["type"] = "FIXED" + if service == "devapp": + replacements["unified-app-id"] = DEVAPP_FIXTURE_ID + replacements["version-id"] = DEVAPP_FIXTURE_VERSION_ID + replacements["cursor"] = "" + if service == "mail": + replacements["email"] = "xinyang.dxy@alibaba-inc.com" + replacements["folder"] = "2" + replacements["query"] = "subject:测试" + replacements["keyword"] = "董鑫阳" + replacements["employee-no"] = "202397" + replacements["size"] = "10" + replacements["cursor"] = "" + if command == "+find-mail-user": + replacements["query"] = "董鑫阳" + if service == "chat": + replacements["group"] = CHAT_FIXTURE_OPEN_CONVERSATION_ID + replacements["conversation-id"] = CHAT_FIXTURE_OPEN_CONVERSATION_ID + replacements["open-conversation-id"] = CHAT_FIXTURE_OPEN_CONVERSATION_ID + replacements["msg-ids"] = CHAT_FIXTURE_OPEN_MESSAGE_ID + replacements["message-id"] = CHAT_FIXTURE_OPEN_MESSAGE_ID + replacements["msg-id"] = CHAT_FIXTURE_OPEN_MESSAGE_ID + replacements["open-task-id"] = CHAT_FIXTURE_OPEN_TASK_ID + if command == "+group-members": + replacements["group"] = CHAT_FIXTURE_GROUP_NAME + if command == "+messages-read-status": + replacements["conversation-id"] = CHAT_FIXTURE_DM_OPEN_CONVERSATION_ID + replacements["users"] = "冬翔" + if command == "+messages-resource-url": + replacements["type"] = "mediaId" + if command == "+bot-find": + replacements["cursor"] = "" + if service == "sheet" and command == "+list-sheets": + replacements["node"] = SHEET_FIXTURE_NODE_ID + out = list(args) + if "--format" not in out: + out.extend(["--format", "json"]) + i = 0 + while i < len(out) - 1: + if out[i].startswith("--"): + key = out[i][2:] + if key in replacements and not out[i + 1].startswith("--"): + out[i + 1] = replacements[key] + i += 2 + continue + i += 1 + return out + + +def shell_join(cmd: list[str]) -> str: + return " ".join(shlex.quote(x) for x in cmd) + + +def drop_flag(args: list[str], flag: str) -> list[str]: + out: list[str] = [] + i = 0 + while i < len(args): + if args[i] == flag: + i += 2 if i + 1 < len(args) and not args[i + 1].startswith("--") else 1 + continue + out.append(args[i]) + i += 1 + return out + + +def adjust_command_args(args: list[str], service: str, command: str) -> list[str]: + if service == "chat" and command == "+chat-messages": + return drop_flag(args, "--user") + if service == "chat" and command == "+messages-list-direct": + out = drop_flag(args, "--open-dingtalk-id") + for i in range(len(out) - 1): + if out[i] == "--user": + out[i + 1] = "103262" + return out + if service == "calendar" and command == "+freebusy": + return drop_flag(args, "--rooms") + if service == "devapp" and command == "+permission-list": + out = drop_flag(args, "--scope-value") + out = drop_flag(out, "--scope-type") + out = drop_flag(out, "--api-status") + for i in range(len(out) - 1): + if out[i] == "--auth-status": + out[i + 1] = "ALL" + return out + if service == "doc" and command == "+search": + out = drop_flag(args, "--extensions") + out = drop_flag(out, "--created-from") + out = drop_flag(out, "--created-to") + out = drop_flag(out, "--visited-from") + out = drop_flag(out, "--visited-to") + out = drop_flag(out, "--creator-uids") + out = drop_flag(out, "--editor-uids") + out = drop_flag(out, "--mentioned-uids") + out = drop_flag(out, "--workspace-ids") + return out + if service == "doc" and command == "+comment-list": + out = drop_flag(args, "--cursor") + out = drop_flag(out, "--resolve-status") + return out + if service == "doc" and command == "+list": + out = drop_flag(args, "--workspace") + out = drop_flag(out, "--cursor") + return out + if service == "report" and command == "+outbox-list": + return drop_flag(args, "--template-name") + return args + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--service", action="append", help="Only run shortcuts from this service; may repeat") + parser.add_argument("--command", action="append", help="Only run this shortcut command; may repeat") + parser.add_argument("--failed-only", action="store_true", help="Only rerun shortcuts currently marked non-success in the output report") + ns = parser.parse_args() + services = set(ns.service or []) + commands = set(ns.command or []) + + matrix = ensure_matrix() + rows = [r for r in matrix["results"] if r.get("risk") == "read"] + if services: + rows = [r for r in rows if r["service"] in services] + if commands: + rows = [r for r in rows if r["command"] in commands] + if ns.failed_only and OUT_PATH.exists(): + existing = json.loads(OUT_PATH.read_text(encoding="utf-8")) + failed = { + (r.get("service"), r.get("command")) + for r in existing.get("results", []) + if r.get("status") != "real-ok" + } + rows = [r for r in rows if (r["service"], r["command"]) in failed] + results = [] + summary = {"total": len(rows), "ok": 0, "error": 0, "timeout": 0, "held": 0} + for idx, r in enumerate(rows, 1): + key = (r["service"], r["command"]) + if key in HELD_CASES: + summary["held"] += 1 + item = { + "service": r["service"], + "command": r["command"], + "risk": r["risk"], + "method": "held; sensitive credential read", + "status": "held", + "input": "", + "args": [], + "stdout": "", + "stderr": HELD_CASES[key], + "exit_code": None, + "duration_ms": 0, + } + item = sanitize_result(item) + category, fixability, note = classify_failure(item) + item["failure_category"] = category + item["fixability"] = fixability + item["diagnosis"] = note + results.append(item) + continue + args = adjust_command_args(replace_flag_values(r["args"], r["service"], r["command"]), r["service"], r["command"]) + cmd = [BIN] + args + started = time.time() + status = "real-error" + stdout = "" + stderr = "" + exit_code = None + try: + p = subprocess.run(cmd, text=True, capture_output=True, timeout=30) + stdout = p.stdout.strip() + stderr = p.stderr.strip() + exit_code = p.returncode + status = classify_real_status(exit_code, stdout) + if status == "real-ok": + status = "real-ok" + summary["ok"] += 1 + else: + summary["error"] += 1 + except subprocess.TimeoutExpired as e: + status = "timeout" + summary["timeout"] += 1 + if isinstance(e.stdout, str): + stdout = e.stdout.strip() + if isinstance(e.stderr, str): + stderr = e.stderr.strip() + duration_ms = int((time.time() - started) * 1000) + item = { + "service": r["service"], + "command": r["command"], + "risk": r["risk"], + "method": "real-backend-read; no --mock; no --dry-run", + "status": status, + "input": shell_join(cmd), + "args": args, + "stdout": stdout, + "stderr": stderr, + "exit_code": exit_code, + "duration_ms": duration_ms, + } + item = sanitize_result(item) + category, fixability, note = classify_failure(item) + if category != "passed": + item["failure_category"] = category + item["fixability"] = fixability + item["diagnosis"] = note + results.append(item) + if idx % 25 == 0 or idx == len(rows): + print( + f"progress {idx}/{len(rows)} ok={summary['ok']} " + f"error={summary['error']} timeout={summary['timeout']} held={summary['held']}", + flush=True, + ) + if not services and not commands and not ns.failed_only: + OUT_PATH.write_text(json.dumps({ + "generated_at": dt.datetime.now().isoformat(), + "summary": summary, + "failure_categories": summarize_failure_categories(results), + "results": results, + }, ensure_ascii=False, indent=2), encoding="utf-8") + if OUT_PATH.exists() and (services or commands or ns.failed_only): + existing = json.loads(OUT_PATH.read_text(encoding="utf-8")) + replace_keys = {(r["service"], r["command"]) for r in results} + merged = [ + r for r in existing.get("results", []) + if (r.get("service"), r.get("command")) not in replace_keys + ] + merged.extend(results) + else: + merged = results + summary = summarize_results(merged, include_held=True) + OUT_PATH.write_text(json.dumps({ + "generated_at": dt.datetime.now().isoformat(), + "summary": summary, + "failure_categories": summarize_failure_categories(merged), + "results": merged, + }, ensure_ascii=False, indent=2), encoding="utf-8") + print(f"saved {OUT_PATH} batch={summarize_results(results, include_held=True)} merged={summary}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/run_shortcut_real_write_matrix.py b/scripts/run_shortcut_real_write_matrix.py new file mode 100644 index 00000000..da0cc37d --- /dev/null +++ b/scripts/run_shortcut_real_write_matrix.py @@ -0,0 +1,455 @@ +#!/usr/bin/env python3 +"""Run write/high-risk shortcuts against the real CLI with safe negative inputs. + +This is intentionally not a mock and not a dry-run. It launches the built CLI +for every write/high-risk shortcut and records the real stdout/stderr/exit code. + +To avoid broad irreversible side effects, target identifiers and people are +rewritten to obviously-nonexistent test values. Commands that have no +resource/user target and would necessarily mutate the current account state are +held and recorded rather than executed. +""" + +from __future__ import annotations + +import datetime as dt +import argparse +import json +import os +import shlex +import subprocess +import time +from pathlib import Path + +from shortcut_real_result import ( + classify_failure, + sanitize_result, + summarize_failure_categories, + classify_real_status, + summarize_results, +) + + +ROOT = Path(__file__).resolve().parents[1] +MATRIX_PATH = Path("/private/tmp/dws-shortcut-matrix.json") +OUT_PATH = ROOT / "docs" / "shortcut-real-write-results.json" +BIN = os.environ.get("DWS_REAL_TEST_BIN", "/private/tmp/dws-real-test") + +NO_SAFE_NEGATIVE_TARGET = { + ("chat", "+conversation-clear-all-red-point"): + "该命令没有目标 ID,会直接修改当前账号所有会话红点状态;需要逐项授权后单独跑。", + ("chat", "+category-create"): + "该命令只需要标题,真实执行会在当前账号创建会话分类;需要逐项授权后单独跑。", +} + + +def ensure_matrix() -> dict: + if not MATRIX_PATH.exists(): + env = os.environ.copy() + env.setdefault("GOCACHE", "/private/tmp/dws_gocache") + raw = subprocess.check_output( + ["go", "run", "./scripts/gen_shortcut_test_matrix.go"], + cwd=ROOT, + env=env, + text=True, + ) + MATRIX_PATH.write_text(raw, encoding="utf-8") + return json.loads(MATRIX_PATH.read_text(encoding="utf-8")) + + +def replace_flag_values(args: list[str], now: str, service: str = "", command: str = "") -> list[str]: + future_start = ( + dt.datetime.now() + dt.timedelta(days=7) + ).replace(hour=10, minute=0, second=0, microsecond=0).isoformat() + "+08:00" + future_end = ( + dt.datetime.now() + dt.timedelta(days=7) + ).replace(hour=10, minute=15, second=0, microsecond=0).isoformat() + "+08:00" + + no_user = "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_USER__" + no_id = "DWSREALTESTNOSUCHID0000000000000" + no_conv = "cidDWSREALTESTNOSUCHCONV" + huge_num = "999999999999" + text = f"DWS shortcut 真实测试 {now},安全负向输入,请忽略。" + + replacements = { + # People / users. + "to": no_user, + "with": no_user, + "owner": no_user, + "target": no_user, + "user": no_user, + "users": no_user, + "user-ids": no_user, + "new-owner": no_user, + "applicant": no_user, + "inviter": no_user, + "approver-user-id": no_user, + "add-users": no_user, + "remove-users": "", + "add-extra-users": "", + "remove-extra-users": "", + "at-user-ids": no_user, + "at-users": no_user, + "at-open-dingtalk-ids": "", + "open-dingtalk-ids": "", + # Conversation / message / Ding targets. + "group": no_conv, + "id": no_id, + "conversation-id": no_conv, + "open-conversation-id": no_conv, + "src-conversation-id": no_conv, + "dest-conversation-id": no_conv, + "message-id": no_id, + "msg-id": no_id, + "msg-ids": no_id, + "src-msg-id": no_id, + "src-thread-id": no_id, + "keys": no_id, + "biz-id": no_id, + "category-ids": huge_num, + "receiver": no_user, + "robot-code": "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_ROBOT__", + "bot-id": no_id, + "token": "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_WEBHOOK_TOKEN__", + # DingTalk document / app / aitable / wiki ids. + "base-id": no_id, + "base": no_id, + "table-id": no_id, + "table": no_id, + "field-id": no_id, + "record-id": huge_num, + "record-ids": no_id, + "view-id": no_id, + "dashboard-id": no_id, + "chart-id": no_id, + "workflow-id": no_id, + "role-id": no_id, + "role-ids": no_id, + "section-id": no_id, + "parent-section-id": no_id, + "new-parent-section-id": no_id, + "node-id": no_id, + "node": no_id, + "doc": no_id, + "folder": no_id, + "workspace": no_id, + "template-id": no_id, + "comment-key": no_id, + "block-id": no_id, + "unified-app-id": no_id, + "icon-media-id": no_id, + "media-id": no_id, + "session-id": no_id, + "import-id": no_id, + "space": "__DWS_SHORTCUT_REAL_TEST_NO_SUCH_SPACE__", + # Numeric identifiers. + "category-id": huge_num, + "record-id-num": huge_num, + "record-id-int": huge_num, + "class-id": huge_num, + "group-id": huge_num, + "plan-id": huge_num, + "result-id": huge_num, + # Text-like values. + "title": f"DWS shortcut 真实测试 {now}", + "name": f"DWS shortcut 真实测试 {now}", + "new-name": f"DWS shortcut 真实测试 {now}", + "alias-title": f"DWS shortcut 真实测试 {now}", + "nick": f"DWS测试{now}", + "desc": "DWS shortcut 真实测试描述,可删除", + "description": "DWS shortcut 真实测试描述,可删除", + "field-description": "DWS shortcut 真实测试字段说明", + "text": text, + "content": text, + "comment": text, + "note": text, + "remark": text, + "selected-text": "DWS测试", + "task": f"DWS shortcut 真实测试待办 {now}", + "keyword": f"__DWS_SHORTCUT_REAL_TEST_NO_SUCH_APPROVAL_{now}__", + "reason": "DWS shortcut 真实测试安全负向清理", + "uuid": f"dws-shortcut-real-negative-{now}", + # Times. + "due": future_end, + "at": future_start, + "start": future_start, + "end": future_end, + "time": future_start, + # Structured values. + "config": "{}", + "layout": "{}", + "json": "{}", + "records": "[]", + "ai-config": "{}", + "field-mapping": "{}", + "class-vo": '{"sections":[{"times":[{"checkType":"OnDuty","checkTime":"09:00","across":0},{"checkType":"OffDuty","checkTime":"18:00","across":0}]}]}', + "group-vo": '{"defaultClassId":999999999999,"workDayClassList":[999999999999,999999999999,999999999999,999999999999,999999999999,0,0]}', + "visibility-rules": '[{"type":"dept","visible":["-1"]}]', + "sub-roles": "[]", + "skills": "[]", + "scope-values": "[]", + "event-codes": "[]", + "schedules": '[{"userId":"202397","workDate":"2026-07-16 09:00:00","classId":999999999999,"isRest":"N"}]', + "class-ids": "[999999999999]", + "add-depts": "", + "remove-depts": "", + # URLs / app config. + "homepage-url": "https://example.invalid/dws-shortcut-real-test", + "pc-homepage-url": "https://example.invalid/dws-shortcut-real-test", + "omp-url": "https://example.invalid/dws-shortcut-real-test", + "outgoing-url": "https://example.invalid/dws-shortcut-real-test", + "event-callback-url": "https://example.invalid/dws-shortcut-real-test", + "redirect-urls": "https://example.invalid/dws-shortcut-real-test", + "sso-urls": "https://example.invalid/dws-shortcut-real-test", + "ip-whitelist": "127.0.0.1", + "url": "https://example.invalid/dws-shortcut-real-test", + # Misc. + "type": "FIXED", + "record-name-key": "task", + "file-name": f"dws-shortcut-real-{now}.txt", + "mime-type": "text/plain", + "version": "0.0.1-dws-real-test", + "version-id": no_id, + "member-type": "USER", + "emotion-id": no_id, + "emotion-name": "DWS测试表情", + "background-id": no_id, + "emoji": "👍", + "pair": "测试=>测试", + "leave-code": no_id, + "num": "1", + } + if service == "chat" and command == "+messages-send-card": + replacements["receiver"] = "103262" + if service == "chat" and command == "+chat-audit-join": + replacements["applicant"] = "103262" + replacements["inviter"] = "519019" + if service == "doc" and command == "+comment-create-inline": + replacements["start"] = "0" + replacements["end"] = "1" + if service == "attendance" and command == "+save-leave-balance": + replacements["start"] = (dt.date.today() + dt.timedelta(days=1)).isoformat() + replacements["end"] = (dt.date.today() + dt.timedelta(days=30)).isoformat() + if service == "aitable" and command == "+record-update": + replacements["records"] = '[{"recordId":"recDWSREALTEST","cells":{}}]' + if service == "aitable" and command == "+view-update": + replacements["desc"] = "{}" + + out = list(args) + if "--format" not in out: + out.extend(["--format", "json"]) + i = 0 + while i < len(out) - 1: + if out[i].startswith("--"): + key = out[i][2:] + if key in replacements and not out[i + 1].startswith("--"): + out[i + 1] = replacements[key] + i += 2 + continue + i += 1 + return out + + +def shell_join(cmd: list[str]) -> str: + return " ".join(shlex.quote(x) for x in cmd) + + +def drop_flag(args: list[str], flag: str) -> list[str]: + out: list[str] = [] + i = 0 + while i < len(args): + if args[i] == flag: + i += 2 if i + 1 < len(args) and not args[i + 1].startswith("--") else 1 + continue + out.append(args[i]) + i += 1 + return out + + +def adjust_command_args(args: list[str], service: str, command: str) -> list[str]: + if service == "chat" and command == "+messages-send-card": + # --group and --receiver are mutually exclusive; exercise the direct-message path. + return drop_flag(args, "--group") + return args + + +def setup_prerequisite(service: str, command: str, now: str) -> dict | None: + if service == "todo" and command == "+todo-done": + title = f"DWS shortcut 真实测试待办 {now}" + due = ( + dt.datetime.now() + dt.timedelta(days=7) + ).replace(hour=10, minute=15, second=0, microsecond=0).isoformat() + "+08:00" + cmd = [ + BIN, + "todo", + "+remind", + "--task", + title, + "--at", + due, + "--yes", + "--format", + "json", + ] + started = time.time() + p = subprocess.run(cmd, text=True, capture_output=True, timeout=25) + return { + "purpose": "为 todo +todo-done 创建当前账号自己的临时待办 fixture", + "input": shell_join(cmd), + "stdout": p.stdout.strip(), + "stderr": p.stderr.strip(), + "exit_code": p.returncode, + "duration_ms": int((time.time() - started) * 1000), + } + return None + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--service", action="append", help="Only run shortcuts from this service; may repeat") + parser.add_argument("--command", action="append", help="Only run this shortcut command; may repeat") + parser.add_argument("--missing-only", action="store_true", help="Skip shortcuts already present in the output report") + parser.add_argument("--failed-only", action="store_true", help="Only rerun shortcuts currently marked non-success in the output report") + ns = parser.parse_args() + services = set(ns.service or []) + commands = set(ns.command or []) + + matrix = ensure_matrix() + rows = [r for r in matrix["results"] if r.get("risk") != "read"] + if services: + rows = [r for r in rows if r["service"] in services] + if commands: + rows = [r for r in rows if r["command"] in commands] + if ns.failed_only and OUT_PATH.exists(): + existing = json.loads(OUT_PATH.read_text(encoding="utf-8")) + failed = { + (r.get("service"), r.get("command")) + for r in existing.get("results", []) + if r.get("status") != "real-ok" + } + rows = [r for r in rows if (r["service"], r["command"]) in failed] + if ns.missing_only and OUT_PATH.exists(): + existing = json.loads(OUT_PATH.read_text(encoding="utf-8")) + done = {(r.get("service"), r.get("command")) for r in existing.get("results", [])} + rows = [r for r in rows if (r["service"], r["command"]) not in done] + now = dt.datetime.now().strftime("%Y%m%d-%H%M%S") + results = [] + batch_summary = {"total": len(rows), "ok": 0, "error": 0, "timeout": 0, "held": 0} + + for idx, r in enumerate(rows, 1): + key = (r["service"], r["command"]) + if key in NO_SAFE_NEGATIVE_TARGET: + batch_summary["held"] += 1 + item = { + "service": r["service"], + "command": r["command"], + "risk": r["risk"], + "method": "held; no safe negative target", + "status": "held", + "input": "", + "args": [], + "stdout": "", + "stderr": NO_SAFE_NEGATIVE_TARGET[key], + "exit_code": None, + "duration_ms": 0, + } + item = sanitize_result(item) + category, fixability, note = classify_failure(item) + item["failure_category"] = category + item["fixability"] = fixability + item["diagnosis"] = note + results.append(item) + continue + + setup = None + try: + setup = setup_prerequisite(r["service"], r["command"], now) + except subprocess.TimeoutExpired as e: + setup = { + "purpose": "创建前置真实资源超时", + "input": "", + "stdout": e.stdout.strip() if isinstance(e.stdout, str) else "", + "stderr": e.stderr.strip() if isinstance(e.stderr, str) else "", + "exit_code": None, + "duration_ms": 25000, + } + + args = adjust_command_args(replace_flag_values(r["args"], now, r["service"], r["command"]), r["service"], r["command"]) + cmd = [BIN] + args + started = time.time() + status = "real-error" + stdout = "" + stderr = "" + exit_code = None + try: + p = subprocess.run(cmd, text=True, capture_output=True, timeout=25) + stdout = p.stdout.strip() + stderr = p.stderr.strip() + exit_code = p.returncode + status = classify_real_status(exit_code, stdout) + if status == "real-ok": + status = "real-ok" + batch_summary["ok"] += 1 + else: + batch_summary["error"] += 1 + except subprocess.TimeoutExpired as e: + status = "timeout" + batch_summary["timeout"] += 1 + if isinstance(e.stdout, str): + stdout = e.stdout.strip() + if isinstance(e.stderr, str): + stderr = e.stderr.strip() + duration_ms = int((time.time() - started) * 1000) + item = { + "service": r["service"], + "command": r["command"], + "risk": r["risk"], + "method": "real-backend-safe-negative-write; no --mock; no --dry-run", + "status": status, + "input": shell_join(cmd), + "args": args, + "stdout": stdout, + "stderr": stderr, + "exit_code": exit_code, + "duration_ms": duration_ms, + } + if setup is not None: + item["setup"] = setup + item = sanitize_result(item) + category, fixability, note = classify_failure(item) + if category != "passed": + item["failure_category"] = category + item["fixability"] = fixability + item["diagnosis"] = note + results.append(item) + if idx % 10 == 0 or idx == len(rows): + print( + f"progress {idx}/{len(rows)} ok={batch_summary['ok']} " + f"error={batch_summary['error']} timeout={batch_summary['timeout']} held={batch_summary['held']}", + flush=True, + ) + if OUT_PATH.exists(): + existing = json.loads(OUT_PATH.read_text(encoding="utf-8")) + else: + existing = {"results": []} + replace_keys = {(r["service"], r["command"]) for r in results} + merged = [ + r for r in existing.get("results", []) + if (r.get("service"), r.get("command")) not in replace_keys + ] + merged.extend(results) + summary = summarize_results(merged, include_held=True) + failure_categories = summarize_failure_categories(merged) + + OUT_PATH.write_text(json.dumps({ + "generated_at": dt.datetime.now().isoformat(), + "summary": summary, + "failure_categories": failure_categories, + "results": merged, + }, ensure_ascii=False, indent=2), encoding="utf-8") + print(f"saved {OUT_PATH} batch={batch_summary} merged={summary}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/shortcut_real_result.py b/scripts/shortcut_real_result.py new file mode 100644 index 00000000..c4ff9288 --- /dev/null +++ b/scripts/shortcut_real_result.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python3 +"""Helpers for classifying real shortcut CLI executions. + +Some DWS helper paths can exit 0 while returning a JSON error envelope on +stdout. Real-test reports should reflect the backend payload, not just the +process exit code. +""" + +from __future__ import annotations + +import json +import re +from typing import Any + + +def _json_values(text: str) -> list[Any]: + """Parse one or more adjacent JSON values from stdout.""" + values: list[Any] = [] + text = (text or "").strip() + if not text: + return values + + decoder = json.JSONDecoder() + idx = 0 + length = len(text) + while idx < length: + while idx < length and text[idx].isspace(): + idx += 1 + if idx >= length: + break + try: + value, next_idx = decoder.raw_decode(text, idx) + except json.JSONDecodeError: + return values + values.append(value) + idx = next_idx + return values + + +def _truthy_error(value: Any) -> bool: + if value is None or value is False: + return False + if isinstance(value, str): + return value.strip() != "" + if isinstance(value, (list, dict)): + return len(value) > 0 + return True + + +def _truthy_error_code(value: Any) -> bool: + if value is None or value is False: + return False + if isinstance(value, str): + code = value.strip() + if not code: + return False + return code.lower() not in {"0", "ok", "success", "succeed"} + if isinstance(value, (int, float)): + return value != 0 + return True + + +def payload_indicates_error(stdout: str) -> bool: + for value in _json_values(stdout): + if not isinstance(value, dict): + continue + status = value.get("status") + if isinstance(status, str) and status.lower() == "error": + return True + if value.get("success") is False: + return True + if _truthy_error(value.get("error")): + return True + if _truthy_error_code(value.get("errorCode")): + return True + if _truthy_error_code(value.get("error_code")): + return True + if _truthy_error_code(value.get("code")): + return True + return False + + +def classify_real_status(exit_code: int | None, stdout: str, current_status: str | None = None) -> str: + if current_status in {"timeout", "held"}: + return current_status + if exit_code != 0: + return "real-error" + if payload_indicates_error(stdout): + return "real-error" + return "real-ok" + + +def _haystack(result: dict[str, Any]) -> str: + return f"{result.get('stdout') or ''}\n{result.get('stderr') or ''}".lower() + + +def classify_failure(result: dict[str, Any]) -> tuple[str, str, str]: + """Return (category, fixability, note) for a real-test result.""" + status = result.get("status") + if status == "real-ok": + return ("passed", "fixed", "真实后端执行成功。") + if status == "timeout": + return ("timeout", "needs-rerun", "命令超过测试超时时间;需单独复测或扩大超时。") + if status == "held": + return ("held", "manual-approval", "高风险或无安全目标,需人工逐项授权后执行。") + + text = _haystack(result) + service = result.get("service") + command = result.get("command") + method = result.get("method") or "" + + if "payload-classified-error" in method or (result.get("exit_code") == 0 and payload_indicates_error(result.get("stdout") or "")): + return ( + "cli-error-envelope", + "cli-wrapper-fix-needed", + "进程退出码为 0,但 stdout JSON 含 error/status:error/errorCode;需要底层 helper 或 MCP 调用层把业务错误转成非零退出。", + ) + if ( + "not_authenticated" in text + or "auth_permission" in text + or "permission" in text + or "forbidden" in text + or "auth_error" in text + or "权限" in text + or "没有开发者身份" in text + or "无权限" in text + or "当前登录用户无权限" in text + ): + return ( + "auth-or-permission", + "not-cli-fixable", + "真实账号、应用 scope 或资源权限不足;CLI 只能如实暴露,不能在本仓库内修复权限。", + ) + if "invalid_base_id" in text or "base_not_found" in text or "invalid source baseid" in text or "failed to resolve docid from baseid" in text: + return ( + "missing-real-aitable-fixture", + "not-cli-fixable-without-fixture", + "AI 表格命令需要真实 Base/Table/View/Record 等资源;安全负向 ID 只能验证调用链,不能让后端成功。", + ) + if ( + "resource_not_found" in text + or "not found" in text + or "does not exist" in text + or "does not exit" in text + or "not exist" in text + or "不存在" in text + or "没找到" in text + or "no such" in text + or "not_found" in text + or "无效的会话" in text + or "opencid无效" in text + or "openconversationid无效" in text + or "openmessageid解密失败" in text + or "failed to decrypt" in text + or "invalid openmsgid" in text + or "opendingid 无效" in text + or "event does not exist" in text + or "nodeid 格式不合法" in text + ): + return ( + "missing-real-resource", + "not-cli-fixable-without-fixture", + "真实测试使用的资源/单据/消息/群/文档不存在;需要准备对应 fixture 后才能期望成功,不属于 shortcut 参数投影错误。", + ) + if service == "calendar" and command == "+respond-event" and "organizer" in text: + return ( + "backend-business-rule", + "not-cli-fixable", + "后端业务规则:日程组织者不能修改自己的参会响应;需要用非组织者账号复测。", + ) + if service == "minutes" and ("ai_minutes" in text or "暂无妙记" in text): + return ( + "missing-real-minutes-fixture", + "not-cli-fixable-without-fixture", + "当前账号没有满足条件的妙记/听记或录制会话;需准备真实会议产物后复测。", + ) + if service == "chat" and command == "+messages-send-card" and "receiveruid" in text: + return ( + "backend-or-mcp-error", + "not-cli-fixable-first", + "dry-run 已证明 CLI 装配了 receiverUid;真实后端仍报 receiverUid/openConversationId 为空,优先按 MCP schema/服务端字段映射问题处理。", + ) + if service == "chat" and command == "+chat-audit-join" and "applicantuid" in text: + return ( + "backend-or-mcp-error", + "not-cli-fixable-first", + "dry-run 已证明 CLI 装配了 applicantUid/inviterUid;真实后端仍报 applicantUid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + ) + if ( + service == "chat" + and ( + "opencid or cid is required" in text + or "openconversationid or cid is required" in text + or "openconversationid is required" in text + ) + ): + return ( + "backend-or-mcp-error", + "not-cli-fixable-first", + "fake MCP 已证明 CLI 已装配会话 ID 字段;真实后端仍报 openConversationId/openCid/cid 缺失,优先按 MCP schema/服务端字段映射问题处理。", + ) + if ( + "system_error" in text + or "system error" in text + or "mcp_server_error" in text + or "nullpointer" in text + or "mcp_tool_error" in text + ): + return ( + "backend-or-mcp-error", + "not-cli-fixable-first", + "后端/MCP 服务返回内部错误;CLI 无法直接修复,但报告保留 trace/stdout 供服务端排查。", + ) + if ( + "参数" in text + or "param" in text + or "required" in text + or "不能为空" in text + or "invalid argument" in text + or "invalid " in text + or "validation" in text + or "json 解析失败" in text + or "格式错误" in text + ): + return ( + "input-or-business-validation", + "test-input-or-backend-rule", + "命令已真实进入本地/后端校验;若该项仍使用安全负向输入,则失败符合预期;若使用真实 fixture 仍失败,再作为 CLI bug 处理。", + ) + return ( + "unclassified-real-error", + "needs-triage", + "真实后端返回错误,当前无法自动判断归因;需结合 stdout/stderr 单独排查。", + ) + + +def summarize_results(results: list[dict[str, Any]], include_held: bool = True) -> dict[str, int]: + summary = {"total": len(results), "ok": 0, "error": 0, "timeout": 0} + if include_held: + summary["held"] = 0 + for r in results: + status = r.get("status") + if status == "real-ok": + summary["ok"] += 1 + elif status == "timeout": + summary["timeout"] += 1 + elif status == "held" and include_held: + summary["held"] += 1 + else: + summary["error"] += 1 + return summary + + +def summarize_failure_categories(results: list[dict[str, Any]]) -> dict[str, int]: + out: dict[str, int] = {} + for r in results: + category = r.get("failure_category") + if not category: + category, _, _ = classify_failure(r) + if category == "passed": + continue + out[category] = out.get(category, 0) + 1 + return dict(sorted(out.items(), key=lambda kv: (-kv[1], kv[0]))) + + +_OSS_URL_RE = re.compile(r"https?://[^\s\"'<>]*oss[^\s\"'<>]*", re.IGNORECASE) +_ALIBABA_ACCESS_KEY_ID_RE = re.compile(r"\bLTAI[A-Za-z0-9]{12,}\b") +_OSS_QUERY_KEY_RE = re.compile( + r"(?i)\b(OSSAccessKeyId|AccessKeyId|accessKeyId|access_key_id)=([^&\s\"'<>]+)" +) +_OSS_SIGNATURE_RE = re.compile(r"(?i)\b(Signature|security-token|x-oss-security-token)=([^&\s\"'<>]+)") +_SECRET_ASSIGN_RE = re.compile( + r'(?i)("?(?:accessKeySecret|access_key_secret|clientSecret|client_secret|appSecret|app_secret|secret)"?\s*[:=]\s*")([^"]+)(")' +) + + +def sanitize_text(text: str) -> str: + """Redact secrets from real CLI outputs before writing reports. + + Real backend read commands may return signed OSS URLs or app credential + fields. Reports need the shape of stdout/stderr for debugging, not live + credentials or presigned download URLs. + """ + if not text: + return text + text = _OSS_URL_RE.sub("[REDACTED_OSS_URL]", text) + text = _ALIBABA_ACCESS_KEY_ID_RE.sub("[REDACTED_ALIBABA_ACCESS_KEY_ID]", text) + text = _OSS_QUERY_KEY_RE.sub(lambda m: f"{m.group(1)}=[REDACTED_ALIBABA_ACCESS_KEY_ID]", text) + text = _OSS_SIGNATURE_RE.sub(lambda m: f"{m.group(1)}=[REDACTED_SIGNATURE]", text) + text = _SECRET_ASSIGN_RE.sub(lambda m: f"{m.group(1)}[REDACTED_SECRET]{m.group(3)}", text) + return text + + +def sanitize_value(value: Any) -> Any: + if isinstance(value, str): + return sanitize_text(value) + if isinstance(value, list): + return [sanitize_value(v) for v in value] + if isinstance(value, dict): + out: dict[str, Any] = {} + for key, item in value.items(): + key_l = str(key).lower() + if key_l in { + "accesskeysecret", + "access_key_secret", + "clientsecret", + "client_secret", + "appsecret", + "app_secret", + "secret", + "signature", + }: + out[key] = "[REDACTED_SECRET]" + elif key_l in {"accesskeyid", "access_key_id", "ossaccesskeyid"}: + out[key] = "[REDACTED_ALIBABA_ACCESS_KEY_ID]" + elif key_l in {"resourceurl", "url", "downloadurl"} and isinstance(item, str) and "oss" in item.lower(): + out[key] = "[REDACTED_OSS_URL]" + else: + out[key] = sanitize_value(item) + return out + return value + + +def sanitize_result(result: dict[str, Any]) -> dict[str, Any]: + return sanitize_value(result) diff --git a/skills/mono/SKILL.md b/skills/mono/SKILL.md index ebf372c2..0b092c61 100644 --- a/skills/mono/SKILL.md +++ b/skills/mono/SKILL.md @@ -9,7 +9,7 @@ cli_version: ">=1.0.15" 通过 `dws` 命令管理钉钉产品能力。 -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 ## 严格禁止 (NEVER DO) - 不要使用 dws 命令以外的方式操作(禁止 curl、HTTP API、浏览器) @@ -24,6 +24,16 @@ cli_version: ">=1.0.15" - **脚本优先**:[scripts/](./scripts/) 下的 `python scripts/.py` 已封装翻页/轮询/批量逻辑,遇到对应场景(如 AI 表格批量导入导出、AI 应用创建轮询、文档创建后写内容、钉盘目录树等)**优先调用脚本**而非手写多步命令。脚本均支持 `--dry-run` 预览、`--format json` 输出,失败时回退到手动步骤 - **实时个人消息事件例外**:用户要监听消息、订阅事件、自动回复消息或事件驱动 Agent 时,必须走 `dws event consume` 长连接,不要写脚本轮询消息历史 +## Shortcut 与原子命令的使用原则 + +`shortcut` 是对常用操作的高层封装,适合优先承担用户意图;产品参考文档和本 skill 负责判断意图、风险、跨产品流程和复杂参数,CLI 帮助负责声明当前版本真正可调用的命令。 + +- 用户意图可由可见 shortcut 满足时,优先使用 `dws + ... --format json`。 +- 调用前用 `dws --help` 或 `dws shortcut list --service --format json` 确认可见命令;不要凭文档或记忆猜测 shortcut。 +- 如果 shortcut 没出现在默认 help / list 中,视为本期未对外 release:不要主动推荐或调用隐藏 shortcut,改用已验证的原子命令、脚本、参考流程,或说明该能力本期未开放。 +- 只有在内部 CR、真实测试复盘、下期修复时,才使用 `dws shortcut list --include-hidden --format json` 查看隐藏项及 `hiddenReason`。 +- shortcut 失败时按“错误处理”流程先加 `--verbose` 复查;若仍失败,不要自行换成隐藏 shortcut 兜底,应记录具体输入、输出、trace / endpoint / tool 信息。 + ## 产品总览 diff --git a/skills/multi/dingtalk-agoal/SKILL.md b/skills/multi/dingtalk-agoal/SKILL.md index 25fbf694..953ac42c 100644 --- a/skills/multi/dingtalk-agoal/SKILL.md +++ b/skills/multi/dingtalk-agoal/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[agoal.md](references/agoal.md)。 diff --git a/skills/multi/dingtalk-aisearch/SKILL.md b/skills/multi/dingtalk-aisearch/SKILL.md index 65a43d72..9e5dd65c 100644 --- a/skills/multi/dingtalk-aisearch/SKILL.md +++ b/skills/multi/dingtalk-aisearch/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[aisearch.md](references/aisearch.md)。 diff --git a/skills/multi/dingtalk-aitable/SKILL.md b/skills/multi/dingtalk-aitable/SKILL.md index 1dac92c3..d36f15ea 100644 --- a/skills/multi/dingtalk-aitable/SKILL.md +++ b/skills/multi/dingtalk-aitable/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[aitable.md](references/aitable.md);复杂命令按需加载 `references/aitable/*.md`;剧本:[06-data-analytics.md](references/06-data-analytics.md)。 diff --git a/skills/multi/dingtalk-attendance/SKILL.md b/skills/multi/dingtalk-attendance/SKILL.md index 556c9f18..fac31b28 100644 --- a/skills/multi/dingtalk-attendance/SKILL.md +++ b/skills/multi/dingtalk-attendance/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[attendance.md](references/attendance.md)。 diff --git a/skills/multi/dingtalk-calendar/SKILL.md b/skills/multi/dingtalk-calendar/SKILL.md index 18980c3f..931b69d7 100644 --- a/skills/multi/dingtalk-calendar/SKILL.md +++ b/skills/multi/dingtalk-calendar/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[calendar.md](references/calendar.md);剧本:[03-meeting.md](references/03-meeting.md)。 diff --git a/skills/multi/dingtalk-chat/SKILL.md b/skills/multi/dingtalk-chat/SKILL.md index 5c746d91..744d25fa 100644 --- a/skills/multi/dingtalk-chat/SKILL.md +++ b/skills/multi/dingtalk-chat/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[chat.md](references/chat.md);表情:[chat-emoji-list.md](references/chat-emoji-list.md);剧本:[01-messaging.md](references/01-messaging.md)。 diff --git a/skills/multi/dingtalk-contact/SKILL.md b/skills/multi/dingtalk-contact/SKILL.md index 40c0bd0d..f406c072 100644 --- a/skills/multi/dingtalk-contact/SKILL.md +++ b/skills/multi/dingtalk-contact/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[contact.md](references/contact.md);剧本:[08-directory.md](references/08-directory.md)。 diff --git a/skills/multi/dingtalk-devdoc/SKILL.md b/skills/multi/dingtalk-devdoc/SKILL.md index c380da8b..d4a6991a 100644 --- a/skills/multi/dingtalk-devdoc/SKILL.md +++ b/skills/multi/dingtalk-devdoc/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[devdoc.md](references/devdoc.md)。 diff --git a/skills/multi/dingtalk-ding/SKILL.md b/skills/multi/dingtalk-ding/SKILL.md index 94fb1e08..b9c71cb4 100644 --- a/skills/multi/dingtalk-ding/SKILL.md +++ b/skills/multi/dingtalk-ding/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[ding.md](references/ding.md)。 diff --git a/skills/multi/dingtalk-doc/SKILL.md b/skills/multi/dingtalk-doc/SKILL.md index be6be9cf..3c105e5b 100644 --- a/skills/multi/dingtalk-doc/SKILL.md +++ b/skills/multi/dingtalk-doc/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[doc.md](references/doc.md);剧本:[04-document.md](references/04-document.md);URL 识别与类型探测:[url-patterns.md](references/url-patterns.md)。 diff --git a/skills/multi/dingtalk-drive/SKILL.md b/skills/multi/dingtalk-drive/SKILL.md index 4e0f348c..3286d582 100644 --- a/skills/multi/dingtalk-drive/SKILL.md +++ b/skills/multi/dingtalk-drive/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[drive.md](references/drive.md)。 diff --git a/skills/multi/dingtalk-live/SKILL.md b/skills/multi/dingtalk-live/SKILL.md index 04536408..bc4a13ed 100644 --- a/skills/multi/dingtalk-live/SKILL.md +++ b/skills/multi/dingtalk-live/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[live.md](references/live.md)。 diff --git a/skills/multi/dingtalk-mail/SKILL.md b/skills/multi/dingtalk-mail/SKILL.md index c7fd05c8..27077c76 100644 --- a/skills/multi/dingtalk-mail/SKILL.md +++ b/skills/multi/dingtalk-mail/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[mail.md](references/mail.md)。复杂搜索、附件、批量处理、草稿等多步邮件场景参考:[09-mail.md](references/09-mail.md)。 diff --git a/skills/multi/dingtalk-minutes/SKILL.md b/skills/multi/dingtalk-minutes/SKILL.md index 9848f86d..8ec6b621 100644 --- a/skills/multi/dingtalk-minutes/SKILL.md +++ b/skills/multi/dingtalk-minutes/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[minutes.md](references/minutes.md);剧本:[07-minutes.md](references/07-minutes.md)。 diff --git a/skills/multi/dingtalk-oa/SKILL.md b/skills/multi/dingtalk-oa/SKILL.md index 56e52e93..a48656fc 100644 --- a/skills/multi/dingtalk-oa/SKILL.md +++ b/skills/multi/dingtalk-oa/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[oa.md](references/oa.md)。 diff --git a/skills/multi/dingtalk-report/SKILL.md b/skills/multi/dingtalk-report/SKILL.md index ee3400fd..51226c19 100644 --- a/skills/multi/dingtalk-report/SKILL.md +++ b/skills/multi/dingtalk-report/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[report.md](references/report.md);剧本:[05-reporting.md](references/05-reporting.md)。 diff --git a/skills/multi/dingtalk-sheet/SKILL.md b/skills/multi/dingtalk-sheet/SKILL.md index 48010a9a..8142bd6f 100644 --- a/skills/multi/dingtalk-sheet/SKILL.md +++ b/skills/multi/dingtalk-sheet/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[sheet.md](references/sheet.md);URL 识别与类型探测:[url-patterns.md](references/url-patterns.md)。 diff --git a/skills/multi/dingtalk-skill/SKILL.md b/skills/multi/dingtalk-skill/SKILL.md index 048bc07d..8075e89f 100644 --- a/skills/multi/dingtalk-skill/SKILL.md +++ b/skills/multi/dingtalk-skill/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[skill.md](references/skill.md)。 diff --git a/skills/multi/dingtalk-todo/SKILL.md b/skills/multi/dingtalk-todo/SKILL.md index 7417aeca..cc89dec0 100644 --- a/skills/multi/dingtalk-todo/SKILL.md +++ b/skills/multi/dingtalk-todo/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[todo.md](references/todo.md);剧本:[02-task.md](references/02-task.md)。 diff --git a/skills/multi/dingtalk-wiki/SKILL.md b/skills/multi/dingtalk-wiki/SKILL.md index 3a36097b..f7217ac5 100644 --- a/skills/multi/dingtalk-wiki/SKILL.md +++ b/skills/multi/dingtalk-wiki/SKILL.md @@ -18,7 +18,7 @@ metadata: -> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。 +> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。 > 命令参考:[wiki.md](references/wiki.md)。 diff --git a/skills/multi/dws-shared/SKILL.md b/skills/multi/dws-shared/SKILL.md index f48e1563..b36671a8 100644 --- a/skills/multi/dws-shared/SKILL.md +++ b/skills/multi/dws-shared/SKILL.md @@ -25,6 +25,13 @@ metadata: - 全局 `--profile <名称|corpId>`:单次指定本命令用哪个组织,一次性、不改默认组织 - 危险 / 写 / 删操作执行前先向用户确认 +## Shortcut 可用性与隐藏规则 +- `shortcut` 是对常用操作的高层封装,子 skill 负责意图、风险、跨产品流程和复杂参数;当前 `dws` 二进制的 `--help` / `dws shortcut list` 才是可用命令事实源。 +- 用户意图可由默认可见 shortcut 满足时,优先使用 `dws + ... --format json`。 +- 调用前用 `dws --help` 或 `dws shortcut list --service --format json` 确认可见命令;不要凭 skill 文档或记忆猜测 shortcut。 +- 本期真实测试未通过的 shortcut 会从默认 help / list 隐藏。缺失的 shortcut 视为未对外 release,改用已验证原子命令、脚本或参考流程;不要主动推荐隐藏命令。 +- 只有内部 CR、真实测试复盘、下期修复时,才用 `dws shortcut list --include-hidden --format json` 查看隐藏项和 `hiddenReason`。 + ## 多组织 / --profile(关键规则) dws 可同时登录多个钉钉组织,一个 profile = 一个已登录组织(corp)。当前 profile 决定本次命令用哪个组织的身份(corpId / userId 自动注入)。