Skip to content

Repository files navigation

Lily OpenMaintainer

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 或确定性的演示流程。

无 API Key 使用 Codex

Lily 默认查找 ChatGPT 桌面应用附带的 Codex CLI:

/Applications/ChatGPT.app/Contents/Resources/codex

先确认本机已经登录:

codex --version
codex login status

创建任务时填写本地 Git 仓库绝对路径,例如:

/Users/you/projects/example-repository

Lily 的执行边界:

  1. 验证路径位于 LILY_ALLOWED_REPO_ROOT 内并且是 Git 仓库。
  2. 从仓库当前 HEAD 创建 detached worktree。
  3. 使用 Codex 保存的登录和 workspace-write 沙盒执行任务。
  4. 只向 Codex 传递登录和命令执行所需的基础环境变量;额外变量必须通过 LILY_CODEX_ENV_ALLOWLIST 显式授权。
  5. 收集 JSONL 事件、Token、命令、测试、Git 状态和 diff。
  6. 停在人工审批区,不把修改写回原仓库。

使用 Claude Code

安装并登录 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 只获得 BashEditWrite。文件读取与测试通过受沙箱保护的 Bash 完成:用户主目录默认禁止读取,只重新开放当前任务 worktree;Bash 网络访问和 Unix socket 默认关闭,Token/Key/Secret 环境变量不会传给 Bash 子进程。系统运行库仍按 Claude 原生沙箱规则保持只读。详情参见 Claude Code 官方沙箱文档

Lily 会从 LILY_CLAUDE_CONFIG_PATHCLAUDE_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 调整。明确指定的运行时不可用时,任务会失败并说明原因,不会静默切换。

可选:启用 OpenAI API

编辑 .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、运行时选择、环境变量隔离、四阶段演示执行、数据库迁移、租约恢复、真实命令证据闸门、进程取消、任务生命周期和暂停状态持久化。

API

方法 路径 用途
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。即使增加这些能力,自动合并与生产部署也应保持关闭。

About

Human-in-the-loop AI maintainer powered by Codex CLI.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages