@xdxer/dingtalk-agent 0.1.4 → 0.1.5-beta.10

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 (186) hide show
  1. package/CHANGELOG.md +232 -0
  2. package/README.en.md +115 -89
  3. package/README.md +111 -86
  4. package/dist/bin/dingtalk-agent.js +742 -152
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +3 -2
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +202 -85
  9. package/dist/src/agent-audit.js.map +1 -1
  10. package/dist/src/agent-definition.js +7 -3
  11. package/dist/src/agent-definition.js.map +1 -1
  12. package/dist/src/agent-enhance.js +51 -32
  13. package/dist/src/agent-enhance.js.map +1 -1
  14. package/dist/src/agent-platform.js +4 -4
  15. package/dist/src/agent-platform.js.map +1 -1
  16. package/dist/src/bootstrap.js +6 -2
  17. package/dist/src/bootstrap.js.map +1 -1
  18. package/dist/src/development-workspace.js +210 -34
  19. package/dist/src/development-workspace.js.map +1 -1
  20. package/dist/src/doctor.js +65 -9
  21. package/dist/src/doctor.js.map +1 -1
  22. package/dist/src/dws.js +67 -3
  23. package/dist/src/dws.js.map +1 -1
  24. package/dist/src/init.js +2 -1
  25. package/dist/src/init.js.map +1 -1
  26. package/dist/src/memory/noop-receipt.js +306 -0
  27. package/dist/src/memory/noop-receipt.js.map +1 -0
  28. package/dist/src/memory/operational.js +27 -3
  29. package/dist/src/memory/operational.js.map +1 -1
  30. package/dist/src/memory/remote-state.js +2 -1
  31. package/dist/src/memory/remote-state.js.map +1 -1
  32. package/dist/src/multica-deploy.js +692 -125
  33. package/dist/src/multica-deploy.js.map +1 -1
  34. package/dist/src/multica-provider.js +303 -25
  35. package/dist/src/multica-provider.js.map +1 -1
  36. package/dist/src/multica-runtime-vocabulary.js +110 -0
  37. package/dist/src/multica-runtime-vocabulary.js.map +1 -0
  38. package/dist/src/opencode-evals.js +6 -6
  39. package/dist/src/opencode-evals.js.map +1 -1
  40. package/dist/src/opencode-provider.js +21 -7
  41. package/dist/src/opencode-provider.js.map +1 -1
  42. package/dist/src/opencode-workspace.js +3 -3
  43. package/dist/src/opencode-workspace.js.map +1 -1
  44. package/dist/src/personal-event-evals.js +4 -2
  45. package/dist/src/personal-event-evals.js.map +1 -1
  46. package/dist/src/promotion.js +2 -1
  47. package/dist/src/promotion.js.map +1 -1
  48. package/dist/src/remote-semantic-state-live-evals.js +14 -8
  49. package/dist/src/remote-semantic-state-live-evals.js.map +1 -1
  50. package/dist/src/remote-state-evals.js +2 -2
  51. package/dist/src/remote-state-evals.js.map +1 -1
  52. package/dist/src/robot-evals.js +3 -3
  53. package/dist/src/robot-evals.js.map +1 -1
  54. package/dist/src/schedule-plan.js +380 -0
  55. package/dist/src/schedule-plan.js.map +1 -0
  56. package/dist/src/sessions.js +1 -1
  57. package/dist/src/sessions.js.map +1 -1
  58. package/dist/src/skill-manager.js +145 -13
  59. package/dist/src/skill-manager.js.map +1 -1
  60. package/dist/src/skills.js +2 -0
  61. package/dist/src/skills.js.map +1 -1
  62. package/dist/src/tui.js +369 -0
  63. package/dist/src/tui.js.map +1 -0
  64. package/dist/src/upgrade.js +113 -33
  65. package/dist/src/upgrade.js.map +1 -1
  66. package/dist/src/waits.js +2 -1
  67. package/dist/src/waits.js.map +1 -1
  68. package/dist/src/workspace.js +12 -7
  69. package/dist/src/workspace.js.map +1 -1
  70. package/docs/AGENT-IN-PRODUCTION.md +255 -0
  71. package/docs/ARCHITECTURE.md +366 -0
  72. package/docs/INSTALLATION.md +8 -8
  73. package/docs/PLATFORM-GUARDRAILS.md +188 -0
  74. package/docs/PRIOR-ART.md +126 -0
  75. package/docs/SELF-TEST.md +182 -0
  76. package/docs/architecture/agent-platform-connection-layer.svg +120 -0
  77. package/docs/architecture/digital-employee-composition.svg +92 -0
  78. package/docs/architecture/dingtalk-agent-architecture.svg +125 -0
  79. package/docs/assets/digital-employee-at-work.svg +77 -0
  80. package/docs/schemas/multica-deployment-plan.schema.json +3 -1
  81. package/docs/schemas/multica-deployment-receipt.schema.json +17 -3
  82. package/docs/schemas/multica-deployment-status.schema.json +6 -2
  83. package/docs/schemas/multica-workspace-inspection.schema.json +16 -0
  84. package/docs/schemas/multica-workspace-run-plan.schema.json +31 -0
  85. package/docs/schemas/multica-workspace-run.schema.json +161 -0
  86. package/docs/schemas/multica-workspace-status.schema.json +2 -0
  87. package/docs/schemas/project.schema.json +54 -3
  88. package/docs/schemas/workspace-scaffold.schema.json +38 -0
  89. package/examples/agents/README.md +45 -0
  90. package/examples/agents/fde-coach/AGENTS.md +2 -25
  91. package/examples/agents/fde-coach/agent/AGENTS.md +35 -0
  92. package/examples/agents/fde-coach/agent.bindings.json +10 -0
  93. package/examples/agents/release-manager/AGENTS.md +2 -25
  94. package/examples/agents/release-manager/agent/AGENTS.md +35 -0
  95. package/examples/agents/release-manager/agent.bindings.json +10 -0
  96. package/lab/agent-eval/catalog.json +5 -5
  97. package/lab/agent-eval/classic-failures.json +4 -4
  98. package/lab/agent-eval/completion-gate-regression.json +9 -9
  99. package/lab/agent-eval/personal-event-live.example.json +3 -3
  100. package/lab/agent-eval/remote-semantic-state-live.example.json +1 -1
  101. package/lab/agent-eval/workspace/opencode.json +2 -2
  102. package/lab/project-workspace/fake-multica-provider.mjs +171 -17
  103. package/lab/project-workspace/multica-deploy.fixture.json +2 -2
  104. package/lab/project-workspace/multica-readonly.fixture.json +4 -16
  105. package/lab/project-workspace/opencode-provider-suite.json +3 -3
  106. package/lab/project-workspace/project.fixture.json +2 -6
  107. package/lab/robot-eval/suite.json +1 -1
  108. package/lab/robot-eval/workspace/AGENTS.md +1 -1
  109. package/lab/robot-eval/workspace/opencode.json +2 -2
  110. package/lab/schemas/personal-event-eval.schema.json +1 -1
  111. package/package.json +18 -11
  112. package/skills/README.md +10 -8
  113. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/SKILL.md +49 -24
  114. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/AGENTS.template.md +1 -1
  115. package/skills/core/dta-agent-compose/assets/REPOSITORY.template.md +10 -0
  116. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +2 -2
  117. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.local.template.json +2 -2
  118. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/hosts/opencode/opencode.template.json +3 -2
  119. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/evals/evals.json +4 -4
  120. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/agent-definition-contract.md +7 -7
  121. package/skills/core/dta-agent-compose/references/drive-and-schedules.md +166 -0
  122. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/host-loading-contract.md +11 -13
  123. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/claude-code.md +13 -12
  124. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/opencode.md +14 -13
  125. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/SKILL.md +28 -3
  126. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/assets/eval-catalog.template.json +1 -1
  127. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/evals/evals.json +1 -1
  128. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/eval-topology.md +3 -3
  129. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/interactive-debug-channels.md +10 -4
  130. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/SKILL.md +21 -5
  131. package/skills/core/dta-basic-behavior/references/event-to-behavior.md +38 -0
  132. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/memory-and-evolution.md +3 -1
  133. package/skills/core/dta-basic-behavior/references/perception-and-gates.md +87 -0
  134. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/risk-authority-and-privacy.md +12 -0
  135. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/truth-and-recovery.md +4 -2
  136. package/skills/core/dta-people-group-memory/COMPLETENESS.md +36 -0
  137. package/skills/core/dta-people-group-memory/SKILL.md +69 -0
  138. package/skills/core/dta-people-group-memory/references/adapters.md +273 -0
  139. package/skills/core/dta-people-group-memory/references/assembly-guidance.md +40 -0
  140. package/skills/core/dta-people-group-memory/references/binding.md +110 -0
  141. package/skills/core/dta-people-group-memory/references/cold-start.md +70 -0
  142. package/skills/core/dta-people-group-memory/references/config-binding.md +89 -0
  143. package/skills/core/dta-people-group-memory/references/consent-and-visibility.md +83 -0
  144. package/skills/core/dta-people-group-memory/references/consolidation.md +162 -0
  145. package/skills/core/dta-people-group-memory/references/event-ingest.md +103 -0
  146. package/skills/core/dta-people-group-memory/references/guided-setup.md +70 -0
  147. package/skills/core/dta-people-group-memory/references/model.md +148 -0
  148. package/skills/core/dta-people-group-memory/references/storage-port.md +107 -0
  149. package/skills/platforms/deap/PLATFORM.md +30 -1
  150. package/skills/platforms/multica-dingtalk/PLATFORM.md +35 -9
  151. package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/SKILL.md +10 -8
  152. package/skills/platforms/multica-dingtalk/dta-deploy-multica/references/multica-deployment-contract.md +67 -0
  153. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/SKILL.md +81 -11
  154. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/bootstrap.sh +2 -2
  155. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/multica_ext.py +264 -16
  156. package/dist/src/map.js +0 -157
  157. package/dist/src/map.js.map +0 -1
  158. package/docs/SECOND-AGENT-ACCEPTANCE.md +0 -62
  159. package/docs/architecture/agent-memory-topology.png +0 -0
  160. package/docs/architecture/agent-memory-topology.svg +0 -132
  161. package/docs/architecture/dingtalk-agent-blueprint.png +0 -0
  162. package/docs/architecture/durable-async-agent-runtime.png +0 -0
  163. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  164. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  165. package/docs/architecture/task-completion-gate.png +0 -0
  166. package/docs/assets/agent-delivery-lifecycle.svg +0 -103
  167. package/skills/core/dingtalk-basic-behavior/references/event-to-behavior.md +0 -24
  168. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +0 -28
  169. package/skills/platforms/deap/README.md +0 -3
  170. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +0 -40
  171. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/multica-deployment-contract.md +0 -49
  172. /package/examples/agents/fde-coach/{skills → agent/skills}/fde-coach/SKILL.md +0 -0
  173. /package/examples/agents/release-manager/{skills → agent/skills}/release-manager/SKILL.md +0 -0
  174. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/role-skill.template.md +0 -0
  175. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/storage-routing.md +0 -0
  176. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/evidence-contract.md +0 -0
  177. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/failure-to-case.md +0 -0
  178. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/local-connector-smoke.md +0 -0
  179. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/scenario-taxonomy.md +0 -0
  180. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/storage-modes.md +0 -0
  181. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
  182. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/task-checkpoint.json +0 -0
  183. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/action-contract.md +0 -0
  184. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/runtime-modes.md +0 -0
  185. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/task-lifecycle.md +0 -0
  186. /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/promotion-observation-contract.md +0 -0
