diff --git a/docs/shortcut-public-catalog.json b/docs/shortcut-public-catalog.json
new file mode 100644
index 00000000..cc79f404
--- /dev/null
+++ b/docs/shortcut-public-catalog.json
@@ -0,0 +1,1476 @@
+{
+ "generated_at": "2026-07-15T16:58:39.143193",
+ "count": 210,
+ "results": [
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+base-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+base-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+base-search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+chart-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+chart-widgets-example",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+dashboard-config-example",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+dashboard-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+field-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+find-record",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+form-field-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+form-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+form-share-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+list-tables",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+record-history-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+record-query",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+record-query-empty",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+record-share-links",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+record-share-url",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+resolve-base",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+resolve-table",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+role-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+section-list-empty",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+section-list-nodes",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+table-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+template-search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+view-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+view-get-frozen-cols",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+view-get-lock",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "aitable",
+ "command": "+view-get-row-height",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+check-record",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+check-result",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+get-adjustment-rule",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+get-approve-template",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+get-checkin-record",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+get-leave-records",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+get-overtime-rule",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+get-schedule",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+get-self-setting",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+get-summary",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+list-approve",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+list-leave-types",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+my-attendance",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+query-report-data",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+search-adjustment-rule",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+search-class",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+search-group",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+search-overtime-rule",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "attendance",
+ "command": "+this-month",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+agenda",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+attendee-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "calendar",
+ "command": "+book",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+book-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+book-search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "calendar",
+ "command": "+cancel-event",
+ "risk": "high-risk-write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+conflicts",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+free",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+free-slots",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+freebusy",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "calendar",
+ "command": "+invite",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+my-free",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+next-event",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "calendar",
+ "command": "+reschedule",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+room-groups",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+room-search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+suggest-time",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+today",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+tomorrow",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "calendar",
+ "command": "+week",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+at-me",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+bot-find",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+bot-search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+broadcast",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+category-create",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+category-delete",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+category-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+category-rename",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+chat-bots",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-dismiss",
+ "risk": "high-risk-write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+chat-invite-url",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+chat-list-all",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+chat-list-join-requests",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+chat-list-mine",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-mute",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-role-add",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+chat-role-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+chat-role-query-user",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-role-set-user",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-role-update",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+chat-search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-set-admin",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-set-history",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-update-alias",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+chat-update-nick",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+conversation-clear-all-red-point",
+ "risk": "high-risk-write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+conversation-info",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+conversation-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+conversation-list-top",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+dm",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+group-members",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+messages-list-direct",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+messages-list-pin",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+messages-list-unread-conversations",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+messages-mget",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+messages-query-send-status",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+messages-read-status",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+messages-send-by-webhook",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+messages-update-card",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+my-groups",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "chat",
+ "command": "+send-to-group",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "chat",
+ "command": "+unread-chats",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+by-mobile",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+dept-members",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+list-dept-members",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+list-followings",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+list-role-members",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+list-roles",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+list-sub-depts",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+lookup",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+me",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+org",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+resolve-dept",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+search-mobile",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+search-user",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "contact",
+ "command": "+team",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "devapp",
+ "command": "+create",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "devapp",
+ "command": "+delete",
+ "risk": "high-risk-write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "devapp",
+ "command": "+disable",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "devapp",
+ "command": "+enable",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+event-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "devapp",
+ "command": "+member-add",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+member-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "devapp",
+ "command": "+member-remove",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+permission-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+robot-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "devapp",
+ "command": "+update",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+version-check-approval",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+version-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+version-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+version-status",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "devapp",
+ "command": "+webapp-config",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "devapp",
+ "command": "+webapp-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "ding",
+ "command": "+list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "ding",
+ "command": "+recall-personal",
+ "risk": "high-risk-write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "ding",
+ "command": "+receiver-status",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "ding",
+ "command": "+send-personal",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "doc",
+ "command": "+comment-create",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+comment-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "doc",
+ "command": "+comment-reply",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "doc",
+ "command": "+copy",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "doc",
+ "command": "+doc-append",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+export-get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+export-submit",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+find-doc",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "doc",
+ "command": "+move",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "doc",
+ "command": "+share-doc",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+template-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+template-search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "doc",
+ "command": "+version-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "doc",
+ "command": "+version-revert",
+ "risk": "high-risk-write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "doc",
+ "command": "+version-save",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "drive",
+ "command": "+copy",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "drive",
+ "command": "+find-file",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "drive",
+ "command": "+info",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "drive",
+ "command": "+move",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "drive",
+ "command": "+recent",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "drive",
+ "command": "+search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "drive",
+ "command": "+search-docs",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+contact-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+find-mail-user",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+folder-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+recent-mail",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+search-mail",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+tag-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+template-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+thread-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+unread-mail",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "mail",
+ "command": "+user-search",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "minutes",
+ "command": "+detail",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "minutes",
+ "command": "+list-all",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "minutes",
+ "command": "+list-mine",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "minutes",
+ "command": "+list-shared",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "minutes",
+ "command": "+record-start",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "minutes",
+ "command": "+replace-batch",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "oa",
+ "command": "+list-cc",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "oa",
+ "command": "+list-executed",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "oa",
+ "command": "+list-forms",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "oa",
+ "command": "+list-pending",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "oa",
+ "command": "+list-submitted",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "oa",
+ "command": "+my-initiated",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "oa",
+ "command": "+search-forms",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "report",
+ "command": "+inbox-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "report",
+ "command": "+outbox-list",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "sheet",
+ "command": "+list-sheets",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "sheet",
+ "command": "+read",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "todo",
+ "command": "+assign",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "todo",
+ "command": "+assign-multi",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "todo",
+ "command": "+created-todos",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "todo",
+ "command": "+get",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "todo",
+ "command": "+get-my-tasks",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "todo",
+ "command": "+list-attachment",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "todo",
+ "command": "+list-comment",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "todo",
+ "command": "+list-sub",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "todo",
+ "command": "+overdue",
+ "risk": "read",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "todo",
+ "command": "+remind",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "write",
+ "service": "todo",
+ "command": "+todo-done",
+ "risk": "write",
+ "status": "real-ok"
+ },
+ {
+ "suite": "read",
+ "service": "wiki",
+ "command": "+space-search",
+ "risk": "read",
+ "status": "real-ok"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/docs/shortcut-next-release-hidden.json b/docs/shortcut-real-test-followups.json
similarity index 99%
rename from docs/shortcut-next-release-hidden.json
rename to docs/shortcut-real-test-followups.json
index 4fe2b780..cac7768b 100644
--- a/docs/shortcut-next-release-hidden.json
+++ b/docs/shortcut-real-test-followups.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-07-15T16:44:43.822237",
+ "generated_at": "2026-07-15T16:58:39.143193",
"count": 156,
"results": [
{
diff --git a/docs/shortcut-next-release-hidden.md b/docs/shortcut-real-test-followups.md
similarity index 99%
rename from docs/shortcut-next-release-hidden.md
rename to docs/shortcut-real-test-followups.md
index ac85e762..7a30b7d9 100644
--- a/docs/shortcut-next-release-hidden.md
+++ b/docs/shortcut-real-test-followups.md
@@ -1,14 +1,14 @@
-# 本期隐藏、下期修复的 shortcut 清单
+# Shortcut 真实测试跟进清单
-生成时间:`2026-07-15T16:44:43`
+生成时间:`2026-07-15T16:58:39`
来源:`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 后再放开。
+口径:记录真实后端测试中需要继续定位的 case,用于 CR 和问题分派;Agent 使用入口以公开 shortcut catalog 和产品 skill 为准。
总计:156 条。
-| # | suite | shortcut | risk | status | category | fixability | 下期处理依据 |
+| # | 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 只能如实暴露,不能在本仓库内修复权限。 |
diff --git a/internal/shortcut/public_catalog.go b/internal/shortcut/public_catalog.go
new file mode 100644
index 00000000..e5d4cd1e
--- /dev/null
+++ b/internal/shortcut/public_catalog.go
@@ -0,0 +1,25 @@
+// Copyright 2026 Alibaba Group
+// Licensed under the Apache License, Version 2.0
+
+package shortcut
+
+func publicCatalogKey(service, command string) string {
+ return service + "\x00" + command
+}
+
+func applyPublicCatalog(s Shortcut) Shortcut {
+ if len(publicShortcutCatalog) == 0 {
+ return s
+ }
+ if _, ok := publicShortcutCatalog[publicCatalogKey(s.Service, s.Command)]; !ok {
+ s.Hidden = true
+ }
+ return s
+}
+
+// InPublicCatalog reports whether a shortcut belongs to the generated public
+// shortcut surface used by help, listing, and skill generation.
+func InPublicCatalog(service, command string) bool {
+ _, ok := publicShortcutCatalog[publicCatalogKey(service, command)]
+ return ok
+}
diff --git a/internal/shortcut/public_catalog_generated.go b/internal/shortcut/public_catalog_generated.go
new file mode 100644
index 00000000..ffc06ff4
--- /dev/null
+++ b/internal/shortcut/public_catalog_generated.go
@@ -0,0 +1,218 @@
+// Code generated by scripts/gen_shortcut_public_catalog.py; DO NOT EDIT.
+
+package shortcut
+
+// publicShortcutCatalog contains the generated shortcut surface used by
+// command discovery and skill generation.
+var publicShortcutCatalog = map[string]struct{}{
+ "aitable\u0000+base-get": {},
+ "aitable\u0000+base-list": {},
+ "aitable\u0000+base-search": {},
+ "aitable\u0000+chart-get": {},
+ "aitable\u0000+chart-widgets-example": {},
+ "aitable\u0000+dashboard-config-example": {},
+ "aitable\u0000+dashboard-get": {},
+ "aitable\u0000+field-get": {},
+ "aitable\u0000+find-record": {},
+ "aitable\u0000+form-field-list": {},
+ "aitable\u0000+form-list": {},
+ "aitable\u0000+form-share-get": {},
+ "aitable\u0000+list-tables": {},
+ "aitable\u0000+record-history-list": {},
+ "aitable\u0000+record-query": {},
+ "aitable\u0000+record-query-empty": {},
+ "aitable\u0000+record-share-links": {},
+ "aitable\u0000+record-share-url": {},
+ "aitable\u0000+resolve-base": {},
+ "aitable\u0000+resolve-table": {},
+ "aitable\u0000+role-list": {},
+ "aitable\u0000+section-list-empty": {},
+ "aitable\u0000+section-list-nodes": {},
+ "aitable\u0000+table-get": {},
+ "aitable\u0000+template-search": {},
+ "aitable\u0000+view-get": {},
+ "aitable\u0000+view-get-frozen-cols": {},
+ "aitable\u0000+view-get-lock": {},
+ "aitable\u0000+view-get-row-height": {},
+ "attendance\u0000+check-record": {},
+ "attendance\u0000+check-result": {},
+ "attendance\u0000+get-adjustment-rule": {},
+ "attendance\u0000+get-approve-template": {},
+ "attendance\u0000+get-checkin-record": {},
+ "attendance\u0000+get-leave-records": {},
+ "attendance\u0000+get-overtime-rule": {},
+ "attendance\u0000+get-schedule": {},
+ "attendance\u0000+get-self-setting": {},
+ "attendance\u0000+get-summary": {},
+ "attendance\u0000+list-approve": {},
+ "attendance\u0000+list-leave-types": {},
+ "attendance\u0000+my-attendance": {},
+ "attendance\u0000+query-report-data": {},
+ "attendance\u0000+search-adjustment-rule": {},
+ "attendance\u0000+search-class": {},
+ "attendance\u0000+search-group": {},
+ "attendance\u0000+search-overtime-rule": {},
+ "attendance\u0000+this-month": {},
+ "calendar\u0000+agenda": {},
+ "calendar\u0000+attendee-list": {},
+ "calendar\u0000+book": {},
+ "calendar\u0000+book-list": {},
+ "calendar\u0000+book-search": {},
+ "calendar\u0000+cancel-event": {},
+ "calendar\u0000+conflicts": {},
+ "calendar\u0000+free": {},
+ "calendar\u0000+free-slots": {},
+ "calendar\u0000+freebusy": {},
+ "calendar\u0000+invite": {},
+ "calendar\u0000+my-free": {},
+ "calendar\u0000+next-event": {},
+ "calendar\u0000+reschedule": {},
+ "calendar\u0000+room-groups": {},
+ "calendar\u0000+room-search": {},
+ "calendar\u0000+suggest-time": {},
+ "calendar\u0000+today": {},
+ "calendar\u0000+tomorrow": {},
+ "calendar\u0000+week": {},
+ "chat\u0000+at-me": {},
+ "chat\u0000+bot-find": {},
+ "chat\u0000+bot-search": {},
+ "chat\u0000+broadcast": {},
+ "chat\u0000+category-create": {},
+ "chat\u0000+category-delete": {},
+ "chat\u0000+category-list": {},
+ "chat\u0000+category-rename": {},
+ "chat\u0000+chat-bots": {},
+ "chat\u0000+chat-dismiss": {},
+ "chat\u0000+chat-invite-url": {},
+ "chat\u0000+chat-list-all": {},
+ "chat\u0000+chat-list-join-requests": {},
+ "chat\u0000+chat-list-mine": {},
+ "chat\u0000+chat-mute": {},
+ "chat\u0000+chat-role-add": {},
+ "chat\u0000+chat-role-list": {},
+ "chat\u0000+chat-role-query-user": {},
+ "chat\u0000+chat-role-set-user": {},
+ "chat\u0000+chat-role-update": {},
+ "chat\u0000+chat-search": {},
+ "chat\u0000+chat-set-admin": {},
+ "chat\u0000+chat-set-history": {},
+ "chat\u0000+chat-update-alias": {},
+ "chat\u0000+chat-update-nick": {},
+ "chat\u0000+conversation-clear-all-red-point": {},
+ "chat\u0000+conversation-info": {},
+ "chat\u0000+conversation-list": {},
+ "chat\u0000+conversation-list-top": {},
+ "chat\u0000+dm": {},
+ "chat\u0000+group-members": {},
+ "chat\u0000+messages-list-direct": {},
+ "chat\u0000+messages-list-pin": {},
+ "chat\u0000+messages-list-unread-conversations": {},
+ "chat\u0000+messages-mget": {},
+ "chat\u0000+messages-query-send-status": {},
+ "chat\u0000+messages-read-status": {},
+ "chat\u0000+messages-send-by-webhook": {},
+ "chat\u0000+messages-update-card": {},
+ "chat\u0000+my-groups": {},
+ "chat\u0000+send-to-group": {},
+ "chat\u0000+unread-chats": {},
+ "contact\u0000+by-mobile": {},
+ "contact\u0000+dept-members": {},
+ "contact\u0000+list-dept-members": {},
+ "contact\u0000+list-followings": {},
+ "contact\u0000+list-role-members": {},
+ "contact\u0000+list-roles": {},
+ "contact\u0000+list-sub-depts": {},
+ "contact\u0000+lookup": {},
+ "contact\u0000+me": {},
+ "contact\u0000+org": {},
+ "contact\u0000+resolve-dept": {},
+ "contact\u0000+search-mobile": {},
+ "contact\u0000+search-user": {},
+ "contact\u0000+team": {},
+ "devapp\u0000+create": {},
+ "devapp\u0000+delete": {},
+ "devapp\u0000+disable": {},
+ "devapp\u0000+enable": {},
+ "devapp\u0000+event-list": {},
+ "devapp\u0000+get": {},
+ "devapp\u0000+list": {},
+ "devapp\u0000+member-add": {},
+ "devapp\u0000+member-list": {},
+ "devapp\u0000+member-remove": {},
+ "devapp\u0000+permission-list": {},
+ "devapp\u0000+robot-get": {},
+ "devapp\u0000+update": {},
+ "devapp\u0000+version-check-approval": {},
+ "devapp\u0000+version-get": {},
+ "devapp\u0000+version-list": {},
+ "devapp\u0000+version-status": {},
+ "devapp\u0000+webapp-config": {},
+ "devapp\u0000+webapp-get": {},
+ "ding\u0000+list": {},
+ "ding\u0000+recall-personal": {},
+ "ding\u0000+receiver-status": {},
+ "ding\u0000+send-personal": {},
+ "doc\u0000+comment-create": {},
+ "doc\u0000+comment-list": {},
+ "doc\u0000+comment-reply": {},
+ "doc\u0000+copy": {},
+ "doc\u0000+doc-append": {},
+ "doc\u0000+export-get": {},
+ "doc\u0000+export-submit": {},
+ "doc\u0000+find-doc": {},
+ "doc\u0000+list": {},
+ "doc\u0000+move": {},
+ "doc\u0000+search": {},
+ "doc\u0000+share-doc": {},
+ "doc\u0000+template-list": {},
+ "doc\u0000+template-search": {},
+ "doc\u0000+version-list": {},
+ "doc\u0000+version-revert": {},
+ "doc\u0000+version-save": {},
+ "drive\u0000+copy": {},
+ "drive\u0000+find-file": {},
+ "drive\u0000+info": {},
+ "drive\u0000+move": {},
+ "drive\u0000+recent": {},
+ "drive\u0000+search": {},
+ "drive\u0000+search-docs": {},
+ "mail\u0000+contact-list": {},
+ "mail\u0000+find-mail-user": {},
+ "mail\u0000+folder-list": {},
+ "mail\u0000+recent-mail": {},
+ "mail\u0000+search-mail": {},
+ "mail\u0000+tag-list": {},
+ "mail\u0000+template-list": {},
+ "mail\u0000+thread-list": {},
+ "mail\u0000+unread-mail": {},
+ "mail\u0000+user-search": {},
+ "minutes\u0000+detail": {},
+ "minutes\u0000+list-all": {},
+ "minutes\u0000+list-mine": {},
+ "minutes\u0000+list-shared": {},
+ "minutes\u0000+record-start": {},
+ "minutes\u0000+replace-batch": {},
+ "oa\u0000+list-cc": {},
+ "oa\u0000+list-executed": {},
+ "oa\u0000+list-forms": {},
+ "oa\u0000+list-pending": {},
+ "oa\u0000+list-submitted": {},
+ "oa\u0000+my-initiated": {},
+ "oa\u0000+search-forms": {},
+ "report\u0000+inbox-list": {},
+ "report\u0000+outbox-list": {},
+ "sheet\u0000+list-sheets": {},
+ "sheet\u0000+read": {},
+ "todo\u0000+assign": {},
+ "todo\u0000+assign-multi": {},
+ "todo\u0000+created-todos": {},
+ "todo\u0000+get": {},
+ "todo\u0000+get-my-tasks": {},
+ "todo\u0000+list-attachment": {},
+ "todo\u0000+list-comment": {},
+ "todo\u0000+list-sub": {},
+ "todo\u0000+overdue": {},
+ "todo\u0000+remind": {},
+ "todo\u0000+todo-done": {},
+ "wiki\u0000+space-search": {},
+}
diff --git a/internal/shortcut/register.go b/internal/shortcut/register.go
index b24c348d..c35e08c9 100644
--- a/internal/shortcut/register.go
+++ b/internal/shortcut/register.go
@@ -29,7 +29,7 @@ var allShortcuts []Shortcut
// service package's init().
func Register(shortcuts ...Shortcut) {
for i := range shortcuts {
- shortcuts[i] = applyReleaseGate(shortcuts[i])
+ shortcuts[i] = applyPublicCatalog(shortcuts[i])
}
allShortcuts = append(allShortcuts, shortcuts...)
}
diff --git a/internal/shortcut/release_gate.go b/internal/shortcut/release_gate.go
deleted file mode 100644
index 2916cfc7..00000000
--- a/internal/shortcut/release_gate.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// 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
deleted file mode 100644
index 81caae44..00000000
--- a/internal/shortcut/release_hidden_generated.go
+++ /dev/null
@@ -1,166 +0,0 @@
-// 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/usage/command.go b/internal/shortcut/usage/command.go
index a023a4f8..f806d178 100644
--- a/internal/shortcut/usage/command.go
+++ b/internal/shortcut/usage/command.go
@@ -48,24 +48,20 @@ 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"`
- Hidden bool `json:"hidden,omitempty"`
- HiddenReason string `json:"hiddenReason,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"`
}
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 {
+ if s.Hidden {
continue
}
product := s.Product
@@ -83,10 +79,6 @@ func newListCommand() *cobra.Command {
Risk: risk,
Description: s.Description,
Intent: s.Intent,
- Hidden: s.Hidden,
- }
- if hiddenByRelease {
- item.HiddenReason = hiddenReason
}
rows = append(rows, item)
}
@@ -97,7 +89,6 @@ func newListCommand() *cobra.Command {
},
}
cmd.Flags().String("service", "", "只列出指定服务的 shortcut")
- cmd.Flags().Bool("include-hidden", false, "包含本期隐藏、仅内部复测用的 shortcut")
return cmd
}
diff --git a/scripts/gen_shortcut_release_hidden.py b/scripts/gen_shortcut_public_catalog.py
similarity index 60%
rename from scripts/gen_shortcut_release_hidden.py
rename to scripts/gen_shortcut_public_catalog.py
index 9ecd9520..5621226e 100644
--- a/scripts/gen_shortcut_release_hidden.py
+++ b/scripts/gen_shortcut_public_catalog.py
@@ -1,11 +1,5 @@
#!/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.
-"""
+"""Generate the public shortcut catalog from real test results."""
from __future__ import annotations
@@ -19,9 +13,10 @@ 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"
+GO_PATH = ROOT / "internal" / "shortcut" / "public_catalog_generated.go"
+CATALOG_PATH = ROOT / "docs" / "shortcut-public-catalog.json"
+FOLLOWUP_MD_PATH = ROOT / "docs" / "shortcut-real-test-followups.md"
+FOLLOWUP_JSON_PATH = ROOT / "docs" / "shortcut-real-test-followups.json"
def load(path: Path) -> dict[str, Any]:
@@ -64,26 +59,32 @@ def evidence(row: dict[str, Any]) -> str:
return squish(error_text(row), 220)
-def collect() -> list[dict[str, Any]]:
- out: list[dict[str, Any]] = []
+def collect() -> tuple[list[dict[str, Any]], list[dict[str, Any]]]:
+ public: list[dict[str, Any]] = []
+ followups: 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({
+ item = {
"suite": suite,
"service": row.get("service") or "",
"command": row.get("command") or "",
"risk": row.get("risk") or "",
"status": row.get("status") or "",
+ }
+ if row.get("status") == "real-ok":
+ public.append(item)
+ continue
+ followups.append({
+ **item,
"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
+ public.sort(key=lambda r: (r["service"], r["command"]))
+ followups.sort(key=lambda r: (r["suite"], r["service"], r["command"]))
+ return public, followups
def go_quote(s: str) -> str:
@@ -92,24 +93,17 @@ def go_quote(s: str) -> str:
def write_go(rows: list[dict[str, Any]]) -> None:
lines = [
- "// Code generated by scripts/gen_shortcut_release_hidden.py; DO NOT EDIT.",
+ "// Code generated by scripts/gen_shortcut_public_catalog.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{",
+ "// publicShortcutCatalog contains the generated shortcut surface used by",
+ "// command discovery and skill generation.",
+ "var publicShortcutCatalog = map[string]struct{}{",
]
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.append(f"\t{go_quote(key)}: {{}},")
lines.extend(["}", ""])
GO_PATH.write_text("\n".join(lines), encoding="utf-8")
@@ -118,20 +112,20 @@ def md_escape(s: str) -> str:
return str(s).replace("|", "\\|").replace("\n", "
")
-def write_md(rows: list[dict[str, Any]]) -> None:
+def write_followup_md(rows: list[dict[str, Any]]) -> None:
generated = dt.datetime.now().isoformat(timespec="seconds")
lines = [
- "# 本期隐藏、下期修复的 shortcut 清单",
+ "# 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 后再放开。",
+ "口径:记录真实后端测试中需要继续定位的 case,用于 CR 和问题分派;Agent 使用入口以公开 shortcut catalog 和产品 skill 为准。",
"",
f"总计:{len(rows)} 条。",
"",
- "| # | suite | shortcut | risk | status | category | fixability | 下期处理依据 |",
+ "| # | suite | shortcut | risk | status | category | fixability | 处理依据 |",
"|---:|---|---|---|---|---|---|---|",
]
for idx, row in enumerate(rows, 1):
@@ -144,27 +138,33 @@ def write_md(rows: list[dict[str, Any]]) -> None:
f"{md_escape(squish(basis, 160))} |"
)
lines.append("")
- MD_PATH.write_text("\n".join(lines), encoding="utf-8")
+ FOLLOWUP_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 write_json(public: list[dict[str, Any]], followups: list[dict[str, Any]]) -> None:
+ generated = dt.datetime.now().isoformat()
+ CATALOG_PATH.write_text(json.dumps({
+ "generated_at": generated,
+ "count": len(public),
+ "results": public,
+ }, ensure_ascii=False, indent=2), encoding="utf-8")
+ FOLLOWUP_JSON_PATH.write_text(json.dumps({
+ "generated_at": generated,
+ "count": len(followups),
+ "results": followups,
+ }, 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)}")
+ public, followups = collect()
+ write_go(public)
+ write_followup_md(followups)
+ write_json(public, followups)
+ print(f"public={len(public)} followups={len(followups)}")
print(f"written: {GO_PATH}")
- print(f"written: {MD_PATH}")
- print(f"written: {JSON_PATH}")
+ print(f"written: {CATALOG_PATH}")
+ print(f"written: {FOLLOWUP_MD_PATH}")
+ print(f"written: {FOLLOWUP_JSON_PATH}")
return 0
diff --git a/scripts/gen_skill_shortcut_sections.py b/scripts/gen_skill_shortcut_sections.py
index b383b314..be4c34b8 100644
--- a/scripts/gen_skill_shortcut_sections.py
+++ b/scripts/gen_skill_shortcut_sections.py
@@ -1,11 +1,9 @@
#!/usr/bin/env python3
-"""Generate visible shortcut sections for DWS skills.
+"""Generate shortcut sections for DWS skills.
The skill should teach agents which high-level shortcut entries are available
-for the current release, while `dws --help` remains the source of
-truth for flags. Hidden shortcuts are intentionally omitted from product skill
-tables and remain documented in docs/shortcut-next-release-hidden.md for CR /
-next-release repair.
+in the public catalog, while `dws --help` remains the source of truth
+for flags.
"""
from __future__ import annotations
@@ -22,7 +20,7 @@ sys.path.insert(0, str(ROOT / "scripts"))
import gen_shortcut_comparison as shortcut_source # noqa: E402
-HIDDEN_PATH = ROOT / "docs" / "shortcut-next-release-hidden.json"
+CATALOG_PATH = ROOT / "docs" / "shortcut-public-catalog.json"
MONO_SKILL = ROOT / "skills" / "mono" / "SKILL.md"
SERVICE_TO_SKILL = {
@@ -55,10 +53,10 @@ def md_escape(value: Any) -> str:
return text.replace("\\", "\\\\").replace("|", "\\|").replace("\n", " ")
-def load_hidden() -> set[tuple[str, str]]:
- if not HIDDEN_PATH.exists():
+def load_public_catalog() -> set[tuple[str, str]]:
+ if not CATALOG_PATH.exists():
return set()
- data = json.loads(HIDDEN_PATH.read_text(encoding="utf-8"))
+ data = json.loads(CATALOG_PATH.read_text(encoding="utf-8"))
return {
(str(row["service"]), str(row["command"]))
for row in data.get("results", [])
@@ -66,11 +64,11 @@ def load_hidden() -> set[tuple[str, str]]:
def collect_visible() -> list[dict[str, Any]]:
- hidden = load_hidden()
+ public_catalog = load_public_catalog()
items = [
item
for item in shortcut_source.collect()
- if (item["service"], item["command"]) not in hidden
+ if (item["service"], item["command"]) in public_catalog
]
return sorted(items, key=lambda item: (item["service"], item["command"]))
@@ -94,11 +92,11 @@ def mono_overview(items: list[dict[str, Any]]) -> str:
rows.append(f"| `{md_escape(service)}` | {count} | `{md_escape(skill)}` | `dws {md_escape(service)} --help` / `dws shortcut list --service {md_escape(service)} --format json` |")
body = "\n".join(rows)
return f"""{MONO_START}
-## 本期可见 Shortcut 总览
+## Shortcut 总览
-下面只统计本期真实测试通过、默认 `--help` / `dws shortcut list` 可见的 shortcut。mono 模式不展开 200+ 行明细,避免 skill 过重;需要执行时先按产品路由,再用 `dws --help` 查看 flags。multi 模式的各产品 skill 会展开该产品的可见 shortcut 表。
+下面统计当前公开 catalog 中的 shortcut。mono 模式不展开 200+ 行明细,避免 skill 过重;需要执行时先按产品路由,再用 `dws --help` 查看 flags。multi 模式的各产品 skill 会展开该产品的 shortcut 表。
-| 服务 | 可见 shortcut 数 | multi skill | 发现命令 |
+| 服务 | shortcut 数 | multi skill | 发现命令 |
|---|---:|---|---|
{body}
{MONO_END}"""
@@ -112,9 +110,9 @@ def product_section(service: str, rows: list[dict[str, Any]]) -> str:
f"{md_escape(item['risk'])} | {md_escape(item['desc'])} |"
)
return f"""{PRODUCT_START}
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws {service} --help` / `dws shortcut list --service {service}` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws {service} --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws {service} --help` / `dws shortcut list --service {service}` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws {service} --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/mono/SKILL.md b/skills/mono/SKILL.md
index 4ba81ca7..7f0f6161 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` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
## 严格禁止 (NEVER DO)
- 不要使用 dws 命令以外的方式操作(禁止 curl、HTTP API、浏览器)
@@ -30,17 +30,16 @@ cli_version: ">=1.0.15"
- 用户意图可由可见 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 信息。
+- 如果 shortcut 不在 help / list 中,改用产品参考里的原子命令、脚本或标准流程;不要猜测未展示的 `+` 命令。
+- shortcut 失败时按“错误处理”流程先加 `--verbose` 复查;若仍失败,应记录具体输入、输出、trace / endpoint / tool 信息。
-## 本期可见 Shortcut 总览
+## Shortcut 总览
-下面只统计本期真实测试通过、默认 `--help` / `dws shortcut list` 可见的 shortcut。mono 模式不展开 200+ 行明细,避免 skill 过重;需要执行时先按产品路由,再用 `dws --help` 查看 flags。multi 模式的各产品 skill 会展开该产品的可见 shortcut 表。
+下面统计当前公开 catalog 中的 shortcut。mono 模式不展开 200+ 行明细,避免 skill 过重;需要执行时先按产品路由,再用 `dws --help` 查看 flags。multi 模式的各产品 skill 会展开该产品的 shortcut 表。
-| 服务 | 可见 shortcut 数 | multi skill | 发现命令 |
+| 服务 | shortcut 数 | multi skill | 发现命令 |
|---|---:|---|---|
| `aitable` | 29 | `dingtalk-aitable` | `dws aitable --help` / `dws shortcut list --service aitable --format json` |
| `attendance` | 19 | `dingtalk-attendance` | `dws attendance --help` / `dws shortcut list --service attendance --format json` |
diff --git a/skills/multi/dingtalk-agoal/SKILL.md b/skills/multi/dingtalk-agoal/SKILL.md
index 953ac42c..25fbf694 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` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[agoal.md](references/agoal.md)。
diff --git a/skills/multi/dingtalk-aisearch/SKILL.md b/skills/multi/dingtalk-aisearch/SKILL.md
index 9e5dd65c..65a43d72 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` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[aisearch.md](references/aisearch.md)。
diff --git a/skills/multi/dingtalk-aitable/SKILL.md b/skills/multi/dingtalk-aitable/SKILL.md
index 6c1cc699..dcc0d678 100644
--- a/skills/multi/dingtalk-aitable/SKILL.md
+++ b/skills/multi/dingtalk-aitable/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[aitable.md](references/aitable.md);复杂命令按需加载 `references/aitable/*.md`;剧本:[06-data-analytics.md](references/06-data-analytics.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws aitable --help` / `dws shortcut list --service aitable` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws aitable --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws aitable --help` / `dws shortcut list --service aitable` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws aitable --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-attendance/SKILL.md b/skills/multi/dingtalk-attendance/SKILL.md
index ffddaf69..4eb86e6d 100644
--- a/skills/multi/dingtalk-attendance/SKILL.md
+++ b/skills/multi/dingtalk-attendance/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[attendance.md](references/attendance.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws attendance --help` / `dws shortcut list --service attendance` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws attendance --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws attendance --help` / `dws shortcut list --service attendance` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws attendance --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-calendar/SKILL.md b/skills/multi/dingtalk-calendar/SKILL.md
index 2e43ba2e..0bb037ee 100644
--- a/skills/multi/dingtalk-calendar/SKILL.md
+++ b/skills/multi/dingtalk-calendar/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[calendar.md](references/calendar.md);剧本:[03-meeting.md](references/03-meeting.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws calendar --help` / `dws shortcut list --service calendar` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws calendar --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws calendar --help` / `dws shortcut list --service calendar` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws calendar --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-chat/SKILL.md b/skills/multi/dingtalk-chat/SKILL.md
index 2c716a98..d9c76eab 100644
--- a/skills/multi/dingtalk-chat/SKILL.md
+++ b/skills/multi/dingtalk-chat/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[chat.md](references/chat.md);表情:[chat-emoji-list.md](references/chat-emoji-list.md);剧本:[01-messaging.md](references/01-messaging.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws chat --help` / `dws shortcut list --service chat` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws chat --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws chat --help` / `dws shortcut list --service chat` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws chat --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-contact/SKILL.md b/skills/multi/dingtalk-contact/SKILL.md
index 489ece14..bbd1c19a 100644
--- a/skills/multi/dingtalk-contact/SKILL.md
+++ b/skills/multi/dingtalk-contact/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[contact.md](references/contact.md);剧本:[08-directory.md](references/08-directory.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws contact --help` / `dws shortcut list --service contact` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws contact --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws contact --help` / `dws shortcut list --service contact` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws contact --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-dev/SKILL.md b/skills/multi/dingtalk-dev/SKILL.md
index 83980453..05522e35 100644
--- a/skills/multi/dingtalk-dev/SKILL.md
+++ b/skills/multi/dingtalk-dev/SKILL.md
@@ -27,9 +27,9 @@ metadata:
10. `robot result` 若缺 `unifiedAppId` 或返回 `completionState=BLOCKED_BY_MISSING_UNIFIED_APP_ID`,必须停下要求明确的 `unifiedAppId`;禁止用 `clientId/appKey` 自动反查后继续执行版本写操作
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws devapp --help` / `dws shortcut list --service devapp` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws devapp --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws devapp --help` / `dws shortcut list --service devapp` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws devapp --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-devdoc/SKILL.md b/skills/multi/dingtalk-devdoc/SKILL.md
index d4a6991a..c380da8b 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` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[devdoc.md](references/devdoc.md)。
diff --git a/skills/multi/dingtalk-ding/SKILL.md b/skills/multi/dingtalk-ding/SKILL.md
index 93ce9781..e7388714 100644
--- a/skills/multi/dingtalk-ding/SKILL.md
+++ b/skills/multi/dingtalk-ding/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[ding.md](references/ding.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws ding --help` / `dws shortcut list --service ding` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws ding --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws ding --help` / `dws shortcut list --service ding` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws ding --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-doc/SKILL.md b/skills/multi/dingtalk-doc/SKILL.md
index 2fdb13b1..67bbd54b 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` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[doc.md](references/doc.md);剧本:[04-document.md](references/04-document.md);URL 识别与类型探测:[url-patterns.md](references/url-patterns.md)。
@@ -37,9 +37,9 @@ metadata:
- 每次 `create` / `update` / `block insert` / `media insert` 后必须 `dws doc read` 或 `dws doc block list` 回读关键内容。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws doc --help` / `dws shortcut list --service doc` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws doc --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws doc --help` / `dws shortcut list --service doc` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws doc --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-drive/SKILL.md b/skills/multi/dingtalk-drive/SKILL.md
index 49e82d47..377e5529 100644
--- a/skills/multi/dingtalk-drive/SKILL.md
+++ b/skills/multi/dingtalk-drive/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[drive.md](references/drive.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws drive --help` / `dws shortcut list --service drive` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws drive --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws drive --help` / `dws shortcut list --service drive` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws drive --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-live/SKILL.md b/skills/multi/dingtalk-live/SKILL.md
index bc4a13ed..04536408 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` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[live.md](references/live.md)。
diff --git a/skills/multi/dingtalk-mail/SKILL.md b/skills/multi/dingtalk-mail/SKILL.md
index 5c7fa5c3..c70a7c2f 100644
--- a/skills/multi/dingtalk-mail/SKILL.md
+++ b/skills/multi/dingtalk-mail/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[mail.md](references/mail.md)。复杂搜索、附件、批量处理、草稿等多步邮件场景参考:[09-mail.md](references/09-mail.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws mail --help` / `dws shortcut list --service mail` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws mail --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws mail --help` / `dws shortcut list --service mail` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws mail --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-minutes/SKILL.md b/skills/multi/dingtalk-minutes/SKILL.md
index df9ee3e3..24b1540b 100644
--- a/skills/multi/dingtalk-minutes/SKILL.md
+++ b/skills/multi/dingtalk-minutes/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[minutes.md](references/minutes.md);剧本:[07-minutes.md](references/07-minutes.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws minutes --help` / `dws shortcut list --service minutes` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws minutes --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws minutes --help` / `dws shortcut list --service minutes` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws minutes --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-oa/SKILL.md b/skills/multi/dingtalk-oa/SKILL.md
index c22880c8..ee159b79 100644
--- a/skills/multi/dingtalk-oa/SKILL.md
+++ b/skills/multi/dingtalk-oa/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[oa.md](references/oa.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws oa --help` / `dws shortcut list --service oa` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws oa --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws oa --help` / `dws shortcut list --service oa` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws oa --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-report/SKILL.md b/skills/multi/dingtalk-report/SKILL.md
index 9b36079e..00ac37be 100644
--- a/skills/multi/dingtalk-report/SKILL.md
+++ b/skills/multi/dingtalk-report/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[report.md](references/report.md);剧本:[05-reporting.md](references/05-reporting.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws report --help` / `dws shortcut list --service report` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws report --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws report --help` / `dws shortcut list --service report` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws report --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-sheet/SKILL.md b/skills/multi/dingtalk-sheet/SKILL.md
index f02eeb0f..f8496517 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` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[sheet.md](references/sheet.md);URL 识别与类型探测:[url-patterns.md](references/url-patterns.md)。
@@ -28,9 +28,9 @@ metadata:
输入含 `alidocs.dingtalk.com` URL 时,该域名下存在多种路径格式:`/i/p/...`(分享短链)、`/i/nodes/...`(节点链接,类型需探测)、`/spreadsheetv2/...`(电子表格直链,直接路由到 `sheet`)、`/document/edit|preview?dentryKey=...`(文档链接,路由到 `dingtalk-doc`)等。**必须先读 [url-patterns.md](references/url-patterns.md) 中的「alidocs URL 分流决策」**,按规则识别 URL 类型;仅当确认是在线电子表格(`/spreadsheetv2/...` 或 `i/nodes/` 且 probe 出 `contentType=ALIDOC` + `extension=axls`)时,才继续走本 skill 的命令。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws sheet --help` / `dws shortcut list --service sheet` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws sheet --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws sheet --help` / `dws shortcut list --service sheet` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws sheet --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-skill/SKILL.md b/skills/multi/dingtalk-skill/SKILL.md
index 8075e89f..048bc07d 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` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[skill.md](references/skill.md)。
diff --git a/skills/multi/dingtalk-todo/SKILL.md b/skills/multi/dingtalk-todo/SKILL.md
index 995f67b3..d67e2942 100644
--- a/skills/multi/dingtalk-todo/SKILL.md
+++ b/skills/multi/dingtalk-todo/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[todo.md](references/todo.md);剧本:[02-task.md](references/02-task.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws todo --help` / `dws shortcut list --service todo` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws todo --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws todo --help` / `dws shortcut list --service todo` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws todo --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dingtalk-wiki/SKILL.md b/skills/multi/dingtalk-wiki/SKILL.md
index 17b7c9a9..1c346631 100644
--- a/skills/multi/dingtalk-wiki/SKILL.md
+++ b/skills/multi/dingtalk-wiki/SKILL.md
@@ -18,15 +18,15 @@ metadata:
-> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。本期真实测试未通过的 shortcut 会从 `--help` 和 `dws shortcut list` 默认视图隐藏;Agent 不应主动推荐隐藏命令,内部排查 / 下期修复才使用 `dws shortcut list --include-hidden`。
+> ⚠️ **命令可用性以当前 dws 二进制为准**。服务发现已下线,本文档随内置 skill 发布;如果 `dws --help` 不存在,说明当前版本未暴露该命令。若命令存在但调用失败,请按错误中的 endpoint 或 tool 提示确认静态端点目录和后端工具注册。实际调用前可用 `dws --help` 或 `--dry-run` 验证。
> 命令参考:[wiki.md](references/wiki.md)。
-## Shortcuts(本期可见,优先使用)
+## Shortcuts(优先使用)
-以下 shortcut 已通过本期真实测试并在默认 `dws wiki --help` / `dws shortcut list --service wiki` 中可见。用户意图命中时优先使用 shortcut;具体 flags 以 `dws wiki --help` 为准。未列出的同产品 shortcut 属于本期隐藏项,不在业务执行时主动推荐。
+以下 shortcut 来自当前公开 catalog,并可通过 `dws wiki --help` / `dws shortcut list --service wiki` 发现。用户意图命中时优先使用 shortcut;具体 flags 以 `dws wiki --help` 为准。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
diff --git a/skills/multi/dws-shared/SKILL.md b/skills/multi/dws-shared/SKILL.md
index b36671a8..85938166 100644
--- a/skills/multi/dws-shared/SKILL.md
+++ b/skills/multi/dws-shared/SKILL.md
@@ -25,12 +25,11 @@ metadata:
- 全局 `--profile <名称|corpId>`:单次指定本命令用哪个组织,一次性、不改默认组织
- 危险 / 写 / 删操作执行前先向用户确认
-## Shortcut 可用性与隐藏规则
+## 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`。
+- 如果 shortcut 不在 help / list 中,改用产品参考里的原子命令、脚本或标准流程;不要猜测未展示的 `+` 命令。
## 多组织 / --profile(关键规则)
dws 可同时登录多个钉钉组织,一个 profile = 一个已登录组织(corp)。当前 profile 决定本次命令用哪个组织的身份(corpId / userId 自动注入)。