amsokol/ai-devsecops-cursor

GitHub: amsokol/ai-devsecops-cursor

基于 Cursor Agent SDK 的 DevSecOps Agent 运行器,通过 agent-gate 和 agent-maintain 实现自动化 PR 审查与主干分支维护。

Stars: 1 | Forks: 0

# ai-devsecops-cursor 基于 [Cursor Agent SDK](https://cursor.com) 构建的可扩展 **DevSecOps agent**: 能力 × 范围 × 行为,组合成各种场景。 | 入口点 | 场景 | 角色 | | ---------------- | --------------- | ---------------------------------------------------------------- | | `agent-gate` | `pr_gate` | PR → `main`:审查 / 阻止 / 批准(**不处理** Issues 或修复 PR) | | `agent-maintain` | `main_maintain` | 默认分支:处理 Issues、修复 PR、进行协调 | 设计文档:[`agent/DESIGN.md`](agent/DESIGN.md)。 ## 设置 ``` cd ai-devsecops-cursor uv sync # 请参阅下方的 Credentials。 export CURSOR_API_KEY="cursor_..." export AGENT_GATE_MODEL="composer-2.5" export AGENT_MAINTAIN_MODEL="composer-2.5" # export AGENT_GATE_GH_TOKEN="ghp_..." # classic `repo`,可选(解析 threads) # export GH_TOKEN="..." # 仅限本地 `gh`;CI 使用 github.token # export AGENT_SCM=github # 默认值;针对 GitLab 时使用 gitlab ``` 编辑 `targets.yaml`,使 `path` 指向本地检出目录(默认同级 `../app-tauri-react-shadcn-ui`)。该文件**仅限本地使用**。 源代码管理是可插拔的(`agent.scm`):使用 `--scm github|gitlab` 或 `AGENT_SCM`。 特定平台的 CLI/token 描述会被注入到 prompt 中;位于 `.cursor/agent/` 下的产品策略保持平台中立(`library/gate/change-review.md`)。 ## CI | 事件 | 任务 | 命令 | | ------------------------------------------------ | -------------------------- | ------------------------------------------------------- | | `pull_request` (打开/同步/重新打开) | **Agent gate (PR 审查)** | `agent-gate` ship | | 人工 PR 评论 (对话或审查线程) | **Agent gate (PR 审查)** | `agent-gate` ship (取消该 PR 正在进行的运行) | | `push` 到 `main` | **Agent maintain (主干)** | `agent-maintain` ship | 手动运行:Actions → **agent-gate** 或 **agent-maintain** (`dry-run` | `ship`)。 Gate 并发:每个 PR 一次运行 (`cancel-in-progress: true`)。Bot 评论不会 触发 gate(避免循环)。 ### 凭据 使用一个**共享的** Cursor API key。审查 / Issues / 修复 PR 通过 特定于作业的 `github.token` 以 **`github-actions[bot]`** 身份运行(与第一个 bot 版本相同)。可选的 **Tokens (classic)** PAT 仅用于 `github.token` 无法完成的操作—— 切勿将 Fine-grained PAT 用作 `GH_TOKEN`(这会以你的个人 用户身份发布)。 #### 身份 | 操作 | GitHub 上的显示身份 | | ------ | --------------------- | | Gate 审查、APPROVE、request-changes、评论 | `github-actions[bot]` (`GH_TOKEN=${{ github.token }}`) | | Maintain Issues、修复 PR、推送 | `github-actions[bot]` (`GH_TOKEN=${{ github.token }}`) | | Gate `resolveReviewThread` (GraphQL) | 设置时需要 classic PAT `AGENT_GATE_GH_TOKEN` | `GITHUB_TOKEN` 的权限在每个工作流中受到限制(`permissions:` 块)——这就是 gate 和 maintain 在不使用个人 PAT 的情况下保持最小权限的方式: | 工作流 | `permissions` | | -------- | ------------- | | agent-gate | `contents: read`, `pull-requests: write` | | agent-maintain | `contents: write`, `pull-requests: write`, `issues: write` | 同时启用 **Settings → Actions → General → Workflow permissions**: - ✅ 允许 GitHub Actions 创建和批准 pull request #### 分支规则集(合并权限) Gate 和 maintain 均以 `github-actions[bot]` 身份发布。GitHub **无法** APPROVE 由同一个 bot 创建的 PR(由 maintain 修复跟踪)。在 `main` 分支上配置规则集如下: | 规则 | 值 | | ---- | ----- | | 必须的状态检查 | Gate 作业名称,例如 `Agent gate (PR 审查)` (严格) | | 必须的批准审查 | **0** | | 要求对话已解决 | **开启**(可选但推荐) | 当 gate **检查变绿**(exit 0)时合并。**不要**要求 APPROVE 事件。详情:技能库 `scm/github.md`。 #### Secrets 和变量 | 名称 | 种类 | 是否必需 | 使用者 | 权限 / 备注 | | ---- | ---- | -------- | ------- | -------------- | | `CURSOR_API_KEY` | secret | 是 | gate + maintain | Cursor 用户 API key ([Dashboard → Integrations](https://cursor.com/dashboard)) | | `AGENT_GATE_MODEL` | variable | 是 | gate | 模型 ID,例如 `composer-2.5` | | `AGENT_MAINTAIN_MODEL` | variable | 是 | maintain | 模型 ID(可与 gate 不同) | | `AGENT_GATE_GH_TOKEN` | secret | 否* | 仅 gate | **Token (classic)**,范围 **`repo`**。仅用于 GraphQL `resolveReviewThread`。审查仍以 `github-actions[bot]` 身份发布。 | | `AGENT_RUNNER_REF` | variable | 否 | 仅产品 CI | 锁定此 runner:**release tag**(例如 `v0.3.0`)。产品不得浮动在 `main` 上。 | \*推荐:如果没有它,gate 可能无法解析审查线程。 **不要**将个人的 Fine-grained PAT 存储为 `GH_TOKEN`。删除任何 曾用作主要平台认证的 `AGENT_MAINTAIN_GH_TOKEN` —— maintain 仅使用 `github.token`。 ``` # 必填 gh secret set CURSOR_API_KEY # 用于 gate thread 解析的 optional classic PAT(scope: repo) gh secret set AGENT_GATE_GH_TOKEN # models gh variable set AGENT_GATE_MODEL --body "composer-2.5" gh variable set AGENT_MAINTAIN_MODEL --body "composer-2.5" # 如果已将其设置为 primary identity,请移除 personal PAT gh secret delete AGENT_MAINTAIN_GH_TOKEN 2>/dev/null || true # products:固定 runner release(而非 main) gh variable set AGENT_RUNNER_REF --body "v0.3.0" ``` 本地: ``` export CURSOR_API_KEY="cursor_..." export AGENT_GATE_MODEL="composer-2.5" export AGENT_MAINTAIN_MODEL="composer-2.5" # export AGENT_GATE_GH_TOKEN="ghp_..." # classic,可选 # export GH_TOKEN="..." # 用于本地 gh;CI 使用 github.token ``` ## 版本和发布 产品在 CI 中通过 `git clone --branch "$AGENT_RUNNER_REF"` 安装此 runner。 将 **`AGENT_RUNNER_REF` 锁定到 release tag**(例如 `v0.3.0`),而不是 `main`。 当主版本号为 **0** 时(在 [`pyproject.toml`](pyproject.toml) 中为 `0.x.y` 且 tag 为 `v0.x.y`): | 部分 | 时机 | | ------- | ---- | | **x** | **破坏**向后兼容性(CLI 标志、退出代码、场景 YAML 契约、必需的 env / 身份规则) | | **y** | **保持**向后兼容性 —— bug 修复**或**增量行为 | 当我们达到 **1.0.0** 时,切换到经典的 SemVer (MAJOR / MINOR / PATCH)。 **流程(针对每批更改手动执行):** 1. 将工作合并到 `main`(PR + CI 变绿)。在发布 PR 之前,将 [`CHANGELOG.md`](CHANGELOG.md) 保留在 `Unreleased` 下。 2. 创建 PR,将 `Unreleased` 移至 **新版本部分**(在 `Unreleased` 下方插入新版本),并在需要时更新 `pyproject.toml` 中的 `version`。 3. 合并后,打 tag 并发布 GitHub Release: ``` git tag -a v0.3.0 -m "v0.3.0" git push origin v0.3.0 gh release create v0.3.0 --title "v0.3.0" --notes-file <(sed -n '/## 0.3.0/,/^## /p' CHANGELOG.md | sed '$d') ``` **升级产品:** ``` # Repo variable(首选) gh variable set AGENT_RUNNER_REF --body "v0.3.0" # 当变量未设置时,Workflows 默认使用相同的 tag: # RUNNER_REF: ${{ vars.AGENT_RUNNER_REF || 'v0.3.0' }} ``` 当目录发生更改时,还需在产品中更新 skills 子模块的锁定版本 (独立的发布流:[ai-devsecops-skills](https://github.com/amsokol/ai-devsecops-skills))。 ## Gate (PR) ``` # Cursor Agent plan(无 GitHub mutate;被 block 时不 exit 5) export AGENT_GATE_MODEL=composer-2.5 uv run agent-gate --target app-tauri-react-shadcn-ui --pr 37 --dry-run # Ship(发布 review;AGENT_SIGNAL: block 时 exit 5) uv run agent-gate --target app-tauri-react-shadcn-ui --pr 37 ``` 退出代码:`5` = `AGENT_SIGNAL: block`,`3` = policy-violation,`4` = critical-unfixed。 ## Maintain (主干) ``` export AGENT_MAINTAIN_MODEL=composer-2.5 uv run agent-maintain --target app-tauri-react-shadcn-ui --dry-run uv run agent-maintain --target app-tauri-react-shadcn-ui ``` ## 技能库 共享目录:[ai-devsecops-skills](https://github.com/amsokol/ai-devsecops-skills) (位于 `.cursor/agent/library` 的 git submodule)。产品仓库在 `.cursor/agent/` 中保留一个轻量级的 **overlay** (`POLICY.md`,`verify.md`,`quarantine.md` 持续时间)。**无 symlinks。** **不要复制**整个目录。 库中的生态系统:`python-uv`,`npm`,`cargo`,`go-modules`,`bazel`, `bsr`(每个技术栈对应一个 topic 文件)。当目录发生更改时更新 submodule SHA。 Bootstrap:`.cursor/agent/library/products/starter/`。 ## 扩展 1. 在 [ai-devsecops-skills](https://github.com/amsokol/ai-devsecops-skills) 中添加或改进 skills。 2. 在产品中升级 submodule;在 overlay `POLICY.md` 中启用相应的生态系统。 3. 需要时在场景 YAML(`agent/scenarios/`)中列出新的能力。 未来示例:包含 `release` / `environment` 范围的 `deployment` 场景。 ## 产品策略(`.cursor/agent/` —— 运行时的事实来源) ``` .cursor/agent/ POLICY.md # overlay: enabled ecosystems, hotspots, library links verify.md # product commands quarantine.md # duration N (approach in library/policy/) library/ # git submodule → ai-devsecops-skills ``` Python runner 是轻量级的(CLI、凭据、场景 YAML、SDK、signal→exit)。 **所有流程和判断都存在于 library submodule + overlay 中。**
标签:Cursor SDK, DevSecOps, LNA, 上游代理, 代码审查, 自动化运维, 逆向工具