@xdxer/dingtalk-agent 0.1.4-beta.16 → 0.1.4-beta.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.en.md +1 -0
  3. package/README.md +1 -0
  4. package/dist/bin/dingtalk-agent.js +15 -8
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/agent-audit.js +12 -5
  7. package/dist/src/agent-audit.js.map +1 -1
  8. package/dist/src/development-workspace.js +17 -3
  9. package/dist/src/development-workspace.js.map +1 -1
  10. package/dist/src/doctor.js +41 -6
  11. package/dist/src/doctor.js.map +1 -1
  12. package/dist/src/map.js +157 -0
  13. package/dist/src/map.js.map +1 -0
  14. package/dist/src/multica-deploy.js +76 -19
  15. package/dist/src/multica-deploy.js.map +1 -1
  16. package/dist/src/multica-provider.js +1 -1
  17. package/dist/src/multica-provider.js.map +1 -1
  18. package/dist/src/skill-manager.js +98 -10
  19. package/dist/src/skill-manager.js.map +1 -1
  20. package/dist/src/upgrade.js +23 -27
  21. package/dist/src/upgrade.js.map +1 -1
  22. package/dist/src/version.js +73 -0
  23. package/dist/src/version.js.map +1 -0
  24. package/docs/schemas/project.schema.json +1 -0
  25. package/lab/agent-eval/catalog.json +5 -5
  26. package/lab/agent-eval/classic-failures.json +2 -2
  27. package/lab/project-workspace/fake-multica-provider.mjs +17 -6
  28. package/lab/project-workspace/opencode-provider-suite.json +1 -1
  29. package/lab/schemas/agent-eval-catalog.schema.json +1 -1
  30. package/package.json +3 -2
  31. package/skills/core/dingtalk-agent-compose/SKILL.md +6 -3
  32. package/skills/core/dingtalk-agent-compose/evals/evals.json +11 -0
  33. package/skills/core/dingtalk-agent-eval/SKILL.md +30 -6
  34. package/skills/core/dingtalk-agent-eval/assets/eval-catalog.template.json +1 -1
  35. package/skills/core/dingtalk-agent-eval/evals/evals.json +22 -0
  36. package/skills/core/dingtalk-agent-eval/references/eval-topology.md +14 -0
  37. package/skills/core/dingtalk-agent-eval/references/evidence-contract.md +21 -0
  38. package/skills/core/dingtalk-agent-eval/references/failure-to-case.md +35 -0
  39. package/skills/core/dingtalk-agent-eval/references/interactive-debug-channels.md +93 -0
  40. package/skills/core/dingtalk-agent-eval/references/local-connector-smoke.md +75 -0
  41. package/skills/platforms/multica-dingtalk/PLATFORM.md +4 -2
  42. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +4 -4
  43. package/skills/platforms/multica-dingtalk/multica-external/SKILL.md +2 -0
@@ -420,7 +420,7 @@ function resolveMulticaTarget(start, name, env, cliVersion, agentIdOverride = ''
420
420
  }
