@xdxer/dingtalk-agent 0.1.4-beta.12 → 0.1.4-beta.13

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 (62) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.en.md +1 -1
  3. package/README.md +15 -16
  4. package/dist/bin/dingtalk-agent.js +30 -9
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/agent-audit.js +3 -2
  7. package/dist/src/agent-audit.js.map +1 -1
  8. package/dist/src/agent-enhance.js +3 -2
  9. package/dist/src/agent-enhance.js.map +1 -1
  10. package/dist/src/agent-platform.js +36 -2
  11. package/dist/src/agent-platform.js.map +1 -1
  12. package/dist/src/development-workspace.js +3 -1
  13. package/dist/src/development-workspace.js.map +1 -1
  14. package/dist/src/multica-deploy.js +2 -1
  15. package/dist/src/multica-deploy.js.map +1 -1
  16. package/dist/src/opencode-evals.js +2 -1
  17. package/dist/src/opencode-evals.js.map +1 -1
  18. package/dist/src/remote-state-evals.js +2 -1
  19. package/dist/src/remote-state-evals.js.map +1 -1
  20. package/dist/src/robot-evals.js +2 -1
  21. package/dist/src/robot-evals.js.map +1 -1
  22. package/dist/src/skill-manager.js +17 -3
  23. package/dist/src/skill-manager.js.map +1 -1
  24. package/dist/src/skills.js +2 -1
  25. package/dist/src/skills.js.map +1 -1
  26. package/docs/INSTALLATION.md +2 -2
  27. package/lab/agent-eval/completion-gate-regression.json +6 -6
  28. package/package.json +7 -7
  29. package/skills/README.md +23 -0
  30. package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/SKILL.md +20 -4
  31. package/skills/{dingtalk-agent-deploy → platforms/multica-dingtalk/dingtalk-agent-deploy-multica}/SKILL.md +1 -1
  32. package/skills/{multica-fde-external → platforms/multica-dingtalk/multica-external}/SKILL.md +4 -4
  33. package/skills/{multica-fde-external → platforms/multica-dingtalk/multica-external}/scripts/bootstrap.sh +2 -2
  34. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/AGENTS.template.md +0 -0
  35. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +0 -0
  36. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/agent.bindings.local.template.json +0 -0
  37. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/opencode.template.json +0 -0
  38. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/assets/role-skill.template.md +0 -0
  39. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/evals/evals.json +0 -0
  40. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/references/agent-definition-contract.md +0 -0
  41. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/references/opencode-host-contract.md +0 -0
  42. /package/skills/{dingtalk-agent-compose → core/dingtalk-agent-compose}/references/storage-routing.md +0 -0
  43. /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/SKILL.md +0 -0
  44. /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/assets/eval-catalog.template.json +0 -0
  45. /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/evals/evals.json +0 -0
  46. /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/references/eval-topology.md +0 -0
  47. /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/references/evidence-contract.md +0 -0
  48. /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/references/scenario-taxonomy.md +0 -0
  49. /package/skills/{dingtalk-agent-eval → core/dingtalk-agent-eval}/references/storage-modes.md +0 -0
  50. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/SKILL.md +0 -0
  51. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
  52. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/assets/task-checkpoint.json +0 -0
  53. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/action-contract.md +0 -0
  54. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/event-to-behavior.md +0 -0
  55. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/memory-and-evolution.md +0 -0
  56. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/perception-and-gates.md +0 -0
  57. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/runtime-modes.md +0 -0
  58. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/task-lifecycle.md +0 -0
  59. /package/skills/{dingtalk-agent-boot-multica → platforms/multica-dingtalk/dingtalk-agent-boot-multica}/SKILL.md +0 -0
  60. /package/skills/{dingtalk-agent-deploy → platforms/multica-dingtalk/dingtalk-agent-deploy-multica}/references/multica-deployment-contract.md +0 -0
  61. /package/skills/{dingtalk-agent-deploy → platforms/multica-dingtalk/dingtalk-agent-deploy-multica}/references/promotion-observation-contract.md +0 -0
  62. /package/skills/{multica-fde-external → platforms/multica-dingtalk/multica-external}/scripts/multica_ext.py +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
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.4-beta.13 - 2026-07-19
6
+
7
+ ### Changed
8
+
9
+ - Bundled skills reorganize by platform: `skills/core/` carries the universal suite (basic-behavior, compose, eval) and `skills/platforms/multica-dingtalk/` carries the platform pack, with a `deap` coming-soon placeholder; all code resolves sources through the `bundledSkillPath` registry. Installed canonical layout stays flat.
10
+ - Platform skill names disclose their platform: `dingtalk-agent-deploy` → `dingtalk-agent-deploy-multica`, `multica-fde-external` → `multica-external`. The platform registry binds roles to exact skills (deploy/boot/ops); `agent-platform list|show` display the mapping, `platformSkillForRole` exposes it programmatically, and `deploy`/`promote`/`observe` disclose the carrying skill on stderr.
11
+ - `agent-platform show|use` list local Multica login targets (profile, server URL, workspace — never tokens), and compose 0.8.0 makes user confirmation of endpoint/workspace/agent-name the first hard rule of the Multica publish chain, alongside plain-Markdown instructions with readback, empty `--model` by default, mandatory basic-behavior push/attach with a boot declaration, two-probe chat acceptance, and the dws-first robot-binding priority (list or user-confirmed create + `dingtalk-bind`, reuse existing installs, scan-QR as fallback, never a blocking `--wait`).
12
+ - The contract runner gains `--only=<ids>` for targeted verification; AGENTS.md reserves the full 61-scenario suite and `release:check` for deep regression and release acceptance.
13
+
14
+ ### Release boundary
15
+
16
+ - Distribution is limited to the public npm `beta` dist-tag, a Git tag, and a GitHub pre-release. The renamed skill was also pushed to the dedicated pre-environment registry with explicit user authorization; no robot, webhook, schedule, Trigger, or other DingTalk/Multica side effect is created. Live waivers from beta.9 remain unchanged.
17
+
5
18
  ## 0.1.4-beta.12 - 2026-07-19
