trynullsec/legion

GitHub: trynullsec/legion

一款开源 AI 操作系统,通过多智能体流水线和人类签名关卡实现软件项目的自动化规划、构建、审查与安全扫描。

Stars: 0 | Forks: 0

Nullsec Legion

✦ Nullsec Legion

CI License: MIT Inspired by Hermes Agent · Nous Research Docs X

Nullsec Legion 是一款用于软件项目的开源 AI 操作系统。你只需下达任务 —— agent 会自动进行规划、构建、审查和安全扫描 —— 并且没有你的加密签名,就不会发生任何不可逆的操作。

## 为什么选择 Legion Legion 将 agent 的工作视为专业团队处理变更的方式:作为一个包含计划、审查、安全扫描以及需由人类签名的关卡的工作单元。Agent 在受限环境中执行劳动;而你掌握着密钥。每一个决策——每一个计划、prompt、diff、发现结果和签名——都会被写入一个只能追加的账本中,因此“agent 做了什么,以及谁批准了它?”这个问题始终有一个确切的答案。 | 功能 | 具体含义 | | --- | --- | | **是任务,而非聊天** | 持久化、基于事件溯源的工作单元,具有类型化的状态机和微秒级精度的只能追加的账本。 | | **各司其职的 Legion** | 专门的规划、编码和审查 agent;编码 agent 在一个移除了 git remote 的隔离克隆环境中工作,因此它无法推送到你的仓库。 | | **在你查看前先进行扫描** | 在你进行评判之前,每个 diff 都会扫描机密信息 (gitleaks) 和不安全的模式 (semgrep);错误会阻断流程,发现结果会随工作返回。 | | **人类关卡** | 合并操作需等待你的 passkey (WebAuthn),并在加密级别与 diff 和扫描报告的确切字节绑定。篡改其中任何一项,批准即告失效。 | | **操作系统强制的限制** | Agent 在内核级别的沙盒 (seatbelt/bwrap) 下运行:受限的文件系统,通过过滤了 SSRF 的代理进行出站访问,机密信息不可读。宁可拒绝启动,也绝不不受限地运行。 | | **只读的研究任务** | Agent 搜索实时网络并返回带有引用、经过扫描和签名的报告。 | | **与提供商无关** | 带来你自己的 OpenRouter key;支持任何模型,没有供应商锁定。 | | **完整的记录** | 每一个计划、prompt、commit、发现结果和签名,都永久保存在账本中。 | ## 快速安装 一条命令即可克隆、配置并启动 Legion。它会先检查你的环境,并准确地告诉你缺少什么——不会有任何静默运行: ``` npx @trynullsec/legion ``` 它会提示你输入 OpenRouter key(仅写入 `.env`,绝不记录日志),配置 worker 运行时和扫描器,启动 Postgres,运行数据库迁移,并打开任务看板。使用 `--dir ` 选择安装位置,或使用 `--no-start` 仅进行设置而不启动;请参阅 `npx @trynullsec/legion --help`。
手动安装 — 相同的步骤,手动执行 ``` git clone https://github.com/trynullsec/legion.git cd legion git submodule update --init # vendored agent runtime (Hermes Agent) pnpm install bash scripts/setup-workers.sh # worker runtime (uv-managed Python venv + agent) bash scripts/setup-scanners.sh # gitleaks + semgrep cp .env.example .env # add your OPENROUTER_API_KEY docker compose up -d # Postgres (pgvector) on :5434 pnpm migrate pnpm dev # board + API at http://localhost:4242 ``` 如果端口 `5434` 已被占用(例如第二个 Legion 实例),请在另一个端口上发布 Postgres 并保持 `DATABASE_URL` 同步 —— 执行 `LEGION_PG_PORT=5500 docker compose up -d`,然后在 `.env` 中设置 `...@localhost:5500/...`。`npx` 安装程序会自动为你完成此操作。 在 Linux 上,还需要安装 bubblewrap (`sudo apt-get install -y bubblewrap`):Legion 会在操作系统级别限制每一个 worker,并拒绝不受限地运行。
然后打开 **http://localhost:4242**,注册一个 passkey,并创建你的第一个任务。 ## 快速开始 ``` pnpm dev # Build the board and start the daemon (board + API on :4242) pnpm migrate # Apply database migrations pnpm test # Full suite — fast tier + real-agent tier pnpm test:fast # Fast tier only (no live agents required) pnpm typecheck # Type-check every package docker compose up -d # Start Postgres docker compose down # Stop Postgres ``` 在 `.env` 中设置你的 key: ``` DATABASE_URL=postgres://legion:legion@localhost:5434/legion OPENROUTER_API_KEY=sk-or-... # any model, via OpenRouter LEGION_SEARCH_PROVIDER=tavily # for read-only research missions LEGION_SEARCH_API_KEY=tvly-... ``` ## 任务流程 任务会通过一个单一的、类型化的状态机进行流转。状态转移表永远不会改变;各个阶段会适应任务的类型。 ``` CREATED → PLANNING → AWAITING_PLAN_APPROVAL → BUILDING → REVIEW → SCANNING → AWAITING_MERGE_APPROVAL → MERGED ``` 1. **计划。** 规划 agent 会读取克隆的仓库(或者对于研究任务,仅读取目标)并提出结构化的计划。你可以批准或拒绝;拒绝时会将你的反馈原封不动地携带至下一步。 2. **构建。** 编码 agent 在隔离的工作区中执行已批准的计划——这是一个移除了 git remote 的克隆环境,因此 agent 无法将任何内容推送到上游。 3. **审查。** 审查 agent 会结合计划读取 diff 并做出裁决,这个过程包含一个有界的修订循环。 4. **扫描。** diff 将由 **gitleaks**(扫描机密信息)和 **semgrep**(扫描不安全模式)扫描,并生成 SARIF 工件。错误级别的发现会阻断流程;它们会随工作一起路由到下一次尝试中。 5. **关卡。** 合并操作将暂停,直到你签名。(详情见下文。) 6. **合并。** 只有在签名验证通过后,Legion 才会在你的仓库中执行真正的 `git merge --no-ff`。 ## 人类关卡 该关卡是始终如一的。每个任务、每个风险级别,最终都要经过 passkey 验证流程——没有任何绕过的方法。 当任务到达 `AWAITING_MERGE_APPROVAL` 状态时,Legion 会派生出一个与工作本身绑定的 WebAuthn 验证请求: ``` challenge = base64url( sha256( missionId | diffSha256 | sarifSha256 | serverNonce ) ) ``` 工件的哈希值在发出验证请求以及再次验证你的断言时,都会**从磁盘重新计算**。如果在此期间 diff 或扫描报告的任何一个字节发生了改变,哈希值将不再匹配,批准将因 `INTEGRITY` 错误而失效——没有任何内容会被合并。你的签名批准的是*那些确切的字节*,而不是抽象意义上的“任务”。 风险级别会调整关卡*之前*的检查点,但永远不会改变关卡本身: - **low** — schema 验证通过的计划会自动批准(在账本中记录为策略决策,绝非静默处理);构建过程将一路直达关卡,无需人工干预。 - **medium** — 默认级别;计划批准需人工进行。 - **high** — 扫描阈值收紧,使得警告(而不仅仅是错误)也会阻断流程。 对于上述三种情况,合并关卡是完全相同的。 ## 限制机制 Agent 不受信任;它们是被隔离的。每个 worker 在启动时都会被包装在一个操作系统级别的沙盒中,该沙盒的范围根据其角色设定,并且在它执行任何工作之前,其解析后的策略会被写入账本(`CAPABILITY_PROFILE`)。如果平台无法强制执行该策略,worker 将**拒绝启动**——它绝不会在不受限的情况下静默运行。 - **文件系统** — 基于角色的写入白名单(例如,编码 agent 只能写入其工作区);其他所有写入都被拒绝,且机密路径不可读。 - **网络** — 对于构建角色为 `none`;研究 worker 仅能通过 Legion 控制的出站代理访问网络,该代理会记录每个请求,并在遇到环回地址、RFC1918 和云元数据地址时**默认拒绝**(防御 SSRF)。 - **进程** — 默认情况下拒绝派生子进程。 | 平台 | 机制 | 状态 | | --- | --- | --- | | macOS | `sandbox-exec` (seatbelt) | 已强制执行 | | Linux | `bubblewrap` (bwrap) namespaces | 已实现;部署目标路径 | 限制机制只能*减少* worker 可以执行的操作。它不能授予新的能力——它是一道底线,而不是功能开关。 ## 任务类型 | 类型 | 交付物 | 流水线 | | --- | --- | --- | | **code** | 合并到你仓库的 git diff | plan → build → review → scan → gate → merge | | **task** | 文件工件(报告、分析、数据集) | plan → build → review → gitleaks scan → gate → deliver | | **research** *(只读)* | 带有引用的 markdown 报告 | execute (web search + fetch) → gitleaks scan → gate → deliver | 任务和研究的交付物会被封装为与 sha256 绑定的工件,并受到与代码相同的 passkey 流程管控——即使是只读输出,在正式生效前也需要经过签名。 ## 架构 一个基于 pnpm + Turborepo 的 monorepo。表现层、编排层和限制层是分离的,因此每一层都可以独立进行推理和测试。 | 包 | 职责 | | --- | --- | | `@legion/core` | 领域类型、任务状态机以及纯策略(风险、调度、能力解析)。 | | `@legion/db` | PostgreSQL 迁移和双时性、只能追加的事件存储。 | | `@legion/scanner` | gitleaks + semgrep,通过阈值逻辑合并为单一的 SARIF 工件。 | | `@legion/runtime` | worker 监督程序、操作系统级限制 (seatbelt/bwrap) 以及过滤了 SSRF 的出站代理。 | | `@legion/orchestrator` | 计划 / 构建 / 审查 / 扫描 / 交付流程,以及合并/交付机制。 | | `apps/daemon` | Hono HTTP API、WebAuthn 关卡和调度循环。 | | `apps/board` | React 任务看板。 | Agent 运行时本身是 **[Hermes Agent](https://github.com/NousResearch/hermes-agent)**,作为 git submodule 引入,并由 Legion 的监督程序驱动——从未被修改过。 ## 目前可用的功能 Legion 对其功能范围非常坦诚。只有当有已提交并通过的测试作为支撑时,某项声明才会被列在“目前可用”下。 **已交付并验证 (M0–M7):** - **代码任务** — 完整的 plan → build → review → scan → passkey gate → merge 流水线。 - **普通任务** — 作为经过扫描和签名的文件工件交付的、可追溯的非代码工作。 - **只读研究任务** — 实时网络搜索和抓取,以带引用的报告形式返回。 - **风险成比例的流水线** — 检查点随声明的风险而变化;合并关卡则始终如一。 - **操作系统强制的限制机制** — 基于角色的 seatbelt/bwrap 沙盒、出站代理、SSRF 防御、拒绝启动机制。 所有这些功能都经过了 **170 多项针对真实基础架构的测试**的检验——真实的 Postgres、真实的模型、真实的 git、真实的扫描器、真实的 WebAuthn。**没有使用任何 mock。** **下一步计划:** - **全能力执行** — 能够在沙盒化的容器中运行代码、驱动浏览器和编辑文件,以完成开放式任务(而不仅仅是描述它们)的 agent,且处于相同的关卡管控之下。 - **托管选项** — 无需本地设置的 Legion。 这些属于路线图,而非已兑现的承诺。如果某项功能目前尚未有通过的测试作为支撑,它就会被列在这里,而不是上面的列表中。 ## 从你的 AI 客户端使用它 (MCP) [`@trynullsec/legion-mcp`](mcp/) 是一个 [Model Context Protocol](https://modelcontextprotocol.io) 服务器,允许 Cursor、Claude Desktop 或任何 MCP 客户端通过你正在运行的守护进程创建、监控和审查任务。将你的客户端指向它: ``` { "mcpServers": { "legion": { "command": "npx", "args": ["-y", "@trynullsec/legion-mcp"], "env": { "LEGION_API_URL": "http://localhost:4242" } } } } ``` 合并关卡依然由人类掌控:MCP 客户端可以计划、构建和读取交付物,但**批准合并是在看板中进行的 passkey 验证流程**——没有任何工具可以直接对其进行签名。请参阅 [`mcp/README.md`](mcp/README.md)。 ## 文档 完整的文档位于 **[heylegion.io](https://heylegion.io)**。 | 主题 | 涵盖内容 | | --- | --- | | 快速入门 | 安装 → 迁移 → 第一个任务 | | 任务 (Missions) | 状态机、任务类型和账本 | | 关卡 (The gate) | WebAuthn 绑定、验证请求派生、完整性规则 | | 限制机制 | 能力配置、出站代理、平台矩阵 | | 配置 | 环境变量、提供商、模型 | ## 许可证 MIT — 详见 [LICENSE](LICENSE)。 由 Nullsec 构建。Agent 运行时源自 [Hermes Agent](https://github.com/NousResearch/hermes-agent) (Nous Research, MIT) —— 深表感谢。
标签:AI智能体, DevSecOps, 上游代理, 人工智能, 代码审查, 测试用例, 用户模式Hook绕过, 自动化攻击, 请求拦截, 软件开发, 逆向工具