dsh-paoding 0.2.0
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/LICENSE +21 -0
- package/README.md +95 -0
- package/README_en.md +95 -0
- package/bin/dsh-paoding.mjs +12 -0
- package/cordis.patch.yml +6 -0
- package/docs/architecture.md +292 -0
- package/docs/architecture_en.md +363 -0
- package/docs/configuration.md +551 -0
- package/docs/configuration_en.md +560 -0
- package/docs/images/1.png +0 -0
- package/docs/images/2.png +0 -0
- package/docs/images/3.png +0 -0
- package/docs/images/4.png +0 -0
- package/docs/images/5.png +0 -0
- package/docs/images/6.png +0 -0
- package/docs/installation.md +364 -0
- package/docs/installation_en.md +367 -0
- package/docs/orchestration.md +254 -0
- package/docs/orchestration_en.md +255 -0
- package/install.sh +31 -0
- package/package.json +29 -0
- package/plugins/paoding-config-ui/api-core.mjs +100 -0
- package/plugins/paoding-config-ui/index.mjs +327 -0
- package/plugins/paoding-config-ui/lib/base.css +615 -0
- package/plugins/paoding-config-ui/lib/client.js +1154 -0
- package/plugins/paoding-config-ui/package.json +23 -0
- package/plugins/paoding-config-ui/runtime-inventory.mjs +212 -0
- package/presets/orchestrator/agent.cordis.yml +323 -0
- package/presets/orchestrator/preset.yml +6 -0
- package/presets/orchestrator/restrict.mjs +191 -0
- package/tools/install.mjs +24 -0
- package/tools/lib/alloc.mjs +138 -0
- package/tools/lib/cli.mjs +522 -0
- package/tools/lib/compose.mjs +647 -0
- package/tools/lib/config.mjs +297 -0
- package/tools/lib/host.mjs +288 -0
- package/tools/lib/skills.mjs +146 -0
- package/tools/lib/spans.mjs +188 -0
- package/tools/lib/state.mjs +328 -0
- package/tools/lib/util.mjs +26 -0
- package/tools/lib/wizard.mjs +516 -0
- package/tools/lib/yaml.mjs +266 -0
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
← [dsh-paoding](../README.md) | [架构](architecture.md) | [安装](installation.md) | [编排](orchestration.md) | **配置**
|
|
2
|
+
|
|
3
|
+
[中文](configuration.md) · [English](configuration_en.md)
|
|
4
|
+
|
|
5
|
+
# 配置
|
|
6
|
+
|
|
7
|
+
dsh-paoding 把「按角色分工的编排 preset」做成**配置驱动**:你手编(或让交互向导 / Web 配置 UI 帮你写)一个 YAML 配置文件,安装器(`tools/install.mjs`,CLI 与配置 UI 共用同一生成管线 `collectState` / `generateAndInstall`)在安装时据此重写目标 preset —— `~/.dsh/.agent-presets/orchestrator/agent.cordis.yml`,覆盖角色 allow、角色 persona、主 agent 白名单(`config.allow` 注入)、主 agent persona 的技能行/内联与人设追加。
|
|
8
|
+
|
|
9
|
+
配置文件描述的是**声明式意图**。目标文件每次都由「源码 preset + 本配置文件」重新生成:改配置 → 重跑安装 = 幂等同步,不会累积手工补丁。
|
|
10
|
+
|
|
11
|
+
## 1. 配置文件
|
|
12
|
+
|
|
13
|
+
### 1.1 位置与优先级
|
|
14
|
+
|
|
15
|
+
配置文件默认位置是 `$DSH_HOME/dsh-paoding.config.yml`;`$DSH_HOME` 未设置时默认为 `~/.dsh`。CLI 参数 `--config <file>` 可指定任意其它路径。
|
|
16
|
+
|
|
17
|
+
| 场景 | 行为 |
|
|
18
|
+
|---|---|
|
|
19
|
+
| 交互向导(`./install.sh`) | 检测并分配后,确认时把选择**持久化**到配置文件(默认 `~/.dsh/dsh-paoding.config.yml`,以 `0o600` 权限写入);向导重启时会以既有配置作为种子值 |
|
|
20
|
+
| `./install.sh --auto` | 非交互应用:有配置文件则应用,没有则用智能默认(≈ 静态 preset 现状,零回归);改配置后重跑即幂等应用 |
|
|
21
|
+
| `./install.sh --dry-run` | 只打印检测报告与将生成的 allow / persona 变化,不写任何文件(含配置文件);适合先预览再动手 |
|
|
22
|
+
| `./install.sh --auto --config <file>` | 用指定文件替代默认位置 |
|
|
23
|
+
| Web 配置 UI(设置 → 庖丁配置) | 面板「保存并应用」写入 preset 并把分配保存到配置文件,等价于 `--auto` + 向导保存 |
|
|
24
|
+
|
|
25
|
+
配置文件**存在但解析失败**是硬错误(直接报错退出);**不存在**则视为无配置(走智能默认或向导)。`profile`、`roles` 等顶层键的语义见下节。
|
|
26
|
+
|
|
27
|
+
CLI 参数优先级:`--profile` 显式给出时覆盖配置文件里的 `profile` 键,否则以配置文件为准,再否则默认 `web`。
|
|
28
|
+
|
|
29
|
+
### 1.2 顶层键
|
|
30
|
+
|
|
31
|
+
以下键名与 `tools/install.mjs` 的 `normalizeConfig` 一致(配置文件 schema 的唯一权威来源)。
|
|
32
|
+
|
|
33
|
+
| 顶层键 | 类型 | 语义 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `profile` | string | 检测时纳入哪个 profile 的 patch 层(`$DSH_HOME/profiles/<profile>/cordis.patch.yml`);缺省 `web` |
|
|
36
|
+
| `roles` | map | `toolName` → `{ persona?, name?, tools[], model?, provider? }`。对内置三角色(`search_external` / `design` / `implement`):覆盖 persona 与 allow 意图,并可配 `name` 显示名(只替换该角色默认 persona 首行身份句的主语,见 2.4)与专用模型(`model` / `provider`,见 2.5);其它键名 = **自定义角色**:生成全新 `delegation-<toolName>` 块并把 toolName 注入主 agent 的 `config.allow`(详见第 2、6 节) |
|
|
37
|
+
| `roles_remove` | string[] | 整条删除的内置角色 toolName 列表(只认 `search_external` / `design` / `implement`,其它名字忽略并告警;缺省 = `[]`)。删除 = 委派行 / 工具面 / 角色 persona / 主 agent 侧委派指引全部不再生成(详见 2.3) |
|
|
38
|
+
| `skills` | map | `skill` → 分配给该技能的角色 toolName 列表;安装时把 `Available skills: …` 引导句写进这些角色 persona 的尾部(详见第 7 节) |
|
|
39
|
+
| `main_agent_extra` | string[] | 追加到主 agent 白名单的工具(host 工具,如 `mcp__codegraph__codegraph_explore`、`memory_search`、`mnemon_*`);与检测库存求交,未检测到则不注入 |
|
|
40
|
+
| `main_agent_remove` | string[] | 从主 agent 白名单裁掉的基础工具(如 goal 工具族、`exit_plan_mode`);不在当前 allow 的名字警告并跳过;移除结果为空列表直接报错 |
|
|
41
|
+
| `main_agent_skills` | string[] | 主 agent 技能软引导(默认通道):每技能在 persona 末尾写一行紧凑技能行 + `Read full rules:` 路径 |
|
|
42
|
+
| `main_agent_skills_inline` | string[] | 主 agent 技能硬内联(可选):选中技能 SKILL.md 全文内联进 persona,每轮固定生效 |
|
|
43
|
+
| `main_agent_persona_extra` | string \| null | 主 agent persona 尾部追加文本。`null` / 缺省 = 用默认常量;`''` = 不追加任何内容;其它字符串 = 覆盖默认 |
|
|
44
|
+
| `main_agent_name` | string \| null | 主 agent 名称(一改两处:部署 preset 显示名与 persona 身份行 `You are the <name> agent powered by the {{model}} model.`)。trim 后 1–60 字符、不可含换行;空 / 缺省 = 保持默认(详见第 5 节) |
|
|
45
|
+
|
|
46
|
+
`roles` 语义细节:
|
|
47
|
+
|
|
48
|
+
- `roles.<toolName>.persona`:非空字符串**整体替换**该角色的部署 persona(含 `''` 与缺省 = 保留静态默认)。自定义角色缺省 persona 为 `You are the <toolName> agent. Handle tasks delegated to this role.`
|
|
49
|
+
- `roles.<toolName>.tools`:`toolName` 属内置三角色时**全量覆盖**该角色 `toolFilter.allow` 的意图(安装器再对 host 依赖的名字做检测求交);缺省 = 保留静态 allow。三角色若最终 allow 为空,安装直接报错(拒绝安装零工具角色)。
|
|
50
|
+
- `roles.<toolName>.name`:仅对内置三角色生效的可选 `string | null` 显示名(缺省 `null` = 用该角色内置默认身份)。只替换该角色**默认** persona 首行身份句的主语——design 默认 `You are the design agent.`,配 `name: UI 设计` 后为 `You are the UI 设计 agent.`,句子其余文字不动;约束、边界与示例见 2.4。
|
|
51
|
+
- `roles.<toolName>.model`:该角色的专用模型 id(可选 `string`)。配置后,该角色派出的每个子 agent 都固定用这个模型,不再随主 agent 会话当前模型走;缺省 = 不注入 `agentOptions`,子 agent 继承主 agent 的模型(详见 2.5)。
|
|
52
|
+
- `roles.<toolName>.provider`:该角色模型所在的 provider 路由(可选 `string`)。须与 `model` 成对配置才生效,只配 `provider` 会被安装器告警并忽略;只配 `model` 时沿用主 agent 的 provider 路由(详见 2.5)。
|
|
53
|
+
- `roles` 下键名不在三角色内 = 自定义角色(见第 6 节);请勿把静态角色 `search_internal_deep` 写进 `roles`(见 2.2)。
|
|
54
|
+
- 内置角色可**整体删除**:`roles_remove` 键只认三角色名,删除效果、与 `roles` 键的一致性及恢复路径见 2.3。
|
|
55
|
+
|
|
56
|
+
`main_agent_extra` 缺省 / 为空时回落到「按本次检测的智能默认」(检测到的 codegraph、`memory_search` 等归主 agent)——这也是不写任何配置时主 agent 仍能直接调 codegraph 工具的原因。
|
|
57
|
+
|
|
58
|
+
### 1.3 完整最小示例
|
|
59
|
+
|
|
60
|
+
一个覆盖全部常用键的配置文件(键序与安装器写出的 `serializeConfig` 一致):
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
# dsh-paoding(庖丁)安装配置 —— 可手编;改后重跑 ./install.sh --auto 应用。
|
|
64
|
+
# 交互向导 / 配置 UI 也会写本文件(0o600)。
|
|
65
|
+
|
|
66
|
+
profile: web # 检测时扫描 profiles/<profile>/cordis.patch.yml
|
|
67
|
+
|
|
68
|
+
roles: # toolName -> { persona?, tools[] }
|
|
69
|
+
search_external: # 内置角色:整体覆盖 persona 与 allow 意图
|
|
70
|
+
persona: |-
|
|
71
|
+
You are the external-research agent. Web research only — never modify files.
|
|
72
|
+
tools:
|
|
73
|
+
- web_search
|
|
74
|
+
- mcp__tavily__tavily_search
|
|
75
|
+
- mcp__tavily__tavily_crawl
|
|
76
|
+
- mcp__tavily__tavily_extract
|
|
77
|
+
- mcp__tavily__tavily_map
|
|
78
|
+
- mcp__tavily__tavily_research
|
|
79
|
+
- glob
|
|
80
|
+
- grep
|
|
81
|
+
- read
|
|
82
|
+
- ask_user_question
|
|
83
|
+
design: # 只改 persona、tools 留空 = 保留静态 allow
|
|
84
|
+
persona: |-
|
|
85
|
+
You are the design agent. Produce UI/UX designs and specs; never implement final code.
|
|
86
|
+
code-reviewer: # 自定义角色(toolName 匹配 /^[a-z][a-z0-9_]*$/)
|
|
87
|
+
persona: |-
|
|
88
|
+
You are the code-reviewer agent. Review diffs and files for bugs, security
|
|
89
|
+
issues and style regressions; report a prioritized list with file:line.
|
|
90
|
+
tools:
|
|
91
|
+
- read
|
|
92
|
+
- glob
|
|
93
|
+
- grep
|
|
94
|
+
- bash
|
|
95
|
+
- ask_user_question
|
|
96
|
+
- todo_write
|
|
97
|
+
|
|
98
|
+
main_agent_extra: # 追加 host 工具(未检测到的不注入)
|
|
99
|
+
- mcp__codegraph__codegraph_explore
|
|
100
|
+
- memory_search
|
|
101
|
+
main_agent_remove: # 裁基础工具(实测四项约省 ≈0.8k tokens/轮)
|
|
102
|
+
- get_goal
|
|
103
|
+
- create_goal
|
|
104
|
+
- update_goal
|
|
105
|
+
- exit_plan_mode
|
|
106
|
+
main_agent_skills: # 软引导:persona 技能行 + 主 agent 用 read 按需加载
|
|
107
|
+
- caveman
|
|
108
|
+
main_agent_skills_inline: [] # 硬内联(空 = 不用);与 skills 同列时只内联不写软行
|
|
109
|
+
main_agent_persona_extra: |- # null/缺省 = 默认 codegraph 规则;'' = 不追加;其他 = 覆盖
|
|
110
|
+
Never call codegraph_* tools without passing projectPath = {{cwd}}.
|
|
111
|
+
|
|
112
|
+
skills: # skill -> 分配给的角色(写进角色 persona 的 Available skills 引导)
|
|
113
|
+
frontend-design: [design]
|
|
114
|
+
html-ppt: [design]
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
对上例的几点说明:
|
|
118
|
+
|
|
119
|
+
- `roles.search_external` 的 tools 是**意图**:若 tavily 未启用,安装器会把 5 个 `mcp__tavily__*` 剔除,保留其余(`--dry-run` 的 removed 列表会给出原因)。
|
|
120
|
+
- `roles.design` 未写 `tools` → 保留静态 allow,只换 persona。
|
|
121
|
+
- `roles.code-reviewer` 安装后生成 `delegation-code-reviewer` 委派块,主 agent 白名单加入 `code-reviewer`,对话里直接调该 toolName 即可委派。
|
|
122
|
+
- `main_agent_persona_extra` 里的 `{{cwd}}` / `{{model}}` 是 DSH 运行时替换的占位符,必须原样保留。
|
|
123
|
+
|
|
124
|
+
## 2. 默认角色微调
|
|
125
|
+
|
|
126
|
+
### 2.1 persona 与 tools 的覆盖语义
|
|
127
|
+
|
|
128
|
+
四个默认委派角色中,安装器(`ROLES` 常量)只管理其中三个:`search_external`、`design`、`implement`。配置 `roles` 键下写这三个名字之一即可微调:
|
|
129
|
+
|
|
130
|
+
- `persona`:整体替换部署 persona。写入后该文本会进入 `dsh-tool-subagent` 实例的 `persona` 字段 —— 即子 agent 的 **deployment persona**(子 agent 会话里看到的身份与行为指引),不是追加。静态 persona 里内置的「失败汇报协议 / 行为边界」段落也会被一并替换——要保留请把原文(见 `presets/orchestrator/agent.cordis.yml` 对应块)并入你的文本。
|
|
131
|
+
- `tools`:**全量重写**该角色的 `toolFilter.allow` 意图。一句话关系:`agent.cordis.yml` 里的 allow 是静态意图,安装器以实际检测结果重写它;配置里的 `roles.<name>.tools` 就是你要覆盖的新意图 —— 检测后能留多少留多少。
|
|
132
|
+
- 角色 allow 是**精确名匹配**,不支持 glob:tavily 的 5 个工具要逐个写全(`mcp__tavily__tavily_search` … `mcp__tavily__tavily_research`)。
|
|
133
|
+
|
|
134
|
+
示例(替换 `implement` 的 persona 与 tools):下方 tools 与静态默认一致——注意它不含 `str_replace_editor`(原因见 8.2)。显式写出 tools 等于固定意图:将来静态源怎么改都不再影响本角色:
|
|
135
|
+
|
|
136
|
+
```yaml
|
|
137
|
+
roles:
|
|
138
|
+
implement:
|
|
139
|
+
persona: |-
|
|
140
|
+
You are the implementation agent. You write and edit code: read surrounding
|
|
141
|
+
context first, make surgical changes, then verify (build/test/grep). Report
|
|
142
|
+
what you changed and how you verified. On tool failure, do not retry a denied
|
|
143
|
+
operation: report the failure compactly so the orchestrator can re-delegate.
|
|
144
|
+
tools:
|
|
145
|
+
- read
|
|
146
|
+
- write
|
|
147
|
+
- edit
|
|
148
|
+
- glob
|
|
149
|
+
- grep
|
|
150
|
+
- bash
|
|
151
|
+
- skill
|
|
152
|
+
- web_search
|
|
153
|
+
- ask_user_question
|
|
154
|
+
- todo_write
|
|
155
|
+
- job_output
|
|
156
|
+
- job_list
|
|
157
|
+
- job_kill
|
|
158
|
+
- get_goal
|
|
159
|
+
- create_goal
|
|
160
|
+
- update_goal
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 2.2 search_internal_deep 是静态角色
|
|
164
|
+
|
|
165
|
+
`search_internal_deep`(全仓深度探索、只读不联网、只回摘要)同样是内置委派角色,但**不在安装器管理的三角色内**:安装器不会重写它的 persona / allow。`agent.cordis.yml` 里该角色块的注释记录了历史:2026-09-02 `memory_search` 与 codegraph 工具被**手工**移出它的 allow——重新启用相应插件后,需要按需自行加回的是这个静态角色(安装器不会代劳)。
|
|
166
|
+
|
|
167
|
+
因此:
|
|
168
|
+
|
|
169
|
+
- **不要**把 `search_internal_deep` 写进配置文件 `roles` 键 —— 非三角色键名会被当作**自定义角色**处理,安装器会再生成一个重复的 `delegation-search-internal-deep` 块,与静态块冲突。
|
|
170
|
+
- 同理它也**不在** `roles_remove` 可删名单内(该键只认三角色名,见 2.3)——它刻意保留为静态角色,不在任何配置键 / UI 里,本键也删不掉它。
|
|
171
|
+
- 想调整它的 persona / 工具面:直接编辑 `presets/orchestrator/agent.cordis.yml` 里对应 `delegation-search-internal-deep` 块的 `persona` 与 `toolFilter.allow`,然后重跑 `./install.sh --auto`。安装器只重写三角色与主 agent persona 的有限区间,静态源里其余内容(包括你这个改动)原样保留到生成文件。
|
|
172
|
+
|
|
173
|
+
### 2.3 删除内置角色:roles_remove
|
|
174
|
+
|
|
175
|
+
顶层可选键 `roles_remove`(string[],缺省 = `[]`)把内置委派角色从部署中**整条删除**,值为被删角色的 toolName。可删范围只有 `search_external` / `design` / `implement`——正好是 `roles` 键能覆盖的三个默认角色(配置 UI 里带「内置」徽标的三张卡)。范围之外的名字会被**忽略并告警**;`search_internal_deep` 删不掉(静态角色,见 2.2)。
|
|
176
|
+
|
|
177
|
+
删除即整条移除,被删角色在生成结果里整体不再出现:
|
|
178
|
+
|
|
179
|
+
- `agent.cordis.yml` 里它的 `delegation-<role>` 委派行(含角色 persona 与 `toolFilter.allow` 工具面)不再生成;
|
|
180
|
+
- 主 agent persona 里对它的委派指引 bullet(如 `- UI/design work: delegate to design.`)不再生成;
|
|
181
|
+
- 主 agent 委派面里它的委派工具名不再出现。
|
|
182
|
+
|
|
183
|
+
删除**不影响**主 agent 的通用委派通道(`subagent` / `send_message` 等照常可用)。
|
|
184
|
+
|
|
185
|
+
示例:
|
|
186
|
+
|
|
187
|
+
```yaml
|
|
188
|
+
roles_remove:
|
|
189
|
+
- design # 不再生成 delegation-design 块;主 agent persona 里的 design 委派指引一并移除
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
与 `roles` 键的关系:`roles` 里仍保留**未被删**的内置角色条目(想覆盖其 persona / tools 照旧写)。「删除」的完整状态 = `roles_remove` 含该名 **且** `roles` 无该 key —— UI / CLI 会保证这一致性,手编配置请自行保持一致;两者冲突时,生成以 `roles_remove` 为准。
|
|
193
|
+
|
|
194
|
+
恢复:
|
|
195
|
+
|
|
196
|
+
- **手编**:把名字从 `roles_remove` 移除(想恢复自定义 persona / tools,同时在 `roles` 键写回该项),重跑 `./install.sh --auto`——角色按 SRC 默认 persona 与工具面重新生成。
|
|
197
|
+
- **配置 UI**:角色列表末尾「已删除的内置角色」区一键恢复(恢复为 SRC 默认工具面)。
|
|
198
|
+
|
|
199
|
+
### 2.4 内置角色显示名:roles.\<toolName>.name
|
|
200
|
+
|
|
201
|
+
内置三角色(`search_external` / `design` / `implement`)的条目下可写可选子键 `name`(`string | null`;缺省 / `null` = 用该角色**内置默认身份**)。它的作用窄而明确:**只替换该角色默认 persona 首行身份句的主语**——身份句其余文字(职责描述、行为边界等)原样不动,工具面与委派机制一概不碰。
|
|
202
|
+
|
|
203
|
+
例:design 默认身份句是 `You are the design agent.`,配 `name: UI 设计` 后生成 `You are the UI 设计 agent.`:
|
|
204
|
+
|
|
205
|
+
```yaml
|
|
206
|
+
roles:
|
|
207
|
+
design:
|
|
208
|
+
name: UI 设计 # 只换 persona 身份句主语;tools 可省(回落默认工具面)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
约束:trim 后 1–60 字符、不可含换行;空字符串 / 缺省 = 用该角色内置默认身份(不写此子键时,身份句是 SRC 原文,安装器不做任何替换)。
|
|
212
|
+
|
|
213
|
+
边界:
|
|
214
|
+
|
|
215
|
+
- **只动 persona 身份句**:工具注册名与委派调用名(toolName)不变——主 agent 仍按 `search_external` / `design` / `implement` 委派;`restrict allow` 与主 agent persona 里的委派指引(如 `delegate to design`)也都不变。
|
|
216
|
+
- **persona 被自定义时 `name` 不生效**:同一条目写了非空 `persona`(覆盖默认 persona)时,安装器在生成时忽略 `name` 并告警——想把名字显出来,直接写进自定义 persona 首行(如 `persona: |-` 块第一句 `You are the UI 设计 agent.`),此时无需 `name` 子键。
|
|
217
|
+
- **被删除的角色不涉及**:`roles_remove` 整条删除的角色没有 persona 可改(见 2.3)。
|
|
218
|
+
- **静态角色不在列**:`search_internal_deep` 不在安装器管理的三角色内,无此子键(见 2.2)。
|
|
219
|
+
|
|
220
|
+
生效方式与主 agent 改名同构(见 5.1):
|
|
221
|
+
|
|
222
|
+
- **手编**:写子键后重跑 `./install.sh --auto`,再重启 DSH / 新会话生效。
|
|
223
|
+
- **配置 UI**:设置 → 庖丁配置 → 内置角色卡(徽标「内置」)顶部「角色显示名」输入框,空 = 默认;点「保存并应用」后**重启 GUI / 新会话**生效。
|
|
224
|
+
|
|
225
|
+
### 2.5 角色专用模型:roles.\<toolName>.model / .provider
|
|
226
|
+
|
|
227
|
+
角色条目下还有两个可选子键,把该角色的子 agent **固定在指定模型上**:`model`(`string`,模型 id)与 `provider`(`string`,provider 路由)。内置三角色与自定义角色条目都支持这两个子键;`search_internal_deep` 是静态角色、不收它们——把它(或任何非三角色名)写进 `roles` 仍会被当**自定义角色**处理,约束与 2.2 一致。
|
|
228
|
+
|
|
229
|
+
生成语义:配置后,安装器在该角色委派块的 `config.toolName:` 行后注入一段 `agentOptions:`(`provider` 在前、`model` 在后),DSH 的 `dsh-tool-subagent` 把 `agentOptions` 应用到该角色派出的**每一个**子 agent。两个键都缺省 = 不注入 `agentOptions`,子 agent 继承主 agent 会话当前模型(UI 模型选择器 / 全局默认)。对 `continuable` 子 agent 同样成立:冷恢复时 descriptor 已记录该子 agent 的 `agentProvider` / `agentModel`,恢复之后跑的仍是该角色自己的模型。
|
|
230
|
+
|
|
231
|
+
```yaml
|
|
232
|
+
roles:
|
|
233
|
+
implement:
|
|
234
|
+
provider: deepseek-official
|
|
235
|
+
model: deepseek-v4-pro # implement 固定用 pro 档
|
|
236
|
+
search_external:
|
|
237
|
+
model: deepseek-v4-flash # 不配 provider = 沿用主 agent 的 provider 路由
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
规则与边界:
|
|
241
|
+
|
|
242
|
+
- **provider 须与 model 成对**:只写 `provider` 不生效——安装器告警并忽略;只写 `model` 合法,此时沿用主 agent 的 provider 路由。
|
|
243
|
+
- **路由与模型 id 必须真实存在**:可选路由取决于你的 DSH 部署注册了哪些 LLM 适配器——官方安装默认 `deepseek-official`(模型 `deepseek-v4-flash` / `deepseek-v4-pro` / `deepseek-v4-flash-vision-exp`);`pi-ai` 网关可在 DSH 设置里配 anthropic / openai / google 等 profile(需先备好对应凭据)。`model` 必须属于所选路由,否则该角色**每次委派**都会在运行时报错。
|
|
244
|
+
- **被删除的角色不涉及**:`roles_remove` 整条删除的角色,条目里残留的 `model` / `provider` 被忽略并告警(见 2.3)。
|
|
245
|
+
- **静态角色不在列**:`search_internal_deep` 无这两个子键(见 2.2)。
|
|
246
|
+
|
|
247
|
+
配置 UI(设置 → 庖丁配置 → 角色卡「专用模型」)中这一项是下拉选择,选项直接来自 DSH 已注册的模型路由;目录外的值(如手编配置)会以「当前配置」选项保真显示,不会被静默丢弃。
|
|
248
|
+
|
|
249
|
+
生效方式与其他配置键相同:改完重新应用(`./install.sh --auto`,或配置 UI「保存并应用」),再重启 DSH / 新会话。
|
|
250
|
+
|
|
251
|
+
这两个子键是 8.1 静态源 `agentOptions` 写法的配置层等价物(免改源码,推荐优先);需要连 `maxTokens` 一起控制时才落静态源(见 8.1)。
|
|
252
|
+
|
|
253
|
+
## 3. 主 agent 工具面
|
|
254
|
+
|
|
255
|
+
### 3.1 机制与 21 项白名单基线
|
|
256
|
+
|
|
257
|
+
主 agent 的工具面由 `presets/orchestrator/restrict.mjs`(`orchestrator-restrict`)在 `system-prompt/assemble` 瀑布上按白名单过滤。过滤是**失败自动放行全量**的(过滤器自身出错不会锁死会话);名字按已解析的工具逐个匹配,**未挂载的名字只是缺席、永远不是错误**。
|
|
258
|
+
|
|
259
|
+
`restrict.mjs` 里的常量 `MAIN_AGENT_ALLOW` 是生成 `config.allow` 的 **base**(21 项):`config.allow` 未注入时运行时直接回落该常量。要改主 agent 工具面,**不要改 `restrict.mjs` 源码**——一律用配置文件(`main_agent_extra` / `main_agent_remove`),或交互向导里的移除/恢复步骤。
|
|
260
|
+
|
|
261
|
+
| 分组 | 工具(21 项) |
|
|
262
|
+
|---|---|
|
|
263
|
+
| 角色委派 | `search_external` `design` `implement` `search_internal_deep` |
|
|
264
|
+
| 子 agent 管理 | `send_message` `list_agents` `interrupt_agent` |
|
|
265
|
+
| 内部搜索(热路径) | `glob` `grep` `read` `read_image` `bash` |
|
|
266
|
+
| 协调 | `todo_write` `ask_user_question` `get_goal` `create_goal` `update_goal` `exit_plan_mode` `job_output` `job_list` `job_kill` |
|
|
267
|
+
|
|
268
|
+
对照说明:`web_search`、全部 `mcp__tavily__*`、`write` / `edit` / `str_replace_editor`、`skill`、`workflow`、`ralph`、未过滤的 `subagent` 委派等**刻意不在**主 agent 面上(host 工具如 codegraph / `memory_search` / mnemon 同理不硬编码进源码,需要时用 `main_agent_extra` 勾选,见 3.2)。另外 `restrict.mjs` 在注册层对主 agent deny 了 `skill`(目录注入守卫查的是注册面而非模型可见面),主 agent 的技能目录注入随之归零。
|
|
269
|
+
|
|
270
|
+
### 3.2 追加工具:main_agent_extra
|
|
271
|
+
|
|
272
|
+
把 host 工具加入主 agent 面(例如想主 agent 直接做知识检索/记忆/插件工具),追加到 `main_agent_extra`:
|
|
273
|
+
|
|
274
|
+
```yaml
|
|
275
|
+
main_agent_extra:
|
|
276
|
+
- mcp__codegraph__codegraph_explore # codegraph MCP
|
|
277
|
+
- memory_search # magic-memory 插件
|
|
278
|
+
- mnemon_recall # mnemon 工具族(运行时工具,视检测而定)
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
要点:
|
|
282
|
+
|
|
283
|
+
- 追加项会进入生成的 `orchestrator-restrict config.allow`。`mcp__*` 与插件工具属 **host 依赖**:安装器只把**实际检测到**的注入 allow;没检测到(MCP 未启用、拼写错误)就静默不注入、不报错。
|
|
284
|
+
- 向导 / 配置 UI 的「主 agent」卡片里可勾选的具体 host 工具,以检测面板(工具池)为准。
|
|
285
|
+
- `main_agent_extra` 缺省/为空时,安装器回落到智能默认(检测到的 codegraph、`memory_search` 建议归主 agent)。
|
|
286
|
+
|
|
287
|
+
### 3.3 移除基础工具:main_agent_remove
|
|
288
|
+
|
|
289
|
+
把基础工具从主 agent 面裁掉(不碰源码)用 `main_agent_remove`。实测参考:移除 `[get_goal, create_goal, update_goal, exit_plan_mode]` 四项约省 **≈0.8k tokens/轮**。
|
|
290
|
+
|
|
291
|
+
```yaml
|
|
292
|
+
main_agent_remove:
|
|
293
|
+
- get_goal
|
|
294
|
+
- create_goal
|
|
295
|
+
- update_goal
|
|
296
|
+
- exit_plan_mode
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### 3.4 语义规则与边界
|
|
300
|
+
|
|
301
|
+
| 规则 | 行为 |
|
|
302
|
+
|---|---|
|
|
303
|
+
| 移除名不在当前 allow | **警告并跳过**(未检测的 host 工具、拼写错误、从未存在的名字),不中断安装 |
|
|
304
|
+
| 移除结果为空列表 | **直接报错**。`restrict.mjs` 运行时对空 allow 拒绝加载(`allow.size === 0` 抛错),安装器在安装期即拦截并提示至少保留一个工具 |
|
|
305
|
+
| 同名同时出现在 `main_agent_extra` 与 `main_agent_remove` | **remove 优先**:先追加后移除,最终不出现 |
|
|
306
|
+
| 追加/移除的名字未挂载 | 名字按名匹配已解析工具:缺席即不存在,不报错(与白名单过滤同一规则) |
|
|
307
|
+
| 结果与 21 项 base 相同 | 不注入 `config.allow`,运行时回落 `MAIN_AGENT_ALLOW`(零冗余) |
|
|
308
|
+
|
|
309
|
+
## 4. 主 agent 技能
|
|
310
|
+
|
|
311
|
+
### 4.1 两条顶层键
|
|
312
|
+
|
|
313
|
+
主 agent 没有 `skill` 工具、也没有技能目录注入(注册层 deny,见 3.1)。两条顶层键给主 agent 挂技能,与「角色 skill 分配」**同构的软引导**,差异只在加载通道:
|
|
314
|
+
|
|
315
|
+
| 对比项 | 角色(`skills` 键分配) | 主 agent |
|
|
316
|
+
|---|---|---|
|
|
317
|
+
| 引导形式 | persona 尾部一句 `Available skills: …` | 每技能一行紧凑技能行(`main_agent_skills`)或全文内联(`main_agent_skills_inline`) |
|
|
318
|
+
| 技能内容加载 | skill 目录**全量可见**(DSH 机制,目录按 cwd 收集) | persona 技能行 + 自带 `read` **按需**读全文 |
|
|
319
|
+
| 目录注入 | 有(角色工具面含 `skill` 时) | 无(注入为零) |
|
|
320
|
+
|
|
321
|
+
主 agent 技能只推荐给**任务匹配时才需要读全文**的技能(零成本);必须**无条件生效**的风格技能请用内联(4.3)。
|
|
322
|
+
|
|
323
|
+
### 4.2 软引导默认通道:main_agent_skills
|
|
324
|
+
|
|
325
|
+
默认通道,数组项为技能名:
|
|
326
|
+
|
|
327
|
+
```yaml
|
|
328
|
+
main_agent_skills:
|
|
329
|
+
- caveman
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
安装时生成器为每个选中技能在主 agent persona 末尾追加:
|
|
333
|
+
|
|
334
|
+
1. 一个分区标题行 `── Assigned skills (soft guidance: when a task matches, load the full rules with the read tool before acting, then follow them for the rest of the session) ──`;
|
|
335
|
+
2. 每技能一行**紧凑技能行**:
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
# skill: caveman — Ultra-compressed communication mode…
|
|
339
|
+
Read full rules: /Users/<you>/.dsh/skills/caveman/SKILL.md
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
描述为空时技能行只有 `# skill: <name>`。主 agent 任务匹配到该技能时,用自带 `read` 按需读 `Read full rules:` 指向的 SKILL.md 全文再遵循。
|
|
343
|
+
|
|
344
|
+
代价模型:**每技能只付一行 persona 的开销**(含绝对路径);未用到零花费;目录注入保持归零。
|
|
345
|
+
|
|
346
|
+
### 4.3 可选硬内联:main_agent_skills_inline
|
|
347
|
+
|
|
348
|
+
把风格技能全文内联进 persona、每轮固定生效:
|
|
349
|
+
|
|
350
|
+
```yaml
|
|
351
|
+
main_agent_skills_inline:
|
|
352
|
+
- caveman
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
生成器把选中技能 SKILL.md 的正文(**去掉 YAML frontmatter 后全文**)内联进 persona,每技能带标题行(`# skill: <name> — <description> (inlined)`,描述空则 `# skill: <name> (inlined)`),随后是正文。代价是固定的每轮 persona 开销(= 技能正文),适合 caveman 这类必须无条件生效的风格技能。
|
|
356
|
+
|
|
357
|
+
### 4.4 边界行为
|
|
358
|
+
|
|
359
|
+
| 情况 | 行为 |
|
|
360
|
+
|---|---|
|
|
361
|
+
| 同一技能同时列入 `main_agent_skills` 与 `main_agent_skills_inline` | **只内联**,不再重复写软行 |
|
|
362
|
+
| 找不到对应 SKILL.md | **警告并跳过**(不中断安装);对两条键各警告一次、去重 |
|
|
363
|
+
| SKILL.md 存在但正文为空 | 视为找不到,跳过 |
|
|
364
|
+
| `description` 解析 | 支持单行、引号(单/双)、折叠块(`>`)与字面块(`\|`,含标记独立成行);空白折叠、去外层引号、截断至 200 字符;缺省为空串 |
|
|
365
|
+
| SKILL.md 扫描范围 | `$DSH_HOME/skills`(默认 `~/.dsh/skills`)、`$DSH_AGENTS_HOME/skills`(默认 `~/.agents/skills`)、`<cwd>/.dsh/skills`、`<cwd>/.agents/skills`;同根内 `<root>/<name>/SKILL.md` 优先于裸 `<root>/<name>.md` |
|
|
366
|
+
|
|
367
|
+
技能名来自安装时的技能检测(同上四个根);向导 / 配置 UI 只会列出检测到的技能。
|
|
368
|
+
|
|
369
|
+
## 5. 主 agent 人设
|
|
370
|
+
|
|
371
|
+
### 5.1 主 agent 名称:main_agent_name
|
|
372
|
+
|
|
373
|
+
顶层可选键 `main_agent_name`(string | null)改主 agent 的名字,**一改两处**:
|
|
374
|
+
|
|
375
|
+
- **部署 preset 显示名**:`preset.yml` 的显示名——GUI 预设选择器里看到的那个名字,默认「编排模式 (Orchestrator)」;
|
|
376
|
+
- **persona 身份行**:主 agent persona 的 `You are the <name> agent powered by the {{model}} model.`,`<name>` = 本键值。
|
|
377
|
+
|
|
378
|
+
约束:trim 后 1–60 字符、不可含换行;空字符串 / 缺省 = 保持默认(不写此键时,显示名与身份行都是 SRC 原文,安装器不做任何替换)。
|
|
379
|
+
|
|
380
|
+
```yaml
|
|
381
|
+
main_agent_name: orchestration-lead # 缺省 = 默认编排名(preset 显示名「编排模式 (Orchestrator)」)
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
- **手编**:写键后重跑 `./install.sh --auto`,再重启 DSH / 新会话生效。
|
|
385
|
+
- **配置 UI**:设置 → 庖丁配置 → 主 agent 卡顶部「主 agent 名称」输入框(带「恢复默认」按钮);点「保存并应用」后**重启 GUI / 新会话**生效。
|
|
386
|
+
- **对照**:本键只改**主 agent**。内置角色的显示名是角色级子键 `roles.<toolName>.name`——只替换该角色默认 persona 首行身份句的主语、不改工具调用名(见 2.4),两条改名线互不牵连、可各自独立配置。
|
|
387
|
+
|
|
388
|
+
### 5.2 追加三态语义:main_agent_persona_extra
|
|
389
|
+
|
|
390
|
+
`main_agent_persona_extra`(顶层可选键、多行字符串)安装时追加到主 agent persona 末尾。拼装顺序固定:**SRC 本体 → 技能软行/内联 → extra**。键语义三态:
|
|
391
|
+
|
|
392
|
+
| 取值 | 语义 |
|
|
393
|
+
|---|---|
|
|
394
|
+
| 缺省 / `null` | 用**默认常量**(codegraph projectPath 规则,见 5.3) |
|
|
395
|
+
| 显式 `''` | **不追加任何内容**(连默认规则也不加) |
|
|
396
|
+
| 其它文本 | **覆盖**默认,追加你的文本 |
|
|
397
|
+
|
|
398
|
+
写入格式:`''` 会以 `main_agent_persona_extra: ''` 写出(区别于缺省);多行文本以 `|-` 块标量写出。`tools/install.mjs` 的 `normalizeConfig` 只接受 string(非 string / 缺省 → `null`)。
|
|
399
|
+
|
|
400
|
+
### 5.3 默认常量原文
|
|
401
|
+
|
|
402
|
+
单点事实源是 `tools/install.mjs` 里的 `DEFAULT_MAIN_AGENT_PERSONA_EXTRA`(`presets/orchestrator/agent.cordis.yml` **不再内置**该行)。默认值原文(英文):
|
|
403
|
+
|
|
404
|
+
> Codegraph MCP default project may be a DIFFERENT repository than {{cwd}}. Never call codegraph_* tools without passing projectPath = {{cwd}} (the absolute path of your working directory). If {{cwd}} has no .codegraph index, fall back to glob/grep/read directly and do not loop or comment on project mismatches.
|
|
405
|
+
|
|
406
|
+
它只在挂载了 codegraph MCP 时相关(约束 codegraph 工具必须带当前项目路径);未挂载时是无关但无害的一段文本。`{{cwd}}` / `{{model}}` 是 persona 模板占位符,DSH 运行时替换 —— 手编时**必须原样保留**。
|
|
407
|
+
|
|
408
|
+
### 5.4 编辑途径
|
|
409
|
+
|
|
410
|
+
- **手编**:直接编辑配置文件的 `main_agent_persona_extra` 键,重跑 `./install.sh --auto`。
|
|
411
|
+
- **配置 UI**:设置 → 庖丁配置 → 主 agent 卡片「人设追加」(编辑器带「恢复默认」按钮),可编辑 / 清空 / 恢复默认;点「保存并应用」后**重启 GUI / 新会话**生效。
|
|
412
|
+
- 交互向导没有独立的人设追加步骤(从既有配置原样继承)——CLI 下改它请手编或走 UI。
|
|
413
|
+
|
|
414
|
+
## 6. 自定义角色
|
|
415
|
+
|
|
416
|
+
内置四个委派角色(见第 2 节与 [架构](architecture.md))是**起点而非上限**:任何「工具 + 技能」组合都能注册
|
|
417
|
+
成一个新委派工具,主 agent 在对话里直接调用它的 toolName 即可。最典型的玩法是**按技能建专属 agent**——
|
|
418
|
+
例如想要「专门做 PPT 的 agent」:新建 `ppt` 角色、工具面勾 `skill`(子 agent 用 skill 工具按需加载技能正文)
|
|
419
|
+
与 `read` / `write` / `edit` / `bash` 等、persona 说明调用 `html-ppt` 技能产出 HTML 幻灯片,再把
|
|
420
|
+
`html-ppt` 技能分给它(第 7 节)。装好后主 agent 说「把这份大纲做成 PPT」即委派给会做幻灯片的子 agent,
|
|
421
|
+
通用角色不用什么都碰。任意已装技能都能这样变成专属角色(前端稿、图表、文档排版……)。下分三小节:
|
|
422
|
+
向导/UI 路径(6.1)、手写静态源路径(6.2)与配置示例(6.3,含技能型 PPT agent)。
|
|
423
|
+
|
|
424
|
+
先说两个生成期行为:其一,**零工具的自定义角色装不上**——`tools` 缺省或写成空列表会得到一张空白
|
|
425
|
+
名单(`toolFilter.allow:` 落成 null),子 agent 创建后一个工具都没有;生成器对此与内置角色一视同仁,
|
|
426
|
+
应用时直接报错拒绝安装,给角色配上至少一个工具再应用即可(向导里选不出工具也会一直重问)。其二,
|
|
427
|
+
生成器会把角色 persona 的**首行职责句自动追加为主 agent persona 的委派行**(`- <职责>: delegate to
|
|
428
|
+
<toolName>.`,紧跟既有委派行之后)——主 agent 全靠这行知道什么活该派给谁,因此建议把 persona 首行
|
|
429
|
+
写成一句简短职责(例如「你的职责就是查找符合用户要求的技能」)。
|
|
430
|
+
|
|
431
|
+
### 6.1 路径一:交互向导 / 配置 UI(推荐)
|
|
432
|
+
|
|
433
|
+
向导流程(`./install.sh` 交互模式,或配置 UI 的「Agent 工具分配」):
|
|
434
|
+
|
|
435
|
+
1. 新建角色:输入 `toolName`,须匹配 `/^[a-z][a-z0-9_]*$/`;
|
|
436
|
+
2. 从工具池多选工具(工具池 = 三角色静态 allow ∪ 检测到的 host 工具);
|
|
437
|
+
3. 写一句 persona(向导自动展开为 `You are the <name> agent. <你的描述>`;配置 UI 可给完整 persona);
|
|
438
|
+
4. 向导自动把新 `toolName` 注入主 agent 的 `orchestrator-restrict config.allow` —— **`restrict.mjs` 文件本身不用改**;并把分配持久化到配置文件(`roles` 键下多一项)。
|
|
439
|
+
|
|
440
|
+
之后对话里直接调该 toolName 即可委派。删除角色 = 从配置文件移除该项再重跑 `--auto`(目标文件每次重新生成,不留残留块)。**内置角色**的整条删除不同——那是 `roles_remove`(见 2.3),`roles` 键下不写即可不覆盖。
|
|
441
|
+
|
|
442
|
+
### 6.2 路径二:手写静态源
|
|
443
|
+
|
|
444
|
+
不想经配置层时,直接在源码 preset 里加:
|
|
445
|
+
|
|
446
|
+
1. 复制 `presets/orchestrator/agent.cordis.yml` 里一个 `delegation-*` 块(delegation 组内);
|
|
447
|
+
2. 改 `toolName` / `persona` / `toolFilter.allow`;
|
|
448
|
+
3. 把新 `toolName` 加进 `presets/orchestrator/restrict.mjs` 的 `MAIN_AGENT_ALLOW`(这是生成 `config.allow` 的 base,主 agent 白名单不出现该名字就无法调用委派工具);
|
|
449
|
+
4. 重跑 `./install.sh --auto`(安装器只重写三角色与主 agent persona 的有限区间,你新增的块原样保留)。
|
|
450
|
+
|
|
451
|
+
两条路径生成同一结构(`delegation-<toolName>` + 白名单含 toolName);路径一免改源码、可经 UI 管理,推荐优先。
|
|
452
|
+
|
|
453
|
+
### 6.3 配置示例
|
|
454
|
+
|
|
455
|
+
手编配置里定义 `code-reviewer`(工具 `read` / `glob` / `grep` / `bash` / `ask_user_question` / `todo_write` 等):
|
|
456
|
+
|
|
457
|
+
```yaml
|
|
458
|
+
roles:
|
|
459
|
+
code-reviewer:
|
|
460
|
+
persona: |-
|
|
461
|
+
You are the code-reviewer agent. Read diffs and files, find bugs, security
|
|
462
|
+
issues and style regressions, then return a prioritized review list with
|
|
463
|
+
file:line references. Never edit files yourself.
|
|
464
|
+
tools:
|
|
465
|
+
- read
|
|
466
|
+
- glob
|
|
467
|
+
- grep
|
|
468
|
+
- bash
|
|
469
|
+
- ask_user_question
|
|
470
|
+
- todo_write
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
重跑 `./install.sh --auto` 后:生成 `delegation-code-reviewer` 块(persona 原样、tools 原样进 allow),主 agent `config.allow` 注入 `code-reviewer`。注意:自定义角色的 `tools` **原样写入** allow,不做 host 检测求交(向导/UI 的工具池已保证可选项都在注册面内)——手编时只列实际挂载的工具,否则子 agent 创建时 `tools.restrict()` 会以 unknown tools 拒绝。
|
|
474
|
+
|
|
475
|
+
**技能型示例:`ppt` agent(做 PPT 的专属子 agent)**——工具面含 `skill` 与读写编辑,persona 引导加载
|
|
476
|
+
`html-ppt` 技能,`skills` 键把技能分给该角色(persona 尾部生成 Available skills 引导行):
|
|
477
|
+
|
|
478
|
+
```yaml
|
|
479
|
+
roles:
|
|
480
|
+
ppt: # toolName:安装后主 agent 直接调「ppt」即委派
|
|
481
|
+
persona: |-
|
|
482
|
+
You are the ppt agent. You turn outlines into polished HTML slide decks:
|
|
483
|
+
load the html-ppt skill for the format and interaction rules, plan the
|
|
484
|
+
slide flow, write the slides as HTML files, then report the output path.
|
|
485
|
+
tools:
|
|
486
|
+
- read
|
|
487
|
+
- write
|
|
488
|
+
- edit
|
|
489
|
+
- glob
|
|
490
|
+
- grep
|
|
491
|
+
- bash
|
|
492
|
+
- skill # 用 skill 工具按需加载 html-ppt 技能正文
|
|
493
|
+
- ask_user_question
|
|
494
|
+
- todo_write
|
|
495
|
+
|
|
496
|
+
skills:
|
|
497
|
+
html-ppt: [ppt] # 把技能分给 ppt 角色(软引导,见第 7 节)
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
效果与 `code-reviewer` 相同(生成 `delegation-ppt` 块、白名单注入 `ppt`);区别在多一步 `skills` 映射。
|
|
501
|
+
子 agent 创建后 skill 目录对角色全量可见(DSH 机制),persona 的引导行只是**软约束**——真正干活靠子 agent
|
|
502
|
+
按需用 `skill` 工具读正文,装配别的技能(如做简历、出图表)同理。向导 / 配置 UI 里也能搭出同款:工具池勾
|
|
503
|
+
`skill` + 读写编辑、写一句 persona、在技能分配面板把 `html-ppt` 分给 `ppt`。
|
|
504
|
+
|
|
505
|
+
## 7. skill 分配
|
|
506
|
+
|
|
507
|
+
### 7.1 写法与效果
|
|
508
|
+
|
|
509
|
+
顶层 `skills` 键把技能分给角色(值 = 角色 toolName 列表,与向导「技能分配」步骤、配置 UI「技能分配」面板同一映射):
|
|
510
|
+
|
|
511
|
+
```yaml
|
|
512
|
+
skills:
|
|
513
|
+
frontend-design: [design]
|
|
514
|
+
html-ppt: [design]
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
安装时生成器把该角色 persona 尾部追加引导句 `Available skills: frontend-design, html-ppt`(分配为空则不写)。对 `design` / `implement` 这类工具面含 `skill` 的角色,技能目录对子 agent 全量可见,引导句提示其用 `skill` 工具加载(DSH 的 skill 目录注入按 cwd 收集、对子 agent 全量可见,没有按 agent 的目录过滤)。只对实际存在、且工具面含 `skill` 的角色有意义。
|
|
518
|
+
|
|
519
|
+
### 7.2 软约束性质
|
|
520
|
+
|
|
521
|
+
这是一条**软约束**而非硬隔离:目录可见性是 DSH 机制(按 cwd 收集、对角色全量可见),persona 引导句只是提示。硬隔离靠工具面(allow 里有没有 `skill`)实现。主 agent 例外:其注册层 deny 了 `skill`(见 3.1),所以技能对其不可见——需要时走 `main_agent_skills` / `main_agent_skills_inline`(第 4 节),而不是 `skills` 键。
|
|
522
|
+
|
|
523
|
+
## 8. 子 agent 模型与平台细节
|
|
524
|
+
|
|
525
|
+
### 8.1 按角色分模型
|
|
526
|
+
|
|
527
|
+
`dsh-tool-subagent` 支持 `config.agentOptions: { provider, model, maxTokens }`。按角色分模型优先走配置子键 `roles.<toolName>.model` / `.provider`(见 2.5);要连 `maxTokens` 一起控制、或不想动配置层时,才直接在 `presets/orchestrator/agent.cordis.yml` 的对应 `delegation-*` 块里加(安装器只重写 persona 与 allow 两处区间,`agentOptions` 会原样保留到生成文件):
|
|
528
|
+
|
|
529
|
+
```yaml
|
|
530
|
+
- id: delegation-implement
|
|
531
|
+
name: '@deepseek-ai/dsh-tool-subagent'
|
|
532
|
+
config:
|
|
533
|
+
provider: spawn
|
|
534
|
+
toolName: implement
|
|
535
|
+
agentOptions: # 按角色分模型;不写则继承主 agent 模型
|
|
536
|
+
provider: <provider-key> # 以你 DSH 环境配置的服务商为准
|
|
537
|
+
model: <model-id>
|
|
538
|
+
maxTokens: 65536
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
缺省不写 `agentOptions` = 继承主 agent 模型。配置子键(见 2.5)在生成时注入的就是这段 `agentOptions`(内置三角色与自定义角色都支持);只有 `maxTokens` 这类更细控制仍需手改静态源(路径二,见 6.2)。
|
|
542
|
+
|
|
543
|
+
### 8.2 平台注册面细节
|
|
544
|
+
|
|
545
|
+
- **`str_replace_editor` 刻意未列入 `implement`**:部分部署的注册面没有该工具,一旦列入 allow,子 agent 创建时 `tools.restrict()` 会以 unknown tools 拒绝。确认你的部署确实注册后再自行加回(静态源 implement allow,或配置 `roles.implement.tools`)。
|
|
546
|
+
- 白名单 / allow 是**精确名匹配**,不支持 glob;tavily 五个工具要逐个写全。
|
|
547
|
+
- 主 agent 白名单里未挂载的名字不报错(瀑布只在已解析工具里按名匹配)。
|
|
548
|
+
|
|
549
|
+
### 8.3 停用 MCP / 插件后的同步
|
|
550
|
+
|
|
551
|
+
停用 tavily / codegraph / magic-memory(在 `~/.dsh/cordis.patch.yml` 或 profile patch 注释相应条目)后**不需要手动改 allow**:重跑 `./install.sh --auto`,安装器检测到停用后自动把对应 `mcp__tavily__*` / `memory_search` 从三角色 allow 剔除(`--dry-run` 可先预览剔除项)。检测不到或握手失败的 MCP 会被跳过:对应角色只是缺这些工具,安装不报错。检测与 patch 层的细节链见 [安装](installation.md)。
|