Ctrl K
ComunidadGuías…

AGENTS.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# AGENTS.md

## 项目结构

- `app/`:Nuxt 前端与客户端状态。页面入口在 `app/app.vue`,业务组件按领域放在 `app/components/{chat,common,settings,sidebar,thread}`。
- `packages/gateway-ui/`、`packages/gateway-ai-elements/`:预编译的 shadcn-vue 和 AI Elements 组件;`packages/gateway-browser-runtime/`:重型浏览器依赖。业务组件优先复用这些包的公开导出。
- `app/stores/`:按领域拆分的 Pinia store;状态和动作放在对应领域,跨领域事件沿用现有 `gateway/domain-events.ts` 等机制,不重新集中到单个 gateway store。
- `server/api/`、`server/routes/`:Nuxt/Nitro HTTP、WebSocket 和代理入口,浏览器通过 Gateway 访问远端服务。
- `server/utils/gateway/`:后端 gateway 核心,包括 SSH、Codex app-server RPC、thread broker、运行时索引。
- `shared/types.ts`:前后端共享 DTO 和类型。
- `i18n/locales/`:UI 文案。默认中文,新增可见文案必须同步维护中英文。
- `tests/e2e/`:Playwright E2E。测试必须走真实 Nuxt server、真实 SSH 环境、真实 Codex app-server。
- `third_party/openai-codex/`:官方 Codex 源码 submodule,只用于参考。除非任务明确要求,不要修改其中内容。
- Codex 协议基准是 `server/utils/gateway/infra/codex/codex-version.ts` 中的 `SUPPORTED_CODEX_VERSION`,submodule 对齐该发布 tag。明确升级 Codex 时再核对 npm latest 并同步适配,普通任务不顺手升级。

## 运行命令

- 安装依赖:`pnpm install`
- 本地开发:`pnpm dev`
- 类型、规则与格式检查:`pnpm lint`
- 子包类型检查:`pnpm typecheck:dependencies`;根 `lint` 不检查子包源码,`postinstall` 会构建并检查子包。
- 构建:`pnpm build`
- E2E:`pnpm test:e2e`

## 测试命令

- 常规代码改动至少运行 `pnpm lint`;纯文档改动检查内容和 `git diff --check` 即可。
- 改变 SSH、RPC、thread 数据流、实时同步、上传、配置导入导出、路由恢复或语言切换行为时,必须运行 `pnpm test:e2e`。纯文案或样式改动按影响范围验证,不仅凭文件所在目录决定全量回归。
- `pnpm test:e2e` 在 Docker 中构建生产产物,应用、浏览器和构建使用独立容器,并连接真实 SSH/Codex 测试环境。统一使用该脚本,不在宿主机直接运行 Playwright,不用 mock app-server 替代真实集成链路。
- 如果 E2E 失败,先看 Playwright trace、Gateway 测试容器和 SSH 测试容器日志,再判断是测试环境还是代码问题。
- 构建、完整 E2E、镜像导出等长任务应使用一次足够长的前台等待或 `sleep` 后再检查结果,不要用短间隔频繁轮询刷日志。

## Git 协作

- 任何代码更改必须先从 `main`/`master` checkout 新分支,例如 `feat/*`、`fix/*`;如果当前已经位于非 `main`/`master` 分支,则无需再次创建分支。
- 禁止直接在 `main` 或 `master` 分支提交与推送代码更改。多人协作统一通过“分支 + PR + Review”完成合并,避免直接推送造成冲突。
- 当用户要求提交、合并并部署时,必须按以下顺序执行,不得从功能分支直接部署:
  1. 在当前功能分支完成上述适用检查和 `git diff --check`。
  2. 提交全部任务相关改动并推送当前分支到 `origin`。
  3. 使用 `gh pr create` 创建 PR,确认检查结果和变更范围后使用 `gh pr merge` 合并;禁止绕过 PR 直接推送 `main`。
  4. 切换回 `main`,使用 `git pull --ff-only origin main` 获取远端合并结果,并确认工作区干净且提交与远端一致。
  5. 仅从最新 `main` 执行 `docker compose up -d --build codex-gateway`;确认容器健康、连接 `web-common`、公网首页返回 200,并检查启动日志。需要认证的 API 应带凭据验证,不将未登录的 401 当作启动失败。

## 代码风格