6
19
 
7
20
  ### Added
package/README.en.md CHANGED
@@ -204,7 +204,7 @@ dta deploy --workspace multica-dev --retire --dry-run --json
204
204
  dta deploy --workspace multica-dev --retire --plan-id <plan-id> --yes --json
205
205
  ```
206
206
 
207
- A timed-out write persists its operation/Receipt and enters `reconciling`; status performs independent reads rather than retrying or rolling back an ambiguous action. If Agent create returned no ID, recovery reads candidates by stable ID and binds only one exact instructions/runtime fingerprint match, never a display name alone. Confirmed failures roll back only changes managed by the current operation. Retire archives the exact Agent without deleting Skills, Issues, semantic storage, or evidence history. Deploy never creates a robot, webhook, schedule, or other Trigger. The `dingtalk-agent-deploy` Skill only guides these stable CLI calls; it does not write through Multica directly or retain credentials.
207
+ A timed-out write persists its operation/Receipt and enters `reconciling`; status performs independent reads rather than retrying or rolling back an ambiguous action. If Agent create returned no ID, recovery reads candidates by stable ID and binds only one exact instructions/runtime fingerprint match, never a display name alone. Confirmed failures roll back only changes managed by the current operation. Retire archives the exact Agent without deleting Skills, Issues, semantic storage, or evidence history. Deploy never creates a robot, webhook, schedule, or other Trigger. The `dingtalk-agent-deploy-multica` Skill only guides these stable CLI calls; it does not write through Multica directly or retain credentials.
208
208
 
209
209
  W5 links designated W2 Eval evidence to a W4 Receipt as an explicit Promotion chain. A policy freezes source/target Workspaces, suite, minimum runs, required cases, and evidence surfaces. Dry-run recomputes the Definition/Skill, managed Workspace, plan/suite/report, and deployment hashes without Provider calls. Only the current planId plus explicit confirmation may delegate to W4 deploy. The resulting Promotion Receipt binds source, Eval, the historical deployment Receipt, and the final observed hash.
210
210
 
package/README.md CHANGED
@@ -121,7 +121,7 @@ npx skills add D1-2004/dingtalk-agent \
121
121
  从本地 checkout 安装则使用:
122
122
 
123
123
  ```bash
124
- npx skills add ./skills/dingtalk-basic-behavior \
124
+ npx skills add ./skills/core/dingtalk-basic-behavior \
125
125
  --global --yes --agent claude-code --agent codex --agent opencode
126
126
  ```
127
127
 
@@ -341,7 +341,7 @@ dta workspace status multica-dev --json
341
341
 
342
342
  回读证据只保存最小资源事实和原始输出 hash,不保存 Token、邮箱、Server URL 明文、Agent instructions/runtime config 或 Skill content。身份、默认 Workspace、scope、稳定 ID、Skill 唯一性或 evidence hash 任一不符都 fail closed;成功后 state 仍是 `verifying`,`readyForApply=true` 只表示可以进入 W4 规划。
343
343
 
344
- 部署、晋级等平台命令先经过 managed agent platform 归属门禁。工作区用 `dta agent-platform use multica-dingtalk` 声明归属(写入 `dingtalk-agent.json#agentPlatform` 或 `.dingtalk-agent/agent-platform.json`,也可用 `DTA_AGENT_PLATFORM` 环境变量覆盖),声明时才按需安装该平台的技能包(deploy、boot-multica 与 multica-fde-external 平台运维工具);`dta agent-platform list` 展示注册表——当前已支持 `multica-dingtalk`,`deap` 敬请期待。`agent-platform show/use` 同时输出平台工具链 readiness(multica CLI 未装、未登录或存在代理变量时给出可执行的安装/登录/绕代理提示);未归属、未知或 coming-soon 平台上的 `deploy`/`promote`/`observe` 一律 fail-closed;已声明 Multica Provider 的项目可被自动推断为 `multica-dingtalk`。后续所有平台相关的方法学都随对应平台的技能包分发,不进入 CLI 与基础行为。
344
+ 部署、晋级等平台命令先经过 managed agent platform 归属门禁。工作区用 `dta agent-platform use multica-dingtalk` 声明归属(写入 `dingtalk-agent.json#agentPlatform` 或 `.dingtalk-agent/agent-platform.json`,也可用 `DTA_AGENT_PLATFORM` 环境变量覆盖),声明时才按需安装该平台的技能包(deploy、boot-multica 与 multica-external 平台运维工具);`dta agent-platform list` 展示注册表——当前已支持 `multica-dingtalk`,`deap` 敬请期待。`agent-platform show/use` 同时输出平台工具链 readiness(multica CLI 未装、未登录或存在代理变量时给出可执行的安装/登录/绕代理提示);未归属、未知或 coming-soon 平台上的 `deploy`/`promote`/`observe` 一律 fail-closed;已声明 Multica Provider 的项目可被自动推断为 `multica-dingtalk`。后续所有平台相关的方法学都随对应平台的技能包分发,不进入 CLI 与基础行为。
345
345
 
346
346
  W4 用 `dta deploy` 把这份可信 inspection 变成 plan-bound apply。dry-run 固定 profile/workspace/runtime/Agent/Definition/Skill tree hash 和 forward/rollback 最大写预算,apply 前重新回读同一条 ID 链;只有显式 `--plan-id` 与 `--yes` 才会创建或更新。CLI 会精确同步受管 Boot、Basic、Role Skill 完整树和唯一 assignment,再通过专用 Issue 回读 Skill tool trace 与精确 JSON response;两个证据都通过才从 `verifying` 进入 `ready`:
347
347
 
@@ -355,7 +355,7 @@ dta deploy --workspace multica-dev --retire --dry-run --json
355
355
  dta deploy --workspace multica-dev --retire --plan-id <plan-id> --yes --json
356
356
  ```
357
357
 
358
- 写命令超时会保存 operation/Receipt 并进入 `reconciling`;后续 status 只独立回读,不盲重试或把不确定操作回滚。Agent create 若没返回 ID,只能逐个读取稳定候选 ID,并在唯一完整 instructions/runtime 指纹匹配时恢复绑定,不能按显示名认领。确认失败只回滚当前 operation 的受管修改;retire 只归档精确 Agent,不删除 Skill、Issue、语义存储或历史证据。部署不创建机器人、Webhook、定时器或其他 Trigger。`dingtalk-agent-deploy` Skill 只辅导调用这组稳定 CLI,不直接调用 Multica 写命令,也不保存登录凭据。
358
+ 写命令超时会保存 operation/Receipt 并进入 `reconciling`;后续 status 只独立回读,不盲重试或把不确定操作回滚。Agent create 若没返回 ID,只能逐个读取稳定候选 ID,并在唯一完整 instructions/runtime 指纹匹配时恢复绑定,不能按显示名认领。确认失败只回滚当前 operation 的受管修改;retire 只归档精确 Agent,不删除 Skill、Issue、语义存储或历史证据。部署不创建机器人、Webhook、定时器或其他 Trigger。`dingtalk-agent-deploy-multica` Skill 只辅导调用这组稳定 CLI,不直接调用 Multica 写命令,也不保存登录凭据。
359
359
 
360
360
  W5 把 W2 的指定 Eval evidence 与 W4 Receipt 串成显式 Promotion 链。Policy 冻结源/目标 Workspace、suite、最少 runs、必须 case 和四个证据面;dry-run 重算 Definition/Skill、managed Workspace、plan/suite/report 与 deployment hash,零 Provider 调用。只有当前 planId 和显式确认才委托 W4 deploy,Promotion Receipt 会绑定 source、Eval、历史 deployment Receipt 与最终 observed hash。
361
361
 
@@ -708,19 +708,18 @@ npm run eval:contract
708
708
  ## 项目结构
709
709
 
710
710
  ```text
