Fileglide / Architecture / AI Agent First 版本草案 v0.1 / 2026-06-08

fileglide 项目设计

fileglide 的目标不是再造一个普通文件工具,而是做一个面向 AI agent 的超级文件系统操作层:既能安全、精确、可验证地进行文件与路径管理, 又能在大目录、混合编码、模糊检索、正则内容搜索、精确行编辑和跨语言文本处理中保持稳定、可预测、可组合。 设计上参考 OpenTrade 的“薄入口 + 命令装配 + 执行编排 + 领域服务”思路,同时吸收设计模式在 AI Coding 时代对职责边界、可替换性和复杂度控制的价值。

目标定位为 AI agent 提供比常见 shell、单点文件 API、简单编辑工具更完整的文件能力面。
核心风格命令清晰、行为显式、输出结构化、默认安全、可组合执行。
主要参考D:\github-project\OpenTrade 与设计模式学习文档的结构表达方式。
当前交付完整项目设计文档,尚未进入实现编码阶段。

1. 任务定约

这一节把“我想要一个很强大的文件 CLI”翻译成可执行、可验证的工程目标,避免后续实现一开始就因为边界不清而膨胀。

Objective

  • 设计一个名为 fileglide 的 CLI 工具,用于文件与路径管理、遍历、检索、尺寸感知与精确读写编辑。
  • 把工具设计成对 AI agent 友好的结构化能力层,而不是偏人类交互的小脚本集合。
  • 在编码适配上把 utf-8 without bom 作为第一优先,同时兼容常见中文、日文及非 ASCII 语言文本。
  • 把“文件名模糊匹配”和“文件内容正则检索”设计成一等能力,而不是附加选项。

Non-goals

  • 本阶段不实现 GUI、不实现远程分布式文件系统、不设计数据库索引服务。
  • 本阶段不引入过重守护进程或后台常驻服务。
  • 本阶段不尝试做 IDE 级别的 AST 重构工具;精确编辑仍以文本模型为主。
  • 本阶段不处理复杂权限提升工作流与系统级沙箱。

Scope

  • 创建、删除、列举、搜索、读取、写入、追加、插入、按行精确编辑。
  • 全局与局部范围控制。
  • 结构化输出与 agent 友好返回。
  • 编码探测、文本归一化、异常反馈、验证策略。

Verification

  • 命令契约测试:参数、输出格式、错误码、危险操作确认链路。
  • 文件语义测试:覆盖写、尾追加、中间插入、行区间替换、编码保真。
  • 搜索测试:正则内容检索、Levenshtein 文件名匹配排序、范围约束。
  • 跨编码回归:UTF-8、UTF-8 with BOM、GBK、GB18030、Shift-JIS、EUC-JP、Latin-1 等样本集。
关键判断: “比现有任何方案都强大”不能直接拿来做工程验收语句。工程上应把它收敛为“能力覆盖更全面、输出更适合 agent、文本编辑更精确、编码兼容更稳、模糊检索更可控”。

2. 设计原则

2.1 Agent First

所有命令都应同时服务人类和 agent,但默认优先保证 agent 可解析性:输出结构统一、字段稳定、错误有代码、行为不隐式。

2.2 薄入口

参考 OpenTrade,入口层只负责 CLI 暴露与装配,不承载业务逻辑。命令定义、执行器、服务层、编码与搜索能力彼此分离。

2.3 默认最小副作用

读取默认安全;写入、删除、批量变更必须显式;高风险命令默认支持预览、dry-run 或确认策略。

2.4 可组合

遍历结果、搜索结果、精确定位结果应使用统一记录模型,使后续过滤、写回、批量操作可以复用同一套执行编排。

2.5 文本保真

读取与编辑必须尽可能保留原始换行风格、编码和 BOM 信息,并让调用方显式知道当前操作是否发生编码规范化。

2.6 模式导向

用命令模式、策略模式、门面模式、模板方法控制复杂度,避免 CLI 逻辑、文件逻辑、编码逻辑糊成一团。

Command Pattern Facade Pattern Strategy Pattern Template Method Specification-like Filters

3. 能力范围与能力矩阵

用户需求中的 1.x 与 2.x 能力,工程上可以整理成六类能力域。每一类都要有明确的数据输入、范围控制和输出结构。