- 全项目使用 Nuxt 4 + TypeScript;前后端都写 TS,不引入 Go/Python/Rust 等新服务实现。
- 浏览器不直接连接远端 Codex app-server;登录使用 Gateway token,SSH/Codex 凭据由服务端管理。凭据录入可提交到 Gateway,但不在浏览器持久化远端凭据。
- Gateway 业务实时交互统一走每个浏览器页面一条 WebSocket,复用 host/thread/terminal 等 topic。配置、版本等 HTTP 请求和文件/Git 等既有 WS 查询沿用各自 transport;预览页面自身的代理连接不属于这条业务总线。
- 同一 host 在 gateway 后端只维护一个共享 SSH 连接;多个浏览器页面必须复用同一个 gateway-side SSH/RPC 生命周期管理。
- Codex app-server/thread 是事实源。前端和 gateway 只做配置、索引、缓存和广播,不发明不可失效的二次 timeline。
- 远端 Codex 低于 `SUPPORTED_CODEX_VERSION` 时,gateway 负责升级并重启 app-server;升级/重启状态必须推送到前端。
- Host、置顶及通知等用户配置以服务端 SQLite 为事实源,敏感连接配置加密保存。目录分组从 Codex thread.cwd 生成,在内存中维护;对话身份使用 hostId + threadId,目录操作使用 hostId + cwd,官方 Thread.projectId 保持原样。订阅、运行状态和历史快照是内存运行态;浏览器可保存登录、路由、布局和文件 tab 等偏好,不用 localStorage 作为连接配置的事实源。
- UI 默认中文,交互布局参考 Codex Desktop。不要做营销页或假数据页面。
- 前端业务界面必须全局响应式布局;业务组件和业务样式禁止使用 `px` 级固定宽高、固定列宽、固定弹窗尺寸或固定字体,优先使用 Tailwind scale、`rem`、`clamp()`、`min()/max()`、`minmax()` 和容器约束。`packages/gateway-ui/`、`packages/gateway-ai-elements/` 的上游基础组件除非任务明确要求,不作为业务布局清理范围。
- 业务组件按领域拆分;通用能力沉到 `app/components/common/` 或对应领域目录。避免单文件持续膨胀,不绕过 shadcn-vue 写平行组件体系。
- Markdown、diff、图片查看、上传、模型/审批/推理设置等功能必须使用真实 app-server 语义和真实数据;不添加 fake/mock thread、fake host、fake progress 来绕过真实 app-server。
- 使用成熟库处理协议、SSH、WebSocket、Markdown、拖拽/弹层等复杂行为;不要手写脆弱协议解析。
- 当用户要求“全项目”“系统性”“重构”级别修改时,必须先用搜索列出完整影响范围,再逐个文件按语义手动修改;禁止用机械替换、局部修补或只处理截图可见位置来冒充完成。
- 保持 ASCII 代码为主;只有 UI 文案、中文注释或现有文件语境需要时才加入非 ASCII。

## 禁止事项

- 禁止为旧的本机 `local` host 或旧字段写兼容迁移,除非用户明确要求;配置 schema 应该严格暴露错误。
- 不为旧版服务端或未发布 main 协议增加兼容分支;当前支持版本仍可返回 legacy 历史格式,其必要读取路径不属于旧服务端兼容,不能因此删除。
- 禁止把 SSH 密码、私钥、Codex token 打到日志、toast、测试输出或提交记录中。
- 禁止无关重构、格式化第三方 submodule、改动用户未要求的文件。
- 禁止用 `git reset --hard`、`git checkout --` 等破坏性命令回滚用户改动。

## 完成标准

- 功能使用真实远端 SSH/Codex app-server 跑通,不依赖假数据。
- 多浏览器打开同一 thread 时,事件流、运行状态、发送消息、完成状态保持一致。
- 页面刷新后能通过 URL/localStorage 恢复合理状态,不能出现空白、假加载或需要重复手动滚动才能看到最新消息的问题。
- Gateway 请求错误经脱敏后统一通过 Sonner 通知,不重复插入 Agent loop;详细诊断留在服务端日志,官方对话中的错误事件仍按其语义展示。
- 新增 UI 在桌面和移动端均不重叠、不溢出,滚动区域和弹窗可用。
- 涉及全项目 UI 布局清理时,必须确认业务前端代码没有新增 `px` 级布局,并说明 shadcn/第三方内部代码是否被排除。
- 涉及全项目或系统性重构时,必须能说明排查范围、实际修改范围和未覆盖范围;不能用机械替换结果替代人工判断。
- 上述适用检查通过;未运行的测试必须在最终说明里明确写出原因。
- 变更保持可维护:状态流转清楚,模块边界明确,没有把临时逻辑塞进大文件。

## Review 标准

- 先看正确性:是否破坏 gateway 统一管理 SSH/RPC、thread broker、WS fan-out、配置同步或 URL 恢复。
- 再看真实性:是否引入 fake 数据、mock app-server、无效 fallback 或浏览器直连远端。
- 再看安全性:是否泄露 SSH/Codex 凭据,是否把敏感配置写到日志或测试产物。
- 再看生命周期:SSH keepalive、断线重连、RPC close、WS unsubscribe/resubscribe、controller 缓存是否会泄漏或卡死。
- 再看 UI:是否符合 Codex Desktop 风格、默认中文、shadcn-vue 使用一致、滚动/弹窗/图片/Markdown/diff 可用。
- 对全项目/系统性修改,额外检查是否真的覆盖了完整影响面,是否存在只修局部、机械替换、留下固定 `px` 业务布局或破坏响应式约束的问题。
- 最后看测试:关键路径是否有 E2E 覆盖,失败路径是否能在前端看见明确错误。