136 lines
6.2 KiB
Markdown
136 lines
6.2 KiB
Markdown
# AGENTS.md
|
||
|
||
本文档为在此仓库中工作的 AI 编码代理(Codex、Cursor、Copilot 等)提供指导。
|
||
|
||
## 第一性原理
|
||
|
||
请使用第一性原理思考。你不能总是假设我非常清楚自己想要什么和该怎么得到。请保持审慎,从原始需求和问题出发,如果动机和目标不清晰,停下来和我讨论。
|
||
|
||
|
||
## 方案规范
|
||
|
||
当需要你给出修改或重构方案时必须符合以下规范:
|
||
|
||
- 不允许给出兼容性或补丁性的方案
|
||
- 不允许过度设计,保持最短路径实现且不能违反第一条要求
|
||
- 不允许自行给出我提供的需求以外的方案,例如一些兜底和降级方案,这可能导致业务逻辑偏移问题
|
||
- 必须确保方案的逻辑正确,必须经过全链路的逻辑验证
|
||
|
||
## 这是什么
|
||
|
||
这是一个多代理 AI 编排系统。
|
||
|
||
## 关键命令
|
||
|
||
### Inbox CLI(核心工具)
|
||
|
||
```bash
|
||
cd inbox && go build -o /tmp/inbox-host ./cmd/inbox
|
||
export INBOX_WORKSPACE=/Users/xd/project/ai-workflow-v2
|
||
|
||
/tmp/inbox-host server --workspaces-dir /Users/xd/project/ai-workflow-v2/inbox-worktrees --port 3000
|
||
/tmp/inbox-host api GET /api/v2/projects
|
||
/tmp/inbox-host api POST /api/v2/topics --data '{"workspace_id":"ws_1","title":"Signup Flow","space":"workflow","status":"execution"}'
|
||
```
|
||
|
||
### Dashboard(React UI)
|
||
|
||
```bash
|
||
cd dashboard && npm install && npm run dev # Vite 开发服务器
|
||
cd dashboard && npm run build # 生产构建 → dist/
|
||
```
|
||
|
||
开发模式下,Dashboard 会将 `/api` 代理到 `http://localhost:3000`。
|
||
|
||
### Apps
|
||
|
||
```bash
|
||
# phonesite(Next.js 静态站点)
|
||
cd apps/phonesite && npm install && npm run dev
|
||
cd apps/phonesite && npm test # Vitest
|
||
cd apps/phonesite && npx playwright test # E2E
|
||
|
||
# redbook(全栈:Go + Next.js)
|
||
cd apps/redbook/backend && go run ./cmd/server # :8080
|
||
cd apps/redbook/backend && go test ./...
|
||
cd apps/redbook/frontend && npm install && npm run dev
|
||
cd apps/redbook/frontend && npm test
|
||
```
|
||
|
||
## 架构
|
||
|
||
### 当前流程
|
||
|
||
当前激活的流程以 HTTP 为中心:
|
||
|
||
1. `inbox server` 启动 Inbox API。
|
||
2. `inbox api ...` 或 Dashboard 调用 `/api/v2/*`。
|
||
3. HTTP 层通过 `internal/store/sqlite` 直接写入 SQLite。
|
||
4. 运行时角色解析从数据库读取,并快照到 workflow run 中。
|
||
|
||
### 运行时目录结构
|
||
|
||
```
|
||
<repo>/.runtime/inbox.db # Inbox V2 SQLite 存储
|
||
```
|
||
|
||
### Inbox CLI(Go,`inbox/`)
|
||
|
||
单个二进制文件,提供两个命令:
|
||
- `server`:启动 HTTP API
|
||
- `api`:通用的、面向 AI 的 HTTP 包装器
|
||
|
||
关键模块区域:
|
||
- `internal/base/`:通用基础原语
|
||
- `internal/domain/`:稳定的业务实体与规则
|
||
- `internal/app/`:运行时配置与 workflow-run 服务
|
||
- `internal/httpapi/`:`/api/v2/*` 处理器
|
||
- `internal/store/sqlite/`:SQLite schema 与仓储实现
|
||
|
||
### 角色系统
|
||
|
||
角色是数据库驱动的运行时配置,而不是文件驱动的事实来源。
|
||
|
||
- `leader` 负责用户对话、任务拆解、链路编排,以及宿主机上的最终执行决策
|
||
- `worker` 在隔离的 worktree/container 中执行分配的链路任务,并向 `leader` 回传证据
|
||
- `user` 是仅供人类使用的运行时角色,永远不会由 AI 运行时自动执行
|
||
|
||
### Dashboard(`dashboard/`)
|
||
|
||
基于 React 19 + TypeScript + Vite + Tailwind + Framer Motion。页面包括:Timeline、Topics、Roles、Executions、Merges。通过轮询 inbox web API 获取更新。
|
||
## 工程规则
|
||
|
||
### 最高优先级:修复根因,而不是增加回退逻辑
|
||
|
||
- 默认直接修复根因。除非用户明确要求这种权衡,否则不要添加 fallback 逻辑、ignore 规则、兼容性分支、防御性特判或“以防万一”的条件分支。
|
||
- 如果真正的问题是糟糕的历史状态、陈旧的运行时产物、脏 worktree 或畸形数据,应通过迁移、清理步骤、修复脚本或定向数据修正直接修复状态,而不是让应用逻辑静默容忍这些问题。
|
||
- 不要把运维残留吸收到产品逻辑中。运行时文件、缓存文件、生成产物、临时目录以及本地 OS 噪音,都应在源头被隔离、迁移或显式清理。
|
||
- 在考虑“增强韧性”的补丁之前,先问自己:“为什么会出现这个坏状态?”以及“能不能直接移除这个坏状态的来源?”优先做源头治理。
|
||
- 如果 fallback 看起来不可避免,先停下来,把这个权衡显式告知用户,再决定是否实现。不要为了短期方便,悄悄加入长期分支逻辑。
|
||
- 优先选择一条干净、易解释的路径,而不是堆叠逻辑去保留旧错误。
|
||
|
||
### 不要添加遗留兼容层
|
||
|
||
- 不要为旧数据、旧字段值、旧路由、旧目录布局、旧分支命名或旧运行时行为添加兼容代码。
|
||
- 不要保留双路径逻辑,例如 `new flow || old flow`、fallback-to-legacy 分支、针对历史数据的静默运行时协调,或把 cleanup-by-ignore 规则塞进核心逻辑里。
|
||
- 如果旧数据或运行时残留有问题,应通过显式迁移、修复脚本、定向 DB 更新或一次性清理直接修正。不要把问题藏进应用逻辑里。
|
||
- 如果旧实现正在被替换,就删除旧路径,而不是长期同时支持两套。
|
||
- 不要留下没有移除计划的“临时” fallback 分支。在这个仓库里,临时兼容逻辑通常就是错误方向。
|
||
|
||
### 清晰的模块归属
|
||
|
||
- 新行为必须放进职责单一、边界明确的模块中。
|
||
- 不要把一个特性零散地分布在 handler、service、helper 和 infra 文件中,而没有清晰的模块边界。
|
||
- HTTP handler 应保持轻量:解析请求、调用 application service、写回响应。
|
||
- Application service 应负责编排和业务流程。
|
||
- git、container、filesystem、process execution 等基础设施细节应封装在职责明确、接口收敛的专用模块之后。
|
||
- 做重构时,优先先提取模块,再把逻辑迁移进去,而不是让部分逻辑继续散落在旧文件中。
|
||
|
||
### 处理破坏性变更的首选方式
|
||
|
||
- 优先干净替换,而不是渐进兼容。
|
||
- 优先 schema/data migration,而不是运行时分支。
|
||
- 优先显式清理,而不是用 ignore 掩盖问题。
|
||
- 优先显式失败,而不是隐藏 fallback 行为。
|
||
- 新模块就位后,优先删除废弃代码。
|