@xdxer/dingtalk-agent 0.1.5-beta.6 → 0.1.5-beta.7

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.
Files changed (117) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.en.md +6 -6
  3. package/README.md +6 -6
  4. package/dist/bin/dingtalk-agent.js +79 -28
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/agent-audit.js +29 -25
  7. package/dist/src/agent-audit.js.map +1 -1
  8. package/dist/src/agent-definition.js +7 -3
  9. package/dist/src/agent-definition.js.map +1 -1
  10. package/dist/src/agent-enhance.js +2 -2
  11. package/dist/src/agent-enhance.js.map +1 -1
  12. package/dist/src/agent-platform.js +2 -2
  13. package/dist/src/agent-platform.js.map +1 -1
  14. package/dist/src/development-workspace.js +14 -9
  15. package/dist/src/development-workspace.js.map +1 -1
  16. package/dist/src/doctor.js +58 -7
  17. package/dist/src/doctor.js.map +1 -1
  18. package/dist/src/opencode-evals.js +6 -6
  19. package/dist/src/opencode-evals.js.map +1 -1
  20. package/dist/src/opencode-provider.js +2 -2
  21. package/dist/src/opencode-provider.js.map +1 -1
  22. package/dist/src/opencode-workspace.js +3 -3
  23. package/dist/src/opencode-workspace.js.map +1 -1
  24. package/dist/src/personal-event-evals.js +4 -2
  25. package/dist/src/personal-event-evals.js.map +1 -1
  26. package/dist/src/remote-semantic-state-live-evals.js +5 -4
  27. package/dist/src/remote-semantic-state-live-evals.js.map +1 -1
  28. package/dist/src/remote-state-evals.js +2 -2
  29. package/dist/src/remote-state-evals.js.map +1 -1
  30. package/dist/src/robot-evals.js +3 -3
  31. package/dist/src/robot-evals.js.map +1 -1
  32. package/dist/src/schedule-plan.js +1 -1
  33. package/dist/src/schedule-plan.js.map +1 -1
  34. package/dist/src/sessions.js +1 -1
  35. package/dist/src/sessions.js.map +1 -1
  36. package/dist/src/skill-manager.js +74 -13
  37. package/dist/src/skill-manager.js.map +1 -1
  38. package/dist/src/workspace.js +2 -2
  39. package/dist/src/workspace.js.map +1 -1
  40. package/docs/ARCHITECTURE.md +9 -9
  41. package/docs/INSTALLATION.md +6 -6
  42. package/docs/SELF-TEST.md +3 -3
  43. package/docs/schemas/project.schema.json +2 -2
  44. package/examples/agents/README.md +1 -1
  45. package/examples/agents/fde-coach/agent/AGENTS.md +1 -1
  46. package/examples/agents/release-manager/agent/AGENTS.md +1 -1
  47. package/lab/agent-eval/catalog.json +5 -5
  48. package/lab/agent-eval/classic-failures.json +4 -4
  49. package/lab/agent-eval/completion-gate-regression.json +9 -9
  50. package/lab/agent-eval/personal-event-live.example.json +3 -3
  51. package/lab/agent-eval/remote-semantic-state-live.example.json +1 -1
  52. package/lab/agent-eval/workspace/opencode.json +2 -2
  53. package/lab/project-workspace/multica-readonly.fixture.json +2 -2
  54. package/lab/project-workspace/opencode-provider-suite.json +2 -2
  55. package/lab/project-workspace/project.fixture.json +1 -1
  56. package/lab/robot-eval/suite.json +1 -1
  57. package/lab/robot-eval/workspace/AGENTS.md +1 -1
  58. package/lab/robot-eval/workspace/opencode.json +2 -2
  59. package/lab/schemas/personal-event-eval.schema.json +1 -1
  60. package/package.json +7 -7
  61. package/skills/README.md +10 -7
  62. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/SKILL.md +8 -8
  63. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/AGENTS.template.md +1 -1
  64. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/hosts/opencode/opencode.template.json +2 -2
  65. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/evals/evals.json +3 -3
  66. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/host-loading-contract.md +1 -1
  67. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/claude-code.md +1 -1
  68. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/opencode.md +2 -2
  69. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/SKILL.md +2 -2
  70. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/assets/eval-catalog.template.json +1 -1
  71. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/evals/evals.json +1 -1
  72. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/eval-topology.md +3 -3
  73. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/interactive-debug-channels.md +1 -1
  74. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/SKILL.md +2 -2
  75. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/event-to-behavior.md +1 -1
  76. package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/COMPLETENESS.md +1 -1
  77. package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/SKILL.md +2 -2
  78. package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/config-binding.md +1 -1
  79. package/skills/platforms/deap/PLATFORM.md +1 -1
  80. package/skills/platforms/multica-dingtalk/PLATFORM.md +4 -4
  81. package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/SKILL.md +3 -3
  82. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/SKILL.md +5 -5
  83. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/bootstrap.sh +2 -2
  84. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/REPOSITORY.template.md +0 -0
  85. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +0 -0
  86. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.local.template.json +0 -0
  87. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/role-skill.template.md +0 -0
  88. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/agent-definition-contract.md +0 -0
  89. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/drive-and-schedules.md +0 -0
  90. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/storage-routing.md +0 -0
  91. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/evidence-contract.md +0 -0
  92. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/failure-to-case.md +0 -0
  93. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/local-connector-smoke.md +0 -0
  94. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/scenario-taxonomy.md +0 -0
  95. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/storage-modes.md +0 -0
  96. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
  97. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/task-checkpoint.json +0 -0
  98. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/action-contract.md +0 -0
  99. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/memory-and-evolution.md +0 -0
  100. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/perception-and-gates.md +0 -0
  101. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/risk-authority-and-privacy.md +0 -0
  102. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/runtime-modes.md +0 -0
  103. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/task-lifecycle.md +0 -0
  104. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/truth-and-recovery.md +0 -0
  105. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/adapters.md +0 -0
  106. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/assembly-guidance.md +0 -0
  107. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/binding.md +0 -0
  108. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/cold-start.md +0 -0
  109. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/consent-and-visibility.md +0 -0
  110. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/consolidation.md +0 -0
  111. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/event-ingest.md +0 -0
  112. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/guided-setup.md +0 -0
  113. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/model.md +0 -0
  114. /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/storage-port.md +0 -0
  115. /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/multica-deployment-contract.md +0 -0
  116. /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/promotion-observation-contract.md +0 -0
  117. /package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/multica_ext.py +0 -0
@@ -4,6 +4,11 @@ import { homedir } from 'node:os';
4
4
  import { spawnSync } from 'node:child_process';
5
5
  import { BUNDLED_SKILL_NAMES, GLOBAL_SKILL_NAME, INSTALLABLE_SKILL_NAMES, skillStatus, skillSuiteStatus, } from './skill-manager.js';
6
6
  import { detectHosts } from './host-detect.js';
7
+ /** check id → 左列标签。渲染层不该从 summary 里猜标签。 */
8
+ export const CHECK_LABELS = {
9
+ node: 'Node.js', cli: 'CLI', dws: 'DWS', 'dws-auth': 'DWS 认证',
10
+ skill: 'Skill', 'claude-code': 'Claude Code', codex: 'Codex', opencode: 'OpenCode',
11
+ };
7
12
  export function doctor(packageRoot, options = {}) {
8
13
  const home = options.home || homedir();
9
14
  const env = options.env || process.env;
@@ -12,7 +17,7 @@ export function doctor(packageRoot, options = {}) {
12
17
  const version = String(pkg.version || '');
13
18
  const nodeVersion = process.versions.node;
14
19
  checks.push(versionAtLeast(nodeVersion, '18.3.0')
15
- ? { id: 'node', level: 'pass', summary: `Node.js ${nodeVersion}` }
20
+ ? { id: 'node', level: 'pass', summary: `Node.js ${nodeVersion}`, value: nodeVersion }
16
21
  : {
17
22
  id: 'node', level: 'fail', summary: `Node.js ${nodeVersion} 过旧`,
18
23
  fix: '升级到 Node.js 18.3 或更高版本',
@@ -27,6 +32,7 @@ export function doctor(packageRoot, options = {}) {
27
32
  checks.push(installedVersion === version && aliasVersion === version
28
33
  ? {
29
34
  id: 'cli', level: 'pass', summary: `CLI ${installedVersion} 已在 PATH 中(dta 可用)`,
35
+ value: `${installedVersion} 已在 PATH(dta 可用)`,
30
36
  detail: `${cli} · ${alias}`,
31
37
  }
32
38
  : {
@@ -65,7 +71,10 @@ export function doctor(packageRoot, options = {}) {
65
71
  const dwsVersion = versionRun.json?.version || firstLine(versionRun.stdout);
66
72
  const supported = versionRun.ok && versionAtLeast(String(dwsVersion || '').replace(/^v/, ''), '1.0.15');
67
73
  checks.push(supported
68
- ? { id: 'dws', level: 'pass', summary: `DWS ${dwsVersion || '可执行'}`, detail: dws }
74
+ ? {
75
+ id: 'dws', level: 'pass', summary: `DWS ${dwsVersion || '可执行'}`,
76
+ value: String(dwsVersion || '可执行'), detail: dws,
77
+ }
69
78
  : {
70
79
  id: 'dws', level: 'fail',
71
80
  summary: versionRun.ok ? `DWS ${dwsVersion || ''} 低于最低版本 1.0.15` : 'DWS 存在但无法运行',
@@ -78,7 +87,7 @@ export function doctor(packageRoot, options = {}) {
78
87
  checks.push(authenticated
79
88
  ? {
80
89
  id: 'dws-auth', level: 'pass', summary: 'DWS 已认证',
81
- detail: [authRun.json?.corp_name, authRun.json?.user_name].filter(Boolean).join(' · '),
90
+ value: [authRun.json?.corp_name, authRun.json?.user_name].filter(Boolean).join(' · ') || '已认证',
82
91
  }
83
92
  : {
84
93
  id: 'dws-auth', level: 'fail', summary: 'DWS 尚未认证或凭据已失效',
@@ -95,17 +104,41 @@ export function doctor(packageRoot, options = {}) {
95
104
  .filter((item) => !item.canonical.current)
96
105
  .map((item) => `${item.name} ${driftPhrase(item)}`).join('; ');
97
106
  // 平台 Skill 不属于默认套装:已安装才纳入报告,未安装既不提示也不影响 ready。
98
- const platformDrift = installedPlatformSkills(packageRoot, home)
107
+ const installedPlatformSkillList = installedPlatformSkills(packageRoot, home);
108
+ const platformDrift = installedPlatformSkillList
99
109
  .filter((item) => !item.canonical.current)
100
110
  .map((item) => `${item.name} ${driftPhrase(item)}`);
101
111
  const detail = [
102
112
  suite.skills.map((item) => item.canonical.path).join(' · '),
103
113
  platformDrift.length ? `平台 Skill: ${platformDrift.join('; ')}` : '',
104
114
  ].filter(Boolean).join(' | ');
115
+ const driftItems = [...suite.skills, ...installedPlatformSkillList]
116
+ .filter((item) => !item.canonical.current)
117
+ .map((item) => ({
118
+ label: item.name,
119
+ value: item.canonical.state === 'missing'
120
+ ? '未安装'
121
+ : item.canonical.state === 'modified'
122
+ ? item.bundled.skillVersion
123
+ : `${item.canonical.installedVersion || '—'} → ${item.bundled.skillVersion}`,
124
+ note: STATE_NOTES[item.canonical.state] || item.canonical.state,
125
+ }));
126
+ // 平台 Skill 只能按名升级:裸 `skill upgrade` 只遍历 BUNDLED_SKILL_NAMES,
127
+ // 对平台 Skill 一个都不碰——照着跑完警告还在。
128
+ const platformOnly = allCurrent && platformDrift.length > 0;
129
+ // 命令必须按 state 生成:ahead 时 upgradeGlobalSkill 会直接抛「拒绝降级」,
130
+ // 不带 --allow-downgrade 的提示照着跑也解决不了警告——和本次要修的是同一类 bug。
131
+ const driftCommands = [...suite.skills, ...installedPlatformSkillList]
132
+ .filter((item) => !item.canonical.current)
133
+ .map((item) => `dta skill upgrade --name ${item.name}` +
134
+ (item.canonical.state === 'ahead' ? ' --allow-downgrade' : ''));
135
+ const anyAhead = [...suite.skills, ...installedPlatformSkillList]
136
+ .some((item) => !item.canonical.current && item.canonical.state === 'ahead');
105
137
  checks.push(allCurrent && !platformDrift.length
106
138
  ? {
107
139
  id: 'skill', level: 'pass',
108
140
  summary: `内置 Skill 已安装: ${installedSummary}`,
141
+ value: `${suite.skills.length} 个全部最新`,
109
142
  detail,
110
143
  }
111
144
  : {
@@ -113,10 +146,19 @@ export function doctor(packageRoot, options = {}) {
113
146
  summary: allCurrent
114
147
  ? `平台 Skill 需要更新: ${platformDrift.join('; ')}`
115
148
  : `内置 Skill 不完整: ${staleSummary}`,
149
+ value: platformOnly
150
+ ? `${platformDrift.length} 个平台 Skill 需要更新`
151
+ : `${driftItems.length} 个需要处理`,
152
+ items: driftItems,
116
153
  detail,
117
154
  fix: anyMissing
118
- ? '运行 `dingtalk-agent skill install`'
119
- : '运行 `dingtalk-agent skill status`,确认后执行 `dingtalk-agent skill upgrade`',
155
+ ? '运行 `dta skill install`'
156
+ : platformOnly
157
+ ? `运行 ${driftCommands.map((command) => `\`${command}\``).join(' 与 ')}`
158
+ : anyAhead
159
+ // 内置套装里有 ahead 时,裸 `skill upgrade` 同样会被降级闸拦下
160
+ ? `运行 \`dta skill status\` 确认后,逐个执行 ${driftCommands.map((command) => `\`${command}\``).join(' 与 ')}`
161
+ : '运行 `dta skill status`,确认后执行 `dta skill upgrade`',
120
162
  });
121
163
  // 本机 Host 观测独立于 Skill 可见性:只补 detail,不参与 level,也不参与 ready。
122
164
  const hosts = detectHosts({ home, env, skills: [...INSTALLABLE_SKILL_NAMES] });
@@ -133,11 +175,12 @@ export function doctor(packageRoot, options = {}) {
133
175
  id: client.name,
134
176
  level,
135
177
  summary: `${client.label}: ${level === 'pass' ? '可发现内置 Skill' : level === 'fail' ? 'Skill 路径冲突' : '尚不可发现全部内置 Skill'}`,
178
+ value: `${states.filter((item) => item.state === 'ok').length}/${states.length} Skill 可见`,
136
179
  detail: [
137
180
  `${client.discovery} · ${states.map((item) => `${item.name}=${item.state}`).join('; ')}`,
138
181
  `CLI ${host?.cli.found ? host.cli.path : `未安装(${host?.cli.command || client.name})`}`,
139
182
  ].join(' | '),
140
- fix: level === 'pass' ? undefined : '运行 `dingtalk-agent skill install`',
183
+ fix: level === 'pass' ? undefined : '运行 `dta skill install`',
141
184
  });
142
185
  }
143
186
  const nextSteps = checks
@@ -159,6 +202,14 @@ export function doctor(packageRoot, options = {}) {
159
202
  hosts,
160
203
  };
161
204
  }
205
+ /** state 的人话版本:`outdated` 这种词对着终端的人不解释任何东西。 */
206
+ const STATE_NOTES = {
207
+ outdated: '包内有新版本',
208
+ modified: '本地被改动,升级会覆盖',
209
+ ahead: '本机版本更高,默认拒绝降级',
210
+ missing: '未安装',
211
+ unknown: '版本号缺失或非法',
212
+ };
162
213
  /** 把漂移状态渲染成"本机版本→包内版本(状态)",让 doctor 输出能直接指出差距。 */
163
214
  function driftPhrase(item) {
164
215
  const installed = item.canonical.installedVersion || '—';
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import { accessSync, constants, existsSync, readFileSync } from 'node:fs'\nimport { delimiter, dirname, join, resolve } from 'node:path'\nimport { homedir } from 'node:os'\nimport { spawnSync } from 'node:child_process'\n\nimport {\n BUNDLED_SKILL_NAMES, GLOBAL_SKILL_NAME, INSTALLABLE_SKILL_NAMES, skillStatus, skillSuiteStatus,\n type GlobalSkillStatus,\n} from './skill-manager.js'\nimport { detectHosts, type HostDetection } from './host-detect.js'\n\nexport type CheckLevel = 'pass' | 'warn' | 'fail'\n\nexport interface DoctorCheck {\n id: 'node' | 'cli' | 'dws' | 'dws-auth' | 'skill' | 'claude-code' | 'codex' | 'opencode'\n level: CheckLevel\n summary: string\n detail?: string\n fix?: string\n}\n\nexport interface DoctorReport {\n $schema: 'dingtalk-agent/doctor@1'\n ready: boolean\n checks: DoctorCheck[]\n nextSteps: string[]\n skill: GlobalSkillStatus\n skills: GlobalSkillStatus[]\n /**\n * 本机 coding agent 观测面:哪些 Host CLI 装了、Skill 对它们是否可见。\n * 它只是选路依据,不参与 `ready` 判定——没装 Claude Code 不等于环境不可用。\n */\n hosts: HostDetection[]\n}\n\nexport interface DoctorOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n}\n\nexport function doctor(packageRoot: string, options: DoctorOptions = {}): DoctorReport {\n const home = options.home || homedir()\n const env = options.env || process.env\n const checks: DoctorCheck[] = []\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const version = String(pkg.version || '')\n\n const nodeVersion = process.versions.node\n checks.push(versionAtLeast(nodeVersion, '18.3.0')\n ? { id: 'node', level: 'pass', summary: `Node.js ${nodeVersion}` }\n : {\n id: 'node', level: 'fail', summary: `Node.js ${nodeVersion} 过旧`,\n fix: '升级到 Node.js 18.3 或更高版本',\n })\n\n const cli = findExecutable('dingtalk-agent', env)\n const alias = findExecutable('dta', env)\n if (cli && alias) {\n const installed = runText(cli, ['--version'], env)\n const aliasRun = runText(alias, ['--version'], env)\n const installedVersion = installed.ok ? firstLine(installed.stdout) : ''\n const aliasVersion = aliasRun.ok ? firstLine(aliasRun.stdout) : ''\n checks.push(installedVersion === version && aliasVersion === version\n ? {\n id: 'cli', level: 'pass', summary: `CLI ${installedVersion} 已在 PATH 中(dta 可用)`,\n detail: `${cli} · ${alias}`,\n }\n : {\n id: 'cli', level: 'warn', summary: 'PATH 中的 CLI 版本与当前包不一致',\n detail: `${cli} (${installedVersion || '无法识别版本'}) · ${alias} (${aliasVersion || '无法识别版本'})`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n } else if (cli || alias) {\n checks.push({\n id: 'cli', level: 'fail', summary: 'CLI 入口不完整:dingtalk-agent 与 dta 应同时存在',\n detail: `dingtalk-agent=${cli || 'missing'} · dta=${alias || 'missing'}`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n } else {\n checks.push({\n id: 'cli', level: 'fail', summary: 'PATH 找不到 dingtalk-agent',\n detail: `当前 PATH=${env.PATH || ''}`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n }\n\n const dws = findExecutable('dws', env)\n if (!dws) {\n checks.push({\n id: 'dws', level: 'fail', summary: 'PATH 找不到 dws',\n fix: '安装 DWS,并确认 `dws version --format json` 可以执行',\n })\n checks.push({\n id: 'dws-auth', level: 'fail', summary: '无法检查 DWS 认证',\n fix: 'DWS 可用后运行 `dws auth login`',\n })\n } else {\n const versionRun = runJson(dws, ['version', '--format', 'json'], env)\n const dwsVersion = versionRun.json?.version || firstLine(versionRun.stdout)\n const supported = versionRun.ok && versionAtLeast(String(dwsVersion || '').replace(/^v/, ''), '1.0.15')\n checks.push(supported\n ? { id: 'dws', level: 'pass', summary: `DWS ${dwsVersion || '可执行'}`, detail: dws }\n : {\n id: 'dws', level: 'fail',\n summary: versionRun.ok ? `DWS ${dwsVersion || ''} 低于最低版本 1.0.15` : 'DWS 存在但无法运行',\n detail: versionRun.ok ? dws : versionRun.error,\n fix: versionRun.ok ? '运行 `dws upgrade`' : '运行 `dws doctor` 检查安装',\n })\n\n const authRun = runJson(dws, ['auth', 'status', '--format', 'json'], env)\n const authenticated = authRun.ok && authRun.json?.authenticated === true &&\n authRun.json?.token_valid !== false\n checks.push(authenticated\n ? {\n id: 'dws-auth', level: 'pass', summary: 'DWS 已认证',\n detail: [authRun.json?.corp_name, authRun.json?.user_name].filter(Boolean).join(' · '),\n }\n : {\n id: 'dws-auth', level: 'fail', summary: 'DWS 尚未认证或凭据已失效',\n detail: authRun.error || 'authenticated=false', fix: '运行 `dws auth login`',\n })\n }\n\n const suite = skillSuiteStatus(packageRoot, { home })\n const skill = suite.skills.find((item) => item.name === GLOBAL_SKILL_NAME) || suite.skills[0]\n const allCurrent = suite.skills.every((item) => item.canonical.current)\n const anyMissing = suite.skills.some((item) => !item.canonical.exists)\n const installedSummary = suite.skills\n .map((item) => `${item.name} ${item.bundled.skillVersion}`).join(' + ')\n const staleSummary = suite.skills\n .filter((item) => !item.canonical.current)\n .map((item) => `${item.name} ${driftPhrase(item)}`).join('; ')\n // 平台 Skill 不属于默认套装:已安装才纳入报告,未安装既不提示也不影响 ready。\n const platformDrift = installedPlatformSkills(packageRoot, home)\n .filter((item) => !item.canonical.current)\n .map((item) => `${item.name} ${driftPhrase(item)}`)\n const detail = [\n suite.skills.map((item) => item.canonical.path).join(' · '),\n platformDrift.length ? `平台 Skill: ${platformDrift.join('; ')}` : '',\n ].filter(Boolean).join(' | ')\n checks.push(allCurrent && !platformDrift.length\n ? {\n id: 'skill', level: 'pass',\n summary: `内置 Skill 已安装: ${installedSummary}`,\n detail,\n }\n : {\n id: 'skill', level: anyMissing ? 'fail' : 'warn',\n summary: allCurrent\n ? `平台 Skill 需要更新: ${platformDrift.join('; ')}`\n : `内置 Skill 不完整: ${staleSummary}`,\n detail,\n fix: anyMissing\n ? '运行 `dingtalk-agent skill install`'\n : '运行 `dingtalk-agent skill status`,确认后执行 `dingtalk-agent skill upgrade`',\n })\n\n // 本机 Host 观测独立于 Skill 可见性:只补 detail,不参与 level,也不参与 ready。\n const hosts = detectHosts({ home, env, skills: [...INSTALLABLE_SKILL_NAMES] })\n for (const client of skill.clients) {\n const states = suite.skills.map((item) => ({\n name: item.name,\n state: item.clients.find((entry) => entry.name === client.name)?.state || 'missing',\n }))\n const level: CheckLevel = states.some((item) => item.state === 'conflict')\n ? 'fail'\n : states.some((item) => item.state === 'missing') ? 'warn' : 'pass'\n const host = hosts.find((item) => item.name === client.name)\n checks.push({\n id: client.name,\n level,\n summary: `${client.label}: ${level === 'pass' ? '可发现内置 Skill' : level === 'fail' ? 'Skill 路径冲突' : '尚不可发现全部内置 Skill'}`,\n detail: [\n `${client.discovery} · ${states.map((item) => `${item.name}=${item.state}`).join('; ')}`,\n `CLI ${host?.cli.found ? host.cli.path : `未安装(${host?.cli.command || client.name})`}`,\n ].join(' | '),\n fix: level === 'pass' ? undefined : '运行 `dingtalk-agent skill install`',\n })\n }\n\n const nextSteps = checks\n .filter((check) => check.level !== 'pass' && check.fix)\n .map((check) => check.fix as string)\n .filter((step, index, all) => all.indexOf(step) === index)\n // Host discovery is an observation surface, not an environment gate. A\n // client-specific exposure conflict should stay visible as a failed check,\n // but it must not contradict the contract above and make the whole runtime\n // unready when Node/CLI/DWS/auth/canonical Skills are usable.\n const hostCheckIds = new Set<DoctorCheck['id']>(['claude-code', 'codex', 'opencode'])\n return {\n $schema: 'dingtalk-agent/doctor@1',\n ready: !checks.some((check) => check.level === 'fail' && !hostCheckIds.has(check.id)),\n checks,\n nextSteps,\n skill,\n skills: suite.skills,\n hosts,\n }\n}\n\n/** 把漂移状态渲染成\"本机版本→包内版本(状态)\",让 doctor 输出能直接指出差距。 */\nfunction driftPhrase(item: GlobalSkillStatus): string {\n const installed = item.canonical.installedVersion || '—'\n return item.canonical.state === 'missing'\n ? '未安装(missing)'\n : `${installed}→${item.bundled.skillVersion}(${item.canonical.state})`\n}\n\n/** 已落地的平台 Skill 与可选能力包;未安装的不返回,避免把 opt-in 能力报成缺失。 */\nfunction installedPlatformSkills(packageRoot: string, home?: string): GlobalSkillStatus[] {\n const core = new Set<string>(BUNDLED_SKILL_NAMES)\n const result: GlobalSkillStatus[] = []\n for (const name of INSTALLABLE_SKILL_NAMES) {\n if (core.has(name)) continue\n try {\n const status = skillStatus(packageRoot, { home, name })\n if (status.canonical.exists) result.push(status)\n } catch {\n // 平台 Skill 不可用不应让 doctor 失败;核心套装的问题由上面的 skill check 负责。\n }\n }\n return result\n}\n\nexport function findExecutable(command: string, env: NodeJS.ProcessEnv = process.env): string {\n const path = env.PATH || ''\n const extensions = process.platform === 'win32'\n ? (env.PATHEXT || '.EXE;.CMD;.BAT').split(';')\n : ['']\n for (const directory of path.split(delimiter).filter(Boolean)) {\n for (const extension of extensions) {\n const candidate = resolve(directory, command + extension.toLowerCase())\n try {\n accessSync(candidate, process.platform === 'win32' ? constants.F_OK : constants.X_OK)\n return candidate\n } catch { /* continue */ }\n }\n }\n return ''\n}\n\nfunction runJson(command: string, args: string[], env: NodeJS.ProcessEnv) {\n const run = spawnSync(command, args, { encoding: 'utf8', env, timeout: 8_000 })\n const stdout = String(run.stdout || '').trim()\n const stderr = String(run.stderr || '').trim()\n let json: any = null\n try { json = stdout ? JSON.parse(stdout) : null } catch { /* human output is allowed */ }\n return {\n ok: run.status === 0 && !run.error,\n json,\n stdout,\n error: run.error?.message || stderr || (run.signal ? `被 ${run.signal} 终止` : `退出码 ${run.status}`),\n }\n}\n\nfunction runText(command: string, args: string[], env: NodeJS.ProcessEnv) {\n const run = spawnSync(command, args, { encoding: 'utf8', env, timeout: 8_000 })\n return {\n ok: run.status === 0 && !run.error,\n stdout: String(run.stdout || '').trim(),\n }\n}\n\nfunction firstLine(text: string): string {\n return text.split(/\\r?\\n/, 1)[0]?.trim() || ''\n}\n\nfunction versionAtLeast(actual: string, minimum: string): boolean {\n const a = actual.split('.').map((part) => Number.parseInt(part, 10) || 0)\n const b = minimum.split('.').map((part) => Number.parseInt(part, 10) || 0)\n for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n if ((a[i] || 0) > (b[i] || 0)) return true\n if ((a[i] || 0) < (b[i] || 0)) return false\n }\n return true\n}\n"]}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import { accessSync, constants, existsSync, readFileSync } from 'node:fs'\nimport { delimiter, dirname, join, resolve } from 'node:path'\nimport { homedir } from 'node:os'\nimport { spawnSync } from 'node:child_process'\n\nimport {\n BUNDLED_SKILL_NAMES, GLOBAL_SKILL_NAME, INSTALLABLE_SKILL_NAMES, skillStatus, skillSuiteStatus,\n type GlobalSkillStatus,\n} from './skill-manager.js'\nimport { detectHosts, type HostDetection } from './host-detect.js'\n\nexport type CheckLevel = 'pass' | 'warn' | 'fail'\n\nexport interface DoctorCheck {\n id: 'node' | 'cli' | 'dws' | 'dws-auth' | 'skill' | 'claude-code' | 'codex' | 'opencode'\n level: CheckLevel\n summary: string\n detail?: string\n fix?: string\n /**\n * 给渲染层用的结构化字段。summary/detail 是可读句子,列对齐需要的是拆开的\n * 值——否则 printer 只能去 split(' | ') 反解自己刚拼好的字符串。\n */\n value?: string\n items?: DoctorItem[]\n}\n\n/** 一条 check 下面的明细行,渲染成缩进的对齐列。 */\nexport interface DoctorItem {\n label: string\n value?: string\n note?: string\n}\n\n/** check id → 左列标签。渲染层不该从 summary 里猜标签。 */\nexport const CHECK_LABELS: Record<DoctorCheck['id'], string> = {\n node: 'Node.js', cli: 'CLI', dws: 'DWS', 'dws-auth': 'DWS 认证',\n skill: 'Skill', 'claude-code': 'Claude Code', codex: 'Codex', opencode: 'OpenCode',\n}\n\nexport interface DoctorReport {\n $schema: 'dingtalk-agent/doctor@1'\n ready: boolean\n checks: DoctorCheck[]\n nextSteps: string[]\n skill: GlobalSkillStatus\n skills: GlobalSkillStatus[]\n /**\n * 本机 coding agent 观测面:哪些 Host CLI 装了、Skill 对它们是否可见。\n * 它只是选路依据,不参与 `ready` 判定——没装 Claude Code 不等于环境不可用。\n */\n hosts: HostDetection[]\n}\n\nexport interface DoctorOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n}\n\nexport function doctor(packageRoot: string, options: DoctorOptions = {}): DoctorReport {\n const home = options.home || homedir()\n const env = options.env || process.env\n const checks: DoctorCheck[] = []\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const version = String(pkg.version || '')\n\n const nodeVersion = process.versions.node\n checks.push(versionAtLeast(nodeVersion, '18.3.0')\n ? { id: 'node', level: 'pass', summary: `Node.js ${nodeVersion}`, value: nodeVersion }\n : {\n id: 'node', level: 'fail', summary: `Node.js ${nodeVersion} 过旧`,\n fix: '升级到 Node.js 18.3 或更高版本',\n })\n\n const cli = findExecutable('dingtalk-agent', env)\n const alias = findExecutable('dta', env)\n if (cli && alias) {\n const installed = runText(cli, ['--version'], env)\n const aliasRun = runText(alias, ['--version'], env)\n const installedVersion = installed.ok ? firstLine(installed.stdout) : ''\n const aliasVersion = aliasRun.ok ? firstLine(aliasRun.stdout) : ''\n checks.push(installedVersion === version && aliasVersion === version\n ? {\n id: 'cli', level: 'pass', summary: `CLI ${installedVersion} 已在 PATH 中(dta 可用)`,\n value: `${installedVersion} 已在 PATH(dta 可用)`,\n detail: `${cli} · ${alias}`,\n }\n : {\n id: 'cli', level: 'warn', summary: 'PATH 中的 CLI 版本与当前包不一致',\n detail: `${cli} (${installedVersion || '无法识别版本'}) · ${alias} (${aliasVersion || '无法识别版本'})`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n } else if (cli || alias) {\n checks.push({\n id: 'cli', level: 'fail', summary: 'CLI 入口不完整:dingtalk-agent 与 dta 应同时存在',\n detail: `dingtalk-agent=${cli || 'missing'} · dta=${alias || 'missing'}`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n } else {\n checks.push({\n id: 'cli', level: 'fail', summary: 'PATH 找不到 dingtalk-agent',\n detail: `当前 PATH=${env.PATH || ''}`,\n fix: `运行 npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${version} setup`,\n })\n }\n\n const dws = findExecutable('dws', env)\n if (!dws) {\n checks.push({\n id: 'dws', level: 'fail', summary: 'PATH 找不到 dws',\n fix: '安装 DWS,并确认 `dws version --format json` 可以执行',\n })\n checks.push({\n id: 'dws-auth', level: 'fail', summary: '无法检查 DWS 认证',\n fix: 'DWS 可用后运行 `dws auth login`',\n })\n } else {\n const versionRun = runJson(dws, ['version', '--format', 'json'], env)\n const dwsVersion = versionRun.json?.version || firstLine(versionRun.stdout)\n const supported = versionRun.ok && versionAtLeast(String(dwsVersion || '').replace(/^v/, ''), '1.0.15')\n checks.push(supported\n ? {\n id: 'dws', level: 'pass', summary: `DWS ${dwsVersion || '可执行'}`,\n value: String(dwsVersion || '可执行'), detail: dws,\n }\n : {\n id: 'dws', level: 'fail',\n summary: versionRun.ok ? `DWS ${dwsVersion || ''} 低于最低版本 1.0.15` : 'DWS 存在但无法运行',\n detail: versionRun.ok ? dws : versionRun.error,\n fix: versionRun.ok ? '运行 `dws upgrade`' : '运行 `dws doctor` 检查安装',\n })\n\n const authRun = runJson(dws, ['auth', 'status', '--format', 'json'], env)\n const authenticated = authRun.ok && authRun.json?.authenticated === true &&\n authRun.json?.token_valid !== false\n checks.push(authenticated\n ? {\n id: 'dws-auth', level: 'pass', summary: 'DWS 已认证',\n value: [authRun.json?.corp_name, authRun.json?.user_name].filter(Boolean).join(' · ') || '已认证',\n }\n : {\n id: 'dws-auth', level: 'fail', summary: 'DWS 尚未认证或凭据已失效',\n detail: authRun.error || 'authenticated=false', fix: '运行 `dws auth login`',\n })\n }\n\n const suite = skillSuiteStatus(packageRoot, { home })\n const skill = suite.skills.find((item) => item.name === GLOBAL_SKILL_NAME) || suite.skills[0]\n const allCurrent = suite.skills.every((item) => item.canonical.current)\n const anyMissing = suite.skills.some((item) => !item.canonical.exists)\n const installedSummary = suite.skills\n .map((item) => `${item.name} ${item.bundled.skillVersion}`).join(' + ')\n const staleSummary = suite.skills\n .filter((item) => !item.canonical.current)\n .map((item) => `${item.name} ${driftPhrase(item)}`).join('; ')\n // 平台 Skill 不属于默认套装:已安装才纳入报告,未安装既不提示也不影响 ready。\n const installedPlatformSkillList = installedPlatformSkills(packageRoot, home)\n const platformDrift = installedPlatformSkillList\n .filter((item) => !item.canonical.current)\n .map((item) => `${item.name} ${driftPhrase(item)}`)\n const detail = [\n suite.skills.map((item) => item.canonical.path).join(' · '),\n platformDrift.length ? `平台 Skill: ${platformDrift.join('; ')}` : '',\n ].filter(Boolean).join(' | ')\n const driftItems: DoctorItem[] = [...suite.skills, ...installedPlatformSkillList]\n .filter((item) => !item.canonical.current)\n .map((item) => ({\n label: item.name,\n value: item.canonical.state === 'missing'\n ? '未安装'\n : item.canonical.state === 'modified'\n ? item.bundled.skillVersion\n : `${item.canonical.installedVersion || '—'} → ${item.bundled.skillVersion}`,\n note: STATE_NOTES[item.canonical.state] || item.canonical.state,\n }))\n // 平台 Skill 只能按名升级:裸 `skill upgrade` 只遍历 BUNDLED_SKILL_NAMES,\n // 对平台 Skill 一个都不碰——照着跑完警告还在。\n const platformOnly = allCurrent && platformDrift.length > 0\n // 命令必须按 state 生成:ahead 时 upgradeGlobalSkill 会直接抛「拒绝降级」,\n // 不带 --allow-downgrade 的提示照着跑也解决不了警告——和本次要修的是同一类 bug。\n const driftCommands = [...suite.skills, ...installedPlatformSkillList]\n .filter((item) => !item.canonical.current)\n .map((item) => `dta skill upgrade --name ${item.name}` +\n (item.canonical.state === 'ahead' ? ' --allow-downgrade' : ''))\n const anyAhead = [...suite.skills, ...installedPlatformSkillList]\n .some((item) => !item.canonical.current && item.canonical.state === 'ahead')\n checks.push(allCurrent && !platformDrift.length\n ? {\n id: 'skill', level: 'pass',\n summary: `内置 Skill 已安装: ${installedSummary}`,\n value: `${suite.skills.length} 个全部最新`,\n detail,\n }\n : {\n id: 'skill', level: anyMissing ? 'fail' : 'warn',\n summary: allCurrent\n ? `平台 Skill 需要更新: ${platformDrift.join('; ')}`\n : `内置 Skill 不完整: ${staleSummary}`,\n value: platformOnly\n ? `${platformDrift.length} 个平台 Skill 需要更新`\n : `${driftItems.length} 个需要处理`,\n items: driftItems,\n detail,\n fix: anyMissing\n ? '运行 `dta skill install`'\n : platformOnly\n ? `运行 ${driftCommands.map((command) => `\\`${command}\\``).join(' 与 ')}`\n : anyAhead\n // 内置套装里有 ahead 时,裸 `skill upgrade` 同样会被降级闸拦下\n ? `运行 \\`dta skill status\\` 确认后,逐个执行 ${\n driftCommands.map((command) => `\\`${command}\\``).join(' 与 ')}`\n : '运行 `dta skill status`,确认后执行 `dta skill upgrade`',\n })\n\n // 本机 Host 观测独立于 Skill 可见性:只补 detail,不参与 level,也不参与 ready。\n const hosts = detectHosts({ home, env, skills: [...INSTALLABLE_SKILL_NAMES] })\n for (const client of skill.clients) {\n const states = suite.skills.map((item) => ({\n name: item.name,\n state: item.clients.find((entry) => entry.name === client.name)?.state || 'missing',\n }))\n const level: CheckLevel = states.some((item) => item.state === 'conflict')\n ? 'fail'\n : states.some((item) => item.state === 'missing') ? 'warn' : 'pass'\n const host = hosts.find((item) => item.name === client.name)\n checks.push({\n id: client.name,\n level,\n summary: `${client.label}: ${level === 'pass' ? '可发现内置 Skill' : level === 'fail' ? 'Skill 路径冲突' : '尚不可发现全部内置 Skill'}`,\n value: `${states.filter((item) => item.state === 'ok').length}/${states.length} Skill 可见`,\n detail: [\n `${client.discovery} · ${states.map((item) => `${item.name}=${item.state}`).join('; ')}`,\n `CLI ${host?.cli.found ? host.cli.path : `未安装(${host?.cli.command || client.name})`}`,\n ].join(' | '),\n fix: level === 'pass' ? undefined : '运行 `dta skill install`',\n })\n }\n\n const nextSteps = checks\n .filter((check) => check.level !== 'pass' && check.fix)\n .map((check) => check.fix as string)\n .filter((step, index, all) => all.indexOf(step) === index)\n // Host discovery is an observation surface, not an environment gate. A\n // client-specific exposure conflict should stay visible as a failed check,\n // but it must not contradict the contract above and make the whole runtime\n // unready when Node/CLI/DWS/auth/canonical Skills are usable.\n const hostCheckIds = new Set<DoctorCheck['id']>(['claude-code', 'codex', 'opencode'])\n return {\n $schema: 'dingtalk-agent/doctor@1',\n ready: !checks.some((check) => check.level === 'fail' && !hostCheckIds.has(check.id)),\n checks,\n nextSteps,\n skill,\n skills: suite.skills,\n hosts,\n }\n}\n\n/** state 的人话版本:`outdated` 这种词对着终端的人不解释任何东西。 */\nconst STATE_NOTES: Record<string, string> = {\n outdated: '包内有新版本',\n modified: '本地被改动,升级会覆盖',\n ahead: '本机版本更高,默认拒绝降级',\n missing: '未安装',\n unknown: '版本号缺失或非法',\n}\n\n/** 把漂移状态渲染成\"本机版本→包内版本(状态)\",让 doctor 输出能直接指出差距。 */\nfunction driftPhrase(item: GlobalSkillStatus): string {\n const installed = item.canonical.installedVersion || '—'\n return item.canonical.state === 'missing'\n ? '未安装(missing)'\n : `${installed}→${item.bundled.skillVersion}(${item.canonical.state})`\n}\n\n/** 已落地的平台 Skill 与可选能力包;未安装的不返回,避免把 opt-in 能力报成缺失。 */\nfunction installedPlatformSkills(packageRoot: string, home?: string): GlobalSkillStatus[] {\n const core = new Set<string>(BUNDLED_SKILL_NAMES)\n const result: GlobalSkillStatus[] = []\n for (const name of INSTALLABLE_SKILL_NAMES) {\n if (core.has(name)) continue\n try {\n const status = skillStatus(packageRoot, { home, name })\n if (status.canonical.exists) result.push(status)\n } catch {\n // 平台 Skill 不可用不应让 doctor 失败;核心套装的问题由上面的 skill check 负责。\n }\n }\n return result\n}\n\nexport function findExecutable(command: string, env: NodeJS.ProcessEnv = process.env): string {\n const path = env.PATH || ''\n const extensions = process.platform === 'win32'\n ? (env.PATHEXT || '.EXE;.CMD;.BAT').split(';')\n : ['']\n for (const directory of path.split(delimiter).filter(Boolean)) {\n for (const extension of extensions) {\n const candidate = resolve(directory, command + extension.toLowerCase())\n try {\n accessSync(candidate, process.platform === 'win32' ? constants.F_OK : constants.X_OK)\n return candidate\n } catch { /* continue */ }\n }\n }\n return ''\n}\n\nfunction runJson(command: string, args: string[], env: NodeJS.ProcessEnv) {\n const run = spawnSync(command, args, { encoding: 'utf8', env, timeout: 8_000 })\n const stdout = String(run.stdout || '').trim()\n const stderr = String(run.stderr || '').trim()\n let json: any = null\n try { json = stdout ? JSON.parse(stdout) : null } catch { /* human output is allowed */ }\n return {\n ok: run.status === 0 && !run.error,\n json,\n stdout,\n error: run.error?.message || stderr || (run.signal ? `被 ${run.signal} 终止` : `退出码 ${run.status}`),\n }\n}\n\nfunction runText(command: string, args: string[], env: NodeJS.ProcessEnv) {\n const run = spawnSync(command, args, { encoding: 'utf8', env, timeout: 8_000 })\n return {\n ok: run.status === 0 && !run.error,\n stdout: String(run.stdout || '').trim(),\n }\n}\n\nfunction firstLine(text: string): string {\n return text.split(/\\r?\\n/, 1)[0]?.trim() || ''\n}\n\nfunction versionAtLeast(actual: string, minimum: string): boolean {\n const a = actual.split('.').map((part) => Number.parseInt(part, 10) || 0)\n const b = minimum.split('.').map((part) => Number.parseInt(part, 10) || 0)\n for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n if ((a[i] || 0) > (b[i] || 0)) return true\n if ((a[i] || 0) < (b[i] || 0)) return false\n }\n return true\n}\n"]}
@@ -28,7 +28,7 @@ export function loadProbeCorePassed(probe, engineVersion) {
28
28
  const expectedCount = probe.expectsLoad === true ? 1 : probe.expectsLoad === false ? 0 : -1;
29
29
  let resolvedCount = -1;
30
30
  try {
31
- resolvedCount = countInstructionsForPath(String(probe.sessionDirectory || ''), probe.resolvedInstructions, '.agents/skills/dingtalk-basic-behavior/SKILL.md');
31
+ resolvedCount = countInstructionsForPath(String(probe.sessionDirectory || ''), probe.resolvedInstructions, '.agents/skills/dta-basic-behavior/SKILL.md');
32
32
  }
33
33
  catch {
34
34
  return false;
@@ -60,7 +60,7 @@ export function runOpenCodeEvaluation(root, workspacePath, suitePath, options =
60
60
  if (!model.startsWith('deepseek/'))
61
61
  throw new Error('OpenCode Eval 模型必须固定为 deepseek/*');
62
62
  const packageRoot = resolvePackageRoot(import.meta.url);
63
- const currentSkill = readSkillSource(root, bundledSkillPath(packageRoot, 'dingtalk-basic-behavior'), 'current Skill');
63
+ const currentSkill = readSkillSource(root, bundledSkillPath(packageRoot, 'dta-basic-behavior'), 'current Skill');
64
64
  let previousSkill = null;
65
65
  if (options.previousSkill) {
66
66
  // Containment and source-shape checks are separate: safeInside resolves aliases for the
@@ -526,7 +526,7 @@ function writeReviewWorkspace(evidenceRoot, cases, results, loadProbes, model, r
526
526
  }
527
527
  const benchmark = {
528
528
  metadata: {
529
- skill_name: 'dingtalk-basic-behavior',
529
+ skill_name: 'dta-basic-behavior',
530
530
  executor_model: model,
531
531
  analyzer_model: 'deterministic-assertions',
532
532
  timestamp: new Date().toISOString(),
@@ -864,7 +864,7 @@ function readSkillSource(root, directory, label) {
864
864
  const frontmatter = body.match(/^---\s*\n([\s\S]*?)\n---/)?.[1] || '';
865
865
  const name = frontmatter.match(/^name:\s*["']?([^"'\n]+)["']?\s*$/m)?.[1]?.trim() || '';
866
866
  const version = frontmatter.match(/^metadata:\s*\n(?:^[ \t]+.*\n)*?^[ \t]+version:\s*["']?([^"'\n]+)["']?\s*$/m)?.[1]?.trim() || '';
867
- if (name !== 'dingtalk-basic-behavior' || !version) {
867
+ if (name !== 'dta-basic-behavior' || !version) {
868
868
  throw new Error(`${label} 元数据非法: name=${name || 'missing'} version=${version || 'missing'}`);
869
869
  }
870
870
  const snapshotPath = join(path, 'snapshot.json');
@@ -968,7 +968,7 @@ function assertSkillTreeMatches(actual, expected, label) {
968
968
  }
969
969
  }
970
970
  function materializeConfiguration(sandbox, configuration, probe, command, environment) {
971
- const target = join(sandbox, '.agents', 'skills', 'dingtalk-basic-behavior');
971
+ const target = join(sandbox, '.agents', 'skills', 'dta-basic-behavior');
972
972
  mkdirSync(dirname(target), { recursive: true });
973
973
  rmSync(target, { recursive: true, force: true });
974
974
  if (configuration.expectsLoad && configuration.skill) {
@@ -1199,7 +1199,7 @@ export function prepareOpenCodeEvalAgent(workspace, tools = 'none', allowedReadP
1199
1199
  ? config.$schema : 'https://opencode.ai/config.json',
1200
1200
  instructions: [...(config.instructions || [])],
1201
1201
  permission: {
1202
- skill: { '*': 'deny', 'dingtalk-basic-behavior': 'allow' },
1202
+ skill: { '*': 'deny', 'dta-basic-behavior': 'allow' },
1203
1203
  },
1204
1204
  agent: { 'dta-eval': evalAgent },
1205
1205
  plugin: [],