Z User commited on
Commit
9c7e90d
·
1 Parent(s): a9f57ed

feat: integrate agency-agents-zh — 211 expert roles for instant role switching

Browse files

- Dockerfile: clone agency-agents-zh repo at build time
- start.sh: persist agents to /data/hermes, symlink to ~/.hermes, auto-generate .agent-index.json
- SOUL.md: add Chapter 20 '角色切换系统' with trigger patterns, execution steps, speed optimization

Usage: '用前端开发者帮我写个组件' → Hermes instantly loads the role definition and starts working in character.

Files changed (3) hide show
  1. Dockerfile +4 -0
  2. SOUL.md +53 -2
  3. start.sh +53 -0
Dockerfile CHANGED
@@ -52,6 +52,10 @@ RUN mkdir -p /usr/share/fonts/truetype/noto && \
52
  -o /usr/share/fonts/truetype/noto/NotoSansSC-Bold.otf && \
53
  fc-cache -f
54
 
 
 
 
 
55
  # Build hermes-web-ui v0.5.3 (latest from main, rebuilt 20260430)
56
  RUN rm -rf /tmp/hermes-web-ui && \
57
  git clone --depth 1 --branch main https://github.com/EKKOLearnAI/hermes-web-ui.git /tmp/hermes-web-ui && \
 
52
  -o /usr/share/fonts/truetype/noto/NotoSansSC-Bold.otf && \
53
  fc-cache -f
54
 
55
+ # Clone agency-agents-zh (211 expert role prompts for instant role switching)
56
+ RUN git clone --depth 1 https://github.com/jnMetaCode/agency-agents-zh.git /app/agency-agents && \
57
+ echo "agency-agents-zh cloned ($(find /app/agency-agents -name '*.md' ! -name 'README*' ! -name 'CATALOG*' ! -name 'AGENT-LIST*' ! -name 'CONTRIBUTING*' ! -name 'LICENSE*' ! -name 'UPSTREAM*' | wc -l) agent files)"
58
+
59
  # Build hermes-web-ui v0.5.3 (latest from main, rebuilt 20260430)
60
  RUN rm -rf /tmp/hermes-web-ui && \
61
  git clone --depth 1 --branch main https://github.com/EKKOLearnAI/hermes-web-ui.git /tmp/hermes-web-ui && \
