@xdxer/dingtalk-agent 0.1.4-beta.2 → 0.1.4-beta.3
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/README.md +2 -2
- package/dist/bin/dingtalk-agent.js +12 -14
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/setup.js +2 -5
- package/dist/src/setup.js.map +1 -1
- package/dist/src/skill-manager.js +80 -192
- package/dist/src/skill-manager.js.map +1 -1
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/INSTALLATION.md +14 -3
- package/evals/evals.json +10 -10
- package/evals/run-contract-evals.mjs +21 -32
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -89,7 +89,7 @@ npx skills add ./skills/dingtalk-basic-behavior \
|
|
|
89
89
|
--global --yes --agent claude-code --agent codex --agent opencode
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
`npx skills` 只安装行为说明,不安装 `dingtalk-agent` CLI,也不检查 DWS;需要真实执行钉钉动作时仍应运行 `setup` 或 `doctor`。完整排障见 [安装与首次使用](docs/INSTALLATION.md)。
|
|
92
|
+
`dta skill install` 内部也直接委托 `npx skills add`,不再维护独立的复制、软链、marker 或卸载链路。`npx skills` 只安装行为说明,不安装 `dingtalk-agent` CLI,也不检查 DWS;需要真实执行钉钉动作时仍应运行 `setup` 或 `doctor`。完整排障见 [安装与首次使用](docs/INSTALLATION.md)。
|
|
93
93
|
|
|
94
94
|
普通 Agent 会话无需初始化项目。进入任意目录后可直接发现上下文:
|
|
95
95
|
|
|
@@ -254,7 +254,7 @@ npm run eval:contract
|
|
|
254
254
|
|
|
255
255
|
当前确定性合同包含 **29 个场景**,覆盖:
|
|
256
256
|
|
|
257
|
-
-
|
|
257
|
+
- 通过 `npx skills` 委托全局 Skill 安装、发现、重装和卸载;
|
|
258
258
|
- 首次 setup、用户级 PATH、DWS 版本/认证和三端客户端发现;
|
|
259
259
|
- `dta` 短命令安装,以及命令、子命令和参数错误的可恢复提示;
|
|
260
260
|
- 无 init bootstrap、本地/远端 Storage 与类型闸门;
|
|
@@ -46,9 +46,9 @@ dta(dingtalk-agent)—— Skill-first 的钉钉数字员工行为容器
|
|
|
46
46
|
Skill(不要求 Workspace)
|
|
47
47
|
skill install 安装全局 Basic Behavior(Claude Code + Codex + OpenCode)
|
|
48
48
|
skill status 检查版本、漂移和客户端可发现性
|
|
49
|
-
skill upgrade
|
|
50
|
-
skill uninstall
|
|
51
|
-
通用: [--dry-run] [--json]
|
|
49
|
+
skill upgrade 通过 npx skills 重装当前包内 Skill
|
|
50
|
+
skill uninstall 通过 npx skills 卸载全局 Skill
|
|
51
|
+
通用: [--dry-run] [--json];安装生命周期委托给 npx skills
|
|
52
52
|
|
|
53
53
|
每个 Agent Session(不要求 init)
|
|
54
54
|
bootstrap 发现当前本地 Workspace;不修改项目文件
|
|
@@ -185,13 +185,9 @@ async function main() {
|
|
|
185
185
|
args: argv.slice(2),
|
|
186
186
|
options: {
|
|
187
187
|
'dry-run': { type: 'boolean' }, json: { type: 'boolean' },
|
|
188
|
-
'discard-local-changes': { type: 'boolean' },
|
|
189
188
|
},
|
|
190
189
|
});
|
|
191
|
-
const options = {
|
|
192
|
-
dryRun: o['dry-run'],
|
|
193
|
-
discardLocalChanges: o['discard-local-changes'],
|
|
194
|
-
};
|
|
190
|
+
const options = { dryRun: o['dry-run'] };
|
|
195
191
|
let out;
|
|
196
192
|
if (sub === 'install')
|
|
197
193
|
out = installGlobalSkill(PACKAGE_ROOT, options);
|
|
@@ -719,6 +715,9 @@ function errorHint(message) {
|
|
|
719
715
|
if (/\bDWS\b|\bdws\b/.test(message)) {
|
|
720
716
|
return '运行 dta doctor 检查 DWS 路径、版本和认证;需要登录时执行 dws auth login。';
|
|
721
717
|
}
|
|
718
|
+
if (/skills CLI|\bnpx\b/.test(message)) {
|
|
719
|
+
return '确认 node、npm、npx 在 PATH 中;也可以复制错误中的 npx skills 命令单独执行。';
|
|
720
|
+
}
|
|
722
721
|
if (/Workspace|Field|Storage|contextId/.test(message)) {
|
|
723
722
|
return '先运行 dta bootstrap --json 查看当前上下文;确实需要持久 Workspace 时再运行 dta init。';
|
|
724
723
|
}
|
|
@@ -764,16 +763,15 @@ function printSkillStatus(out, action, dryRun) {
|
|
|
764
763
|
const prefix = dryRun ? 'DRY-RUN' : '✅';
|
|
765
764
|
const verb = action === 'status' ? '全局 Skill 状态' : `skill ${action}`;
|
|
766
765
|
console.log(`${prefix} ${verb}: ${out.name}`);
|
|
767
|
-
console.log(` bundled=${out.bundled.skillVersion || '-'}
|
|
766
|
+
console.log(` manager=${out.manager} bundled=${out.bundled.skillVersion || '-'}`);
|
|
768
767
|
console.log(` canonical=${out.canonical.path}`);
|
|
769
|
-
console.log(` installed=${out.canonical.exists}
|
|
770
|
-
`
|
|
768
|
+
console.log(` installed=${out.canonical.exists} installedVersion=${out.canonical.installedVersion || '-'} ` +
|
|
769
|
+
`current=${out.canonical.current}`);
|
|
770
|
+
if (out.operation)
|
|
771
|
+
console.log(` delegated: ${out.operation.command}`);
|
|
771
772
|
for (const client of out.clients) {
|
|
772
773
|
console.log(` ${client.label}=${client.state} (${client.discovery}: ${client.path})`);
|
|
773
774
|
}
|
|
774
|
-
if (out.legacyCodex.conflict) {
|
|
775
|
-
console.log(` ⚠️ legacy Codex 同名路径存在: ${out.legacyCodex.path}`);
|
|
776
|
-
}
|
|
777
775
|
if (action === 'install' && !dryRun) {
|
|
778
776
|
console.log(' 新 Agent 会话将自动发现;当前会话未发现时请重启 Claude Code/Codex。');
|
|
779
777
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dingtalk-agent.js","sourceRoot":"","sources":["../../bin/dingtalk-agent.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n// dingtalk-agent —— 钉钉数字员工的标准范式(TypeScript source)。\n//\n// CLI = 拦 标准动作:可程序化、可强制、可验证。撞上去没得商量。\n// Skill = 劝 判断:只有 LLM 能做的(该不该答、话题归属、怎么写点评)。\n// 本体 = 记 它是谁 + 它知道什么。git clone 就带走。\n//\n// **分界线:凡是能程序化的,收进 CLI;凡是需要判断的,留在 Skill。**\n//\n// 因为:文档会被漏读、误读、自我说服;**撞到闸门上就没得商量。**\n\nimport { parseArgs } from 'node:util'\nimport { join, resolve } from 'node:path'\nimport { readFileSync } from 'node:fs'\nimport { spawn, spawnSync } from 'node:child_process'\n\nimport * as cfgmod from '../src/config.js'\nimport * as kbmod from '../src/kb.js'\nimport * as runsmod from '../src/runs.js'\nimport * as dutymod from '../src/duty.js'\nimport { boot } from '../src/boot.js'\nimport { init } from '../src/init.js'\nimport { ackDispatch, listPendingDispatches, prepareSession } from '../src/sessions.js'\nimport { readEventFile, consumeNdjson, heartbeatEvent } from '../src/driver.js'\nimport { findRun, previewAction, executeAction } from '../src/actions.js'\nimport { resolvePackageRoot } from '../src/package-root.js'\nimport { bootstrap } from '../src/bootstrap.js'\nimport { doctor } from '../src/doctor.js'\nimport { setup } from '../src/setup.js'\nimport {\n installGlobalSkill, skillStatus, uninstallGlobalSkill, upgradeGlobalSkill,\n type GlobalSkillStatus,\n} from '../src/skill-manager.js'\n\nconst PACKAGE_ROOT = resolvePackageRoot(import.meta.url)\nconst PACKAGE_JSON = JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8'))\n\n// ROOT = **你的工作区**(当前目录),不是包所在的目录。\n// 全局装 / npx 跑的时候,包住在 node_modules 里 —— 那不是 agent 的家。\nconst ROOT = process.env.DTA_ROOT\n ? resolve(process.env.DTA_ROOT)\n : (cfgmod.findRoot(process.cwd()) || process.cwd())\n\nconst HELP = `\ndta(dingtalk-agent)—— Skill-first 的钉钉数字员工行为容器\n\n 用法: dta <command> [options]\n 完整名称 dingtalk-agent 与 dta 完全等价。\n\n 首次使用(无全局命令时: npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${PACKAGE_JSON.version} setup)\n setup 用户级安装 CLI、修复 PATH、安装 Skill、检查 DWS\n doctor 检查 PATH / Node / DWS / Skill / Agent 客户端\n\n Skill(不要求 Workspace)\n skill install 安装全局 Basic Behavior(Claude Code + Codex + OpenCode)\n skill status 检查版本、漂移和客户端可发现性\n skill upgrade 升级本工具管理的全局 Skill\n skill uninstall 安全卸载本工具管理的全局 Skill\n 通用: [--dry-run] [--json] [--discard-local-changes]\n\n 每个 Agent Session(不要求 init)\n bootstrap 发现当前本地 Workspace;不修改项目文件\n [--storage <uri>] local-dir:<path> | dingtalk-doc:<node-or-url>\n [--state-dir <path>] 远端文档只读快照目录\n [--profile <dws-profile>] [--json]\n\n 可信事件模式(可选;需要一次 init)\n init [--context-id X] 仅为 Prepared Run 建最小 Workspace\n prepare --event-file <file|-> 事件 → Session → Run\n act ack 对原消息贴「收到」;不代表接单\n act reply --text \"…\" 引用回复原消息\n act ask --text \"…\" 只问一个真正阻塞的问题\n act silence [--reason \"…\"] 不外发,但留下行为回执\n 通用: [--run <path>] [--dry-run] [--json]\n\n smoke 极简本地验收(不写钉钉)\n eval contract / behavior 完整合同或模型行为评测\n\n help runtime 事件宿主与 controller 命令\n help adapters 可选 DWS listen 适配器\n help legacy 查看兼容的本体、KB、值班与进化命令\n`\n\nconst RUNTIME_HELP = `\ndingtalk-agent 可信事件运行时(可选宿主能力)\n\n init [--context-id X] [--memory <uri>] [--knowledge <uri>]\n prepare --event-file <file|->\n run --stdin | --event-file <file> | --heartbeat\n dispatch pending\n dispatch ack --event-id X --run-id X\n act ack|reply|ask|silence\n\n这些命令负责目标冻结、Session/Run、Wait、幂等和回执;普通 Agent Session 不必使用。\n`\n\nconst ADAPTER_HELP = `\ndingtalk-agent 可选 Driver / 开发联调适配器\n\n listen mention --once\n listen dm --user <userId> --once\n listen group --group <openConversationId> --once\n\nlisten 不是 Agent 主入口。Claude Code、DWS 云端或其他宿主都可以直接提供事件。\n`\n\nconst LEGACY_HELP = `\ndingtalk-agent 兼容命令(不属于 P0 四对象主链)\n\n boot\n kb mount|list|sync|search\n duty --check|--run|--list\n todo\n log / feedback / runs / evolve\n\n这些能力继续可用,但新增 Agent 应先安装全局 Skill;只有可信事件宿主才需要 runtime。\n`\n\nfunction fail(msg: string, code = 1, hint = ''): never {\n console.error(`错误: ${msg}`)\n if (hint) console.error(`提示: ${hint}`)\n process.exit(code)\n}\n\nconst argv = process.argv.slice(2)\nconst cmd = argv[0]\nconst sub = argv[1]\n\ntry { await main() } catch (e) {\n const error = e as Error & { exitCode?: number }\n const message = String(error?.message || error)\n fail(message, Number(error?.exitCode) || 2, errorHint(message))\n}\n\nasync function main() {\n if (cmd === 'help' && sub === 'legacy') { console.log(LEGACY_HELP); return }\n if (cmd === 'help' && sub === 'runtime') { console.log(RUNTIME_HELP); return }\n if (cmd === 'help' && sub === 'adapters') { console.log(ADAPTER_HELP); return }\n if (!cmd || cmd === '--help' || cmd === '-h' || cmd === 'help') { console.log(HELP); return }\n if (cmd === '--version' || cmd === '-V' || cmd === 'version') {\n console.log(PACKAGE_JSON.version)\n return\n }\n\n // ── setup / doctor:npx 永远可启动的首次使用入口。──\n if (cmd === 'setup') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: {\n prefix: { type: 'string' }, 'dry-run': { type: 'boolean' },\n 'no-shell-write': { type: 'boolean' }, 'skip-cli-install': { type: 'boolean' },\n json: { type: 'boolean' },\n },\n })\n const out = setup(PACKAGE_ROOT, {\n prefix: o.prefix,\n dryRun: o['dry-run'],\n writeShell: !o['no-shell-write'],\n skipCliInstall: o['skip-cli-install'],\n })\n if (o.json) console.log(JSON.stringify(out, null, 2))\n else printSetup(out)\n if (!out.doctor.ready) process.exitCode = 2\n return\n }\n\n if (cmd === 'doctor') {\n const { values: o } = parseArgs({\n args: argv.slice(1), options: { json: { type: 'boolean' } },\n })\n const out = doctor(PACKAGE_ROOT)\n if (o.json) console.log(JSON.stringify(out, null, 2))\n else printDoctor(out)\n if (!out.ready) process.exitCode = 2\n return\n }\n\n // ── skill:唯一一次性的主入口;完全不依赖 Workspace。──\n if (cmd === 'skill') {\n const { values: o } = parseArgs({\n args: argv.slice(2),\n options: {\n 'dry-run': { type: 'boolean' }, json: { type: 'boolean' },\n 'discard-local-changes': { type: 'boolean' },\n },\n })\n const options = {\n dryRun: o['dry-run'],\n discardLocalChanges: o['discard-local-changes'],\n }\n let out: GlobalSkillStatus\n if (sub === 'install') out = installGlobalSkill(PACKAGE_ROOT, options)\n else if (sub === 'status') out = skillStatus(PACKAGE_ROOT, options)\n else if (sub === 'upgrade') out = upgradeGlobalSkill(PACKAGE_ROOT, options)\n else if (sub === 'uninstall') out = uninstallGlobalSkill(PACKAGE_ROOT, options)\n else fail(\n `不认识的 skill 子命令: ${sub || '(缺失)'}`,\n 1,\n `可用命令: dta skill install | status | upgrade | uninstall${suggest(sub || '', ['install', 'status', 'upgrade', 'uninstall'], 'dta skill')}`,\n )\n if (o.json) console.log(JSON.stringify(out, null, 2))\n else printSkillStatus(out, sub, Boolean(o['dry-run']))\n return\n }\n\n // ── bootstrap:当前 Agent Session 按需发现/拉取语义上下文。──\n if (cmd === 'bootstrap') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: {\n storage: { type: 'string' }, 'state-dir': { type: 'string' },\n profile: { type: 'string' }, json: { type: 'boolean' },\n },\n })\n const out = bootstrap(ROOT, {\n storage: o.storage, stateDir: o['state-dir'], profile: o.profile,\n })\n if (o.json) console.log(JSON.stringify(out, null, 2))\n else {\n console.log(`✅ ${out.mode === 'workspace' ? '已装载 Workspace' : '直接会话模式'}`)\n console.log(` scope=${out.scopeId} initialized=${out.initialized}`)\n if (!out.mounts.length) console.log(' 没有发现持久上下文;这不是错误,也不需要自动 init。')\n for (const mount of out.mounts) console.log(` ${mount.slot}: ${mount.path}`)\n console.log(` ${out.note}`)\n }\n return\n }\n\n // ── init ──\n if (cmd === 'init') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: {\n 'context-id': { type: 'string' }, id: { type: 'string' },\n memory: { type: 'string' }, knowledge: { type: 'string' },\n },\n })\n // init 的语义是“初始化当前目录”;不能因为父目录恰好有配置就改到父工作区。\n init(process.env.DTA_ROOT ? ROOT : process.cwd(), {\n contextId: o['context-id'], id: o.id,\n memory: o.memory, knowledge: o.knowledge,\n })\n return\n }\n\n // ── prepare:一个事件物化成一个可交给沙箱的 Run ──\n if (cmd === 'prepare') {\n const cfg = cfgmod.must(ROOT)\n const { values: o, positionals } = parseArgs({\n args: argv.slice(1), allowPositionals: true,\n options: {\n 'event-file': { type: 'string' }, field: { type: 'string' },\n 'session-key': { type: 'string' }, 'context-id': { type: 'string' },\n json: { type: 'boolean' },\n },\n })\n const file = o['event-file'] || positionals[0]\n if (!file) fail('prepare 需要 --event-file <file|->')\n const out = prepareSession(ROOT, cfg, readEventFile(file), {\n fieldId: o.field, sessionKey: o['session-key'], contextId: o['context-id'],\n })\n printDispatch(out, o.json)\n return\n }\n\n // ── run:不内置模型,只把事件流转换为 sandbox dispatch ──\n if (cmd === 'run') {\n const cfg = cfgmod.must(ROOT)\n const { values: o, positionals } = parseArgs({\n args: argv.slice(1), allowPositionals: true,\n options: {\n stdin: { type: 'boolean' }, 'event-file': { type: 'string' },\n field: { type: 'string' }, 'session-key': { type: 'string' },\n 'context-id': { type: 'string' },\n heartbeat: { type: 'boolean' }, 'heartbeat-key': { type: 'string' },\n 'heartbeat-event-id': { type: 'string' },\n },\n })\n const options = {\n fieldId: o.field, sessionKey: o['session-key'], contextId: o['context-id'],\n }\n const modes = [Boolean(o.stdin), Boolean(o.heartbeat), Boolean(o['event-file'] || positionals[0])]\n if (modes.filter(Boolean).length !== 1) {\n fail('run 的 --stdin / --event-file <file> / --heartbeat 必须且只能选一个')\n }\n if (o.stdin) {\n const result = await consumeNdjson(ROOT, cfg, process.stdin, options)\n if (result.rejected) process.exitCode = 2\n return\n }\n let event\n if (o.heartbeat) event = heartbeatEvent(o['heartbeat-key'], o['heartbeat-event-id'])\n else {\n const file = o['event-file'] || positionals[0]\n if (!file) fail('run 需要 --stdin / --event-file <file> / --heartbeat 三选一')\n event = readEventFile(file)\n }\n const out = prepareSession(ROOT, cfg, event, options)\n process.stdout.write(JSON.stringify(out) + '\\n')\n return\n }\n\n // ── listen:本地 DWS Driver;云端 Driver 仍走 run --stdin/--event-file。──\n if (cmd === 'listen') {\n const cfg = cfgmod.must(ROOT)\n const modes: Record<string, { event: string; required?: 'user' | 'group' }> = {\n mention: { event: 'user_im_message_receive_at' },\n dm: { event: 'user_im_message_receive_o2o', required: 'user' },\n group: { event: 'user_im_message_receive_group', required: 'group' },\n }\n const mode = modes[sub]\n if (!mode) fail('listen 的类型只能是 mention / dm / group')\n const { values: o } = parseArgs({\n args: argv.slice(2),\n options: {\n user: { type: 'string' }, group: { type: 'string' },\n once: { type: 'boolean' }, duration: { type: 'string' },\n 'dry-run': { type: 'boolean' }, 'context-id': { type: 'string' },\n field: { type: 'string' }, 'session-key': { type: 'string' },\n },\n })\n if (mode.required === 'user' && !o.user) fail('listen dm 需要 --user <userId>')\n if (mode.required === 'group' && !o.group) fail('listen group 需要 --group <openConversationId>')\n\n const dwsArgs = ['event', 'consume', mode.event, '-f', 'ndjson']\n if (o.user) dwsArgs.push('--user', o.user)\n if (o.group) dwsArgs.push('--group', o.group)\n if (o.once) dwsArgs.push('--max-events', '1', '--ephemeral')\n if (o.duration) dwsArgs.push('--duration', o.duration)\n\n if (o['dry-run']) {\n const child = spawnSync('dws', [...dwsArgs, '--dry-run'], { stdio: 'inherit' })\n if (child.error) throw child.error\n process.exitCode = child.status ?? 2\n return\n }\n\n const child = spawn('dws', dwsArgs, { stdio: ['ignore', 'pipe', 'inherit'] })\n const status = new Promise<number>((resolveStatus, rejectStatus) => {\n child.once('error', rejectStatus)\n child.once('close', (code, signal) => {\n if (signal) rejectStatus(new Error(`DWS listener 被 ${signal} 终止`))\n else resolveStatus(code ?? 2)\n })\n })\n const result = await consumeNdjson(ROOT, cfg, child.stdout, {\n fieldId: o.field,\n sessionKey: o['session-key'],\n contextId: o['context-id'],\n })\n const exitCode = await status\n if (exitCode !== 0) fail(`DWS listener 退出码 ${exitCode}`, exitCode)\n if (result.rejected) process.exitCode = 2\n return\n }\n\n // ── dispatch:durable outbox。ack 表示 controller 已幂等入队,不表示 Run 已完成。──\n if (cmd === 'dispatch') {\n const cfg = cfgmod.must(ROOT)\n const { values: o } = parseArgs({\n args: argv.slice(2),\n options: {\n 'event-id': { type: 'string' }, 'run-id': { type: 'string' },\n consumer: { type: 'string' }, json: { type: 'boolean' },\n },\n })\n if (sub === 'pending') {\n for (const out of listPendingDispatches(ROOT, cfg)) {\n process.stdout.write(JSON.stringify(out) + '\\n')\n }\n return\n }\n if (sub === 'ack') {\n if (!o['event-id'] || !o['run-id']) fail('dispatch ack 需要 --event-id 和 --run-id')\n const out = ackDispatch(ROOT, cfg, o['event-id'], o['run-id'], o.consumer || '')\n process.stdout.write(JSON.stringify(out) + '\\n')\n return\n }\n fail('dispatch 的子命令: pending / ack')\n }\n\n // ── act:元语化动作;目标/身份/预算/状态转移都由 Run 固定 ──\n if (cmd === 'act') {\n const kind = sub\n const { values: o } = parseArgs({\n args: argv.slice(2),\n options: {\n run: { type: 'string' }, text: { type: 'string' },\n 'text-file': { type: 'string' }, reason: { type: 'string' },\n 'dry-run': { type: 'boolean' }, json: { type: 'boolean' },\n },\n })\n if (o.text && o['text-file']) fail('--text 和 --text-file 只能选一个')\n const text = o['text-file']\n ? readFileSync(resolve(process.cwd(), o['text-file']), 'utf8')\n : o.text\n const runPath = findRun(process.cwd(), o.run)\n const out = o['dry-run']\n ? previewAction(runPath, kind, { text, reason: o.reason })\n : executeAction(runPath, kind, { text, reason: o.reason })\n if (o.json || o['dry-run']) console.log(JSON.stringify(out, null, 2))\n else {\n console.log(`${out.verified ? '✅' : '⚠️'} ${out.kind} · ${out.outcome} · ${out.toState}`)\n console.log(` action=${out.actionId} run=${out.runId}`)\n if (!out.verified) console.log(` ${out.verification}`)\n }\n if (out.outcome === 'uncertain') process.exitCode = 2\n return\n }\n\n // ── eval:宿主评测入口;shadow 永不调用 act / DWS。──\n if (cmd === 'eval') {\n const script = sub === 'contract'\n ? join(PACKAGE_ROOT, 'evals', 'run-contract-evals.mjs')\n : sub === 'shadow'\n ? join(PACKAGE_ROOT, 'evals', 'runners', 'claude-shadow.mjs')\n : sub === 'behavior'\n ? join(PACKAGE_ROOT, 'evals', 'run-shadow-evals.mjs')\n : ''\n if (!script) fail('eval 的子命令: contract / shadow / behavior')\n const childEnv = { ...process.env }\n // 合同评测会创建隔离工作区;继承宿主 DTA_ROOT 会让 Action Gate 错读外层 control store。\n delete childEnv.DTA_ROOT\n const child = spawnSync(process.execPath, [script, ...argv.slice(2)], {\n cwd: ROOT,\n env: childEnv,\n stdio: 'inherit',\n })\n if (child.error) throw child.error\n if (child.signal) throw new Error(`评测进程被 ${child.signal} 终止`)\n process.exitCode = child.status ?? 2\n return\n }\n\n if (cmd === 'smoke') {\n const script = join(PACKAGE_ROOT, 'evals', 'run-contract-evals.mjs')\n const childEnv = { ...process.env }\n delete childEnv.DTA_ROOT\n const child = spawnSync(process.execPath, [script, '--smoke'], {\n cwd: ROOT, env: childEnv, stdio: 'inherit',\n })\n if (child.error) throw child.error\n if (child.signal) throw new Error(`Smoke 被 ${child.signal} 终止`)\n process.exitCode = child.status ?? 2\n return\n }\n\n // ── kb ──\n if (cmd === 'kb') {\n const cfg = cfgmod.must(ROOT)\n const { values: o } = parseArgs({\n args: argv.slice(2), allowPositionals: true,\n options: {\n name: { type: 'string' }, from: { type: 'string' }, own: { type: 'string' },\n sync: { type: 'string' }, local: { type: 'string' }, force: { type: 'boolean' },\n },\n })\n\n if (sub === 'mount') {\n if (!o.name || !o.from) fail('要 --name 和 --from。源的写法见 --help')\n kbmod.parseSource(o.from) // 写错了当场炸\n const own = o.own || kbmod.EXTERNAL\n const sync = o.sync || (own === kbmod.OWNED ? kbmod.PUSH : kbmod.PULL)\n if (own === kbmod.OWNED && sync === kbmod.PULL) {\n fail('owned 的真值在 Git,不该 pull —— 那会把远端的东西覆盖到本地。\\n' +\n ' **所有权决定真值方向。** owned → push;external → pull。')\n }\n const local = o.local || join('.cache/kb', o.name)\n cfg.kb = (cfg.kb || []).filter((k) => k.name !== o.name)\n cfg.kb.push({ name: o.name, from: o.from, own, sync, local })\n cfgmod.save(ROOT, cfg)\n console.log(`✅ 挂上「${o.name}」 ${o.from}`)\n console.log(` 所有权=${own} · 同步=${sync} · 落在 ${local}`)\n console.log(own === kbmod.OWNED\n ? ' (真值在 Git,钉钉是暴露层。人在钉钉里改了 → sync 时会【停下来问】,不盲覆盖。)'\n : ' (真值在钉钉,本地只是【可丢弃的缓存】。过期了 kb search 会警告。)')\n return\n }\n\n if (sub === 'list') {\n if (!cfg.kb?.length) return console.log('一个都没挂。 kb mount --help')\n for (const kb of cfg.kb) {\n const s = kbmod.stale(kb)\n console.log(` ${s ? '⚠️' : '·'} ${kb.name.padEnd(14)} ${kb.own.padEnd(9)} ${kb.sync.padEnd(5)} ${kb.from}`)\n console.log(` 落在 ${kb.local} 上次同步 ${kb._syncedAt || '从未'}${s ? ' ← **过期了,不许拿来回答**' : ''}`)\n }\n return\n }\n\n if (sub === 'sync') {\n const targets = (cfg.kb || []).filter((k) => !o.name || k.name === o.name)\n if (!targets.length) fail('没有这个知识库。 kb list')\n for (const kb of targets) {\n if (kb.sync === kbmod.NONE) { console.log(` skip ${kb.name}(sync=none)`); continue }\n if (kb.sync === kbmod.PULL) kbmod.pull(kb, ROOT, o.force)\n else kbmod.push(kb, ROOT, o.force)\n }\n cfgmod.save(ROOT, cfg)\n return\n }\n\n if (sub === 'search') {\n const kw = argv[2]\n if (!kw) fail('要给关键词。 kb search \"<关键词>\"')\n kbmod.search(cfg, ROOT, kw)\n return\n }\n fail('kb 的子命令: mount / list / sync / search')\n }\n\n // ── boot ──\n if (cmd === 'boot') { boot(cfgmod.must(ROOT), ROOT); return }\n\n // ── duty ──\n if (cmd === 'duty') {\n const cfg = cfgmod.must(ROOT)\n const { values: o } = parseArgs({\n args: argv.slice(1), allowPositionals: true,\n options: { check: { type: 'boolean' }, run: { type: 'string' },\n list: { type: 'boolean' }, force: { type: 'boolean' } },\n })\n const duties = dutymod.loadDuties(cfg, ROOT)\n if (o.list) {\n const ks = Object.keys(duties)\n console.log(ks.length ? ks.join('\\n')\n : '(值班表是空的 —— 母体出厂如此,这是【正确】的。在 .dingtalk-agent/config.json 的 duties 里加。)')\n return\n }\n if (o.run) {\n const fn = duties[o.run]\n if (!fn) fail(`没有这个值班: ${o.run}(有: ${Object.keys(duties).join('、') || '无'})`)\n const s = fn()\n if (s.kind === '交付' && !dutymod.inDeliver() && !o.force) {\n return console.log(`⏸ 「${o.run}」是外发动作,静默时段顺延,**不打扰第三方**。`)\n }\n if (s.done) return console.log(`✅ 「${o.run}」已完成,本拍无需执行。${s.detail}`)\n console.log(`【${o.run}】该做了。${s.gap}`)\n console.log(` 剧本: ${s.playbook || '(没写剧本 —— 这个值班不合格)'}`)\n console.log(` ⚠️ 送达【回读确认】之后才准记 pass。没送达就写 pass = 自己骗自己。`)\n return\n }\n // --check(默认)\n console.log('值班表(**完成状态在数据里,不在记忆里**;幂等,漏拍下一拍自愈)')\n console.log(` 现在 ${runsmod.now().slice(11, 16)} · ${dutymod.inNight() ? '夜间窗口(重活可跑)' : '白天(重活挂起)'} · 外发窗口${dutymod.inDeliver() ? '开' : '关'}`)\n const ids = Object.keys(duties)\n if (!ids.length) { console.log('\\n (值班表是空的 —— 母体出厂如此。)'); return }\n const todo: string[] = []\n for (const id of ids) {\n const s = duties[id]()\n const mark = s.done ? '✅ 已完成' : (s.due ? '⬜ 待补齐' : '⏸ 不在窗口')\n console.log(` ${s.id.padEnd(8)} [${s.kind}] ${mark} ${s.detail}${s.gap ? ' → ' + s.gap : ''}`)\n if (!s.done && s.due) todo.push(s.id)\n }\n if (todo.length) {\n console.log(`\\n本拍要做: ${todo.map((t) => 'duty --run ' + t).join('、')}`)\n process.exit(1)\n }\n console.log('\\n全部补齐,静默即可(**不要为此打扰主人**)')\n return\n }\n\n // ── 留痕与进化 ──\n if (cmd === 'log' || cmd === 'logq') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: { did: { type: 'string' }, asked: { type: 'string' }, kind: { type: 'string' },\n secs: { type: 'string' }, r: { type: 'string' }, ev: { type: 'string' },\n ch: { type: 'string' }, issue: { type: 'string' },\n conv: { type: 'string' }, msg: { type: 'string' } },\n })\n if (!o.did) fail('要 --did(我怎么答的)')\n const t = runsmod.logq(ROOT, {\n ...o, did: o.did, secs: +(o.secs || 0), r: o.r || 'pass',\n })\n console.log(`运行记录已落: runs/${runsmod.today()}.md @${t}`)\n if (!o.conv) console.log(' ⚠️ 没带 --conv —— 事后【拉不出对话流】,这一条基本没有训练价值。')\n return\n }\n\n if (cmd === 'feedback') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: { kind: { type: 'string' }, text: { type: 'string' },\n conv: { type: 'string' }, at: { type: 'string' } },\n })\n if (!o.kind || ![runsmod.FB_OK, runsmod.FB_MORE, runsmod.FB_FIX].includes(o.kind)) {\n fail('--kind 只能是 认可 / 追问 / 纠正')\n }\n const day = runsmod.today()\n const rows = runsmod.read(ROOT, day)\n let cand = rows.filter((r) => r.asked)\n if (o.conv) cand = cand.filter((r) => r.conv === o.conv)\n if (!cand.length) fail(`今天没有可回填的问答行 —— **是不是答完忘了 logq?**`)\n const tgt = o.at ? cand.find((r) => r.t === o.at) : cand[cand.length - 1]\n if (!tgt) fail(`找不到 t=${o.at} 的行`)\n tgt.fb = o.kind\n if (o.text) tgt.fbt = o.text.slice(0, 600)\n runsmod.write(ROOT, day, rows)\n console.log(`已回填: ${day} @${tgt.t} → 「${o.kind}」(原问: ${(tgt.asked || '').slice(0, 40)})`)\n return\n }\n\n if (cmd === 'runs') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: { days: { type: 'string' }, conv: { type: 'string' },\n issue: { type: 'string' }, top: { type: 'string' } },\n })\n let rows = runsmod.scan(ROOT, +(o.days || 1))\n if (o.conv) {\n rows = rows.filter((r) => r.conv === o.conv)\n console.log(`【对话流】会话 ${o.conv} · ${rows.length} 条 —— **这就是训练素材**`)\n for (const r of rows) {\n console.log(` ── ${r._day} ${r.t} issue=${r.issue || '-'} msg=${r.msg || '-'}`)\n if (r.asked) console.log(` 主人: ${r.asked}`)\n console.log(` 我 : ${r.did} [${r.r}]`)\n if (r.fb) console.log(` 反馈: ${r.fb}${r.fbt ? ` 「${r.fbt}」` : ''}`)\n }\n if (!rows.length) console.log(' (空 —— 这个会话没留痕。**没留痕 = 这些交互等于没发生过。**)')\n return\n }\n if (o.issue) {\n const issue = o.issue\n rows = rows.filter((r) => (r.issue || '').startsWith(issue))\n }\n console.log(`运行记录 runs/ · ${rows.length} 条`)\n for (const r of rows.slice(-(+(o.top || 30)))) {\n console.log(` ${r._day} ${r.t} [${(r.r || '').padEnd(11)}] ${(r.ch || '').padEnd(6)} ${(r.did || '').slice(0, 30)} ${r.fb ? '← ' + r.fb : ''}`)\n }\n return\n }\n\n if (cmd === 'evolve') {\n const { values: o } = parseArgs({ args: argv.slice(1), options: { days: { type: 'string' } } })\n const rows = runsmod.scan(ROOT, +(o.days || 7))\n const ans = rows.filter((r) => r.asked)\n const bad = ans.filter((r) =>\n [runsmod.FB_FIX, runsmod.FB_MORE].includes(r.fb || ''))\n const unk = ans.filter((r) => !r.fb)\n const failed = rows.filter((r) => ['fail', 'unsupported', 'degraded'].includes(r.r))\n console.log(`【进化清单】近 ${o.days || 7} 天`)\n console.log(` 面向主人的回答 ${ans.length} 条 · 被【打回】${bad.length} 条 · 引擎层没答出来 ${failed.length} 条`)\n if (unk.length) console.log(` ⚠️ ${unk.length} 条【没收到反馈就结案了】—— 答完没回填,这次交互等于白跑。`)\n if (bad.length) {\n console.log('\\n── 主人打回的(**直接就是这周该改什么**)──')\n for (const r of bad) {\n console.log(` ${r._day} ${r.t} [${r.fb}] 会话=${r.conv || '-'}`)\n console.log(` 主人问: ${(r.asked || '').slice(0, 60)}`)\n console.log(` 我答 : ${(r.did || '').slice(0, 60)}`)\n console.log(` 他说 : ${r.fbt || '(没记下来)'}`)\n console.log(` 复盘 : dingtalk-agent runs --conv ${r.conv || '<会话id>'}`)\n }\n }\n if (!bad.length && !failed.length) {\n console.log('\\n (没有打回,也没有失败 —— 要么真的都对,要么【没人回填反馈】。看上面那行。)')\n }\n return\n }\n\n // ── todo:把待办拉全(心跳收件用)──\n if (cmd === 'todo') {\n const dws = await import('../src/dws.js')\n const all = dws.todosAll('false')\n console.log(`未完成待办 ${all.length} 条(**已翻页拉全** —— 只看第一页会漏掉循环件)`)\n for (const t of all) console.log(` ${t.taskId} ${(t.subject || '').slice(0, 60)}`)\n return\n }\n\n fail(\n `不认识的命令: ${cmd}`,\n 1,\n `运行 dta --help 查看全部命令${suggest(cmd, [\n 'setup', 'doctor', 'skill', 'bootstrap', 'init', 'prepare', 'act', 'smoke', 'eval',\n ])}`,\n )\n}\n\nfunction errorHint(message: string): string {\n if (/unknown option|未知选项|unexpected argument/i.test(message)) {\n return '检查参数拼写;运行 dta --help 查看当前版本支持的参数。'\n }\n if (/找不到当前 Run|必须由能访问 DTA_ROOT 的宿主侧执行/.test(message)) {\n return 'act 只能用于可信事件 Run;先由宿主执行 dta prepare --event-file <file>,再进入返回的 cwd。'\n }\n if (/\\bDWS\\b|\\bdws\\b/.test(message)) {\n return '运行 dta doctor 检查 DWS 路径、版本和认证;需要登录时执行 dws auth login。'\n }\n if (/Workspace|Field|Storage|contextId/.test(message)) {\n return '先运行 dta bootstrap --json 查看当前上下文;确实需要持久 Workspace 时再运行 dta init。'\n }\n return '运行 dta doctor 检查环境;运行 dta --help 查看可用命令。'\n}\n\nfunction suggest(input: string, candidates: string[], prefix = 'dta'): string {\n if (!input) return ''\n const ranked = candidates\n .map((candidate) => ({ candidate, distance: editDistance(input, candidate) }))\n .sort((a, b) => a.distance - b.distance)\n const best = ranked[0]\n return best && best.distance <= Math.max(2, Math.floor(best.candidate.length / 3))\n ? `;你是否想输入 ${prefix} ${best.candidate}?`\n : ''\n}\n\nfunction editDistance(a: string, b: string): number {\n const row = Array.from({ length: b.length + 1 }, (_, index) => index)\n for (let i = 1; i <= a.length; i += 1) {\n let previous = row[0]\n row[0] = i\n for (let j = 1; j <= b.length; j += 1) {\n const before = row[j]\n row[j] = Math.min(row[j] + 1, row[j - 1] + 1, previous + (a[i - 1] === b[j - 1] ? 0 : 1))\n previous = before\n }\n }\n return row[b.length]\n}\n\nfunction printDispatch(out, json = false) {\n if (json) return console.log(JSON.stringify(out, null, 2))\n const mark = out.duplicate ? (out.launch ? '🔁 REDELIVER' : '↩️ DUPLICATE') : '✅ READY'\n console.log(`${mark} ${out.runId}`)\n console.log(` Field=${out.fieldId} Session=${out.sessionId} Event=${out.eventKind}`)\n console.log(` cwd=${out.cwd}`)\n console.log(` entrypoint=${out.entrypoint} queue=${out.queue.key} (max=${out.queue.maxConcurrency})`)\n console.log(` launch=${out.launch} delivery=${out.delivery?.status || 'unknown'}`)\n console.log(` allowed=${out.allowedActions.join(', ')} default=${out.defaultAction}`)\n console.log(' Local 模式可直接用 cwd/env;生产模式由宿主 Broker 保留 DWS 与 control 权限。')\n}\n\nfunction printSkillStatus(out: GlobalSkillStatus, action: string, dryRun: boolean): void {\n const prefix = dryRun ? 'DRY-RUN' : '✅'\n const verb = action === 'status' ? '全局 Skill 状态' : `skill ${action}`\n console.log(`${prefix} ${verb}: ${out.name}`)\n console.log(` bundled=${out.bundled.skillVersion || '-'} hash=${out.bundled.hash.slice(0, 12)}`)\n console.log(` canonical=${out.canonical.path}`)\n console.log(\n ` installed=${out.canonical.exists} managed=${out.canonical.managed} ` +\n `modified=${out.canonical.modified} current=${out.canonical.current}`,\n )\n for (const client of out.clients) {\n console.log(` ${client.label}=${client.state} (${client.discovery}: ${client.path})`)\n }\n if (out.legacyCodex.conflict) {\n console.log(` ⚠️ legacy Codex 同名路径存在: ${out.legacyCodex.path}`)\n }\n if (action === 'install' && !dryRun) {\n console.log(' 新 Agent 会话将自动发现;当前会话未发现时请重启 Claude Code/Codex。')\n }\n}\n\nfunction printDoctor(out: ReturnType<typeof doctor>): void {\n console.log(`dingtalk-agent doctor · ${out.ready ? 'READY' : 'NOT READY'}`)\n for (const check of out.checks) {\n const mark = check.level === 'pass' ? '✅' : check.level === 'warn' ? '⚠️' : '❌'\n console.log(`${mark} ${check.summary}`)\n if (check.detail) console.log(` ${check.detail}`)\n if (check.fix) console.log(` 修复: ${check.fix}`)\n }\n if (out.nextSteps.length) {\n console.log('\\n下一步:')\n for (const step of out.nextSteps) console.log(` ${step}`)\n }\n}\n\nfunction printSetup(out: ReturnType<typeof setup>): void {\n console.log(`${out.dryRun ? 'DRY-RUN' : '✅'} dingtalk-agent setup`)\n console.log(` CLI: ${out.cli.executable}`)\n console.log(` 短命令: ${out.cli.alias}`)\n console.log(` Skill: ${out.skill.canonical.path}`)\n if (!out.shell.pathReady) {\n console.log(` 当前 shell 尚未加载 PATH;本次终端执行: ${out.shell.activateCommand}`)\n if (out.shell.rcFile) console.log(` 新终端会从 ${out.shell.rcFile} 自动加载`)\n }\n printDoctor(out.doctor)\n console.log(`\\n开始使用: ${out.nextCommand}`)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dingtalk-agent.js","sourceRoot":"","sources":["../../bin/dingtalk-agent.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n// dingtalk-agent —— 钉钉数字员工的标准范式(TypeScript source)。\n//\n// CLI = 拦 标准动作:可程序化、可强制、可验证。撞上去没得商量。\n// Skill = 劝 判断:只有 LLM 能做的(该不该答、话题归属、怎么写点评)。\n// 本体 = 记 它是谁 + 它知道什么。git clone 就带走。\n//\n// **分界线:凡是能程序化的,收进 CLI;凡是需要判断的,留在 Skill。**\n//\n// 因为:文档会被漏读、误读、自我说服;**撞到闸门上就没得商量。**\n\nimport { parseArgs } from 'node:util'\nimport { join, resolve } from 'node:path'\nimport { readFileSync } from 'node:fs'\nimport { spawn, spawnSync } from 'node:child_process'\n\nimport * as cfgmod from '../src/config.js'\nimport * as kbmod from '../src/kb.js'\nimport * as runsmod from '../src/runs.js'\nimport * as dutymod from '../src/duty.js'\nimport { boot } from '../src/boot.js'\nimport { init } from '../src/init.js'\nimport { ackDispatch, listPendingDispatches, prepareSession } from '../src/sessions.js'\nimport { readEventFile, consumeNdjson, heartbeatEvent } from '../src/driver.js'\nimport { findRun, previewAction, executeAction } from '../src/actions.js'\nimport { resolvePackageRoot } from '../src/package-root.js'\nimport { bootstrap } from '../src/bootstrap.js'\nimport { doctor } from '../src/doctor.js'\nimport { setup } from '../src/setup.js'\nimport {\n installGlobalSkill, skillStatus, uninstallGlobalSkill, upgradeGlobalSkill,\n type GlobalSkillStatus,\n} from '../src/skill-manager.js'\n\nconst PACKAGE_ROOT = resolvePackageRoot(import.meta.url)\nconst PACKAGE_JSON = JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8'))\n\n// ROOT = **你的工作区**(当前目录),不是包所在的目录。\n// 全局装 / npx 跑的时候,包住在 node_modules 里 —— 那不是 agent 的家。\nconst ROOT = process.env.DTA_ROOT\n ? resolve(process.env.DTA_ROOT)\n : (cfgmod.findRoot(process.cwd()) || process.cwd())\n\nconst HELP = `\ndta(dingtalk-agent)—— Skill-first 的钉钉数字员工行为容器\n\n 用法: dta <command> [options]\n 完整名称 dingtalk-agent 与 dta 完全等价。\n\n 首次使用(无全局命令时: npx --yes --registry=https://registry.npmjs.org @xdxer/dingtalk-agent@${PACKAGE_JSON.version} setup)\n setup 用户级安装 CLI、修复 PATH、安装 Skill、检查 DWS\n doctor 检查 PATH / Node / DWS / Skill / Agent 客户端\n\n Skill(不要求 Workspace)\n skill install 安装全局 Basic Behavior(Claude Code + Codex + OpenCode)\n skill status 检查版本、漂移和客户端可发现性\n skill upgrade 通过 npx skills 重装当前包内 Skill\n skill uninstall 通过 npx skills 卸载全局 Skill\n 通用: [--dry-run] [--json];安装生命周期委托给 npx skills\n\n 每个 Agent Session(不要求 init)\n bootstrap 发现当前本地 Workspace;不修改项目文件\n [--storage <uri>] local-dir:<path> | dingtalk-doc:<node-or-url>\n [--state-dir <path>] 远端文档只读快照目录\n [--profile <dws-profile>] [--json]\n\n 可信事件模式(可选;需要一次 init)\n init [--context-id X] 仅为 Prepared Run 建最小 Workspace\n prepare --event-file <file|-> 事件 → Session → Run\n act ack 对原消息贴「收到」;不代表接单\n act reply --text \"…\" 引用回复原消息\n act ask --text \"…\" 只问一个真正阻塞的问题\n act silence [--reason \"…\"] 不外发,但留下行为回执\n 通用: [--run <path>] [--dry-run] [--json]\n\n smoke 极简本地验收(不写钉钉)\n eval contract / behavior 完整合同或模型行为评测\n\n help runtime 事件宿主与 controller 命令\n help adapters 可选 DWS listen 适配器\n help legacy 查看兼容的本体、KB、值班与进化命令\n`\n\nconst RUNTIME_HELP = `\ndingtalk-agent 可信事件运行时(可选宿主能力)\n\n init [--context-id X] [--memory <uri>] [--knowledge <uri>]\n prepare --event-file <file|->\n run --stdin | --event-file <file> | --heartbeat\n dispatch pending\n dispatch ack --event-id X --run-id X\n act ack|reply|ask|silence\n\n这些命令负责目标冻结、Session/Run、Wait、幂等和回执;普通 Agent Session 不必使用。\n`\n\nconst ADAPTER_HELP = `\ndingtalk-agent 可选 Driver / 开发联调适配器\n\n listen mention --once\n listen dm --user <userId> --once\n listen group --group <openConversationId> --once\n\nlisten 不是 Agent 主入口。Claude Code、DWS 云端或其他宿主都可以直接提供事件。\n`\n\nconst LEGACY_HELP = `\ndingtalk-agent 兼容命令(不属于 P0 四对象主链)\n\n boot\n kb mount|list|sync|search\n duty --check|--run|--list\n todo\n log / feedback / runs / evolve\n\n这些能力继续可用,但新增 Agent 应先安装全局 Skill;只有可信事件宿主才需要 runtime。\n`\n\nfunction fail(msg: string, code = 1, hint = ''): never {\n console.error(`错误: ${msg}`)\n if (hint) console.error(`提示: ${hint}`)\n process.exit(code)\n}\n\nconst argv = process.argv.slice(2)\nconst cmd = argv[0]\nconst sub = argv[1]\n\ntry { await main() } catch (e) {\n const error = e as Error & { exitCode?: number }\n const message = String(error?.message || error)\n fail(message, Number(error?.exitCode) || 2, errorHint(message))\n}\n\nasync function main() {\n if (cmd === 'help' && sub === 'legacy') { console.log(LEGACY_HELP); return }\n if (cmd === 'help' && sub === 'runtime') { console.log(RUNTIME_HELP); return }\n if (cmd === 'help' && sub === 'adapters') { console.log(ADAPTER_HELP); return }\n if (!cmd || cmd === '--help' || cmd === '-h' || cmd === 'help') { console.log(HELP); return }\n if (cmd === '--version' || cmd === '-V' || cmd === 'version') {\n console.log(PACKAGE_JSON.version)\n return\n }\n\n // ── setup / doctor:npx 永远可启动的首次使用入口。──\n if (cmd === 'setup') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: {\n prefix: { type: 'string' }, 'dry-run': { type: 'boolean' },\n 'no-shell-write': { type: 'boolean' }, 'skip-cli-install': { type: 'boolean' },\n json: { type: 'boolean' },\n },\n })\n const out = setup(PACKAGE_ROOT, {\n prefix: o.prefix,\n dryRun: o['dry-run'],\n writeShell: !o['no-shell-write'],\n skipCliInstall: o['skip-cli-install'],\n })\n if (o.json) console.log(JSON.stringify(out, null, 2))\n else printSetup(out)\n if (!out.doctor.ready) process.exitCode = 2\n return\n }\n\n if (cmd === 'doctor') {\n const { values: o } = parseArgs({\n args: argv.slice(1), options: { json: { type: 'boolean' } },\n })\n const out = doctor(PACKAGE_ROOT)\n if (o.json) console.log(JSON.stringify(out, null, 2))\n else printDoctor(out)\n if (!out.ready) process.exitCode = 2\n return\n }\n\n // ── skill:唯一一次性的主入口;完全不依赖 Workspace。──\n if (cmd === 'skill') {\n const { values: o } = parseArgs({\n args: argv.slice(2),\n options: {\n 'dry-run': { type: 'boolean' }, json: { type: 'boolean' },\n },\n })\n const options = { dryRun: o['dry-run'] }\n let out: GlobalSkillStatus\n if (sub === 'install') out = installGlobalSkill(PACKAGE_ROOT, options)\n else if (sub === 'status') out = skillStatus(PACKAGE_ROOT, options)\n else if (sub === 'upgrade') out = upgradeGlobalSkill(PACKAGE_ROOT, options)\n else if (sub === 'uninstall') out = uninstallGlobalSkill(PACKAGE_ROOT, options)\n else fail(\n `不认识的 skill 子命令: ${sub || '(缺失)'}`,\n 1,\n `可用命令: dta skill install | status | upgrade | uninstall${suggest(sub || '', ['install', 'status', 'upgrade', 'uninstall'], 'dta skill')}`,\n )\n if (o.json) console.log(JSON.stringify(out, null, 2))\n else printSkillStatus(out, sub, Boolean(o['dry-run']))\n return\n }\n\n // ── bootstrap:当前 Agent Session 按需发现/拉取语义上下文。──\n if (cmd === 'bootstrap') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: {\n storage: { type: 'string' }, 'state-dir': { type: 'string' },\n profile: { type: 'string' }, json: { type: 'boolean' },\n },\n })\n const out = bootstrap(ROOT, {\n storage: o.storage, stateDir: o['state-dir'], profile: o.profile,\n })\n if (o.json) console.log(JSON.stringify(out, null, 2))\n else {\n console.log(`✅ ${out.mode === 'workspace' ? '已装载 Workspace' : '直接会话模式'}`)\n console.log(` scope=${out.scopeId} initialized=${out.initialized}`)\n if (!out.mounts.length) console.log(' 没有发现持久上下文;这不是错误,也不需要自动 init。')\n for (const mount of out.mounts) console.log(` ${mount.slot}: ${mount.path}`)\n console.log(` ${out.note}`)\n }\n return\n }\n\n // ── init ──\n if (cmd === 'init') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: {\n 'context-id': { type: 'string' }, id: { type: 'string' },\n memory: { type: 'string' }, knowledge: { type: 'string' },\n },\n })\n // init 的语义是“初始化当前目录”;不能因为父目录恰好有配置就改到父工作区。\n init(process.env.DTA_ROOT ? ROOT : process.cwd(), {\n contextId: o['context-id'], id: o.id,\n memory: o.memory, knowledge: o.knowledge,\n })\n return\n }\n\n // ── prepare:一个事件物化成一个可交给沙箱的 Run ──\n if (cmd === 'prepare') {\n const cfg = cfgmod.must(ROOT)\n const { values: o, positionals } = parseArgs({\n args: argv.slice(1), allowPositionals: true,\n options: {\n 'event-file': { type: 'string' }, field: { type: 'string' },\n 'session-key': { type: 'string' }, 'context-id': { type: 'string' },\n json: { type: 'boolean' },\n },\n })\n const file = o['event-file'] || positionals[0]\n if (!file) fail('prepare 需要 --event-file <file|->')\n const out = prepareSession(ROOT, cfg, readEventFile(file), {\n fieldId: o.field, sessionKey: o['session-key'], contextId: o['context-id'],\n })\n printDispatch(out, o.json)\n return\n }\n\n // ── run:不内置模型,只把事件流转换为 sandbox dispatch ──\n if (cmd === 'run') {\n const cfg = cfgmod.must(ROOT)\n const { values: o, positionals } = parseArgs({\n args: argv.slice(1), allowPositionals: true,\n options: {\n stdin: { type: 'boolean' }, 'event-file': { type: 'string' },\n field: { type: 'string' }, 'session-key': { type: 'string' },\n 'context-id': { type: 'string' },\n heartbeat: { type: 'boolean' }, 'heartbeat-key': { type: 'string' },\n 'heartbeat-event-id': { type: 'string' },\n },\n })\n const options = {\n fieldId: o.field, sessionKey: o['session-key'], contextId: o['context-id'],\n }\n const modes = [Boolean(o.stdin), Boolean(o.heartbeat), Boolean(o['event-file'] || positionals[0])]\n if (modes.filter(Boolean).length !== 1) {\n fail('run 的 --stdin / --event-file <file> / --heartbeat 必须且只能选一个')\n }\n if (o.stdin) {\n const result = await consumeNdjson(ROOT, cfg, process.stdin, options)\n if (result.rejected) process.exitCode = 2\n return\n }\n let event\n if (o.heartbeat) event = heartbeatEvent(o['heartbeat-key'], o['heartbeat-event-id'])\n else {\n const file = o['event-file'] || positionals[0]\n if (!file) fail('run 需要 --stdin / --event-file <file> / --heartbeat 三选一')\n event = readEventFile(file)\n }\n const out = prepareSession(ROOT, cfg, event, options)\n process.stdout.write(JSON.stringify(out) + '\\n')\n return\n }\n\n // ── listen:本地 DWS Driver;云端 Driver 仍走 run --stdin/--event-file。──\n if (cmd === 'listen') {\n const cfg = cfgmod.must(ROOT)\n const modes: Record<string, { event: string; required?: 'user' | 'group' }> = {\n mention: { event: 'user_im_message_receive_at' },\n dm: { event: 'user_im_message_receive_o2o', required: 'user' },\n group: { event: 'user_im_message_receive_group', required: 'group' },\n }\n const mode = modes[sub]\n if (!mode) fail('listen 的类型只能是 mention / dm / group')\n const { values: o } = parseArgs({\n args: argv.slice(2),\n options: {\n user: { type: 'string' }, group: { type: 'string' },\n once: { type: 'boolean' }, duration: { type: 'string' },\n 'dry-run': { type: 'boolean' }, 'context-id': { type: 'string' },\n field: { type: 'string' }, 'session-key': { type: 'string' },\n },\n })\n if (mode.required === 'user' && !o.user) fail('listen dm 需要 --user <userId>')\n if (mode.required === 'group' && !o.group) fail('listen group 需要 --group <openConversationId>')\n\n const dwsArgs = ['event', 'consume', mode.event, '-f', 'ndjson']\n if (o.user) dwsArgs.push('--user', o.user)\n if (o.group) dwsArgs.push('--group', o.group)\n if (o.once) dwsArgs.push('--max-events', '1', '--ephemeral')\n if (o.duration) dwsArgs.push('--duration', o.duration)\n\n if (o['dry-run']) {\n const child = spawnSync('dws', [...dwsArgs, '--dry-run'], { stdio: 'inherit' })\n if (child.error) throw child.error\n process.exitCode = child.status ?? 2\n return\n }\n\n const child = spawn('dws', dwsArgs, { stdio: ['ignore', 'pipe', 'inherit'] })\n const status = new Promise<number>((resolveStatus, rejectStatus) => {\n child.once('error', rejectStatus)\n child.once('close', (code, signal) => {\n if (signal) rejectStatus(new Error(`DWS listener 被 ${signal} 终止`))\n else resolveStatus(code ?? 2)\n })\n })\n const result = await consumeNdjson(ROOT, cfg, child.stdout, {\n fieldId: o.field,\n sessionKey: o['session-key'],\n contextId: o['context-id'],\n })\n const exitCode = await status\n if (exitCode !== 0) fail(`DWS listener 退出码 ${exitCode}`, exitCode)\n if (result.rejected) process.exitCode = 2\n return\n }\n\n // ── dispatch:durable outbox。ack 表示 controller 已幂等入队,不表示 Run 已完成。──\n if (cmd === 'dispatch') {\n const cfg = cfgmod.must(ROOT)\n const { values: o } = parseArgs({\n args: argv.slice(2),\n options: {\n 'event-id': { type: 'string' }, 'run-id': { type: 'string' },\n consumer: { type: 'string' }, json: { type: 'boolean' },\n },\n })\n if (sub === 'pending') {\n for (const out of listPendingDispatches(ROOT, cfg)) {\n process.stdout.write(JSON.stringify(out) + '\\n')\n }\n return\n }\n if (sub === 'ack') {\n if (!o['event-id'] || !o['run-id']) fail('dispatch ack 需要 --event-id 和 --run-id')\n const out = ackDispatch(ROOT, cfg, o['event-id'], o['run-id'], o.consumer || '')\n process.stdout.write(JSON.stringify(out) + '\\n')\n return\n }\n fail('dispatch 的子命令: pending / ack')\n }\n\n // ── act:元语化动作;目标/身份/预算/状态转移都由 Run 固定 ──\n if (cmd === 'act') {\n const kind = sub\n const { values: o } = parseArgs({\n args: argv.slice(2),\n options: {\n run: { type: 'string' }, text: { type: 'string' },\n 'text-file': { type: 'string' }, reason: { type: 'string' },\n 'dry-run': { type: 'boolean' }, json: { type: 'boolean' },\n },\n })\n if (o.text && o['text-file']) fail('--text 和 --text-file 只能选一个')\n const text = o['text-file']\n ? readFileSync(resolve(process.cwd(), o['text-file']), 'utf8')\n : o.text\n const runPath = findRun(process.cwd(), o.run)\n const out = o['dry-run']\n ? previewAction(runPath, kind, { text, reason: o.reason })\n : executeAction(runPath, kind, { text, reason: o.reason })\n if (o.json || o['dry-run']) console.log(JSON.stringify(out, null, 2))\n else {\n console.log(`${out.verified ? '✅' : '⚠️'} ${out.kind} · ${out.outcome} · ${out.toState}`)\n console.log(` action=${out.actionId} run=${out.runId}`)\n if (!out.verified) console.log(` ${out.verification}`)\n }\n if (out.outcome === 'uncertain') process.exitCode = 2\n return\n }\n\n // ── eval:宿主评测入口;shadow 永不调用 act / DWS。──\n if (cmd === 'eval') {\n const script = sub === 'contract'\n ? join(PACKAGE_ROOT, 'evals', 'run-contract-evals.mjs')\n : sub === 'shadow'\n ? join(PACKAGE_ROOT, 'evals', 'runners', 'claude-shadow.mjs')\n : sub === 'behavior'\n ? join(PACKAGE_ROOT, 'evals', 'run-shadow-evals.mjs')\n : ''\n if (!script) fail('eval 的子命令: contract / shadow / behavior')\n const childEnv = { ...process.env }\n // 合同评测会创建隔离工作区;继承宿主 DTA_ROOT 会让 Action Gate 错读外层 control store。\n delete childEnv.DTA_ROOT\n const child = spawnSync(process.execPath, [script, ...argv.slice(2)], {\n cwd: ROOT,\n env: childEnv,\n stdio: 'inherit',\n })\n if (child.error) throw child.error\n if (child.signal) throw new Error(`评测进程被 ${child.signal} 终止`)\n process.exitCode = child.status ?? 2\n return\n }\n\n if (cmd === 'smoke') {\n const script = join(PACKAGE_ROOT, 'evals', 'run-contract-evals.mjs')\n const childEnv = { ...process.env }\n delete childEnv.DTA_ROOT\n const child = spawnSync(process.execPath, [script, '--smoke'], {\n cwd: ROOT, env: childEnv, stdio: 'inherit',\n })\n if (child.error) throw child.error\n if (child.signal) throw new Error(`Smoke 被 ${child.signal} 终止`)\n process.exitCode = child.status ?? 2\n return\n }\n\n // ── kb ──\n if (cmd === 'kb') {\n const cfg = cfgmod.must(ROOT)\n const { values: o } = parseArgs({\n args: argv.slice(2), allowPositionals: true,\n options: {\n name: { type: 'string' }, from: { type: 'string' }, own: { type: 'string' },\n sync: { type: 'string' }, local: { type: 'string' }, force: { type: 'boolean' },\n },\n })\n\n if (sub === 'mount') {\n if (!o.name || !o.from) fail('要 --name 和 --from。源的写法见 --help')\n kbmod.parseSource(o.from) // 写错了当场炸\n const own = o.own || kbmod.EXTERNAL\n const sync = o.sync || (own === kbmod.OWNED ? kbmod.PUSH : kbmod.PULL)\n if (own === kbmod.OWNED && sync === kbmod.PULL) {\n fail('owned 的真值在 Git,不该 pull —— 那会把远端的东西覆盖到本地。\\n' +\n ' **所有权决定真值方向。** owned → push;external → pull。')\n }\n const local = o.local || join('.cache/kb', o.name)\n cfg.kb = (cfg.kb || []).filter((k) => k.name !== o.name)\n cfg.kb.push({ name: o.name, from: o.from, own, sync, local })\n cfgmod.save(ROOT, cfg)\n console.log(`✅ 挂上「${o.name}」 ${o.from}`)\n console.log(` 所有权=${own} · 同步=${sync} · 落在 ${local}`)\n console.log(own === kbmod.OWNED\n ? ' (真值在 Git,钉钉是暴露层。人在钉钉里改了 → sync 时会【停下来问】,不盲覆盖。)'\n : ' (真值在钉钉,本地只是【可丢弃的缓存】。过期了 kb search 会警告。)')\n return\n }\n\n if (sub === 'list') {\n if (!cfg.kb?.length) return console.log('一个都没挂。 kb mount --help')\n for (const kb of cfg.kb) {\n const s = kbmod.stale(kb)\n console.log(` ${s ? '⚠️' : '·'} ${kb.name.padEnd(14)} ${kb.own.padEnd(9)} ${kb.sync.padEnd(5)} ${kb.from}`)\n console.log(` 落在 ${kb.local} 上次同步 ${kb._syncedAt || '从未'}${s ? ' ← **过期了,不许拿来回答**' : ''}`)\n }\n return\n }\n\n if (sub === 'sync') {\n const targets = (cfg.kb || []).filter((k) => !o.name || k.name === o.name)\n if (!targets.length) fail('没有这个知识库。 kb list')\n for (const kb of targets) {\n if (kb.sync === kbmod.NONE) { console.log(` skip ${kb.name}(sync=none)`); continue }\n if (kb.sync === kbmod.PULL) kbmod.pull(kb, ROOT, o.force)\n else kbmod.push(kb, ROOT, o.force)\n }\n cfgmod.save(ROOT, cfg)\n return\n }\n\n if (sub === 'search') {\n const kw = argv[2]\n if (!kw) fail('要给关键词。 kb search \"<关键词>\"')\n kbmod.search(cfg, ROOT, kw)\n return\n }\n fail('kb 的子命令: mount / list / sync / search')\n }\n\n // ── boot ──\n if (cmd === 'boot') { boot(cfgmod.must(ROOT), ROOT); return }\n\n // ── duty ──\n if (cmd === 'duty') {\n const cfg = cfgmod.must(ROOT)\n const { values: o } = parseArgs({\n args: argv.slice(1), allowPositionals: true,\n options: { check: { type: 'boolean' }, run: { type: 'string' },\n list: { type: 'boolean' }, force: { type: 'boolean' } },\n })\n const duties = dutymod.loadDuties(cfg, ROOT)\n if (o.list) {\n const ks = Object.keys(duties)\n console.log(ks.length ? ks.join('\\n')\n : '(值班表是空的 —— 母体出厂如此,这是【正确】的。在 .dingtalk-agent/config.json 的 duties 里加。)')\n return\n }\n if (o.run) {\n const fn = duties[o.run]\n if (!fn) fail(`没有这个值班: ${o.run}(有: ${Object.keys(duties).join('、') || '无'})`)\n const s = fn()\n if (s.kind === '交付' && !dutymod.inDeliver() && !o.force) {\n return console.log(`⏸ 「${o.run}」是外发动作,静默时段顺延,**不打扰第三方**。`)\n }\n if (s.done) return console.log(`✅ 「${o.run}」已完成,本拍无需执行。${s.detail}`)\n console.log(`【${o.run}】该做了。${s.gap}`)\n console.log(` 剧本: ${s.playbook || '(没写剧本 —— 这个值班不合格)'}`)\n console.log(` ⚠️ 送达【回读确认】之后才准记 pass。没送达就写 pass = 自己骗自己。`)\n return\n }\n // --check(默认)\n console.log('值班表(**完成状态在数据里,不在记忆里**;幂等,漏拍下一拍自愈)')\n console.log(` 现在 ${runsmod.now().slice(11, 16)} · ${dutymod.inNight() ? '夜间窗口(重活可跑)' : '白天(重活挂起)'} · 外发窗口${dutymod.inDeliver() ? '开' : '关'}`)\n const ids = Object.keys(duties)\n if (!ids.length) { console.log('\\n (值班表是空的 —— 母体出厂如此。)'); return }\n const todo: string[] = []\n for (const id of ids) {\n const s = duties[id]()\n const mark = s.done ? '✅ 已完成' : (s.due ? '⬜ 待补齐' : '⏸ 不在窗口')\n console.log(` ${s.id.padEnd(8)} [${s.kind}] ${mark} ${s.detail}${s.gap ? ' → ' + s.gap : ''}`)\n if (!s.done && s.due) todo.push(s.id)\n }\n if (todo.length) {\n console.log(`\\n本拍要做: ${todo.map((t) => 'duty --run ' + t).join('、')}`)\n process.exit(1)\n }\n console.log('\\n全部补齐,静默即可(**不要为此打扰主人**)')\n return\n }\n\n // ── 留痕与进化 ──\n if (cmd === 'log' || cmd === 'logq') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: { did: { type: 'string' }, asked: { type: 'string' }, kind: { type: 'string' },\n secs: { type: 'string' }, r: { type: 'string' }, ev: { type: 'string' },\n ch: { type: 'string' }, issue: { type: 'string' },\n conv: { type: 'string' }, msg: { type: 'string' } },\n })\n if (!o.did) fail('要 --did(我怎么答的)')\n const t = runsmod.logq(ROOT, {\n ...o, did: o.did, secs: +(o.secs || 0), r: o.r || 'pass',\n })\n console.log(`运行记录已落: runs/${runsmod.today()}.md @${t}`)\n if (!o.conv) console.log(' ⚠️ 没带 --conv —— 事后【拉不出对话流】,这一条基本没有训练价值。')\n return\n }\n\n if (cmd === 'feedback') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: { kind: { type: 'string' }, text: { type: 'string' },\n conv: { type: 'string' }, at: { type: 'string' } },\n })\n if (!o.kind || ![runsmod.FB_OK, runsmod.FB_MORE, runsmod.FB_FIX].includes(o.kind)) {\n fail('--kind 只能是 认可 / 追问 / 纠正')\n }\n const day = runsmod.today()\n const rows = runsmod.read(ROOT, day)\n let cand = rows.filter((r) => r.asked)\n if (o.conv) cand = cand.filter((r) => r.conv === o.conv)\n if (!cand.length) fail(`今天没有可回填的问答行 —— **是不是答完忘了 logq?**`)\n const tgt = o.at ? cand.find((r) => r.t === o.at) : cand[cand.length - 1]\n if (!tgt) fail(`找不到 t=${o.at} 的行`)\n tgt.fb = o.kind\n if (o.text) tgt.fbt = o.text.slice(0, 600)\n runsmod.write(ROOT, day, rows)\n console.log(`已回填: ${day} @${tgt.t} → 「${o.kind}」(原问: ${(tgt.asked || '').slice(0, 40)})`)\n return\n }\n\n if (cmd === 'runs') {\n const { values: o } = parseArgs({\n args: argv.slice(1),\n options: { days: { type: 'string' }, conv: { type: 'string' },\n issue: { type: 'string' }, top: { type: 'string' } },\n })\n let rows = runsmod.scan(ROOT, +(o.days || 1))\n if (o.conv) {\n rows = rows.filter((r) => r.conv === o.conv)\n console.log(`【对话流】会话 ${o.conv} · ${rows.length} 条 —— **这就是训练素材**`)\n for (const r of rows) {\n console.log(` ── ${r._day} ${r.t} issue=${r.issue || '-'} msg=${r.msg || '-'}`)\n if (r.asked) console.log(` 主人: ${r.asked}`)\n console.log(` 我 : ${r.did} [${r.r}]`)\n if (r.fb) console.log(` 反馈: ${r.fb}${r.fbt ? ` 「${r.fbt}」` : ''}`)\n }\n if (!rows.length) console.log(' (空 —— 这个会话没留痕。**没留痕 = 这些交互等于没发生过。**)')\n return\n }\n if (o.issue) {\n const issue = o.issue\n rows = rows.filter((r) => (r.issue || '').startsWith(issue))\n }\n console.log(`运行记录 runs/ · ${rows.length} 条`)\n for (const r of rows.slice(-(+(o.top || 30)))) {\n console.log(` ${r._day} ${r.t} [${(r.r || '').padEnd(11)}] ${(r.ch || '').padEnd(6)} ${(r.did || '').slice(0, 30)} ${r.fb ? '← ' + r.fb : ''}`)\n }\n return\n }\n\n if (cmd === 'evolve') {\n const { values: o } = parseArgs({ args: argv.slice(1), options: { days: { type: 'string' } } })\n const rows = runsmod.scan(ROOT, +(o.days || 7))\n const ans = rows.filter((r) => r.asked)\n const bad = ans.filter((r) =>\n [runsmod.FB_FIX, runsmod.FB_MORE].includes(r.fb || ''))\n const unk = ans.filter((r) => !r.fb)\n const failed = rows.filter((r) => ['fail', 'unsupported', 'degraded'].includes(r.r))\n console.log(`【进化清单】近 ${o.days || 7} 天`)\n console.log(` 面向主人的回答 ${ans.length} 条 · 被【打回】${bad.length} 条 · 引擎层没答出来 ${failed.length} 条`)\n if (unk.length) console.log(` ⚠️ ${unk.length} 条【没收到反馈就结案了】—— 答完没回填,这次交互等于白跑。`)\n if (bad.length) {\n console.log('\\n── 主人打回的(**直接就是这周该改什么**)──')\n for (const r of bad) {\n console.log(` ${r._day} ${r.t} [${r.fb}] 会话=${r.conv || '-'}`)\n console.log(` 主人问: ${(r.asked || '').slice(0, 60)}`)\n console.log(` 我答 : ${(r.did || '').slice(0, 60)}`)\n console.log(` 他说 : ${r.fbt || '(没记下来)'}`)\n console.log(` 复盘 : dingtalk-agent runs --conv ${r.conv || '<会话id>'}`)\n }\n }\n if (!bad.length && !failed.length) {\n console.log('\\n (没有打回,也没有失败 —— 要么真的都对,要么【没人回填反馈】。看上面那行。)')\n }\n return\n }\n\n // ── todo:把待办拉全(心跳收件用)──\n if (cmd === 'todo') {\n const dws = await import('../src/dws.js')\n const all = dws.todosAll('false')\n console.log(`未完成待办 ${all.length} 条(**已翻页拉全** —— 只看第一页会漏掉循环件)`)\n for (const t of all) console.log(` ${t.taskId} ${(t.subject || '').slice(0, 60)}`)\n return\n }\n\n fail(\n `不认识的命令: ${cmd}`,\n 1,\n `运行 dta --help 查看全部命令${suggest(cmd, [\n 'setup', 'doctor', 'skill', 'bootstrap', 'init', 'prepare', 'act', 'smoke', 'eval',\n ])}`,\n )\n}\n\nfunction errorHint(message: string): string {\n if (/unknown option|未知选项|unexpected argument/i.test(message)) {\n return '检查参数拼写;运行 dta --help 查看当前版本支持的参数。'\n }\n if (/找不到当前 Run|必须由能访问 DTA_ROOT 的宿主侧执行/.test(message)) {\n return 'act 只能用于可信事件 Run;先由宿主执行 dta prepare --event-file <file>,再进入返回的 cwd。'\n }\n if (/\\bDWS\\b|\\bdws\\b/.test(message)) {\n return '运行 dta doctor 检查 DWS 路径、版本和认证;需要登录时执行 dws auth login。'\n }\n if (/skills CLI|\\bnpx\\b/.test(message)) {\n return '确认 node、npm、npx 在 PATH 中;也可以复制错误中的 npx skills 命令单独执行。'\n }\n if (/Workspace|Field|Storage|contextId/.test(message)) {\n return '先运行 dta bootstrap --json 查看当前上下文;确实需要持久 Workspace 时再运行 dta init。'\n }\n return '运行 dta doctor 检查环境;运行 dta --help 查看可用命令。'\n}\n\nfunction suggest(input: string, candidates: string[], prefix = 'dta'): string {\n if (!input) return ''\n const ranked = candidates\n .map((candidate) => ({ candidate, distance: editDistance(input, candidate) }))\n .sort((a, b) => a.distance - b.distance)\n const best = ranked[0]\n return best && best.distance <= Math.max(2, Math.floor(best.candidate.length / 3))\n ? `;你是否想输入 ${prefix} ${best.candidate}?`\n : ''\n}\n\nfunction editDistance(a: string, b: string): number {\n const row = Array.from({ length: b.length + 1 }, (_, index) => index)\n for (let i = 1; i <= a.length; i += 1) {\n let previous = row[0]\n row[0] = i\n for (let j = 1; j <= b.length; j += 1) {\n const before = row[j]\n row[j] = Math.min(row[j] + 1, row[j - 1] + 1, previous + (a[i - 1] === b[j - 1] ? 0 : 1))\n previous = before\n }\n }\n return row[b.length]\n}\n\nfunction printDispatch(out, json = false) {\n if (json) return console.log(JSON.stringify(out, null, 2))\n const mark = out.duplicate ? (out.launch ? '🔁 REDELIVER' : '↩️ DUPLICATE') : '✅ READY'\n console.log(`${mark} ${out.runId}`)\n console.log(` Field=${out.fieldId} Session=${out.sessionId} Event=${out.eventKind}`)\n console.log(` cwd=${out.cwd}`)\n console.log(` entrypoint=${out.entrypoint} queue=${out.queue.key} (max=${out.queue.maxConcurrency})`)\n console.log(` launch=${out.launch} delivery=${out.delivery?.status || 'unknown'}`)\n console.log(` allowed=${out.allowedActions.join(', ')} default=${out.defaultAction}`)\n console.log(' Local 模式可直接用 cwd/env;生产模式由宿主 Broker 保留 DWS 与 control 权限。')\n}\n\nfunction printSkillStatus(out: GlobalSkillStatus, action: string, dryRun: boolean): void {\n const prefix = dryRun ? 'DRY-RUN' : '✅'\n const verb = action === 'status' ? '全局 Skill 状态' : `skill ${action}`\n console.log(`${prefix} ${verb}: ${out.name}`)\n console.log(` manager=${out.manager} bundled=${out.bundled.skillVersion || '-'}`)\n console.log(` canonical=${out.canonical.path}`)\n console.log(\n ` installed=${out.canonical.exists} installedVersion=${out.canonical.installedVersion || '-'} ` +\n `current=${out.canonical.current}`,\n )\n if (out.operation) console.log(` delegated: ${out.operation.command}`)\n for (const client of out.clients) {\n console.log(` ${client.label}=${client.state} (${client.discovery}: ${client.path})`)\n }\n if (action === 'install' && !dryRun) {\n console.log(' 新 Agent 会话将自动发现;当前会话未发现时请重启 Claude Code/Codex。')\n }\n}\n\nfunction printDoctor(out: ReturnType<typeof doctor>): void {\n console.log(`dingtalk-agent doctor · ${out.ready ? 'READY' : 'NOT READY'}`)\n for (const check of out.checks) {\n const mark = check.level === 'pass' ? '✅' : check.level === 'warn' ? '⚠️' : '❌'\n console.log(`${mark} ${check.summary}`)\n if (check.detail) console.log(` ${check.detail}`)\n if (check.fix) console.log(` 修复: ${check.fix}`)\n }\n if (out.nextSteps.length) {\n console.log('\\n下一步:')\n for (const step of out.nextSteps) console.log(` ${step}`)\n }\n}\n\nfunction printSetup(out: ReturnType<typeof setup>): void {\n console.log(`${out.dryRun ? 'DRY-RUN' : '✅'} dingtalk-agent setup`)\n console.log(` CLI: ${out.cli.executable}`)\n console.log(` 短命令: ${out.cli.alias}`)\n console.log(` Skill: ${out.skill.canonical.path}`)\n if (!out.shell.pathReady) {\n console.log(` 当前 shell 尚未加载 PATH;本次终端执行: ${out.shell.activateCommand}`)\n if (out.shell.rcFile) console.log(` 新终端会从 ${out.shell.rcFile} 自动加载`)\n }\n printDoctor(out.doctor)\n console.log(`\\n开始使用: ${out.nextCommand}`)\n}\n"]}
|
package/dist/src/setup.js
CHANGED
|
@@ -3,7 +3,7 @@ import { delimiter, join } from 'node:path';
|
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { spawnSync } from 'node:child_process';
|
|
5
5
|
import { doctor, findExecutable } from './doctor.js';
|
|
6
|
-
import { installGlobalSkill, skillStatus,
|
|
6
|
+
import { installGlobalSkill, skillStatus, } from './skill-manager.js';
|
|
7
7
|
const PATH_MARKER_START = '# >>> dingtalk-agent PATH >>>';
|
|
8
8
|
const PATH_MARKER_END = '# <<< dingtalk-agent PATH <<<';
|
|
9
9
|
export function setup(packageRoot, options = {}) {
|
|
@@ -44,10 +44,7 @@ export function setup(packageRoot, options = {}) {
|
|
|
44
44
|
const beforeSkill = skillStatus(packageRoot, { home });
|
|
45
45
|
const skill = options.dryRun
|
|
46
46
|
? beforeSkill
|
|
47
|
-
:
|
|
48
|
-
!beforeSkill.canonical.modified && !beforeSkill.canonical.current
|
|
49
|
-
? upgradeGlobalSkill(packageRoot, { home })
|
|
50
|
-
: installGlobalSkill(packageRoot, { home });
|
|
47
|
+
: installGlobalSkill(packageRoot, { home, env: effectiveEnv });
|
|
51
48
|
const report = doctor(packageRoot, { home, env: effectiveEnv });
|
|
52
49
|
return {
|
|
53
50
|
$schema: 'dingtalk-agent/setup@1',
|
package/dist/src/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs'\nimport { delimiter, join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { spawnSync } from 'node:child_process'\n\nimport { doctor, findExecutable, type DoctorReport } from './doctor.js'\nimport {\n installGlobalSkill, skillStatus, upgradeGlobalSkill, type GlobalSkillStatus,\n} from './skill-manager.js'\n\nconst PATH_MARKER_START = '# >>> dingtalk-agent PATH >>>'\nconst PATH_MARKER_END = '# <<< dingtalk-agent PATH <<<'\n\nexport interface SetupOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n prefix?: string\n dryRun?: boolean\n writeShell?: boolean\n skipCliInstall?: boolean\n}\n\nexport interface SetupResult {\n $schema: 'dingtalk-agent/setup@1'\n dryRun: boolean\n cli: {\n installed: boolean\n skipped: boolean\n prefix: string\n binDir: string\n executable: string\n alias: string\n packageSpec: string\n }\n shell: {\n pathReady: boolean\n rcFile: string\n updated: boolean\n activateCommand: string\n }\n skill: GlobalSkillStatus\n doctor: DoctorReport\n nextCommand: string\n}\n\nexport function setup(packageRoot: string, options: SetupOptions = {}): SetupResult {\n const home = options.home || homedir()\n const env = { ...(options.env || process.env) }\n const prefix = options.prefix || join(home, '.local')\n const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin')\n const executable = join(binDir, process.platform === 'win32' ? 'dingtalk-agent.cmd' : 'dingtalk-agent')\n const alias = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta')\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const packageSpec = env.DTA_SETUP_PACKAGE_SOURCE || `${pkg.name}@${pkg.version}`\n const npm = findExecutable(process.platform === 'win32' ? 'npm.cmd' : 'npm', env) || 'npm'\n const installedVersion = existsSync(executable)\n ? readInstalledVersion(executable, env)\n : ''\n const aliasVersion = existsSync(alias) ? readInstalledVersion(alias, env) : ''\n const alreadyCurrent = installedVersion === String(pkg.version || '') && aliasVersion === installedVersion\n\n if (!options.dryRun && !options.skipCliInstall && !alreadyCurrent) {\n mkdirSync(prefix, { recursive: true })\n const run = spawnSync(npm, [\n 'install', '--global', '--prefix', prefix, '--registry', 'https://registry.npmjs.org', packageSpec,\n ], { encoding: 'utf8', env, timeout: 120_000 })\n if (run.status !== 0 || run.error) {\n throw new Error(\n `CLI 用户级安装失败: ${run.error?.message || String(run.stderr || run.stdout).trim() || `退出码 ${run.status}`}`,\n )\n }\n if (!existsSync(executable) || !existsSync(alias)) {\n throw new Error(`npm 安装完成但 CLI 入口不完整: ${executable} / ${alias}`)\n }\n }\n\n const shell = ensureShellPath(home, binDir, env, {\n dryRun: Boolean(options.dryRun),\n writeShell: options.writeShell !== false,\n })\n const effectiveEnv = {\n ...env,\n PATH: [binDir, env.PATH || ''].filter(Boolean).join(delimiter),\n }\n const beforeSkill = skillStatus(packageRoot, { home })\n const skill = options.dryRun\n ? beforeSkill\n : beforeSkill.canonical.exists && beforeSkill.canonical.managed &&\n !beforeSkill.canonical.modified && !beforeSkill.canonical.current\n ? upgradeGlobalSkill(packageRoot, { home })\n : installGlobalSkill(packageRoot, { home })\n const report = doctor(packageRoot, { home, env: effectiveEnv })\n return {\n $schema: 'dingtalk-agent/setup@1',\n dryRun: Boolean(options.dryRun),\n cli: {\n installed: !options.dryRun && !options.skipCliInstall && existsSync(executable),\n skipped: Boolean(options.skipCliInstall || alreadyCurrent),\n prefix,\n binDir,\n executable,\n alias,\n packageSpec,\n },\n shell,\n skill,\n doctor: report,\n nextCommand: report.ready ? 'dta bootstrap --json' : 'dta doctor',\n }\n}\n\nfunction ensureShellPath(\n home: string,\n binDir: string,\n env: NodeJS.ProcessEnv,\n options: { dryRun: boolean; writeShell: boolean },\n) {\n const current = (env.PATH || '').split(delimiter).filter(Boolean)\n const pathReady = current.includes(binDir)\n const shell = env.SHELL || ''\n const rcFile = shell.endsWith('/zsh')\n ? join(home, '.zshrc')\n : shell.endsWith('/bash')\n ? join(home, '.bashrc')\n : ''\n const isDefaultBin = binDir === join(home, '.local', 'bin')\n const activateCommand = isDefaultBin\n ? 'export PATH=\"$HOME/.local/bin:$PATH\"'\n : `export PATH=${shellQuote(binDir)}:\"$PATH\"`\n let updated = false\n if (!pathReady && options.writeShell && rcFile) {\n const before = existsSync(rcFile) ? readFileSync(rcFile, 'utf8') : ''\n if (!before.includes(PATH_MARKER_START) && !options.dryRun) {\n const pathLine = isDefaultBin\n ? 'export PATH=\"$HOME/.local/bin:$PATH\"'\n : `export PATH=${shellQuote(binDir)}:\"$PATH\"`\n const block = `${before && !before.endsWith('\\n') ? '\\n' : ''}${PATH_MARKER_START}\\n` +\n `${pathLine}\\n${PATH_MARKER_END}\\n`\n appendFileSync(rcFile, block)\n updated = true\n }\n }\n return { pathReady, rcFile, updated, activateCommand }\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n\nfunction readInstalledVersion(executable: string, env: NodeJS.ProcessEnv): string {\n const run = spawnSync(executable, ['--version'], { encoding: 'utf8', env, timeout: 8_000 })\n return run.status === 0 ? String(run.stdout || '').trim() : ''\n}\n"]}
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs'\nimport { delimiter, join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { spawnSync } from 'node:child_process'\n\nimport { doctor, findExecutable, type DoctorReport } from './doctor.js'\nimport {\n installGlobalSkill, skillStatus, type GlobalSkillStatus,\n} from './skill-manager.js'\n\nconst PATH_MARKER_START = '# >>> dingtalk-agent PATH >>>'\nconst PATH_MARKER_END = '# <<< dingtalk-agent PATH <<<'\n\nexport interface SetupOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n prefix?: string\n dryRun?: boolean\n writeShell?: boolean\n skipCliInstall?: boolean\n}\n\nexport interface SetupResult {\n $schema: 'dingtalk-agent/setup@1'\n dryRun: boolean\n cli: {\n installed: boolean\n skipped: boolean\n prefix: string\n binDir: string\n executable: string\n alias: string\n packageSpec: string\n }\n shell: {\n pathReady: boolean\n rcFile: string\n updated: boolean\n activateCommand: string\n }\n skill: GlobalSkillStatus\n doctor: DoctorReport\n nextCommand: string\n}\n\nexport function setup(packageRoot: string, options: SetupOptions = {}): SetupResult {\n const home = options.home || homedir()\n const env = { ...(options.env || process.env) }\n const prefix = options.prefix || join(home, '.local')\n const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin')\n const executable = join(binDir, process.platform === 'win32' ? 'dingtalk-agent.cmd' : 'dingtalk-agent')\n const alias = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta')\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const packageSpec = env.DTA_SETUP_PACKAGE_SOURCE || `${pkg.name}@${pkg.version}`\n const npm = findExecutable(process.platform === 'win32' ? 'npm.cmd' : 'npm', env) || 'npm'\n const installedVersion = existsSync(executable)\n ? readInstalledVersion(executable, env)\n : ''\n const aliasVersion = existsSync(alias) ? readInstalledVersion(alias, env) : ''\n const alreadyCurrent = installedVersion === String(pkg.version || '') && aliasVersion === installedVersion\n\n if (!options.dryRun && !options.skipCliInstall && !alreadyCurrent) {\n mkdirSync(prefix, { recursive: true })\n const run = spawnSync(npm, [\n 'install', '--global', '--prefix', prefix, '--registry', 'https://registry.npmjs.org', packageSpec,\n ], { encoding: 'utf8', env, timeout: 120_000 })\n if (run.status !== 0 || run.error) {\n throw new Error(\n `CLI 用户级安装失败: ${run.error?.message || String(run.stderr || run.stdout).trim() || `退出码 ${run.status}`}`,\n )\n }\n if (!existsSync(executable) || !existsSync(alias)) {\n throw new Error(`npm 安装完成但 CLI 入口不完整: ${executable} / ${alias}`)\n }\n }\n\n const shell = ensureShellPath(home, binDir, env, {\n dryRun: Boolean(options.dryRun),\n writeShell: options.writeShell !== false,\n })\n const effectiveEnv = {\n ...env,\n PATH: [binDir, env.PATH || ''].filter(Boolean).join(delimiter),\n }\n const beforeSkill = skillStatus(packageRoot, { home })\n const skill = options.dryRun\n ? beforeSkill\n : installGlobalSkill(packageRoot, { home, env: effectiveEnv })\n const report = doctor(packageRoot, { home, env: effectiveEnv })\n return {\n $schema: 'dingtalk-agent/setup@1',\n dryRun: Boolean(options.dryRun),\n cli: {\n installed: !options.dryRun && !options.skipCliInstall && existsSync(executable),\n skipped: Boolean(options.skipCliInstall || alreadyCurrent),\n prefix,\n binDir,\n executable,\n alias,\n packageSpec,\n },\n shell,\n skill,\n doctor: report,\n nextCommand: report.ready ? 'dta bootstrap --json' : 'dta doctor',\n }\n}\n\nfunction ensureShellPath(\n home: string,\n binDir: string,\n env: NodeJS.ProcessEnv,\n options: { dryRun: boolean; writeShell: boolean },\n) {\n const current = (env.PATH || '').split(delimiter).filter(Boolean)\n const pathReady = current.includes(binDir)\n const shell = env.SHELL || ''\n const rcFile = shell.endsWith('/zsh')\n ? join(home, '.zshrc')\n : shell.endsWith('/bash')\n ? join(home, '.bashrc')\n : ''\n const isDefaultBin = binDir === join(home, '.local', 'bin')\n const activateCommand = isDefaultBin\n ? 'export PATH=\"$HOME/.local/bin:$PATH\"'\n : `export PATH=${shellQuote(binDir)}:\"$PATH\"`\n let updated = false\n if (!pathReady && options.writeShell && rcFile) {\n const before = existsSync(rcFile) ? readFileSync(rcFile, 'utf8') : ''\n if (!before.includes(PATH_MARKER_START) && !options.dryRun) {\n const pathLine = isDefaultBin\n ? 'export PATH=\"$HOME/.local/bin:$PATH\"'\n : `export PATH=${shellQuote(binDir)}:\"$PATH\"`\n const block = `${before && !before.endsWith('\\n') ? '\\n' : ''}${PATH_MARKER_START}\\n` +\n `${pathLine}\\n${PATH_MARKER_END}\\n`\n appendFileSync(rcFile, block)\n updated = true\n }\n }\n return { pathReady, rcFile, updated, activateCommand }\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n\nfunction readInstalledVersion(executable: string, env: NodeJS.ProcessEnv): string {\n const run = spawnSync(executable, ['--version'], { encoding: 'utf8', env, timeout: 8_000 })\n return run.status === 0 ? String(run.stdout || '').trim() : ''\n}\n"]}
|
|
@@ -1,38 +1,32 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
// Claude: ~/.claude/skills/dingtalk-basic-behavior -> canonical
|
|
5
|
-
//
|
|
6
|
-
// 不链接 npm/node_modules:包升级、卸载或 npx cache 清理都不应让 Skill 断掉。
|
|
7
|
-
import { cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, readdirSync, renameSync, rmSync, symlinkSync, writeFileSync, } from 'node:fs';
|
|
8
|
-
import { createHash, randomUUID } from 'node:crypto';
|
|
1
|
+
// Skill 安装生命周期由开放生态的 `npx skills` 负责。
|
|
2
|
+
// dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。
|
|
3
|
+
import { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs';
|
|
9
4
|
import { homedir } from 'node:os';
|
|
10
|
-
import { dirname, join,
|
|
5
|
+
import { dirname, join, resolve } from 'node:path';
|
|
6
|
+
import { spawnSync } from 'node:child_process';
|
|
11
7
|
export const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior';
|
|
12
|
-
const
|
|
13
|
-
const
|
|
8
|
+
const SKILLS_PACKAGE = 'skills@latest';
|
|
9
|
+
const REGISTRY = 'https://registry.npmjs.org';
|
|
10
|
+
const AGENTS = ['claude-code', 'codex', 'opencode'];
|
|
14
11
|
export function skillStatus(packageRoot, options = {}) {
|
|
15
12
|
const paths = globalPaths(packageRoot, options.home);
|
|
16
13
|
const bundled = bundledInfo(packageRoot);
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const managed = marker?.manager === MANAGER;
|
|
22
|
-
const modified = Boolean(managed && installedHash !== marker?.sourceHash);
|
|
14
|
+
const canonicalExists = isDirectory(paths.canonical);
|
|
15
|
+
const installedVersion = canonicalExists
|
|
16
|
+
? parseSkillFrontmatter(readFileSync(join(paths.canonical, 'SKILL.md'), 'utf8')).version
|
|
17
|
+
: '';
|
|
23
18
|
const claude = inspectExposure(paths.claude, paths.canonical);
|
|
24
19
|
const sharedState = canonicalExists ? 'ok' : 'missing';
|
|
25
20
|
return {
|
|
26
|
-
$schema: 'dingtalk-agent/skill-status@
|
|
21
|
+
$schema: 'dingtalk-agent/skill-status@2',
|
|
27
22
|
name: GLOBAL_SKILL_NAME,
|
|
23
|
+
manager: 'skills-cli',
|
|
28
24
|
bundled,
|
|
29
25
|
canonical: {
|
|
30
26
|
path: paths.canonical,
|
|
31
27
|
exists: canonicalExists,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
modified,
|
|
35
|
-
current: Boolean(managed && !modified && installedHash === bundled.hash),
|
|
28
|
+
installedVersion,
|
|
29
|
+
current: Boolean(canonicalExists && installedVersion === bundled.skillVersion),
|
|
36
30
|
},
|
|
37
31
|
claude: { path: paths.claude, ...claude },
|
|
38
32
|
clients: [
|
|
@@ -49,144 +43,76 @@ export function skillStatus(packageRoot, options = {}) {
|
|
|
49
43
|
path: paths.canonical, state: sharedState,
|
|
50
44
|
},
|
|
51
45
|
],
|
|
52
|
-
legacyCodex: { path: paths.legacyCodex, conflict: pathExists(paths.legacyCodex) },
|
|
53
46
|
};
|
|
54
47
|
}
|
|
55
48
|
export function installGlobalSkill(packageRoot, options = {}) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
if (before.canonical.modified) {
|
|
62
|
-
throw new Error(`全局 Skill 有本地修改,拒绝覆盖: ${before.canonical.path}`);
|
|
63
|
-
}
|
|
64
|
-
if (!before.canonical.current) {
|
|
65
|
-
throw new Error('已安装版本不是当前内置版本;请运行 `dingtalk-agent skill upgrade`');
|
|
66
|
-
}
|
|
67
|
-
ensureClaudeExposure(before.canonical.path, before.claude.path, options.dryRun);
|
|
68
|
-
return options.dryRun ? before : skillStatus(packageRoot, options);
|
|
69
|
-
}
|
|
70
|
-
if (before.claude.state === 'conflict') {
|
|
71
|
-
throw new Error(`Claude Skill 路径已有陌生内容,拒绝覆盖: ${before.claude.path}`);
|
|
72
|
-
}
|
|
73
|
-
if (!options.dryRun) {
|
|
74
|
-
installCanonical(packageRoot, before.canonical.path);
|
|
75
|
-
ensureClaudeExposure(before.canonical.path, before.claude.path, false);
|
|
76
|
-
}
|
|
77
|
-
return options.dryRun ? before : skillStatus(packageRoot, options);
|
|
49
|
+
return runSkills(packageRoot, 'install', [
|
|
50
|
+
'add', globalPaths(packageRoot).source,
|
|
51
|
+
'--global', '--yes', '--agent', ...AGENTS,
|
|
52
|
+
], options);
|
|
78
53
|
}
|
|
79
54
|
export function upgradeGlobalSkill(packageRoot, options = {}) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
if (before.canonical.modified && !options.discardLocalChanges) {
|
|
87
|
-
throw new Error('全局 Skill 有本地修改;先保存改动,或显式使用 `--discard-local-changes` 放弃修改');
|
|
88
|
-
}
|
|
89
|
-
if (before.claude.state === 'conflict') {
|
|
90
|
-
throw new Error(`Claude Skill 路径已有陌生内容,拒绝覆盖: ${before.claude.path}`);
|
|
91
|
-
}
|
|
92
|
-
if (!options.dryRun && !before.canonical.current) {
|
|
93
|
-
replaceCanonical(packageRoot, before.canonical.path);
|
|
94
|
-
}
|
|
95
|
-
ensureClaudeExposure(before.canonical.path, before.claude.path, options.dryRun);
|
|
96
|
-
return options.dryRun ? before : skillStatus(packageRoot, options);
|
|
55
|
+
// Skill 随 npm 包发布;重新 add 当前包内目录,让 skills CLI 执行自己的覆盖/链接语义。
|
|
56
|
+
return runSkills(packageRoot, 'upgrade', [
|
|
57
|
+
'add', globalPaths(packageRoot).source,
|
|
58
|
+
'--global', '--yes', '--agent', ...AGENTS,
|
|
59
|
+
], options);
|
|
97
60
|
}
|
|
98
61
|
export function uninstallGlobalSkill(packageRoot, options = {}) {
|
|
62
|
+
return runSkills(packageRoot, 'uninstall', [
|
|
63
|
+
'remove', GLOBAL_SKILL_NAME,
|
|
64
|
+
'--global', '--yes', '--agent', ...AGENTS,
|
|
65
|
+
], options);
|
|
66
|
+
}
|
|
67
|
+
function runSkills(packageRoot, action, args, options) {
|
|
68
|
+
const commandArgs = ['--yes', `--registry=${REGISTRY}`, SKILLS_PACKAGE, ...args];
|
|
69
|
+
const command = ['npx', ...commandArgs].map(shellQuote).join(' ');
|
|
99
70
|
const before = skillStatus(packageRoot, options);
|
|
100
|
-
if (
|
|
101
|
-
return
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
71
|
+
if (options.dryRun) {
|
|
72
|
+
return {
|
|
73
|
+
...before,
|
|
74
|
+
operation: { action, command, executed: false, exitCode: null, output: '' },
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const env = {
|
|
78
|
+
...process.env,
|
|
79
|
+
...(options.env || {}),
|
|
80
|
+
HOME: options.home || options.env?.HOME || process.env.HOME || homedir(),
|
|
81
|
+
};
|
|
82
|
+
const run = spawnSync('npx', commandArgs, {
|
|
83
|
+
encoding: 'utf8', env, timeout: 120_000,
|
|
84
|
+
});
|
|
85
|
+
const output = [run.stdout, run.stderr].filter(Boolean).join('\n').trim();
|
|
86
|
+
if (run.error || run.status !== 0) {
|
|
87
|
+
const reason = run.error?.code === 'ENOENT'
|
|
88
|
+
? 'PATH 找不到 npx;请安装带 npm/npx 的 Node.js 18.3+'
|
|
89
|
+
: run.error?.message || output || `退出码 ${run.status}`;
|
|
90
|
+
throw new Error(`skills CLI ${action} 失败: ${reason}\n` +
|
|
91
|
+
`可手动执行: ${command}`);
|
|
112
92
|
}
|
|
113
|
-
return
|
|
93
|
+
return {
|
|
94
|
+
...skillStatus(packageRoot, options),
|
|
95
|
+
operation: { action, command, executed: true, exitCode: run.status, output },
|
|
96
|
+
};
|
|
114
97
|
}
|
|
115
98
|
function globalPaths(packageRoot, home = homedir()) {
|
|
116
99
|
return {
|
|
117
100
|
source: join(packageRoot, 'skills', GLOBAL_SKILL_NAME),
|
|
118
101
|
canonical: join(home, '.agents', 'skills', GLOBAL_SKILL_NAME),
|
|
119
102
|
claude: join(home, '.claude', 'skills', GLOBAL_SKILL_NAME),
|
|
120
|
-
legacyCodex: join(home, '.codex', 'skills', GLOBAL_SKILL_NAME),
|
|
121
103
|
};
|
|
122
104
|
}
|
|
123
105
|
function bundledInfo(packageRoot) {
|
|
124
|
-
const
|
|
125
|
-
validateSkill(
|
|
106
|
+
const source = globalPaths(packageRoot).source;
|
|
107
|
+
validateSkill(source);
|
|
126
108
|
const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'));
|
|
127
|
-
const frontmatter = parseSkillFrontmatter(readFileSync(join(
|
|
109
|
+
const frontmatter = parseSkillFrontmatter(readFileSync(join(source, 'SKILL.md'), 'utf8'));
|
|
128
110
|
return {
|
|
129
|
-
path:
|
|
111
|
+
path: source,
|
|
130
112
|
packageVersion: String(pkg.version || ''),
|
|
131
113
|
skillVersion: frontmatter.version,
|
|
132
|
-
hash: hashDirectory(paths.source),
|
|
133
114
|
};
|
|
134
115
|
}
|
|
135
|
-
function installCanonical(packageRoot, destination) {
|
|
136
|
-
const source = globalPaths(packageRoot).source;
|
|
137
|
-
const bundled = bundledInfo(packageRoot);
|
|
138
|
-
const parent = dirname(destination);
|
|
139
|
-
mkdirSync(parent, { recursive: true });
|
|
140
|
-
const stage = join(parent, `.${GLOBAL_SKILL_NAME}.stage.${process.pid}.${randomUUID()}`);
|
|
141
|
-
try {
|
|
142
|
-
cpSync(source, stage, { recursive: true, errorOnExist: true, force: false });
|
|
143
|
-
writeFileSync(join(stage, MARKER), JSON.stringify(markerFor(bundled), null, 2) + '\n', { flag: 'wx' });
|
|
144
|
-
validateSkill(stage);
|
|
145
|
-
if (hashDirectory(stage) !== bundled.hash)
|
|
146
|
-
throw new Error('Skill staging hash 与内置版本不一致');
|
|
147
|
-
renameSync(stage, destination);
|
|
148
|
-
}
|
|
149
|
-
finally {
|
|
150
|
-
rmSync(stage, { recursive: true, force: true });
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
function replaceCanonical(packageRoot, destination) {
|
|
154
|
-
const parent = dirname(destination);
|
|
155
|
-
const backup = join(parent, `.${GLOBAL_SKILL_NAME}.backup.${process.pid}.${randomUUID()}`);
|
|
156
|
-
const stageDestination = join(parent, `.${GLOBAL_SKILL_NAME}.next.${process.pid}.${randomUUID()}`);
|
|
157
|
-
installCanonical(packageRoot, stageDestination);
|
|
158
|
-
renameSync(destination, backup);
|
|
159
|
-
try {
|
|
160
|
-
renameSync(stageDestination, destination);
|
|
161
|
-
rmSync(backup, { recursive: true, force: true });
|
|
162
|
-
}
|
|
163
|
-
catch (error) {
|
|
164
|
-
if (!existsSync(destination) && existsSync(backup))
|
|
165
|
-
renameSync(backup, destination);
|
|
166
|
-
throw error;
|
|
167
|
-
}
|
|
168
|
-
finally {
|
|
169
|
-
rmSync(stageDestination, { recursive: true, force: true });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
function ensureClaudeExposure(canonical, exposure, dryRun = false) {
|
|
173
|
-
const state = inspectExposure(exposure, canonical);
|
|
174
|
-
if (state.state === 'ok')
|
|
175
|
-
return;
|
|
176
|
-
if (state.state === 'conflict')
|
|
177
|
-
throw new Error(`Claude Skill 路径已有陌生内容: ${exposure}`);
|
|
178
|
-
if (dryRun)
|
|
179
|
-
return;
|
|
180
|
-
mkdirSync(dirname(exposure), { recursive: true });
|
|
181
|
-
const target = relative(dirname(exposure), canonical) || '.';
|
|
182
|
-
try {
|
|
183
|
-
symlinkSync(target, exposure, 'dir');
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
throw new Error(`无法为 Claude Code 创建 Skill symlink: ${String(error.message || error)};` +
|
|
187
|
-
'请检查 ~/.claude/skills 的写权限');
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
116
|
function inspectExposure(exposure, canonical) {
|
|
191
117
|
if (!pathExists(exposure))
|
|
192
118
|
return { state: 'missing', target: '' };
|
|
@@ -194,47 +120,13 @@ function inspectExposure(exposure, canonical) {
|
|
|
194
120
|
if (!stat.isSymbolicLink())
|
|
195
121
|
return { state: 'conflict', target: '' };
|
|
196
122
|
const raw = readlinkSync(exposure);
|
|
197
|
-
|
|
198
|
-
return target === resolve(canonical)
|
|
123
|
+
return resolve(dirname(exposure), raw) === resolve(canonical)
|
|
199
124
|
? { state: 'ok', target: raw }
|
|
200
125
|
: { state: 'conflict', target: raw };
|
|
201
126
|
}
|
|
202
|
-
function markerFor(bundled) {
|
|
203
|
-
return {
|
|
204
|
-
$schema: 'dingtalk-agent/managed-skill@1',
|
|
205
|
-
manager: MANAGER,
|
|
206
|
-
packageVersion: bundled.packageVersion,
|
|
207
|
-
skillVersion: bundled.skillVersion,
|
|
208
|
-
sourceHash: bundled.hash,
|
|
209
|
-
installedAt: new Date().toISOString(),
|
|
210
|
-
exposure: { claude: 'symlink' },
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
function readMarker(skillRoot) {
|
|
214
|
-
const path = join(skillRoot, MARKER);
|
|
215
|
-
if (!existsSync(path))
|
|
216
|
-
return null;
|
|
217
|
-
try {
|
|
218
|
-
const value = JSON.parse(readFileSync(path, 'utf8'));
|
|
219
|
-
return value?.$schema === 'dingtalk-agent/managed-skill@1' ? value : null;
|
|
220
|
-
}
|
|
221
|
-
catch {
|
|
222
|
-
return null;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
function pathExists(path) {
|
|
226
|
-
try {
|
|
227
|
-
lstatSync(path);
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
catch {
|
|
231
|
-
return false;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
127
|
function validateSkill(root) {
|
|
235
|
-
if (!
|
|
128
|
+
if (!isDirectory(root))
|
|
236
129
|
throw new Error(`内置 Skill 不存在: ${root}`);
|
|
237
|
-
}
|
|
238
130
|
const file = join(root, 'SKILL.md');
|
|
239
131
|
if (!existsSync(file))
|
|
240
132
|
throw new Error(`Skill 缺少 SKILL.md: ${root}`);
|
|
@@ -261,28 +153,24 @@ function parseSkillFrontmatter(text) {
|
|
|
261
153
|
version: nestedVersion?.[1]?.trim() || readScalar('version'),
|
|
262
154
|
};
|
|
263
155
|
}
|
|
264
|
-
function
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
hash.update(rel).update('\0').update(readFileSync(path)).update('\0');
|
|
156
|
+
function isDirectory(path) {
|
|
157
|
+
try {
|
|
158
|
+
return lstatSync(path).isDirectory();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return false;
|
|
271
162
|
}
|
|
272
|
-
return hash.digest('hex');
|
|
273
163
|
}
|
|
274
|
-
function
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const stat = lstatSync(path);
|
|
279
|
-
if (stat.isSymbolicLink())
|
|
280
|
-
throw new Error(`Skill 内不允许符号链接: ${path}`);
|
|
281
|
-
if (stat.isDirectory())
|
|
282
|
-
out.push(...walk(path));
|
|
283
|
-
else if (stat.isFile())
|
|
284
|
-
out.push(path);
|
|
164
|
+
function pathExists(path) {
|
|
165
|
+
try {
|
|
166
|
+
lstatSync(path);
|
|
167
|
+
return true;
|
|
285
168
|
}
|
|
286
|
-
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function shellQuote(value) {
|
|
174
|
+
return /^[A-Za-z0-9_./:=@-]+$/.test(value) ? value : `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
287
175
|
}
|
|
288
176
|
//# sourceMappingURL=skill-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skill-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// 全局 Skill 生命周期:一个 canonical copy,按 Agent 客户端暴露。\n//\n// canonical: ~/.agents/skills/dingtalk-basic-behavior\n// Claude: ~/.claude/skills/dingtalk-basic-behavior -> canonical\n//\n// 不链接 npm/node_modules:包升级、卸载或 npx cache 清理都不应让 Skill 断掉。\n\nimport {\n cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync,\n readdirSync, renameSync, rmSync, symlinkSync, writeFileSync,\n} from 'node:fs'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { dirname, join, relative, resolve } from 'node:path'\n\nexport const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior'\nconst MARKER = '.dingtalk-agent-install.json'\nconst MANAGER = '@xdxer/dingtalk-agent'\n\ninterface InstallMarker {\n $schema: 'dingtalk-agent/managed-skill@1'\n manager: typeof MANAGER\n packageVersion: string\n skillVersion: string\n sourceHash: string\n installedAt: string\n exposure: { claude: 'symlink' }\n}\n\nexport interface SkillManagerOptions {\n home?: string\n dryRun?: boolean\n discardLocalChanges?: boolean\n}\n\nexport interface GlobalSkillStatus {\n $schema: 'dingtalk-agent/skill-status@1'\n name: string\n bundled: { path: string; packageVersion: string; skillVersion: string; hash: string }\n canonical: {\n path: string\n exists: boolean\n managed: boolean\n installedHash: string\n modified: boolean\n current: boolean\n }\n claude: { path: string; state: 'ok' | 'missing' | 'conflict'; target: string }\n clients: Array<{\n name: 'claude-code' | 'codex' | 'opencode'\n label: string\n discovery: 'symlink' | 'shared-agent-skills'\n path: string\n state: 'ok' | 'missing' | 'conflict'\n }>\n legacyCodex: { path: string; conflict: boolean }\n}\n\nexport function skillStatus(packageRoot: string, options: SkillManagerOptions = {}): GlobalSkillStatus {\n const paths = globalPaths(packageRoot, options.home)\n const bundled = bundledInfo(packageRoot)\n const marker = readMarker(paths.canonical)\n const canonicalExists = pathExists(paths.canonical)\n const canonicalDirectory = canonicalExists && lstatSync(paths.canonical).isDirectory()\n const installedHash = canonicalDirectory ? hashDirectory(paths.canonical) : ''\n const managed = marker?.manager === MANAGER\n const modified = Boolean(managed && installedHash !== marker?.sourceHash)\n const claude = inspectExposure(paths.claude, paths.canonical)\n const sharedState = canonicalExists ? 'ok' : 'missing'\n return {\n $schema: 'dingtalk-agent/skill-status@1',\n name: GLOBAL_SKILL_NAME,\n bundled,\n canonical: {\n path: paths.canonical,\n exists: canonicalExists,\n managed,\n installedHash,\n modified,\n current: Boolean(managed && !modified && installedHash === bundled.hash),\n },\n claude: { path: paths.claude, ...claude },\n clients: [\n {\n name: 'claude-code', label: 'Claude Code', discovery: 'symlink',\n path: paths.claude, state: claude.state,\n },\n {\n name: 'codex', label: 'Codex', discovery: 'shared-agent-skills',\n path: paths.canonical, state: sharedState,\n },\n {\n name: 'opencode', label: 'OpenCode', discovery: 'shared-agent-skills',\n path: paths.canonical, state: sharedState,\n },\n ],\n legacyCodex: { path: paths.legacyCodex, conflict: pathExists(paths.legacyCodex) },\n }\n}\n\nexport function installGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n const before = skillStatus(packageRoot, options)\n if (before.canonical.exists) {\n if (!before.canonical.managed) {\n throw new Error(`全局 Skill 同名目录不归 dingtalk-agent 管理,拒绝覆盖: ${before.canonical.path}`)\n }\n if (before.canonical.modified) {\n throw new Error(`全局 Skill 有本地修改,拒绝覆盖: ${before.canonical.path}`)\n }\n if (!before.canonical.current) {\n throw new Error('已安装版本不是当前内置版本;请运行 `dingtalk-agent skill upgrade`')\n }\n ensureClaudeExposure(before.canonical.path, before.claude.path, options.dryRun)\n return options.dryRun ? before : skillStatus(packageRoot, options)\n }\n\n if (before.claude.state === 'conflict') {\n throw new Error(`Claude Skill 路径已有陌生内容,拒绝覆盖: ${before.claude.path}`)\n }\n if (!options.dryRun) {\n installCanonical(packageRoot, before.canonical.path)\n ensureClaudeExposure(before.canonical.path, before.claude.path, false)\n }\n return options.dryRun ? before : skillStatus(packageRoot, options)\n}\n\nexport function upgradeGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n const before = skillStatus(packageRoot, options)\n if (!before.canonical.exists) return installGlobalSkill(packageRoot, options)\n if (!before.canonical.managed) {\n throw new Error(`全局 Skill 不归 dingtalk-agent 管理,拒绝接管: ${before.canonical.path}`)\n }\n if (before.canonical.modified && !options.discardLocalChanges) {\n throw new Error(\n '全局 Skill 有本地修改;先保存改动,或显式使用 `--discard-local-changes` 放弃修改',\n )\n }\n if (before.claude.state === 'conflict') {\n throw new Error(`Claude Skill 路径已有陌生内容,拒绝覆盖: ${before.claude.path}`)\n }\n if (!options.dryRun && !before.canonical.current) {\n replaceCanonical(packageRoot, before.canonical.path)\n }\n ensureClaudeExposure(before.canonical.path, before.claude.path, options.dryRun)\n return options.dryRun ? before : skillStatus(packageRoot, options)\n}\n\nexport function uninstallGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n const before = skillStatus(packageRoot, options)\n if (!before.canonical.exists) return before\n if (!before.canonical.managed) {\n throw new Error(`全局 Skill 不归 dingtalk-agent 管理,拒绝删除: ${before.canonical.path}`)\n }\n if (before.canonical.modified && !options.discardLocalChanges) {\n throw new Error(\n '全局 Skill 有本地修改;先保存改动,或显式使用 `--discard-local-changes` 放弃修改',\n )\n }\n if (!options.dryRun) {\n if (before.claude.state === 'ok') rmSync(before.claude.path)\n rmSync(before.canonical.path, { recursive: true, force: true })\n }\n return options.dryRun ? before : skillStatus(packageRoot, options)\n}\n\nfunction globalPaths(packageRoot: string, home = homedir()) {\n return {\n source: join(packageRoot, 'skills', GLOBAL_SKILL_NAME),\n canonical: join(home, '.agents', 'skills', GLOBAL_SKILL_NAME),\n claude: join(home, '.claude', 'skills', GLOBAL_SKILL_NAME),\n legacyCodex: join(home, '.codex', 'skills', GLOBAL_SKILL_NAME),\n }\n}\n\nfunction bundledInfo(packageRoot: string) {\n const paths = globalPaths(packageRoot)\n validateSkill(paths.source)\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const frontmatter = parseSkillFrontmatter(readFileSync(join(paths.source, 'SKILL.md'), 'utf8'))\n return {\n path: paths.source,\n packageVersion: String(pkg.version || ''),\n skillVersion: frontmatter.version,\n hash: hashDirectory(paths.source),\n }\n}\n\nfunction installCanonical(packageRoot: string, destination: string): void {\n const source = globalPaths(packageRoot).source\n const bundled = bundledInfo(packageRoot)\n const parent = dirname(destination)\n mkdirSync(parent, { recursive: true })\n const stage = join(parent, `.${GLOBAL_SKILL_NAME}.stage.${process.pid}.${randomUUID()}`)\n try {\n cpSync(source, stage, { recursive: true, errorOnExist: true, force: false })\n writeFileSync(join(stage, MARKER), JSON.stringify(markerFor(bundled), null, 2) + '\\n', { flag: 'wx' })\n validateSkill(stage)\n if (hashDirectory(stage) !== bundled.hash) throw new Error('Skill staging hash 与内置版本不一致')\n renameSync(stage, destination)\n } finally {\n rmSync(stage, { recursive: true, force: true })\n }\n}\n\nfunction replaceCanonical(packageRoot: string, destination: string): void {\n const parent = dirname(destination)\n const backup = join(parent, `.${GLOBAL_SKILL_NAME}.backup.${process.pid}.${randomUUID()}`)\n const stageDestination = join(parent, `.${GLOBAL_SKILL_NAME}.next.${process.pid}.${randomUUID()}`)\n installCanonical(packageRoot, stageDestination)\n renameSync(destination, backup)\n try {\n renameSync(stageDestination, destination)\n rmSync(backup, { recursive: true, force: true })\n } catch (error) {\n if (!existsSync(destination) && existsSync(backup)) renameSync(backup, destination)\n throw error\n } finally {\n rmSync(stageDestination, { recursive: true, force: true })\n }\n}\n\nfunction ensureClaudeExposure(canonical: string, exposure: string, dryRun = false): void {\n const state = inspectExposure(exposure, canonical)\n if (state.state === 'ok') return\n if (state.state === 'conflict') throw new Error(`Claude Skill 路径已有陌生内容: ${exposure}`)\n if (dryRun) return\n mkdirSync(dirname(exposure), { recursive: true })\n const target = relative(dirname(exposure), canonical) || '.'\n try {\n symlinkSync(target, exposure, 'dir')\n } catch (error) {\n throw new Error(\n `无法为 Claude Code 创建 Skill symlink: ${String(error.message || error)};` +\n '请检查 ~/.claude/skills 的写权限',\n )\n }\n}\n\nfunction inspectExposure(exposure: string, canonical: string): {\n state: 'ok' | 'missing' | 'conflict'\n target: string\n} {\n if (!pathExists(exposure)) return { state: 'missing', target: '' }\n const stat = lstatSync(exposure)\n if (!stat.isSymbolicLink()) return { state: 'conflict', target: '' }\n const raw = readlinkSync(exposure)\n const target = resolve(dirname(exposure), raw)\n return target === resolve(canonical)\n ? { state: 'ok', target: raw }\n : { state: 'conflict', target: raw }\n}\n\nfunction markerFor(bundled: ReturnType<typeof bundledInfo>): InstallMarker {\n return {\n $schema: 'dingtalk-agent/managed-skill@1',\n manager: MANAGER,\n packageVersion: bundled.packageVersion,\n skillVersion: bundled.skillVersion,\n sourceHash: bundled.hash,\n installedAt: new Date().toISOString(),\n exposure: { claude: 'symlink' },\n }\n}\n\nfunction readMarker(skillRoot: string): InstallMarker | null {\n const path = join(skillRoot, MARKER)\n if (!existsSync(path)) return null\n try {\n const value = JSON.parse(readFileSync(path, 'utf8'))\n return value?.$schema === 'dingtalk-agent/managed-skill@1' ? value : null\n } catch { return null }\n}\n\nfunction pathExists(path: string): boolean {\n try { lstatSync(path); return true } catch { return false }\n}\n\nfunction validateSkill(root: string): void {\n if (!existsSync(root) || !lstatSync(root).isDirectory()) {\n throw new Error(`内置 Skill 不存在: ${root}`)\n }\n const file = join(root, 'SKILL.md')\n if (!existsSync(file)) throw new Error(`Skill 缺少 SKILL.md: ${root}`)\n const metadata = parseSkillFrontmatter(readFileSync(file, 'utf8'))\n if (metadata.name !== GLOBAL_SKILL_NAME) {\n throw new Error(`Skill name=${metadata.name} 与目录名 ${GLOBAL_SKILL_NAME} 不一致`)\n }\n if (!metadata.description) throw new Error('Skill frontmatter 缺少 description')\n}\n\nfunction parseSkillFrontmatter(text: string): { name: string; description: string; version: string } {\n const match = text.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/)\n if (!match) throw new Error('SKILL.md 缺少 YAML frontmatter')\n const block = match[1]\n const readScalar = (key: string) => {\n const found = block.match(new RegExp(`^${key}:\\\\s*(.+)$`, 'm'))\n return found ? found[1].trim().replace(/^(['\"])(.*)\\1$/, '$2') : ''\n }\n const nestedVersion = block.match(/^metadata:\\s*\\r?\\n(?:[ \\t]+.*\\r?\\n)*?[ \\t]+version:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)\n return {\n name: readScalar('name'),\n description: readScalar('description'),\n version: nestedVersion?.[1]?.trim() || readScalar('version'),\n }\n}\n\nfunction hashDirectory(root: string): string {\n const hash = createHash('sha256')\n for (const path of walk(root)) {\n const rel = relative(root, path).split('\\\\').join('/')\n if (rel === MARKER) continue\n hash.update(rel).update('\\0').update(readFileSync(path)).update('\\0')\n }\n return hash.digest('hex')\n}\n\nfunction walk(root: string): string[] {\n const out: string[] = []\n for (const name of readdirSync(root).sort()) {\n const path = join(root, name)\n const stat = lstatSync(path)\n if (stat.isSymbolicLink()) throw new Error(`Skill 内不允许符号链接: ${path}`)\n if (stat.isDirectory()) out.push(...walk(path))\n else if (stat.isFile()) out.push(path)\n }\n return out\n}\n"]}
|
|
1
|
+
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skill-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// Skill 安装生命周期由开放生态的 `npx skills` 负责。\n// dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。\n\nimport { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { spawnSync } from 'node:child_process'\n\nexport const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior'\nconst SKILLS_PACKAGE = 'skills@latest'\nconst REGISTRY = 'https://registry.npmjs.org'\nconst AGENTS = ['claude-code', 'codex', 'opencode']\n\nexport interface SkillManagerOptions {\n home?: string\n dryRun?: boolean\n env?: NodeJS.ProcessEnv\n}\n\nexport interface GlobalSkillStatus {\n $schema: 'dingtalk-agent/skill-status@2'\n name: string\n manager: 'skills-cli'\n bundled: { path: string; packageVersion: string; skillVersion: string }\n canonical: {\n path: string\n exists: boolean\n installedVersion: string\n current: boolean\n }\n claude: { path: string; state: 'ok' | 'missing' | 'conflict'; target: string }\n clients: Array<{\n name: 'claude-code' | 'codex' | 'opencode'\n label: string\n discovery: 'symlink' | 'shared-agent-skills'\n path: string\n state: 'ok' | 'missing' | 'conflict'\n }>\n operation?: {\n action: 'install' | 'upgrade' | 'uninstall'\n command: string\n executed: boolean\n exitCode: number | null\n output: string\n }\n}\n\nexport function skillStatus(packageRoot: string, options: SkillManagerOptions = {}): GlobalSkillStatus {\n const paths = globalPaths(packageRoot, options.home)\n const bundled = bundledInfo(packageRoot)\n const canonicalExists = isDirectory(paths.canonical)\n const installedVersion = canonicalExists\n ? parseSkillFrontmatter(readFileSync(join(paths.canonical, 'SKILL.md'), 'utf8')).version\n : ''\n const claude = inspectExposure(paths.claude, paths.canonical)\n const sharedState = canonicalExists ? 'ok' : 'missing'\n return {\n $schema: 'dingtalk-agent/skill-status@2',\n name: GLOBAL_SKILL_NAME,\n manager: 'skills-cli',\n bundled,\n canonical: {\n path: paths.canonical,\n exists: canonicalExists,\n installedVersion,\n current: Boolean(canonicalExists && installedVersion === bundled.skillVersion),\n },\n claude: { path: paths.claude, ...claude },\n clients: [\n {\n name: 'claude-code', label: 'Claude Code', discovery: 'symlink',\n path: paths.claude, state: claude.state,\n },\n {\n name: 'codex', label: 'Codex', discovery: 'shared-agent-skills',\n path: paths.canonical, state: sharedState,\n },\n {\n name: 'opencode', label: 'OpenCode', discovery: 'shared-agent-skills',\n path: paths.canonical, state: sharedState,\n },\n ],\n }\n}\n\nexport function installGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n return runSkills(packageRoot, 'install', [\n 'add', globalPaths(packageRoot).source,\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nexport function upgradeGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n // Skill 随 npm 包发布;重新 add 当前包内目录,让 skills CLI 执行自己的覆盖/链接语义。\n return runSkills(packageRoot, 'upgrade', [\n 'add', globalPaths(packageRoot).source,\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nexport function uninstallGlobalSkill(\n packageRoot: string,\n options: SkillManagerOptions = {},\n): GlobalSkillStatus {\n return runSkills(packageRoot, 'uninstall', [\n 'remove', GLOBAL_SKILL_NAME,\n '--global', '--yes', '--agent', ...AGENTS,\n ], options)\n}\n\nfunction runSkills(\n packageRoot: string,\n action: 'install' | 'upgrade' | 'uninstall',\n args: string[],\n options: SkillManagerOptions,\n): GlobalSkillStatus {\n const commandArgs = ['--yes', `--registry=${REGISTRY}`, SKILLS_PACKAGE, ...args]\n const command = ['npx', ...commandArgs].map(shellQuote).join(' ')\n const before = skillStatus(packageRoot, options)\n if (options.dryRun) {\n return {\n ...before,\n operation: { action, command, executed: false, exitCode: null, output: '' },\n }\n }\n\n const env = {\n ...process.env,\n ...(options.env || {}),\n HOME: options.home || options.env?.HOME || process.env.HOME || homedir(),\n }\n const run = spawnSync('npx', commandArgs, {\n encoding: 'utf8', env, timeout: 120_000,\n })\n const output = [run.stdout, run.stderr].filter(Boolean).join('\\n').trim()\n if (run.error || run.status !== 0) {\n const reason = (run.error as NodeJS.ErrnoException | undefined)?.code === 'ENOENT'\n ? 'PATH 找不到 npx;请安装带 npm/npx 的 Node.js 18.3+'\n : run.error?.message || output || `退出码 ${run.status}`\n throw new Error(\n `skills CLI ${action} 失败: ${reason}\\n` +\n `可手动执行: ${command}`,\n )\n }\n return {\n ...skillStatus(packageRoot, options),\n operation: { action, command, executed: true, exitCode: run.status, output },\n }\n}\n\nfunction globalPaths(packageRoot: string, home = homedir()) {\n return {\n source: join(packageRoot, 'skills', GLOBAL_SKILL_NAME),\n canonical: join(home, '.agents', 'skills', GLOBAL_SKILL_NAME),\n claude: join(home, '.claude', 'skills', GLOBAL_SKILL_NAME),\n }\n}\n\nfunction bundledInfo(packageRoot: string) {\n const source = globalPaths(packageRoot).source\n validateSkill(source)\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const frontmatter = parseSkillFrontmatter(readFileSync(join(source, 'SKILL.md'), 'utf8'))\n return {\n path: source,\n packageVersion: String(pkg.version || ''),\n skillVersion: frontmatter.version,\n }\n}\n\nfunction inspectExposure(exposure: string, canonical: string): {\n state: 'ok' | 'missing' | 'conflict'\n target: string\n} {\n if (!pathExists(exposure)) return { state: 'missing', target: '' }\n const stat = lstatSync(exposure)\n if (!stat.isSymbolicLink()) return { state: 'conflict', target: '' }\n const raw = readlinkSync(exposure)\n return resolve(dirname(exposure), raw) === resolve(canonical)\n ? { state: 'ok', target: raw }\n : { state: 'conflict', target: raw }\n}\n\nfunction validateSkill(root: string): void {\n if (!isDirectory(root)) throw new Error(`内置 Skill 不存在: ${root}`)\n const file = join(root, 'SKILL.md')\n if (!existsSync(file)) throw new Error(`Skill 缺少 SKILL.md: ${root}`)\n const metadata = parseSkillFrontmatter(readFileSync(file, 'utf8'))\n if (metadata.name !== GLOBAL_SKILL_NAME) {\n throw new Error(`Skill name=${metadata.name} 与目录名 ${GLOBAL_SKILL_NAME} 不一致`)\n }\n if (!metadata.description) throw new Error('Skill frontmatter 缺少 description')\n}\n\nfunction parseSkillFrontmatter(text: string): { name: string; description: string; version: string } {\n const match = text.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/)\n if (!match) throw new Error('SKILL.md 缺少 YAML frontmatter')\n const block = match[1]\n const readScalar = (key: string) => {\n const found = block.match(new RegExp(`^${key}:\\\\s*(.+)$`, 'm'))\n return found ? found[1].trim().replace(/^(['\"])(.*)\\1$/, '$2') : ''\n }\n const nestedVersion = block.match(/^metadata:\\s*\\r?\\n(?:[ \\t]+.*\\r?\\n)*?[ \\t]+version:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)\n return {\n name: readScalar('name'),\n description: readScalar('description'),\n version: nestedVersion?.[1]?.trim() || readScalar('version'),\n }\n}\n\nfunction isDirectory(path: string): boolean {\n try { return lstatSync(path).isDirectory() } catch { return false }\n}\n\nfunction pathExists(path: string): boolean {\n try { lstatSync(path); return true } catch { return false }\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -214,4 +214,4 @@ npm run typecheck
|
|
|
214
214
|
npm run eval:contract
|
|
215
215
|
```
|
|
216
216
|
|
|
217
|
-
29 个确定性场景覆盖三条主链:setup/PATH/DWS
|
|
217
|
+
29 个确定性场景覆盖三条主链:setup/PATH/DWS/多客户端发现与错误提示、基于 `npx skills` 的 Skill-first 安装/水合,以及 Prepared Run 的 Session、Wait、幂等、目标与回执。
|
package/docs/INSTALLATION.md
CHANGED
|
@@ -73,7 +73,15 @@ dws auth login
|
|
|
73
73
|
|
|
74
74
|
## Skill 安装策略
|
|
75
75
|
|
|
76
|
-
`dta skill install`
|
|
76
|
+
`dta` 不维护第二套 Skill 安装器。`dta skill install` 等价于把 npm 包内的 Skill 目录交给开放生态的 `npx skills add`:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npx --yes --registry=https://registry.npmjs.org skills@latest add \
|
|
80
|
+
<package>/skills/dingtalk-basic-behavior \
|
|
81
|
+
--global --yes --agent claude-code codex opencode
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
上游 `skills` CLI 负责 canonical copy、客户端链接、覆盖和卸载语义:
|
|
77
85
|
|
|
78
86
|
| 客户端 | 发现方式 | 路径 |
|
|
79
87
|
|---|---|---|
|
|
@@ -81,13 +89,16 @@ dws auth login
|
|
|
81
89
|
| Codex | shared Agent Skills | `~/.agents/skills/dingtalk-basic-behavior` |
|
|
82
90
|
| OpenCode | shared Agent Skills | `~/.agents/skills/dingtalk-basic-behavior` |
|
|
83
91
|
|
|
84
|
-
|
|
92
|
+
检查、重装当前 npm 包内版本和卸载:
|
|
85
93
|
|
|
86
94
|
```bash
|
|
87
95
|
dta skill status
|
|
88
96
|
dta skill upgrade
|
|
97
|
+
dta skill uninstall
|
|
89
98
|
```
|
|
90
99
|
|
|
100
|
+
`skill status` 只做只读发现检查;`install/upgrade/uninstall` 分别委托 `skills add/add/remove`。旧版 dta 写入的管理 marker 会在第一次 `skills add` 时被上游 canonical copy 替换,此后不再存在两套管理状态。
|
|
101
|
+
|
|
91
102
|
OpenCode 官方同时支持 `.opencode/skills`、`.claude/skills` 和 `.agents/skills`,所以不需要再复制第三份内容。
|
|
92
103
|
|
|
93
104
|
## 使用 npx skills
|
|
@@ -105,7 +116,7 @@ npx skills add ./skills/dingtalk-basic-behavior \
|
|
|
105
116
|
--global --yes --agent claude-code --agent codex --agent opencode
|
|
106
117
|
```
|
|
107
118
|
|
|
108
|
-
|
|
119
|
+
也可以完全绕过 `dta skill ...`,直接使用 `npx skills` 管理;两种入口最终调用的是同一个上游安装器。
|
|
109
120
|
|
|
110
121
|
## 初始化的三个层级
|
|
111
122
|
|
package/evals/evals.json
CHANGED
|
@@ -214,13 +214,13 @@
|
|
|
214
214
|
{
|
|
215
215
|
"id": 20,
|
|
216
216
|
"prompt": "在一个没有 Workspace 的空目录安装全局 Basic Behavior,重复安装,再制造一个同名陌生 Skill。",
|
|
217
|
-
"expected_output": "安装不依赖 init;canonical copy 可被 Codex 发现,Claude
|
|
217
|
+
"expected_output": "安装不依赖 init;dta 将本地 Skill source 委托给 npx skills;canonical copy 可被 Codex/OpenCode 发现,Claude 使用 symlink;重复安装由上游处理。",
|
|
218
218
|
"files": [],
|
|
219
219
|
"expectations": [
|
|
220
220
|
"空目录可直接安装 canonical Skill",
|
|
221
|
-
"
|
|
222
|
-
"Claude exposure
|
|
223
|
-
"
|
|
221
|
+
"重复安装由 skills CLI 执行并保持 current",
|
|
222
|
+
"Claude exposure 指向 canonical copy",
|
|
223
|
+
"安装结果不再包含 dta 自定义管理 marker"
|
|
224
224
|
]
|
|
225
225
|
},
|
|
226
226
|
{
|
|
@@ -259,14 +259,14 @@
|
|
|
259
259
|
},
|
|
260
260
|
{
|
|
261
261
|
"id": 24,
|
|
262
|
-
"prompt": "
|
|
263
|
-
"expected_output": "status
|
|
262
|
+
"prompt": "通过 dta 安装 Skill 后手工修改内容,再执行 upgrade 和 uninstall。",
|
|
263
|
+
"expected_output": "status 只读报告 skills-cli 管理状态;upgrade 通过 npx skills add 重装;uninstall 通过 npx skills remove 清理所有目标客户端。",
|
|
264
264
|
"files": [],
|
|
265
265
|
"expectations": [
|
|
266
|
-
"
|
|
267
|
-
"upgrade
|
|
268
|
-
"uninstall
|
|
269
|
-
"
|
|
266
|
+
"status 明确报告 manager=skills-cli",
|
|
267
|
+
"upgrade 委托 skills add 并采用上游覆盖语义",
|
|
268
|
+
"uninstall 委托 skills remove",
|
|
269
|
+
"升级后版本 current,卸载后 canonical 与 exposure 消失"
|
|
270
270
|
]
|
|
271
271
|
},
|
|
272
272
|
{
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
readdirSync, cpSync, existsSync, lstatSync, readlinkSync,
|
|
7
7
|
} from 'node:fs'
|
|
8
8
|
import { tmpdir } from 'node:os'
|
|
9
|
-
import { join, dirname } from 'node:path'
|
|
9
|
+
import { join, dirname, resolve } from 'node:path'
|
|
10
10
|
import { fileURLToPath } from 'node:url'
|
|
11
11
|
import { spawnSync } from 'node:child_process'
|
|
12
12
|
import { init } from '../dist/src/init.js'
|
|
@@ -748,8 +748,7 @@ function evalSessionSkillBinding() {
|
|
|
748
748
|
function evalGlobalSkillInstall() {
|
|
749
749
|
const home = mkdtempSync(join(tmpdir(), 'dta-skill-home-'))
|
|
750
750
|
const cwd = mkdtempSync(join(tmpdir(), 'dta-skill-cwd-'))
|
|
751
|
-
|
|
752
|
-
WORKSPACES.push(home, cwd, foreignHome)
|
|
751
|
+
WORKSPACES.push(home, cwd)
|
|
753
752
|
const env = { ...process.env, HOME: home }
|
|
754
753
|
const first = spawnSync(process.execPath, [CLI, 'skill', 'install', '--json'], {
|
|
755
754
|
cwd, env, encoding: 'utf8',
|
|
@@ -761,29 +760,23 @@ function evalGlobalSkillInstall() {
|
|
|
761
760
|
const canonical = join(home, '.agents', 'skills', 'dingtalk-basic-behavior')
|
|
762
761
|
const claude = join(home, '.claude', 'skills', 'dingtalk-basic-behavior')
|
|
763
762
|
|
|
764
|
-
const
|
|
765
|
-
mkdirSync(foreign, { recursive: true })
|
|
766
|
-
writeFileSync(join(foreign, 'SKILL.md'), '---\nname: dingtalk-basic-behavior\ndescription: foreign\n---\n')
|
|
767
|
-
const conflict = spawnSync(process.execPath, [CLI, 'skill', 'install'], {
|
|
768
|
-
cwd, env: { ...process.env, HOME: foreignHome }, encoding: 'utf8',
|
|
769
|
-
})
|
|
763
|
+
const marker = join(canonical, '.dingtalk-agent-install.json')
|
|
770
764
|
return {
|
|
771
765
|
output: {
|
|
772
766
|
firstStatus: first.status, secondStatus: second.status, status,
|
|
773
|
-
claudeTarget: readlinkSync(claude),
|
|
774
|
-
conflictError: conflict.stderr.trim(),
|
|
767
|
+
claudeTarget: readlinkSync(claude), markerExists: existsSync(marker),
|
|
775
768
|
},
|
|
776
769
|
toolCalls: 3, steps: 6,
|
|
777
770
|
checks: [
|
|
778
771
|
check(first.status === 0 && existsSync(join(canonical, 'SKILL.md')),
|
|
779
772
|
`status=${first.status}; canonical=${canonical}`),
|
|
780
|
-
check(second.status === 0 && status.
|
|
781
|
-
status.canonical.
|
|
782
|
-
`status=${second.status};
|
|
773
|
+
check(second.status === 0 && status.manager === 'skills-cli' &&
|
|
774
|
+
status.canonical.current === true && status.operation?.command.includes('skills@latest add'),
|
|
775
|
+
`status=${second.status}; manager=${status.manager}; current=${status.canonical.current}`),
|
|
783
776
|
check(lstatSync(claude).isSymbolicLink() &&
|
|
784
|
-
readlinkSync(claude) ===
|
|
777
|
+
resolve(dirname(claude), readlinkSync(claude)) === resolve(canonical),
|
|
785
778
|
`target=${readlinkSync(claude)}`),
|
|
786
|
-
check(
|
|
779
|
+
check(!existsSync(marker), '上游 skills CLI 接管后不存在 dta 自定义 marker'),
|
|
787
780
|
],
|
|
788
781
|
}
|
|
789
782
|
}
|
|
@@ -879,33 +872,29 @@ function evalManagedSkillLifecycle() {
|
|
|
879
872
|
cwd, env, encoding: 'utf8',
|
|
880
873
|
})
|
|
881
874
|
const modified = JSON.parse(statusRun.stdout)
|
|
882
|
-
const
|
|
883
|
-
cwd, env, encoding: 'utf8',
|
|
884
|
-
})
|
|
885
|
-
const guardedUninstall = spawnSync(process.execPath, [CLI, 'skill', 'uninstall'], {
|
|
875
|
+
const repaired = spawnSync(process.execPath, [CLI, 'skill', 'upgrade', '--json'], {
|
|
886
876
|
cwd, env, encoding: 'utf8',
|
|
887
877
|
})
|
|
888
|
-
const repaired = spawnSync(process.execPath, [
|
|
889
|
-
CLI, 'skill', 'upgrade', '--discard-local-changes', '--json',
|
|
890
|
-
], { cwd, env, encoding: 'utf8' })
|
|
891
878
|
const repairedStatus = JSON.parse(repaired.stdout)
|
|
879
|
+
const repairedBody = readFileSync(file, 'utf8')
|
|
892
880
|
const removed = spawnSync(process.execPath, [CLI, 'skill', 'uninstall', '--json'], {
|
|
893
881
|
cwd, env, encoding: 'utf8',
|
|
894
882
|
})
|
|
895
883
|
const removedStatus = JSON.parse(removed.stdout)
|
|
896
884
|
return {
|
|
897
885
|
output: {
|
|
898
|
-
modified,
|
|
899
|
-
guardedUninstall: guardedUninstall.stderr.trim(), repairedStatus, removedStatus,
|
|
886
|
+
modified, repairedStatus, removedStatus,
|
|
900
887
|
},
|
|
901
|
-
toolCalls:
|
|
888
|
+
toolCalls: 4, steps: 6,
|
|
902
889
|
checks: [
|
|
903
|
-
check(modified.
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
check(
|
|
890
|
+
check(modified.manager === 'skills-cli' && modified.canonical.exists === true,
|
|
891
|
+
JSON.stringify(modified.canonical)),
|
|
892
|
+
check(repaired.status === 0 && !repairedBody.includes('local edit') &&
|
|
893
|
+
repairedStatus.operation?.command.includes('skills@latest add'),
|
|
894
|
+
`status=${repaired.status}; command=${repairedStatus.operation?.command}`),
|
|
895
|
+
check(removed.status === 0 && removedStatus.operation?.command.includes('skills@latest remove'),
|
|
896
|
+
`status=${removed.status}; command=${removedStatus.operation?.command}`),
|
|
897
|
+
check(repairedStatus.canonical.current === true &&
|
|
909
898
|
removed.status === 0 && removedStatus.canonical.exists === false &&
|
|
910
899
|
removedStatus.claude.state === 'missing',
|
|
911
900
|
`repaired=${repairedStatus.canonical.current}; removed=${removedStatus.canonical.exists}; ` +
|