面向 Python 的本地代码审判与安全精简工具。当前支持:
- 粘贴 Python 代码,执行 AST 分析、多 Agent 对抗和人格化审查;
- 粘贴 Python 代码并提供 pytest,执行完整的本地验证精简;
- 只读克隆 allowlist 中的 GitHub 仓库,在本地完成分析与验证。
项目不接收 GitHub Webhook,不创建分支、commit、push、Pull Request 或 Issue 评论。
统一分析流程为:
Input Adapter
-> AST Analyst
-> Minimizer
-> Defender
-> Adversary
-> Judge
-> Persona Reporter
- LLM 生成的候选文件始终按不可信输入处理。
- AST Guard 限制允许修改的区域,并拒绝危险调用、新增高风险 import、公开 API 破坏和越界修改。
- API/Worker 使用无网络、非 root、只读根文件系统和资源受限的 Docker sandbox。
- 用户测试、系统生成测试、对抗测试、变异测试和 Judge 共同形成可追溯证据。
- 报告明确标记
STATIC、GENERATED_TESTS、USER_TESTS或REPOSITORY_TESTS证据等级。 - 人格只影响报告措辞,不参与技术裁决和安全判断。
需要 Docker Desktop 和 Windows PowerShell:
.\scripts\start.ps1 -Build默认地址:
- Dashboard:
http://127.0.0.1:8501 - API:
http://127.0.0.1:8000
默认是仅绑定 localhost 的本地单用户模式,不设置管理员令牌,Dashboard 可直接提交和管理本地任务。这个默认值不代表网络部署安全;不要把端口转发到不可信网络。
默认配置为真实 DeepSeek LLM。缺少 DEEPSEEK_API_KEY 时 API 和 Dashboard 仍会启动,但 /capabilities 会报告 LLM 不可用,并禁用依赖 LLM 的任务入口;系统不会静默切换到 mock。仅在明确的离线演示或测试场景设置 REFACTOR_AGENT_MOCK_LLM=true。停止服务但保留本地数据:
.\scripts\start.ps1 -DownSQLite 默认使用统一的 5000ms busy_timeout 和 auto journal 策略;可通过 REFACTOR_AGENT_SQLITE_JOURNAL_MODE=auto|wal|delete 与 REFACTOR_AGENT_SQLITE_BUSY_TIMEOUT_MS 调整。WAL 只会在安全 SQLite 版本和本地文件系统上启用,备份与回退步骤见 docker/README.md。
端口、基础镜像和 Python 包索引可以覆盖:
.\scripts\start.ps1 -Build `
-ApiPort 18000 `
-DashboardPort 18501 `
-PythonBaseImage "your-registry.example.com/library/python:3.12-slim" `
-PipIndexUrl "https://pypi.org/simple"需要额外安装桌面依赖,并在启动服务时追加 -Desktop:
python -m pip install -e ".[desktop]"
.\scripts\start.ps1 -Build -Desktop桌面端通过现有分析事件流接收任务状态,按冷却、免打扰和终态优先级规则显示弹窗。默认数据目录为 .runs,其中包含 nailong-agent.lock、nailong_privacy.sqlite 和 nailong_notifications.sqlite;可通过 NAILONG_DATA_DIR 或启动脚本的 -NailongDataDir 修改。NAILONG_ANALYSIS_URL 和 NAILONG_DEEPSEEK_MODEL 可提供桌面端默认连接配置。桌宠数据库不会保存 API Key、源代码、原始窗口内容、截图、OCR、剪贴板或终端正文。完整的事件映射、接口和验证方式见 docs/designs/2026-07-24-nailong-proactive-notifications-update.md。
活动监听默认由 NAILONG_ACTIVITY_LISTENER_ENABLED=true 创建;可设置为 false,或在本次启动使用 --no-activity-listener 关闭。该开关只控制是否创建监听器,已持久化的 activity_listener_enabled、手动暂停和应用白名单/黑名单仍在每次事件处理时生效。
首次启动必须由用户明确授权活动采集。Windows 实现响应前台窗口变化,并每 15 秒采样系统空闲秒数:连续空闲达到 5 分钟时只发布一次 idle 事件,恢复活动后才允许下一次发布;同时读取进程可执行文件名和窗口是否覆盖当前显示器。为完成本地敏感/会议拦截和有限的 IDE 状态识别,窗口标题可能只在采集线程内短暂读取;原始标题会在隐私边界后丢弃,不会进入统一事件、EventBus、SQLite、日志或远程推理。编辑器/终端正文、代码、剪贴板、截图和 OCR 默认不会采集。会议应用和敏感应用会在入库前被隐私策略阻止。非 Windows 平台使用空实现,不采集任何活动。
只允许通过隐私策略后的统一最小化事件写入 nailong_privacy.sqlite,其中只包含归一化应用类别、活动类型、置信度和固定格式摘要。空闲、全屏、会议等原始采集信号只在本地隐私边界内用于分类和拦截,不会写入统一事件。可在桌宠隐私控制中使用“删除本地活动记录”清除活动事件和聚合记录,首次授权选择不会被删除。
本地单用户启动不需要管理员令牌。需要额外保护提交、取消、重试和 allowlist 管理操作时,可在启动前显式设置:
$env:REFACTOR_AGENT_ADMIN_TOKEN="<strong-random-secret>"
.\scripts\start.ps1此时 /capabilities 返回 admin_token_required=true,Dashboard 才显示管理员令牌输入框;未携带正确 Bearer Token 的控制请求会返回 401。令牌不会写入 SQLite 或运行产物。
使用真实模型:
$env:DEEPSEEK_API_KEY="<set-in-environment>"
$env:REFACTOR_AGENT_MOCK_LLM="false"
.\scripts\start.ps1离线演示(不会调用 DeepSeek):
$env:REFACTOR_AGENT_MOCK_LLM="true"
.\scripts\start.ps1可选变量为 DEEPSEEK_BASE_URL 和 DEEPSEEK_MODEL。API Key 不会写入 SQLite、日志或运行产物。
安装开发依赖:
python -m pip install -e .[dev]审查文件或 stdin,REVIEW 不执行用户代码:
refactor-agent snippet --source snippet.py --mode review --persona tsundere
Get-Content snippet.py | refactor-agent snippet --source - --mode review提供 pytest 后执行验证精简:
refactor-agent snippet `
--source snippet.py `
--tests test_snippet.py `
--mode verified-refactor `
--sandbox-backend docker只读 GitHub URL:
refactor-agent github-url `
--repo-url https://github.com/owner/repository `
--issue-text "简化 calculate 函数" `
--target src/package/module.py `
--tests tests主要接口:
/health、/capabilities/analysis、/jobs/snippet、/jobs/url/jobs、任务详情、事件、取消和重试/runs、trajectory、运行产物和/benchmarks/admin/repository-allowlist
仓库 URL 仍必须通过 canonical URL 校验和持久化 allowlist。源码和测试会保存在本地任务数据中,不要提交密钥。
pytest -q
python -m compileall -q src tests
docker compose config --quiet
git diff --checkDocker 细节见 docker/README.md,当前产品设计见 docs/designs/2026-07-19-code-judge-product-redesign.md。
本项目采用 GNU Affero General Public License v3.0 或更高版本。
如果你向他人分发本项目或运行修改后的网络服务,必须遵守 AGPL-3.0-or-later,
包括向交互用户提供对应源代码的义务。完整条款见 LICENSE。