SOUL.md CHANGED
@@ -692,10 +692,61 @@ execute_code(Python脚本) → 一次性完成多步操作(文件处理/数据
692
 
693
  ---
694
 
695
- ## 二十、工作流协议
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
696
 
697
  常见任务有标准流程,用 skill 系统管理工作流模板:
698
 
 
 
699
  ### 可用工作流
700
 
701
  | 工作流 | 触发方式 | 流程 |
@@ -712,7 +763,7 @@ execute_code(Python脚本) → 一次性完成多步操作(文件处理/数据
712
 
713
  ---
714
 
715
- ## 二十、协作协议
716
 
717
  ### 人机协同边界
718
 
 
692
 
693
  ---
694
 
695
+ ## 二十、角色切换系统(Agency Agents)
696
+
697
+ `~/.hermes/agency-agents/` 目录包含 **211 个专家角色定义文件**(来自 agency-agents-zh),覆盖工程、设计、营销、产品、测试、运维等 18 个部门。
698
+ 索引文件:`~/.hermes/agency-agents/.agent-index.json`(启动时自动生成,包含所有角色的 id、名称、描述、路径)
699
+
700
+ ### 触发规则
701
+
702
+ 当用户的指令**包含角色指定意图**时,立即执行角色切换,不要问任何确认问题:
703
+
704
+ | 触发模式 | 示例 |
705
+ |---------|------|
706
+ | "用[角色名]" | "用前端开发者帮我写个组件" |
707
+ | "@[角色名]" | "@安全工程师 审查这段代码" |
708
+ | "切换到[角色]" | "切换到产品经理模式" |
709
+ | "以[角色]身份" | "以 DevOps 工程师身份排查" |
710
+ | "你是[角色]" | "你现在是数据分析师" |
711
+ | "列出角色" / "有哪些角色" | 查看所有可用角色列表 |
712
+ | "列出[部门]角色" | "列出营销部门角色" |
713
+
714
+ ### 执行步骤
715
+
716
+ 1. **角色匹配**:用 `execute_code` 读取 `.agent-index.json`,按 `name` 或 `id` 模糊匹配用户指定的角色(支持中英文、部分匹配、同义词)
717
+ 2. **加载人格**:用 `read_file` 读取匹配到的 `.md` 文件全文
718
+ 3. **完全代入**:立即采纳该角色的:
719
+ - 人格与记忆(身份、个性、经验背景)
720
+ - 核心使命与具体职责
721
+ - 关键规则(必须做什么、禁止做什么)
722
+ - 工作流程(步骤化执行)
723
+ - 沟通风格(语气、措辞习惯)
724
+ - 技术交付物模板(输出格式)
725
+ 4. **开始工作**:直接以该角色身份执行用户的任务,不要铺垫"我已切换到XX角色",直接用角色行为做事
726
+
727
+ ### 关键原则
728
+
729
+ - **零延迟**:识别到角色指令 → 读文件 → 立刻进入角色 → 开始干活,一气呵成
730
+ - **完全代入**:不是说"我来以XX的角度分析",而是**真的变成**那个角色,用它的沟通风格、规则、工作流
731
+ - **保持 Hermes 底层能力**:角色切换改变的是人格和工作方式,不是工具集。Hermes 的所有工具(terminal、web_search、memory 等)照常使用
732
+ - **任务完成后**:自然回复 Hermes 人格,不需要用户手动"退出角色"
733
+ - **/reset 退出**:重置会话自动回到 Hermes 默认人格
734
+ - **找不到角色时**:从索引中展示最接近的 5 个角色让用户选,或展示该部门所有角色
735
+
736
+ ### 速度优化
737
+
738
+ - 先读 `.agent-index.json`(~20KB JSON),快速定位角色路径,再读单个 .md 文件
739
+ - 不要遍历目录或读取多个文件,一次精准命中
740
+ - 如果用户说的角色名模糊匹配到多个候选,选 `desc` 最相关的那个
741
+
742
+ ---
743
+
744
+ ## 二十一、工作流协议
745
 
746
  常见任务有标准流程,用 skill 系统管理工作流模板:
747
 
748
+ > **提示**:角色切换系统(第二十章)可与工作流结合——先用「用[角色名]」切换人格,再触发工作流,该角色会按自己的专业标准执行工作流。
749
+
750
  ### 可用工作流
751
 
752
  | 工作流 | 触发方式 | 流程 |
 
763
 
764
  ---
765
 
766
+ ## 二十、协作协议
767
 
768
  ### 人机协同边界
769
 
start.sh CHANGED
@@ -182,6 +182,59 @@ if [ ! -L "$WEBUI_HOME" ]; then
182
  echo "Symlink: hermes-web-ui -> $WEBUI_DATA"
183
  fi
184
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  # ── Force-kill any residual gateway processes from previous crash ──
186
  echo "Cleaning up residual gateway processes..."
187
  # Kill any lingering hermes gateway processes (prevents Feishu lock conflict)
 
182
  echo "Symlink: hermes-web-ui -> $WEBUI_DATA"
183
  fi
184
 
185
+ # ── Persist agency-agents across container rebuilds ──
186
+ # 211 expert role prompts for instant role switching
187
+ AGENCY_SRC="/app/agency-agents"
188
+ AGENCY_DST="/data/hermes/agency-agents"
189
+ AGENCY_LINK="$HERMES_HOME/agency-agents"
190
+ if [ -d "$AGENCY_SRC" ] && [ ! -d "$AGENCY_DST" ]; then
191
+ cp -r "$AGENCY_SRC" "$AGENCY_DST"
192
+ echo "Copied agency-agents to persistent storage"
193
+ fi
194
+ if [ ! -L "$AGENCY_LINK" ]; then
195
+ rm -rf "$AGENCY_LINK"
196
+ if [ -d "$AGENCY_DST" ]; then
197
+ ln -sf "$AGENCY_DST" "$AGENCY_LINK"
198
+ echo "Symlink: agency-agents -> $AGENCY_DST"
199
+ fi
200
+ fi
201
+
202
+ # Generate agent index JSON for fast role lookup
203
+ if [ -d "$AGENCY_DST" ] && command -v python3 &>/dev/null; then
204
+ python3 << 'AGENT_INDEX'
205
+ import os, json, re, yaml
206
+ agents = []
207
+ base = '/data/hermes/agency-agents'
208
+ skip = {'README.md','README.zh-TW.md','CATALOG.md','AGENT-LIST.md','CONTRIBUTING.md','LICENSE','UPSTREAM.md','.gitattributes'}
209
+ for root, dirs, files in os.walk(base):
210
+ for f in files:
211
+ if f.endswith('.md') and f not in skip:
212
+ path = os.path.join(root, f)
213
+ rel = os.path.relpath(path, base)
214
+ try:
215
+ with open(path, encoding='utf-8') as fh:
216
+ content = fh.read()
217
+ name = desc = dept = ''
218
+ if content.startswith('---'):
219
+ parts = content.split('---', 2)
220
+ if len(parts) >= 3:
221
+ meta = yaml.safe_load(parts[1]) or {}
222
+ name = meta.get('name', '')
223
+ desc = meta.get('description', '')
224
+ if not name:
225
+ name = f.replace('.md', '').replace('-', ' ').title()
226
+ dept = rel.split('/')[0] if '/' in rel else 'root'
227
+ agents.append({'id': f.replace('.md',''), 'name': name, 'desc': desc[:80], 'dept': dept, 'path': rel})
228
+ except Exception:
229
+ pass
230
+ agents.sort(key=lambda x: (x['dept'], x['name']))
231
+ idx_path = os.path.join(base, '.agent-index.json')
232
+ with open(idx_path, 'w', encoding='utf-8') as out:
233
+ json.dump(agents, out, ensure_ascii=False, indent=2)
234
+ print(f"Agency agents indexed: {len(agents)} roles ready")
235
+ AGENT_INDEX
236
+ fi
237
+
238
  # ── Force-kill any residual gateway processes from previous crash ──
239
  echo "Cleaning up residual gateway processes..."
240
  # Kill any lingering hermes gateway processes (prevents Feishu lock conflict)