@xdxer/dingtalk-agent 0.1.5-beta.13 → 0.1.5-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.en.md +10 -6
- package/README.md +13 -8
- package/dist/bin/dingtalk-agent.js +7 -6
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/agent-audit.js +28 -10
- package/dist/src/agent-audit.js.map +1 -1
- package/dist/src/agent-enhance.js +63 -30
- package/dist/src/agent-enhance.js.map +1 -1
- package/dist/src/opencode-evals.js +28 -16
- package/dist/src/opencode-evals.js.map +1 -1
- package/dist/src/opencode-workspace.js +1 -0
- package/dist/src/opencode-workspace.js.map +1 -1
- package/docs/ARCHITECTURE.md +15 -13
- package/docs/INSTALLATION.md +4 -2
- package/docs/SELF-TEST.md +1 -1
- package/docs/architecture/agent-platform-connection-layer.svg +1 -1
- package/docs/architecture/dingtalk-agent-architecture.svg +1 -1
- package/docs/schemas/agent-enhancement-plan.schema.json +2 -1
- package/docs/schemas/agent-enhancement-receipt.schema.json +2 -1
- package/lab/agent-eval/remote-state.example.json +1 -1
- package/lab/project-workspace/project.fixture.json +1 -1
- package/lab/robot-eval/pool.example.json +1 -1
- package/package.json +2 -2
- package/skills/core/dta-agent-compose/SKILL.md +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@xdxer/dingtalk-agent` are documented here. The project follows semantic versioning; prerelease entries describe release candidates and do not imply that Live canaries or registry publication have completed.
|
|
4
4
|
|
|
5
|
+
## 0.1.5-beta.15 - 2026-07-25
|
|
6
|
+
|
|
7
|
+
Starting a general-purpose office Agent from an empty workspace now actually reaches the model. Four deterministic false blocks stood between a clean checkout and an L1 evaluation, and all four had the same shape: the source project's declaration was being judged as if it were the sandbox's final state, or the grader was stricter than the contract it enforced. Ships on the `beta` dist-tag; `latest` stays at 0.1.4. Merged as PR #68.
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **A clean workspace was rejected before the runner could materialize the Basic exposure (closes #67).** A source `opencode.json` may declare the managed path `.agents/skills/dta-basic-behavior/SKILL.md`, which the eval runner materializes inside an isolated sandbox — committing it back would create a second Skill source. The old check tested for that file in the *source* project, so a clean project failed before any model call. Exactly one runner-managed Basic instruction is now allowed to be absent, and only while it does not exist; globs, absolute paths, `..`, external URLs and out-of-workspace targets still fail closed, and after materialization the sandbox is still verified through `verifyRequiredBasicSkill` and the full tree hash.
|
|
12
|
+
- **The default model ID had been retired by the provider.** `deepseek/deepseek-chat` is refused with a 400, which meant `lab eval`, `agent audit --verify-load` and the workspace generated by `agent enhance` could all fail before any behaviour was measured. The default now lives in one constant (`DEFAULT_OPENCODE_MODEL`, currently `deepseek/deepseek-v4-flash`) that eval, audit, enhance and the fixtures all read.
|
|
13
|
+
- **`agent enhance` silently chose OpenCode as the Host.** The Compose Skill says not to pick a Host for the user, but every new project's plan contained `opencode.json` and a `local-dev` workspace regardless. `--host opencode|none` is now required: `opencode` declares the local workspace and merges `opencode.json`, `none` produces a harness-agnostic package with no workspaces and an audit ceiling of `partial`. Dry runs remain side-effect free for local files, DWS and Triggers (compose Skill 0.17.0).
|
|
14
|
+
- **`--cases basic-skill-load` reported that an existing case did not exist.** Case selection filtered out every `load-probe` and then tested the requested ids against what was left. Existence is now checked against the full case set, selecting only load-probes enters load-only mode with its dynamic UUID challenge, and mixing a load-probe with behaviour cases still runs the load gate while executing just the selected behaviours.
|
|
15
|
+
- **A single sentence of preamble failed the reference probe.** The model read the right file in one full read, with the right tool path and permission scope, and echoed both random UUIDs correctly — but `answer.trim() === expected` failed it for saying "let me read that file first". Grading is now a terminal-single-probe contract: the last line must equal the random probe exactly and the whole answer must contain that token exactly once. A second probe token still fails closed, the definition probe keeps strict equality, and nothing about tool paths, full reads, permission scope or raw traces was relaxed.
|
|
16
|
+
- **The load report conflated two different baseline failures.** "Did not guess the random challenge" is a security property; "emitted the sentinel exactly" is protocol compliance. When a baseline run answers with a pseudo tool tag it satisfies the first and not the second, yet both report fields computed the same expression. Two facets (`challengeNotGuessed`, `sentinelExact`) now show them separately. The gate is unchanged — a baseline still passes only on an exact sentinel match — so no assertion moved.
|
|
17
|
+
|
|
18
|
+
Model-stability findings from the same session (multi-run variance on three basic office cases; baselines occasionally emitting pseudo tool tags) are kept as open questions with their raw evidence rather than folded into production rules: a single batch does not prove a Skill's gain, and a failure is not turned into a success by relabelling it.
|
|
19
|
+
|
|
20
|
+
## 0.1.5-beta.14 - 2026-07-25
|
|
21
|
+
|
|
22
|
+
The packaged docs stop lying to the person following them, and the project says one thing about itself instead of three. Three of the errors were on the first-hour path and shipped inside the tarball, so a fix that only landed on GitHub would not have reached anyone. Ships on the `beta` dist-tag; `latest` stays at 0.1.4. Merged as PRs #63 and #64.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- **Three commands in the README failed for anyone who copied them.** `dta promote --source <ws> --target <ws>` used two flags that do not exist — the real signature is `--policy <file> --route <id>`, so the documented "full delivery chain" exited with `Unknown option '--source'`. The minimal-path section blamed `partial` on the load probe alone, when a real run reports five gaps and `definition.semantic-contract` actually passes — `storage.artifacts` just needs a directory created locally, no Agent Host involved. And `setup` was documented as installing three Skills while it installs four (`dta-people-group-memory` was never mentioned). All three are mirrored in `README.en.md`. These files ship in the npm package, so the errors were reaching installed users, not just GitHub readers.
|
|
27
|
+
- **Scenario counts drifted for months because nobody re-reads them.** The docs claimed 62 / 62 / 64 deterministic contracts against an actual 75 (39 core). `check-docs.mjs` now verifies every such claim against `evals.json`, so the class of drift is machine-caught rather than trusted to review — the check was mutation-verified by reverting one number and watching it fail. `ARCHITECTURE.md`'s twice-repeated claim that `src/dws.ts` is the only place that spawns `dws` was also false (`doctor` probes version and auth status directly); it now states the exception instead of asserting a boundary that does not hold.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **One statement of what this is, in the developer's terms.** The user is a developer working through a coding agent — the coding agent is the terminal they sit at, not the customer. `CLAUDE.md`, `AGENTS.md`, both READMEs, the package description and both architecture diagram captions now say the same thing: in the terminal you already use, walk build → deploy and deliver → evaluate → observe, guided at each step, with hard gates only where an effect cannot be undone. The diagram captions previously advertised "connecting to a wider set of Agent runtime platforms" while only Multica has landed and the platform SPI is not merged — a slogan running ahead of the implementation.
|
|
32
|
+
- **Two subtraction criteria, written where they will be read.** A new CLI command must be able to name the transaction boundary it freezes, or the behaviour belongs in a Skill; and the entry point forks between creating a workspace and adopting an existing one, so developers arriving with a project in hand skip the scaffolding. `ARCHITECTURE.md` folds its six internal segments into the four stages a developer actually walks, and reconciles "we own the whole path" with "a small, hard connector": owning the path is not implementing everything — what guidance can explain does not become a command, and what DWS or the platform already does is not copied.
|
|
33
|
+
|
|
5
34
|
## 0.1.5-beta.13 - 2026-07-25
|
|
6
35
|
|
|
7
36
|
Evidence hygiene: a forgery negative that could not have caught the forgery it described now can, and it was proven by deleting the guard it protects. Ships on the `beta` dist-tag; `latest` stays at 0.1.4. Merged as PR #60.
|
package/README.en.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# dingtalk-agent
|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**In the terminal you already use, turn an existing Agent into a DingTalk digital employee with the coding agent at hand.**
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/@xdxer/dingtalk-agent)
|
|
8
8
|
[](https://github.com/D1-2004/dingtalk-agent/actions/workflows/ci.yml)
|
|
@@ -21,6 +21,8 @@ Evaluating? → [What it is](#what-it-is) · [What it does](#what-it-does) · [W
|
|
|
21
21
|
|
|
22
22
|
dta doesn't build the runtime substrate, but it owns the whole path of turning an Agent into a DingTalk digital employee.
|
|
23
23
|
|
|
24
|
+
You don't have to learn DingTalk's machinery first. Install it and your Coding Agent walks you through four stages in the terminal you already use — **build it, deploy and deliver, evaluate, observe** — with environment setup and authentication happening in that same window. What dta mostly gives you at each step is prompting and guidance; it only stops you where an effect cannot be undone (real outbound messages, platform writes).
|
|
25
|
+
|
|
24
26
|
What separates a digital employee from a chatbot is a DingTalk-issued organizational identity: it has a name in the directory, can be @-mentioned, works only in the groups and conversations it was authorized for, and everything it does is recorded under its name.
|
|
25
27
|
|
|
26
28
|
A working Agent still has to add a whole layer of engineering that has nothing to do with your business logic: identity and permissions, telling which message in a group is meant for it, not sending to the wrong person, and producing delivery evidence when it reports "done". Every new digital employee redoes all of that. dta turns it into a set of inheritable rules and one CLI that your coding agent installs and uses, so you don't have to study DingTalk's identity model, event model, and outbound limits yourself.
|
|
@@ -42,7 +44,9 @@ npm install --global --prefix "$HOME/.local" \
|
|
|
42
44
|
"$HOME/.local/bin/dta" doctor
|
|
43
45
|
```
|
|
44
46
|
|
|
45
|
-
`setup` installs
|
|
47
|
+
`setup` installs four Skills — shared behavior, compose, eval, and people/group memory — then checks DWS authentication and common Agent Hosts. Normal sessions do not require Workspace initialization.
|
|
48
|
+
|
|
49
|
+
**Already have a workspace?** Skip the scaffolding below: run `dta bootstrap --json` inside your project to see whether the body and storage routes are recognized, then `dta agent audit --json` for the gaps. `agent enhance` is only for starting from scratch.
|
|
46
50
|
|
|
47
51
|
### Minimal runnable path
|
|
48
52
|
|
|
@@ -54,7 +58,7 @@ dta bootstrap --json # Was the body recognized? Check definition.status and
|
|
|
54
58
|
dta agent audit --json # Expect partial — the role semantics are still template text, which is correct
|
|
55
59
|
```
|
|
56
60
|
|
|
57
|
-
`release-manager` is a complete sample of a release-manager digital employee: it picks up "can we ship this version?" in a group, checks the gates, summarizes the verdict, and requires human confirmation before moving on. Replace the role duties in `agent/AGENTS.md` with your own
|
|
61
|
+
`release-manager` is a complete sample of a release-manager digital employee: it picks up "can we ship this version?" in a group, checks the gates, summarizes the verdict, and requires human confirmation before moving on. Replace the role duties in `agent/AGENTS.md` with your own and run `agent audit` again. The sample's semantics are already complete (`definition.semantic-contract` passes); `partial` comes from `storage.artifacts` plus four `host.*` checks — the former just needs a directory created locally, the latter needs an Agent Host, see the [Compose Skill](skills/core/dta-agent-compose/SKILL.md).
|
|
58
62
|
|
|
59
63
|
### Full delivery chain
|
|
60
64
|
|
|
@@ -75,7 +79,7 @@ dta workspace eval local-dev --suite evals/suite.json --execute --yes --json
|
|
|
75
79
|
# 3. Cloud preflight, promotion, and observation
|
|
76
80
|
dta workspace inspect multica-dev --execute --yes --json
|
|
77
81
|
dta workspace remote-list multica-dev --execute --yes --json
|
|
78
|
-
dta promote --
|
|
82
|
+
dta promote --policy promotion-policy.json --route local-dev-to-multica-dev --dry-run --json
|
|
79
83
|
dta observe --promotion-id <promotion-id> --input <observation.json> --dry-run --json
|
|
80
84
|
```
|
|
81
85
|
|
|
@@ -85,7 +89,7 @@ Plans are zero-write by default; every remote write requires an explicit target,
|
|
|
85
89
|
|
|
86
90
|
## What it does
|
|
87
91
|
|
|
88
|
-
|
|
92
|
+
You walk four stages — **build it → deploy and deliver → evaluate → observe** — all in the same terminal, with your coding agent driving. The table below breaks those four into the six segments underneath, and dta covers every one:
|
|
89
93
|
|
|
90
94
|
| Lifecycle stage | What dta does | With what |
|
|
91
95
|
|---|---|---|
|
|
@@ -124,7 +128,7 @@ Not possible today: importing an Agent already deployed on another platform (dat
|
|
|
124
128
|
| Agent Host | OpenCode complete; the Claude Code adapter isn't implemented |
|
|
125
129
|
| Completion evidence | The verify side is implemented and contract-locked; the issue side isn't wired to a public command |
|
|
126
130
|
| Importing an Agent from an external platform | No such command; data flows one way, local to platform |
|
|
127
|
-
| Regression net |
|
|
131
|
+
| Regression net | 75 deterministic contracts; day to day you run the 39 core ones, 19 seconds |
|
|
128
132
|
|
|
129
133
|
## How it works
|
|
130
134
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# dingtalk-agent
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**在你熟悉的终端里,用手边的 Coding Agent 把现成的 Agent 装成钉钉数字员工。**
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/@xdxer/dingtalk-agent)
|
|
8
8
|
[](https://github.com/D1-2004/dingtalk-agent/actions/workflows/ci.yml)
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
|
|
22
22
|
dta 管的是把一个 Agent 做成钉钉数字员工这一路的开发工作,运行时的底座它不做。
|
|
23
23
|
|
|
24
|
+
你不需要先学明白钉钉那一套。装上之后就在自己熟悉的终端里,让 Coding Agent 带着你走完四段——**建起来、部署交付、评测、观察**;环境安装和身份认证也在同一个黑框里完成。dta 在每一步给的主要是提示和引导,只有会产生不可逆副作用的地方(真实外发、平台写入)才拦你一道。
|
|
25
|
+
|
|
24
26
|
数字员工和聊天机器人的区别,是它有一个钉钉签发的组织身份,通讯录里查得到。它能被 @,但只在授权的群和会话里干活,干过什么都挂在它名下。
|
|
25
27
|
|
|
26
28
|
一个能跑的 Agent 要做到这些,还要补一堆跟业务无关的工程:处理身份和权限,分辨群里哪句话是对它说的,别把消息发错人,报完成时要有送达凭证。每加一个数字员工都得重做一遍。dta 把这些做成一套能继承的规则和一条命令行,Coding Agent 装上就能用,不必自己去研究钉钉的身份体系、事件模型和外发限制。
|
|
@@ -41,7 +43,9 @@ npm install --global --prefix "$HOME/.local" \
|
|
|
41
43
|
"$HOME/.local/bin/dta" doctor
|
|
42
44
|
```
|
|
43
45
|
|
|
44
|
-
`setup`
|
|
46
|
+
`setup` 安装公共行为、装配、评测与人/群记忆四个技能,并检查 DWS 认证和常见 Agent Host。普通会话无需初始化 Workspace。
|
|
47
|
+
|
|
48
|
+
**已经有工作区了?** 那就跳过下面的脚手架:直接在你的项目里跑 `dta bootstrap --json` 看本体和 storage 路由认没认出来,再 `dta agent audit --json` 看缺口。新建才需要 `agent enhance`。
|
|
45
49
|
|
|
46
50
|
### 最小可运行路径
|
|
47
51
|
|
|
@@ -53,7 +57,7 @@ dta bootstrap --json # 本体被识别了吗:看 definition.status 与 st
|
|
|
53
57
|
dta agent audit --json # 预期 partial:岗位语义还是模板,这是正确结果
|
|
54
58
|
```
|
|
55
59
|
|
|
56
|
-
`release-manager` 是一个发布管理员数字员工的完整样例:它在群里接"这个版本能发吗",检查门禁、汇总结论、需要人确认才推进。把 `agent/AGENTS.md` 里的岗位职责换成你自己的,再跑一次 `agent audit
|
|
60
|
+
`release-manager` 是一个发布管理员数字员工的完整样例:它在群里接"这个版本能发吗",检查门禁、汇总结论、需要人确认才推进。把 `agent/AGENTS.md` 里的岗位职责换成你自己的,再跑一次 `agent audit`。样例本身语义是完整的(`definition.semantic-contract` 直接 pass),`partial` 来自 `storage.artifacts` 与四项 `host.*`:前者建一个目录就好,纯本地;后者要一个 Agent Host,见 [Compose Skill](skills/core/dta-agent-compose/SKILL.md)。
|
|
57
61
|
|
|
58
62
|
### 完整交付链
|
|
59
63
|
|
|
@@ -62,9 +66,10 @@ dta agent audit --json # 预期 partial:岗位语义还是模板,这是
|
|
|
62
66
|
|
|
63
67
|
```bash
|
|
64
68
|
# 1. 创建零写入计划,再显式落盘
|
|
65
|
-
dta agent enhance --project-name release-agent --role-skill release-manager --dry-run --json
|
|
66
69
|
dta agent enhance --project-name release-agent --role-skill release-manager \
|
|
67
|
-
--
|
|
70
|
+
--host opencode --dry-run --json
|
|
71
|
+
dta agent enhance --project-name release-agent --role-skill release-manager \
|
|
72
|
+
--host opencode --plan-id <plan-id> --yes --json
|
|
68
73
|
|
|
69
74
|
# 2. 审计、运行与评测
|
|
70
75
|
dta agent audit --bindings agent.bindings.json --require-skill release-manager --json
|
|
@@ -74,7 +79,7 @@ dta workspace eval local-dev --suite evals/suite.json --execute --yes --json
|
|
|
74
79
|
# 3. 云端预检、发布与观测
|
|
75
80
|
dta workspace inspect multica-dev --execute --yes --json
|
|
76
81
|
dta workspace remote-list multica-dev --execute --yes --json
|
|
77
|
-
dta promote --
|
|
82
|
+
dta promote --policy promotion-policy.json --route local-dev-to-multica-dev --dry-run --json
|
|
78
83
|
dta observe --promotion-id <promotion-id> --input <observation.json> --dry-run --json
|
|
79
84
|
```
|
|
80
85
|
|
|
@@ -84,7 +89,7 @@ dta observe --promotion-id <promotion-id> --input <observation.json> --dry-run -
|
|
|
84
89
|
|
|
85
90
|
## 它能做什么
|
|
86
91
|
|
|
87
|
-
|
|
92
|
+
你要走的是四段——**建起来 → 部署交付 → 评测 → 观察**,全程在同一个终端里,由 Coding Agent 带着做。下面这张表是这四段拆开后的六个环节,dta 每一段都管:
|
|
88
93
|
|
|
89
94
|
| 开发生命周期 | dta 做的 | 用什么 |
|
|
90
95
|
|---|---|---|
|
|
@@ -123,7 +128,7 @@ dta observe --promotion-id <promotion-id> --input <observation.json> --dry-run -
|
|
|
123
128
|
| Agent Host | OpenCode 完整;Claude Code 的 adapter 还没实现 |
|
|
124
129
|
| 完成证据 | 核验这一侧已经实现、被合同锁住;签发这一侧还没接进公开命令 |
|
|
125
130
|
| 反向导入外部平台的 Agent | 没有这个命令,数据只能从本地流向平台 |
|
|
126
|
-
| 回归防线 |
|
|
131
|
+
| 回归防线 | 75 个确定性合同;日常跑 core 那 39 条,19 秒 |
|
|
127
132
|
|
|
128
133
|
## 工作原理
|
|
129
134
|
|
|
@@ -128,8 +128,8 @@ dingtalk-agent 开发者装配验收
|
|
|
128
128
|
agent audit [--bindings agent.bindings.json] [--require-skill <name>]
|
|
129
129
|
agent audit [--bindings <file>] [--require-skill <name>] --verify-load --yes
|
|
130
130
|
agent audit [--bindings <file>] --load-report <agent-audit-load-evidence.json> [--remote-report <report.json>]
|
|
131
|
-
agent enhance --role-skill <name>[,<name>] [--project-name <name>] [--dry-run] [--json]
|
|
132
|
-
agent enhance --role-skill <name>[,<name>] --plan-id <current-plan-id> --yes [--json]
|
|
131
|
+
agent enhance --role-skill <name>[,<name>] --host <opencode|none> [--project-name <name>] [--dry-run] [--json]
|
|
132
|
+
agent enhance --role-skill <name>[,<name>] --host <opencode|none> --plan-id <current-plan-id> --yes [--json]
|
|
133
133
|
|
|
134
134
|
默认只做本地静态审计,不访问 DWS、不调用模型;状态为 partial 时返回退出码 2。
|
|
135
135
|
--verify-load --yes 会运行隔离的 OpenCode load probe,但仍不访问钉钉。
|
|
@@ -1166,7 +1166,7 @@ async function main() {
|
|
|
1166
1166
|
args: argv.slice(2),
|
|
1167
1167
|
options: {
|
|
1168
1168
|
bindings: { type: 'string' }, 'project-name': { type: 'string' },
|
|
1169
|
-
'role-skill': { type: 'string' }, model: { type: 'string' },
|
|
1169
|
+
'role-skill': { type: 'string' }, host: { type: 'string' }, model: { type: 'string' },
|
|
1170
1170
|
memory: { type: 'string' }, knowledge: { type: 'string' },
|
|
1171
1171
|
artifacts: { type: 'string' }, 'state-dir': { type: 'string' },
|
|
1172
1172
|
profile: { type: 'string' }, 'expected-user-id': { type: 'string' },
|
|
@@ -1180,7 +1180,8 @@ async function main() {
|
|
|
1180
1180
|
fail('agent enhance plan 不接受 --plan-id;它由 dry-run 生成');
|
|
1181
1181
|
const options = {
|
|
1182
1182
|
bindings: o.bindings, projectName: o['project-name'],
|
|
1183
|
-
roleSkills: o['role-skill']?.split(','),
|
|
1183
|
+
roleSkills: o['role-skill']?.split(','),
|
|
1184
|
+
host: o.host, model: o.model,
|
|
1184
1185
|
memory: o.memory, knowledge: o.knowledge, artifacts: o.artifacts,
|
|
1185
1186
|
stateDir: o['state-dir'], profile: o.profile,
|
|
1186
1187
|
expectedUserId: o['expected-user-id'], cliVersion: PACKAGE_JSON.version,
|
|
@@ -1886,7 +1887,7 @@ function printAgentAudit(out) {
|
|
|
1886
1887
|
function printAgentEnhance(out) {
|
|
1887
1888
|
if (out.$schema === 'dingtalk-agent/agent-enhancement-plan@1') {
|
|
1888
1889
|
console.log(`${strong('dingtalk-agent agent enhance')} · ${mark(out.ready ? 'pass' : 'fail', out.ready ? 'READY PLAN' : 'BLOCKED')}`);
|
|
1889
|
-
console.log(` planId=${out.planId} project=${out.projectName}`);
|
|
1890
|
+
console.log(` planId=${out.planId} project=${out.projectName} host=${out.host}`);
|
|
1890
1891
|
console.log(` sideEffect=${out.sideEffect} dingtalkSideEffect=${out.dingtalkSideEffect}`);
|
|
1891
1892
|
for (const operation of out.operations) {
|
|
1892
1893
|
console.log(` ${operation.kind.toUpperCase()} ${operation.path}: ${operation.reason}`);
|
|
@@ -1901,7 +1902,7 @@ function printAgentEnhance(out) {
|
|
|
1901
1902
|
return;
|
|
1902
1903
|
}
|
|
1903
1904
|
console.log(`${strong('dingtalk-agent agent enhance')} · ${mark('pass', 'APPLIED')}`);
|
|
1904
|
-
console.log(` operation=${out.operationId} planId=${out.planId}`);
|
|
1905
|
+
console.log(` operation=${out.operationId} planId=${out.planId} host=${out.host}`);
|
|
1905
1906
|
console.log(` changes=${out.changes.length} idempotent=${out.idempotent}`);
|
|
1906
1907
|
if (out.backupRoot)
|
|
1907
1908
|
console.log(` backup=${out.backupRoot}`);
|