能力域目标典型命令输出重点
路径与文件生命周期创建、删除、覆盖存在项、递归创建、递归删除path createpath deletefile createfile delete是否变更、影响对象、失败原因
遍历与枚举全局/局部列出路径与文件,支持深度、过滤、排序path listfile listtree scan条目清单、统计、裁剪信息
搜索与检索按文件名、路径名、文件内容进行匹配、模糊排序、正则搜索path searchfile searchtext grep命中项、评分、上下文片段、位置信息
尺寸与统计文件大小、目录聚合大小、子树大小、条目数、编码统计size filesize path字节数、可读化尺寸、统计维度
文本读取整文件、尾部、范围、行、行区间、精确片段读取file readfile linesfile slice文本、行号、偏移、编码元数据
文本写入与编辑覆盖、尾追加、中部插入、行替换、范围替换、精确编辑file writefile appendfile insertfile patch变更摘要、前后 diff、写回结果

4. CLI 命令面设计

命令面建议沿用 OpenTrade 的 root command + group + leaf command 组织方式。这样可读、可测试,也便于后续自动生成命令目录与 agent 文档。

4.1 顶层命令树

fileglide
|-- file
|   |-- create
|   |-- delete
|   |-- read
|   |-- lines
|   |-- write
|   |-- append
|   |-- insert
|   |-- patch
|   |-- list
|   |-- search
|   `-- stat
|-- path
|   |-- create
|   |-- delete
|   |-- list
|   |-- search
|   `-- stat
|-- tree
|   |-- scan
|   |-- summary
|   `-- size
|-- text
|   |-- grep
|   |-- extract
|   `-- replace-preview
|-- inspect
|   |-- encoding
|   |-- newline
|   `-- bom
`-- batch
    |-- run-plan
    `-- apply-plan

4.2 顶层设计理由

filepath 分离

路径和文件虽然都属于 filesystem entry,但其副作用、返回结构和用户意图不同。拆开后更利于参数语义清晰,也更利于测试。

tree 聚合视角

tree 不做单个实体操作,而做子树视角的扫描、摘要和大小统计,作为全局/局部遍历与容量分析入口。

text 独立

内容检索与文本提取是“基于文件内容”的一类能力,不应被埋进 file search 一个命令里,否则内容匹配和文件名匹配会混淆。

inspect 面向诊断

编码识别、换行风格、BOM 检查应独立成诊断工具,既能为写入前决策服务,也便于排障。

4.3 统一运行时参数

参数作用说明
--root限定操作根目录用于局部作用域控制,是 agent 安全执行的关键参数。
--recursive递归遍历默认关闭或按命令设置明确默认值,避免误扫大目录。
--max-depth限制深度全局扫描必须支持深度裁剪。
--format输出格式建议支持 tablejsonjsonltext
--dry-run预演副作用删除、批量编辑、覆盖写入默认支持。
--encoding显式编码当调用方已知编码时应允许跳过探测。
--output写到目标文件面向 agent 的流水线式使用。
建议: 不要把所有参数都塞到一个巨型命令里。fileglide 应该维持“小而明确的叶子命令 + 统一运行时选项”的结构,这一点与 OpenTrade 的命令目录化思路一致。

5. 架构分层

fileglide 的核心不是“命令很多”,而是“层次清楚”。只有分层清楚,后续能力扩展才不会让 CLI、编码探测、文本编辑和搜索逻辑相互污染。

CLI Entry
  -> App Assembly
    -> Command Builders
      -> Executor
        -> Facade
          -> Domain Services
             - TraversalService
             - SearchService
             - EncodingService
             - TextReadService
             - TextEditService
             - StatService
          -> Filesystem Gateway
          -> Renderers

5.1 Entry Layer

main.py__main__.py 只暴露 CLI,不承载领域逻辑。

5.2 App Layer

app.py 负责装配命令树,保持极薄,作用类似 OpenTrade 的应用装配入口。

5.3 Command Layer

commands/ 负责 Click 命令组、参数定义、帮助文本和命令树构建。

5.4 Executor Layer

把 CLI 请求转成标准化执行请求,统一处理 dry-run、输出格式、错误映射、批量调用。

5.5 Facade Layer

门面负责把高层命令意图分派给遍历、搜索、编码、编辑等领域服务,并聚合标准结果。

5.6 Domain Layer

真正处理文件系统、编码探测、文本定位、Levenshtein 排序、正则检索与精确编辑。

5.7 关键模式落点

模式落点价值
Command PatternCLI 命令与执行请求对象让命令结构和执行逻辑解耦,便于测试和批量计划执行。
Facade Patternfacade.py统一暴露文件系统能力,避免 CLI 直接依赖底层细节。
Strategy Pattern编码探测、匹配排序、写回策略编码兼容与匹配逻辑未来一定扩展,策略模式更合适。
Template Method读取、编辑、写回流程骨架在“探测 -> 解析 -> 操作 -> 校验 -> 写回”流程中保持稳定步骤顺序。
Value Object路径、文本范围、行区间、匹配结果降低字符串乱飞和状态混乱。

6. 核心数据模型

若没有统一的记录模型,遍历、搜索和编辑的结果就无法复用。AI agent 场景下尤其需要结构化对象而非一堆随意拼装的字典。

6.1 EntryRecord

EntryRecord
- path: str
- kind: file | directory | symlink | other
- name: str
- relative_path: str
- size_bytes: int | null
- exists: bool
- encoding: str | null
- newline: lf | crlf | cr | mixed | null
- bom: utf8-bom | utf16-le | utf16-be | none | unknown
- modified_at: str | null

6.2 TextSlice

TextSlice
- path: str
- encoding_used: str
- line_start: int | null
- line_end: int | null
- char_start: int | null
- char_end: int | null
- byte_start: int | null
- byte_end: int | null
- text: str
- newline: str | null

6.3 SearchHit

SearchHit
- path: str
- hit_type: filename | pathname | content
- score: float | null
- matcher: exact | regex | levenshtein | contains
- line_number: int | null
- column_start: int | null
- column_end: int | null
- preview: str | null

6.4 EditPlan / EditResult

EditPlan
- operation: overwrite | append | insert | replace-lines | replace-range
- target_path: str
- expected_version: str | null
- backup: bool
- payload: ...

EditResult
- changed: bool
- bytes_before: int
- bytes_after: int
- diff_preview: str | null
- encoding_kept: bool
- newline_kept: bool
设计收益: 一旦这些记录模型稳定,CLI 输出、JSON 输出、测试断言、批量计划执行和 agent 自动修正都能复用同一套语义对象。

7. 编码与文本策略

这是 fileglide 区别于普通文件工具的关键部分。用户明确要求“UTF-8 without BOM 完美适配,以及其他所有常见编码完美适配”。工程上不能写成空话,必须给出明确的解码、保真、写回和失败策略。

7.1 编码处理原则

  • 默认写回目标: 新建文本文件默认写为 utf-8 无 BOM。
  • 读取优先级: 先显式参数,再 BOM 判断,再已知编码候选,再启发式探测,再保底替换读取。
  • 写回优先级: 默认保留原编码、原 BOM、原换行风格;除非用户显式要求规范化。
  • 错误策略: 区分“无法探测编码”“可读取但存在替换字符”“写回将丢失字符”。
  • 文本与字节双轨: 所有精确编辑命令既要理解文本位置,也要在必要时能报告字节偏移。

7.2 推荐支持的编码层次

层次编码说明
第一优先utf-8 / utf-8-sig项目默认,面向 agent 与跨平台协作的主流编码。
中文常见gbk / gb18030Windows 中文环境常见,必须完整覆盖。
日文常见shift_jis / cp932 / euc_jp日文工程与历史文本常见。
Unicode 扩展utf-16-le / utf-16-be / utf-32通常结合 BOM 识别。
兼容保底latin-1用于尽量不报错地打开文本,但需要明确提示可信度较低。

7.3 编码服务职责

EncodingService.detect()

  • 读取字节样本与完整文件头。
  • 识别 BOM。
  • 根据显式参数或优先候选尝试严格解码。
  • 输出置信度、替换字符风险、是否适合写回。

EncodingService.encode_for_write()

  • 决定最终写回编码、BOM、换行。
  • 提前检查字符是否可编码,避免部分写入后失败。
  • 必要时向调用方返回“需规范化写回”的显式风险。
现实约束: “完美适配所有常见编码”在工程上应被解释为“对常见编码有显式策略、明确回退和风险报告”。对未知混合编码文件,不能承诺 100% 无歧义,只能承诺“可诊断、可回退、可提示”。

9. 精确编辑设计

文件编辑是最容易把“工具做强”变成“工具做危险”的部分。设计上要把不同编辑语义拆开,而不是用一个 write 命令包打天下。

9.1 编辑能力拆分

命令语义适用场景
file write整文件覆盖写入新建或整体重写文本文件
file append尾部追加日志、尾部补充内容
file insert按字符偏移、字节偏移或定位锚点插入中部插入文本
file patch按行号、行区间、文本范围、锚点规则替换精确编辑和批量规则化修改
file lines按单行或行区间读取给 agent 精确上下文
file slice按字符、字节、正则命中区间读取精确读取某片段

9.2 编辑执行骨架

1. 读取原始字节
2. 探测编码、BOM、换行风格
3. 解码为文本,并记录文本与字节映射
4. 定位目标区间(按行/按字符/按锚点/按正则)
5. 生成变更计划与 diff 预览
6. 校验是否满足预期前置条件
7. 按原编码或目标编码写回
8. 重新读取并做最小验证

9.3 定位方式设计

按行定位

最稳定,适合 agent 已知上下文时的精确编辑。需要定义 1-based 行号还是 0-based 行号,建议统一使用 1-based。

按范围定位

支持字符区间、字节区间。字节区间更适合诊断和保底,但文本编辑默认应优先字符区间。

按锚点定位

适合“在某段后插入”“替换某个唯一块”。需要支持 before/after/replace-first/replace-all 等模式。

9.4 并发与防误改控制

  • 编辑命令建议支持 --expect-hash--expect-mtime,防止文件被外部修改后误覆盖。
  • 高风险编辑默认支持 --backup--dry-run
  • 返回结果要明确说明是否保留原编码、原 BOM、原换行风格。

10. 安全、错误模型与一致性策略

10.1 错误模型

fileglide 不应只输出“失败了”。应建立结构化错误类型,例如:PathNotFoundEncodingDetectFailedUnsafeDeleteDeniedAnchorNotFoundMultipleAnchorsMatchedTextNotEncodableBinaryFileSkipped

10.2 删除类操作原则

  • 默认拒绝明显危险的根路径、工作区根路径或过宽范围递归删除,除非显式传入强确认参数。
  • 删除前返回命中数量与路径预览,支持 --dry-run
  • 对递归删除建议区分“空目录删除”和“强制删除子树”。

10.3 二进制文件处理

  • 默认识别并标记二进制文件,不把二进制误当文本。
  • 内容搜索默认跳过二进制,除非用户显式要求按字节搜索。
  • 文本编辑命令若发现目标疑似二进制,应直接拒绝并提示原因。

10.4 一致性策略

输出一致性

无论是 list、search、read 还是 patch,尽量复用同类字段,如 pathrelative_pathencodingline_number

副作用一致性

所有会改文件系统的命令统一支持 dry-run、结构化结果、失败码和变更摘要,避免每个命令风格不同。

11. 测试与验证设计

这个项目如果没有系统性的文件测试,很容易在“看起来能用”的阶段埋下大量跨平台与编码坑。测试应被当成主线,不是收尾动作。

11.1 测试分层

层级重点示例
单元测试编码探测、行区间解析、Levenshtein 排序、锚点定位同一路径名候选排序是否稳定
服务测试遍历服务、文本服务、编辑服务GBK 文件读出后按原编码写回是否无损
CLI 测试参数、输出、错误码、命令树fileglide file lines --path demo.txt --start 3 --end 5
回归测试复杂目录、混合编码、超大文件、模糊匹配排序中文/日文/emoji/阿拉伯语样本

11.2 必测样本集

文本样本

中文、日文、韩文、俄文、阿拉伯文、emoji、混合标点、制表符、空文件、超长单行。

编码样本

UTF-8 无 BOM、UTF-8 BOM、GBK、GB18030、Shift-JIS、UTF-16 LE/BE、Latin-1。

路径样本

长路径、空格路径、中文路径、日文路径、大小写接近路径、深层子树。

11.3 验收标准建议

  • 关键命令具备稳定 JSON 输出结构。
  • 核心编码样本的读取和原样写回回归通过。
  • Levenshtein 模糊检索排序对固定样本保持确定性。
  • 精确编辑在至少三种编码与两种换行风格下通过。

12. 分阶段实施路线

阶段 A:最小闭环

  • 搭建 CLI 骨架、命令树、标准输出结构。
  • 实现文件/路径创建删除、基础 list、基础 read/write、UTF-8 优先编码处理。
  • 完成最小 CLI 测试与编码样本测试。

阶段 B:搜索与尺寸能力

  • 实现文件名/路径名搜索。
  • 引入 vortezwohl Levenshtein 排序。
  • 实现内容正则搜索、目录大小聚合。

阶段 C:精确编辑能力

  • 实现按行读取、按行替换、区间读取、区间替换。
  • 实现中部插入与锚点型编辑。
  • 补齐预演与并发防误写保护。

阶段 D:Agent 强化层

  • 批量计划执行、变更预览、结构化 diff 返回。
  • 输出摘要与上下文裁剪策略。
  • 更丰富的 inspect / diagnostics 命令。
建议落地顺序: 先做“安全读取 + 稳定写回 + 结构化输出”,再做复杂搜索和精确编辑。否则命令面会很快很大,但底层读写语义不稳,后续修复成本很高。

13. 建议目录结构

fileglide/
|-- pyproject.toml
|-- README.md
|-- docs/
|   `-- fileglide-architecture.html
|-- fileglide/
|   |-- __init__.py
|   |-- __main__.py
|   |-- main.py
|   |-- app.py
|   |-- executor.py
|   |-- facade.py
|   |-- models.py
|   |-- errors.py
|   |-- rendering.py
|   |-- commands/
|   |   |-- __init__.py
|   |   |-- root.py
|   |   |-- file_commands.py
|   |   |-- path_commands.py
|   |   |-- tree_commands.py
|   |   |-- text_commands.py
|   |   `-- inspect_commands.py
|   |-- services/
|   |   |-- __init__.py
|   |   |-- traversal_service.py
|   |   |-- search_service.py
|   |   |-- stat_service.py
|   |   |-- text_read_service.py
|   |   |-- text_edit_service.py
|   |   `-- encoding_service.py
|   |-- matchers/
|   |   |-- __init__.py
|   |   |-- name_matcher.py
|   |   `-- regex_matcher.py
|   |-- filesystem/
|   |   |-- __init__.py
|   |   |-- gateway.py
|   |   `-- safety.py
|   `-- util/
|       |-- __init__.py
|       |-- path_utils.py
|       `-- text_utils.py
`-- tests/
    |-- cli/
    |-- services/
    |-- fixtures/
    |   |-- encodings/
    |   `-- trees/
    `-- regression/
与 OpenTrade 的关联: 主入口、应用装配、执行器、门面这四层可直接借鉴 OpenTrade 的骨架;但 provider/backend 思想在 fileglide 中不需要照搬为“外部数据后端”,而应转化为“编码策略、匹配策略、编辑策略”的可替换实现。

14. 未决问题与后续决策点

14.1 CLI 框架

建议使用 click,因为 OpenTrade 已验证其多层命令树、参数帮助、测试友好性较好。若无强烈理由,不建议改用 Typer。

14.2 输出契约

是否默认输出 JSON 还是 table,需要根据“主要服务对象是 agent 还是人”最终裁定。当前建议读取类默认 text/table,agent 场景显式 --format json

14.3 二进制边界

是否要支持二进制级别切片与写入,目前建议延后。否则会明显扩大问题域。

14.4 批量执行计划

若后续支持 batch run-plan,建议采用显式计划文件结构,而非让命令直接执行模糊自然语言指令。

建议的下一步实现切片

  1. 先搭 CLI 基础骨架与目录结构。
  2. 实现 file readfile writepath listfile search 的最小闭环。
  3. 补充编码探测与保真写回测试。
  4. 再进入精确行编辑与模糊匹配排序。