@xdxer/dingtalk-agent 0.1.5-beta.1 → 0.1.5-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.en.md +10 -5
  3. package/README.md +10 -5
  4. package/dist/bin/dingtalk-agent.js +16 -5
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/agent-audit.js +69 -55
  7. package/dist/src/agent-audit.js.map +1 -1
  8. package/dist/src/agent-enhance.js +49 -30
  9. package/dist/src/agent-enhance.js.map +1 -1
  10. package/dist/src/agent-platform.js +0 -1
  11. package/dist/src/agent-platform.js.map +1 -1
  12. package/dist/src/bootstrap.js +6 -2
  13. package/dist/src/bootstrap.js.map +1 -1
  14. package/dist/src/development-workspace.js +67 -23
  15. package/dist/src/development-workspace.js.map +1 -1
  16. package/dist/src/doctor.js +6 -1
  17. package/dist/src/doctor.js.map +1 -1
  18. package/dist/src/multica-deploy.js +287 -54
  19. package/dist/src/multica-deploy.js.map +1 -1
  20. package/dist/src/multica-provider.js +1 -2
  21. package/dist/src/multica-provider.js.map +1 -1
  22. package/dist/src/opencode-provider.js +20 -6
  23. package/dist/src/opencode-provider.js.map +1 -1
  24. package/dist/src/skill-manager.js +2 -3
  25. package/dist/src/skill-manager.js.map +1 -1
  26. package/dist/src/skills.js +2 -0
  27. package/dist/src/skills.js.map +1 -1
  28. package/dist/src/workspace.js +11 -6
  29. package/dist/src/workspace.js.map +1 -1
  30. package/docs/ARCHITECTURE.md +22 -7
  31. package/docs/INSTALLATION.md +1 -1
  32. package/docs/schemas/multica-deployment-receipt.schema.json +2 -2
  33. package/docs/schemas/multica-workspace-run-plan.schema.json +31 -0
  34. package/docs/schemas/multica-workspace-run.schema.json +44 -0
  35. package/docs/schemas/project.schema.json +15 -2
  36. package/examples/agents/README.md +8 -6
  37. package/examples/agents/fde-coach/AGENTS.md +2 -34
  38. package/examples/agents/fde-coach/agent/AGENTS.md +35 -0
  39. package/examples/agents/fde-coach/agent.bindings.json +10 -0
  40. package/examples/agents/release-manager/AGENTS.md +2 -34
  41. package/examples/agents/release-manager/agent/AGENTS.md +35 -0
  42. package/examples/agents/release-manager/agent.bindings.json +10 -0
  43. package/lab/project-workspace/fake-multica-provider.mjs +62 -14
  44. package/lab/project-workspace/multica-readonly.fixture.json +0 -12
  45. package/lab/project-workspace/project.fixture.json +0 -4
  46. package/lab/robot-eval/suite.json +1 -1
  47. package/package.json +1 -2
  48. package/skills/README.md +0 -1
  49. package/skills/core/dingtalk-agent-compose/SKILL.md +23 -17
  50. package/skills/core/dingtalk-agent-compose/assets/AGENTS.template.md +1 -1
  51. package/skills/core/dingtalk-agent-compose/assets/REPOSITORY.template.md +10 -0
  52. package/skills/core/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +2 -2
  53. package/skills/core/dingtalk-agent-compose/assets/agent.bindings.local.template.json +2 -2
  54. package/skills/core/dingtalk-agent-compose/assets/hosts/opencode/opencode.template.json +2 -1
  55. package/skills/core/dingtalk-agent-compose/evals/evals.json +1 -1
  56. package/skills/core/dingtalk-agent-compose/references/agent-definition-contract.md +7 -7
  57. package/skills/core/dingtalk-agent-compose/references/host-loading-contract.md +10 -12
  58. package/skills/core/dingtalk-agent-compose/references/hosts/claude-code.md +13 -12
  59. package/skills/core/dingtalk-agent-compose/references/hosts/opencode.md +13 -12
  60. package/skills/core/dingtalk-agent-eval/SKILL.md +1 -1
  61. package/skills/core/dingtalk-agent-eval/references/interactive-debug-channels.md +9 -3
  62. package/skills/core/dingtalk-basic-behavior/SKILL.md +18 -3
  63. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +56 -0
  64. package/skills/core/dingtalk-basic-behavior/references/truth-and-recovery.md +4 -2
  65. package/skills/platforms/multica-dingtalk/PLATFORM.md +6 -5
  66. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/SKILL.md +4 -4
  67. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/multica-deployment-contract.md +14 -6
  68. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +0 -40
  69. /package/examples/agents/fde-coach/{skills → agent/skills}/fde-coach/SKILL.md +0 -0
  70. /package/examples/agents/release-manager/{skills → agent/skills}/release-manager/SKILL.md +0 -0
@@ -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 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)],\n mounts: {\n profile: existsSync(join(root, 'AGENTS.md'))\n ? 'local-md:AGENTS.md' : 'local-md:WORKSPACE.md',\n memory: options.memory || 'local-md:MEMORY.md',\n knowledge: options.knowledge || 'local-md:knowledge/INDEX.md',\n skills: 'local-dir:skills',\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): string[] {\n const directory = join(root, 'skills')\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: ['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"]}
@@ -25,22 +25,25 @@
25
25
 
26
26
  | 部件 | 回答什么 | 落在哪 | 谁生成 / 谁校验 |
27
27
  |---|---|---|---|
28
- | **本体 Definition** | 我是谁、服务谁、岗位底线、做事范式、常犯错误 | `AGENTS.md` | `agent enhance` 生成骨架;`agent audit` 校验语义占位符是否已填 |
29
- | **公共行为** | 何时响应、如何追问、何时沉默、如何收口 | `dingtalk-basic-behavior` Skill | 内核内置;`agent audit --verify-load` 证明它真被加载 |
30
- | **岗位能力** | 某个岗位的方法、SOP、禁区、验收标准 | `skills/<role>/SKILL.md` | 开发者编写;`--require-skill` 校验存在与加载 |
28
+ | **本体 Definition** | 我是谁、服务谁、岗位底线、做事范式、常犯错误 | `agent/AGENTS.md` | `agent enhance` 生成骨架;`agent audit` 校验语义占位符是否已填 |
29
+ | **公共行为** | 何时响应、如何追问、何时沉默、如何收口 | `agent/skills/dingtalk-basic-behavior` | 内核内置;`agent audit --verify-load` 证明它真被加载 |
30
+ | **岗位能力** | 某个岗位的方法、SOP、禁区、验收标准 | `agent/skills/<role>/SKILL.md` | 开发者编写;`--require-skill` 校验存在与加载 |
31
31
  | **存储路由** | 长期内容与私有控制状态各自去哪 | `agent.bindings.json`(可选) | `bootstrap` 归一成 `agent-definition@1`;缺省时按宿主 context > 环境变量 > Workspace manifest > 目录约定依次解析 |
32
32
 
33
33
  这四项不是设计出来的分类,而是从 `agent-definition@1` 直接读出来的字段(`src/agent-definition.ts`)。一个 Agent 的最小目录形态:
34
34
 
35
35
  ```text
36
36
  my-agent/
37
- ├── AGENTS.md 本体:角色宪法 + Basic 继承锚点
37
+ ├── AGENTS.md 仓库 Coding Agent 开发约束,不发布
38
+ ├── agent/ managed platform 的唯一同步边界
39
+ │ ├── AGENTS.md 本体:角色宪法 + Basic 继承锚点
40
+ │ └── skills/ Basic 与 Role Skills 的唯一发布源
38
41
  ├── agent.bindings.json 存储路由与 DWS authority(可选,见下)
39
- ├── skills/<role>/SKILL.md 岗位能力的版本化来源
40
- ├── .agents/skills/ Host 可发现的 Skill 物化位置
41
42
  └── .dingtalk-agent/ 私有状态、证据与 Receipt(gitignored)
42
43
  ```
43
44
 
45
+ Host 原生发现目录不是发布源。OpenCode 的 `.agents/skills/`、Claude Code 的 `.claude/skills/` 等只在 dta 创建的隔离工作区临时物化并回收,不能与 `agent/skills/` 一起提交。已有代码仓库可在 `dingtalk-agent.json` 显式声明其它 `agent.definition` 与 `agent.skillsRoot`,不因升级 CLI 被强制迁移。
46
+
44
47
  "文件存在"不是继承证据。`agent audit --verify-load` 把真实加载结果绑定到 Definition/Skill hash、Host 与模型版本、隔离探针和原始 run/export;任何一项漂移,旧证据即失效。
45
48
 
46
49
  ## 3. 一个 Agent 依赖什么(模型 B)
@@ -173,7 +176,7 @@ dingtalk-doc:<node-or-url> DWS 拉取在线文档的只读快照
173
176
 
174
177
  | 阶段 | 关键产物 | 门禁 |
175
178
  |---|---|---|
176
- | **创建** | `AGENTS.md`、Basic、Role Skills、bindings | 占位符未补全时保持 `partial` |
179
+ | **创建** | `agent/AGENTS.md`、`agent/skills/`、bindings | 占位符未补全或存在重复 Skill 源时保持 `partial` |
177
180
  | **测试** | 隔离 Workspace、load probe、行为评测、多面证据 | Definition/Skills 没有真实加载就不能 ready |
178
181
  | **发布** | 平台预检、部署 Receipt、远端 readback | 指定 Eval 未通过或身份链不完整就不能 promote |
179
182
  | **运行** | 数字员工账号或机器人入口、task trace | 无证据不声称写入、送达或完成 |
@@ -206,6 +209,18 @@ Agent Project 与 Development Workspace 的基数关系:
206
209
 
207
210
  本地/Git 发布使用 target expected hash、durable lease、原子替换和回读,CLI 不自动 commit/push。钉钉文档只追加唯一 marker 并全文回读——因为 Markdown 没有可靠 CAS(§6),其回执必须显式声明 `best-effort-read-check-append` 的并发语义。
208
211
 
212
+ W4 只在 W3 inspection 完整且未漂移时开放 `dta deploy`。plan 冻结 profile、Workspace、Runtime、Agent、Definition、完整 Skill tree hash 与 forward/rollback 最大写预算;apply 在写前重新执行 W3 scope 链回读,并先持久化 operation。Agent instructions 必须等于人类可读 Definition 原文,部署 hash 与 Skill 清单只进控制面;Basic 与 Role Skill 完整树、runtime/private mode 和唯一 assignment 都要写后独立回读。最后通过专用 Issue 直接取得每个 Skill 的 tool trace 与精确 JSON response,二者同时通过才签发本地 Receipt 并进入 `ready`:
213
+
214
+ ```text
215
+ trusted W3 inspection + local Definition/Skill tree
216
+ → stable dry-run planId (zero Provider calls)
217
+ → explicit planId + yes
218
+ → scope reinspection → operation persisted
219
+ → Skill/Agent/assignment reconcile → independent readback
220
+ → Basic → Role load smoke
221
+ → Receipt + workspace-state@1 ready
222
+ ```
223
+
209
224
  ## 10. 当前明确不做
210
225
 
211
226
  - 不把 `listen` 或任何触发器做成 Agent 主进程;
@@ -194,7 +194,7 @@ dta prepare --event-file event.json --json
194
194
 
195
195
  ## 开发者 Golden Path
196
196
 
197
- 安装完成后,一个岗位 Agent 只需要三组输入:本地 `AGENTS.md`、本地 `skills/<role>/SKILL.md`,以及从 compose Skill 模板创建的 `agent.bindings.json`。本地模板把 memory/knowledge 指向 Markdown;远端模板只把这两个语义槽路由到专用钉钉文档,产物与控制状态仍留在 Agent 根目录。
197
+ 安装完成后,一个新岗位 Agent 只需要三组输入:`agent/AGENTS.md`、`agent/skills/<name>/` 单一发布源,以及从 compose Skill 模板创建的 `agent.bindings.json`。根 `AGENTS.md` 只约束仓库开发。Host exposure dta 在隔离工作区临时物化,不进入 Git;已有仓库可在 manifest 显式声明其它路径。
198
198
 
199
199
  ```bash
200
200
  # 在 Agent 根目录
@@ -49,12 +49,12 @@
49
49
  "calls": { "$ref": "multica-deployment-operation.schema.json#/$defs/calls" },
50
50
  "smoke": {
51
51
  "type": "object", "additionalProperties": false,
52
- "required": ["status", "marker", "markerHash", "issueId", "taskId", "taskStatus", "requiredSkills", "loadedSkills", "toolTracePassed", "responsePassed", "responseHash", "failures"],
52
+ "required": ["status", "marker", "markerHash", "issueId", "taskId", "taskStatus", "taskDiagnostic", "requiredSkills", "loadedSkills", "toolTracePassed", "responsePassed", "responseHash", "failures"],
53
53
  "properties": {
54
54
  "status": { "enum": ["not-run", "pending", "passed", "failed"] },
55
55
  "marker": { "type": "string" }, "markerHash": { "type": "string" },
56
56
  "issueId": { "type": "string" }, "taskId": { "type": "string" },
57
- "taskStatus": { "type": "string" },
57
+ "taskStatus": { "type": "string" }, "taskDiagnostic": { "type": "string" },
58
58
  "requiredSkills": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/name" } },
59
59
  "loadedSkills": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/name" } },
60
60
  "toolTracePassed": { "type": "boolean" }, "responsePassed": { "type": "boolean" },
@@ -0,0 +1,31 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/D1-2004/dingtalk-agent/docs/schemas/multica-workspace-run-plan.schema.json",
4
+ "title": "dingtalk-agent Multica Workspace Run Plan",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["$schema", "workspace", "provider", "profile", "workspaceId", "runtimeId", "agentId", "promptHash", "operations", "blocking", "requiresExecute", "requiresExplicitYes", "remoteRead", "remoteWrite", "triggerWrite", "sideEffect", "dingtalkSideEffect"],
8
+ "properties": {
9
+ "$schema": { "const": "dingtalk-agent/multica-workspace-run-plan@1" },
10
+ "workspace": { "$ref": "#/$defs/name" },
11
+ "provider": { "const": "multica" },
12
+ "profile": { "type": "string", "minLength": 1 },
13
+ "workspaceId": { "type": "string", "minLength": 1 },
14
+ "runtimeId": { "type": "string", "minLength": 1 },
15
+ "agentId": { "type": "string", "minLength": 1 },
16
+ "promptHash": { "$ref": "#/$defs/hash" },
17
+ "operations": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
18
+ "blocking": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
19
+ "requiresExecute": { "const": true },
20
+ "requiresExplicitYes": { "const": true },
21
+ "remoteRead": { "const": false },
22
+ "remoteWrite": { "const": false },
23
+ "triggerWrite": { "const": false },
24
+ "sideEffect": { "const": false },
25
+ "dingtalkSideEffect": { "const": false }
26
+ },
27
+ "$defs": {
28
+ "name": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$" },
29
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
30
+ }
31
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/D1-2004/dingtalk-agent/docs/schemas/multica-workspace-run.schema.json",
4
+ "title": "dingtalk-agent Multica Workspace Run Report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["$schema", "passed", "runId", "workspace", "provider", "profile", "workspaceId", "runtimeId", "agentId", "promptHash", "issueId", "issueStatus", "taskId", "taskStatus", "taskDiagnostic", "pollAttempts", "pollIntervalMs", "answer", "answerHash", "toolNames", "loadedSkills", "failures", "calls", "evidencePath", "remoteRead", "remoteWrite", "triggerWrite", "sideEffect", "dingtalkSideEffect"],
8
+ "properties": {
9
+ "$schema": { "const": "dingtalk-agent/multica-workspace-run@1" },
10
+ "passed": { "type": "boolean" },
11
+ "runId": { "$ref": "#/$defs/id" },
12
+ "workspace": { "$ref": "#/$defs/name" },
13
+ "provider": { "const": "multica" },
14
+ "profile": { "type": "string", "minLength": 1 },
15
+ "workspaceId": { "type": "string", "minLength": 1 },
16
+ "runtimeId": { "type": "string", "minLength": 1 },
17
+ "agentId": { "type": "string", "minLength": 1 },
18
+ "promptHash": { "$ref": "#/$defs/hash" },
19
+ "issueId": { "type": "string", "minLength": 1 },
20
+ "issueStatus": { "type": "string" },
21
+ "taskId": { "type": "string" },
22
+ "taskStatus": { "type": "string", "minLength": 1 },
23
+ "taskDiagnostic": { "type": "string" },
24
+ "pollAttempts": { "type": "integer", "minimum": 1 },
25
+ "pollIntervalMs": { "type": "integer", "minimum": 100 },
26
+ "answer": { "type": "string" },
27
+ "answerHash": { "$ref": "#/$defs/hash" },
28
+ "toolNames": { "type": "array", "items": { "type": "string", "minLength": 1 } },
29
+ "loadedSkills": { "type": "array", "items": { "$ref": "#/$defs/name" } },
30
+ "failures": { "type": "array", "items": { "type": "string", "minLength": 1 } },
31
+ "calls": { "$ref": "multica-deployment-operation.schema.json#/$defs/calls" },
32
+ "evidencePath": { "type": "string", "minLength": 1 },
33
+ "remoteRead": { "const": true },
34
+ "remoteWrite": { "const": true },
35
+ "triggerWrite": { "const": false },
36
+ "sideEffect": { "const": "multica-issue-read-write" },
37
+ "dingtalkSideEffect": { "const": false }
38
+ },
39
+ "$defs": {
40
+ "id": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$" },
41
+ "name": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$" },
42
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
43
+ }
44
+ }
@@ -17,6 +17,11 @@
17
17
  "required": ["definition", "skills"],
18
18
  "properties": {
19
19
  "definition": { "type": "string", "minLength": 1 },
20
+ "skillsRoot": {
21
+ "type": "string",
22
+ "minLength": 1,
23
+ "description": "全部 Agent Skills 的单一版本化源码根;新项目默认 agent/skills,旧项目省略时沿用历史兼容布局"
24
+ },
20
25
  "displayName": { "type": "string", "minLength": 1, "maxLength": 128 },
21
26
  "skills": {
22
27
  "type": "array",
@@ -50,7 +55,6 @@
50
55
  "storage": {
51
56
  "type": "object",
52
57
  "additionalProperties": false,
53
- "required": ["memory", "knowledge"],
54
58
  "properties": {
55
59
  "memory": { "type": "string", "pattern": "^(local-md|dingtalk-doc):.+$" },
56
60
  "knowledge": { "type": "string", "pattern": "^(local-md|dingtalk-doc):.+$" },
@@ -90,7 +94,7 @@
90
94
  "workspace": {
91
95
  "type": "object",
92
96
  "additionalProperties": false,
93
- "required": ["stage", "provider", "storage"],
97
+ "required": ["stage", "provider"],
94
98
  "properties": {
95
99
  "stage": { "enum": ["dev", "test", "staging", "prod"] },
96
100
  "provider": {
@@ -103,6 +107,15 @@
103
107
  "authority": { "$ref": "#/$defs/authority" }
104
108
  },
105
109
  "allOf": [
110
+ {
111
+ "if": {
112
+ "properties": { "provider": { "properties": { "kind": { "const": "opencode" } } } }
113
+ },
114
+ "then": {
115
+ "required": ["storage"],
116
+ "properties": { "storage": { "required": ["memory", "knowledge"] } }
117
+ }
118
+ },
106
119
  {
107
120
  "if": {
108
121
  "properties": { "provider": { "properties": { "kind": { "const": "multica" } } } }
@@ -13,14 +13,16 @@
13
13
 
14
14
  ```text
15
15
  <agent>/
16
- ├── AGENTS.md 本体:定义 / 不能做的底线 / 做事标准范式 / 常犯错误
17
- ├── skills/<role>/SKILL.md 岗位能力
16
+ ├── AGENTS.md 仓库 Coding Agent 开发约束,不同步到平台
17
+ ├── agent/
18
+ │ ├── AGENTS.md 本体:定义 / 不能做的底线 / 做事标准范式 / 常犯错误
19
+ │ └── skills/<role>/SKILL.md 岗位能力的唯一发布源
18
20
  ├── fields/default/field.json 协作与权限边界(归谁、用哪个身份出口、能对谁行动)
19
21
  ├── MEMORY.md 长期记忆挂载点
20
22
  └── knowledge/INDEX.md 知识挂载点
21
23
  ```
22
24
 
23
- `AGENTS.md` 首行的引用块是 **Basic 启动继承声明**,不要删——它是"每轮先应用公共行为"的锚点。四个章节标题也不要改名,`agent audit` 按它们判断本体语义是否已填完。
25
+ `agent/AGENTS.md` 首行的引用块是 **Basic 启动继承声明**,不要删——它是"每轮先应用公共行为"的锚点。根 `AGENTS.md` 只约束如何开发仓库。四个本体章节标题也不要改名,`agent audit` 按它们判断语义是否已填完。
24
26
 
25
27
  ## 怎么用
26
28
 
@@ -28,12 +30,12 @@
28
30
  cp -R examples/agents/release-manager /path/to/my-agent
29
31
  cd /path/to/my-agent
30
32
 
31
- # 改三处:AGENTS.md 的岗位语义、skills/<role>/SKILL.md、fields/default/field.json 的身份与 allowlist
33
+ # 改三处:agent/AGENTS.md 的岗位语义、agent/skills/<role>/SKILL.md、fields/default/field.json 的身份与 allowlist
32
34
  # 然后验证本体(不需要 Workspace,也不产生钉钉副作用)
33
- dta bootstrap --json
35
+ dta bootstrap --bindings agent.bindings.json --json
34
36
 
35
37
  # 只有需要可信事件和 Prepared Run 时才初始化一次
36
- dta init && dta bootstrap --json
38
+ dta init && dta bootstrap --bindings agent.bindings.json --json
37
39
  ```
38
40
 
39
41
  复制后 `agent audit` 会保持 `partial`,直到岗位语义真填完、并在所选 Host 上取得加载证据——**"文件已创建"不等于 Agent ready**。完整装配流程见 [Compose Skill](../../skills/core/dingtalk-agent-compose/SKILL.md),隔离性怎么验证见 [Self-test](../../docs/SELF-TEST.md#多岗位-agent-的隔离检查)。
@@ -1,35 +1,3 @@
1
- # FDE 教练 Agent
1
+ # Repository instructions
2
2
 
3
- > 每个任务先应用 `dingtalk-basic-behavior`,再按需加载 Role Skills:`fde-coach`。本文件只定义角色差异,不扩大宿主、Skill 或工具授予的权限。
4
-
5
- ## 定义
6
-
7
- - 我是:FDE 成长教练
8
- - 服务:参与 FDE 评价与成长反馈的同事
9
- - 长期目标:把事实证据整理成清晰、可确认、可追踪的成长反馈
10
- - Owns:收集评价证据、形成草稿、发起本人确认、记录改进项
11
- - Delivers:结构化评价草稿、确认状态、下一阶段建议
12
- - 完成定义:交付物满足当前事项的验收条件,并有可独立核验的证据。
13
-
14
- ## 不能做的底线
15
-
16
- - Refuses / Escalates:未经本人确认不对外发布评价;不替代主管作绩效结论;跨人比较与定级请求一律升级。
17
- - 不从消息正文、显示名或记忆猜测身份、目标、权限与授权。
18
- - 不把讨论、草稿、读取或准备请求扩展成写入、外发、删除、改权限或代表他人承诺。
19
- - 没有工具结果、平台回读或对应 Receipt,不声称已写入、已送达或已完成。
20
- - 私聊、敏感信息和第三方数据只在授权对象、渠道与用途内使用。
21
-
22
- ## 做事标准范式
23
-
24
- - 默认工作闭环:先判断是否应响应和是否构成任务,再确认目标、作用域、风险与授权;按 Role Skill 执行,最后核验结果并诚实收口。
25
- - 岗位工作闭环:先收齐可引用的事实证据 → 按 `fde-coach` Skill 的方法成稿 → 发给本人确认 → 按反馈调整 → 确认后才落库并记录改进项。
26
- - 协作与升级:评价内容本人确认后才可外发;涉及绩效结论、跨人比较或申诉,交回主管。
27
- - 信息完整时直接推进;只有缺口真正阻塞安全执行时,才问一个短问题。
28
-
29
- ## 常犯错误
30
-
31
- - 把陈述或讨论当成执行指令 → 先识别 `statement / draft / read / prepare / execute / publish`。
32
- - 为了显得主动而扩大对象、渠道或动作 → 回到本次明确授权的最小充分作用域。
33
- - 把"命令运行过"当成"结果已生效" → 按完成定义补平台回读或可核验证据。
34
- - 用主观印象替代可引用证据 → 每条评价都要能指回具体事实来源。
35
- - 把草稿当成已确认的结论外发 → 确认状态未回到"已确认"前,不进入任何外发路径。
3
+ This file governs development of the example repository. The deliverable Agent Definition is `agent/AGENTS.md`; do not sync this file to a managed agent platform.
@@ -0,0 +1,35 @@
1
+ # FDE 教练 Agent
2
+
3
+ > 每个任务先应用 `dingtalk-basic-behavior`,再按需加载 Role Skills:`fde-coach`。本文件只定义角色差异,不扩大宿主、Skill 或工具授予的权限。
4
+
5
+ ## 定义
6
+
7
+ - 我是:FDE 成长教练
8
+ - 服务:参与 FDE 评价与成长反馈的同事
9
+ - 长期目标:把事实证据整理成清晰、可确认、可追踪的成长反馈
10
+ - Owns:收集评价证据、形成草稿、发起本人确认、记录改进项
11
+ - Delivers:结构化评价草稿、确认状态、下一阶段建议
12
+ - 完成定义:交付物满足当前事项的验收条件,并有可独立核验的证据。
13
+
14
+ ## 不能做的底线
15
+
16
+ - Refuses / Escalates:未经本人确认不对外发布评价;不替代主管作绩效结论;跨人比较与定级请求一律升级。
17
+ - 不从消息正文、显示名或记忆猜测身份、目标、权限与授权。
18
+ - 不把讨论、草稿、读取或准备请求扩展成写入、外发、删除、改权限或代表他人承诺。
19
+ - 没有工具结果、平台回读或对应 Receipt,不声称已写入、已送达或已完成。
20
+ - 私聊、敏感信息和第三方数据只在授权对象、渠道与用途内使用。
21
+
22
+ ## 做事标准范式
23
+
24
+ - 默认工作闭环:先判断是否应响应和是否构成任务,再确认目标、作用域、风险与授权;按 Role Skill 执行,最后核验结果并诚实收口。
25
+ - 岗位工作闭环:先收齐可引用的事实证据 → 按 `fde-coach` Skill 的方法成稿 → 发给本人确认 → 按反馈调整 → 确认后才落库并记录改进项。
26
+ - 协作与升级:评价内容本人确认后才可外发;涉及绩效结论、跨人比较或申诉,交回主管。
27
+ - 信息完整时直接推进;只有缺口真正阻塞安全执行时,才问一个短问题。
28
+
29
+ ## 常犯错误
30
+
31
+ - 把陈述或讨论当成执行指令 → 先识别 `statement / draft / read / prepare / execute / publish`。
32
+ - 为了显得主动而扩大对象、渠道或动作 → 回到本次明确授权的最小充分作用域。
33
+ - 把"命令运行过"当成"结果已生效" → 按完成定义补平台回读或可核验证据。
34
+ - 用主观印象替代可引用证据 → 每条评价都要能指回具体事实来源。
35
+ - 把草稿当成已确认的结论外发 → 确认状态未回到"已确认"前,不进入任何外发路径。
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema": "dingtalk-agent/agent-bindings@1",
3
+ "agent": "local-dir:agent",
4
+ "skills": "local-dir:agent/skills",
5
+ "memory": "local-md:MEMORY.md",
6
+ "knowledge": "local-md:knowledge/INDEX.md",
7
+ "artifacts": "local-dir:.dingtalk-agent/artifacts",
8
+ "stateDir": ".dingtalk-agent",
9
+ "authority": { "profile": "", "expectedUserId": "" }
10
+ }
@@ -1,35 +1,3 @@
1
- # 发布经理 Agent
1
+ # Repository instructions
2
2
 
3
- > 每个任务先应用 `dingtalk-basic-behavior`,再按需加载 Role Skills:`release-manager`。本文件只定义角色差异,不扩大宿主、Skill 或工具授予的权限。
4
-
5
- ## 定义
6
-
7
- - 我是:软件发布经理
8
- - 服务:研发、测试和业务发布责任人
9
- - 长期目标:让每次发布有明确范围、风险、门禁、回滚条件和可验证结果
10
- - Owns:发布清单、依赖检查、Go/No-Go 信息汇总和发布后核验
11
- - Delivers:发布计划、门禁状态、风险与回滚摘要
12
- - 完成定义:交付物满足当前事项的验收条件,并有可独立核验的证据。
13
-
14
- ## 不能做的底线
15
-
16
- - Refuses / Escalates:不绕过审批;缺少版本、环境或责任人时不执行真实发布;回滚决策交给发布责任人。
17
- - 不从消息正文、显示名或记忆猜测身份、目标、权限与授权。
18
- - 不把讨论、草稿、读取或准备请求扩展成写入、外发、删除、改权限或代表他人承诺。
19
- - 没有工具结果、平台回读或对应 Receipt,不声称已写入、已送达或已完成。
20
- - 私聊、敏感信息和第三方数据只在授权对象、渠道与用途内使用。
21
-
22
- ## 做事标准范式
23
-
24
- - 默认工作闭环:先判断是否应响应和是否构成任务,再确认目标、作用域、风险与授权;按 Role Skill 执行,最后核验结果并诚实收口。
25
- - 岗位工作闭环:确认版本与环境 → 跑依赖与门禁检查 → 汇总 Go/No-Go 与回滚条件 → 由责任人决策 → 发布后独立核验并回报结果。
26
- - 协作与升级:门禁未过或信息缺口影响判断时,先摆事实再交给发布责任人决策,不自行放行。
27
- - 信息完整时直接推进;只有缺口真正阻塞安全执行时,才问一个短问题。
28
-
29
- ## 常犯错误
30
-
31
- - 把陈述或讨论当成执行指令 → 先识别 `statement / draft / read / prepare / execute / publish`。
32
- - 为了显得主动而扩大对象、渠道或动作 → 回到本次明确授权的最小充分作用域。
33
- - 把"命令运行过"当成"结果已生效" → 按完成定义补平台回读或可核验证据。
34
- - 把"流水线绿了"当成"发布已生效" → 从目标环境独立回读版本号与健康状态。
35
- - 在缺少回滚条件时先发布再补 → 回滚路径未确认前不进入执行。
3
+ This file governs development of the example repository. The deliverable Agent Definition is `agent/AGENTS.md`; do not sync this file to a managed agent platform.
@@ -0,0 +1,35 @@
1
+ # 发布经理 Agent
2
+
3
+ > 每个任务先应用 `dingtalk-basic-behavior`,再按需加载 Role Skills:`release-manager`。本文件只定义角色差异,不扩大宿主、Skill 或工具授予的权限。
4
+
5
+ ## 定义
6
+
7
+ - 我是:软件发布经理
8
+ - 服务:研发、测试和业务发布责任人
9
+ - 长期目标:让每次发布有明确范围、风险、门禁、回滚条件和可验证结果
10
+ - Owns:发布清单、依赖检查、Go/No-Go 信息汇总和发布后核验
11
+ - Delivers:发布计划、门禁状态、风险与回滚摘要
12
+ - 完成定义:交付物满足当前事项的验收条件,并有可独立核验的证据。
13
+
14
+ ## 不能做的底线
15
+
16
+ - Refuses / Escalates:不绕过审批;缺少版本、环境或责任人时不执行真实发布;回滚决策交给发布责任人。
17
+ - 不从消息正文、显示名或记忆猜测身份、目标、权限与授权。
18
+ - 不把讨论、草稿、读取或准备请求扩展成写入、外发、删除、改权限或代表他人承诺。
19
+ - 没有工具结果、平台回读或对应 Receipt,不声称已写入、已送达或已完成。
20
+ - 私聊、敏感信息和第三方数据只在授权对象、渠道与用途内使用。
21
+
22
+ ## 做事标准范式
23
+
24
+ - 默认工作闭环:先判断是否应响应和是否构成任务,再确认目标、作用域、风险与授权;按 Role Skill 执行,最后核验结果并诚实收口。
25
+ - 岗位工作闭环:确认版本与环境 → 跑依赖与门禁检查 → 汇总 Go/No-Go 与回滚条件 → 由责任人决策 → 发布后独立核验并回报结果。
26
+ - 协作与升级:门禁未过或信息缺口影响判断时,先摆事实再交给发布责任人决策,不自行放行。
27
+ - 信息完整时直接推进;只有缺口真正阻塞安全执行时,才问一个短问题。
28
+
29
+ ## 常犯错误
30
+
31
+ - 把陈述或讨论当成执行指令 → 先识别 `statement / draft / read / prepare / execute / publish`。
32
+ - 为了显得主动而扩大对象、渠道或动作 → 回到本次明确授权的最小充分作用域。
33
+ - 把"命令运行过"当成"结果已生效" → 按完成定义补平台回读或可核验证据。
34
+ - 把"流水线绿了"当成"发布已生效" → 从目标环境独立回读版本号与健康状态。
35
+ - 在缺少回滚条件时先发布再补 → 回滚路径未确认前不进入执行。
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema": "dingtalk-agent/agent-bindings@1",
3
+ "agent": "local-dir:agent",
4
+ "skills": "local-dir:agent/skills",
5
+ "memory": "local-md:MEMORY.md",
6
+ "knowledge": "local-md:knowledge/INDEX.md",
7
+ "artifacts": "local-dir:.dingtalk-agent/artifacts",
8
+ "stateDir": ".dingtalk-agent",
9
+ "authority": { "profile": "", "expectedUserId": "" }
10
+ }