cap_files — 文件系统操作
源码:cap_files.c · 头文件:cap_files.h
cap_files 是文件系统类 Capability 的代表实现,向 LLM 和自动化规则暴露对受管 FATFS 目录的完整读写能力。它展示了如何在嵌入式环境中安全地将文件系统访问抽象为工具接口。
默认管理目录为 /fatfs,可通过 cap_files_set_base_dir() 在应用初始化时修改。
| 工具 ID | 功能 | 输入 |
|---|---|---|
read_file | 读取文本文件内容 | path |
write_file | 创建或覆盖文件 | path, content |
edit_file | 替换文件中第一个匹配字符串 | path, old_string, new_string |
delete_file | 删除文件 | path |
list_dir | 递归列举目录下所有文件 | prefix(可选) |
所有工具均标记为 CLAW_CAP_FLAG_CALLABLE_BY_LLM。
路径安全机制
Section titled “路径安全机制”cap_files 的核心安全设计是严格的路径边界校验,防止路径遍历攻击(path traversal):
cap_files_resolve_path 同时支持绝对路径和相对路径输入:
这种设计让 LLM 可以使用简短的相对路径,同时保证安全边界。
工具实现细节
Section titled “工具实现细节”read_file:大小限制
Section titled “read_file:大小限制”文件读取有 32 KB 上限(CAP_FILES_MAX_FILE_SIZE),超出部分被截断。这是为了防止大文件将整个 LLM 上下文占满:
write_file:自动创建父目录
Section titled “write_file:自动创建父目录”write_file 在写入前会递归创建不存在的父目录,无需用户预先 mkdir:
edit_file:字符串替换语义
Section titled “edit_file:字符串替换语义”edit_file 实现的是第一次匹配替换(strstr + 内存复制),不是全局替换:
这让 LLM 可以精确修改文件的某一处内容,同时错误信息明确(找不到时告知 LLM 提供的旧字符串不正确)。
list_dir:递归遍历 + 前缀过滤
Section titled “list_dir:递归遍历 + 前缀过滤”输出格式为每行一个绝对路径:
若目录下无文件,返回 "(no files found)" 而非空字符串,避免 LLM 误判。
与 cap_lua 的边界
Section titled “与 cap_lua 的边界”cap_files 和 cap_lua 分别管理不同的目录子树,互不干涉:
| 模块 | 管理目录 | 文件类型 |
|---|---|---|
cap_files | /fatfs(可配置) | 任意文本文件 |
cap_lua | /fatfs/scripts(默认) | 仅 .lua 文件 |
LLM 可用 cap_files 读取和修改 Lua 脚本的源码,再用 cap_lua 执行;也可用 cap_files 读取 cap_skill 所管理的 .md Skill 文档。