@@ -2,6 +2,7 @@ import { copyFileSync, cpSync, existsSync, mkdirSync, readFileSync, renameSync,
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { basename, dirname, join, relative, resolve } from 'node:path';
4
4
  import { digest, stableStringify } from './events.js';
5
+ import { GLOBAL_SKILL_NAME, isBasicSkillName } from './skill-manager.js';
5
6
  export function buildBootstrapDefinition(mounts, config, workspace = null) {
6
7
  const bodyMount = mounts.find((item) => item.slot === 'body') ||
7
8
  mounts.find((item) => item.slot === 'profile') ||
@@ -21,11 +22,14 @@ export function buildBootstrapDefinition(mounts, config, workspace = null) {
21
22
  : (workspace?.skills || []).map((name) => ({
22
23
  name, version: '', source: `workspace:${name}`, path: '', hash: '',
23
24
  }));
24
- const skills = configuredSkills.some((item) => item.name === 'dingtalk-basic-behavior')
25
+ // legacy-aware 判定,且保留挂载条目原本的 name path。写死新名会让改名前的
26
+ // Agent package 凭空多出一条无 path 的合成 Basic:它排在最前,下游 `find(isBasicSkillName)`
27
+ // 会先命中它,于是 audit 去看新名路径、报「缺失」,而真正挂着的旧名目录根本没被检查。
28
+ const skills = configuredSkills.some((item) => isBasicSkillName(item.name))
25
29
  ? configuredSkills
26
30
  : [{
27
- name: 'dingtalk-basic-behavior', version: '',
28
- source: 'bundled:dingtalk-basic-behavior', path: '', hash: '',
31
+ name: GLOBAL_SKILL_NAME, version: '',
32
+ source: `bundled:${GLOBAL_SKILL_NAME}`, path: '', hash: '',
29
33
  }, ...configuredSkills];
30
34
  const sourcePath = config.sourcePath ? resolve(config.sourcePath) : '';
31
35
  const gitRevision = sourcePath ? readGitRevision(sourcePath) : '';
@@ -1 +1 @@
1
- {"version":3,"file":"agent-definition.js","sourceRoot":"","sources":["../../src/agent-definition.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n copyFileSync, cpSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { spawnSync } from 'node:child_process'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\nimport { digest, stableStringify } from './events.js'\nimport type { AgentDefinition } from './types.js'\nimport type { BootstrapMount } from './bootstrap.js'\nimport type { SkillManifest } from './skills.js'\nimport type { MountSnapshot, WorkspaceSpec } from './workspace.js'\n\ntype Origin = AgentDefinition['configuration'][string]\n\nexport interface DefinitionConfig {\n source: string\n sourcePath?: string\n memory: string\n knowledge: string\n artifacts: string\n state: string\n dwsProfile: string\n expectedUserId: string\n origins: Record<string, Origin>\n}\n\nexport function buildBootstrapDefinition(\n mounts: BootstrapMount[],\n config: DefinitionConfig,\n workspace: WorkspaceSpec | null = null,\n): AgentDefinition {\n const bodyMount = mounts.find((item) => item.slot === 'body') ||\n mounts.find((item) => item.slot === 'profile') ||\n mounts.find((item) => item.slot === 'workspace') || null\n const discoveredSkills = mounts\n .filter((item) => item.slot.startsWith('skill:'))\n .map((item) => {\n const metadata = readSkillMetadata(item.path)\n return {\n name: metadata.name || item.slot.slice('skill:'.length),\n version: metadata.version, source: item.source,\n path: item.path, hash: item.hash,\n }\n })\n const configuredSkills = discoveredSkills.length\n ? discoveredSkills\n : (workspace?.skills || []).map((name) => ({\n name, version: '', source: `workspace:${name}`, path: '', hash: '',\n }))\n const skills = configuredSkills.some((item) => item.name === 'dingtalk-basic-behavior')\n ? configuredSkills\n : [{\n name: 'dingtalk-basic-behavior', version: '',\n source: 'bundled:dingtalk-basic-behavior', path: '', hash: '',\n }, ...configuredSkills]\n const sourcePath = config.sourcePath ? resolve(config.sourcePath) : ''\n const gitRevision = sourcePath ? readGitRevision(sourcePath) : ''\n const sourceKind: AgentDefinition['source']['kind'] = workspace\n ? 'workspace'\n : config.source.startsWith('dingtalk-doc:')\n ? 'dingtalk-doc'\n : gitRevision ? 'git-checkout' : 'local-folder'\n const id = cleanId(workspace?.id || (sourcePath ? basename(sourcePath) : config.source))\n return finalize({\n $schema: 'dingtalk-agent/agent-definition@1',\n id,\n source: { kind: sourceKind, uri: config.source, revision: gitRevision },\n body: bodyMount ? { path: bodyMount.path, hash: bodyMount.hash } : null,\n skills,\n storage: {\n memory: config.memory, knowledge: config.knowledge,\n artifacts: config.artifacts, state: config.state,\n },\n authority: {\n dwsProfile: config.dwsProfile,\n expectedUserId: config.expectedUserId,\n },\n configuration: config.origins,\n })\n}\n\n/**\n * Definition 与 Skill 一样按 Session 冻结。新 Run 只复制已验证的 Session 快照,\n * 因而在线修改 WORKSPACE.md、DWS profile 或启用 Skill 不会改变同一件事的身份。\n */\nexport function snapshotPreparedDefinition(\n runPath: string,\n sessionPath: string,\n workspace: WorkspaceSpec,\n mounts: MountSnapshot[],\n skillManifest: SkillManifest,\n): AgentDefinition {\n const sessionRoot = join(sessionPath, 'definition')\n const definitionPath = join(sessionRoot, 'definition.json')\n let definition: AgentDefinition\n if (existsSync(definitionPath)) {\n definition = verifyDefinition(sessionRoot)\n } else {\n mkdirSync(sessionRoot, { recursive: true })\n const profile = mounts.find((item) => item.slot === 'profile')\n let body: AgentDefinition['body'] = null\n if (profile?.snapshotPath) {\n const source = join(runPath, profile.snapshotPath)\n const destination = join(sessionRoot, 'body.md')\n copyFileSync(source, destination)\n const markdown = readFileSync(destination, 'utf8')\n body = { path: 'body.md', hash: digest(markdown) }\n }\n definition = finalize({\n $schema: 'dingtalk-agent/agent-definition@1',\n id: cleanId(workspace.id),\n source: {\n kind: 'workspace', uri: `workspace:${workspace.id}`,\n revision: digest(stableStringify(workspace)),\n },\n body,\n skills: skillManifest.entries.map((entry) => ({\n name: entry.name, version: entry.version, source: entry.sourcePath,\n path: entry.snapshotPath, hash: entry.hash,\n })),\n storage: {\n memory: workspace.mounts.memory,\n knowledge: workspace.mounts.knowledge,\n artifacts: 'session:artifacts',\n state: 'session:control-state',\n },\n authority: {\n dwsProfile: workspace.dws.profile,\n expectedUserId: workspace.dws.expectedUserId,\n },\n configuration: {\n agent: 'workspace', skills: 'workspace', memory: 'workspace',\n knowledge: 'workspace', artifacts: 'convention', state: 'convention',\n dwsProfile: 'workspace', expectedUserId: 'workspace',\n },\n })\n writeAtomic(definitionPath, JSON.stringify(definition, null, 2) + '\\n')\n }\n\n const destination = join(runPath, 'context', 'agent-definition')\n rmSync(destination, { recursive: true, force: true })\n cpSync(sessionRoot, destination, { recursive: true })\n return definition\n}\n\nexport function verifyPreparedDefinition(runPath: string, expectedHash = ''): AgentDefinition {\n return verifyDefinition(join(runPath, 'context', 'agent-definition'), expectedHash)\n}\n\nfunction finalize(\n input: Omit<AgentDefinition, 'status' | 'missing' | 'hash'>,\n): AgentDefinition {\n const missing: string[] = []\n if (!input.body) missing.push('body')\n if (!input.skills.length) missing.push('skills')\n if (!input.storage.memory) missing.push('storage.memory')\n if (!input.storage.knowledge) missing.push('storage.knowledge')\n const unsigned = {\n ...input,\n status: missing.length ? 'partial' as const : 'ready' as const,\n missing,\n }\n return { ...unsigned, hash: digest(stableStringify(unsigned)) }\n}\n\nfunction verifyDefinition(root: string, expectedHash = ''): AgentDefinition {\n const path = join(root, 'definition.json')\n if (!existsSync(path)) throw new Error('Agent Definition snapshot 缺少 definition.json')\n const value = JSON.parse(readFileSync(path, 'utf8')) as AgentDefinition\n const { hash, ...unsigned } = value\n if (!hash || digest(stableStringify(unsigned)) !== hash || (expectedHash && hash !== expectedHash)) {\n throw new Error('Agent Definition snapshot hash 不一致')\n }\n if (value.body) {\n const rootPath = resolve(root)\n const bodyPath = resolve(rootPath, value.body.path)\n const rel = relative(rootPath, bodyPath)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error('Agent Definition body 必须位于 snapshot 内')\n }\n const body = readFileSync(bodyPath, 'utf8')\n if (digest(body) !== value.body.hash) throw new Error('Agent Definition body 内容漂移')\n }\n return value\n}\n\nfunction readGitRevision(path: string): string {\n const run = spawnSync('git', ['-C', path, 'rev-parse', '--show-toplevel', 'HEAD'], {\n encoding: 'utf8', timeout: 2_000,\n })\n if (run.status !== 0) return ''\n const lines = String(run.stdout || '').trim().split(/\\r?\\n/)\n return lines.length >= 2 ? lines[1] : ''\n}\n\nfunction readSkillMetadata(path: string): { name: string; version: string } {\n if (!path || !existsSync(path)) return { name: '', version: '' }\n const text = readFileSync(path, 'utf8')\n const block = text.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)?.[1] || ''\n const scalar = (name: string) =>\n block.match(new RegExp(`^${name}:\\\\s*['\"]?([^'\"\\\\r\\\\n]+)['\"]?\\\\s*$`, 'm'))?.[1]?.trim() || ''\n const nestedVersion = block.match(\n /^metadata:\\s*\\r?\\n(?:[ \\t]+.*\\r?\\n)*?[ \\t]+version:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m,\n )?.[1]?.trim() || ''\n return { name: scalar('name'), version: nestedVersion || scalar('version') }\n}\n\nfunction writeAtomic(path: string, value: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, value, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction cleanId(value: string): string {\n return value.replace(/^[a-z-]+:/, '').replace(/[^a-zA-Z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'agent'\n}\n"]}
1
+ {"version":3,"file":"agent-definition.js","sourceRoot":"","sources":["../../src/agent-definition.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n copyFileSync, cpSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { spawnSync } from 'node:child_process'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\nimport { digest, stableStringify } from './events.js'\nimport { GLOBAL_SKILL_NAME, isBasicSkillName } from './skill-manager.js'\nimport type { AgentDefinition } from './types.js'\nimport type { BootstrapMount } from './bootstrap.js'\nimport type { SkillManifest } from './skills.js'\nimport type { MountSnapshot, WorkspaceSpec } from './workspace.js'\n\ntype Origin = AgentDefinition['configuration'][string]\n\nexport interface DefinitionConfig {\n source: string\n sourcePath?: string\n memory: string\n knowledge: string\n artifacts: string\n state: string\n dwsProfile: string\n expectedUserId: string\n origins: Record<string, Origin>\n}\n\nexport function buildBootstrapDefinition(\n mounts: BootstrapMount[],\n config: DefinitionConfig,\n workspace: WorkspaceSpec | null = null,\n): AgentDefinition {\n const bodyMount = mounts.find((item) => item.slot === 'body') ||\n mounts.find((item) => item.slot === 'profile') ||\n mounts.find((item) => item.slot === 'workspace') || null\n const discoveredSkills = mounts\n .filter((item) => item.slot.startsWith('skill:'))\n .map((item) => {\n const metadata = readSkillMetadata(item.path)\n return {\n name: metadata.name || item.slot.slice('skill:'.length),\n version: metadata.version, source: item.source,\n path: item.path, hash: item.hash,\n }\n })\n const configuredSkills = discoveredSkills.length\n ? discoveredSkills\n : (workspace?.skills || []).map((name) => ({\n name, version: '', source: `workspace:${name}`, path: '', hash: '',\n }))\n // 用 legacy-aware 判定,且保留挂载条目原本的 name 与 path。写死新名会让改名前的\n // Agent package 凭空多出一条无 path 的合成 Basic:它排在最前,下游 `find(isBasicSkillName)`\n // 会先命中它,于是 audit 去看新名路径、报「缺失」,而真正挂着的旧名目录根本没被检查。\n const skills = configuredSkills.some((item) => isBasicSkillName(item.name))\n ? configuredSkills\n : [{\n name: GLOBAL_SKILL_NAME, version: '',\n source: `bundled:${GLOBAL_SKILL_NAME}`, path: '', hash: '',\n }, ...configuredSkills]\n const sourcePath = config.sourcePath ? resolve(config.sourcePath) : ''\n const gitRevision = sourcePath ? readGitRevision(sourcePath) : ''\n const sourceKind: AgentDefinition['source']['kind'] = workspace\n ? 'workspace'\n : config.source.startsWith('dingtalk-doc:')\n ? 'dingtalk-doc'\n : gitRevision ? 'git-checkout' : 'local-folder'\n const id = cleanId(workspace?.id || (sourcePath ? basename(sourcePath) : config.source))\n return finalize({\n $schema: 'dingtalk-agent/agent-definition@1',\n id,\n source: { kind: sourceKind, uri: config.source, revision: gitRevision },\n body: bodyMount ? { path: bodyMount.path, hash: bodyMount.hash } : null,\n skills,\n storage: {\n memory: config.memory, knowledge: config.knowledge,\n artifacts: config.artifacts, state: config.state,\n },\n authority: {\n dwsProfile: config.dwsProfile,\n expectedUserId: config.expectedUserId,\n },\n configuration: config.origins,\n })\n}\n\n/**\n * Definition 与 Skill 一样按 Session 冻结。新 Run 只复制已验证的 Session 快照,\n * 因而在线修改 WORKSPACE.md、DWS profile 或启用 Skill 不会改变同一件事的身份。\n */\nexport function snapshotPreparedDefinition(\n runPath: string,\n sessionPath: string,\n workspace: WorkspaceSpec,\n mounts: MountSnapshot[],\n skillManifest: SkillManifest,\n): AgentDefinition {\n const sessionRoot = join(sessionPath, 'definition')\n const definitionPath = join(sessionRoot, 'definition.json')\n let definition: AgentDefinition\n if (existsSync(definitionPath)) {\n definition = verifyDefinition(sessionRoot)\n } else {\n mkdirSync(sessionRoot, { recursive: true })\n const profile = mounts.find((item) => item.slot === 'profile')\n let body: AgentDefinition['body'] = null\n if (profile?.snapshotPath) {\n const source = join(runPath, profile.snapshotPath)\n const destination = join(sessionRoot, 'body.md')\n copyFileSync(source, destination)\n const markdown = readFileSync(destination, 'utf8')\n body = { path: 'body.md', hash: digest(markdown) }\n }\n definition = finalize({\n $schema: 'dingtalk-agent/agent-definition@1',\n id: cleanId(workspace.id),\n source: {\n kind: 'workspace', uri: `workspace:${workspace.id}`,\n revision: digest(stableStringify(workspace)),\n },\n body,\n skills: skillManifest.entries.map((entry) => ({\n name: entry.name, version: entry.version, source: entry.sourcePath,\n path: entry.snapshotPath, hash: entry.hash,\n })),\n storage: {\n memory: workspace.mounts.memory,\n knowledge: workspace.mounts.knowledge,\n artifacts: 'session:artifacts',\n state: 'session:control-state',\n },\n authority: {\n dwsProfile: workspace.dws.profile,\n expectedUserId: workspace.dws.expectedUserId,\n },\n configuration: {\n agent: 'workspace', skills: 'workspace', memory: 'workspace',\n knowledge: 'workspace', artifacts: 'convention', state: 'convention',\n dwsProfile: 'workspace', expectedUserId: 'workspace',\n },\n })\n writeAtomic(definitionPath, JSON.stringify(definition, null, 2) + '\\n')\n }\n\n const destination = join(runPath, 'context', 'agent-definition')\n rmSync(destination, { recursive: true, force: true })\n cpSync(sessionRoot, destination, { recursive: true })\n return definition\n}\n\nexport function verifyPreparedDefinition(runPath: string, expectedHash = ''): AgentDefinition {\n return verifyDefinition(join(runPath, 'context', 'agent-definition'), expectedHash)\n}\n\nfunction finalize(\n input: Omit<AgentDefinition, 'status' | 'missing' | 'hash'>,\n): AgentDefinition {\n const missing: string[] = []\n if (!input.body) missing.push('body')\n if (!input.skills.length) missing.push('skills')\n if (!input.storage.memory) missing.push('storage.memory')\n if (!input.storage.knowledge) missing.push('storage.knowledge')\n const unsigned = {\n ...input,\n status: missing.length ? 'partial' as const : 'ready' as const,\n missing,\n }\n return { ...unsigned, hash: digest(stableStringify(unsigned)) }\n}\n\nfunction verifyDefinition(root: string, expectedHash = ''): AgentDefinition {\n const path = join(root, 'definition.json')\n if (!existsSync(path)) throw new Error('Agent Definition snapshot 缺少 definition.json')\n const value = JSON.parse(readFileSync(path, 'utf8')) as AgentDefinition\n const { hash, ...unsigned } = value\n if (!hash || digest(stableStringify(unsigned)) !== hash || (expectedHash && hash !== expectedHash)) {\n throw new Error('Agent Definition snapshot hash 不一致')\n }\n if (value.body) {\n const rootPath = resolve(root)\n const bodyPath = resolve(rootPath, value.body.path)\n const rel = relative(rootPath, bodyPath)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error('Agent Definition body 必须位于 snapshot 内')\n }\n const body = readFileSync(bodyPath, 'utf8')\n if (digest(body) !== value.body.hash) throw new Error('Agent Definition body 内容漂移')\n }\n return value\n}\n\nfunction readGitRevision(path: string): string {\n const run = spawnSync('git', ['-C', path, 'rev-parse', '--show-toplevel', 'HEAD'], {\n encoding: 'utf8', timeout: 2_000,\n })\n if (run.status !== 0) return ''\n const lines = String(run.stdout || '').trim().split(/\\r?\\n/)\n return lines.length >= 2 ? lines[1] : ''\n}\n\nfunction readSkillMetadata(path: string): { name: string; version: string } {\n if (!path || !existsSync(path)) return { name: '', version: '' }\n const text = readFileSync(path, 'utf8')\n const block = text.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)?.[1] || ''\n const scalar = (name: string) =>\n block.match(new RegExp(`^${name}:\\\\s*['\"]?([^'\"\\\\r\\\\n]+)['\"]?\\\\s*$`, 'm'))?.[1]?.trim() || ''\n const nestedVersion = block.match(\n /^metadata:\\s*\\r?\\n(?:[ \\t]+.*\\r?\\n)*?[ \\t]+version:\\s*['\"]?([^'\"\\r\\n]+)['\"]?\\s*$/m,\n )?.[1]?.trim() || ''\n return { name: scalar('name'), version: nestedVersion || scalar('version') }\n}\n\nfunction writeAtomic(path: string, value: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, value, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction cleanId(value: string): string {\n return value.replace(/^[a-z-]+:/, '').replace(/[^a-zA-Z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'agent'\n}\n"]}
@@ -9,8 +9,9 @@ import { instructionTargetsPath, instructionUsesGlob } from './instruction-path.
9
9
  import { resolvePackageRoot } from './package-root.js';
10
10
  import { bundledSkillPath } from './skill-manager.js';
11
11
  const NAME = /^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/;
12
- const BASIC = 'dingtalk-basic-behavior';
13
- const BASIC_INSTRUCTION = '.agents/skills/dingtalk-basic-behavior/SKILL.md';
12
+ const BASIC = 'dta-basic-behavior';
13
+ const DEFAULT_DEFINITION = 'agent/AGENTS.md';
14
+ const DEFAULT_SKILLS_ROOT = 'agent/skills';
14
15
  const DIRECTORY_HASH = digest('dingtalk-agent/directory@1');
15
16
  const TEMPLATE_MARKER = /<(?:Agent 名称|岗位\/角色|人群、团队或工作场域|长期目标|主动负责的事项|可观察的交付物|明确不做或必须升级确认的事项|岗位稳定的输入、判断、交付与验收范式|何时自行推进、何时交给谁|本体级常见错误 [12]|纠偏动作 [12]|Role Skill names|role-skill-name|Role Skill 名称|岗位职责或工作流|领域判断、输入与交付物|相邻职责或明确交接边界|岗位特有的禁区或必须升级条件|领域输入|领域方法\/SOP|领域常见错误|领域纠偏动作|可观察结果 [12]|route)>/u;
16
17
  export function planAgentEnhancement(root, options = {}) {
@@ -114,11 +115,14 @@ function buildEnhancement(root, options) {
114
115
  const projectName = String(options.projectName || existingProject?.name || inferredName).trim();
115
116
  const blockers = [];
116
117
  const warnings = [];
117
- if (existingProject && existingProject.agent?.definition !== 'AGENTS.md') {
118
- blockers.push(`现有 agent.definition=${existingProject.agent?.definition || '(missing)'};` +
119
- 'compose 当前只装配 OpenCode 项目根 AGENTS.md 原生 rule,拒绝生成双本体 Agent');
120
- }
121
- const managedGlobInstructions = conflictingManagedInstructionGlobs(rootReal, existingProject?.agent?.definition || 'AGENTS.md');
118
+ const definitionRef = existingProject?.agent?.definition || DEFAULT_DEFINITION;
119
+ const declaredSkillsRoot = existingProject?.agent?.skillsRoot || '';
120
+ const skillsRoot = declaredSkillsRoot || (existingProject ? 'skills' : DEFAULT_SKILLS_ROOT);
121
+ const basicRoot = declaredSkillsRoot
122
+ ? `${skillsRoot}/${BASIC}`
123
+ : existingProject ? `.agents/skills/${BASIC}` : `${skillsRoot}/${BASIC}`;
124
+ const basicInstruction = `${basicRoot}/SKILL.md`;
125
+ const managedGlobInstructions = conflictingManagedInstructionGlobs(rootReal, definitionRef, basicInstruction);
122
126
  if (managedGlobInstructions.length) {
123
127
  blockers.push('opencode.json#instructions 中有 glob/extglob 可能命中本体或 Basic;' +
124
128
  `请改成可证明不重叠的模式或精确路径: ${managedGlobInstructions.join(', ')}`);
@@ -128,7 +132,7 @@ function buildEnhancement(root, options) {
128
132
  if (!options.projectName && !existingProject) {
129
133
  warnings.push(`project name 由目录名推导为 ${projectName || '(invalid)'}`);
130
134
  }
131
- const discovered = discoverRoleSkills(rootReal);
135
+ const discovered = discoverRoleSkills(rootReal, skillsRoot);
132
136
  const requested = (options.roleSkills || []).map((item) => item.trim()).filter(Boolean);
133
137
  const roleCandidates = [...new Set([...discovered.names, ...requested])].sort();
134
138
  const invalidRoles = roleCandidates.filter((name) => !NAME.test(name) || name === BASIC);
@@ -151,8 +155,8 @@ function buildEnhancement(root, options) {
151
155
  }
152
156
  const bindingsValue = {
153
157
  $schema: 'dingtalk-agent/agent-bindings@1',
154
- agent: existingBindings?.agent || 'local-dir:.',
155
- skills: existingBindings?.skills || 'local-dir:skills',
158
+ agent: existingBindings?.agent || `local-dir:${dirname(definitionRef) || '.'}`,
159
+ skills: existingBindings?.skills || `local-dir:${skillsRoot}`,
156
160
  memory: options.memory || existingBindings?.memory ||
157
161
  existingLocalWorkspace?.storage?.memory || 'local-md:MEMORY.md',
158
162
  knowledge: options.knowledge || existingBindings?.knowledge ||
@@ -171,23 +175,28 @@ function buildEnhancement(root, options) {
171
175
  if (remote && (!bindingsValue.authority.profile || !bindingsValue.authority.expectedUserId)) {
172
176
  blockers.push('远端 memory/knowledge 需要同时提供 --profile 与 --expected-user-id');
173
177
  }
174
- const agentsPath = join(rootReal, 'AGENTS.md');
178
+ const agentsPath = join(rootReal, definitionRef);
179
+ const repositoryInstructionsPath = join(rootReal, 'AGENTS.md');
180
+ if (!existingProject && definitionRef !== 'AGENTS.md' &&
181
+ !existsSync(repositoryInstructionsPath)) {
182
+ files.set('AGENTS.md', readAsset(packageRoot, 'REPOSITORY.template.md'));
183
+ }
175
184
  if (!existsSync(agentsPath)) {
176
185
  const body = readAsset(packageRoot, 'AGENTS.template.md')
177
186
  .replace('<Agent 名称>', projectName || '<Agent 名称>')
178
187
  .replace('<Role Skill names>', roleSkills.join(', ') || '<Role Skill names>');
179
- files.set('AGENTS.md', body);
180
- semanticFiles.push('AGENTS.md');
188
+ files.set(definitionRef, body);
189
+ semanticFiles.push(definitionRef);
181
190
  }
182
191
  else {
183
- assertRegularFile(agentsPath, 'AGENTS.md');
192
+ assertRegularFile(agentsPath, definitionRef);
184
193
  const body = readFileSync(agentsPath, 'utf8');
185
- files.set('AGENTS.md', body);
194
+ files.set(definitionRef, body);
186
195
  if (TEMPLATE_MARKER.test(body))
187
- semanticFiles.push('AGENTS.md');
196
+ semanticFiles.push(definitionRef);
188
197
  }
189
198
  for (const name of roleSkills) {
190
- const rolePath = `skills/${name}`;
199
+ const rolePath = `${skillsRoot}/${name}`;
191
200
  const source = join(rootReal, rolePath);
192
201
  let tree;
193
202
  if (existsSync(source)) {
@@ -207,9 +216,11 @@ function buildEnhancement(root, options) {
207
216
  trees.set(rolePath, tree);
208
217
  semanticFiles.push(`${rolePath}/SKILL.md`);
209
218
  }
210
- trees.set(`.agents/skills/${name}`, tree);
219
+ if (existingProject && !declaredSkillsRoot) {
220
+ trees.set(`.agents/skills/${name}`, tree);
221
+ }
211
222
  }
212
- trees.set(`.agents/skills/${BASIC}`, readTree(bundledSkillPath(packageRoot, BASIC), 'Canonical Basic Skill'));
223
+ trees.set(basicRoot, readTree(bundledSkillPath(packageRoot, BASIC), 'Canonical Basic Skill'));
213
224
  files.set(bindingsRef, JSON.stringify(bindingsValue, null, 2) + '\n');
214
225
  const project = desiredProject(existingProject, {
215
226
  projectName, roleSkills, model: options.model || 'deepseek/deepseek-chat',
@@ -217,7 +228,7 @@ function buildEnhancement(root, options) {
217
228
  cliVersion: options.cliVersion || '', bindings: bindingsValue,
218
229
  });
219
230
  files.set('dingtalk-agent.json', JSON.stringify(project, null, 2) + '\n');
220
- files.set('opencode.json', JSON.stringify(desiredOpenCode(rootReal, roleSkills, project.agent.definition), null, 2) + '\n');
231
+ files.set('opencode.json', JSON.stringify(desiredOpenCode(rootReal, roleSkills, project.agent.definition, basicInstruction), null, 2) + '\n');
221
232
  files.set('.gitignore', desiredGitignore(rootReal, bindingsValue.stateDir));
222
233
  for (const [label, route] of Object.entries({
223
234
  memory: bindingsValue.memory, knowledge: bindingsValue.knowledge,
@@ -331,7 +342,11 @@ function desiredProject(existing, input) {
331
342
  return {
332
343
  $schema: 'dingtalk-agent/project@1', name: input.projectName,
333
344
  dtaVersion: `^${version}`,
334
- agent: { definition: 'AGENTS.md', skills: [BASIC, ...input.roleSkills] },
345
+ agent: {
346
+ definition: DEFAULT_DEFINITION,
347
+ skillsRoot: DEFAULT_SKILLS_ROOT,
348
+ skills: [BASIC, ...input.roleSkills],
349
+ },
335
350
  workspaces: { 'local-dev': localOpenCodeWorkspace(input) },
336
351
  };
337
352
  }
@@ -352,7 +367,7 @@ function localOpenCodeWorkspace(input) {
352
367
  }
353
368
  return workspace;
354
369
  }
355
- function desiredOpenCode(root, roles, definitionInstruction) {
370
+ function desiredOpenCode(root, roles, definitionInstruction, basicInstruction) {
356
371
  const path = join(root, 'opencode.json');
357
372
  let value = { $schema: 'https://opencode.ai/config.json' };
358
373
  if (existsSync(path)) {
@@ -377,8 +392,9 @@ function desiredOpenCode(root, roles, definitionInstruction) {
377
392
  const instructions = (value.instructions || []);
378
393
  value.instructions = [
379
394
  ...instructions.filter((item) => !instructionTargetsPath(root, item, definition) &&
380
- !instructionTargetsPath(root, item, BASIC_INSTRUCTION)),
381
- BASIC_INSTRUCTION,
395
+ !instructionTargetsPath(root, item, basicInstruction)),
396
+ ...(definition === 'AGENTS.md' ? [] : [definition]),
397
+ basicInstruction,
382
398
  ];
383
399
  const permission = value.permission === undefined ? {} : value.permission;
384
400
  if (!permission || typeof permission !== 'object' || Array.isArray(permission)) {
@@ -393,7 +409,7 @@ function desiredOpenCode(root, roles, definitionInstruction) {
393
409
  } };
394
410
  return value;
395
411
  }
396
- function conflictingManagedInstructionGlobs(root, definitionInstruction) {
412
+ function conflictingManagedInstructionGlobs(root, definitionInstruction, basicInstruction) {
397
413
  const path = join(root, 'opencode.json');
398
414
  if (!existsSync(path))
399
415
  return [];
@@ -404,7 +420,7 @@ function conflictingManagedInstructionGlobs(root, definitionInstruction) {
404
420
  const definition = safeRelative(definitionInstruction, 'agent.definition');
405
421
  return value.instructions.filter((item) => typeof item === 'string')
406
422
  .filter((item) => instructionUsesGlob(item) && (instructionTargetsPath(root, item, definition) ||
407
- instructionTargetsPath(root, item, BASIC_INSTRUCTION)));
423
+ instructionTargetsPath(root, item, basicInstruction)));
408
424
  }
409
425
  catch {
410
426
  return [];
@@ -455,12 +471,12 @@ function readValidatedProject(root, cliVersion) {
455
471
  inspectAgentProject(root, cliVersion);
456
472
  return JSON.parse(readFileSync(join(root, 'dingtalk-agent.json'), 'utf8'));
457
473
  }
458
- function discoverRoleSkills(root) {
459
- const base = join(root, 'skills');
474
+ function discoverRoleSkills(root, skillsRoot) {
475
+ const base = join(root, skillsRoot);
460
476
  if (!existsSync(base))
461
477
  return { names: [] };
462
478
  if (!lstatSync(base).isDirectory() || lstatSync(base).isSymbolicLink()) {
463
- throw new Error('skills 必须是 Agent 根目录内的普通目录');
479
+ throw new Error(`${skillsRoot} 必须是 Agent 根目录内的普通目录`);
464
480
  }
465
481
  const names = [];
466
482
  for (const entry of readdirSync(base, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
@@ -553,20 +569,23 @@ function sourceIdentity(root) {
553
569
  return { kind: 'git-checkout', revision };
554
570
  }
555
571
  function fileReason(path) {
572
+ if (path === DEFAULT_DEFINITION) {
573
+ return '补齐 Agent 交付本体;语义内容仍需开发者评审';
574
+ }
556
575
  if (path === 'AGENTS.md')
557
- return '补齐本体结构;语义内容仍需开发者评审';
576
+ return '区分仓库开发约束与 Agent 交付本体';
558
577
  if (path === 'agent.bindings.json')
559
578
  return '固化本体、语义存储与宿主私有状态路由';
560
579
  if (path === 'dingtalk-agent.json')
561
580
  return '把目录升级为可发现、可版本化的 Agent Project';
562
581
  if (path === 'opencode.json')
563
- return '移除冗余 AGENTS instruction,并合并唯一 Basic instruction 与 Role Skill permission';
582
+ return '绑定唯一 Agent Definition、Basic instruction 与 Role Skill permission';
564
583
  if (path === '.gitignore')
565
584
  return '防止私有 state、Receipt 与原始证据进入 Git';
566
585
  return '补齐本地语义介质入口';
567
586
  }
568
587
  function readAsset(packageRoot, name) {
569
- return readFileSync(join(bundledSkillPath(packageRoot, 'dingtalk-agent-compose'), 'assets', name), 'utf8');
588
+ return readFileSync(join(bundledSkillPath(packageRoot, 'dta-agent-compose'), 'assets', name), 'utf8');
570
589
  }
571
590
  function readTree(path, label) {
572
591
  if (!existsSync(path) || !lstatSync(path).isDirectory() || lstatSync(path).isSymbolicLink()) {