Files
homeagent-sdk/example/files
root db58f66d83 docs(skills): 按需插件 skill 对齐仓内规范 + 文件操作强制走 files 插件
## 1. 文件操作必须走 files 插件(用户明确要求)

旧 skill 写着「如果你已经有 run_shell / bash 之类的能力,优先用那个 —— 它更直接」,
与「文件操作必须走 files_*」相悖。改为:

- 所有已知内容的读写一律 files_read/files_write/files_edit/files_edit_line;
- 不用 cat/echo/sed/tee/重定向代替(shell 拼长文本会被引号转义吃掉,
  且重定向会截断原文件,而本插件是原子写 + 写前留档);
- 唯一例外:文件是命令的副产物(go build -o、git clone、日志重定向)。

cmd-tools skill 同步补一条:文件读写不要用 shell 代替。

## 2. 三个新 skill 对齐 ai_image 等既有规范

- 结构统一为:什么时候用 / 先拉起插件(plugin_start 代码块)/ 工具表 /
  用完可释放(plugin_stop)/ 注意 / 「plugin_stop vs plugin_disable」对照表;
- 修正上一版的错误:把 `plugin_enable` 写成拉起方式 —— 那是**持久**解禁,
  会改开机行为;按需拉起应使用 `plugin_start name=<插件>`。
- files skill 保持 auto_start=false(与「大部分插件不需要自启」一致),
  但把「怎么拉起」写清楚。

## 3. cmd_run 描述补充能力边界

「经完整 bash 执行,支持管道、分号、&&、命令替换、heredoc、重定向;
不支持交互(vim/ssh/top 用 terminal_create)」。

验证:四工程 hmapdev 构建通过;本机重装后 skills_registered=1;
问 agent 写文件时它先 plugin_start 再 files_write/files_read,未用 shell 代替。
2026-10-20 08:57:53 +08:00
..

files · 沙箱文件操作

读写与编辑文件,全部操作限制在沙箱目录内。

工具

工具 说明
files_read 读文件内容,支持 offset / limit 读大文件
files_write 写文件,自动创建父目录
files_edit 按精确字符串替换改文件
files_ls 列目录(目录名带 / 后缀)

files_edit 用 edits[] 传多组替换,每组 {old, new}:

  • 每个 old 必须在原文件中恰好出现一次 —— 不唯一会报错,避免改错地方。
  • 所有替换都针对原内容匹配,不要在同一个 edits 里写相互重叠的改动。

配置项

键 默认 说明
dir 空 允许访问的根目录。留空用默认沙箱(主数据目录下的 files_sandbox)。不建议设为 /

沙箱实现

路径校验不止一次,是两道:

  1. 规范化后判断:filepath.Abs + filepath.Clean,再用 withinSandbox 检查结果是否在根目录之下(/ 作为特例放行)。
  2. 解析符号链接后再判断:filepath.EvalSymlinks 求出真实路径,再查一次沙箱。

第 2 步是关键:只做第 1 步的话,沙箱内一个指向外部的软链接就能绕过限制 (.../sandbox/link -> /etc)。报错文案也区分了这两种情况 (path outside sandbox vs path escapes sandbox via symlink)。

对不存在的路径(write 会用到),求真实路径时只对已存在的部分做 EvalSymlinks, 其余保留为未创建的尾部。

构建

hmapdev build