当用户要对 OpenLoaf 的"项目"这一实体做创建、打开、切换、移动、删除、改名、建子项目时触发。典型说法"新建项目"、"把 ~/code/foo 加进来"、"列出所有项目"。**不用于**:项目内文件读写(→直接用 Read/Edit/Write)、讨论"项目规划 / 需求文档"(→直接回答)、纯 Git 日常操作(→`Bash`)。
| 工具 | 职责 | 只读 |
|---|---|---|
ProjectQuery | 查询项目树 / 单个项目详情(mode: list / get) | 是 |
ProjectMutate | 创建 / 更新 / 移动 / 删除项目(action: create / update / move / remove) | 否 |
Read / Glob / Grep | 项目内文件读取与搜索(常驻工具) | 是 |
Edit / Write | 项目内文件编辑 / 新建(常驻工具) | 否 |
Bash | 在项目根执行命令(Git 等,常驻工具) | 否 |
加载:
Read/ / / / / 为核心工具,始终可用; / 调用前须先 激活 schema。
GlobGrepEditWriteBashProjectQueryProjectMutateToolSearch(names: "ProjectQuery,ProjectMutate")用户想操作文件
├─ 已在项目上下文? → 直接用文件工具
└─ 不在项目上下文?
├─ 明确要创建项目 → ProjectMutate { action: "create" }
└─ 随口说"帮我写个脚本" → 系统自动创建临时项目(见下文)
list — 项目树 + 扁平列表:ProjectQuery { mode: "list" }
get — 单个项目详情(省略 projectId 时用当前上下文):ProjectQuery { mode: "get" }
ProjectMutate { action: "create", title: "Q2 Marketing", folderName: "q2-marketing", icon: "📊", enableVersionControl: true }
指向已有目录 — 用户给出裸路径时,你必须转换为 file:// 协议 URI:
/Users/user/code/repo → 你传 rootUri: "file:///Users/user/code/repo"~/my-project → 先展开 ~,再拼 file:///Users/user/my-project创建子项目 — ProjectMutate { action: "create", title: "子模块", parentProjectId: "parent-id" }
或在当前项目下:{ action: "create", title: "子模块", createAsChild: true }
parentProjectId)createAsChild: truefolderName(磁盘不友好的字符会出问题)true,适合代码项目false(避免无意义的 Git 初始化)false(仓库已有 .git)update:ProjectMutate { action: "update", projectId: "xxx", title: "新名称", icon: "🚀" }
move:ProjectMutate { action: "move", projectId: "xxx", targetParentProjectId: "parent-id" }(null = 移到顶层)
remove:ProjectMutate { action: "remove", projectId: "xxx" } — 仅摘除注册记录,不碰磁盘文件。用户的代码和数据不可逆,磁盘由用户主权管理。
用户在全局对话(非项目上下文)中要求文件操作时,系统自动创建临时项目于 ~/.openloaf/temp/,用户无需感知。
| 属性 | 正式项目 | 临时项目 |
|---|---|---|
| 创建方式 | ProjectMutate { action: "create" } | 系统自动创建 |
| 磁盘位置 | 用户指定或默认目录 | ~/.openloaf/temp/{sessionId}/ |
| 生命周期 | 用户手动移除 | 可提升为正式项目,或随会话清理 |
探索项目:ProjectQuery { mode: "get" } → Glob { pattern: "**/*" } → Grep → Read
创建项目:ProjectQuery { mode: "list" } → ProjectMutate { action: "create", ... } → Write 写初始文件 → Bash 初始化依赖
rootUri 格式错误 — 必须 file:// 协议如 file:///Users/user/project,不能用裸路径。跨平台 URI 标准要求协议前缀,裸路径会导致解析失败。记住:三个斜杠(file:///)= 协议 file:// + 根路径 /。用户如果想访问项目目录之外的磁盘路径,引导他创建一个新项目指向该目录——沙箱无法越界。
混淆 remove 与删除 — remove 只摘注册不碰磁盘,防止误删用户代码。如果用户确实要删磁盘文件,需显式用 Bash rm -rf。
忘记先查询 — 变更前先 ProjectQuery 确认 projectId 和当前结构。projectId 是随机生成的,靠猜测传入会操作错误的项目。