From 6de77f4c340fdb0ea8c19b56a1b268902d11a281 Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 15 Jul 2026 17:02:42 +0800 Subject: [PATCH] docs: present shortcut catalog without hidden release wording Replace release-hidden terminology with a generated public shortcut catalog, remove include-hidden discovery, and keep real-test followups as an internal CR artifact. --- docs/shortcut-public-catalog.json | 1476 +++++++++++++++++ ...json => shortcut-real-test-followups.json} | 2 +- ...den.md => shortcut-real-test-followups.md} | 8 +- internal/shortcut/public_catalog.go | 25 + internal/shortcut/public_catalog_generated.go | 218 +++ internal/shortcut/register.go | 2 +- internal/shortcut/release_gate.go | 23 - internal/shortcut/release_hidden_generated.go | 166 -- internal/shortcut/usage/command.go | 23 +- ...dden.py => gen_shortcut_public_catalog.py} | 96 +- scripts/gen_skill_shortcut_sections.py | 30 +- skills/mono/SKILL.md | 13 +- skills/multi/dingtalk-agoal/SKILL.md | 2 +- skills/multi/dingtalk-aisearch/SKILL.md | 2 +- skills/multi/dingtalk-aitable/SKILL.md | 6 +- skills/multi/dingtalk-attendance/SKILL.md | 6 +- skills/multi/dingtalk-calendar/SKILL.md | 6 +- skills/multi/dingtalk-chat/SKILL.md | 6 +- skills/multi/dingtalk-contact/SKILL.md | 6 +- skills/multi/dingtalk-dev/SKILL.md | 4 +- skills/multi/dingtalk-devdoc/SKILL.md | 2 +- skills/multi/dingtalk-ding/SKILL.md | 6 +- skills/multi/dingtalk-doc/SKILL.md | 6 +- skills/multi/dingtalk-drive/SKILL.md | 6 +- skills/multi/dingtalk-live/SKILL.md | 2 +- skills/multi/dingtalk-mail/SKILL.md | 6 +- skills/multi/dingtalk-minutes/SKILL.md | 6 +- skills/multi/dingtalk-oa/SKILL.md | 6 +- skills/multi/dingtalk-report/SKILL.md | 6 +- skills/multi/dingtalk-sheet/SKILL.md | 6 +- skills/multi/dingtalk-skill/SKILL.md | 2 +- skills/multi/dingtalk-todo/SKILL.md | 6 +- skills/multi/dingtalk-wiki/SKILL.md | 6 +- skills/multi/dws-shared/SKILL.md | 5 +- 34 files changed, 1854 insertions(+), 337 deletions(-) create mode 100644 docs/shortcut-public-catalog.json rename docs/{shortcut-next-release-hidden.json => shortcut-real-test-followups.json} (99%) rename docs/{shortcut-next-release-hidden.md => shortcut-real-test-followups.md} (99%) create mode 100644 internal/shortcut/public_catalog.go create mode 100644 internal/shortcut/public_catalog_generated.go delete mode 100644 internal/shortcut/release_gate.go delete mode 100644 internal/shortcut/release_hidden_generated.go rename scripts/{gen_shortcut_release_hidden.py => gen_shortcut_public_catalog.py} (60%) 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 自动注入)。