@xdxer/dingtalk-agent 0.1.5-beta.7 → 0.1.5-beta.9
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 +38 -0
- package/README.en.md +1 -0
- package/README.md +1 -0
- package/dist/bin/dingtalk-agent.js +118 -15
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/agent-audit.js +108 -9
- package/dist/src/agent-audit.js.map +1 -1
- package/dist/src/development-workspace.js +37 -1
- package/dist/src/development-workspace.js.map +1 -1
- package/dist/src/dws.js +9 -0
- package/dist/src/dws.js.map +1 -1
- package/dist/src/multica-deploy.js +347 -105
- package/dist/src/multica-deploy.js.map +1 -1
- package/dist/src/multica-provider.js +151 -27
- package/dist/src/multica-provider.js.map +1 -1
- package/dist/src/multica-runtime-vocabulary.js +110 -0
- package/dist/src/multica-runtime-vocabulary.js.map +1 -0
- package/dist/src/promotion.js +2 -1
- package/dist/src/promotion.js.map +1 -1
- package/dist/src/schedule-plan.js +192 -24
- package/dist/src/schedule-plan.js.map +1 -1
- package/dist/src/skill-manager.js +76 -9
- package/dist/src/skill-manager.js.map +1 -1
- package/docs/AGENT-IN-PRODUCTION.md +255 -0
- package/docs/ARCHITECTURE.md +5 -1
- package/docs/PLATFORM-GUARDRAILS.md +188 -0
- package/docs/schemas/multica-deployment-plan.schema.json +3 -1
- package/docs/schemas/multica-deployment-receipt.schema.json +15 -1
- package/docs/schemas/multica-deployment-status.schema.json +6 -2
- package/docs/schemas/multica-workspace-inspection.schema.json +16 -0
- package/docs/schemas/multica-workspace-status.schema.json +2 -0
- package/docs/schemas/workspace-scaffold.schema.json +1 -0
- package/lab/project-workspace/fake-multica-provider.mjs +97 -7
- package/lab/project-workspace/multica-deploy.fixture.json +2 -2
- package/lab/project-workspace/multica-readonly.fixture.json +2 -2
- package/lab/project-workspace/project.fixture.json +1 -1
- package/lab/robot-eval/suite.json +1 -1
- package/package.json +5 -2
- package/skills/core/dta-agent-compose/SKILL.md +1 -1
- package/skills/core/dta-agent-compose/references/drive-and-schedules.md +22 -2
- package/skills/core/dta-basic-behavior/SKILL.md +1 -1
- package/skills/core/dta-basic-behavior/references/memory-and-evolution.md +1 -1
- package/skills/core/dta-people-group-memory/SKILL.md +4 -4
- package/skills/core/dta-people-group-memory/references/model.md +1 -1
- package/skills/platforms/multica-dingtalk/PLATFORM.md +2 -2
- package/skills/platforms/multica-dingtalk/dta-deploy-multica/SKILL.md +6 -5
- package/skills/platforms/multica-dingtalk/dta-deploy-multica/references/multica-deployment-contract.md +14 -4
- package/skills/platforms/multica-dingtalk/dta-ops-multica/SKILL.md +33 -7
- package/skills/platforms/multica-dingtalk/dta-ops-multica/scripts/multica_ext.py +118 -12
- package/dist/src/map.js +0 -157
- package/dist/src/map.js.map +0 -1
|
@@ -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, rmSync } 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\nexport interface PrunedLegacySkill {\n name: string\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 = [join(home, '.agents', 'skills', name), join(home, '.claude', 'skills', name)]\n .filter(pathExists)\n if (!removed.length) continue\n for (const path of removed) rmSync(path, { recursive: true, force: true })\n pruned.push({ name, replacedBy, removed })\n }\n return pruned\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 return suiteOf(BUNDLED_SKILL_NAMES\n .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\n .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 // 每个 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"]}
|
|
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 {\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"]}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# 交付之后:一个数字员工在生产上是什么样
|
|
2
|
+
|
|
3
|
+
> 给**接手一个已经在跑的 Agent** 的人或 Coding Agent。
|
|
4
|
+
>
|
|
5
|
+
> [ARCHITECTURE](ARCHITECTURE.md) 回答"一个数字员工由什么构成、每件事谁说了算"——那是**设计视角**。
|
|
6
|
+
> 本文回答"它交付之后,一天到底怎么转、坏起来长什么样、你去哪看"——**运行视角**。
|
|
7
|
+
> 两篇不重复:设计视角讲边界为什么这么划,运行视角讲这些边界在生产上呈现成什么现象。
|
|
8
|
+
>
|
|
9
|
+
> 装机与升级见 [Installation](INSTALLATION.md);评测方法见 [Self-test](SELF-TEST.md);
|
|
10
|
+
> 行为协议正本见 [`dta-basic-behavior`](../skills/core/dta-basic-behavior/SKILL.md)。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 0. 一句话
|
|
15
|
+
|
|
16
|
+
**它没有常驻进程。** 每一次"活过来"都是一个全新的、一次性的沙箱:装配 Skill → 干一件事 → 消失。
|
|
17
|
+
两次运行之间它什么都不记得。
|
|
18
|
+
|
|
19
|
+
这一条推出下面所有内容。**记忆不在模型里,全部在外部权威上**——落不到权威上的事,等于没发生。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. 一天里它被叫醒几次、被谁叫醒
|
|
24
|
+
|
|
25
|
+
三类唤醒源,语义完全不同(分类与权威归属见 [ARCHITECTURE §3.1](ARCHITECTURE.md#31-驱动一个数字员工怎么被叫醒)):
|
|
26
|
+
|
|
27
|
+
| 唤醒源 | 有人在等吗 | 常态 | 失败的代价 |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| **IM · @ 或单聊** | 有 | 该回一句(先过响应资格判断) | 用户直接看见 |
|
|
30
|
+
| **IM · 群里没 @ 它** | 不一定 | **默认 `silence`**——群消息未 @ 不擅自插话(响应资格由 Basic 判) | 乱插话反而是错 |
|
|
31
|
+
| **常驻节律**(平台 schedule) | 没有 | **静默** | 没人看见,会积压 |
|
|
32
|
+
| **受控任务**(平台 issue / 开发者派活) | 有,异步 | 有 issue 可回读 | 在平台上看得见 |
|
|
33
|
+
|
|
34
|
+
> 「有人在等就回」不等于「群里每句都回」。**响应资格先于一切**——@ 或单聊才默认该回,
|
|
35
|
+
> 群里没点名默认 `silence`,判据在 `dta-basic-behavior`,别把"有人在等"简化成"必须回一句"。
|
|
36
|
+
|
|
37
|
+
**运行时的量级差得很远。** 以本仓库的参考实现「FDE 教练」2026-07-23 一天为例:
|
|
38
|
+
IM 对话 **39 轮**,节律唤醒 **111 次**——**节律是 IM 的三倍**。
|
|
39
|
+
这是数字员工与聊天机器人最大的运行时差别:**它大部分时间在没人看的时候干活。**
|
|
40
|
+
|
|
41
|
+
只声明节律是不够的,要能读回来:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
dta schedule show # 只读【本地 manifest 声明】的节律 + 静态校验(同刻/完成判据)
|
|
45
|
+
dta schedule plan --workspace <name> # 把声明映射成 provider 该执行的 reconcile 命令
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
> ⚠️ **这两条读的是【声明态】(本地 `dingtalk-agent.json`),不是平台的【实际态】。** 它们只 `inspectAgentProject`,不查 provider——`plan` 也只是打印该由 ops 技能执行的对账命令。排障时想知道**线上真实生效的节律**,要走 provider 回读(Multica 走 `dta-ops-multica` 的 `autopilot-list`),别拿一份可能没 apply 的 manifest 当线上真相。
|
|
49
|
+
|
|
50
|
+
> **`dta deploy` 不创建也不修改节律。** 节律属于平台,增删由 operator 执行。
|
|
51
|
+
> 这不是缺功能,是边界:Agent 不自建定时器、不自改节律([ARCHITECTURE §3.1](ARCHITECTURE.md#31-驱动一个数字员工怎么被叫醒))。
|
|
52
|
+
|
|
53
|
+
**排节律时的四条经验**(都从真实生产换来,`dta schedule show/plan` 会静态检出前两条):
|
|
54
|
+
|
|
55
|
+
1. **每条节律必须有数据派生的完成判据(`completion`)。** 没有它就只能靠"那一拍跑没跑"判完成,而平台会漏拍、会跳过迟到过久的 fire——一次抖动就永久丢一期。`schedule show` 缺 `completion` 会告警。
|
|
56
|
+
2. **两拍不得在同一时刻 fire。** 外发拍的送达回执是发完才写、没有锁,同刻并发会把同一条消息发两遍给第三方。(只错开分钟不够看——要看分钟×小时真不真相交。**也别用两个时区写节律**:`0 9 * * *`@Asia/Shanghai 和 `0 1 * * *`@UTC 是同一时刻,本地换算不了,`schedule show/plan` 一律当撞车挡住。全 Agent 统一一个 timezone。)
|
|
57
|
+
3. **有时效的轻活排前,别让重活把它饿死。** 一拍预算有限。把每次都超时的重活排在序列最前,排它后面的轻活(对账、收件)会整轮轮不到——真事故:夜拍里留痕对账排第 7 位、前面的夜间重建每拍超时,结果留痕对账整夜没跑到。**正解**:有时效/轻的排前面,或给重活单独一条节律、独立预算,别和轻活挤同一拍。
|
|
58
|
+
4. **入口是脉冲、出口是均匀——产能按峰值窗口算,不按日均。** 用户往往集中在某个时段涌入,而节律是固定频率。按日总量算"够用"会在高峰那几小时实际欠账。
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 2. 值班 ≠ 任务:运行上最常见的一组混淆
|
|
63
|
+
|
|
64
|
+
| | **值班(duty)** | **任务(task)** |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| 本质 | 永远做不完的**维护义务** | 有终态的**一件事** |
|
|
67
|
+
| 完成判据 | **从数据派生**(水位 ≥ 今天 / backlog = 0) | 对象自身的终态(如 Todo `isDone`) |
|
|
68
|
+
| 状态存哪 | **不存**。索引本身就是完成状态 | 存在那个对象上 |
|
|
69
|
+
| 漏一次 | 下一拍自愈 | 断链,**而且不自知** |
|
|
70
|
+
|
|
71
|
+
**为什么完成判据必须数据派生**:拍是无状态的、会漏、会被平台跳过、会换实例。
|
|
72
|
+
"今晚跑过没有"这个问题只有数据能回答。不记状态、不建标记、不上锁、不信会话记忆。
|
|
73
|
+
|
|
74
|
+
这条有一个几乎所有人都会踩的推论:
|
|
75
|
+
|
|
76
|
+
> **任何「某时刻必须发生」的事,判据只能是「今天/本周它发生了没有」,不能是「那一拍跑了没有」。**
|
|
77
|
+
|
|
78
|
+
托管平台普遍会塌缩漏掉的 fire、跳过迟到过久的 fire。把判据绑在"某一拍"上,一次 runtime 抖动就永久丢一期,
|
|
79
|
+
事后还查不出来。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 3. 两阶段值班:命令给清单,模型干活
|
|
84
|
+
|
|
85
|
+
这是生产上最容易出事的一类,值得单独知道。
|
|
86
|
+
|
|
87
|
+
- **一阶段**:命令跑完,活就干完了(重建索引、对账、汇总)。
|
|
88
|
+
- **两阶段**:命令吐出来的是**待办清单**,真正的活是模型自己做——读全文 → 生成 → 逐条写回。
|
|
89
|
+
|
|
90
|
+
于是:
|
|
91
|
+
|
|
92
|
+
> **这一拍到底做没做,只看它发出了几次写调用——不看它跑了几次命令。**
|
|
93
|
+
> 没有对应的写调用,就不许在自述里写「已处理 N 条」。
|
|
94
|
+
|
|
95
|
+
**为什么把这条写这么重**:谎报比不做更糟。不做,backlog 明摆着;谎报,backlog 在"已完成"的假象下
|
|
96
|
+
无限积压,**没有任何人会发现**。
|
|
97
|
+
|
|
98
|
+
配套的监督必须**绕开自述**:直接算准 backlog,和上一次快照比趋势。跑了多拍而 backlog 没往下走,就报警。
|
|
99
|
+
**写没写,用数据判,编不了。**
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 4. backlog 是队列:只看净值会误诊
|
|
104
|
+
|
|
105
|
+
两阶段值班的积压本质是队列,三个数字才够用:
|
|
106
|
+
|
|
107
|
+
```text
|
|
108
|
+
入口速率 = 单位时间新进来的活
|
|
109
|
+
出口速率 = 单位时间真被写掉的活
|
|
110
|
+
净值 = 入口 − 出口
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**健康不是「backlog 小」,是「出口 ≥ 入口」。** 净值长期为正,backlog 多大都只是时间问题。
|
|
114
|
+
|
|
115
|
+
只看净值分不清四种病,而它们的处方完全不同:
|
|
116
|
+
|
|
117
|
+
| 现象 | 病 | 处方 |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| 入 40,出 0 | 空转,或**写在了错的地方** | 查写调用到底落在哪一行 |
|
|
120
|
+
| 入 40,出 15 | 产能不足 | 加拍、加批量 |
|
|
121
|
+
| 入 40,出 40,backlog 不降 | 打平但清不掉历史欠账 | 要额外产能,或削入口 |
|
|
122
|
+
| 入 0,出 0 | 可能是**空读**(见 §5) | 先别判,下轮再看 |
|
|
123
|
+
|
|
124
|
+
**拆的办法很便宜**:对 backlog 的**键集合**做前后两次差分——本次在、上次不在 = 入口;上次在、本次不在 = 出口。
|
|
125
|
+
|
|
126
|
+
还有两条运行时经验:
|
|
127
|
+
|
|
128
|
+
- **入口通常是脉冲的,出口是均匀的。** 只按日总量算产能会得到"够用"的错觉,而高峰那几小时实际在欠。
|
|
129
|
+
- **队列有头,头会堵。** 若实现是"先补最旧的一天",那一天一旦因为数据缺陷清不掉,**后面全部够不着**,
|
|
130
|
+
而每一拍的写回都"成功"。这类故障的表征是:写调用一直在发、成功率 100%、backlog 纹丝不动。
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 5. 生产上的四类假信号
|
|
135
|
+
|
|
136
|
+
按危险程度排序。**它们的共同点是:都伪装成成功。**
|
|
137
|
+
|
|
138
|
+
1. **报 0 的 ✅ 不可信。** `活跃 0 人`、`0 行`、`待处理 0 条`——判据往往是结构性的
|
|
139
|
+
(`集合为空 → backlog 为空 → done=True`),**于是任何一次读表失败都会变成一个自信的 ✅**。
|
|
140
|
+
规则:报 0 的那一项不算做过,下一轮照常再来(它幂等),同时记降级并点名。
|
|
141
|
+
2. **写后回读读的是同一个错误对象。** 回读校验只有在**独立定位**目标时才有效。
|
|
142
|
+
若写 `rows[0]`、回读也取 `rows[0]`,则永远自洽、永远发现不了写错了行。
|
|
143
|
+
3. **两个完成判据分开写,迟早会漂。** 同一件事若在两处各判一次,一处说"没完成"、一处说"全好了",
|
|
144
|
+
而调用方只问其中一个——补救路径就再也不会被触发,且没有任何一层报警。
|
|
145
|
+
**同一个语义只留一个谓词,两个调用方共用。**
|
|
146
|
+
4. **命令被沙箱砍掉时不会留痕。** 留痕通常写在动作**之后**,被砍时那行根本没执行,
|
|
147
|
+
事后看就像"这一拍没跑过"。超时后必须补一行降级。
|
|
148
|
+
|
|
149
|
+
失败要说人话,四个状态别混:
|
|
150
|
+
|
|
151
|
+
| 状态 | 什么时候用 | 什么时候**不能**用 |
|
|
152
|
+
|---|---|---|
|
|
153
|
+
| `pass` | 真做成了,**且独立回读确认过** | "我试过了" |
|
|
154
|
+
| `degraded` | 做了一部分 / 被超时砍掉 / 读到可疑空集 | — |
|
|
155
|
+
| `fail` | 明确失败 | — |
|
|
156
|
+
| `blocked` | 缺上游前提(权限、配置、目标不存在) | 含糊报"出错了" |
|
|
157
|
+
|
|
158
|
+
**没送达就写 `pass`,比链条断掉更糟**——断链至少看得出来"今天没跑"。
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 6. 钱:先知道哪一块是看不见的
|
|
163
|
+
|
|
164
|
+
托管平台通常只记 Token,不记钱;把 Token 折成钱是**调用方的责任**,需要一份人工维护、带来源与日期的费率表。
|
|
165
|
+
|
|
166
|
+
运行时最重要的一件事是**知道盲区在哪**:
|
|
167
|
+
|
|
168
|
+
> **不产生 issue 的节律唤醒,平台往往没有可查的用量记录。**
|
|
169
|
+
> 于是报表上的成本是**低报**的,而且低报的比例可能比可见部分还大。
|
|
170
|
+
|
|
171
|
+
两条纪律:
|
|
172
|
+
|
|
173
|
+
- **缺价的模型登记成 `unpriced` 并让报表直接失败**,不要按 0 计——按 0 计会让成本看起来更便宜,是最危险的失败方式。
|
|
174
|
+
- 节律的 `mode` 直接决定可计量性。**改 `mode` 就是在改计量口径**,要同步改报表说明,否则会重复计或漏计。
|
|
175
|
+
(`dta schedule show/plan` 现在会给每条节律标 `metered`,ephemeral 不记账的会显式提示。)
|
|
176
|
+
|
|
177
|
+
### 观测这一层,dta 不替你造——但有可抄的范式
|
|
178
|
+
|
|
179
|
+
[ARCHITECTURE §8 ⑥](ARCHITECTURE.md#8-开发生命周期从定义到观测) 讲得很直白:**用量计量(交互量、任务量、线上 token、成本、按人按群分布)dta 一项都没实现**,`dta observe` 只是人工脱敏观察绑版本、不采线上数据;执行轨迹读取属平台(薄 wrapper,换平台即失效);连完成证据的**签发**都还没接进公开 CLI(`dta task` 只有 show/checkpoint)。
|
|
180
|
+
|
|
181
|
+
所以观测是 **Agent 自己该建的一层**。目前最完整的参考实现是「FDE 教练」,它用三样东西把自己变得可观测,都可复用:
|
|
182
|
+
|
|
183
|
+
1. **一张运行记录表 = 每个 Run 一行,只增不改**。问了什么、答了什么、花了多久、成败、证据、issue/会话/消息硬 ID 全落进去。它是日报、审计、"昨天到底发生了什么"的唯一来源。**没有它,一次运行事后等于没发生过。**
|
|
184
|
+
2. **一张费率表 + 只读成本报表**。平台只给 token 数,把 token 折成钱、按任务类型分摊,是这一层干的(缺价的模型 fail-closed,不按 0 计)。
|
|
185
|
+
3. **一个元节律做体检**:定期算准 backlog、和上次快照比趋势,卡住就报主人——它监督其它节律有没有真在干活,而不是信自述。
|
|
186
|
+
|
|
187
|
+
### 判"一次自动化到底达成没有":L0–L4,别信自述
|
|
188
|
+
|
|
189
|
+
跑了 ≠ 干了 ≠ 干对了。用可观测证据分层,每层的证据都要能独立采到:
|
|
190
|
+
|
|
191
|
+
| 层 | 含义 | 证据 |
|
|
192
|
+
|---|---|---|
|
|
193
|
+
| L0 | 被唤醒 | 平台账本有 fire |
|
|
194
|
+
| L1 | 命令跑完、拿到清单 | 运行记录有一行 |
|
|
195
|
+
| L2/L3 | 产生写调用、且写到**正确对象** | 有写调用 + 按 recordId 回读命中 |
|
|
196
|
+
| L4 | 目标量指标真的动了 | backlog 净降 / 水位推进(多读取并集当下界,别单次读) |
|
|
197
|
+
|
|
198
|
+
**大多数"空转"事故都是停在 L1**:命令在跑、runlog 在记,但没有 L3 的写调用、backlog 不动。而运行记录里的自述("已处理 N 条")**不是 L3 证据**——只有真实写调用数 + 回读是。判达成度看 L4,不看自述。
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 7. 改一行怎么到线上
|
|
203
|
+
|
|
204
|
+
```text
|
|
205
|
+
改 Agent Definition 或 Skills
|
|
206
|
+
↓ git commit → 发布基线分支
|
|
207
|
+
↓ dta workspace inspect → dta deploy --dry-run → dta deploy --plan-id … --yes
|
|
208
|
+
↓ dta deploy --status --operation-id …
|
|
209
|
+
托管平台上的 Agent
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
三条运行时纪律:
|
|
213
|
+
|
|
214
|
+
- **目录存在 ≠ Skill 已加载。** 以部署 Receipt、Definition hash、Skill assignment hash 和加载烟测为准,
|
|
215
|
+
不能用 git push 或"页面上看得到"来推断已部署。
|
|
216
|
+
- **`inspect → dry-run → apply` 必须连续。** plan 的 scope 从那一次 inspection 冻结;
|
|
217
|
+
中间插入别的调用会得到"与冻结 plan 不一致"。该门禁在任何远端写入**之前**失败,所以报错后可以安全重试。
|
|
218
|
+
- **最强的验收不是烟测,是功能证据。** 烟测能证明 Skill 被装配、Agent 会应答;
|
|
219
|
+
它证明不了"这次改动真的改变了行为"。后者只能靠改动本身对应的**数据现象**——
|
|
220
|
+
比如修了一条补录路径,就去看下一拍有没有真的补出数据来。
|
|
221
|
+
|
|
222
|
+
**哪些改动需要部署**:Agent Definition 和 Skills 要;节律声明不要(也不能,由 operator 在平台侧执行);
|
|
223
|
+
仓库开发面(README / AGENTS / docs / 评测配置)不同步。
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## 8. 它不对劲的时候,按这个顺序查
|
|
228
|
+
|
|
229
|
+
| 症状 | 先看哪 | 常见真因 |
|
|
230
|
+
|---|---|---|
|
|
231
|
+
| 该发生的事没发生 | 完成判据是不是绑在"那一拍跑了没有"上 | 平台跳过了迟到的 fire |
|
|
232
|
+
| backlog 一直涨 | **拆入口/出口**,别看净值 | 空转、写错行、队头阻塞、产能不足,处方各不相同 |
|
|
233
|
+
| 值班一路报 ✅ 但数据没动 | 完成判据有没有第二处、两处判得一样吗 | 判据分叉,补救路径从没被触发 |
|
|
234
|
+
| 写回"成功"但状态不变 | 回读是不是独立定位了目标 | 写和回读命中同一个错误对象 |
|
|
235
|
+
| 同一条消息发了两遍 | 有没有两条节律落在同一分钟 | 外发类留痕在动作之后,没有锁 |
|
|
236
|
+
| 数字忽然变成 0 | 当成可疑,别当完成 | 后端间歇性返回空集 |
|
|
237
|
+
| 成本对不上账单 | 有没有不产生 issue 的唤醒 | 计量盲区 |
|
|
238
|
+
| 改了但线上没变 | Receipt / hash / 加载烟测 | 根本没部署,或部署了但没验证功能 |
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 8.5 这些坑该由平台兜哪些
|
|
243
|
+
|
|
244
|
+
上面这张排查表里的每一类,都可以问一句「这是不是不该由每个 Agent 各自踩一遍」。把六类真实事故映射到 dta 的原语/CLI闸门/Skill纪律/文档四层的分析,见 [Platform Guardrails](PLATFORM-GUARDRAILS.md)——它也复核了 `dta-people-group-memory` 的四条不变式在静默截断下哪条会失效。
|
|
245
|
+
|
|
246
|
+
## 9. 一个活的参考实现
|
|
247
|
+
|
|
248
|
+
本仓库的 Skill 与合同都来自真实生产。目前公开可读的完整案例是「FDE 教练」——
|
|
249
|
+
一个每天被节律唤醒上百次、服务上百名校招生的数字员工。
|
|
250
|
+
它把本文每一节都落成了具体的表、命令和判据,并且**把踩过的坑逐条写在了注释里**:
|
|
251
|
+
|
|
252
|
+
- 运行方式全景与十条真事故换来的坑:`fde-coach-agent/docs/HOW-IT-WORKS.md`
|
|
253
|
+
- 节律作用域与值班完成判据:该仓库 `agent/skills/fde-heartbeat/SKILL.md`
|
|
254
|
+
|
|
255
|
+
读本文建立框架,读它建立手感。
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -131,7 +131,7 @@ Host 原生发现目录不是发布源。OpenCode 的 `.agents/skills/`、Claude
|
|
|
131
131
|
- **外发类节律的留痕在动作之后,所以它没有锁。** 两个节律落在同一分钟并发唤醒,就会把同一条消息发两遍给第三方。多节律拆分必须错开触发时刻。
|
|
132
132
|
- **Agent 不自建定时器、不自改节律。** 节律是可审计的部署产物;在线 Run 只能把新节律整理成候选交给 operator,不能自己配上再宣称配好了——这与 §1「在线 Run 不能热改身份、权限或已启用 Skill」是同一条边界的延伸。
|
|
133
133
|
|
|
134
|
-
**本仓库在这一层拥有什么**:不拥有 cron,拥有三件事——装配时**声明**需要哪些节律与是否允许 Agent 自主排程(`dta-agent-compose`);部署到具体平台时**校验**该平台是否真的提供这些能力、不提供就 fail closed(平台 Skill 包 + `agent-platform` 注册表);以及 Agent 侧被定时驱动时必须满足的**行为合同**(`dta-basic-behavior`)。**平台之间能力不同是常态**——同一个 Agent
|
|
134
|
+
**本仓库在这一层拥有什么**:不拥有 cron,拥有三件事——装配时**声明**需要哪些节律与是否允许 Agent 自主排程(`dta-agent-compose`);部署到具体平台时**校验**该平台是否真的提供这些能力、不提供就 fail closed(平台 Skill 包 + `agent-platform` 注册表);以及 Agent 侧被定时驱动时必须满足的**行为合同**(`dta-basic-behavior`)。**平台之间能力不同是常态**——同一个 Agent 的节律声明可以不变,能不能被满足由目标平台回答。`dta schedule show` 还会静态检两条与平台无关的不变量:**同刻并发**(按真实 occurrence 枚举判,判不准的当撞车挡住)和**缺完成判据**(声明了 cron 却没写数据派生 `completion` 的记成缺口)。
|
|
135
135
|
|
|
136
136
|
## 4. 谁拦住什么:Skill 劝,CLI 拦,DWS 做
|
|
137
137
|
|
|
@@ -292,6 +292,8 @@ dingtalk-doc:<node-or-url> DWS 拉取在线文档的只读快照
|
|
|
292
292
|
|
|
293
293
|
**不做**:`observe` 产物不进 Git(团队间无法共享);不把线上数据写回 Prompt/Skill/suite;在线 Run 不得自动扩大身份、权限或启用 Skill。
|
|
294
294
|
|
|
295
|
+
> 计量这层 dta 不造,但**该怎么自建**有可抄的范式——运行记录账本(每 Run 一行)+ 费率折算 + 体检元节律 + L0–L4 达成度判据,见 [AGENT-IN-PRODUCTION.md](AGENT-IN-PRODUCTION.md)「观测这一层,dta 不替你造——但有可抄的范式」。
|
|
296
|
+
|
|
295
297
|
---
|
|
296
298
|
|
|
297
299
|
Agent Project 与 Development Workspace 的基数关系:
|
|
@@ -350,6 +352,7 @@ trusted W3 inspection + local Definition/Skill tree
|
|
|
350
352
|
|
|
351
353
|
| 想做什么 | 去哪 |
|
|
352
354
|
|---|---|
|
|
355
|
+
| **接手一个已经在跑的 Agent**(运行视角:一天怎么转、坏起来什么样、去哪看) | [Agent in Production](AGENT-IN-PRODUCTION.md) |
|
|
353
356
|
| 安装、升级与排障 | [Installation](INSTALLATION.md) |
|
|
354
357
|
| 评测方法、证据分层与晋级门禁 | [Self-test](SELF-TEST.md) |
|
|
355
358
|
| 创建或审计一个 Agent | [Compose Skill](../skills/core/dta-agent-compose/SKILL.md) |
|
|
@@ -357,6 +360,7 @@ trusted W3 inspection + local Definition/Skill tree
|
|
|
357
360
|
| 公共行为协议本身 | [Basic Behavior Skill](../skills/core/dta-basic-behavior/SKILL.md) |
|
|
358
361
|
| DWS 与钉钉 API 的实战缺陷 | [DWS Field Notes](DWS-FIELD-NOTES.md) |
|
|
359
362
|
| 借鉴了哪些开源项目、各自取了什么 | [Prior Art](PRIOR-ART.md) |
|
|
363
|
+
| 真实事故该由平台哪一层兜(护栏清单) | [Platform Guardrails](PLATFORM-GUARDRAILS.md) |
|
|
360
364
|
| 尚未完成的工作 | [roadmap](roadmap/) |
|
|
361
365
|
|
|
362
366
|
在本仓库工作的 Coding Agent 请先读 [AGENTS.md](../AGENTS.md),验证命令以那里为准。
|