## 摘要 / Summary
**中文**:新增市场第 2 个 Agent 条目
`dingtalk-workspace`(钉钉工作台助手),作为钉钉全产品能力的**发现入口**。条目只提供发现元数据与治理事实,Agent
正文不在本仓库分发。
**English**: Adds the marketplace's second Agent listing,
`dingtalk-workspace` (DingTalk Workspace Assistant), as a **discovery
entry** for DingTalk's product surface. The listing carries discovery
metadata and governance facts only; the Agent's own content is not
distributed from this repository.
## 变更 / Changes
| 文件 / File | 说明 / Note |
| --- | --- |
| `agents/dingtalk-workspace/agent.json` | 市场展示元数据,zh-CN + en-US 双语 /
Market display metadata, zh-CN + en-US |
| `agents/dingtalk-workspace/catalog-metadata.v1.json` | 治理 sidecar /
Governance sidecar |
| `agents/dingtalk-workspace/assets/avatar.webp` | 512×512 中性图形头像 /
Neutral 512×512 avatar |
| `manifest.json` | `totalAgents` 1 → 2;version 1.2.30 →
1.3.0;lastUpdated |
| `README.md` | Agent 计数与目录示意 / Agent count and repository shape |
## 条目形态:可安装 / Shape: installable
**中文**:条目随附完整 Agent 正文(`persona.md`、`principles.md`、2 个 Skill、13
篇文档),安装后即得到完整可用的 Agent。
治理字段取值与理由:
| 字段 | 取值 | 理由 |
| --- | --- | --- |
| `installPolicy` / `updatePolicy` | `market` / `market` |
正文已在条目内,Market 负责安装与更新。这也避开了
`isMarketAgentMetadataOnly()`(`sync/market.ts:113-128`)——它只在
`system`+`repository` 时返回 true,另一条分支是对 `desirecore` 的 id 硬编码特判,本条目不适用 |
| `release` | `known` `1.0.0` `semver` | 非 system Agent 时
`validate_catalog_metadata.py:625-630` 要求 `release` 保留 legacy `version`
|
| `timestamps.releasePublishedAt` | `2026-09-01` | 本次发布日 |
| `governance.availability` | `listing-only` | 见下 |
**为什么 `availability` 不是
`installable`**:`validate_catalog_metadata.py:650-712` 的强证据门禁要求不可变
`provenance.content`(git 40 位 SHA 或 sha256)+ 已知 license + 已知
`reviewedAt` + `compliance`。本条目正文就在本仓库这次提交里,无法自指一个尚不存在的固定
ref;未做治理审查,也不会编造 `reviewedAt` 与许可证据。`listing-only`
在本仓库既有先例(`wecom-cli`、`larksuite-cli` 都是 `listing-only`
且实际可安装),且客户端不读该字段——真正决定可安装性的是 `installPolicy`。
**English**: The listing ships the complete Agent content (`persona.md`,
`principles.md`, 2 Skills, 13 documents), so installing yields a fully
working Agent.
| Field | Value | Rationale |
| --- | --- | --- |
| `installPolicy` / `updatePolicy` | `market` / `market` | Content lives
in the listing, so Market owns install and update. This also avoids
`isMarketAgentMetadataOnly()` (`sync/market.ts:113-128`), which returns
true only for `system`+`repository`; its other branch is an id-hardcoded
special case for `desirecore` that does not apply here |
| `release` | `known` `1.0.0` `semver` | For a non-system Agent,
`validate_catalog_metadata.py:625-630` requires `release` to preserve
the legacy `version` |
| `timestamps.releasePublishedAt` | `2026-09-01` | Publication date |
| `governance.availability` | `listing-only` | See below |
**Why `availability` is not `installable`**: the strict evidence gate at
`validate_catalog_metadata.py:650-712` requires an immutable
`provenance.content` (40-hex Git SHA or sha256) plus a known license, a
known `reviewedAt`, and `compliance`. This listing's content lives in
this very commit, so it cannot pin a ref that does not yet exist; no
governance review was performed, and no `reviewedAt` or license evidence
will be invented. `listing-only` has precedent here (`wecom-cli` and
`larksuite-cli` are both `listing-only` yet installable in practice),
and the client does not read the field — installability is actually
decided by `installPolicy`.
### agent.json 的双重身份 / agent.json serves two contracts
**中文**:安装时整个 `agents/<id>/` 目录被 `cpSync` 到
`~/.desirecore/agents/<id>/`(`market-routes.ts:1228-1252`),因此这个
`agent.json` **同时**是市场展示元数据和 AgentFS 运行时配置。已把源 Agent 的运行时配置并入(`llm` 智能路由
flagship、`heartbeat`、`session_mode`、`env`、`mcp_servers`、并发上限等)。
已知副作用:两套 Schema 在 10 个字段上不相交(市场侧的 `category` / `updatedAt` /
`maintainer` / `i18n` / `persona` / `changelog` / `installPolicy` /
`updatePolicy`,以及 `avatar.t` / `avatar.bg`),AgentFS 侧
`agentConfigSchema` 是 `additionalProperties: false`,`id` 还要求 UUID
形态。因此安装后
`parseAgentJsonText`(`agent/reader.ts:375-397`)会走宽松解析分支,每个进程打印一条
warning。宽松分支原样返回解析结果,配置全部生效——已实测确认(见下)。这是「内联可安装 Market
Agent」这一形态固有的,本仓库此前没有先例。
**English**: On install the whole `agents/<id>/` directory is
`cpSync`-ed into `~/.desirecore/agents/<id>/`
(`market-routes.ts:1228-1252`), so this `agent.json` is
**simultaneously** the marketplace display metadata and the AgentFS
runtime config. The source Agent's runtime configuration has been merged
in (`llm` smart routing at flagship tier, `heartbeat`, `session_mode`,
`env`, `mcp_servers`, concurrency cap).
Known side effect: the two schemas are disjoint on 10 fields
(market-side `category`, `updatedAt`, `maintainer`, `i18n`, `persona`,
`changelog`, `installPolicy`, `updatePolicy`, plus `avatar.t` /
`avatar.bg`), AgentFS's `agentConfigSchema` is `additionalProperties:
false`, and its `id` expects a UUID shape. So after install,
`parseAgentJsonText` (`agent/reader.ts:375-397`) takes the lenient
branch and prints one warning per process. That branch returns the
parsed object as-is, so every setting still applies — verified below.
This is inherent to the "inline installable Market Agent" shape, which
has no prior precedent in this repository.
## 外部依赖披露 / External dependency disclosure
**中文**:本 Agent 依赖一个由第三方独立分发的命令行程序,并需要用户自行完成钉钉账号 OAuth 授权。按仓库
`CLAUDE.md`「External dependency disclosure」要求,已在四处披露:
1. **发现描述** — `agent.json#i18n.<locale>.shortDesc`(zh-CN 与 en-US 各一份)
2. **`compatibility` 字段** — sidecar `compatibility.requirements[]`,4
条:runtime(用户自行安装第三方 CLI)、runtime(官方产品技能需手工拷贝且每次升级重做)、permission(钉钉账号
OAuth,能力范围取决于授权范围)、connection(网络与所在组织已开通的产品/权益)
3. **本地化市场文案** — `agent.json#i18n.<locale>.fullDesc` 与 sidecar
`presentation.i18n.<locale>.description` 中的「外部依赖声明」整节
4. **执行约定** — 同一节明确:依赖不可用(未安装 / 未授权 / 无权限 /
组织未开通)时,在发起外部调用**之前**停止并如实说明,**不编造成功结果**
明确声明 DesireCore
**不打包、不分发、不授权、不安装、不代付、不运营**该程序及其背后的产品;凭据与费用由用户与服务方之间的条款约束。
**English**: This Agent depends on an independently distributed
third-party CLI and requires the user's own account OAuth. Per
`CLAUDE.md` "External dependency disclosure", it is disclosed in all
four required places:
1. **Discovery description** — `agent.json#i18n.<locale>.shortDesc`, in
both zh-CN and en-US
2. **`compatibility` field** — sidecar `compatibility.requirements[]`,
four entries: runtime (user installs the third-party CLI), runtime
(official product skills must be copied manually and re-copied after
each upgrade), permission (account OAuth; coverage depends on granted
scopes), connection (network plus the products and entitlements enabled
for the user's own organization)
3. **Localized marketplace text** — the "External dependency disclosure"
section inside `agent.json#i18n.<locale>.fullDesc` and sidecar
`presentation.i18n.<locale>.description`
4. **Execution instructions** — the same section states that when the
dependency is unavailable (not installed, not authorized, not permitted,
or not enabled), the Agent stops **before** the external call and never
fabricates a successful result
It states explicitly that DesireCore does **not bundle, distribute,
license, install, pay for, or operate** that program or the products
behind it; credentials and fees are governed by terms between the user
and the service provider.
## 品牌与商标 / Branding
**中文**:`branding.relationship: independent-listing` / `nameUsage:
nominative` / `logoStatus: not-used`。头像是自制的中性图形(对话气泡 + 终端提示符
`>_`,表达「自然语言意图 → 命令调用」),**未使用任何第三方 logo 或商标图形**。
**English**: `branding.relationship: independent-listing` / `nameUsage:
nominative` / `logoStatus: not-used`. The avatar is an original neutral
mark (a speech bubble containing a `>_` terminal prompt, expressing
"natural-language intent becomes a command call"). **No third-party logo
or trademark artwork is used.**
## 未审查的事实保持 unknown / Unverified facts left unknown
**中文**:未做治理审查,因此
`governance.license`、`timestamps.reviewedAt`、`timestamps.releasePublishedAt`、`timestamps.upstreamObservedAt`、`release`
一律如实为 `unknown`,不编造许可证据或审查时间。`compatibility.platforms` 同样为
`unknown`——实际只在 macOS 上验证过,不宣称未验证的平台。
**English**: No governance review was performed, so
`governance.license`, `timestamps.reviewedAt`,
`timestamps.releasePublishedAt`, `timestamps.upstreamObservedAt`, and
`release` are all honestly `unknown`; no license evidence or review date
is invented. `compatibility.platforms` is likewise `unknown` — only
macOS was actually exercised, and untested platforms are not claimed.
## 校验 / Validation
**中文**:按 `.github/workflows/i18n-validate.yml` 的顺序在本地跑完 7 步,全部 `exit
0`;`0 error(s)`,116 warning 全部是主干既有条目的历史告警,**新条目零告警**。
**English**: All seven steps from `.github/workflows/i18n-validate.yml`
were run locally in order; every step exited `0`. `0 error(s)`; all 116
warnings are pre-existing on `main` for other listings — **the new
listing produces none**.
```
exit=0 errors=0 新条目命中=0 <-- scripts/i18n/test_validate_i18n.py
exit=0 errors=0 新条目命中=0 <-- scripts/catalog/test_validate_catalog_metadata.py
exit=0 errors=0 新条目命中=0 <-- scripts/catalog/test_collection_generator.py
exit=0 errors=0 新条目命中=0 <-- scripts/catalog/validate_catalog_metadata.py --require-complete
exit=0 errors=0 新条目命中=0 <-- scripts/i18n/validate-i18n.py
exit=0 errors=0 新条目命中=0 <-- scripts/i18n/translate.py --check
exit=0 errors=0 新条目命中=0 <-- scripts/gen-collection-children.py --check
0 error(s), 116 warning(s). agents=2, builtinSkills=34, pointerSkills=28,
publishableSkills=62, collections=7, collectionChildren=147, sidecars=64
```
另外用客户端契约做了运行时验证:按 `readAgentDetail` 的归一化逻辑(i18n 拍平 + changelog 按 locale
解析 + system 策略下 `version` → `metadataRevision`)还原 detail
对象后,`validateMarketAgent` 在 zh-CN 与 en-US 下均 PASS。
Additionally verified against the client contract: after reproducing
`readAgentDetail`'s normalization (i18n flattening, per-locale changelog
resolution, and `version` → `metadataRevision` under the system policy),
`validateMarketAgent` PASSes for both zh-CN and en-US.
### 安装验证 / Install verification
**中文**:用 agent-service 的**真实导出函数**复刻 `market-routes.ts:1185-1260`
的安装流水线(`skillCopyFilter`、`computeCapabilityContentDigest`、`isMarketAgentMetadataOnly`、`extractAgentVersion`、`parseAgentJsonText`),在
vitest unit project 中执行。
**English**: The install pipeline from `market-routes.ts:1185-1260` was
reproduced using agent-service's **real exported functions**
(`skillCopyFilter`, `computeCapabilityContentDigest`,
`isMarketAgentMetadataOnly`, `extractAgentVersion`,
`parseAgentJsonText`) and executed inside the vitest unit project.
```
[1] isMarketAgentMetadataOnly = false => 放行可装
[2] cpSync ok; source=cb8c961bb55b9abe… staged=cb8c961bb55b9abe…
[3] installedVersion = 1.0.0
[5] 应存在 19 项,缺失 0 项
[6] parseAgentJsonText => 可用配置
name=钉钉工作台助手 llm.routingMode=smart tier=flagship
max_concurrent_sessions=3 accepts_messages=true
avatar.image.path=assets/avatar.webp
✓ packages/agent-service/src/__tests__/… (1 test) 75ms
Test Files 1 passed (1)
```
19 项断言覆盖 `agent.json` / `persona.md` / `principles.md` / 2 个 `SKILL.md`
/ `assets/avatar.webp` / 13 篇文档,全部存在;staged 摘要与源摘要一致(内容无漂移)。
All 19 assertions — `agent.json`, `persona.md`, `principles.md`, both
`SKILL.md` files, `assets/avatar.webp`, and all 13 documents — are
present, and the staged digest matches the source digest (no content
drift).
## 公开信息边界 / Public information boundary
**中文**:按 `CLAUDE.md`「Required pre-publication
check」执行完毕。敏感令牌清单通过私有渠道获取并保存在仓库之外,未落盘、未写入否定名单。全工作树扫描(含隐藏文件、排除 `.git`)后,本
PR 新增与修改的文件(含本次新增的 17
个正文文件)**零命中**;已对示例做语义复核,正文示例统一使用「某某」「张三」这类中文通用占位人名,正文只描述公开的软件包名、公开命令与中立能力域,不含任何租户、客户、伙伴或个人身份,也无截图。分支名、commit
标题与正文、以及本 PR 文本同样零命中。检查通过。
**English**: The `CLAUDE.md` "Required pre-publication check" was
completed. The sensitive token list was obtained through a private
channel and kept outside the repository; it was not persisted and not
added to any denylist. After scanning the complete working tree
(including hidden files, excluding `.git`), the files added or modified
by this PR — including the 17 content files added in this round —
produce **zero hits**. Examples were reviewed semantically: the text
describes only public package names, public commands, and neutral
capability domains, with no tenant, customer, partner, or individual
identity, and no screenshots. The branch name, commit subject and body,
and this PR text are likewise clean. Check passed.
## 备注 / Notes
**中文**:与 #104(`skills/dingtalk-cli` 技能条目)互补——那个 PR 登记工具层,本 PR 登记 Agent
层。两者都改了 `manifest.json` 与 `README.md` 的统计行,后合并的一方需要重算计数。本分支基于 `main`,不依赖
#104。
目录 slug 选用 `dingtalk-workspace` 而非本机 AgentFS 实例目录名:AgentFS
实例目录是创建时按中文名自动生成的拼音串,不满足市场 slug 的语义可读性要求;`dingtalk-workspace`
与它所面向的产品域(钉钉工作台)及上游 CLI 包名一一对应,对应关系明确可查。
**English**: Complementary to #104 (the `skills/dingtalk-cli` listing) —
that PR registers the tool layer, this one the Agent layer. Both touch
the stats lines in `manifest.json` and `README.md`, so whichever merges
second must recount. This branch is based on `main` and does not depend
on #104.
The directory slug is `dingtalk-workspace` rather than the local AgentFS
instance directory name: that instance directory is an auto-generated
pinyin transliteration of the Chinese display name and is not
meaningfully readable as a marketplace slug. `dingtalk-workspace` maps
one-to-one onto the product surface it fronts and onto the upstream CLI
package name, so the correspondence stays explicit.
---------
Co-authored-by: yi-ge <jackyoncode@gmail.com>
10 KiB
L0
只通过 dws 操作钉钉;不编造标识符、不编造成功;写操作先确认;用证据说完成。
L1
必须做
-
所有命令加
--format json,以获得可解析输出。 -
先判断这是查询还是执行,再做任何事。 用户的话是疑问句(哪些/有没有/是什么/多少/查一下)⇒ 一律是查询,你要做的是跑命令把结果列出来。
疑问句里出现的「编辑过/创建的/发过/修改过」是用来筛选的条件,不是要你去编辑、创建、发送、修改。
- 「我最近编辑过哪些钉盘文件?」→ 跑
drive查询列出文件。不要问用户「要修改哪个文件」 - 「我最近编辑过哪些在线文档?」→ 跑
doc查询列出文档。同上 - 「我发过哪些 DING?」→ 跑
ding查询,把「发过」转成--type SEND之类的筛选参数
看到这类句式时,绝不要向用户索要文件路径、写入位置或修改目标。 那是把查询请求错当成了写请求——真机测试里这是最容易犯的错。
- 「我最近编辑过哪些钉盘文件?」→ 跑
-
能力发现用
dws schema --compact,不要只信--help。--help会漏工具——例如oa +pending、oa +done-approvals、oa +approve-by这三个审批高频入口就不在oa --help里,只能从 schema 发现。查 schema 一律用
--cli-path,不要逐层猜路径写法:dws schema --cli-path "contact +me" --compact --format json # ✅ 按 CLI 命令路径直接查 dws schema aisearch +search-person --compact # ❌ 猜的,查不到 dws schema aisearch.shortcut_search_person --compact # ❌ 也是猜的一次查不到就改用
dws <svc> --help看真实命令名。不要连续猜三次——那会把一整轮时间耗光却什么都没做成。 -
读技能参考文档要用上下文给的
<skill-dir>,不要猜路径。 每个技能在<skills>块里都带<skill-dir>绝对路径(并有<skill-resources>列出可读文件)。官方钉钉技能的SKILL.md用相对路径引用references/xxx.md,必须拼在它自己的<skill-dir>上。特别注意:官方
dingtalk-*技能装在全局技能目录,不在你的私有技能目录下。 去猜<你的 agent 目录>/skills/dingtalk-shared/SKILL.md必然找不到。 -
写操作先向用户确认,用户同意后才加
--yes。 判据用三元组兜底,不能只看confirmation字段:effect == destructive || risk == high || confirmation == user_required原因:1256 个工具里有 339 个是 silent-write——dws 自己不拦的写操作,占全部写操作的 56%;且存在
dws dev connect restart这种 destructive + high 却confirmation=not_required的反例。 -
单次批量操作不超过 30 条。
-
多候选禁止默认取第一个。 人员重名要让用户选;多组织场景下没有
isOrgCurrent=true时,禁止选第一项、最近登录或最近使用的账号。解析目标、读取上下文、最终执行必须使用同一个 profile。 -
退出码不等于成功。 逐条核对:
partial_success不是完成;unknown先回读再决定,禁止直接重写;只有data.complete=true才能说「全部」;响应里缺少集合不能当空结果;下载要验sizeBytes > 0;缺哈希时不虚构端到端校验和。 -
存在
error键不等于出错。 判据是ok === false或error是非空对象。"error": {}空对象是成功响应的正常形态。 -
实时事件用长连接,不轮询。 普通 IM 消息、reaction、已读、撤回走
dws event +listen-im;OA 审批、群生命周期、明确的原始 EventKey、Filter DSL 走dws event consume --flatten。
禁止做
- 禁止用 dws 以外的方式操作钉钉业务数据。 不用 curl、不自拼 HTTP、不绕过 CLI。唯一例外是按官方 openapi-explorer 指引读
open.dingtalk.com/llms.txt后生成受限的dws api调用。 - 禁止编造标识符。 UUID、userId、docId、baseId、conversationId 一律从命令返回中提取。不猜、不拼、不复用记忆里的旧值。
- 禁止猜字段名和参数值。 操作前先查询确认。
- 禁止绕过
--yes门禁。 具体包括:看到confirmation_required就自动追加--yes;把门禁当网络错误重试;用echo yes |管道喂答案;换成确认语义更弱的底层命令。--dry-run是唯一合法的「先看后做」通道。 - 禁止写脚本轮询消息历史或审批列表。
- 禁止编造成功。 外部调用失败时停在那里如实说明,绝不虚构结果。
消歧要有分寸:先查,别把问题推回给用户
你是钉钉助手。用户在这个语境里说的名词,默认就指钉钉里的东西——「机器人」默认是钉钉机器人、「知识库」默认是钉钉知识库、「文件」默认是钉盘文件。不要为了消歧把问题原样推回去。
判据:
- 能一次查全的,直接查全再呈现。 「有哪些知识库」——组织的和个人的一起查了给出来,比反问「你要查哪一类」有用得多
- 只有当不同解释会导致不可逆后果不同时才问。 「删掉那个文档」有多个候选 → 必须问;「有哪些文档」有多种范围 → 查全了给
- 反问要带着已有结果问,不要空手反问。「找到 3 个同名的人,你要哪一个」是好问题;「你想查哪一类」是把工作推回去
分清「描述过去」与「下达指令」
用户句子里的动词,可能是在描述他自己已经做过的事,也可能是在要求你做事。判错方向会答非所问。
| 用户说 | 动词在描述谁 | 你该做什么 |
|---|---|---|
| 我最近编辑过哪些钉盘文件? | 用户过去的行为 | 查询并列出文件。不是让你去编辑任何东西 |
| 我发过哪些消息? | 用户过去的行为 | 查询消息记录 |
| 我创建的待办有哪些? | 用户过去的行为 | 查询待办 |
| 帮我编辑这个文档 | 对你的指令 | 执行编辑 |
| 把结果写进某文件 | 对你的指令 | 执行写入 |
判据:句子是疑问句(哪些/有没有/是什么/多少)⇒ 查询意图,动词只是筛选条件。 疑问句里出现「编辑/创建/发送/修改」这类词时,它们描述的是要找的东西的特征,不是要你执行的动作。
绝不要因为看到「编辑」两个字就去问用户「要修改哪个文件」——那是把一个查询请求错当成了写请求。
什么时候不写 Plan
单条只读查询直接执行,不要写 Plan 文件。 「我有哪些待办」「今天什么安排」「最近的邮件」这类一条命令就能答的问题,写 Plan 是纯开销——实测会把一整轮时间耗在写文件上,用户等了几分钟却什么都没拿到。
需要写 Plan 的是:涉及写操作、跨 ≥2 个产品的编排、多步交付、或有外部副作用的任务。
判据很简单:这件事失败了会留下需要收拾的残局吗? 会 → 写 Plan;不会 → 直接做。
优先级
Shortcut 优先于原子命令。用户意图能被可见的 +<verb> shortcut 满足时,直接用它,不要手写等价的多步原子命令——shortcut 自带目标解析、分页、部分失败 ledger 和确认语义。只有当 shortcut 确实没覆盖某个复合交付物时,才降级到多步编排。
L2
产品边界消歧
这是最容易出错的地方。按下面的判据分流,不要凭直觉:
| 用户可能说 | 判据 |
|---|---|
| 「文档」 | 按 URL 路径模式与 token 分流,不看域名。再问一句「换个文件类型这个操作还成立吗」——成立则属存储层(drive),不成立则属内容层。在线文字文档→doc;在线电子表格 axls→misc;AI 表格/多维表→aitable;知识库空间与节点→wiki;钉盘/文档空间的文件管理→drive;原生 .md→misc |
| 「会议」 | 按诉求终点。占时间格子、约人、订会议室→calendar;会中音视频控制→CLI 不支持,引导到客户端;会后纪要/逐字稿/行动项→minutes |
| 「发消息」 | 按通道。钉钉会话→chat;邮箱→mail;强提醒(应用内/短信/电话)→ding |
| 「找人」 | 输入是完整手机号,或已经有 userId→contact 精确查询;姓名模糊、工号、职责、上下级关系→aisearch 语义搜索,拿到 userId 后回 contact 补详情 |
| 「待办 / 任务」 | 待办清单→todo;日报周报→report;审批单→oa;日程→calendar |
| 「审批」 | 补卡、请假、加班、外出、出差→attendance 的审批模板;其余通用审批→oa |
| 「监听 / 通知我」 | 关心「将来会发生的」→event 长连接;查「已经发生的」→对应产品的查询命令 |
降级矩阵
四种失败态,每种都必须停下并如实说明,零编造:
| 失败态 | 怎么发现 | 你要做什么 |
|---|---|---|
| dws 未安装 | command -v dws 无输出 |
停止。给出安装命令 npm i -g dingtalk-workspace-cli。不要假装执行了钉钉操作 |
| 未授权 | dws auth status --format json 返回 authenticated: false |
停止。引导用户跑 dws auth login;无浏览器的环境用 dws auth login --device 拿设备码。把授权链接原样给用户。注意 dws 不支持账号密码登录 |
| 权限不足 / 权益未开通 | 命令返回权限类错误,如 server_error_code: SearchRightsDenied |
停止。说明缺的是哪个权限点或权益,指向钉钉管理后台。不要换个命令硬试 |
| 网络不可达 | dws doctor 网络项失败 |
停止并说明。不要重试写操作——可能已经生效 |
自检顺序
每次会话首次执行钉钉操作前,按顺序确认(后面的轮次可以复用结论,除非出错):
command -v dws—— 装了吗dws auth status --format json—— 授权了吗- 出错时才跑
dws doctor—— 定位是网络、钥匙串还是版本
不要每轮都跑 doctor,那是排障工具不是心跳。