Lily 是一个持续运行、人工审批的多运行时软件维护 Agent 控制台。它可以调度 Codex CLI、Claude Code、OpenAI Responses 或演示执行器,将任务交给规划、实现、审查和验证阶段,保存真实 diff、命令记录、测试证据、Token、费用和运行事件。
填写本地 Git 仓库路径后,Lily 会创建 detached worktree,并按任务选择调用本机已经登录的 Coding Agent。它不会修改原工作区、自动提交、推送、创建 PR、合并代码或部署生产环境。
- 持久化任务队列,服务重启后仍保留任务与执行记录
- 自动后台工作循环,支持暂停、恢复和失败重试
- 复用本机 Codex 登录,无需 OpenAI API Key
- Claude Code 可选运行时,支持保存登录和
stream-json - 任务级运行时选择与自动优先级
- 统一 Runtime Adapter、session、Token 和费用记录
- Claude 配置解析、Provider/模型识别和脱敏运行时诊断
- 每个任务创建独立 Git worktree,原仓库保持不变
codex exec --json --ephemeral --sandbox workspace-write真实执行- 规划、实现、审查、验证四阶段 Agent 流程
- 真实 diff、Git 状态、命令记录和测试证据
- OpenAI Responses API 接入与无 Key 演示模式
- 人工审批、驳回和重新排队
- Token 使用统计与实时事件流
- WebSocket 自动刷新运营控制台
- SQLite WAL 模式和原子任务领取,避免重复执行
- 任务租约、运行心跳和崩溃后的自动回收
- 验证结论闸门,未通过验证的任务不能进入审批区
- Codex 子进程环境变量白名单,默认不继承业务密钥
- 单任务重试上限和全局停止开关
需要 Python 3.9 或更高版本。
cd lily
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn app:app --reload --port 8010浏览器访问 http://127.0.0.1:8010。
不配置 API Key 也可以运行。Lily 会检测本机 Codex CLI 和 Claude Code;任务填写本地 Git 仓库路径时按所选运行时真实执行,没有路径时使用 Responses API 或确定性的演示流程。
Lily 默认查找 ChatGPT 桌面应用附带的 Codex CLI:
/Applications/ChatGPT.app/Contents/Resources/codex
先确认本机已经登录:
codex --version
codex login status创建任务时填写本地 Git 仓库绝对路径,例如:
/Users/you/projects/example-repository
Lily 的执行边界:
- 验证路径位于
LILY_ALLOWED_REPO_ROOT内并且是 Git 仓库。 - 从仓库当前
HEAD创建 detached worktree。 - 使用 Codex 保存的登录和
workspace-write沙盒执行任务。 - 只向 Codex 传递登录和命令执行所需的基础环境变量;额外变量必须通过
LILY_CODEX_ENV_ALLOWLIST显式授权。 - 收集 JSONL 事件、Token、命令、测试、Git 状态和 diff。
- 停在人工审批区,不把修改写回原仓库。
安装并登录 Claude Code 后,Lily 会自动检测 claude:
npm install -g @anthropic-ai/claude-code
claude也可以在 .env 中配置 LILY_CLAUDE_PATH。Lily 要求 Claude Code 2.1.191+,并强制启用其原生 OS 沙箱:macOS 使用 Seatbelt,Linux/WSL2 使用 bubblewrap。沙箱不可用时任务直接失败,不会降级到无沙箱执行;非沙箱命令逃逸、MCP、用户/项目设置、Web 工具和内置 Read 工具均被禁用。
Claude 只获得 Bash、Edit 和 Write。文件读取与测试通过受沙箱保护的 Bash 完成:用户主目录默认禁止读取,只重新开放当前任务 worktree;Bash 网络访问和 Unix socket 默认关闭,Token/Key/Secret 环境变量不会传给 Bash 子进程。系统运行库仍按 Claude 原生沙箱规则保持只读。详情参见 Claude Code 官方沙箱文档。
Lily 会从 LILY_CLAUDE_CONFIG_PATH、CLAUDE_CONFIG_DIR/settings.json 或 ~/.claude/settings.json 读取安全元数据,识别 Anthropic、Bedrock、Vertex 或自定义 Anthropic-compatible API。只展示 Provider、模型、API 主机名和配置来源;Token 与完整 API URL 不进入 API、数据库或前端。
也可以手动覆盖展示信息和执行模型:
LILY_CLAUDE_PROVIDER=智谱
LILY_CLAUDE_MODEL=glm-example默认的工具权限如下;通常不需要修改:
LILY_CLAUDE_ALLOWED_TOOLS=Edit,Write
LILY_CLAUDE_DISALLOWED_TOOLS=Read,Glob,Grep,WebFetch,WebSearch自动模式默认按 codex-cli,claude-code 选择,可通过 LILY_RUNTIME_PRIORITY 调整。明确指定的运行时不可用时,任务会失败并说明原因,不会静默切换。
编辑 .env:
OPENAI_API_KEY=你的_API_Key
OPENAI_MODEL=gpt-5.4-mini当 Codex CLI 被禁用或任务没有本地仓库路径时,可以使用 Responses API 生成只读维护方案。默认模型适合高频维护任务,也可以按账户权限替换。
Lily 通过 POST https://api.openai.com/v1/responses 调用 Responses API。API Key 仅从服务端环境变量读取,不会发送给浏览器或写入数据库。
queued
-> detached worktree
-> selected Runtime Adapter
-> codex exec / claude stream-json
-> plan / implementation / review / verification
-> collect diff / tests / JSONL
-> READY_FOR_HUMAN_REVIEW -> awaiting_approval -> approved | rejected
-> NEEDS_REVISION -> needs_revision -> retry
可恢复的模型或进程错误会自动回到队列;仓库路径、运行时选择等确定性配置错误会直接失败。达到 LILY_MAX_ATTEMPTS 后任务转为 failed,必须由人类决定是否重试。运行中的任务按 LILY_HEARTBEAT_INTERVAL 刷新租约;租约丢失会立即取消运行时并终止整棵子进程树。失败、驳回和重试会回收对应的临时 worktree。
python -m pytest -q测试覆盖 Responses API 文本解析、Codex 与 Claude JSONL、运行时选择、环境变量隔离、四阶段演示执行、数据库迁移、租约恢复、真实命令证据闸门、进程取消、任务生命周期和暂停状态持久化。
| 方法 | 路径 | 用途 |
|---|---|---|
GET |
/api/health |
执行器与循环状态 |
GET |
/api/dashboard |
指标汇总 |
GET |
/api/runtimes |
运行时安装与配置诊断 |
GET |
/api/tasks |
任务列表 |
POST |
/api/tasks |
创建任务 |
POST |
/api/tasks/{id}/approve |
人工批准 |
POST |
/api/tasks/{id}/reject |
人工驳回 |
POST |
/api/tasks/{id}/retry |
重新排队 |
POST |
/api/control/pause |
暂停或恢复循环 |
GET |
/api/events |
运行事件 |
WS |
/ws |
实时刷新通知 |
- Lily 主进程不直接执行模型返回的命令;命令由所选 Coding Agent 在隔离 worktree 中执行
- Codex 命令运行在
workspace-write沙盒中,网络默认关闭 - Claude Bash 命令运行在原生 OS 沙箱中;沙箱不可用或版本过旧时拒绝执行
- Claude 不加载用户/项目设置或 MCP,运行策略按任务生成并在进程退出后删除
- 只写入 detached worktree,不写入原仓库工作区
- 默认不创建或合并 Pull Request
- 默认不接触生产密钥和部署环境
- 每个 Runtime Adapter 使用独立环境变量白名单
- API Key 不进入前端、SQLite 或日志
- 只有通过验证闸门的结果可以进入人工审批
下一阶段应增加 patch 导出、项目级可配置验证命令、用户主动取消和 GitHub App。即使增加这些能力,自动合并与生产部署也应保持关闭。