711
- bin/ CLI composition root
712
- src/ TypeScript runtime
713
- skills/dingtalk-basic-behavior/ 可安装的基础行为 Skill
714
- skills/dingtalk-agent-compose/ 已有仓库的 Agent 装配与增强 Skill
715
- skills/dingtalk-agent-eval/ 场景分类、多证据断言与晋级 Skill
716
- skills/dingtalk-agent-deploy/ Multica 受控部署、晋级与观测 Skill
717
- skills/dingtalk-agent-boot-multica/ 部署产物在 Multica Host 内的启动协议 Skill
718
- examples/agents/ 可复制的 FDE 教练与发布经理 Agent kit
719
- lab/ 评测目录、联调 manifest、schemarunbook
720
- templates/ Workspace 与行为模板
721
- evals/ 合同、fixture 与 shadow runner
722
- docs/ 架构、决策和调研文档
723
- .github/ CI 与协作模板
711
+ bin/ CLI composition root(唯一入口;业务规则在 src/)
712
+ src/ TypeScript 运行时:事务边界、双半闸门、平台注册表、Provider
713
+ skills/ 内置 Skill,两层组织(详见 skills/README.md)
714
+ core/ 通用套装:dingtalk-basic-behavior 基础行为 · dingtalk-agent-compose 装配 · dingtalk-agent-eval 评测
715
+ platforms/ 按 Managed Agent Platform 装填:multica-dingtalk/(deploy · boot-multica · fde-external)· deap/(敬请期待)
716
+ templates/ dta init 落盘的行为包与场域策略模板
717
+ examples/ 可复制的岗位 Agent kit(FDE 教练、发布经理)
718
+ evals/ L0 确定性合同评测与 shadow runner(61 场景)
719
+ lab/ L1–L4 联调与 Live 评测控制面(manifest、schemarunbook
720
+ scripts/ 构建后处理与发布验收(release-readiness)
721
+ docs/ 架构、Schema、决策与实施计划
722
+ .github/ CI 与协作模板
724
723
  ```
725
724
 
726
725
  ## 深入阅读
@@ -39,7 +39,7 @@ import { checkpointTask, showTaskCheckpoint } from '../src/memory/task-checkpoin
39
39
  import { upsertOperationalMemory } from '../src/memory/operational.js';
40
40
  import { proposeMemoryCandidate, publishMemoryCandidate, reviewMemoryCandidate, showMemoryCandidate, } from '../src/memory/candidates.js';
41
41
  import { installBundledSkills, installGlobalSkill, skillStatus, skillSuiteStatus, uninstallBundledSkills, uninstallGlobalSkill, upgradeBundledSkills, upgradeGlobalSkill, } from '../src/skill-manager.js';
42
- import { agentPlatformReadiness, MANAGED_AGENT_PLATFORMS, requireSupportedAgentPlatform, resolveAgentPlatform, statusLabel as platformStatusLabel, useAgentPlatform, } from '../src/agent-platform.js';
42
+ import { agentPlatformReadiness, MANAGED_AGENT_PLATFORMS, multicaTargets, platformSkillForRole, requireSupportedAgentPlatform, resolveAgentPlatform, statusLabel as platformStatusLabel, useAgentPlatform, } from '../src/agent-platform.js';
43
43
  const PACKAGE_ROOT = resolvePackageRoot(import.meta.url);
44
44
  const PACKAGE_JSON = JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8'));
45
45
  // ROOT = **你的工作区**(当前目录),不是包所在的目录。
@@ -233,7 +233,8 @@ async function main() {
233
233
  return;
234
234
  }
235
235
  if (cmd === 'deploy') {
236
- requireSupportedAgentPlatform('deploy', PROJECT_START);
236
+ const platformForDeploy = requireSupportedAgentPlatform('deploy', PROJECT_START);
237
+ disclosePlatformSkill(platformForDeploy, 'deploy');
237
238
  const { values: o, positionals } = parseArgs({
238
239
  args: argv.slice(1), allowPositionals: true,
239
240
  options: {
@@ -309,7 +310,8 @@ async function main() {
309
310
  return;
310
311
  }
311
312
  if (cmd === 'promote') {
312
- requireSupportedAgentPlatform('promote', PROJECT_START);
313
+ const platformForPromote = requireSupportedAgentPlatform('promote', PROJECT_START);
314
+ disclosePlatformSkill(platformForPromote, 'deploy');
313
315
  const { values: o, positionals } = parseArgs({
314
316
  args: argv.slice(1), allowPositionals: true,
315
317
  options: {
@@ -369,7 +371,8 @@ async function main() {
369
371
  return;
370
372
  }
371
373
  if (cmd === 'observe') {
372
- requireSupportedAgentPlatform('observe', PROJECT_START);
374
+ const platformForObserve = requireSupportedAgentPlatform('observe', PROJECT_START);
375
+ disclosePlatformSkill(platformForObserve, 'deploy');
373
376
  const { values: o, positionals } = parseArgs({
374
377
  args: argv.slice(1), allowPositionals: true,
375
378
  options: {
@@ -740,11 +743,13 @@ async function main() {
740
743
  fail('agent-platform show 不接受位置参数');
741
744
  const out = resolveAgentPlatform(PROJECT_START);
742
745
  const readiness = out.definition ? agentPlatformReadiness(out.definition.name) : [];
746
+ const targets = out.definition?.name === 'multica-dingtalk' ? multicaTargets() : [];
743
747
  if (o.json)
744
- console.log(JSON.stringify({ ...out, readiness }, null, 2));
748
+ console.log(JSON.stringify({ ...out, readiness, targets }, null, 2));
745
749
  else {
746
750
  printAgentPlatformResolution(out);
747
751
  printAgentPlatformReadiness(readiness);
752
+ printMulticaTargets(targets);
748
753
  }
749
754
  return;
750
755
  }
@@ -755,18 +760,20 @@ async function main() {
755
760
  packageRoot: PACKAGE_ROOT, installSkills: !o['no-install'],
756
761
  });
757
762
  const readiness = out.definition ? agentPlatformReadiness(out.definition.name) : [];
763
+ const targets = out.definition?.name === 'multica-dingtalk' ? multicaTargets() : [];
758
764
  if (o.json)
759
- console.log(JSON.stringify({ ...out, readiness }, null, 2));
765
+ console.log(JSON.stringify({ ...out, readiness, targets }, null, 2));
760
766
  else {
761
767
  console.log(`✅ 工作区已归属 ${out.definition?.label}(写入 ${out.written})`);
762
768
  for (const install of out.skillInstalls)
763
769
  printSkillStatus(install, 'install', false);
764
770
  if (!out.skillInstalls.length) {
765
771
  console.log(out.definition?.skills.length
766
- ? ` 已跳过平台技能包安装(--no-install):${out.definition.skills.join(', ')}`
772
+ ? ` 已跳过平台技能包安装(--no-install):${out.definition.skills.map((item) => item.name).join(', ')}`
767
773
  : ' 该平台无需额外技能包。');
768
774
  }
769
775
  printAgentPlatformReadiness(readiness);
776
+ printMulticaTargets(targets);
770
777
  }
771
778
  return;
772
779
  }
@@ -1452,7 +1459,7 @@ function printAgentPlatform(platform) {
1452
1459
  console.log(`${platform.status === 'supported' ? '✅' : '⏳'} ${platform.name} · ${platform.label} · ${platformStatusLabel(platform.status)}`);
1453
1460
  console.log(` ${platform.description}`);
1454
1461
  if (platform.skills.length)
1455
- console.log(` 技能包: ${platform.skills.join(', ')}`);
1462
+ console.log(` 技能包: ${platform.skills.map((item) => `${item.role}→${item.name}`).join(' · ')}`);
1456
1463
  if (platform.commands.length)
1457
1464
  console.log(` 平台命令: ${platform.commands.map((item) => `dta ${item}`).join(' · ')}`);
1458
1465
  }
@@ -1466,7 +1473,21 @@ function printAgentPlatformResolution(out) {
1466
1473
  console.log(`${known ? '✅' : '❌'} 当前 platform: ${out.platform}${known ? ` · ${known.label} · ${platformStatusLabel(known.status)}` : '(未知)'}`);
1467
1474
  console.log(` 来源: ${out.source}${out.file ? ` · ${out.file}` : ''}`);
1468
1475
  if (known?.skills.length)
1469
- console.log(` 技能包: ${known.skills.join(', ')}`);
1476
+ console.log(` 技能包: ${known.skills.map((item) => `${item.role}→${item.name}`).join(' · ')}`);
1477
+ }
1478
+ // 披露:dta 层平台命令关联到平台内确切的 Skill(诊断信息走 stderr,不污染 --json stdout)。
1479
+ function disclosePlatformSkill(resolution, role) {
1480
+ const skillName = resolution.definition ? platformSkillForRole(resolution.definition.name, role) : null;
1481
+ if (skillName)
1482
+ console.error(`提示: 平台 ${resolution.definition.name} 的该命令方法学由 Skill ${skillName} 承载`);
1483
+ }
1484
+ function printMulticaTargets(targets) {
1485
+ if (!targets.length)
1486
+ return;
1487
+ console.log(' 本机 Multica 登录目标(发布前必须与用户确认 endpoint 与 workspace):');
1488
+ for (const target of targets) {
1489
+ console.log(` - profile=${target.profile} · ${target.serverUrl}${target.workspaceId ? ` · workspace=${target.workspaceId}` : ''}`);
1490
+ }
1470
1491
  }
1471
1492
  function printAgentPlatformReadiness(checks) {
1472
1493
  for (const check of checks) {