421
421
  return {
422
422
  root: info.root,
423
- projectName: info.project.name,
423
+ projectName: info.project.displayName,
424
424
  skills: [...new Set([...info.project.skills, MULTICA_BOOT_SKILL])].sort(),
425
425
  workspace,
426
426
  profile: provider.profile,
@@ -1 +1 @@
1
- {"version":3,"file":"multica-provider.js","sourceRoot":"","sources":["../../src/multica-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport { spawnSync } from 'node:child_process'\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport {\n WORKSPACE_STATE_ROOT, inspectAgentProject, showDevelopmentWorkspace,\n type DevelopmentWorkspaceState, type DevelopmentWorkspaceView,\n} from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\n\nexport const MULTICA_EVIDENCE_ROOT = '.dingtalk-agent/development-workspace-evidence'\nexport const MULTICA_BOOT_SKILL = 'dingtalk-agent-boot-multica'\n\nexport interface MulticaWorkspacePlan {\n $schema: 'dingtalk-agent/multica-workspace-plan@1'\n planId: string\n workspace: string\n provider: 'multica'\n profile: string\n desiredHash: string\n currentState: string\n expected: {\n workspaceId: string\n runtimeId: string\n agentId: string\n skills: string[]\n }\n observed: {\n workspaceId: string\n runtimeId: string\n agentId: string\n skillSetHash: string\n }\n diff: string[]\n blocking: string[]\n operations: Array<{ id: string; argv: string[] }>\n writes: []\n remoteRead: false\n remoteWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface MulticaReadCall {\n id: string\n argv: string[]\n exitCode: number\n stdoutHash: string\n stderrHash: string\n passed: boolean\n}\n\nexport interface MulticaResourceSummary {\n workspace: { id: string; name: string; slug: string } | null\n runtime: {\n id: string; workspaceId: string; name: string; provider: string; status: string\n } | null\n agent: {\n id: string; workspaceId: string; runtimeId: string; name: string; status: string; archived: boolean\n } | null\n agentCandidates: Array<{ id: string; name: string; archived: boolean }>\n catalogSkills: Array<{ id: string; workspaceId: string; name: string }>\n assignedSkills: Array<{ id: string; name: string; enabled: boolean }>\n}\n\nexport interface MulticaWorkspaceInspection {\n $schema: 'dingtalk-agent/multica-workspace-inspection@1'\n passed: boolean\n readyForApply: boolean\n providerReady: false\n inspectionId: string\n workspace: string\n provider: 'multica'\n profile: string\n cliVersion: string\n desiredHash: string\n observedHash: string\n expected: MulticaWorkspacePlan['expected']\n auth: { authenticated: boolean; principalHash: string; serverHash: string }\n resources: MulticaResourceSummary\n diff: string[]\n failures: string[]\n calls: MulticaReadCall[]\n evidencePath: string\n remoteRead: true\n remoteWrite: false\n sideEffect: 'remote-read'\n dingtalkSideEffect: false\n}\n\nexport interface MulticaWorkspaceStatus {\n $schema: 'dingtalk-agent/multica-workspace-status@1'\n workspace: string\n provider: 'multica'\n available: boolean\n inspectionId: string\n passed: boolean\n readyForApply: boolean\n providerReady: false\n evidencePath: string\n evidenceIntegrity: boolean\n stateMatched: boolean\n desiredHash: string\n observedHash: string\n diff: string[]\n failures: string[]\n remoteRead: false\n remoteWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface MulticaResourceList {\n $schema: 'dingtalk-agent/multica-workspace-resource-list@1'\n passed: boolean\n workspace: string\n provider: 'multica'\n profile: string\n inspectionId: string\n resources: MulticaResourceSummary\n failures: string[]\n calls: MulticaReadCall[]\n remoteRead: true\n remoteWrite: false\n sideEffect: 'remote-read'\n dingtalkSideEffect: false\n}\n\nexport interface MulticaReadOptions {\n execute?: boolean\n yes?: boolean\n command?: string\n env?: NodeJS.ProcessEnv\n timeoutMs?: number\n out?: string\n cliVersion?: string\n /** Internal composition hook: W4 reuses W3 readback without clobbering ready state. */\n persist?: boolean\n /** Internal composition hook for the first readback after an Agent create. */\n agentIdOverride?: string\n}\n\ninterface ResolvedMulticaTarget {\n root: string\n projectName: string\n skills: string[]\n workspace: DevelopmentWorkspaceView\n profile: string\n workspaceId: string\n runtimeId: string\n agentId: string\n blocking: string[]\n}\n\ninterface ReadResult {\n stdout: string\n stderr: string\n}\n\nclass MulticaReadFailure extends Error {\n constructor(readonly category: string) {\n super(category)\n }\n}\n\nexport function planMulticaWorkspace(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan {\n const target = resolveMulticaTarget(\n start, name, options.env || process.env, options.cliVersion || '', options.agentIdOverride,\n )\n const state = target.workspace.state\n const expected = {\n workspaceId: target.workspaceId,\n runtimeId: target.runtimeId,\n agentId: target.agentId,\n skills: [...target.skills].sort(),\n }\n const observed = {\n workspaceId: state?.binding.remoteWorkspaceId || '',\n runtimeId: state?.binding.runtimeId || '',\n agentId: state?.binding.agentId || '',\n skillSetHash: state?.binding.observedSkillSetHash || '',\n }\n const expectedSkillSetHash = digest(stableStringify(expected.skills))\n const diff: string[] = []\n if (observed.workspaceId !== expected.workspaceId) diff.push('workspace.scope')\n if (observed.runtimeId !== expected.runtimeId) diff.push('runtime.binding')\n if (expected.agentId) {\n if (observed.agentId !== expected.agentId) diff.push('agent.binding')\n } else if (!observed.agentId) diff.push('agent.create')\n if (observed.skillSetHash !== expectedSkillSetHash) diff.push('skills.assignments')\n const operations = readOperations(target)\n const planId = `multica_plan_${digest(stableStringify({\n workspace: name,\n desiredHash: target.workspace.desiredHash,\n expected,\n observed,\n diff: [...diff].sort(),\n blocking: [...target.blocking].sort(),\n operations,\n })).slice(0, 24)}`\n return {\n $schema: 'dingtalk-agent/multica-workspace-plan@1',\n planId,\n workspace: name,\n provider: 'multica',\n profile: target.profile,\n desiredHash: target.workspace.desiredHash,\n currentState: target.workspace.status,\n expected,\n observed,\n diff: [...diff].sort(),\n blocking: [...target.blocking].sort(),\n operations,\n writes: [],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function inspectMulticaWorkspace(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan | MulticaWorkspaceInspection {\n const plan = planMulticaWorkspace(start, name, options)\n if (!options.execute) return plan\n requireReadConfirmation(options, 'workspace inspect')\n if (plan.blocking.length) {\n throw new Error(`Multica inspect 前置条件不完整: ${plan.blocking.join(', ')}`)\n }\n return executeInspection(start, name, plan, options, options.persist !== false)\n}\n\nexport function listMulticaWorkspaceResources(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan | MulticaResourceList {\n const plan = planMulticaWorkspace(start, name, options)\n if (!options.execute) return plan\n requireReadConfirmation(options, 'workspace remote-list')\n if (plan.blocking.length) {\n throw new Error(`Multica remote-list 前置条件不完整: ${plan.blocking.join(', ')}`)\n }\n const inspection = executeInspection(start, name, plan, options, false)\n return {\n $schema: 'dingtalk-agent/multica-workspace-resource-list@1',\n passed: inspection.passed,\n workspace: inspection.workspace,\n provider: 'multica',\n profile: inspection.profile,\n inspectionId: inspection.inspectionId,\n resources: inspection.resources,\n failures: inspection.failures,\n calls: inspection.calls,\n remoteRead: true,\n remoteWrite: false,\n sideEffect: 'remote-read',\n dingtalkSideEffect: false,\n }\n}\n\nexport function statusMulticaWorkspace(\n start: string, name: string, cliVersion = '',\n): MulticaWorkspaceStatus {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireMulticaWorkspace(info.root, name, cliVersion)\n const latestPath = latestPointerPath(info.root, name)\n if (!existsSync(latestPath)) return emptyStatus(workspace)\n const pointer = readJsonObject(latestPath, 'Multica inspection latest pointer')\n if (pointer.$schema !== 'dingtalk-agent/multica-inspection-pointer@1') {\n throw new Error('Multica inspection latest pointer schema 非法')\n }\n const evidencePath = stringField(pointer.evidencePath, 'pointer.evidencePath')\n const reportPath = safeProjectPath(info.root, evidencePath, true)\n const reportSource = readFileSync(reportPath, 'utf8')\n const evidenceIntegrity = sha256(reportSource) === stringField(pointer.reportHash, 'pointer.reportHash')\n const report = JSON.parse(reportSource) as MulticaWorkspaceInspection\n if (report.$schema !== 'dingtalk-agent/multica-workspace-inspection@1' || report.workspace !== name) {\n throw new Error('Multica inspection report 与 Workspace 不匹配')\n }\n assertRedacted(report)\n const state = workspace.state\n const stateMatched = Boolean(evidenceIntegrity && report.passed && state &&\n state.provider === 'multica' && ['verifying', 'ready'].includes(state.status) &&\n state.desiredHash === workspace.desiredHash && state.observedHash === report.observedHash &&\n state.binding.inspectionId === report.inspectionId &&\n state.binding.evidencePath === evidencePath)\n return {\n $schema: 'dingtalk-agent/multica-workspace-status@1',\n workspace: name,\n provider: 'multica',\n available: true,\n inspectionId: report.inspectionId,\n passed: report.passed,\n readyForApply: report.readyForApply && stateMatched,\n providerReady: false,\n evidencePath,\n evidenceIntegrity,\n stateMatched,\n desiredHash: workspace.desiredHash,\n observedHash: report.observedHash,\n diff: [...report.diff],\n failures: [...report.failures],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction executeInspection(\n start: string,\n name: string,\n plan: MulticaWorkspacePlan,\n options: MulticaReadOptions,\n persist: boolean,\n): MulticaWorkspaceInspection {\n const env = options.env || process.env\n const target = resolveMulticaTarget(\n start, name, env, options.cliVersion || '', options.agentIdOverride,\n )\n const command = options.command || env.DTA_MULTICA_BIN || 'multica'\n const timeoutMs = positiveTimeout(options.timeoutMs)\n if (persist) {\n const plannedEvidence = options.out || join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', 'planned.json',\n )\n safeProjectPath(target.root, plannedEvidence, false)\n latestPointerPath(target.root, name)\n safeProjectPath(target.root, join(WORKSPACE_STATE_ROOT, `${name}.json`), false)\n }\n const calls: MulticaReadCall[] = []\n const failures: string[] = []\n const diff: string[] = []\n let cliVersion = ''\n let principalHash = ''\n let serverHash = ''\n let resources = emptyResources()\n\n try {\n const version = runRead(command, ['--version'], 'cli.version', target.root, env, timeoutMs, calls)\n cliVersion = parseMulticaVersion(version.stdout || version.stderr)\n\n const config = runRead(command, profileArgs(target, ['config', 'show']),\n 'profile.config', target.root, env, timeoutMs, calls)\n const parsedConfig = parseConfig(config.stdout, target.profile)\n serverHash = parsedConfig.server ? digest(parsedConfig.server) : ''\n if (parsedConfig.workspaceId && parsedConfig.workspaceId !== target.workspaceId) {\n throw new MulticaReadFailure('scope.profile-workspace-mismatch')\n }\n\n const auth = runRead(command, profileArgs(target, ['auth', 'status']),\n 'auth.status', target.root, env, timeoutMs, calls)\n const principal = parseAuth(auth.stdout + '\\n' + auth.stderr)\n if (!principal) throw new MulticaReadFailure('auth.not-authenticated')\n principalHash = digest(principal)\n\n const workspaceList = jsonArray(runRead(command,\n profileArgs(target, ['workspace', 'list', '--output', 'json']),\n 'workspace.list', target.root, env, timeoutMs, calls).stdout, 'workspace list')\n const workspaceMatches = workspaceList.filter((item) => idOf(item) === target.workspaceId)\n if (workspaceMatches.length !== 1) throw new MulticaReadFailure('scope.workspace-list-mismatch')\n\n const workspaceGet = jsonObject(runRead(command,\n profileArgs(target, ['workspace', 'get', target.workspaceId, '--output', 'json']),\n 'workspace.get', target.root, env, timeoutMs, calls).stdout, 'workspace get')\n if (idOf(workspaceGet) !== target.workspaceId) {\n throw new MulticaReadFailure('scope.workspace-get-mismatch')\n }\n resources.workspace = {\n id: resourceId(idOf(workspaceGet), 'workspace.id'),\n name: safeDisplay(workspaceGet.name),\n slug: safeDisplay(workspaceGet.slug),\n }\n\n const runtimes = jsonArray(runRead(command,\n scopedArgs(target, ['runtime', 'list', '--output', 'json']),\n 'runtime.list', target.root, env, timeoutMs, calls).stdout, 'runtime list')\n const runtimeMatches = runtimes.filter((item) => idOf(item) === target.runtimeId)\n if (runtimeMatches.length !== 1) throw new MulticaReadFailure('scope.runtime-mismatch')\n const runtime = runtimeMatches[0]\n const runtimeWorkspace = optionalField(runtime.workspace_id)\n if (runtimeWorkspace && runtimeWorkspace !== target.workspaceId) {\n throw new MulticaReadFailure('scope.runtime-workspace-mismatch')\n }\n resources.runtime = {\n id: resourceId(idOf(runtime), 'runtime.id'),\n workspaceId: runtimeWorkspace || target.workspaceId,\n name: safeDisplay(runtime.name),\n provider: safeDisplay(runtime.provider),\n status: safeDisplay(runtime.status),\n }\n\n const agents = jsonArray(runRead(command,\n scopedArgs(target, ['agent', 'list', '--include-archived', '--output', 'json']),\n 'agent.list', target.root, env, timeoutMs, calls).stdout, 'agent list')\n resources.agentCandidates = agents\n .filter((item) => optionalField(item.name) === target.projectName)\n .map((item) => ({\n id: resourceId(idOf(item), 'agent candidate.id'),\n name: safeDisplay(item.name),\n archived: Boolean(optionalField(item.archived_at)),\n }))\n .sort((a, b) => a.id.localeCompare(b.id))\n\n const catalog = jsonArray(runRead(command,\n scopedArgs(target, ['skill', 'list', '--output', 'json']),\n 'skill.list', target.root, env, timeoutMs, calls).stdout, 'skill list')\n resources.catalogSkills = catalog.map((item) => ({\n id: resourceId(idOf(item), 'skill.id'),\n workspaceId: optionalField(item.workspace_id) || target.workspaceId,\n name: safeDisplay(item.name),\n })).sort(compareNamedResource)\n if (resources.catalogSkills.some((item) => item.workspaceId !== target.workspaceId)) {\n throw new MulticaReadFailure('scope.skill-workspace-mismatch')\n }\n\n if (target.agentId) {\n const agentMatches = agents.filter((item) => idOf(item) === target.agentId)\n if (agentMatches.length !== 1) throw new MulticaReadFailure('scope.agent-list-mismatch')\n const agent = jsonObject(runRead(command,\n scopedArgs(target, ['agent', 'get', target.agentId, '--output', 'json']),\n 'agent.get', target.root, env, timeoutMs, calls).stdout, 'agent get')\n const agentWorkspace = optionalField(agent.workspace_id)\n const agentRuntime = optionalField(agent.runtime_id)\n if (idOf(agent) !== target.agentId || agentWorkspace !== target.workspaceId ||\n agentRuntime !== target.runtimeId) {\n throw new MulticaReadFailure('scope.agent-binding-mismatch')\n }\n resources.agent = {\n id: target.agentId,\n workspaceId: agentWorkspace,\n runtimeId: agentRuntime,\n name: safeDisplay(agent.name),\n status: safeDisplay(agent.status),\n archived: Boolean(optionalField(agent.archived_at)),\n }\n const assigned = jsonArray(runRead(command,\n scopedArgs(target, ['agent', 'skills', 'list', target.agentId, '--output', 'json']),\n 'agent.skills', target.root, env, timeoutMs, calls).stdout, 'agent skills list')\n resources.assignedSkills = assigned.map((item) => ({\n id: resourceId(idOf(item), 'assigned skill.id'),\n name: safeDisplay(item.name),\n enabled: item.enabled === undefined ? true : Boolean(item.enabled),\n })).sort(compareNamedResource)\n } else if (resources.agentCandidates.length > 0) {\n throw new MulticaReadFailure('agent.unbound-name-candidates')\n } else {\n diff.push('agent.create')\n }\n\n for (const name of target.skills) {\n const candidates = resources.catalogSkills.filter((item) => item.name === name)\n if (candidates.length > 1) throw new MulticaReadFailure(`skills.duplicate:${name}`)\n if (candidates.length === 0) {\n diff.push(`skill.create:${name}`)\n continue\n }\n if (target.agentId && !resources.assignedSkills.some((item) =>\n item.id === candidates[0].id && item.enabled)) {\n diff.push(`skill.assign:${name}`)\n }\n }\n } catch (error) {\n failures.push(error instanceof MulticaReadFailure ? error.category : 'provider.read-failed')\n }\n\n const canonical = {\n cliVersion,\n profile: target.profile,\n principalHash,\n serverHash,\n expected: plan.expected,\n resources,\n }\n const observedHash = digest(stableStringify(canonical))\n const passed = failures.length === 0\n const inspectionId = `multica_inspect_${digest(stableStringify({\n desiredHash: target.workspace.desiredHash,\n observedHash,\n passed,\n diff: [...diff].sort(),\n failures,\n })).slice(0, 24)}`\n const defaultEvidencePath = join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', `${inspectionId}.json`,\n )\n const evidencePath = options.out\n ? relative(target.root, safeProjectPath(target.root, options.out, false))\n : defaultEvidencePath\n const report: MulticaWorkspaceInspection = {\n $schema: 'dingtalk-agent/multica-workspace-inspection@1',\n passed,\n readyForApply: passed,\n providerReady: false,\n inspectionId,\n workspace: name,\n provider: 'multica',\n profile: target.profile,\n cliVersion,\n desiredHash: target.workspace.desiredHash,\n observedHash,\n expected: plan.expected,\n auth: { authenticated: Boolean(principalHash), principalHash, serverHash },\n resources,\n diff: [...diff].sort(),\n failures: [...failures].sort(),\n calls,\n evidencePath,\n remoteRead: true,\n remoteWrite: false,\n sideEffect: 'remote-read',\n dingtalkSideEffect: false,\n }\n assertRedacted(report)\n if (persist) persistInspection(target, plan, report)\n return report\n}\n\nfunction persistInspection(\n target: ResolvedMulticaTarget,\n plan: MulticaWorkspacePlan,\n report: MulticaWorkspaceInspection,\n): void {\n const reportPath = safeProjectPath(target.root, report.evidencePath, false)\n atomicJson(reportPath, report)\n const reportSource = readFileSync(reportPath, 'utf8')\n const pointer = {\n $schema: 'dingtalk-agent/multica-inspection-pointer@1',\n inspectionId: report.inspectionId,\n evidencePath: report.evidencePath,\n reportHash: sha256(reportSource),\n }\n atomicJson(latestPointerPath(target.root, target.workspace.name), pointer)\n if (!report.passed) return\n const expectedSkillSetHash = digest(stableStringify([...target.skills].sort()))\n const observedSkillSetHash = digest(stableStringify(report.resources.assignedSkills\n .filter((item) => item.enabled).map((item) => item.name).sort()))\n const state: DevelopmentWorkspaceState = {\n $schema: 'dingtalk-agent/workspace-state@1',\n workspace: target.workspace.name,\n provider: 'multica',\n status: 'verifying',\n binding: {\n profile: target.profile,\n remoteWorkspaceId: target.workspaceId,\n runtimeId: target.runtimeId,\n agentId: target.agentId,\n cliVersion: report.cliVersion,\n principalHash: report.auth.principalHash,\n serverHash: report.auth.serverHash,\n inspectionId: report.inspectionId,\n evidencePath: report.evidencePath,\n sourceHash: target.workspace.sourceHash,\n expectedSkillSetHash,\n observedSkillSetHash,\n },\n desiredHash: target.workspace.desiredHash,\n observedHash: report.observedHash,\n lastPlanId: plan.planId,\n lastReceiptId: '',\n lastEvalId: '',\n }\n atomicJson(safeProjectPath(\n target.root, join(WORKSPACE_STATE_ROOT, `${target.workspace.name}.json`), false,\n ), state)\n}\n\nfunction resolveMulticaTarget(\n start: string, name: string, env: NodeJS.ProcessEnv, cliVersion: string,\n agentIdOverride = '',\n): ResolvedMulticaTarget {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireMulticaWorkspace(info.root, name, cliVersion)\n const provider = workspace.provider\n const blocking: string[] = []\n const resolveRef = (ref: string, label: string, optional = false): string => {\n if (!ref) return ''\n const variable = ref.startsWith('env:') ? ref.slice(4) : ''\n const value = variable ? String(env[variable] || '').trim() : ''\n if (!value) {\n if (!optional) blocking.push(label)\n return ''\n }\n try { return resourceId(value, label) } catch { blocking.push(`${label}.invalid`); return '' }\n }\n const workspaceId = resolveRef(provider.workspaceIdFrom, 'workspace-id')\n const runtimeId = resolveRef(provider.runtimeIdFrom, 'runtime-id')\n let agentId = ''\n if (agentIdOverride) {\n try { agentId = resourceId(agentIdOverride, 'agent-id-override') }\n catch { blocking.push('agent-id-override.invalid') }\n } else if (provider.agentIdFrom) agentId = resolveRef(provider.agentIdFrom, 'agent-id')\n else if (workspace.state?.binding.agentId) {\n try { agentId = resourceId(workspace.state.binding.agentId, 'state.agent-id') }\n catch { blocking.push('state.agent-id.invalid') }\n }\n return {\n root: info.root,\n projectName: info.project.name,\n skills: [...new Set([...info.project.skills, MULTICA_BOOT_SKILL])].sort(),\n workspace,\n profile: provider.profile,\n workspaceId,\n runtimeId,\n agentId,\n blocking,\n }\n}\n\nfunction requireMulticaWorkspace(start: string, name: string, cliVersion: string): DevelopmentWorkspaceView {\n const workspace = showDevelopmentWorkspace(start, name, cliVersion)\n if (workspace.provider.kind !== 'multica' || workspace.legacy) {\n throw new Error(`Workspace ${name} 不是 multica Provider;W3 不执行 ${workspace.provider.kind}`)\n }\n return workspace\n}\n\nfunction readOperations(target: ResolvedMulticaTarget): Array<{ id: string; argv: string[] }> {\n const operations = [\n { id: 'cli.version', argv: ['--version'] },\n { id: 'profile.config', argv: profileArgs(target, ['config', 'show']) },\n { id: 'auth.status', argv: profileArgs(target, ['auth', 'status']) },\n { id: 'workspace.list', argv: profileArgs(target, ['workspace', 'list', '--output', 'json']) },\n { id: 'workspace.get', argv: profileArgs(target,\n ['workspace', 'get', target.workspaceId || '<workspace-id>', '--output', 'json']) },\n { id: 'runtime.list', argv: scopedArgs(target, ['runtime', 'list', '--output', 'json']) },\n { id: 'agent.list', argv: scopedArgs(target,\n ['agent', 'list', '--include-archived', '--output', 'json']) },\n { id: 'skill.list', argv: scopedArgs(target, ['skill', 'list', '--output', 'json']) },\n ]\n if (target.agentId) operations.push(\n { id: 'agent.get', argv: scopedArgs(target,\n ['agent', 'get', target.agentId, '--output', 'json']) },\n { id: 'agent.skills', argv: scopedArgs(target,\n ['agent', 'skills', 'list', target.agentId, '--output', 'json']) },\n )\n return operations\n}\n\nfunction profileArgs(target: ResolvedMulticaTarget, args: string[]): string[] {\n return ['--profile', target.profile, ...args]\n}\n\nfunction scopedArgs(target: ResolvedMulticaTarget, args: string[]): string[] {\n return ['--profile', target.profile, '--workspace-id', target.workspaceId || '<workspace-id>', ...args]\n}\n\nfunction runRead(\n command: string,\n argv: string[],\n id: string,\n cwd: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n calls: MulticaReadCall[],\n): ReadResult {\n const run = spawnSync(command, argv, {\n cwd,\n env,\n encoding: 'utf8',\n timeout: timeoutMs,\n maxBuffer: 16 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n const stdout = String(run.stdout || '')\n const stderr = String(run.stderr || '')\n const exitCode = typeof run.status === 'number' ? run.status : 1\n const passed = !run.error && exitCode === 0\n calls.push({\n id,\n argv: argv.map(safeArg),\n exitCode,\n stdoutHash: sha256(stdout),\n stderrHash: sha256(stderr),\n passed,\n })\n if (!passed) throw new MulticaReadFailure(`command.${id}`)\n return { stdout, stderr }\n}\n\nfunction parseMulticaVersion(value: string): string {\n const match = value.match(/\\bmultica\\s+([0-9]+\\.[0-9]+\\.[0-9]+(?:[-+][A-Za-z0-9.-]+)?)/i)\n if (!match) throw new MulticaReadFailure('cli.version-invalid')\n return match[1]\n}\n\nfunction parseConfig(value: string, profile: string): { server: string; workspaceId: string } {\n const fields = new Map<string, string>()\n for (const line of value.split(/\\r?\\n/)) {\n const match = line.match(/^([^:]+):\\s*(.*)$/)\n if (match) fields.set(match[1].trim().toLowerCase(), match[2].trim())\n }\n if ((fields.get('profile') || '') !== profile) throw new MulticaReadFailure('profile.mismatch')\n const normalize = (item: string | undefined): string => item && item !== '(not set)' ? item : ''\n return {\n server: normalize(fields.get('server_url')),\n workspaceId: normalize(fields.get('workspace_id')),\n }\n}\n\nfunction parseAuth(value: string): string {\n if (/not authenticated|invalid or expired/i.test(value)) return ''\n const user = value.split(/\\r?\\n/).find((line) => /^User:\\s+/i.test(line.trim())) || ''\n const server = value.split(/\\r?\\n/).find((line) => /^Server:\\s+/i.test(line.trim())) || ''\n const token = value.split(/\\r?\\n/).find((line) => /^Token:\\s+/i.test(line.trim())) || ''\n return user && server && token ? `${user.trim()}|${server.trim()}` : ''\n}\n\nfunction jsonArray(value: string, label: string): Record<string, unknown>[] {\n let parsed: unknown\n try { parsed = JSON.parse(value) } catch { throw new MulticaReadFailure(`json.${label}`) }\n if (!Array.isArray(parsed) || parsed.some((item) => !item || typeof item !== 'object' || Array.isArray(item))) {\n throw new MulticaReadFailure(`shape.${label}`)\n }\n return parsed as Record<string, unknown>[]\n}\n\nfunction jsonObject(value: string, label: string): Record<string, unknown> {\n let parsed: unknown\n try { parsed = JSON.parse(value) } catch { throw new MulticaReadFailure(`json.${label}`) }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new MulticaReadFailure(`shape.${label}`)\n }\n return parsed as Record<string, unknown>\n}\n\nfunction readJsonObject(path: string, label: string): Record<string, unknown> {\n if (lstatSync(path).isSymbolicLink()) throw new Error(`${label} 不能是符号链接`)\n return jsonObject(readFileSync(path, 'utf8'), label)\n}\n\nfunction idOf(value: Record<string, unknown>): string {\n return optionalField(value.id)\n}\n\nfunction stringField(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value) throw new Error(`${label} 必须是非空字符串`)\n return value\n}\n\nfunction optionalField(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction resourceId(value: string, label: string): string {\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$/.test(value) ||\n /^(?:mul_|mcn_|sk-|bearer)/i.test(value)) {\n throw new Error(`${label} 不是安全的稳定资源 ID`)\n }\n return value\n}\n\nfunction safeDisplay(value: unknown): string {\n const text = typeof value === 'string' ? value : ''\n if (!text) return ''\n if (/(?:mul_|mcn_|sk-[A-Za-z0-9]|bearer\\s|access[_-]?token|client[_-]?secret|password)/i.test(text)) {\n return `[redacted:${digest(text).slice(0, 12)}]`\n }\n return text.length > 160 ? `${text.slice(0, 157)}...` : text\n}\n\nfunction safeArg(value: string): string {\n return safeDisplay(value)\n}\n\nfunction compareNamedResource(\n a: { name: string; id: string }, b: { name: string; id: string },\n): number {\n return a.name.localeCompare(b.name) || a.id.localeCompare(b.id)\n}\n\nfunction emptyResources(): MulticaResourceSummary {\n return {\n workspace: null,\n runtime: null,\n agent: null,\n agentCandidates: [],\n catalogSkills: [],\n assignedSkills: [],\n }\n}\n\nfunction emptyStatus(workspace: DevelopmentWorkspaceView): MulticaWorkspaceStatus {\n return {\n $schema: 'dingtalk-agent/multica-workspace-status@1',\n workspace: workspace.name,\n provider: 'multica',\n available: false,\n inspectionId: '',\n passed: false,\n readyForApply: false,\n providerReady: false,\n evidencePath: '',\n evidenceIntegrity: false,\n stateMatched: false,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n diff: [],\n failures: ['inspection.missing'],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction latestPointerPath(root: string, name: string): string {\n return safeProjectPath(root, join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', 'latest.json',\n ), false)\n}\n\nfunction safeName(value: string): string {\n if (!/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/.test(value)) {\n throw new Error(`Workspace name 非法: ${value}`)\n }\n return value\n}\n\nfunction safeProjectPath(root: string, ref: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Multica Provider 路径必须位于 Project 内: ${ref}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Multica evidence 不存在: ${ref}`)\n if (existsSync(candidate)) {\n if (lstatSync(candidate).isSymbolicLink()) {\n throw new Error(`Multica Provider 路径不能是符号链接: ${ref}`)\n }\n if (!isInside(rootReal, realpathSync(candidate))) {\n throw new Error(`Multica Provider 真实路径越出 Project: ${ref}`)\n }\n }\n let ancestor = dirname(candidate)\n while (!existsSync(ancestor)) {\n const parent = dirname(ancestor)\n if (parent === ancestor) break\n ancestor = parent\n }\n if (!existsSync(ancestor) || !isInside(rootReal, realpathSync(ancestor))) {\n throw new Error(`Multica Provider 父目录真实路径越出 Project: ${ref}`)\n }\n return candidate\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate)\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n}\n\nfunction atomicJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.tmp-${process.pid}`\n const source = `${JSON.stringify(value, null, 2)}\\n`\n writeFileSync(temp, source, { mode: 0o600 })\n renameSync(temp, path)\n if (readFileSync(path, 'utf8') !== source) throw new Error(`原子写后回读不一致: ${path}`)\n}\n\nfunction assertRedacted(value: unknown): void {\n const source = JSON.stringify(value)\n if (/(?:mul_|mcn_|sk-[A-Za-z0-9]|bearer\\s|access[_-]?token|client[_-]?secret|password)/i.test(source)) {\n throw new Error('Multica inspection 脱敏失败:检测到疑似凭据')\n }\n}\n\nfunction positiveTimeout(value: number | undefined): number {\n if (value === undefined) return 30_000\n if (!Number.isFinite(value) || value < 100 || value > 300_000) {\n throw new Error('Multica read timeout 必须在 100..300000 ms')\n }\n return Math.floor(value)\n}\n\nfunction requireReadConfirmation(options: MulticaReadOptions, command: string): void {\n if (!options.execute || !options.yes) {\n throw new Error(`${command} 会读取当前 Multica 身份和远端 scope;必须同时传 --execute --yes`)\n }\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n"]}
1
+ {"version":3,"file":"multica-provider.js","sourceRoot":"","sources":["../../src/multica-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport { spawnSync } from 'node:child_process'\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport {\n WORKSPACE_STATE_ROOT, inspectAgentProject, showDevelopmentWorkspace,\n type DevelopmentWorkspaceState, type DevelopmentWorkspaceView,\n} from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\n\nexport const MULTICA_EVIDENCE_ROOT = '.dingtalk-agent/development-workspace-evidence'\nexport const MULTICA_BOOT_SKILL = 'dingtalk-agent-boot-multica'\n\nexport interface MulticaWorkspacePlan {\n $schema: 'dingtalk-agent/multica-workspace-plan@1'\n planId: string\n workspace: string\n provider: 'multica'\n profile: string\n desiredHash: string\n currentState: string\n expected: {\n workspaceId: string\n runtimeId: string\n agentId: string\n skills: string[]\n }\n observed: {\n workspaceId: string\n runtimeId: string\n agentId: string\n skillSetHash: string\n }\n diff: string[]\n blocking: string[]\n operations: Array<{ id: string; argv: string[] }>\n writes: []\n remoteRead: false\n remoteWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface MulticaReadCall {\n id: string\n argv: string[]\n exitCode: number\n stdoutHash: string\n stderrHash: string\n passed: boolean\n}\n\nexport interface MulticaResourceSummary {\n workspace: { id: string; name: string; slug: string } | null\n runtime: {\n id: string; workspaceId: string; name: string; provider: string; status: string\n } | null\n agent: {\n id: string; workspaceId: string; runtimeId: string; name: string; status: string; archived: boolean\n } | null\n agentCandidates: Array<{ id: string; name: string; archived: boolean }>\n catalogSkills: Array<{ id: string; workspaceId: string; name: string }>\n assignedSkills: Array<{ id: string; name: string; enabled: boolean }>\n}\n\nexport interface MulticaWorkspaceInspection {\n $schema: 'dingtalk-agent/multica-workspace-inspection@1'\n passed: boolean\n readyForApply: boolean\n providerReady: false\n inspectionId: string\n workspace: string\n provider: 'multica'\n profile: string\n cliVersion: string\n desiredHash: string\n observedHash: string\n expected: MulticaWorkspacePlan['expected']\n auth: { authenticated: boolean; principalHash: string; serverHash: string }\n resources: MulticaResourceSummary\n diff: string[]\n failures: string[]\n calls: MulticaReadCall[]\n evidencePath: string\n remoteRead: true\n remoteWrite: false\n sideEffect: 'remote-read'\n dingtalkSideEffect: false\n}\n\nexport interface MulticaWorkspaceStatus {\n $schema: 'dingtalk-agent/multica-workspace-status@1'\n workspace: string\n provider: 'multica'\n available: boolean\n inspectionId: string\n passed: boolean\n readyForApply: boolean\n providerReady: false\n evidencePath: string\n evidenceIntegrity: boolean\n stateMatched: boolean\n desiredHash: string\n observedHash: string\n diff: string[]\n failures: string[]\n remoteRead: false\n remoteWrite: false\n sideEffect: false\n dingtalkSideEffect: false\n}\n\nexport interface MulticaResourceList {\n $schema: 'dingtalk-agent/multica-workspace-resource-list@1'\n passed: boolean\n workspace: string\n provider: 'multica'\n profile: string\n inspectionId: string\n resources: MulticaResourceSummary\n failures: string[]\n calls: MulticaReadCall[]\n remoteRead: true\n remoteWrite: false\n sideEffect: 'remote-read'\n dingtalkSideEffect: false\n}\n\nexport interface MulticaReadOptions {\n execute?: boolean\n yes?: boolean\n command?: string\n env?: NodeJS.ProcessEnv\n timeoutMs?: number\n out?: string\n cliVersion?: string\n /** Internal composition hook: W4 reuses W3 readback without clobbering ready state. */\n persist?: boolean\n /** Internal composition hook for the first readback after an Agent create. */\n agentIdOverride?: string\n}\n\ninterface ResolvedMulticaTarget {\n root: string\n projectName: string\n skills: string[]\n workspace: DevelopmentWorkspaceView\n profile: string\n workspaceId: string\n runtimeId: string\n agentId: string\n blocking: string[]\n}\n\ninterface ReadResult {\n stdout: string\n stderr: string\n}\n\nclass MulticaReadFailure extends Error {\n constructor(readonly category: string) {\n super(category)\n }\n}\n\nexport function planMulticaWorkspace(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan {\n const target = resolveMulticaTarget(\n start, name, options.env || process.env, options.cliVersion || '', options.agentIdOverride,\n )\n const state = target.workspace.state\n const expected = {\n workspaceId: target.workspaceId,\n runtimeId: target.runtimeId,\n agentId: target.agentId,\n skills: [...target.skills].sort(),\n }\n const observed = {\n workspaceId: state?.binding.remoteWorkspaceId || '',\n runtimeId: state?.binding.runtimeId || '',\n agentId: state?.binding.agentId || '',\n skillSetHash: state?.binding.observedSkillSetHash || '',\n }\n const expectedSkillSetHash = digest(stableStringify(expected.skills))\n const diff: string[] = []\n if (observed.workspaceId !== expected.workspaceId) diff.push('workspace.scope')\n if (observed.runtimeId !== expected.runtimeId) diff.push('runtime.binding')\n if (expected.agentId) {\n if (observed.agentId !== expected.agentId) diff.push('agent.binding')\n } else if (!observed.agentId) diff.push('agent.create')\n if (observed.skillSetHash !== expectedSkillSetHash) diff.push('skills.assignments')\n const operations = readOperations(target)\n const planId = `multica_plan_${digest(stableStringify({\n workspace: name,\n desiredHash: target.workspace.desiredHash,\n expected,\n observed,\n diff: [...diff].sort(),\n blocking: [...target.blocking].sort(),\n operations,\n })).slice(0, 24)}`\n return {\n $schema: 'dingtalk-agent/multica-workspace-plan@1',\n planId,\n workspace: name,\n provider: 'multica',\n profile: target.profile,\n desiredHash: target.workspace.desiredHash,\n currentState: target.workspace.status,\n expected,\n observed,\n diff: [...diff].sort(),\n blocking: [...target.blocking].sort(),\n operations,\n writes: [],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nexport function inspectMulticaWorkspace(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan | MulticaWorkspaceInspection {\n const plan = planMulticaWorkspace(start, name, options)\n if (!options.execute) return plan\n requireReadConfirmation(options, 'workspace inspect')\n if (plan.blocking.length) {\n throw new Error(`Multica inspect 前置条件不完整: ${plan.blocking.join(', ')}`)\n }\n return executeInspection(start, name, plan, options, options.persist !== false)\n}\n\nexport function listMulticaWorkspaceResources(\n start: string, name: string, options: MulticaReadOptions = {},\n): MulticaWorkspacePlan | MulticaResourceList {\n const plan = planMulticaWorkspace(start, name, options)\n if (!options.execute) return plan\n requireReadConfirmation(options, 'workspace remote-list')\n if (plan.blocking.length) {\n throw new Error(`Multica remote-list 前置条件不完整: ${plan.blocking.join(', ')}`)\n }\n const inspection = executeInspection(start, name, plan, options, false)\n return {\n $schema: 'dingtalk-agent/multica-workspace-resource-list@1',\n passed: inspection.passed,\n workspace: inspection.workspace,\n provider: 'multica',\n profile: inspection.profile,\n inspectionId: inspection.inspectionId,\n resources: inspection.resources,\n failures: inspection.failures,\n calls: inspection.calls,\n remoteRead: true,\n remoteWrite: false,\n sideEffect: 'remote-read',\n dingtalkSideEffect: false,\n }\n}\n\nexport function statusMulticaWorkspace(\n start: string, name: string, cliVersion = '',\n): MulticaWorkspaceStatus {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireMulticaWorkspace(info.root, name, cliVersion)\n const latestPath = latestPointerPath(info.root, name)\n if (!existsSync(latestPath)) return emptyStatus(workspace)\n const pointer = readJsonObject(latestPath, 'Multica inspection latest pointer')\n if (pointer.$schema !== 'dingtalk-agent/multica-inspection-pointer@1') {\n throw new Error('Multica inspection latest pointer schema 非法')\n }\n const evidencePath = stringField(pointer.evidencePath, 'pointer.evidencePath')\n const reportPath = safeProjectPath(info.root, evidencePath, true)\n const reportSource = readFileSync(reportPath, 'utf8')\n const evidenceIntegrity = sha256(reportSource) === stringField(pointer.reportHash, 'pointer.reportHash')\n const report = JSON.parse(reportSource) as MulticaWorkspaceInspection\n if (report.$schema !== 'dingtalk-agent/multica-workspace-inspection@1' || report.workspace !== name) {\n throw new Error('Multica inspection report 与 Workspace 不匹配')\n }\n assertRedacted(report)\n const state = workspace.state\n const stateMatched = Boolean(evidenceIntegrity && report.passed && state &&\n state.provider === 'multica' && ['verifying', 'ready'].includes(state.status) &&\n state.desiredHash === workspace.desiredHash && state.observedHash === report.observedHash &&\n state.binding.inspectionId === report.inspectionId &&\n state.binding.evidencePath === evidencePath)\n return {\n $schema: 'dingtalk-agent/multica-workspace-status@1',\n workspace: name,\n provider: 'multica',\n available: true,\n inspectionId: report.inspectionId,\n passed: report.passed,\n readyForApply: report.readyForApply && stateMatched,\n providerReady: false,\n evidencePath,\n evidenceIntegrity,\n stateMatched,\n desiredHash: workspace.desiredHash,\n observedHash: report.observedHash,\n diff: [...report.diff],\n failures: [...report.failures],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction executeInspection(\n start: string,\n name: string,\n plan: MulticaWorkspacePlan,\n options: MulticaReadOptions,\n persist: boolean,\n): MulticaWorkspaceInspection {\n const env = options.env || process.env\n const target = resolveMulticaTarget(\n start, name, env, options.cliVersion || '', options.agentIdOverride,\n )\n const command = options.command || env.DTA_MULTICA_BIN || 'multica'\n const timeoutMs = positiveTimeout(options.timeoutMs)\n if (persist) {\n const plannedEvidence = options.out || join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', 'planned.json',\n )\n safeProjectPath(target.root, plannedEvidence, false)\n latestPointerPath(target.root, name)\n safeProjectPath(target.root, join(WORKSPACE_STATE_ROOT, `${name}.json`), false)\n }\n const calls: MulticaReadCall[] = []\n const failures: string[] = []\n const diff: string[] = []\n let cliVersion = ''\n let principalHash = ''\n let serverHash = ''\n let resources = emptyResources()\n\n try {\n const version = runRead(command, ['--version'], 'cli.version', target.root, env, timeoutMs, calls)\n cliVersion = parseMulticaVersion(version.stdout || version.stderr)\n\n const config = runRead(command, profileArgs(target, ['config', 'show']),\n 'profile.config', target.root, env, timeoutMs, calls)\n const parsedConfig = parseConfig(config.stdout, target.profile)\n serverHash = parsedConfig.server ? digest(parsedConfig.server) : ''\n if (parsedConfig.workspaceId && parsedConfig.workspaceId !== target.workspaceId) {\n throw new MulticaReadFailure('scope.profile-workspace-mismatch')\n }\n\n const auth = runRead(command, profileArgs(target, ['auth', 'status']),\n 'auth.status', target.root, env, timeoutMs, calls)\n const principal = parseAuth(auth.stdout + '\\n' + auth.stderr)\n if (!principal) throw new MulticaReadFailure('auth.not-authenticated')\n principalHash = digest(principal)\n\n const workspaceList = jsonArray(runRead(command,\n profileArgs(target, ['workspace', 'list', '--output', 'json']),\n 'workspace.list', target.root, env, timeoutMs, calls).stdout, 'workspace list')\n const workspaceMatches = workspaceList.filter((item) => idOf(item) === target.workspaceId)\n if (workspaceMatches.length !== 1) throw new MulticaReadFailure('scope.workspace-list-mismatch')\n\n const workspaceGet = jsonObject(runRead(command,\n profileArgs(target, ['workspace', 'get', target.workspaceId, '--output', 'json']),\n 'workspace.get', target.root, env, timeoutMs, calls).stdout, 'workspace get')\n if (idOf(workspaceGet) !== target.workspaceId) {\n throw new MulticaReadFailure('scope.workspace-get-mismatch')\n }\n resources.workspace = {\n id: resourceId(idOf(workspaceGet), 'workspace.id'),\n name: safeDisplay(workspaceGet.name),\n slug: safeDisplay(workspaceGet.slug),\n }\n\n const runtimes = jsonArray(runRead(command,\n scopedArgs(target, ['runtime', 'list', '--output', 'json']),\n 'runtime.list', target.root, env, timeoutMs, calls).stdout, 'runtime list')\n const runtimeMatches = runtimes.filter((item) => idOf(item) === target.runtimeId)\n if (runtimeMatches.length !== 1) throw new MulticaReadFailure('scope.runtime-mismatch')\n const runtime = runtimeMatches[0]\n const runtimeWorkspace = optionalField(runtime.workspace_id)\n if (runtimeWorkspace && runtimeWorkspace !== target.workspaceId) {\n throw new MulticaReadFailure('scope.runtime-workspace-mismatch')\n }\n resources.runtime = {\n id: resourceId(idOf(runtime), 'runtime.id'),\n workspaceId: runtimeWorkspace || target.workspaceId,\n name: safeDisplay(runtime.name),\n provider: safeDisplay(runtime.provider),\n status: safeDisplay(runtime.status),\n }\n\n const agents = jsonArray(runRead(command,\n scopedArgs(target, ['agent', 'list', '--include-archived', '--output', 'json']),\n 'agent.list', target.root, env, timeoutMs, calls).stdout, 'agent list')\n resources.agentCandidates = agents\n .filter((item) => optionalField(item.name) === target.projectName)\n .map((item) => ({\n id: resourceId(idOf(item), 'agent candidate.id'),\n name: safeDisplay(item.name),\n archived: Boolean(optionalField(item.archived_at)),\n }))\n .sort((a, b) => a.id.localeCompare(b.id))\n\n const catalog = jsonArray(runRead(command,\n scopedArgs(target, ['skill', 'list', '--output', 'json']),\n 'skill.list', target.root, env, timeoutMs, calls).stdout, 'skill list')\n resources.catalogSkills = catalog.map((item) => ({\n id: resourceId(idOf(item), 'skill.id'),\n workspaceId: optionalField(item.workspace_id) || target.workspaceId,\n name: safeDisplay(item.name),\n })).sort(compareNamedResource)\n if (resources.catalogSkills.some((item) => item.workspaceId !== target.workspaceId)) {\n throw new MulticaReadFailure('scope.skill-workspace-mismatch')\n }\n\n if (target.agentId) {\n const agentMatches = agents.filter((item) => idOf(item) === target.agentId)\n if (agentMatches.length !== 1) throw new MulticaReadFailure('scope.agent-list-mismatch')\n const agent = jsonObject(runRead(command,\n scopedArgs(target, ['agent', 'get', target.agentId, '--output', 'json']),\n 'agent.get', target.root, env, timeoutMs, calls).stdout, 'agent get')\n const agentWorkspace = optionalField(agent.workspace_id)\n const agentRuntime = optionalField(agent.runtime_id)\n if (idOf(agent) !== target.agentId || agentWorkspace !== target.workspaceId ||\n agentRuntime !== target.runtimeId) {\n throw new MulticaReadFailure('scope.agent-binding-mismatch')\n }\n resources.agent = {\n id: target.agentId,\n workspaceId: agentWorkspace,\n runtimeId: agentRuntime,\n name: safeDisplay(agent.name),\n status: safeDisplay(agent.status),\n archived: Boolean(optionalField(agent.archived_at)),\n }\n const assigned = jsonArray(runRead(command,\n scopedArgs(target, ['agent', 'skills', 'list', target.agentId, '--output', 'json']),\n 'agent.skills', target.root, env, timeoutMs, calls).stdout, 'agent skills list')\n resources.assignedSkills = assigned.map((item) => ({\n id: resourceId(idOf(item), 'assigned skill.id'),\n name: safeDisplay(item.name),\n enabled: item.enabled === undefined ? true : Boolean(item.enabled),\n })).sort(compareNamedResource)\n } else if (resources.agentCandidates.length > 0) {\n throw new MulticaReadFailure('agent.unbound-name-candidates')\n } else {\n diff.push('agent.create')\n }\n\n for (const name of target.skills) {\n const candidates = resources.catalogSkills.filter((item) => item.name === name)\n if (candidates.length > 1) throw new MulticaReadFailure(`skills.duplicate:${name}`)\n if (candidates.length === 0) {\n diff.push(`skill.create:${name}`)\n continue\n }\n if (target.agentId && !resources.assignedSkills.some((item) =>\n item.id === candidates[0].id && item.enabled)) {\n diff.push(`skill.assign:${name}`)\n }\n }\n } catch (error) {\n failures.push(error instanceof MulticaReadFailure ? error.category : 'provider.read-failed')\n }\n\n const canonical = {\n cliVersion,\n profile: target.profile,\n principalHash,\n serverHash,\n expected: plan.expected,\n resources,\n }\n const observedHash = digest(stableStringify(canonical))\n const passed = failures.length === 0\n const inspectionId = `multica_inspect_${digest(stableStringify({\n desiredHash: target.workspace.desiredHash,\n observedHash,\n passed,\n diff: [...diff].sort(),\n failures,\n })).slice(0, 24)}`\n const defaultEvidencePath = join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', `${inspectionId}.json`,\n )\n const evidencePath = options.out\n ? relative(target.root, safeProjectPath(target.root, options.out, false))\n : defaultEvidencePath\n const report: MulticaWorkspaceInspection = {\n $schema: 'dingtalk-agent/multica-workspace-inspection@1',\n passed,\n readyForApply: passed,\n providerReady: false,\n inspectionId,\n workspace: name,\n provider: 'multica',\n profile: target.profile,\n cliVersion,\n desiredHash: target.workspace.desiredHash,\n observedHash,\n expected: plan.expected,\n auth: { authenticated: Boolean(principalHash), principalHash, serverHash },\n resources,\n diff: [...diff].sort(),\n failures: [...failures].sort(),\n calls,\n evidencePath,\n remoteRead: true,\n remoteWrite: false,\n sideEffect: 'remote-read',\n dingtalkSideEffect: false,\n }\n assertRedacted(report)\n if (persist) persistInspection(target, plan, report)\n return report\n}\n\nfunction persistInspection(\n target: ResolvedMulticaTarget,\n plan: MulticaWorkspacePlan,\n report: MulticaWorkspaceInspection,\n): void {\n const reportPath = safeProjectPath(target.root, report.evidencePath, false)\n atomicJson(reportPath, report)\n const reportSource = readFileSync(reportPath, 'utf8')\n const pointer = {\n $schema: 'dingtalk-agent/multica-inspection-pointer@1',\n inspectionId: report.inspectionId,\n evidencePath: report.evidencePath,\n reportHash: sha256(reportSource),\n }\n atomicJson(latestPointerPath(target.root, target.workspace.name), pointer)\n if (!report.passed) return\n const expectedSkillSetHash = digest(stableStringify([...target.skills].sort()))\n const observedSkillSetHash = digest(stableStringify(report.resources.assignedSkills\n .filter((item) => item.enabled).map((item) => item.name).sort()))\n const state: DevelopmentWorkspaceState = {\n $schema: 'dingtalk-agent/workspace-state@1',\n workspace: target.workspace.name,\n provider: 'multica',\n status: 'verifying',\n binding: {\n profile: target.profile,\n remoteWorkspaceId: target.workspaceId,\n runtimeId: target.runtimeId,\n agentId: target.agentId,\n cliVersion: report.cliVersion,\n principalHash: report.auth.principalHash,\n serverHash: report.auth.serverHash,\n inspectionId: report.inspectionId,\n evidencePath: report.evidencePath,\n sourceHash: target.workspace.sourceHash,\n expectedSkillSetHash,\n observedSkillSetHash,\n },\n desiredHash: target.workspace.desiredHash,\n observedHash: report.observedHash,\n lastPlanId: plan.planId,\n lastReceiptId: '',\n lastEvalId: '',\n }\n atomicJson(safeProjectPath(\n target.root, join(WORKSPACE_STATE_ROOT, `${target.workspace.name}.json`), false,\n ), state)\n}\n\nfunction resolveMulticaTarget(\n start: string, name: string, env: NodeJS.ProcessEnv, cliVersion: string,\n agentIdOverride = '',\n): ResolvedMulticaTarget {\n const info = inspectAgentProject(start, cliVersion)\n const workspace = requireMulticaWorkspace(info.root, name, cliVersion)\n const provider = workspace.provider\n const blocking: string[] = []\n const resolveRef = (ref: string, label: string, optional = false): string => {\n if (!ref) return ''\n const variable = ref.startsWith('env:') ? ref.slice(4) : ''\n const value = variable ? String(env[variable] || '').trim() : ''\n if (!value) {\n if (!optional) blocking.push(label)\n return ''\n }\n try { return resourceId(value, label) } catch { blocking.push(`${label}.invalid`); return '' }\n }\n const workspaceId = resolveRef(provider.workspaceIdFrom, 'workspace-id')\n const runtimeId = resolveRef(provider.runtimeIdFrom, 'runtime-id')\n let agentId = ''\n if (agentIdOverride) {\n try { agentId = resourceId(agentIdOverride, 'agent-id-override') }\n catch { blocking.push('agent-id-override.invalid') }\n } else if (provider.agentIdFrom) agentId = resolveRef(provider.agentIdFrom, 'agent-id')\n else if (workspace.state?.binding.agentId) {\n try { agentId = resourceId(workspace.state.binding.agentId, 'state.agent-id') }\n catch { blocking.push('state.agent-id.invalid') }\n }\n return {\n root: info.root,\n projectName: info.project.displayName,\n skills: [...new Set([...info.project.skills, MULTICA_BOOT_SKILL])].sort(),\n workspace,\n profile: provider.profile,\n workspaceId,\n runtimeId,\n agentId,\n blocking,\n }\n}\n\nfunction requireMulticaWorkspace(start: string, name: string, cliVersion: string): DevelopmentWorkspaceView {\n const workspace = showDevelopmentWorkspace(start, name, cliVersion)\n if (workspace.provider.kind !== 'multica' || workspace.legacy) {\n throw new Error(`Workspace ${name} 不是 multica Provider;W3 不执行 ${workspace.provider.kind}`)\n }\n return workspace\n}\n\nfunction readOperations(target: ResolvedMulticaTarget): Array<{ id: string; argv: string[] }> {\n const operations = [\n { id: 'cli.version', argv: ['--version'] },\n { id: 'profile.config', argv: profileArgs(target, ['config', 'show']) },\n { id: 'auth.status', argv: profileArgs(target, ['auth', 'status']) },\n { id: 'workspace.list', argv: profileArgs(target, ['workspace', 'list', '--output', 'json']) },\n { id: 'workspace.get', argv: profileArgs(target,\n ['workspace', 'get', target.workspaceId || '<workspace-id>', '--output', 'json']) },\n { id: 'runtime.list', argv: scopedArgs(target, ['runtime', 'list', '--output', 'json']) },\n { id: 'agent.list', argv: scopedArgs(target,\n ['agent', 'list', '--include-archived', '--output', 'json']) },\n { id: 'skill.list', argv: scopedArgs(target, ['skill', 'list', '--output', 'json']) },\n ]\n if (target.agentId) operations.push(\n { id: 'agent.get', argv: scopedArgs(target,\n ['agent', 'get', target.agentId, '--output', 'json']) },\n { id: 'agent.skills', argv: scopedArgs(target,\n ['agent', 'skills', 'list', target.agentId, '--output', 'json']) },\n )\n return operations\n}\n\nfunction profileArgs(target: ResolvedMulticaTarget, args: string[]): string[] {\n return ['--profile', target.profile, ...args]\n}\n\nfunction scopedArgs(target: ResolvedMulticaTarget, args: string[]): string[] {\n return ['--profile', target.profile, '--workspace-id', target.workspaceId || '<workspace-id>', ...args]\n}\n\nfunction runRead(\n command: string,\n argv: string[],\n id: string,\n cwd: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n calls: MulticaReadCall[],\n): ReadResult {\n const run = spawnSync(command, argv, {\n cwd,\n env,\n encoding: 'utf8',\n timeout: timeoutMs,\n maxBuffer: 16 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n const stdout = String(run.stdout || '')\n const stderr = String(run.stderr || '')\n const exitCode = typeof run.status === 'number' ? run.status : 1\n const passed = !run.error && exitCode === 0\n calls.push({\n id,\n argv: argv.map(safeArg),\n exitCode,\n stdoutHash: sha256(stdout),\n stderrHash: sha256(stderr),\n passed,\n })\n if (!passed) throw new MulticaReadFailure(`command.${id}`)\n return { stdout, stderr }\n}\n\nfunction parseMulticaVersion(value: string): string {\n const match = value.match(/\\bmultica\\s+([0-9]+\\.[0-9]+\\.[0-9]+(?:[-+][A-Za-z0-9.-]+)?)/i)\n if (!match) throw new MulticaReadFailure('cli.version-invalid')\n return match[1]\n}\n\nfunction parseConfig(value: string, profile: string): { server: string; workspaceId: string } {\n const fields = new Map<string, string>()\n for (const line of value.split(/\\r?\\n/)) {\n const match = line.match(/^([^:]+):\\s*(.*)$/)\n if (match) fields.set(match[1].trim().toLowerCase(), match[2].trim())\n }\n if ((fields.get('profile') || '') !== profile) throw new MulticaReadFailure('profile.mismatch')\n const normalize = (item: string | undefined): string => item && item !== '(not set)' ? item : ''\n return {\n server: normalize(fields.get('server_url')),\n workspaceId: normalize(fields.get('workspace_id')),\n }\n}\n\nfunction parseAuth(value: string): string {\n if (/not authenticated|invalid or expired/i.test(value)) return ''\n const user = value.split(/\\r?\\n/).find((line) => /^User:\\s+/i.test(line.trim())) || ''\n const server = value.split(/\\r?\\n/).find((line) => /^Server:\\s+/i.test(line.trim())) || ''\n const token = value.split(/\\r?\\n/).find((line) => /^Token:\\s+/i.test(line.trim())) || ''\n return user && server && token ? `${user.trim()}|${server.trim()}` : ''\n}\n\nfunction jsonArray(value: string, label: string): Record<string, unknown>[] {\n let parsed: unknown\n try { parsed = JSON.parse(value) } catch { throw new MulticaReadFailure(`json.${label}`) }\n if (!Array.isArray(parsed) || parsed.some((item) => !item || typeof item !== 'object' || Array.isArray(item))) {\n throw new MulticaReadFailure(`shape.${label}`)\n }\n return parsed as Record<string, unknown>[]\n}\n\nfunction jsonObject(value: string, label: string): Record<string, unknown> {\n let parsed: unknown\n try { parsed = JSON.parse(value) } catch { throw new MulticaReadFailure(`json.${label}`) }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new MulticaReadFailure(`shape.${label}`)\n }\n return parsed as Record<string, unknown>\n}\n\nfunction readJsonObject(path: string, label: string): Record<string, unknown> {\n if (lstatSync(path).isSymbolicLink()) throw new Error(`${label} 不能是符号链接`)\n return jsonObject(readFileSync(path, 'utf8'), label)\n}\n\nfunction idOf(value: Record<string, unknown>): string {\n return optionalField(value.id)\n}\n\nfunction stringField(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value) throw new Error(`${label} 必须是非空字符串`)\n return value\n}\n\nfunction optionalField(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction resourceId(value: string, label: string): string {\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$/.test(value) ||\n /^(?:mul_|mcn_|sk-|bearer)/i.test(value)) {\n throw new Error(`${label} 不是安全的稳定资源 ID`)\n }\n return value\n}\n\nfunction safeDisplay(value: unknown): string {\n const text = typeof value === 'string' ? value : ''\n if (!text) return ''\n if (/(?:mul_|mcn_|sk-[A-Za-z0-9]|bearer\\s|access[_-]?token|client[_-]?secret|password)/i.test(text)) {\n return `[redacted:${digest(text).slice(0, 12)}]`\n }\n return text.length > 160 ? `${text.slice(0, 157)}...` : text\n}\n\nfunction safeArg(value: string): string {\n return safeDisplay(value)\n}\n\nfunction compareNamedResource(\n a: { name: string; id: string }, b: { name: string; id: string },\n): number {\n return a.name.localeCompare(b.name) || a.id.localeCompare(b.id)\n}\n\nfunction emptyResources(): MulticaResourceSummary {\n return {\n workspace: null,\n runtime: null,\n agent: null,\n agentCandidates: [],\n catalogSkills: [],\n assignedSkills: [],\n }\n}\n\nfunction emptyStatus(workspace: DevelopmentWorkspaceView): MulticaWorkspaceStatus {\n return {\n $schema: 'dingtalk-agent/multica-workspace-status@1',\n workspace: workspace.name,\n provider: 'multica',\n available: false,\n inspectionId: '',\n passed: false,\n readyForApply: false,\n providerReady: false,\n evidencePath: '',\n evidenceIntegrity: false,\n stateMatched: false,\n desiredHash: workspace.desiredHash,\n observedHash: workspace.observedHash,\n diff: [],\n failures: ['inspection.missing'],\n remoteRead: false,\n remoteWrite: false,\n sideEffect: false,\n dingtalkSideEffect: false,\n }\n}\n\nfunction latestPointerPath(root: string, name: string): string {\n return safeProjectPath(root, join(\n MULTICA_EVIDENCE_ROOT, safeName(name), 'multica-inspections', 'latest.json',\n ), false)\n}\n\nfunction safeName(value: string): string {\n if (!/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/.test(value)) {\n throw new Error(`Workspace name 非法: ${value}`)\n }\n return value\n}\n\nfunction safeProjectPath(root: string, ref: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Multica Provider 路径必须位于 Project 内: ${ref}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Multica evidence 不存在: ${ref}`)\n if (existsSync(candidate)) {\n if (lstatSync(candidate).isSymbolicLink()) {\n throw new Error(`Multica Provider 路径不能是符号链接: ${ref}`)\n }\n if (!isInside(rootReal, realpathSync(candidate))) {\n throw new Error(`Multica Provider 真实路径越出 Project: ${ref}`)\n }\n }\n let ancestor = dirname(candidate)\n while (!existsSync(ancestor)) {\n const parent = dirname(ancestor)\n if (parent === ancestor) break\n ancestor = parent\n }\n if (!existsSync(ancestor) || !isInside(rootReal, realpathSync(ancestor))) {\n throw new Error(`Multica Provider 父目录真实路径越出 Project: ${ref}`)\n }\n return candidate\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate)\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n}\n\nfunction atomicJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.tmp-${process.pid}`\n const source = `${JSON.stringify(value, null, 2)}\\n`\n writeFileSync(temp, source, { mode: 0o600 })\n renameSync(temp, path)\n if (readFileSync(path, 'utf8') !== source) throw new Error(`原子写后回读不一致: ${path}`)\n}\n\nfunction assertRedacted(value: unknown): void {\n const source = JSON.stringify(value)\n if (/(?:mul_|mcn_|sk-[A-Za-z0-9]|bearer\\s|access[_-]?token|client[_-]?secret|password)/i.test(source)) {\n throw new Error('Multica inspection 脱敏失败:检测到疑似凭据')\n }\n}\n\nfunction positiveTimeout(value: number | undefined): number {\n if (value === undefined) return 30_000\n if (!Number.isFinite(value) || value < 100 || value > 300_000) {\n throw new Error('Multica read timeout 必须在 100..300000 ms')\n }\n return Math.floor(value)\n}\n\nfunction requireReadConfirmation(options: MulticaReadOptions, command: string): void {\n if (!options.execute || !options.yes) {\n throw new Error(`${command} 会读取当前 Multica 身份和远端 scope;必须同时传 --execute --yes`)\n }\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex')\n}\n"]}
@@ -1,14 +1,18 @@
1
1
  // Skill 安装生命周期由开放生态的 `npx skills` 负责。
2
2
  // dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。
3
- // 默认(不指定 name)对全部内置 Skill 生效:基础行为 + Agent 装配;指定 name 时只操作该 Skill。
4
- import { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs';
3
+ // 默认(不指定 name)对全部内置 Skill 生效:基础行为 + Agent 装配 + 交付后评测;指定 name 时只操作该 Skill。
4
+ import { existsSync, lstatSync, readdirSync, readFileSync, readlinkSync } from 'node:fs';
5
5
  import { homedir } from 'node:os';
6
6
  import { dirname, join, resolve } from 'node:path';
7
7
  import { spawnSync } from 'node:child_process';
8
+ import { createHash } from 'node:crypto';
9
+ import { cleanVersion, compareVersions, isValidVersion } from './version.js';
8
10
  export const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior';
9
11
  // 默认套装:所有机器都装的通用 Skill。平台 Skill(deploy/boot-multica 等)不在默认套装内,
10
12
  // 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。
11
- export const BUNDLED_SKILL_NAMES = [GLOBAL_SKILL_NAME, 'dingtalk-agent-compose'];
13
+ export const BUNDLED_SKILL_NAMES = [
14
+ GLOBAL_SKILL_NAME, 'dingtalk-agent-compose', 'dingtalk-agent-eval',
15
+ ];
12
16
  export const INSTALLABLE_SKILL_NAMES = [
13
17
  ...BUNDLED_SKILL_NAMES,
14
18
  'dingtalk-agent-deploy-multica', 'dingtalk-agent-boot-multica', 'multica-external',
@@ -55,9 +59,15 @@ export function skillStatus(packageRoot, options = {}) {
55
59
  const paths = globalPaths(packageRoot, options.home, name);
56
60
  const bundled = bundledInfo(packageRoot, name);
57
61
  const canonicalExists = isDirectory(paths.canonical);
58
- const installedVersion = canonicalExists
59
- ? parseSkillFrontmatter(readFileSync(join(paths.canonical, 'SKILL.md'), 'utf8')).version
60
- : '';
62
+ const installedVersion = canonicalExists ? readInstalledVersion(paths.canonical) : '';
63
+ const installedHash = canonicalExists ? skillContentHash(paths.canonical) : '';
64
+ const drift = driftOf({
65
+ exists: canonicalExists,
66
+ installedVersion,
67
+ installedHash,
68
+ bundledVersion: bundled.skillVersion,
69
+ bundledHash: bundled.contentHash,
70
+ });
61
71
  const claude = inspectExposure(paths.claude, paths.canonical);
62
72
  const sharedState = canonicalExists ? 'ok' : 'missing';
63
73
  return {
@@ -69,7 +79,10 @@ export function skillStatus(packageRoot, options = {}) {
69
79
  path: paths.canonical,
70
80
  exists: canonicalExists,
71
81
  installedVersion,
72
- current: Boolean(canonicalExists && installedVersion === bundled.skillVersion),
82
+ installedHash,
83
+ state: drift.state,
84
+ comparison: drift.comparison,
85
+ current: drift.state === 'current',
73
86
  },
74
87
  claude: { path: paths.claude, ...claude },
75
88
  clients: [
@@ -113,12 +126,21 @@ function runSkills(packageRoot, action, args, options) {
113
126
  ];
114
127
  const command = ['npx', ...commandArgs].map(shellQuote).join(' ');
115
128
  const before = skillStatus(packageRoot, options);
129
+ const beforeState = { installedVersion: before.canonical.installedVersion, state: before.canonical.state };
116
130
  if (options.dryRun) {
117
131
  return {
118
132
  ...before,
119
- operation: { action, command, executed: false, exitCode: null, output: '' },
133
+ operation: {
134
+ action, command, executed: false, exitCode: null, output: '',
135
+ before: beforeState, after: null,
136
+ },
120
137
  };
121
138
  }
139
+ // 本机比包内新时覆盖就是降级;与 npm 包升级策略一致,默认拒绝。
140
+ if (action !== 'uninstall' && before.canonical.state === 'ahead' && !options.allowDowngrade) {
141
+ throw new Error(`拒绝降级 ${before.name}: 本机 ${before.canonical.installedVersion} 高于包内 ` +
142
+ `${before.bundled.skillVersion};确认要覆盖时加 --allow-downgrade`);
143
+ }
122
144
  const env = {
123
145
  ...process.env,
124
146
  ...(options.env || {}),
@@ -135,9 +157,20 @@ function runSkills(packageRoot, action, args, options) {
135
157
  throw new Error(`skills CLI ${action} 失败: ${reason}\n` +
136
158
  `可手动执行: ${command}`);
137
159
  }
160
+ // 退出码 0 不等于本机副本已经是目标版本;升级/安装后必须回读确认。
161
+ const after = skillStatus(packageRoot, options);
162
+ if (action !== 'uninstall' && after.canonical.state !== 'current') {
163
+ throw new Error(`skills CLI ${action} 退出码为 0,但回读 ${after.name} 仍为 ${after.canonical.state}` +
164
+ `(本机 ${after.canonical.installedVersion || '未声明'} / 包内 ${after.bundled.skillVersion})\n` +
165
+ `可手动执行: ${command}`);
166
+ }
138
167
  return {
139
- ...skillStatus(packageRoot, options),
140
- operation: { action, command, executed: true, exitCode: run.status, output },
168
+ ...after,
169
+ operation: {
170
+ action, command, executed: true, exitCode: run.status, output,
171
+ before: beforeState,
172
+ after: { installedVersion: after.canonical.installedVersion, state: after.canonical.state },
173
+ },
141
174
  };
142
175
  }
143
176
  function globalPaths(packageRoot, home = homedir(), name = GLOBAL_SKILL_NAME) {
@@ -156,6 +189,57 @@ function bundledInfo(packageRoot, name) {
156
189
  path: source,
157
190
  packageVersion: String(pkg.version || ''),
158
191
  skillVersion: frontmatter.version,
192
+ contentHash: skillContentHash(source),
193
+ };
194
+ }
195
+ /** 本机副本的版本号;用户手改坏格式时返回空串并由调用方降级为 unknown,不抛错。 */
196
+ function readInstalledVersion(canonical) {
197
+ try {
198
+ return parseSkillFrontmatter(readFileSync(join(canonical, 'SKILL.md'), 'utf8')).version;
199
+ }
200
+ catch {
201
+ return '';
202
+ }
203
+ }
204
+ /**
205
+ * 全树内容 hash:按相对路径排序,逐个 update(相对路径 + \0 + 内容)。
206
+ * 它证明 references/assets 完整一致,补上"改了正文但没 bump 版本"这类版本号测不出的漂移。
207
+ */
208
+ export function skillContentHash(root) {
209
+ const hash = createHash('sha256');
210
+ for (const relative of listSkillFiles(root)) {
211
+ hash.update(relative);
212
+ hash.update('\0');
213
+ hash.update(readFileSync(join(root, relative)));
214
+ }
215
+ return `sha256:${hash.digest('hex').slice(0, 16)}`;
216
+ }
217
+ function listSkillFiles(root, prefix = '') {
218
+ const files = [];
219
+ for (const entry of readdirSync(join(root, prefix), { withFileTypes: true })) {
220
+ if (entry.name === '.DS_Store' || entry.isSymbolicLink())
221
+ continue;
222
+ const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
223
+ if (entry.isDirectory())
224
+ files.push(...listSkillFiles(root, relative));
225
+ else if (entry.isFile())
226
+ files.push(relative);
227
+ }
228
+ return files.sort();
229
+ }
230
+ function driftOf(input) {
231
+ if (!input.exists)
232
+ return { state: 'missing', comparison: null };
233
+ if (!isValidVersion(input.installedVersion))
234
+ return { state: 'unknown', comparison: null };
235
+ const comparison = compareVersions(input.installedVersion, input.bundledVersion);
236
+ if (comparison > 0)
237
+ return { state: 'ahead', comparison };
238
+ if (comparison < 0)
239
+ return { state: 'outdated', comparison };
240
+ return {
241
+ state: input.installedHash === input.bundledHash ? 'current' : 'modified',
242
+ comparison,
159
243
  };
160
244
  }
161
245
  function inspectExposure(exposure, canonical) {
@@ -181,6 +265,10 @@ function validateSkill(root, name) {
181
265
  }
182
266
  if (!metadata.description)
183
267
  throw new Error('Skill frontmatter 缺少 description');
268
+ // 包内 Skill 缺版本号是仓库缺陷:没有版本就无法判断本机副本是否过期,直接 fail closed。
269
+ if (!metadata.version)
270
+ throw new Error(`Skill 缺少 metadata.version: ${root}`);
271
+ cleanVersion(metadata.version);
184
272
  }
185
273
  function bundledSkillName(value = '') {
186
274
  const name = value.trim() || GLOBAL_SKILL_NAME;
@@ -1 +1 @@
1
- {"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skill-manager.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,yDAAyD;AACzD,kEAAkE;AAElE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAA;AAC1D,+DAA+D;AAC/D,uEAAuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,iBAAiB,EAAE,wBAAwB,CAAU,CAAA;AACzF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,GAAG,mBAAmB;IACtB,+BAA+B,EAAE,6BAA6B,EAAE,kBAAkB;CAC1E,CAAA;AAEV,8DAA8D;AAC9D,2DAA2D;AAC3D,MAAM,kBAAkB,GAA2B;IACjD,yBAAyB,EAAE,qCAAqC;IAChE,wBAAwB,EAAE,oCAAoC;IAC9D,qBAAqB,EAAE,iCAAiC;IACxD,+BAA+B,EAAE,iEAAiE;IAClG,6BAA6B,EAAE,+DAA+D;IAC9F,kBAAkB,EAAE,oDAAoD;CACzE,CAAA;AAED,uCAAuC;AACvC,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,IAAY;IAChE,OAAO,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;AAC5E,CAAC;AACD,MAAM,cAAc,GAAG,eAAe,CAAA;AACtC,MAAM,QAAQ,GAAG,4BAA4B,CAAA;AAC7C,MAAM,MAAM,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;AA4CnD,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,UAA6C,EAAE;IAE/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AACnG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC1G,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC1G,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC5G,CAAC;AAED,SAAS,OAAO,CAAC,MAA2B;IAC1C,OAAO;QACL,OAAO,EAAE,qCAAqC;QAC9C,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QACxC,MAAM;KACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,UAA+B,EAAE;IAChF,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IAC9C,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpD,MAAM,gBAAgB,GAAG,eAAe;QACtC,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO;QACxF,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAC7D,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IACtD,OAAO;QACL,OAAO,EAAE,+BAA+B;QACxC,IAAI;QACJ,OAAO,EAAE,YAAY;QACrB,OAAO;QACP,SAAS,EAAE;YACT,IAAI,EAAE,KAAK,CAAC,SAAS;YACrB,MAAM,EAAE,eAAe;YACvB,gBAAgB;YAChB,OAAO,EAAE,OAAO,CAAC,eAAe,IAAI,gBAAgB,KAAK,OAAO,CAAC,YAAY,CAAC;SAC/E;QACD,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE;QACzC,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS;gBAC/D,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;aACxC;YACD;gBACE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB;gBAC/D,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW;aAC1C;YACD;gBACE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB;gBACrE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW;aAC1C;SACF;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,UAA+B,EAAE;IAEjC,OAAO,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE;QACvC,KAAK,EAAE,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACjF,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM;KAC1C,EAAE,OAAO,CAAC,CAAA;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,UAA+B,EAAE;IAEjC,2DAA2D;IAC3D,OAAO,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE;QACvC,KAAK,EAAE,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACjF,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM;KAC1C,EAAE,OAAO,CAAC,CAAA;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,UAA+B,EAAE;IAEjC,OAAO,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE;QACzC,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM;KAC1C,EAAE,OAAO,CAAC,CAAA;AACb,CAAC;AAED,SAAS,SAAS,CAChB,WAAmB,EACnB,MAA2C,EAC3C,IAAc,EACd,OAA4B;IAE5B,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,cAAc,QAAQ,EAAE,EAAE,aAAa,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI;KAC1F,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjE,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAChD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,GAAG,MAAM;YACT,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;SAC5E,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG;QACV,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE;KACzE,CAAA;IACD,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE;QACxC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO;KACxC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IACzE,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,MAAM,GAAI,GAAG,CAAC,KAA2C,EAAE,IAAI,KAAK,QAAQ;YAChF,CAAC,CAAC,2CAA2C;YAC7C,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,EAAE,CAAA;QACvD,MAAM,IAAI,KAAK,CACb,cAAc,MAAM,QAAQ,MAAM,IAAI;YACtC,UAAU,OAAO,EAAE,CACpB,CAAA;IACH,CAAC;IACD,OAAO;QACL,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC;QACpC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;KAC7E,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB,EAAE,IAAI,GAAG,OAAO,EAAE,EAAE,IAAI,GAAG,iBAAiB;IAClF,OAAO;QACL,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC;QAC3C,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC;QAChD,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC;KAC9C,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB,EAAE,IAAY;IACpD,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,MAAM,CAAA;IAC/D,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/E,MAAM,WAAW,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IACzF,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QACzC,YAAY,EAAE,WAAW,CAAC,OAAO;KAClC,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,SAAiB;IAI1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IAClE,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;IAChC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACpE,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAClC,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC;QAC3D,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QAC9B,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;IACpE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IAClE,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,CAAA;IACjE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAK,GAAG,EAAE;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,iBAAiB,CAAA;IAC9C,IAAI,CAAE,uBAA6C,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,QAAQ,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAClE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,EAAE,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACrE,CAAC,CAAA;IACD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACtH,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC;QACtC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,SAAS,CAAC;KAC7D,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC;QAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AAC7D,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAA;AAC1F,CAAC","sourcesContent":["// Skill 安装生命周期由开放生态的 `npx skills` 负责。\n// dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。\n// 默认(不指定 name)对全部内置 Skill 生效:基础行为 + Agent 装配;指定 name 时只操作该 Skill。\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'\n// 默认套装:所有机器都装的通用 Skill。平台 Skill(deploy/boot-multica 等)不在默认套装内,\n// 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。\nexport const BUNDLED_SKILL_NAMES = [GLOBAL_SKILL_NAME, 'dingtalk-agent-compose'] as const\nexport const INSTALLABLE_SKILL_NAMES = [\n ...BUNDLED_SKILL_NAMES,\n 'dingtalk-agent-deploy-multica', 'dingtalk-agent-boot-multica', 'multica-external',\n] as const\n\n// 仓库/包内的 Skill 源码路径注册表:core 为通用套装,platforms/<platform> 按平台装填。\n// 安装后的 canonical 布局仍是扁平的 ~/.agents/skills/<name>;分层只存在于包内。\nconst BUNDLED_SKILL_DIRS: Record<string, string> = {\n 'dingtalk-basic-behavior': 'skills/core/dingtalk-basic-behavior',\n 'dingtalk-agent-compose': 'skills/core/dingtalk-agent-compose',\n 'dingtalk-agent-eval': 'skills/core/dingtalk-agent-eval',\n 'dingtalk-agent-deploy-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica',\n 'dingtalk-agent-boot-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica',\n 'multica-external': 'skills/platforms/multica-dingtalk/multica-external',\n}\n\n/** 解析包内 Skill 源码目录;未注册的名字回退到历史扁平布局。 */\nexport function bundledSkillPath(packageRoot: string, name: string): string {\n return join(packageRoot, BUNDLED_SKILL_DIRS[name] || join('skills', name))\n}\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 name?: string\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 interface GlobalSkillSuiteStatus {\n $schema: 'dingtalk-agent/skill-status-suite@1'\n manager: 'skills-cli'\n names: string[]\n skills: GlobalSkillStatus[]\n}\n\nexport function skillSuiteStatus(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => skillStatus(packageRoot, { ...options, name })))\n}\n\nexport function installBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => installGlobalSkill(packageRoot, { ...options, name })))\n}\n\nexport function upgradeBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => upgradeGlobalSkill(packageRoot, { ...options, name })))\n}\n\nexport function uninstallBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => uninstallGlobalSkill(packageRoot, { ...options, name })))\n}\n\nfunction suiteOf(skills: GlobalSkillStatus[]): GlobalSkillSuiteStatus {\n return {\n $schema: 'dingtalk-agent/skill-status-suite@1',\n manager: 'skills-cli',\n names: skills.map((skill) => skill.name),\n skills,\n }\n}\n\nexport function skillStatus(packageRoot: string, options: SkillManagerOptions = {}): GlobalSkillStatus {\n const name = bundledSkillName(options.name)\n const paths = globalPaths(packageRoot, options.home, name)\n const bundled = bundledInfo(packageRoot, name)\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,\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, undefined, bundledSkillName(options.name)).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, undefined, bundledSkillName(options.name)).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', bundledSkillName(options.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 = [\n '--yes', `--registry=${REGISTRY}`, `--package=${SKILLS_PACKAGE}`, '--', 'skills', ...args,\n ]\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(), name = GLOBAL_SKILL_NAME) {\n return {\n source: bundledSkillPath(packageRoot, name),\n canonical: join(home, '.agents', 'skills', name),\n claude: join(home, '.claude', 'skills', name),\n }\n}\n\nfunction bundledInfo(packageRoot: string, name: string) {\n const source = globalPaths(packageRoot, undefined, name).source\n validateSkill(source, name)\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, name: 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 !== name) {\n throw new Error(`Skill name=${metadata.name} 与目录名 ${name} 不一致`)\n }\n if (!metadata.description) throw new Error('Skill frontmatter 缺少 description')\n}\n\nfunction bundledSkillName(value = ''): string {\n const name = value.trim() || GLOBAL_SKILL_NAME\n if (!(INSTALLABLE_SKILL_NAMES as readonly string[]).includes(name)) {\n throw new Error(`不支持的内置 Skill: ${name};可用: ${INSTALLABLE_SKILL_NAMES.join(', ')}`)\n }\n return name\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"]}
1
+ {"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skill-manager.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,yDAAyD;AACzD,0EAA0E;AAE1E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAA;AAC1D,+DAA+D;AAC/D,uEAAuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,iBAAiB,EAAE,wBAAwB,EAAE,qBAAqB;CAC1D,CAAA;AACV,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,GAAG,mBAAmB;IACtB,+BAA+B,EAAE,6BAA6B,EAAE,kBAAkB;CAC1E,CAAA;AAEV,8DAA8D;AAC9D,2DAA2D;AAC3D,MAAM,kBAAkB,GAA2B;IACjD,yBAAyB,EAAE,qCAAqC;IAChE,wBAAwB,EAAE,oCAAoC;IAC9D,qBAAqB,EAAE,iCAAiC;IACxD,+BAA+B,EAAE,iEAAiE;IAClG,6BAA6B,EAAE,+DAA+D;IAC9F,kBAAkB,EAAE,oDAAoD;CACzE,CAAA;AAED,uCAAuC;AACvC,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,IAAY;IAChE,OAAO,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;AAC5E,CAAC;AACD,MAAM,cAAc,GAAG,eAAe,CAAA;AACtC,MAAM,QAAQ,GAAG,4BAA4B,CAAA;AAC7C,MAAM,MAAM,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;AA8DnD,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,UAA6C,EAAE;IAE/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AACnG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC1G,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC1G,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,OAAO,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC5G,CAAC;AAED,SAAS,OAAO,CAAC,MAA2B;IAC1C,OAAO;QACL,OAAO,EAAE,qCAAqC;QAC9C,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QACxC,MAAM;KACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,UAA+B,EAAE;IAChF,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IAC9C,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpD,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACrF,MAAM,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC;QACpB,MAAM,EAAE,eAAe;QACvB,gBAAgB;QAChB,aAAa;QACb,cAAc,EAAE,OAAO,CAAC,YAAY;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAC7D,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IACtD,OAAO;QACL,OAAO,EAAE,+BAA+B;QACxC,IAAI;QACJ,OAAO,EAAE,YAAY;QACrB,OAAO;QACP,SAAS,EAAE;YACT,IAAI,EAAE,KAAK,CAAC,SAAS;YACrB,MAAM,EAAE,eAAe;YACvB,gBAAgB;YAChB,aAAa;YACb,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS;SACnC;QACD,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE;QACzC,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS;gBAC/D,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;aACxC;YACD;gBACE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB;gBAC/D,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW;aAC1C;YACD;gBACE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB;gBACrE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW;aAC1C;SACF;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,UAA+B,EAAE;IAEjC,OAAO,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE;QACvC,KAAK,EAAE,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACjF,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM;KAC1C,EAAE,OAAO,CAAC,CAAA;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,UAA+B,EAAE;IAEjC,2DAA2D;IAC3D,OAAO,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE;QACvC,KAAK,EAAE,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACjF,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM;KAC1C,EAAE,OAAO,CAAC,CAAA;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,UAA+B,EAAE;IAEjC,OAAO,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE;QACzC,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM;KAC1C,EAAE,OAAO,CAAC,CAAA;AACb,CAAC;AAED,SAAS,SAAS,CAChB,WAAmB,EACnB,MAA2C,EAC3C,IAAc,EACd,OAA4B;IAE5B,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,cAAc,QAAQ,EAAE,EAAE,aAAa,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI;KAC1F,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjE,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,EAAE,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IAC1G,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,GAAG,MAAM;YACT,SAAS,EAAE;gBACT,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;gBAC5D,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI;aACjC;SACF,CAAA;IACH,CAAC;IACD,oCAAoC;IACpC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5F,MAAM,IAAI,KAAK,CACb,QAAQ,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,SAAS,CAAC,gBAAgB,QAAQ;YACpE,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,4BAA4B,CAC3D,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG;QACV,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE;KACzE,CAAA;IACD,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE;QACxC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO;KACxC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IACzE,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,MAAM,GAAI,GAAG,CAAC,KAA2C,EAAE,IAAI,KAAK,QAAQ;YAChF,CAAC,CAAC,2CAA2C;YAC7C,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,EAAE,CAAA;QACvD,MAAM,IAAI,KAAK,CACb,cAAc,MAAM,QAAQ,MAAM,IAAI;YACtC,UAAU,OAAO,EAAE,CACpB,CAAA;IACH,CAAC;IACD,qCAAqC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAC/C,IAAI,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,cAAc,MAAM,eAAe,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;YAC3E,OAAO,KAAK,CAAC,SAAS,CAAC,gBAAgB,IAAI,KAAK,SAAS,KAAK,CAAC,OAAO,CAAC,YAAY,KAAK;YACxF,UAAU,OAAO,EAAE,CACpB,CAAA;IACH,CAAC;IACD,OAAO;QACL,GAAG,KAAK;QACR,SAAS,EAAE;YACT,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM;YAC7D,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;SAC5F;KACF,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB,EAAE,IAAI,GAAG,OAAO,EAAE,EAAE,IAAI,GAAG,iBAAiB;IAClF,OAAO;QACL,MAAM,EAAE,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC;QAC3C,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC;QAChD,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC;KAC9C,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB,EAAE,IAAY;IACpD,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,MAAM,CAAA;IAC/D,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/E,MAAM,WAAW,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IACzF,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QACzC,YAAY,EAAE,WAAW,CAAC,OAAO;QACjC,WAAW,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACtC,CAAA;AACH,CAAC;AAED,iDAAiD;AACjD,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,MAAM,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACjB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,MAAM,GAAG,EAAE;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7E,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,cAAc,EAAE;YAAE,SAAQ;QAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QAChE,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;aACjE,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAA;AACrB,CAAC;AAED,SAAS,OAAO,CAAC,KAMhB;IACC,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;IAChE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;IAC1F,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,cAAc,CAAC,CAAA;IAChF,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;IACzD,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAA;IAC5D,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;QACzE,UAAU;KACX,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,SAAiB;IAI1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IAClE,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;IAChC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACpE,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAClC,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC;QAC3D,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QAC9B,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;IACpE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IAClE,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,CAAA;IACjE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAC9E,uDAAuD;IACvD,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAA;IAC5E,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAK,GAAG,EAAE;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,iBAAiB,CAAA;IAC9C,IAAI,CAAE,uBAA6C,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,QAAQ,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAClE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,EAAE,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACrE,CAAC,CAAA;IACD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACtH,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC;QACtC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,SAAS,CAAC;KAC7D,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC;QAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AAC7D,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAA;AAC1F,CAAC","sourcesContent":["// Skill 安装生命周期由开放生态的 `npx skills` 负责。\n// dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。\n// 默认(不指定 name)对全部内置 Skill 生效:基础行为 + Agent 装配 + 交付后评测;指定 name 时只操作该 Skill。\n\nimport { existsSync, lstatSync, readdirSync, readFileSync, readlinkSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { cleanVersion, compareVersions, isValidVersion } from './version.js'\n\nexport const GLOBAL_SKILL_NAME = 'dingtalk-basic-behavior'\n// 默认套装:所有机器都装的通用 Skill。平台 Skill(deploy/boot-multica 等)不在默认套装内,\n// 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。\nexport const BUNDLED_SKILL_NAMES = [\n GLOBAL_SKILL_NAME, 'dingtalk-agent-compose', 'dingtalk-agent-eval',\n] as const\nexport const INSTALLABLE_SKILL_NAMES = [\n ...BUNDLED_SKILL_NAMES,\n 'dingtalk-agent-deploy-multica', 'dingtalk-agent-boot-multica', 'multica-external',\n] as const\n\n// 仓库/包内的 Skill 源码路径注册表:core 为通用套装,platforms/<platform> 按平台装填。\n// 安装后的 canonical 布局仍是扁平的 ~/.agents/skills/<name>;分层只存在于包内。\nconst BUNDLED_SKILL_DIRS: Record<string, string> = {\n 'dingtalk-basic-behavior': 'skills/core/dingtalk-basic-behavior',\n 'dingtalk-agent-compose': 'skills/core/dingtalk-agent-compose',\n 'dingtalk-agent-eval': 'skills/core/dingtalk-agent-eval',\n 'dingtalk-agent-deploy-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica',\n 'dingtalk-agent-boot-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica',\n 'multica-external': 'skills/platforms/multica-dingtalk/multica-external',\n}\n\n/** 解析包内 Skill 源码目录;未注册的名字回退到历史扁平布局。 */\nexport function bundledSkillPath(packageRoot: string, name: string): string {\n return join(packageRoot, BUNDLED_SKILL_DIRS[name] || join('skills', name))\n}\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 name?: string\n allowDowngrade?: boolean\n}\n\n/**\n * 本机副本相对包内 Skill 的漂移状态。`current` 是它的派生布尔,保留给既有读者。\n * 版本相等但内容不同(用户手改过)必须与真正一致区分开,否则升级提示会漏掉这类漂移。\n */\nexport type SkillDriftState =\n | 'missing' // canonical 不存在\n | 'current' // 版本相等且内容 hash 相等\n | 'modified' // 版本相等但内容 hash 不等\n | 'outdated' // 已装版本低于包内版本\n | 'ahead' // 已装版本高于包内版本\n | 'unknown' // 已装版本缺失或非法\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; contentHash: string }\n canonical: {\n path: string\n exists: boolean\n installedVersion: string\n installedHash: string\n state: SkillDriftState\n comparison: number | null\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 before: { installedVersion: string; state: SkillDriftState }\n after: { installedVersion: string; state: SkillDriftState } | null\n }\n}\n\nexport interface GlobalSkillSuiteStatus {\n $schema: 'dingtalk-agent/skill-status-suite@1'\n manager: 'skills-cli'\n names: string[]\n skills: GlobalSkillStatus[]\n}\n\nexport function skillSuiteStatus(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => skillStatus(packageRoot, { ...options, name })))\n}\n\nexport function installBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => installGlobalSkill(packageRoot, { ...options, name })))\n}\n\nexport function upgradeBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => upgradeGlobalSkill(packageRoot, { ...options, name })))\n}\n\nexport function uninstallBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n return suiteOf(BUNDLED_SKILL_NAMES.map((name) => uninstallGlobalSkill(packageRoot, { ...options, name })))\n}\n\nfunction suiteOf(skills: GlobalSkillStatus[]): GlobalSkillSuiteStatus {\n return {\n $schema: 'dingtalk-agent/skill-status-suite@1',\n manager: 'skills-cli',\n names: skills.map((skill) => skill.name),\n skills,\n }\n}\n\nexport function skillStatus(packageRoot: string, options: SkillManagerOptions = {}): GlobalSkillStatus {\n const name = bundledSkillName(options.name)\n const paths = globalPaths(packageRoot, options.home, name)\n const bundled = bundledInfo(packageRoot, name)\n const canonicalExists = isDirectory(paths.canonical)\n const installedVersion = canonicalExists ? readInstalledVersion(paths.canonical) : ''\n const installedHash = canonicalExists ? skillContentHash(paths.canonical) : ''\n const drift = driftOf({\n exists: canonicalExists,\n installedVersion,\n installedHash,\n bundledVersion: bundled.skillVersion,\n bundledHash: bundled.contentHash,\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,\n manager: 'skills-cli',\n bundled,\n canonical: {\n path: paths.canonical,\n exists: canonicalExists,\n installedVersion,\n installedHash,\n state: drift.state,\n comparison: drift.comparison,\n current: drift.state === 'current',\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, undefined, bundledSkillName(options.name)).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, undefined, bundledSkillName(options.name)).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', bundledSkillName(options.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 = [\n '--yes', `--registry=${REGISTRY}`, `--package=${SKILLS_PACKAGE}`, '--', 'skills', ...args,\n ]\n const command = ['npx', ...commandArgs].map(shellQuote).join(' ')\n const before = skillStatus(packageRoot, options)\n const beforeState = { installedVersion: before.canonical.installedVersion, state: before.canonical.state }\n if (options.dryRun) {\n return {\n ...before,\n operation: {\n action, command, executed: false, exitCode: null, output: '',\n before: beforeState, after: null,\n },\n }\n }\n // 本机比包内新时覆盖就是降级;与 npm 包升级策略一致,默认拒绝。\n if (action !== 'uninstall' && before.canonical.state === 'ahead' && !options.allowDowngrade) {\n throw new Error(\n `拒绝降级 ${before.name}: 本机 ${before.canonical.installedVersion} 高于包内 ` +\n `${before.bundled.skillVersion};确认要覆盖时加 --allow-downgrade`,\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 // 退出码 0 不等于本机副本已经是目标版本;升级/安装后必须回读确认。\n const after = skillStatus(packageRoot, options)\n if (action !== 'uninstall' && after.canonical.state !== 'current') {\n throw new Error(\n `skills CLI ${action} 退出码为 0,但回读 ${after.name} 仍为 ${after.canonical.state}` +\n `(本机 ${after.canonical.installedVersion || '未声明'} / 包内 ${after.bundled.skillVersion})\\n` +\n `可手动执行: ${command}`,\n )\n }\n return {\n ...after,\n operation: {\n action, command, executed: true, exitCode: run.status, output,\n before: beforeState,\n after: { installedVersion: after.canonical.installedVersion, state: after.canonical.state },\n },\n }\n}\n\nfunction globalPaths(packageRoot: string, home = homedir(), name = GLOBAL_SKILL_NAME) {\n return {\n source: bundledSkillPath(packageRoot, name),\n canonical: join(home, '.agents', 'skills', name),\n claude: join(home, '.claude', 'skills', name),\n }\n}\n\nfunction bundledInfo(packageRoot: string, name: string) {\n const source = globalPaths(packageRoot, undefined, name).source\n validateSkill(source, name)\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 contentHash: skillContentHash(source),\n }\n}\n\n/** 本机副本的版本号;用户手改坏格式时返回空串并由调用方降级为 unknown,不抛错。 */\nfunction readInstalledVersion(canonical: string): string {\n try {\n return parseSkillFrontmatter(readFileSync(join(canonical, 'SKILL.md'), 'utf8')).version\n } catch {\n return ''\n }\n}\n\n/**\n * 全树内容 hash:按相对路径排序,逐个 update(相对路径 + \\0 + 内容)。\n * 它证明 references/assets 完整一致,补上\"改了正文但没 bump 版本\"这类版本号测不出的漂移。\n */\nexport function skillContentHash(root: string): string {\n const hash = createHash('sha256')\n for (const relative of listSkillFiles(root)) {\n hash.update(relative)\n hash.update('\\0')\n hash.update(readFileSync(join(root, relative)))\n }\n return `sha256:${hash.digest('hex').slice(0, 16)}`\n}\n\nfunction listSkillFiles(root: string, prefix = ''): string[] {\n const files: string[] = []\n for (const entry of readdirSync(join(root, prefix), { withFileTypes: true })) {\n if (entry.name === '.DS_Store' || entry.isSymbolicLink()) continue\n const relative = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isDirectory()) files.push(...listSkillFiles(root, relative))\n else if (entry.isFile()) files.push(relative)\n }\n return files.sort()\n}\n\nfunction driftOf(input: {\n exists: boolean\n installedVersion: string\n installedHash: string\n bundledVersion: string\n bundledHash: string\n}): { state: SkillDriftState; comparison: number | null } {\n if (!input.exists) return { state: 'missing', comparison: null }\n if (!isValidVersion(input.installedVersion)) return { state: 'unknown', comparison: null }\n const comparison = compareVersions(input.installedVersion, input.bundledVersion)\n if (comparison > 0) return { state: 'ahead', comparison }\n if (comparison < 0) return { state: 'outdated', comparison }\n return {\n state: input.installedHash === input.bundledHash ? 'current' : 'modified',\n comparison,\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, name: 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 !== name) {\n throw new Error(`Skill name=${metadata.name} 与目录名 ${name} 不一致`)\n }\n if (!metadata.description) throw new Error('Skill frontmatter 缺少 description')\n // 包内 Skill 缺版本号是仓库缺陷:没有版本就无法判断本机副本是否过期,直接 fail closed。\n if (!metadata.version) throw new Error(`Skill 缺少 metadata.version: ${root}`)\n cleanVersion(metadata.version)\n}\n\nfunction bundledSkillName(value = ''): string {\n const name = value.trim() || GLOBAL_SKILL_NAME\n if (!(INSTALLABLE_SKILL_NAMES as readonly string[]).includes(name)) {\n throw new Error(`不支持的内置 Skill: ${name};可用: ${INSTALLABLE_SKILL_NAMES.join(', ')}`)\n }\n return name\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"]}