# 本地浏览器工作台

工作台通过 MoonBit native 服务生成真实上下文。左侧浏览结果文件，中间查看原文、处理后正文或完整 JSON，右侧选择目录、策略、文件规则和预算；底部提供当前配置的 CLI 与最后成功结果的 JSON 下载。页面使用本地 HTML/CSS/JavaScript 和系统字体。

## 启动

安装 v0.4.1 后，在要处理的项目目录运行：

```sh
moon-repomix --webui
```

默认使用当前目录；指定其他项目时运行 `moon-repomix ./project --webui`。打开终端显示的 `http://127.0.0.1:8765`。更换端口：

```sh
moon-repomix --webui --webui-port 8795
```

也可以直接从源码运行，在本仓库根目录执行；首次运行先执行 `moon update`：

```sh
moon run src/cmd/moon-repomix --release -- --webui
```

项目默认使用 native。标准 `_build/native/{debug,release}/build/cmd/moon-repomix/` 中的 CLI 自动定位本仓库的 `assets/`，从其他工作目录启动该可执行文件也使用同一份资源。安装后的 CLI 使用 `share/moon-repomix/`；自定义构建目录可用 `--tokenizer-path` 指定词表。

词表旁须有 `webui/index.html`、`webui/app.css` 和 `webui/app.js`。源码已经提供 `assets/webui/`；安装和平台归档会将三个文件一起放进 `share/moon-repomix/webui/`。移动安装目录时保留 `bin/` 与 `share/` 的相对位置。服务运行不需要 Node.js；按 Ctrl+C 停止。

## 生成与对照

1. 等待顶栏显示 Native 在线；连接失败时点击状态按钮重试。“资源限制”显示当前会话的工作区、版本、端口与实际限额。
2. 选择工作目录。目录浏览器只展示启动命令授权工作区中的可用子目录；也可使用根目录 `.`。成功读取目录列表后才能确认，读取失败可重试；Escape 或关闭会返回触发按钮。
3. 选择全文（raw）、骨架（skeleton）或混合（mixed）模式。高级文件规则中的 Include 与 Keep full 每行一个 glob，按所选目录解释；Include 留空使用默认入选规则。Keep full 仅在混合模式发送，两类生效规则合计最多 64 条，每条最多 1,024 个 UTF-8 字节。
4. 输入 1 到 2,147,483,647 的整数预算，点击“生成上下文”或按 Cmd/Ctrl+Enter。生成期间锁定参数，完成后显示本次结果。
5. 在动态文件树中打开文件，用标签页和“原文 / 处理后”查看完整正文，或打开 `context.json` 查看完整 JSON（包括完整元数据）。下载与复制 JSON 保留 Native 返回的原始序列化字符串，不重新 stringify。底部 CLI 对应当前配置，使用 `--style json --full-metadata`、布尔 `--compress` 及逐条 shell 引用的规则。

修改目录、策略、规则或预算会把已有结果标为旧结果。文件树、原文对照、打开的标签页、完整 JSON、计数和下载仍属于最后成功响应，直到下一次成功；预算可即时对照旧整文，但不会把它当成新结果。生成失败保留最后成功结果并显示失败提示；零文件成功则清除旧文件和标签，改为打开新响应的完整 JSON。

文件树支持方向键、Home/End 导航，左右键展开/收起或返回父目录，Enter/空格打开文件或切换目录展开。标签页支持左右方向键、Home/End 切换并保持选中焦点，Delete 关闭；原文/处理后与策略使用原生单选键盘交互。底部“命令与导出”可折叠，收起后不可聚焦。手机上各区自然纵向排列，代码区独立滚动。

token 数针对最终渲染 JSON，包含目录、包装和元数据。预算超限会提示并保留完整结果；较 Raw 整包的比较会如实显示减少、相同或增加。正文变化计数来自实际逐文件对照，不将压缩元数据假定为固定汇总对象。扫描显示本次启用状态、状态码与命中数，覆盖范围见[安全说明](../SECURITY.md)。全文对照与骨架结果分别通过安全打包流程读取；生成时保持源码稳定，以便逐文件比较。

## 工作区与资源限制

服务只监听 `127.0.0.1`，授权范围由启动命令中的目录确定。浏览器中的路径不能越过该目录，也不能通过符号链接进入外部目录。仓库配置不会自动加载，扫描始终启用；界面按既有文件选择与扫描流程排除不适合分享的内容。扫描覆盖范围见 [安全说明](../SECURITY.md)。

| 项目 | 工作台上限 |
| --- | ---: |
| 单次普通候选文件 | 2,000 |
| 每次打包原始读取 | 16 MiB |
| 单文件 | 2 MiB |
| 含全文对照的 JSON 响应 | 16 MiB |
| 单次生成 | 60 秒 |

命令行指定更小的文件数、总读取或单文件限额时使用更小值。压缩生成包含全文对照和所选模式的两次打包；两次均独立接受输入限额和扫描。工作台一次只处理一个生成请求，忙时稍后重试。

这是可信本机用户的只读服务：不执行仓库命令、不向仓库写输出，下载由浏览器保存。HTTP Host、Origin 和自定义请求头检查限制跨站访问；该服务不是多用户托管接口，也不将并发敌对文件系统修改视为已经隔离。

## 常见问题

- **端口占用**：更换 `--webui-port`，在浏览器打开新地址。
- **启动后找不到页面资源**：确认安装目录保留完整 `bin/`、`share/` 布局；源码使用上述标准构建位置。自定义构建目录可传入 `--tokenizer-path /absolute/repo/assets/tokenizer-o200k_base.tiktoken`，静态文件与词表放在上述相对位置。
- **生成失败**：按页面提示缩小 Include、选择更小子目录或减少文件；修正后重新生成。409 表示引擎忙碌，413 表示资源超限。浏览器请求在 65 秒超时，但不表示后端任务已经取消，须稍后再试。旧结果不代表失败请求已成功。
- **复制不可用**：界面会打开包含完整文本的手动复制窗口，不会静默丢弃正文。
- **某个文件没有出现**：它可能被 ignore、文件类型或扫描排除。普通 CLI/SDK 的详细解释入口见 [入选原因](selection-explanation.md)。

[README](../README.md) 中的动图来自实际 Native 服务与浏览器操作。
