21 KiB
Repository Guidelines (Code-Verified)
Last verified against current codebase: 2026-06-21 Scope:
/Users/jojo/Desktop/agents/正在修复中/agents
这份文档基于当前仓库实际代码重写。若与未来代码冲突,以代码为准并及时更新本文档。
和用户交流时默认使用中文。
1) 当前项目结构(按代码现状)
- 后端入口
main.py: 统一启动入口(当前默认走 Web 模式 + thinking_mode=True)server/app.py: 推荐的 Web 服务入口(封装并转发到server/app_legacy.py)web_server.py: 兼容入口,已标记 deprecated,但仍可启动
- 后端核心目录
server/: Flask 业务主线(chat/task/status 已拆分为子包:server/chat/、server/status/、server/tasks/;REST 任务轮询为主,Socket.IO 主要用于兼容与实时辅助通道)core/: 终端与工具编排(main_terminal.py、web_terminal.py、main_terminal_parts/*;其中main_terminal_parts/context/和main_terminal_parts/tools_definition已拆分为 base + mixin 子包)modules/: 可复用能力模块(terminal/file/memory/sub_agent/upload_security/user 等;file_manager、persistent_terminal、terminal_ops、mcp_client_manager已拆分为子包)config/: 配置拆分(api.py,limits.py,terminal.py,paths.py...),由config/__init__.py聚合并加载.envutils/: API client、日志、上下文与对话工具等公共函数(api_client、tool_result_formatter、context_manager、conversation_manager已拆分为子包;原入口文件保留为兼容入口)
- 前端目录
static/src/: Vue 3 + TS 前端cli/src/: React 19 + Ink 6 + TypeScript CLI 前端(正在重写中)- 监控动画相关核心文件:
static/src/components/chat/monitor/MonitorDirector.tsstatic/src/stores/monitor.tsstatic/src/components/chat/monitor/*
- CLI 相关文档
docs/cli_ui_display_spec.md: CLI 显示层设计说明docs/cli_slash_commands_spec.md: CLI/指令设计说明
- 其他子项目/资源
android-webview-app/: Android WebView 客户端工程modules/sub_agent/: 子智能体执行逻辑(主进程内asyncio.Task,工具调用复用主进程链路)easyagent/: 旧版 Node.js 子智能体实现,暂时保留但已不再使用_experiments/: 本地实验残留与历史文档归档目录(不纳入 git,见 §7)
1.5) 运行态数据目录与路径变量(2026-06 更新)
设计目标:运行态数据(对话、用户工作区、日志等)默认存放在用户主目录的
~/.agents/agents/下,对齐~/.claude、~/.codex惯例,不落在源码树内。配置实现见config/paths.py。
1.5.1 默认位置与模式分流
运行态数据根目录(data_root)默认为 ~/.agents/agents,可通过 AGENTS_DATA_ROOT 整体搬迁。在该根目录下,按运行模式自动分流(由 TERMINAL_SANDBOX_MODE 决定):
- 宿主机模式(
TERMINAL_SANDBOX_MODE=host)→~/.agents/agents/host - 其它模式(默认 docker / web)→
~/.agents/agents/web
数据根目录下还包含:settings.json(唯一配置文件)、config/(部署级配置,host/web 共享)。每个模式目录下包含:data/(对话、用户库、记忆、sub_agents.json、sub_agent_tasks 等)、users/(web 多用户工作区)、api/users/(API 用户工作区)、logs/(日志)。
1.5.2 路径解析优先级(从高到低)
- 具体目录环境变量:
DATA_DIR/LOGS_DIR/USER_SPACE_DIR/API_USER_SPACE_DIR(单独覆盖某个目录,最高优先级) - 数据根目录环境变量:
AGENTS_DATA_ROOT(整体搬迁运行态数据根目录,默认~/.agents/agents) - 兜底默认:
~/.agents/agents/<mode>
具体目录变量支持相对路径(相对仓库根目录展开)、绝对路径与 ~。
注意:
config/*.json分两类:
- 程序能力(
docker_risk_markers.json、skill_hints.json):是程序行为的一部分,随版本演进,仍锚定源码树。prompts/、agentskills/同理。- 部署级配置(
custom_models、host_workspaces、auto_approval、goal_review、forbidden_commands、host_sandbox_policy):因部署/机器而异或含密钥,外置到~/.agents/agents/config/(即DEPLOY_CONFIG_DIR,可单独用该环境变量覆盖,host/web 共享)。读取走config.resolve_deploy_config(name),回退链:部署目录 → 源码树.json→ 源码树.json.example,因此开发环境不必先跑 setup 也能用源码树种子。含密钥/机器特定的 5 个(除forbidden_commands)不纳入 git,仓库仅留.example。
1.5.3 Host / Web 双路径机制(2026-06 新增)
paths.py 新增三个固定变量,支持 host 模式同时读取 web/ 数据:
IS_HOST_MODE:当前是否为 host 模式(布尔值)WEB_DATA_DIR:固定指向<data_root>/web/data(不受当前模式影响)WEB_USER_SPACE_DIR:固定指向<data_root>/web/users(不受当前模式影响)
host 模式(modules/user_manager.py):
- 用户列表:同时加载
host/data/users.json+web/data/users.json(web 用户不覆盖已有) - 工作区列表:合并 host/ 和 web/ 两处
- 工作区定位:已有 web 工作区直接复用;新工作区写入 host/
- 写操作(创建/删除/重命名):始终走 host 路径
web 模式:只读取 web/ 数据,无变化。
设计意图:host 模式 = host + web 数据都可用;web 模式 = 仅 web 数据可用。
1.5.4 日志策略(2026-06)
- API 请求体落盘(dump)默认关闭,由
AGENT_API_DUMP_ENABLED控制(1/true/yes/on开启)。 - 日志混合轮转(实现见
utils/log_rotation.py):- 追加型单文件(
host_workspace_debug.log、chunk_*.log、conn_diag.log、api_debug.log、TaskLogger/ErrorLogger)按大小轮转,默认单文件 20MB、保留 3 份。 - 按份计量目录(
api_requests/一请求一文件)只保留最近 N 个,默认 30。 - 阈值可覆盖:
AGENT_LOG_ROTATE_MAX_BYTES/AGENT_LOG_ROTATE_BACKUPS/AGENT_DUMP_KEEP。
- 追加型单文件(
1.5.5 数据迁移
- 迁移脚本:
scripts/migrate_runtime_data.py(源码树 → 运行态根;复制+备份+可回滚+幂等,logs/丢弃不迁)。- 脚本
import config复用程序同一套路径解析(含.env),模式由.env决定;执行前务必先--dry-run确认目标。
- 脚本
- 清理误迁副本:
scripts/cleanup_misplaced_web.sh。
2) 当前可用启动/构建命令(已按代码核对)
Python / 服务端
- 安装依赖:
pip install -r requirements.txt - 推荐启动 Web:
python -m server.app - 可选参数:
python -m server.app --path ./project --port 8091 --debug --thinking-mode - 兼容启动方式:
python web_server.py - 统一入口:
python main.py(当前实现会默认进入 Web 启动流程)
Frontend(根目录)
- 安装依赖:
npm install - 构建:
npm run build --silent 2>&1 | tail -n 5(默认只看最后 5 行,减少 Vite 构建资源列表等无关输出) - 开发监听(当前脚本是 build watch):
npm run dev - Lint:
npm run lint
CLI(React / Ink)
- 安装依赖:
npm --prefix cli install - 开发启动:
npm run cli或npm --prefix cli run dev - 构建:
npm run cli:build - 类型检查:
npm run cli:typecheck - 可执行命令名(构建后):
agents/agents-cli
3) 测试现状(不要再写过时命令)
- 当前仓库内可见自动化冒烟:
test/test_server_refactor_smoke.py(unittest)- 运行方式:
python -m unittest test.test_server_refactor_smoke
- 运行方式:
test_system_message.py依赖外部MOONSHOT_API_KEY与网络,不属于离线稳定 CI 用例。- 当前仓库未发现
pytest.ini/pyproject.toml/tox.ini;不要默认要求pytest作为唯一入口。 - CLI 当前最小可复现验证:
npm --prefix cli run typechecknpm --prefix cli run build
- 若改动
server/chat/、server/status/、server/tasks/等后端接口适配,补充:python3 -m py_compile server/chat/*.py server/status/*.py server/tasks/*.pypython -m unittest test.test_server_refactor_smoke
4) 代码修改约定(实用版)
- 最小改动原则:只改与需求直接相关文件,避免顺手重构。
- 精确读取原则:禁止整文件通读。阅读/修改前先用搜索工具(grep / 符号查找 / 关键字定位)锁定需要的行段,只精确提取并阅读相关片段,不要把整个文件一次性读进来。
- 文件编辑方式:修改文件时优先使用
apply_patch或其他原生文件编辑工具;尽量不要用bash/python脚本批量改文件,除非原生工具明显不适合。 - 后端改动优先级:先改
modules/、server/内对应模块,最后才动入口。 - 前端改动优先级:按
static/src现有分层改(app/、stores/、components/、composables/)。 - CLI 改动优先级:优先在
cli/src/App.tsx、cli/src/components.tsx、cli/src/eventMapper.ts、cli/src/api.ts内做最小闭环修改。 - 涉及 monitor 动画/事件联动时,至少同步检查:
MonitorDirector.ts(动画与场景执行)stores/monitor.ts(事件队列与状态机)
5) 风格与质量
文件长度与拆分
-
单文件最好不超过 1000 行;超过时应优先考虑合理拆分,避免维护成本快速上升。
-
行数不是硬性指标:文件是否拆分取决于可维护性,而不是必须小于某个固定行数。
-
当单一文件超过约 500 行时,应评估是否具备以下拆分价值:
- 业务逻辑过重、职责不单一;
- 存在清晰的边界(如按工具类型、按资源、按生命周期阶段);
- 拆分后能提高复用性、可读性或测试便利性。
-
不要为了拆分而拆分。边界模糊、耦合紧密或改动频率低的文件,保持现状可能更划算。
-
Vue SFC 因模板、样式、脚本耦合较深,拆分风险较高;优先抽离 composable 和子组件,而非直接切分
.vue文件。 -
Python:4 空格、
snake_case函数、PascalCase类,新增公共函数尽量补 type hints。 -
Vue/TS:保持现有代码风格,不做无关风格清洗。
-
CLI React/TS:保留现有 Ink 渲染方式与光标修正逻辑,不要轻易重写输入框定位策略。
-
日志:优先复用现有 logger/日志路径,不引入大量临时
print。 -
提交前至少做与改动相关的最小验证(命令输出或手工步骤要可复现)。
-
运行根目录前端构建时,默认使用
npm run build --silent 2>&1 | tail -n 5。
CLI 当前交互约束(2026-05-15)
- CLI 连接的是现有本地 Web API(默认
127.0.0.1:8091),不是独立 agent runtime。 - 启动 CLI 时应清屏、连接本地服务、创建新会话,并将输入区固定在底部。
- 当前目录若不在工作区中,应先弹出“是否添加到工作区”的选择。
- 思考内容当前默认隐藏,只显示“思考中 / 思考完成”标题;相关折叠代码保留,后续可继续修。
- 不要在未获得用户要求的情况下运行交互式 TUI 压测或长时间模拟输入,以免刷屏占满上下文。
5.5) 前端设计风格统一规范(强制)
适用范围:所有前端 UI(以
static/srcWeb 为主;cli/src在视觉可类比处同样适用;以及未来新增的任何界面)。 约束级别:写新 UI 或改动 UI 时必须遵守;遇到存量违规应在最小改动允许范围内顺手修正。 配色基础设施:两层 token(原始层 + 语义层)定义在static/src/styles/base/_tokens.scss(:root[data-theme='classic'|'light'|'dark']+ 首屏回退:root:not([data-theme])),切换逻辑见static/src/utils/theme.ts;.stylelintrc.cjs三条规则做防回退栏杆,build含stylelint步骤。
- 禁止边缘光晕:不使用任何 glow / 外发光 / 彩色光晕效果(大范围彩色
box-shadow扩散、filter: drop-shadow光圈、::before/::after模糊光晕等)。已有的要移除。允许的只是中性、克制的投影——沿用--shadow-*既有 token,不自造发光阴影。仅在用户明确允许或要求时才可使用光晕效果。 - 禁止原生浏览器组件:不直接使用浏览器默认外观的
<select>、<input type=checkbox/radio/range/date/color>、alert/confirm/prompt、原生右键菜单、原生 tooltip 等,一律换成与项目风格统一的自定义组件(下拉 / 开关 / 单选 / 滑块 / 模态 / Toast)。 - 禁止圆角套娃:不允许「圆角矩形套圆角矩形套圆角矩形」的多层嵌套卡片——典型垃圾审美,且极大占据有效显示面积。容器层级要扁平,优先用分隔线 / 留白 / 底色区分,不要多包一层带边框圆角的盒子。
- 图标外框对齐:同一组图标按钮的外框(点击热区 / 容器)必须统一对齐,不能一会居中、一会左对齐、一会右对齐;同组固定相同尺寸与对齐方式。
- 图标视觉对齐而非理论对齐:按图标视觉重心对齐而非几何边界盒;对重心偏移的图标(三角形 / 播放键 / 放大镜等)做微调,使其「看起来居中」。
- 颜色遵循三模式切换 + 两层 Token:所有颜色走原生三模式,禁止写死颜色字面量(裸 hex /
rgb()/hsl()字面色 /var(--x, #hex)兜底),一律用中性语义 CSS 变量(--surface-*/--text-*/--border-*/--accent*/--state-*)。三主题定位:经典抄 Claude 亮色盘(暖奶油 + 暖橙 primary#cc785c)、浅色抄 ChatGPT 亮色盘(冷白 + 灰 + 近黑 primary#181818)、深色自研中性灰阶。亮色表面靠灰阶拉层次(经典--surface-base #faf9f5<soft #f5f0e8<card #efe9de<muted #e8e0d2),不许全塌成白。primary 克制(CTA-only),hover/选中/运行态走中性灰。半透明 tint 用color-mix(in srgb, var(--token) N%, transparent)派生。--claude-*/--theme-*是过时别名,新代码勿用。新增颜色必须三主题(含首屏回退)补齐。 - 带文字容器固定高度:所有含内部文字的选项 / 按钮 / 标签 / 容器固定高度,禁止因文字多少被撑大撑高;过长文字用省略号或内部滚动处理。
- 窗口设最大尺寸 + 内部滚动:所有弹窗 / 面板 / 列表设置
max-height/max-width,超出由内部容器滚动,不顶大整个窗口;滚动条要么隐藏,要么做样式适配,不暴露原生粗滚动条。 - 实体面板禁止半透明:实体 UI 容器(对话区 / 侧栏 / 下拉/二级菜单 / 抽屉 / 对话框本体 / 状态条 / tooltip / 输入栏)背景必须不透明,且不加
backdrop-filter磨砂。唯一例外:遮罩层 scrim(--overlay-scrim,position:fixed;inset:0)和刻意玻璃质感装饰保留半透明。
6) Git 工作流(开发 + Review)
6.1 核心原则
- 默认直接在
main上开发,不强制新建功能分支。 - 每个功能建议在
main上保持一个清晰 commit,历史干净可回滚。 - 使用 Conventional Commits:
feat:fix:refactor:chore:docs:test:perf:。 - 个人项目,不设 PR 和 Review 流程;如用户临时要求隔离开发,再按需新建分支。
6.2 工作流(唯一步骤)
AI 执行以下流程时,每一步都要向用户说明在做什么:
0. 检查工作区状态
git status
如有未提交的改动:
- 若无关:提醒用户先 commit 或 discard
- 若有关:git stash push -m "WIP: <简短描述>" 暂存
1. 确认在 main 并同步最新代码
git checkout main && git pull origin main
2. 开发并提交
git add <修改的文件>
git commit -m "feat(scope): 简短描述"
(多轮迭代可用 git commit --amend 保持一个 commit)
3. 推送到远程(备份 + 方便切设备)
git push origin main
重要约束:
- AI 必须在本地验证修改能正常运行,再建议用户提交。
- 修改完成后按改动规模汇报:大修改说明核心变更点与验证结果;小修改只说明核心变更点。
- 禁止 AI 在未经用户确认的情况下执行
git push。 - 不需要每次都执行或输出 diff;如用户要求 Review,再在同一对话内使用
git diff或git diff HEAD~1..HEAD。
6.3 常用命令速查
| 操作 | 命令 |
|---|---|
| 暂存未完成工作 | git stash push -m "WIP: xxx" |
| 修改最近 commit | git commit --amend |
| 同步 main | git checkout main && git pull origin main |
| 同对话内 Review diff | git diff 或 git diff HEAD~1..HEAD |
| 查看提交历史 | git log --oneline -10 |
7) 安全与仓库卫生
- 严禁提交真实密钥(
.env、token、cookie、用户隐私)。 - 运行态数据默认在
~/.agents/agents/<mode>/(data/、users/、logs/、api/),不在源码树内;详见 §1.5。.gitignore仍忽略源码树内的logs/、data/、users/、api/、project/等,以防通过具体变量指回源码树或历史遗留产生污染。分享前需脱敏。 _experiments/用途:归档本地实验残留与历史文档(调试记录、旧变更日志、模型测试脚本、翻译资料、旧子智能体文档等)。该目录不纳入 git(已在.gitignore)。需要保留但不属于当前主线、又不想直接删的零散文件,统一放这里,不要散落在根目录。- 不要把本地构建产物(如
static/dist/、node_modules/)纳入提交。
8) Android App 发布联动要求(重要)
当修改前端并需要发布 Android WebView App 时,必须同步执行以下步骤(依据 doc/android_app_release_and_update.md):
- 同时更新版本信息
android-webview-app/app/build.gradle.kts:递增versionCode,更新versionName
- 同时更新更新说明
android-webview-app/APP_CHANGELOG.md:在顶部新增当前版本说明
- 完成修改后提醒用户运行上传脚本
- 在发布流程中运行:
bash /Users/jojo/Desktop/agents/正在修复中/agents/upload_android_apk.sh
- 在发布流程中运行:
禁止只改前端代码而不更新版本号/更新说明,否则会导致客户端更新提示与分发信息不一致。
9) 给 Agent 的硬性要求
- 先读当前代码再执行,不依赖历史文档记忆。
- 输出结果按改动规模决定:
- 大修改:必须包含核心变更点、验证结果(已执行命令/未执行原因)。
- 小修改:只需包含核心变更点。
- 不要求每次列出所有修改文件;仅在用户要求、改动复杂或有助于说明时列出。
- 不要求每次执行或展示 diff;仅在用户要求 Review 或排查差异时使用。
- 如果发现本文档过时,直接更新
AGENTS.md并在结果中说明依据。
10) 宿主机权限模式与沙箱执行机制(2026-05 更新)
完整说明文档:docs/host_sandbox_and_permission_model.md
为避免误解,当前系统有两套独立但叠加的控制:
- 权限模式(Permission Mode):
readonly/approval/auto_approval/unrestricted - 执行环境(Execution Mode):
sandbox/direct(仅宿主机模式可切换)
10.1 权限模式
readonlyrun_command可调用,但在只读沙箱执行;写入由系统拒绝write_file/edit_file等写入类工具直接拒绝
approvalrun_command先走只读沙箱- 若出现权限拒绝(例如
Operation not permitted/Permission denied),触发前端审批 - 审批通过后,仅该次命令以可写沙箱重试;工具结果返回“重试后的最终结果”
auto_approvalwrite_file/edit_file:工作区内路径直接执行,工作区外路径进入审批流程run_command先走只读沙箱;触发权限拒绝后由后台审批智能体自动审核- 自动审核拒绝时,工具返回“被拒绝+理由”并继续主循环(不强制结束任务)
unrestricted- 不做权限模式拦截;是否沙箱由执行环境决定
10.2 执行环境
sandbox(默认):使用 OS 沙箱执行(macOS:sandbox-exec,Linux:bwrap + seccomp,Windows:WSL2)direct:宿主机直接执行(高风险,仅建议短时使用)- 宿主机下支持会话级 TTL 自动回退
direct -> sandbox
10.3 路径授权语义
- 前端“路径授权”支持两类路径:
- 可读可写
- 仅可读
- 语义:
- 可读集合 = 可读可写 + 仅可读
- 可写集合 = 可读可写
10.4 维护约束
- 不要在提示词里暴露内部实现细节(例如“命令文本猜测”等)
- 文案应面向用户能力边界与操作建议,不描述内部判定算法
10.5 自动审批智能体配置与调试
- 自动审批配置文件:
config/auto_approval.json- 建议字段:
name/url/key/model/extra_params - 额外控制:
timeout_seconds/max_rounds/max_command_timeout
- 建议字段:
- 调试开关(代码变量):
modules/approval_agent.py中DEBUG_SAVE_APPROVAL_AGENT_TRANSCRIPT- 开启后写入:
logs/approval_agent/ - 记录以累积
messages为主,便于对齐主/子智能体会话格式
- 开启后写入: