@xdxer/dingtalk-agent 0.1.5-beta.6 → 0.1.5-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/README.en.md +6 -6
- package/README.md +6 -6
- package/dist/bin/dingtalk-agent.js +81 -28
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/agent-audit.js +29 -25
- package/dist/src/agent-audit.js.map +1 -1
- package/dist/src/agent-definition.js +7 -3
- package/dist/src/agent-definition.js.map +1 -1
- package/dist/src/agent-enhance.js +2 -2
- package/dist/src/agent-enhance.js.map +1 -1
- package/dist/src/agent-platform.js +2 -2
- package/dist/src/agent-platform.js.map +1 -1
- package/dist/src/development-workspace.js +14 -9
- package/dist/src/development-workspace.js.map +1 -1
- package/dist/src/doctor.js +58 -7
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/opencode-evals.js +6 -6
- package/dist/src/opencode-evals.js.map +1 -1
- package/dist/src/opencode-provider.js +2 -2
- package/dist/src/opencode-provider.js.map +1 -1
- package/dist/src/opencode-workspace.js +3 -3
- package/dist/src/opencode-workspace.js.map +1 -1
- package/dist/src/personal-event-evals.js +4 -2
- package/dist/src/personal-event-evals.js.map +1 -1
- package/dist/src/remote-semantic-state-live-evals.js +5 -4
- package/dist/src/remote-semantic-state-live-evals.js.map +1 -1
- package/dist/src/remote-state-evals.js +2 -2
- package/dist/src/remote-state-evals.js.map +1 -1
- package/dist/src/robot-evals.js +3 -3
- package/dist/src/robot-evals.js.map +1 -1
- package/dist/src/schedule-plan.js +1 -1
- package/dist/src/schedule-plan.js.map +1 -1
- package/dist/src/sessions.js +1 -1
- package/dist/src/sessions.js.map +1 -1
- package/dist/src/skill-manager.js +141 -13
- package/dist/src/skill-manager.js.map +1 -1
- package/dist/src/workspace.js +2 -2
- package/dist/src/workspace.js.map +1 -1
- package/docs/ARCHITECTURE.md +9 -9
- package/docs/INSTALLATION.md +6 -6
- package/docs/SELF-TEST.md +3 -3
- package/docs/schemas/project.schema.json +2 -2
- package/examples/agents/README.md +1 -1
- package/examples/agents/fde-coach/agent/AGENTS.md +1 -1
- package/examples/agents/release-manager/agent/AGENTS.md +1 -1
- package/lab/agent-eval/catalog.json +5 -5
- package/lab/agent-eval/classic-failures.json +4 -4
- package/lab/agent-eval/completion-gate-regression.json +9 -9
- package/lab/agent-eval/personal-event-live.example.json +3 -3
- package/lab/agent-eval/remote-semantic-state-live.example.json +1 -1
- package/lab/agent-eval/workspace/opencode.json +2 -2
- package/lab/project-workspace/multica-readonly.fixture.json +2 -2
- package/lab/project-workspace/opencode-provider-suite.json +2 -2
- package/lab/project-workspace/project.fixture.json +1 -1
- package/lab/robot-eval/suite.json +1 -1
- package/lab/robot-eval/workspace/AGENTS.md +1 -1
- package/lab/robot-eval/workspace/opencode.json +2 -2
- package/lab/schemas/personal-event-eval.schema.json +1 -1
- package/package.json +7 -7
- package/skills/README.md +10 -7
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/SKILL.md +8 -8
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/AGENTS.template.md +1 -1
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/hosts/opencode/opencode.template.json +2 -2
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/evals/evals.json +3 -3
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/host-loading-contract.md +1 -1
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/claude-code.md +1 -1
- package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/opencode.md +2 -2
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/SKILL.md +2 -2
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/assets/eval-catalog.template.json +1 -1
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/evals/evals.json +1 -1
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/eval-topology.md +3 -3
- package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/interactive-debug-channels.md +1 -1
- package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/SKILL.md +2 -2
- package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/event-to-behavior.md +1 -1
- package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/COMPLETENESS.md +1 -1
- package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/SKILL.md +2 -2
- package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/config-binding.md +1 -1
- package/skills/platforms/deap/PLATFORM.md +1 -1
- package/skills/platforms/multica-dingtalk/PLATFORM.md +4 -4
- package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/SKILL.md +3 -3
- package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/SKILL.md +5 -5
- package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/bootstrap.sh +2 -2
- package/dist/src/map.js +0 -157
- package/dist/src/map.js.map +0 -1
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/REPOSITORY.template.md +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.local.template.json +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/role-skill.template.md +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/agent-definition-contract.md +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/drive-and-schedules.md +0 -0
- /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/storage-routing.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/evidence-contract.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/failure-to-case.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/local-connector-smoke.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/scenario-taxonomy.md +0 -0
- /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/storage-modes.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/task-checkpoint.json +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/action-contract.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/memory-and-evolution.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/perception-and-gates.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/risk-authority-and-privacy.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/runtime-modes.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/task-lifecycle.md +0 -0
- /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/truth-and-recovery.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/adapters.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/assembly-guidance.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/binding.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/cold-start.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/consent-and-visibility.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/consolidation.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/event-ingest.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/guided-setup.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/model.md +0 -0
- /package/skills/core/{dingtalk-people-group-memory → dta-people-group-memory}/references/storage-port.md +0 -0
- /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/multica-deployment-contract.md +0 -0
- /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/promotion-observation-contract.md +0 -0
- /package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/multica_ext.py +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skill-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// Skill 安装生命周期由开放生态的 `npx skills` 负责。\n// dingtalk-agent 只做两件事:把内置 Skill 目录交给上游 CLI;只读验证客户端能否发现。\n// 默认(不指定 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/ops 等)不在默认套装内,\n// 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。\n// 默认套装:所有机器都装的通用 Skill。\n// people-group-memory 属于默认套装而非可选包:它是标准能力,且**未绑定存储前完全惰性**\n// (零写入、零探测、零副作用),所以人人都装不会产生后果;用户主动要求时才绑定并激活。\nexport const BUNDLED_SKILL_NAMES = [\n GLOBAL_SKILL_NAME, 'dingtalk-agent-compose', 'dingtalk-agent-eval',\n 'dingtalk-people-group-memory',\n] as const\nexport const INSTALLABLE_SKILL_NAMES = [\n ...BUNDLED_SKILL_NAMES,\n 'dingtalk-agent-deploy-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-people-group-memory': 'skills/core/dingtalk-people-group-memory',\n 'dingtalk-agent-deploy-multica': 'skills/platforms/multica-dingtalk/dingtalk-agent-deploy-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"]}
|
|
1
|
+
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skill-manager.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,yDAAyD;AACzD,0EAA0E;AAE1E,OAAO,EACL,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GACnF,MAAM,SAAS,CAAA;AAChB,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,oBAAoB,CAAA;AACrD,sDAAsD;AACtD,uEAAuE;AACvE,wBAAwB;AACxB,yDAAyD;AACzD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB;IACxD,yBAAyB;CACjB,CAAA;AACV,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,GAAG,mBAAmB;IACtB,oBAAoB,EAAE,iBAAiB;CAC/B,CAAA;AAEV,8DAA8D;AAC9D,2DAA2D;AAC3D,MAAM,kBAAkB,GAA2B;IACjD,oBAAoB,EAAE,gCAAgC;IACtD,mBAAmB,EAAE,+BAA+B;IACpD,gBAAgB,EAAE,4BAA4B;IAC9C,yBAAyB,EAAE,qCAAqC;IAChE,oBAAoB,EAAE,sDAAsD;IAC5E,iBAAiB,EAAE,mDAAmD;CACvE,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;AAED,qDAAqD;AACrD,EAAE;AACF,4DAA4D;AAC5D,yDAAyD;AACzD,yCAAyC;AACzC,yCAAyC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,yBAAyB,EAAE,oBAAoB;IAC/C,wBAAwB,EAAE,mBAAmB;IAC7C,qBAAqB,EAAE,gBAAgB;IACvC,8BAA8B,EAAE,yBAAyB;IACzD,+BAA+B,EAAE,oBAAoB;IACrD,kBAAkB,EAAE,iBAAiB;CACtC,CAAA;AAED,MAAM,wBAAwB,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC;KAClE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;AAEnF;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,KAAK,iBAAiB,IAAI,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC9E,CAAC;AAED,iDAAiD;AACjD,gEAAgE;AAChE,qDAAqD;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,6BAA6B,CAAC,CAAA;AASlE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAI,GAAG,OAAO,EAAE;IAChD,MAAM,MAAM,GAAwB,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAAE,SAAQ;QACvE,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC7C,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;IAChE,CAAC;IACD,8CAA8C;IAC9C,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC7C,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QAClG,IAAI,IAAI,CAAA;QACR,IAAI,CAAC;YAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAQ;QAAC,CAAC;QACjD,0DAA0D;QAC1D,0DAA0D;QAC1D,gDAAgD;QAChD,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,UAAU,CAAC,IAAI,CAAC,CAAA;;YACtC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACnD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,oBAAoB,CAAC,IAAI,GAAG,OAAO,EAAE;IACnD,OAAO,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAC7B,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAA;IAC/E,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAC7B,MAAM,QAAQ,GAAwB,EAAE,CAAA;IACxC,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,CAAE,uBAA6C,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,SAAQ;QAClF,2CAA2C;QAC3C,gCAAgC;QAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;aAChF,YAAY,IAAI,EAAE,CAAC,CAAC,CAAA;IACzB,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;AAClD,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;AAkEnD,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,MAAM,KAAK,GAAG,OAAO,CAAC,mBAAmB;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACxE,OAAO,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,MAAM,KAAK,GAAG,OAAO,CAAC,mBAAmB;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACxE,OAAO,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAC5B,KAA6B,EAC7B,WAAmB,EACnB,OAA0C;IAE1C,MAAM,QAAQ,GAAG,2BAA2B,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAClE,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAA;IACjE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AACvE,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,wCAAwC;IACxC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA;IACxE,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;QACN,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,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,0CAA0C;IAC1C,oDAAoD;IACpD,MAAM,YAAY,GAAG,MAAM,KAAK,WAAW;QACzC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACpC,OAAO;QACL,GAAG,KAAK;QACR,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,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 {\n existsSync, lstatSync, readdirSync, readFileSync, readlinkSync, rmSync, unlinkSync,\n} 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 = 'dta-basic-behavior'\n// 默认套装:所有机器都装的通用 Skill。平台 Skill(deploy/ops 等)不在默认套装内,\n// 只有工作区通过 `dta agent-platform use` 选择对应 managed agent platform 时才按名安装。\n// 默认套装:所有机器都装的通用 Skill。\n// people-group-memory 属于默认套装而非可选包:它是标准能力,且**未绑定存储前完全惰性**\n// (零写入、零探测、零副作用),所以人人都装不会产生后果;用户主动要求时才绑定并激活。\nexport const BUNDLED_SKILL_NAMES = [\n GLOBAL_SKILL_NAME, 'dta-agent-compose', 'dta-agent-eval',\n 'dta-people-group-memory',\n] as const\nexport const INSTALLABLE_SKILL_NAMES = [\n ...BUNDLED_SKILL_NAMES,\n 'dta-deploy-multica', 'dta-ops-multica',\n] as const\n\n// 仓库/包内的 Skill 源码路径注册表:core 为通用套装,platforms/<platform> 按平台装填。\n// 安装后的 canonical 布局仍是扁平的 ~/.agents/skills/<name>;分层只存在于包内。\nconst BUNDLED_SKILL_DIRS: Record<string, string> = {\n 'dta-basic-behavior': 'skills/core/dta-basic-behavior',\n 'dta-agent-compose': 'skills/core/dta-agent-compose',\n 'dta-agent-eval': 'skills/core/dta-agent-eval',\n 'dta-people-group-memory': 'skills/core/dta-people-group-memory',\n 'dta-deploy-multica': 'skills/platforms/multica-dingtalk/dta-deploy-multica',\n 'dta-ops-multica': 'skills/platforms/multica-dingtalk/dta-ops-multica',\n}\n\n/** 解析包内 Skill 源码目录;未注册的名字回退到历史扁平布局。 */\nexport function bundledSkillPath(packageRoot: string, name: string): string {\n return join(packageRoot, BUNDLED_SKILL_DIRS[name] || join('skills', name))\n}\n\n// 改名前的旧名 → 现名。一方 Skill 在 0.1.5-beta.7 统一到 `dta-` 前缀。\n//\n// ~/.agents/skills/ 是**扁平共享目录**:改名后 install 会装出新名目录,旧名目录却原地\n// 不动,于是三个 Host 会同时发现两份 description 几乎一样的 Skill,触发哪一份不确定。\n// 旧副本没有任何保留价值——它是本包发布的、已被取代的同一份东西——所以直接在\n// install/upgrade 时删掉,不做「先警告再等用户确认」的两段式。\nexport const LEGACY_SKILL_RENAMES: Record<string, string> = {\n 'dingtalk-basic-behavior': 'dta-basic-behavior',\n 'dingtalk-agent-compose': 'dta-agent-compose',\n 'dingtalk-agent-eval': 'dta-agent-eval',\n 'dingtalk-people-group-memory': 'dta-people-group-memory',\n 'dingtalk-agent-deploy-multica': 'dta-deploy-multica',\n 'multica-external': 'dta-ops-multica',\n}\n\nconst LEGACY_BASIC_SKILL_NAMES = Object.entries(LEGACY_SKILL_RENAMES)\n .filter(([, current]) => current === GLOBAL_SKILL_NAME).map(([legacy]) => legacy)\n\n/**\n * 声明的名字是否指向 Basic Skill(含改名前的旧名)。\n *\n * 只放宽「是不是 Basic」的判定,**不做名字归一化**:调用方必须继续用声明的原名解析\n * 路径,否则用户仓库里已 check-in 的 `agent/skills/dingtalk-basic-behavior/` 会解析不到。\n */\nexport function isBasicSkillName(name: string): boolean {\n return name === GLOBAL_SKILL_NAME || LEGACY_BASIC_SKILL_NAMES.includes(name)\n}\n\n// 已经从包里删除、且没有替代品的 Skill。它们不会被任何 install 装回来,也就永远\n// 不会自己消失:`dingtalk-agent-boot-multica` 在 0.1.5-beta.2 就已移除,却仍留在\n// 机器上并通过 ~/.claude/skills 的符号链继续作为可用 Skill 暴露给 Host。\nexport const REMOVED_SKILL_NAMES = ['dingtalk-agent-boot-multica']\n\nexport interface PrunedLegacySkill {\n name: string\n /** 已停用且无替代品时为空字符串。 */\n replacedBy: string\n removed: string[]\n}\n\n/**\n * 删除改名前留在本机的旧名副本。install/upgrade 每次都调用,幂等。\n *\n * 只碰 LEGACY_SKILL_RENAMES 里登记过的名字,且只在本包自己的两个安装位置下操作——\n * 不接受外部传名,避免这个函数退化成任意目录删除器。\n *\n * **前置条件是现名副本已经落地**,不是「调用顺序排在 install 后面」。两者不等价:\n * 平台 Skill(deploy/ops)不在默认套装里,`skill install` 根本不会装它们,若按调用\n * 顺序推断就会把只装过 multica-external 的机器删成两手空空。以现名 canonical 是否\n * 存在为闸门,这类顺序推理错误就不可能发生——没装上就一定不删。\n */\nexport function pruneLegacySkills(home = homedir()): PrunedLegacySkill[] {\n const pruned: PrunedLegacySkill[] = []\n for (const [name, replacedBy] of Object.entries(LEGACY_SKILL_RENAMES)) {\n if (!isDirectory(join(home, '.agents', 'skills', replacedBy))) continue\n const removed = removeSkillCopies(home, name)\n if (removed.length) pruned.push({ name, replacedBy, removed })\n }\n // 停用的 Skill 没有「现名已落地」这道闸门可用——它本来就不该再存在于任何机器上。\n for (const name of REMOVED_SKILL_NAMES) {\n const removed = removeSkillCopies(home, name)\n if (removed.length) pruned.push({ name, replacedBy: '', removed })\n }\n return pruned\n}\n\nfunction removeSkillCopies(home: string, name: string): string[] {\n const removed: string[] = []\n for (const path of [join(home, '.agents', 'skills', name), join(home, '.claude', 'skills', name)]) {\n let stat\n try { stat = lstatSync(path) } catch { continue }\n // 符号链接必须 unlink。canonical 先删、exposure 后删,到这一步 Claude 那条链接\n // 已经悬空,而 rmSync 是按**目标**去 stat 的:ENOENT 被 force 当成「本来就没有」\n // 吞掉,链接原地不动。于是 Host 继续看得见这个 Skill,每轮清理还会重复上报一次。\n if (stat.isSymbolicLink()) unlinkSync(path)\n else rmSync(path, { recursive: true, force: true })\n removed.push(path)\n }\n return removed\n}\n\n/** 旧名还装着、现名却没装上的 Skill。它们卡在半路,不会自己往前走。 */\nexport function strandedLegacySkills(home = homedir()): Array<{ name: string; replacedBy: string }> {\n return Object.entries(LEGACY_SKILL_RENAMES)\n .filter(([name, replacedBy]) =>\n pathExists(join(home, '.agents', 'skills', name)) &&\n !isDirectory(join(home, '.agents', 'skills', replacedBy)))\n .map(([name, replacedBy]) => ({ name, replacedBy }))\n}\n\n/**\n * 把卡在旧名上的 Skill 真正迁移过去:先装现名,再删旧名。\n *\n * 只对**本机已经装了旧名**的 Skill 动作,所以它保留用户既有的能力,而不是凭空多装\n * 东西。平台 Skill(deploy/ops)不在默认套装里,光靠 `skill install` 永远等不到自己\n * 的替代品——没有这一步,升级完它们就永久停在改名前的陈旧副本上,且无人告知。\n */\nexport function migrateStrandedLegacySkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): PrunedLegacySkill[] {\n const home = options.home || options.env?.HOME || process.env.HOME || homedir()\n if (options.dryRun) return []\n const migrated: PrunedLegacySkill[] = []\n for (const { replacedBy } of strandedLegacySkills(home)) {\n if (!(INSTALLABLE_SKILL_NAMES as readonly string[]).includes(replacedBy)) continue\n // 装现名的那一步内部就会清掉对应旧名,报告在它的 status 上——必须收下来,\n // 否则迁移做了却没人说,正是「静默删目录」要避免的那种沉默。\n migrated.push(...(installGlobalSkill(packageRoot, { ...options, name: replacedBy })\n .prunedLegacy || []))\n }\n return [...migrated, ...pruneLegacySkills(home)]\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 /** 本次 install/upgrade 顺带清掉的改名前旧副本(现名落地后才会有)。 */\n prunedLegacy?: PrunedLegacySkill[]\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 /** 本次 install/upgrade 顺带清掉的改名前旧副本;status/uninstall 不返回此字段。 */\n prunedLegacy?: PrunedLegacySkill[]\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 const suite = suiteOf(BUNDLED_SKILL_NAMES\n .map((name) => installGlobalSkill(packageRoot, { ...options, name })))\n return withStrandedMigration(suite, packageRoot, options)\n}\n\nexport function upgradeBundledSkills(\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'> = {},\n): GlobalSkillSuiteStatus {\n const suite = suiteOf(BUNDLED_SKILL_NAMES\n .map((name) => upgradeGlobalSkill(packageRoot, { ...options, name })))\n return withStrandedMigration(suite, packageRoot, options)\n}\n\n/**\n * 套装装完之后再补一轮:默认套装只覆盖 core,卡在旧名上的平台 Skill 只能在这里\n * 被带过去,否则升级完就永久停在改名前的副本上。\n */\nfunction withStrandedMigration(\n suite: GlobalSkillSuiteStatus,\n packageRoot: string,\n options: Omit<SkillManagerOptions, 'name'>,\n): GlobalSkillSuiteStatus {\n const migrated = migrateStrandedLegacySkills(packageRoot, options)\n const prunedLegacy = [...(suite.prunedLegacy || []), ...migrated]\n return { ...suite, ...(prunedLegacy.length ? { prunedLegacy } : {}) }\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 // 每个 Skill 装完各自清理各自的旧名,套装层只做汇总,不再重复扫一遍。\n const prunedLegacy = skills.flatMap((skill) => skill.prunedLegacy || [])\n return {\n $schema: 'dingtalk-agent/skill-status-suite@1',\n manager: 'skills-cli',\n names: skills.map((skill) => skill.name),\n skills,\n ...(prunedLegacy.length ? { prunedLegacy } : {}),\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 // 回读确认现名到位之后才清旧名。放在这一层而不是套装层,是为了让平台 Skill\n // (只经 `agent-platform use` 按名安装)走同一条清理路径,不必各自记得调一次。\n const prunedLegacy = action === 'uninstall'\n ? [] : pruneLegacySkills(env.HOME)\n return {\n ...after,\n ...(prunedLegacy.length ? { prunedLegacy } : {}),\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"]}
|
package/dist/src/workspace.js
CHANGED
|
@@ -33,7 +33,7 @@ export function ensureWorkspace(root, options = {}) {
|
|
|
33
33
|
dws: { profile: '', expectedUserId: '' },
|
|
34
34
|
// 用 Skill name 声明,不把 Workspace 绑死到某个物理安装目录。
|
|
35
35
|
// Resolver 依次查 Workspace override、全局安装和 npm 内置版本。
|
|
36
|
-
skills: ['
|
|
36
|
+
skills: ['dta-basic-behavior', ...discoverLocalSkillNames(root, skillsRef)],
|
|
37
37
|
mounts: {
|
|
38
38
|
profile: `local-md:${profileRef}`,
|
|
39
39
|
memory: options.memory || 'local-md:MEMORY.md',
|
|
@@ -192,7 +192,7 @@ function discoverLocalSkillNames(root, skillsRef) {
|
|
|
192
192
|
if (name !== entry.name) {
|
|
193
193
|
throw new Error(`本地 Role Skill 目录名与 name 不一致: ${entry.name} != ${name}`);
|
|
194
194
|
}
|
|
195
|
-
if (name !== '
|
|
195
|
+
if (name !== 'dta-basic-behavior')
|
|
196
196
|
names.push(name);
|
|
197
197
|
}
|
|
198
198
|
return [...new Set(names)].sort();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/workspace.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent Workspace:一个物理目录对应一个稳定 Context/Field。\n// 人和模型读取 Markdown;机器控制状态仍留在宿主私有 JSON 中。\n\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, writeFileSync,\n} from 'node:fs'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\nimport { digest } from './events.js'\nimport * as dws from './dws.js'\n\nexport const WORKSPACE_FILE = '.dingtalk-agent/workspace.json'\n\nexport interface WorkspaceSpec {\n $schema: 'dingtalk-agent/workspace@1'\n id: string\n contextId: string\n fieldId: string\n dws: { profile: string; expectedUserId: string }\n skills: string[]\n mounts: Record<'profile' | 'memory' | 'knowledge' | 'skills', string>\n}\n\nexport interface WorkspaceInitOptions {\n contextId?: string\n id?: string\n memory?: string\n knowledge?: string\n}\n\nexport interface MountSnapshot {\n slot: string\n provider: 'local-md' | 'local-dir' | 'dingtalk-doc'\n source: string\n snapshotPath: string\n hash: string\n}\n\nexport function workspacePath(root: string): string {\n return join(root, WORKSPACE_FILE)\n}\n\nexport function ensureWorkspace(\n root: string,\n options: WorkspaceInitOptions = {},\n): WorkspaceSpec {\n const path = workspacePath(root)\n if (existsSync(path)) {\n const current = loadWorkspace(root)\n if (options.contextId && options.contextId !== current.contextId) {\n throw new Error(\n `当前目录已绑定 contextId=${current.contextId};一个物理 Workspace 不能重新绑定为 ${options.contextId}`,\n )\n }\n return current\n }\n\n const contextId = clean(options.contextId || basename(resolve(root)) || 'default')\n const id = clean(options.id || contextId)\n const packagedDefinition = existsSync(join(root, 'agent', 'AGENTS.md'))\n const profileRef = packagedDefinition\n ? 'agent/AGENTS.md'\n : existsSync(join(root, 'AGENTS.md')) ? 'AGENTS.md' : 'WORKSPACE.md'\n const skillsRef = existsSync(join(root, 'agent', 'skills'))\n ? 'agent/skills' : 'skills'\n const spec: WorkspaceSpec = {\n $schema: 'dingtalk-agent/workspace@1',\n id,\n contextId,\n fieldId: 'default',\n dws: { profile: '', expectedUserId: '' },\n // 用 Skill name 声明,不把 Workspace 绑死到某个物理安装目录。\n // Resolver 依次查 Workspace override、全局安装和 npm 内置版本。\n skills: ['dingtalk-basic-behavior', ...discoverLocalSkillNames(root, skillsRef)],\n mounts: {\n profile: `local-md:${profileRef}`,\n memory: options.memory || 'local-md:MEMORY.md',\n knowledge: options.knowledge || 'local-md:knowledge/INDEX.md',\n skills: `local-dir:${skillsRef}`,\n },\n }\n\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(spec, null, 2) + '\\n', { flag: 'wx' })\n writeDefaultMarkdown(root, spec)\n for (const dir of ['.dingtalk-agent/cache', '.dingtalk-agent/pending']) {\n mkdirSync(join(root, dir), { recursive: true })\n }\n return spec\n}\n\nexport function loadWorkspace(root: string): WorkspaceSpec {\n const path = workspacePath(root)\n if (!existsSync(path)) {\n throw new Error(\n '缺少 .dingtalk-agent/workspace.json;只有 Prepared Run runtime 才需要 `dingtalk-agent init`。' +\n '普通 Agent Session 请使用全局 Skill,按需运行 `dingtalk-agent bootstrap`。',\n )\n }\n let value: unknown\n try { value = JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`Workspace manifest 不是合法 JSON: ${error.message}`) }\n return validateWorkspace(value)\n}\n\nexport function resolveContextId(spec: WorkspaceSpec, supplied = ''): string {\n const contextId = clean(supplied || spec.contextId)\n if (contextId !== spec.contextId) {\n throw new Error(\n `contextId=${contextId} 不属于当前 Workspace(期望 ${spec.contextId});请由上游选择正确工作目录`,\n )\n }\n return contextId\n}\n\n/**\n * Provider 只负责把语义内容冻结成本地 Markdown;锁、Wait、去重和 Receipt 不走这里。\n * dingtalk-doc 只读显式 node,不搜索、不创建、不覆盖。\n */\nexport function snapshotWorkspaceMounts(\n root: string,\n runPath: string,\n spec: WorkspaceSpec,\n): MountSnapshot[] {\n const destination = join(runPath, 'context', 'mounts')\n mkdirSync(destination, { recursive: true })\n const snapshots: MountSnapshot[] = []\n\n for (const [slot, uri] of Object.entries(spec.mounts)) {\n const mount = parseMount(uri)\n if (mount.provider === 'local-dir') {\n // skills 是逻辑槽:实际内容由 Skill resolver 从 Workspace override、\n // 全局目录或 npm 内置版本解析并在 Session 创建时冻结。\n if (slot !== 'skills') safeLocalPath(root, mount.ref)\n snapshots.push({\n slot, provider: mount.provider, source: uri,\n // P0 的目录型 mount 只有 skills;真实内容由 Session 绑定并冻结到这里。\n snapshotPath: slot === 'skills' ? 'context/skills' : '', hash: '',\n })\n continue\n }\n\n const markdown = mount.provider === 'local-md'\n ? readFileSync(safeLocalPath(root, mount.ref), 'utf8')\n : String(dws.readDoc(mount.ref, spec.dws.profile))\n const path = join(destination, `${safeName(slot)}.md`)\n writeFileSync(path, markdown.endsWith('\\n') ? markdown : markdown + '\\n')\n snapshots.push({\n slot,\n provider: mount.provider,\n source: uri,\n snapshotPath: relative(runPath, path).split('\\\\').join('/'),\n hash: digest(markdown),\n })\n }\n\n writeFileSync(\n join(destination, 'manifest.json'),\n JSON.stringify({ $schema: 'dingtalk-agent/mount-snapshot@1', entries: snapshots }, null, 2) + '\\n',\n )\n return snapshots\n}\n\nfunction validateWorkspace(value: unknown): WorkspaceSpec {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Workspace manifest 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/workspace@1') {\n throw new Error('Workspace manifest 缺少 dingtalk-agent/workspace@1 schema')\n }\n for (const key of ['id', 'contextId', 'fieldId']) {\n if (!clean(input[key])) throw new Error(`Workspace manifest 缺少 ${key}`)\n }\n if (!Array.isArray(input.skills) || input.skills.some((item: unknown) => typeof item !== 'string')) {\n throw new Error('Workspace skills 必须是 string[]')\n }\n if (!input.dws || typeof input.dws.profile !== 'string' ||\n typeof input.dws.expectedUserId !== 'string') {\n throw new Error('Workspace dws 必须包含 string profile / expectedUserId')\n }\n const requiredSlots = ['profile', 'memory', 'knowledge', 'skills']\n if (!input.mounts || requiredSlots.some((slot) => typeof input.mounts[slot] !== 'string')) {\n throw new Error(`Workspace mounts 必须包含 ${requiredSlots.join(' / ')}`)\n }\n for (const uri of Object.values(input.mounts)) parseMount(String(uri))\n return input as WorkspaceSpec\n}\n\nfunction parseMount(uri: string): {\n provider: 'local-md' | 'local-dir' | 'dingtalk-doc'\n ref: string\n} {\n const separator = uri.indexOf(':')\n const provider = uri.slice(0, separator)\n const ref = separator >= 0 ? uri.slice(separator + 1).trim() : ''\n if (!['local-md', 'local-dir', 'dingtalk-doc'].includes(provider) || !ref) {\n throw new Error(`不支持的 Workspace mount: ${uri}`)\n }\n return { provider: provider as 'local-md' | 'local-dir' | 'dingtalk-doc', ref }\n}\n\nfunction safeLocalPath(root: string, ref: string): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n if (!existsSync(candidate)) throw new Error(`Workspace mount 不存在: ${ref}`)\n const actual = realpathSync(candidate)\n const rel = relative(rootReal, actual)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Workspace local mount 必须位于当前目录内: ${ref}`)\n }\n return actual\n}\n\nfunction writeDefaultMarkdown(root: string, spec: WorkspaceSpec): void {\n const files: Array<[string, string]> = [\n ['WORKSPACE.md', `# Agent Workspace\\n\\n- Context ID: ${spec.contextId}\\n- Workspace: ${spec.id}\\n- Field: ${spec.fieldId}\\n\\n这里定义稳定的身份、职责、协作边界和内容挂载。\\n`],\n ['MEMORY.md', '# Long-term Memory\\n\\n只保存经过筛选、带来源的长期记忆。当前事项放在 Session memory。\\n'],\n ['knowledge/INDEX.md', '# Knowledge Index\\n\\n按需列出本 Workspace 可用的知识入口。\\n'],\n ]\n for (const [rel, content] of files) {\n const path = join(root, rel)\n mkdirSync(dirname(path), { recursive: true })\n if (!existsSync(path)) writeFileSync(path, content)\n }\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-')\n}\n\nfunction discoverLocalSkillNames(root: string, skillsRef: string): string[] {\n const directory = join(root, skillsRef)\n if (!existsSync(directory) || !lstatSync(directory).isDirectory()) return []\n const names: string[] = []\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue\n const path = join(directory, entry.name, 'SKILL.md')\n if (!existsSync(path)) continue\n const markdown = readFileSync(path, 'utf8')\n const frontmatter = markdown.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)?.[1] || ''\n const name = frontmatter.match(/^name:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)?.[1]?.trim() || ''\n if (!name) throw new Error(`本地 Role Skill 缺少 frontmatter name: ${path}`)\n if (name !== entry.name) {\n throw new Error(`本地 Role Skill 目录名与 name 不一致: ${entry.name} != ${name}`)\n }\n if (name !== 'dingtalk-basic-behavior') names.push(name)\n }\n return [...new Set(names)].sort()\n}\n\nfunction clean(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/workspace.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent Workspace:一个物理目录对应一个稳定 Context/Field。\n// 人和模型读取 Markdown;机器控制状态仍留在宿主私有 JSON 中。\n\nimport {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, writeFileSync,\n} from 'node:fs'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\nimport { digest } from './events.js'\nimport * as dws from './dws.js'\n\nexport const WORKSPACE_FILE = '.dingtalk-agent/workspace.json'\n\nexport interface WorkspaceSpec {\n $schema: 'dingtalk-agent/workspace@1'\n id: string\n contextId: string\n fieldId: string\n dws: { profile: string; expectedUserId: string }\n skills: string[]\n mounts: Record<'profile' | 'memory' | 'knowledge' | 'skills', string>\n}\n\nexport interface WorkspaceInitOptions {\n contextId?: string\n id?: string\n memory?: string\n knowledge?: string\n}\n\nexport interface MountSnapshot {\n slot: string\n provider: 'local-md' | 'local-dir' | 'dingtalk-doc'\n source: string\n snapshotPath: string\n hash: string\n}\n\nexport function workspacePath(root: string): string {\n return join(root, WORKSPACE_FILE)\n}\n\nexport function ensureWorkspace(\n root: string,\n options: WorkspaceInitOptions = {},\n): WorkspaceSpec {\n const path = workspacePath(root)\n if (existsSync(path)) {\n const current = loadWorkspace(root)\n if (options.contextId && options.contextId !== current.contextId) {\n throw new Error(\n `当前目录已绑定 contextId=${current.contextId};一个物理 Workspace 不能重新绑定为 ${options.contextId}`,\n )\n }\n return current\n }\n\n const contextId = clean(options.contextId || basename(resolve(root)) || 'default')\n const id = clean(options.id || contextId)\n const packagedDefinition = existsSync(join(root, 'agent', 'AGENTS.md'))\n const profileRef = packagedDefinition\n ? 'agent/AGENTS.md'\n : existsSync(join(root, 'AGENTS.md')) ? 'AGENTS.md' : 'WORKSPACE.md'\n const skillsRef = existsSync(join(root, 'agent', 'skills'))\n ? 'agent/skills' : 'skills'\n const spec: WorkspaceSpec = {\n $schema: 'dingtalk-agent/workspace@1',\n id,\n contextId,\n fieldId: 'default',\n dws: { profile: '', expectedUserId: '' },\n // 用 Skill name 声明,不把 Workspace 绑死到某个物理安装目录。\n // Resolver 依次查 Workspace override、全局安装和 npm 内置版本。\n skills: ['dta-basic-behavior', ...discoverLocalSkillNames(root, skillsRef)],\n mounts: {\n profile: `local-md:${profileRef}`,\n memory: options.memory || 'local-md:MEMORY.md',\n knowledge: options.knowledge || 'local-md:knowledge/INDEX.md',\n skills: `local-dir:${skillsRef}`,\n },\n }\n\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(spec, null, 2) + '\\n', { flag: 'wx' })\n writeDefaultMarkdown(root, spec)\n for (const dir of ['.dingtalk-agent/cache', '.dingtalk-agent/pending']) {\n mkdirSync(join(root, dir), { recursive: true })\n }\n return spec\n}\n\nexport function loadWorkspace(root: string): WorkspaceSpec {\n const path = workspacePath(root)\n if (!existsSync(path)) {\n throw new Error(\n '缺少 .dingtalk-agent/workspace.json;只有 Prepared Run runtime 才需要 `dingtalk-agent init`。' +\n '普通 Agent Session 请使用全局 Skill,按需运行 `dingtalk-agent bootstrap`。',\n )\n }\n let value: unknown\n try { value = JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`Workspace manifest 不是合法 JSON: ${error.message}`) }\n return validateWorkspace(value)\n}\n\nexport function resolveContextId(spec: WorkspaceSpec, supplied = ''): string {\n const contextId = clean(supplied || spec.contextId)\n if (contextId !== spec.contextId) {\n throw new Error(\n `contextId=${contextId} 不属于当前 Workspace(期望 ${spec.contextId});请由上游选择正确工作目录`,\n )\n }\n return contextId\n}\n\n/**\n * Provider 只负责把语义内容冻结成本地 Markdown;锁、Wait、去重和 Receipt 不走这里。\n * dingtalk-doc 只读显式 node,不搜索、不创建、不覆盖。\n */\nexport function snapshotWorkspaceMounts(\n root: string,\n runPath: string,\n spec: WorkspaceSpec,\n): MountSnapshot[] {\n const destination = join(runPath, 'context', 'mounts')\n mkdirSync(destination, { recursive: true })\n const snapshots: MountSnapshot[] = []\n\n for (const [slot, uri] of Object.entries(spec.mounts)) {\n const mount = parseMount(uri)\n if (mount.provider === 'local-dir') {\n // skills 是逻辑槽:实际内容由 Skill resolver 从 Workspace override、\n // 全局目录或 npm 内置版本解析并在 Session 创建时冻结。\n if (slot !== 'skills') safeLocalPath(root, mount.ref)\n snapshots.push({\n slot, provider: mount.provider, source: uri,\n // P0 的目录型 mount 只有 skills;真实内容由 Session 绑定并冻结到这里。\n snapshotPath: slot === 'skills' ? 'context/skills' : '', hash: '',\n })\n continue\n }\n\n const markdown = mount.provider === 'local-md'\n ? readFileSync(safeLocalPath(root, mount.ref), 'utf8')\n : String(dws.readDoc(mount.ref, spec.dws.profile))\n const path = join(destination, `${safeName(slot)}.md`)\n writeFileSync(path, markdown.endsWith('\\n') ? markdown : markdown + '\\n')\n snapshots.push({\n slot,\n provider: mount.provider,\n source: uri,\n snapshotPath: relative(runPath, path).split('\\\\').join('/'),\n hash: digest(markdown),\n })\n }\n\n writeFileSync(\n join(destination, 'manifest.json'),\n JSON.stringify({ $schema: 'dingtalk-agent/mount-snapshot@1', entries: snapshots }, null, 2) + '\\n',\n )\n return snapshots\n}\n\nfunction validateWorkspace(value: unknown): WorkspaceSpec {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Workspace manifest 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/workspace@1') {\n throw new Error('Workspace manifest 缺少 dingtalk-agent/workspace@1 schema')\n }\n for (const key of ['id', 'contextId', 'fieldId']) {\n if (!clean(input[key])) throw new Error(`Workspace manifest 缺少 ${key}`)\n }\n if (!Array.isArray(input.skills) || input.skills.some((item: unknown) => typeof item !== 'string')) {\n throw new Error('Workspace skills 必须是 string[]')\n }\n if (!input.dws || typeof input.dws.profile !== 'string' ||\n typeof input.dws.expectedUserId !== 'string') {\n throw new Error('Workspace dws 必须包含 string profile / expectedUserId')\n }\n const requiredSlots = ['profile', 'memory', 'knowledge', 'skills']\n if (!input.mounts || requiredSlots.some((slot) => typeof input.mounts[slot] !== 'string')) {\n throw new Error(`Workspace mounts 必须包含 ${requiredSlots.join(' / ')}`)\n }\n for (const uri of Object.values(input.mounts)) parseMount(String(uri))\n return input as WorkspaceSpec\n}\n\nfunction parseMount(uri: string): {\n provider: 'local-md' | 'local-dir' | 'dingtalk-doc'\n ref: string\n} {\n const separator = uri.indexOf(':')\n const provider = uri.slice(0, separator)\n const ref = separator >= 0 ? uri.slice(separator + 1).trim() : ''\n if (!['local-md', 'local-dir', 'dingtalk-doc'].includes(provider) || !ref) {\n throw new Error(`不支持的 Workspace mount: ${uri}`)\n }\n return { provider: provider as 'local-md' | 'local-dir' | 'dingtalk-doc', ref }\n}\n\nfunction safeLocalPath(root: string, ref: string): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, ref)\n if (!existsSync(candidate)) throw new Error(`Workspace mount 不存在: ${ref}`)\n const actual = realpathSync(candidate)\n const rel = relative(rootReal, actual)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Workspace local mount 必须位于当前目录内: ${ref}`)\n }\n return actual\n}\n\nfunction writeDefaultMarkdown(root: string, spec: WorkspaceSpec): void {\n const files: Array<[string, string]> = [\n ['WORKSPACE.md', `# Agent Workspace\\n\\n- Context ID: ${spec.contextId}\\n- Workspace: ${spec.id}\\n- Field: ${spec.fieldId}\\n\\n这里定义稳定的身份、职责、协作边界和内容挂载。\\n`],\n ['MEMORY.md', '# Long-term Memory\\n\\n只保存经过筛选、带来源的长期记忆。当前事项放在 Session memory。\\n'],\n ['knowledge/INDEX.md', '# Knowledge Index\\n\\n按需列出本 Workspace 可用的知识入口。\\n'],\n ]\n for (const [rel, content] of files) {\n const path = join(root, rel)\n mkdirSync(dirname(path), { recursive: true })\n if (!existsSync(path)) writeFileSync(path, content)\n }\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-')\n}\n\nfunction discoverLocalSkillNames(root: string, skillsRef: string): string[] {\n const directory = join(root, skillsRef)\n if (!existsSync(directory) || !lstatSync(directory).isDirectory()) return []\n const names: string[] = []\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue\n const path = join(directory, entry.name, 'SKILL.md')\n if (!existsSync(path)) continue\n const markdown = readFileSync(path, 'utf8')\n const frontmatter = markdown.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)?.[1] || ''\n const name = frontmatter.match(/^name:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m)?.[1]?.trim() || ''\n if (!name) throw new Error(`本地 Role Skill 缺少 frontmatter name: ${path}`)\n if (name !== entry.name) {\n throw new Error(`本地 Role Skill 目录名与 name 不一致: ${entry.name} != ${name}`)\n }\n if (name !== 'dta-basic-behavior') names.push(name)\n }\n return [...new Set(names)].sort()\n}\n\nfunction clean(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
本文回答四个问题:**一个数字员工是什么**、**它由什么构成**、**每件事谁说了算**、**这个仓库分成哪几部分、各解决什么问题**。
|
|
4
4
|
|
|
5
|
-
本文不写:安装与升级(见 [Installation](INSTALLATION.md))、评测方法与证据分层(见 [Self-test](SELF-TEST.md))、Agent 的行为协议(见 [Basic Behavior Skill](../skills/core/
|
|
5
|
+
本文不写:安装与升级(见 [Installation](INSTALLATION.md))、评测方法与证据分层(见 [Self-test](SELF-TEST.md))、Agent 的行为协议(见 [Basic Behavior Skill](../skills/core/dta-basic-behavior/SKILL.md))、发布历史(见 [CHANGELOG](../CHANGELOG.md))、进行中的工作(见 [roadmap](roadmap/))。
|
|
6
6
|
|
|
7
7
|

|
|
8
8
|
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
| 部件 | 回答什么 | 落在哪 | 谁生成 / 谁校验 |
|
|
66
66
|
|---|---|---|---|
|
|
67
67
|
| **本体 Definition** | 我是谁、服务谁、岗位底线、做事范式、常犯错误 | `agent/AGENTS.md` | `agent enhance` 生成骨架;`agent audit` 校验语义占位符是否已填 |
|
|
68
|
-
| **公共行为** | 何时响应、如何追问、何时沉默、如何收口 | `agent/skills/
|
|
68
|
+
| **公共行为** | 何时响应、如何追问、何时沉默、如何收口 | `agent/skills/dta-basic-behavior` | 内核内置;`agent audit --verify-load` 证明它真被加载 |
|
|
69
69
|
| **岗位能力** | 某个岗位的方法、SOP、禁区、验收标准 | `agent/skills/<role>/SKILL.md` | 开发者编写;`--require-skill` 校验存在与加载 |
|
|
70
70
|
| **存储路由** | 长期内容与私有控制状态各自去哪 | `agent.bindings.json`(可选) | `bootstrap` 归一成 `agent-definition@1`;缺省时按宿主 context > 环境变量 > Workspace manifest > 目录约定依次解析 |
|
|
71
71
|
|
|
@@ -131,7 +131,7 @@ Host 原生发现目录不是发布源。OpenCode 的 `.agents/skills/`、Claude
|
|
|
131
131
|
- **外发类节律的留痕在动作之后,所以它没有锁。** 两个节律落在同一分钟并发唤醒,就会把同一条消息发两遍给第三方。多节律拆分必须错开触发时刻。
|
|
132
132
|
- **Agent 不自建定时器、不自改节律。** 节律是可审计的部署产物;在线 Run 只能把新节律整理成候选交给 operator,不能自己配上再宣称配好了——这与 §1「在线 Run 不能热改身份、权限或已启用 Skill」是同一条边界的延伸。
|
|
133
133
|
|
|
134
|
-
**本仓库在这一层拥有什么**:不拥有 cron,拥有三件事——装配时**声明**需要哪些节律与是否允许 Agent 自主排程(`
|
|
134
|
+
**本仓库在这一层拥有什么**:不拥有 cron,拥有三件事——装配时**声明**需要哪些节律与是否允许 Agent 自主排程(`dta-agent-compose`);部署到具体平台时**校验**该平台是否真的提供这些能力、不提供就 fail closed(平台 Skill 包 + `agent-platform` 注册表);以及 Agent 侧被定时驱动时必须满足的**行为合同**(`dta-basic-behavior`)。**平台之间能力不同是常态**——同一个 Agent 的节律声明可以不变,能不能被满足由目标平台回答。
|
|
135
135
|
|
|
136
136
|
## 4. 谁拦住什么:Skill 劝,CLI 拦,DWS 做
|
|
137
137
|
|
|
@@ -159,7 +159,7 @@ Host 原生发现目录不是发布源。OpenCode 的 `.agents/skills/`、Claude
|
|
|
159
159
|
|
|
160
160
|
**Field** 是一个稳定的协作与权限边界:它声明这一摊事归谁、用哪个 DWS 身份出口、允许对哪些人和会话行动。一个 Workspace 可以有多个 Field;Session 创建时从中取走冻结副本,正文和在线 Run 都改不了它。默认模板见 `templates/fields/default/field.json`。
|
|
161
161
|
|
|
162
|
-
三种模式的判定顺序与检测流程由 [Basic Behavior](../skills/core/
|
|
162
|
+
三种模式的判定顺序与检测流程由 [Basic Behavior](../skills/core/dta-basic-behavior/SKILL.md) 拥有;`init` 与 `bootstrap`、`setup` 的分工见 [Installation](INSTALLATION.md)。
|
|
163
163
|
|
|
164
164
|
Prepared Run 只有四个公开对象:
|
|
165
165
|
|
|
@@ -230,9 +230,9 @@ dingtalk-doc:<node-or-url> DWS 拉取在线文档的只读快照
|
|
|
230
230
|
| 部分 | 解决什么问题 | `src/` 模块 | 主要 CLI | 关联 Skill | ≈行数 |
|
|
231
231
|
|---|---|---|---|---|---|
|
|
232
232
|
| **1 行为内核** | 把一个外部事件变成"能不能回应、回应给谁、这次允许做什么"的确定性判断,并保证同一事件不被处理两次 | `events` `invocation` `perception` `response-gate` `sessions` `waits` `actions` `fields` `config` `lease` `driver` `workspace` `skills` `types` | `prepare` `run` `dispatch` `act` `listen` | — | 4.0k |
|
|
233
|
-
| **2 装配与审计** | 让一个仓库、文件夹或钉钉文档变成可 hash、可继承的 Agent,并证明 Skill 真被加载而不只是文件存在 | `agent-definition` `agent-bindings` `bootstrap` `agent-audit` `agent-enhance` `instruction-path` | `bootstrap` `agent enhance` `agent audit` `info` | `
|
|
233
|
+
| **2 装配与审计** | 让一个仓库、文件夹或钉钉文档变成可 hash、可继承的 Agent,并证明 Skill 真被加载而不只是文件存在 | `agent-definition` `agent-bindings` `bootstrap` `agent-audit` `agent-enhance` `instruction-path` | `bootstrap` `agent enhance` `agent audit` `info` | `dta-agent-compose` | 3.4k |
|
|
234
234
|
| **3 交付链** | 把本地通过的版本,在不改身份和权限的前提下受控放上托管平台,每一步都能独立回读 | `development-workspace` `opencode-*` `multica-*` `promotion` `agent-platform` | `agent-platform` `workspace *` `deploy` `promote` `observe` | multica 平台包 ×3 | 6.4k |
|
|
235
|
-
| **4 评测与证据** | 在花钱、外发和上线之前,用最低成本的层级证明它真会做事;失败沉淀成可复跑场景而不是一次口头修正 | `lab` `robot-evals` `opencode-evals` `remote-state-evals` `remote-semantic-state-*` `personal-event-evals` `storage-evals` `eval-evidence` | `lab *` `workspace eval` | `
|
|
235
|
+
| **4 评测与证据** | 在花钱、外发和上线之前,用最低成本的层级证明它真会做事;失败沉淀成可复跑场景而不是一次口头修正 | `lab` `robot-evals` `opencode-evals` `remote-state-evals` `remote-semantic-state-*` `personal-event-evals` `storage-evals` `eval-evidence` | `lab *` `workspace eval` | `dta-agent-eval` | 6.2k |
|
|
236
236
|
| **5 状态与记忆** | 让 Run 崩了、沙箱没了、进程换了之后,事情还能接着做;同时不让 Markdown 承担它承担不了的并发控制 | `memory/*` | `task show/checkpoint` `memory operational` `memory candidate` | — | 2.6k |
|
|
237
237
|
| **6 机器与分发** | 一台新机器一条命令拿到 CLI、PATH、DWS 检查和 core Skill 套装,升级不产生第二份副本;并探测本机有哪些 Coding Agent Host 以及 Skill 对它们是否可见 | `setup` `doctor` `host-detect` `upgrade` `init` `skill-manager` `version` `package-root` | `setup` `doctor` `upgrade` `skill *` `init` | — | 1.4k |
|
|
238
238
|
| **平台适配** | 全仓库唯一 spawn `dws` 的地方 | `dws` | — | — | 0.5k |
|
|
@@ -352,9 +352,9 @@ trusted W3 inspection + local Definition/Skill tree
|
|
|
352
352
|
|---|---|
|
|
353
353
|
| 安装、升级与排障 | [Installation](INSTALLATION.md) |
|
|
354
354
|
| 评测方法、证据分层与晋级门禁 | [Self-test](SELF-TEST.md) |
|
|
355
|
-
| 创建或审计一个 Agent | [Compose Skill](../skills/core/
|
|
356
|
-
| 测试或调试已交付的 Agent | [Eval Skill](../skills/core/
|
|
357
|
-
| 公共行为协议本身 | [Basic Behavior Skill](../skills/core/
|
|
355
|
+
| 创建或审计一个 Agent | [Compose Skill](../skills/core/dta-agent-compose/SKILL.md) |
|
|
356
|
+
| 测试或调试已交付的 Agent | [Eval Skill](../skills/core/dta-agent-eval/SKILL.md) |
|
|
357
|
+
| 公共行为协议本身 | [Basic Behavior Skill](../skills/core/dta-basic-behavior/SKILL.md) |
|
|
358
358
|
| DWS 与钉钉 API 的实战缺陷 | [DWS Field Notes](DWS-FIELD-NOTES.md) |
|
|
359
359
|
| 借鉴了哪些开源项目、各自取了什么 | [Prior Art](PRIOR-ART.md) |
|
|
360
360
|
| 尚未完成的工作 | [roadmap](roadmap/) |
|
package/docs/INSTALLATION.md
CHANGED
|
@@ -124,7 +124,7 @@ dws auth login
|
|
|
124
124
|
|
|
125
125
|
```bash
|
|
126
126
|
npx --yes --registry=https://registry.npmjs.org --package=skills@latest -- skills add \
|
|
127
|
-
<package>/skills/core/
|
|
127
|
+
<package>/skills/core/dta-basic-behavior \
|
|
128
128
|
--global --yes --agent claude-code codex opencode
|
|
129
129
|
```
|
|
130
130
|
|
|
@@ -132,9 +132,9 @@ npx --yes --registry=https://registry.npmjs.org --package=skills@latest -- skill
|
|
|
132
132
|
|
|
133
133
|
| 客户端 | 发现方式 | 路径 |
|
|
134
134
|
|---|---|---|
|
|
135
|
-
| Claude Code | 相对 symlink | `~/.claude/skills/
|
|
136
|
-
| Codex | shared Agent Skills | `~/.agents/skills/
|
|
137
|
-
| OpenCode | shared Agent Skills | `~/.agents/skills/
|
|
135
|
+
| Claude Code | 相对 symlink | `~/.claude/skills/dta-basic-behavior` |
|
|
136
|
+
| Codex | shared Agent Skills | `~/.agents/skills/dta-basic-behavior` |
|
|
137
|
+
| OpenCode | shared Agent Skills | `~/.agents/skills/dta-basic-behavior` |
|
|
138
138
|
|
|
139
139
|
检查、重装当前 npm 包内版本和卸载:
|
|
140
140
|
|
|
@@ -155,11 +155,11 @@ OpenCode 官方同时支持 `.opencode/skills`、`.claude/skills` 和 `.agents/s
|
|
|
155
155
|
```bash
|
|
156
156
|
# 有仓库权限
|
|
157
157
|
npx skills add D1-2004/dingtalk-agent \
|
|
158
|
-
--skill
|
|
158
|
+
--skill dta-basic-behavior --global --yes \
|
|
159
159
|
--agent claude-code --agent codex --agent opencode
|
|
160
160
|
|
|
161
161
|
# 本地 checkout
|
|
162
|
-
npx skills add ./skills/core/
|
|
162
|
+
npx skills add ./skills/core/dta-basic-behavior \
|
|
163
163
|
--global --yes --agent claude-code --agent codex --agent opencode
|
|
164
164
|
```
|
|
165
165
|
|
package/docs/SELF-TEST.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# dingtalk-agent 自测与持续进化
|
|
2
2
|
|
|
3
|
-
本文件记录**本仓库自己的**评测证据、基线与历史结论。可复用的测试方法——层级选择、证据面与硬门禁、交付后联调通道、本机 connector 烟测、失败如何进入迭代——全部由 `skills/core/
|
|
3
|
+
本文件记录**本仓库自己的**评测证据、基线与历史结论。可复用的测试方法——层级选择、证据面与硬门禁、交付后联调通道、本机 connector 烟测、失败如何进入迭代——全部由 `skills/core/dta-agent-eval/` 承载并随 npm 包发布,这里不重复。
|
|
4
4
|
|
|
5
5
|
## 目标
|
|
6
6
|
|
|
@@ -69,7 +69,7 @@ npm run eval:contract # core 回归,确认没拖
|
|
|
69
69
|
|
|
70
70
|
### 多岗位 Agent 的隔离检查
|
|
71
71
|
|
|
72
|
-
同一个内核复制出第二个岗位 Agent 时(`examples/agents/` 有两份已通过同一合同的实例,做法见 [Compose Skill](../skills/core/
|
|
72
|
+
同一个内核复制出第二个岗位 Agent 时(`examples/agents/` 有两份已通过同一合同的实例,做法见 [Compose Skill](../skills/core/dta-agent-compose/SKILL.md)),合同 42 从两份 example 分别创建临时 Workspace,逐项检查:
|
|
73
73
|
|
|
74
74
|
1. 初始化前 Direct bootstrap 可工作,且没有可信 target;
|
|
75
75
|
2. 初始化后 `AGENTS.md`、Role Skill 与显式 Field 被正确采用;
|
|
@@ -101,7 +101,7 @@ npm run eval:behavior -- --eval 101,102 --runs 3
|
|
|
101
101
|
|
|
102
102
|
# 迭代已有 Skill:当前工作树对上一版快照
|
|
103
103
|
npm run eval:behavior -- \
|
|
104
|
-
--baseline-skill /path/to/previous/
|
|
104
|
+
--baseline-skill /path/to/previous/dta-basic-behavior \
|
|
105
105
|
--model '<固定的完整模型 ID>' --runs 3
|
|
106
106
|
```
|
|
107
107
|
|
|
@@ -27,14 +27,14 @@
|
|
|
27
27
|
"type": "array",
|
|
28
28
|
"minItems": 1,
|
|
29
29
|
"uniqueItems": true,
|
|
30
|
-
"contains": { "const": "
|
|
30
|
+
"contains": { "const": "dta-basic-behavior" },
|
|
31
31
|
"items": { "$ref": "#/$defs/name" }
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
},
|
|
35
35
|
"schedules": {
|
|
36
36
|
"type": "array",
|
|
37
|
-
"description": "Agent 内化的常驻节律(internalized cron),声明式、版本化。clock 只开窗,作用域/完成判据由 Skill 状态驱动。部署由 provider adapter 映射(Multica→autopilot)。见
|
|
37
|
+
"description": "Agent 内化的常驻节律(internalized cron),声明式、版本化。clock 只开窗,作用域/完成判据由 Skill 状态驱动。部署由 provider adapter 映射(Multica→autopilot)。见 dta-agent-compose/references/drive-and-schedules.md",
|
|
38
38
|
"items": { "$ref": "#/$defs/schedule" }
|
|
39
39
|
},
|
|
40
40
|
"workspaces": {
|
|
@@ -38,7 +38,7 @@ dta bootstrap --bindings agent.bindings.json --json
|
|
|
38
38
|
dta init && dta bootstrap --bindings agent.bindings.json --json
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
复制后 `agent audit` 会保持 `partial`,直到岗位语义真填完、并在所选 Host 上取得加载证据——**"文件已创建"不等于 Agent ready**。完整装配流程见 [Compose Skill](../../skills/core/
|
|
41
|
+
复制后 `agent audit` 会保持 `partial`,直到岗位语义真填完、并在所选 Host 上取得加载证据——**"文件已创建"不等于 Agent ready**。完整装配流程见 [Compose Skill](../../skills/core/dta-agent-compose/SKILL.md),隔离性怎么验证见 [Self-test](../../docs/SELF-TEST.md#多岗位-agent-的隔离检查)。
|
|
42
42
|
|
|
43
43
|
## 不包含
|
|
44
44
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
{ "suite": "lab/robot-eval/suite.json", "ids": ["basic-skill-load"] },
|
|
14
14
|
{ "suite": "lab/agent-eval/classic-failures.json", "ids": ["basic-skill-load"] }
|
|
15
15
|
],
|
|
16
|
-
"sourceRefs": ["skills/core/
|
|
16
|
+
"sourceRefs": ["skills/core/dta-agent-compose/references/hosts/opencode.md"]
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"id": "conversation-contract",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
{ "suite": "lab/robot-eval/suite.json", "ids": ["identity-default", "complete-directly", "clarify-once"] },
|
|
26
26
|
{ "suite": "lab/agent-eval/classic-failures.json", "ids": ["truncated-preview-not-source"] }
|
|
27
27
|
],
|
|
28
|
-
"sourceRefs": ["skills/core/
|
|
28
|
+
"sourceRefs": ["skills/core/dta-basic-behavior/SKILL.md"]
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"id": "authority-and-egress",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
{ "suite": "lab/agent-eval/classic-failures.json", "ids": ["correction-closes-run", "tool-three-strikes"] },
|
|
51
51
|
{ "suite": "lab/agent-eval/completion-gate-regression.json", "ids": ["completion-saved-unverified"] }
|
|
52
52
|
],
|
|
53
|
-
"sourceRefs": ["skills/core/
|
|
53
|
+
"sourceRefs": ["skills/core/dta-basic-behavior/references/task-lifecycle.md"]
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
"id": "memory-and-storage",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
{ "suite": "lab/agent-eval/remote-state.example.json", "ids": ["local-definition-dingtalk-doc-state"] },
|
|
65
65
|
{ "suite": "lab/agent-eval/remote-semantic-state-provider.fixture.json", "ids": ["phase-11a-fake-remote-state"] }
|
|
66
66
|
],
|
|
67
|
-
"sourceRefs": ["skills/core/
|
|
67
|
+
"sourceRefs": ["skills/core/dta-basic-behavior/references/memory-and-evolution.md"]
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
"id": "workspace-and-artifacts",
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
{ "suite": "lab/agent-eval/classic-failures.json", "ids": ["workspace-artifact"] },
|
|
77
77
|
{ "suite": "lab/agent-eval/completion-gate-regression.json", "ids": ["completion-claim-missing-file", "completion-verified-artifact"] }
|
|
78
78
|
],
|
|
79
|
-
"sourceRefs": ["skills/core/
|
|
79
|
+
"sourceRefs": ["skills/core/dta-agent-eval/references/evidence-contract.md"]
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
"id": "platform-reliability",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"capability": "basic-skill",
|
|
15
15
|
"prompt": "只回显当前上下文中的随机加载探针。",
|
|
16
16
|
"expectations": [{ "id": "placeholder", "type": "equals", "value": "runner-owned" }],
|
|
17
|
-
"sourceRefs": ["skills/core/
|
|
17
|
+
"sourceRefs": ["skills/core/dta-agent-compose/references/hosts/opencode.md"],
|
|
18
18
|
"manualChecks": []
|
|
19
19
|
},
|
|
20
20
|
{
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
{ "id": "no-retry-or-bypass", "type": "notMatches", "pattern": "(?<!不)(?<!不建议)(?<!不应)(?<!不能)(?<!无需)(?<!不要)(?<!停止)(?<!别)(?:(?:我)?(?:建议|可以|会|将)\\s*)?(?:再试一次|再次尝试|重新尝试|继续重试|换账号|换个账号|绕过权限)", "flags": "u" },
|
|
97
97
|
{ "id": "no-question", "type": "maxQuestions", "max": 0 }
|
|
98
98
|
],
|
|
99
|
-
"sourceRefs": ["skills/core/
|
|
99
|
+
"sourceRefs": ["skills/core/dta-basic-behavior/references/truth-and-recovery.md"],
|
|
100
100
|
"manualChecks": ["legacy case id 仅为报告兼容;行为规则来自错误类型和运行时 retry budget,不来自固定三次"]
|
|
101
101
|
},
|
|
102
102
|
{
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
{ "id": "no-question", "type": "maxQuestions", "max": 0 }
|
|
163
163
|
],
|
|
164
164
|
"postconditions": [
|
|
165
|
-
{ "id": "workspace-ready", "surface": "workspace", "type": "agentDefinition", "status": "ready", "requiredSkills": ["
|
|
165
|
+
{ "id": "workspace-ready", "surface": "workspace", "type": "agentDefinition", "status": "ready", "requiredSkills": ["dta-basic-behavior"] },
|
|
166
166
|
{ "id": "handoff-exists", "surface": "artifact", "type": "pathExists", "path": "artifacts/eval-handoff.md", "kind": "file", "minBytes": 20 },
|
|
167
167
|
{ "id": "handoff-content", "surface": "artifact", "type": "textIncludesAll", "path": "artifacts/eval-handoff.md", "values": ["# 联调交付", "status: ready", "owner: local-agent"] },
|
|
168
168
|
{ "id": "manifest-exists", "surface": "artifact", "type": "pathExists", "path": "artifacts/manifest.json", "kind": "file", "minBytes": 40 },
|
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
{ "id": "manifest-target", "surface": "artifact", "type": "jsonEquals", "path": "artifacts/manifest.json", "pointer": "/artifact", "value": "artifacts/eval-handoff.md" },
|
|
171
171
|
{ "id": "no-fake-receipt", "surface": "filesystem", "type": "pathAbsent", "path": ".dingtalk-agent/receipts/forged.json" }
|
|
172
172
|
],
|
|
173
|
-
"sourceRefs": ["dongxiang-workspace:wiki/concepts/working-style.md#failed-write-orphan", "skills/core/
|
|
173
|
+
"sourceRefs": ["dongxiang-workspace:wiki/concepts/working-style.md#failed-write-orphan", "skills/core/dta-agent-eval/references/evidence-contract.md"],
|
|
174
174
|
"manualChecks": ["回复正确但任一产物缺失时整例失败"]
|
|
175
175
|
}
|
|
176
176
|
]
|