# Workspace Navigator

> Workspace Navigator is an Agent Skill for documents published in the zts212653/clowder-ai repository on GitHub: a SKILL.md instruction file an AI agent can load to do this task.

猫猫可编程导航 Workspace 面板：operator说模糊意图，猫猫找到路径，自动打开文件/目录。 Use when: operator说"打开日志""看看代码""打开设计图""帮我打开那个文档"等模糊指令。 Not for: 打开 localhost 前端页面（用 browser-preview）、纯代码编写（不涉及展示给operator看）。 Output: Hub 右侧 Workspace 面板自动打开并导航到目标文件/目录。

- Skill name: `workspace-navigator`
- Category: [Documents](https://www.openparable.com/skill/documents/1)
- Source: https://github.com/zts212653/clowder-ai/blob/HEAD/cat-cafe-skills/workspace-navigator/SKILL.md
- Repository: zts212653/clowder-ai (2,372 GitHub stars when collected)

## SKILL.md

# Workspace Navigator

operator说"帮我打开XXX"时，你要**自己找到路径，然后用 `cat_cafe_workspace_navigate` 让 Hub 右面板自动导航到那里**。operator不会给你精确路径——这是你的活。

## 核心工作流（三步走）

```
Step 1: 意图解析 — operator想看什么？
  "帮我打开日志" → 日志文件/目录
  "看看 F131 的设计图" → F131 相关的 .pen 文件
  "打开那个 discussion" → 讨论文档

Step 2: 路径搜索 — 用你的工具找到精确路径
  用 glob/grep/read 找到文件的相对路径（相对于 worktree 根目录）

Step 3: 调 typed MCP — 让 Hub 前端导航
  cat_cafe_workspace_navigate({
    path: "找到的相对路径",
    action: "open",
    worktreeId: "目标worktree",
    threadId: "当前 threadId（有就传）"
  })
```

## Step 2 详解：意图→路径匹配策略

这是本 skill 的核心硬实力。**不同意图用不同搜索策略**：

### 场景速查表

| operator说的 | 搜索策略 | 示例命令 |
|-----------|----------|---------|
| "打开日志" / "看日志" | **快捷方式：右侧状态面板底部「运行日志 → 查看日志」按钮**。也可用 `cat_cafe_workspace_navigate` | 按钮会自动打开最新 .log 文件 |
| "看审计日志" | 审计日志在 `packages/api/data/audit/` 下 | `glob("packages/api/data/audit/**")` |
| "打开 F131 的文档" | Feature 文档在 `docs/features/` 下 | `glob("docs/features/F131*")` |
| "看看 F131 的设计图" | Pencil 设计文件 | `glob("**/*F131*.pen")` 或 `glob("designs/*F131*")` |
| "打开那个 discussion" | 讨论文档在 `feature-discussions/` 下 | `glob("feature-discussions/*")` |
| "看看 chatStore" | 源码文件名搜索 | `glob("**/*chatStore*")` |
| "打开 BACKLOG" | 已知位置 | 直接用 `docs/ROADMAP.md` |
| "看看 plans" | 计划目录 | 直接用 `feature-specs/` |
| "打开那个 skill" | Skill 文档 | `glob("cat-cafe-skills/*/SKILL.md")` |
| "看看 spec" + 上下文 | 从对话上下文推断是哪个 Feature | 推断 Feature ID → `glob("docs/features/Fxxx*")` |

### 搜索策略优先级

1. **已知位置直达** — 日志、BACKLOG、SOP 等有固定位置的，不需要搜
2. **Feature ID 匹配** — operator提到 F 编号，直接 `glob("**/F{num}*")`
3. **文件名 glob** — operator提到文件名关键词，`glob("**/*关键词*")`
4. **内容 grep** — operator描述的是文件内容而非文件名，用 `grep("内容关键词")`
5. **目录浏览** — 不确定时先 reveal 目录，让operator自己挑

### 多结果处理

如果搜索返回**多个匹配**：
- **≤ 3 个**：列出让operator选，或者按上下文判断最可能的那个打开
- **> 3 个**：缩小搜索范围（加更多关键词），或者 reveal 到父目录让operator浏览

### 路径格式要求

- **必须是相对路径**（相对于 worktree 根目录），不要传绝对路径
- 例：`packages/api/data/logs/api/2026-03-21.log`，不是 `/home/user/.../2026-03-21.log`
- 目录路径末尾带不带 `/` 都行

## Step 3 详解：调用 `cat_cafe_workspace_navigate`

### 工具参数

| 参数 | 必填 | 说明 |
|------|------|------|
| `path` | **是** | 目标文件或目录的相对路径 |
| `action` | 否 | `reveal`（展开目录树到目标，默认）或 `open`（打开文件查看器） |
| `worktreeId` | **是** | 指定在哪个 worktree 里导航。API 需要此字段来解析路径 |
| `threadId` | **建议传** | 当前 thread ID，用于防止多 tab 串扰。传了只有对应 tab 响应 |

### action 选择

| 目标 | 用什么 action | 效果 |
|------|-------------|------|
| 目录（如 `packages/api/data/logs/`） | `reveal` | 展开文件树到该目录，不打开任何文件 |
| 文件（如 `docs/features/F131-workspace-navigator.md`） | `open` | 打开文件查看器显示文件内容 |
| 不确定 | `reveal` | 安全默认——展开到那里让operator自己看 |

### 调用示例

| 场景 | 调用 |
|------|------|
| 打开日志目录 | `cat_cafe_workspace_navigate({ path: "packages/api/data/logs/api/", action: "reveal", worktreeId: "cat-cafe-runtime" })` |
| 打开 Feature 文档 | `cat_cafe_workspace_navigate({ path: "docs/features/F131-workspace-navigator.md", action: "open", worktreeId: "cat-cafe" })` |
| 打开到某一行 | `cat_cafe_workspace_navigate({ path: "packages/web/src/stores/chatStore.ts", action: "open", worktreeId: "cat-cafe", line: 1273 })` |

如果 MCP 工具不可用，先说明工具面缺失并按 F223 追踪；不要把手写第一方 `curl localhost` 当主路径。

## 什么时候主动用

- operator说"帮我打开XXX" → **立刻搜索 + 导航，不要只回复路径让operator自己找**
- operator说"一起看看这个日志" → 打开日志目录
- 讨论 Feature 时提到 spec → 主动打开 spec 文档
- Debug 时提到某个文件 → 主动打开让operator和你一起看
- operator说"看看设计图" → 找到 .pen 文件并打开

## 面板快捷入口（F130）

右侧状态面板底部有内置快捷按钮，不需要走 `cat_cafe_workspace_navigate`：

| 按钮 | 位置 | 效果 |
|------|------|------|
| **运行日志 → 查看日志** | 右侧状态面板，AuditExplorerPanel 下方 | 自动展开到 `packages/api/data/logs/api/` 并打开最新 `.log` 文件 |

operator说"看日志"时，**告诉operator点右侧面板的按钮**比你调工具更快。你也可以用 `cat_cafe_workspace_navigate` 代替。

## 不要做的事

- **不要只回复路径让operator自己去点** — 你的价值是「帮operator打开」，不是「告诉operator路径」
- **不要问operator要精确路径** — 你自己能搜到，这是你的活
- **不要和 browser-preview 混淆** — workspace-navigator 打开文件/目录；browser-preview 打开 localhost 网页
- **不要传绝对路径** — API 只接受相对路径
- **不要瞎猜路径不验证** — 先 glob/grep 确认文件存在，再调 API

## 和其他 skill 的区别

| Skill | 关注点 |
|-------|--------|
| **workspace-navigator（本 skill）** | 帮operator在 Hub Workspace 面板打开文件/目录 |
| `browser-preview` | 在 Hub Browser 面板预览 localhost 前端页面 |
| `tdd` | 写代码的测试驱动纪律 |
| `quality-gate` | 开发完成后的自检 |

## 常见问题

| 现象 | 原因 | 修法 |
|------|------|------|
| 右侧无反应 | Hub/API 没跑 / 路径不存在 / MCP callback 未配置 | 检查工具返回错误；确认路径存在 |
| 打开了错误的文件 | glob 匹配到了多个，选了错的 | 列出所有匹配让operator确认 |
| worktree 切换失败 | worktreeId 不存在 | 查看当前 Workspace worktree 列表或改传正确 worktreeId |
| 面板没自动打开 | Socket 连接可能断了 | 刷新 Hub 页面重试 |

---

Source: https://www.openparable.com/skill/documents/workspace-navigator (OpenParable). Cite the canonical URL above.
