Community编程与开发github.com

rizqirizqi/astroidal

使用 Astroidal(AI 代码审查地图、评分器和助手)进行代码审查。适用于代码审查、拉取请求审查、Bug 排查、安全审查、架构审查、UX 流程审查,或直接运行 Astroidal。支持单个变更、提交、暂存/未暂存编辑以及批量拉取请求。

astroidal 是什么?

Astroidal 是一个 AI 驱动的代码审查技能,专为 AI 编码助手(如 Claude Code、Coder、Cursor、Codex 等)设计。它通过绘制变更的“爆炸半径”(即影响范围)并基于可验证的证据进行评分,帮助开发者发现代码中的真实 Bug。该技能支持多种场景:单个变更、提交、暂存/未暂存更改、拉取请求(PR)或批量 PR。其工作流程包括三个阶段:首先使用 `graph` 命令绘制变更地图,然后根据内置的审查目录(`references/review-lenses.md`)搜索各类 Bug(如逻辑错误、数据丢失、安全漏洞、UX 流程错误等),最后通过 `rank` 命令对发现进行排名,并生成 JSON 格式的发现列表。Astroidal 特别强调避免不必要的依赖安装、遵循严格的审查标准,并且不修改用户的构建文件。它支持 GitHub 和 GitLab 的基础设施,但限制过度调用 API。最终,它会输出一个简洁的文本摘要和两个关键文件:`.astroidal/review.md` 和 `.astroidal/constellation.html`,供人类开发者做最终决策。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/rizqirizqi/astroidal/tree/HEAD/.agents/skills/astroidal

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

astroidal 是做什么的?

Astroidal 是一份 AI 代码审查地图、评分器和助手。它绘制出变更的爆炸半径,并根据可证明的内容进行评分。映射变更,搜索真实 Bug,然后对发现进行排名。图表和表格保存在文件中。聊天回复是一段简短、可粘贴的摘要性文字。

Bug 目录位于本文件同级的 references/review-lenses.md 中。在判断发现之前请先阅读它。该目录不在 .astroidal/ 文件夹内。

不要将 Astroidal 添加为依赖项。不要编辑 package.json、lockfiles、pyproject.toml、go.mod 或 Cargo.toml 来安装它。

运行

按以下顺序解析命令:

  1. astroidal(如果已在 PATH 中)
  2. npx --yes astroidal

如果无法下载该包,且用户指向本地仓库,则运行 npx --yes <astroidal-包的路径> 或 node <路径>/dist/cli.js。

在每个仓库中安装一次该技能:

npx --yes astroidal init

使用 --global 参数可一次性为本机上的所有仓库安装:

npx --yes astroidal init --global

全局安装会在较新的 Astroidal 运行 graph 或 rank 时自动更新,前提是这些技能文件仍然是 Astroidal 所写入的。被编辑过的技能文件将保持不变,直到执行 init --force。再次运行 init 可刷新项目安装。

选择范围

首先运行一次 graph。阅读它打印出的范围说明。如果范围错误,请用下面的标志重新运行一次,此后不要再重新运行。

请求内容命令
当前编辑,包括未跟踪的文件npx --yes astroidal graph
当前分支或其拉取请求(当工作区不干净时)npx --yes astroidal graph --base <默认分支>
干净的特性分支npx --yes astroidal graph
拉取请求编号或 URLnpx --yes astroidal graph --pr 12,18,24
所有打开的拉取请求npx --yes astroidal graph --open
按作者、标签或基础分支筛选打开的拉取请求npx --yes astroidal graph --open --author 名称 --label 标签 --base 分支
当前拉取请求及其下方的栈npx --yes astroidal graph --stack
单个提交npx --yes astroidal graph --commit SHA
仅已暂存的变更npx --yes astroidal graph --staged
未暂存的变更和未跟踪的文件npx --yes astroidal graph --unstaged

批量操作是一张合并的地图。不要将它们作为独立的报告审查。

GitHub

仅在需要时调用 gh 获取审查所需的信息。地图已经完成了本地优先的读取,因此不要再次列出相同的文件、重新获取已存储的 diff,或轮询检查。发出少量针对性的调用是可以的,例如当标题、基础分支或正文缺失时使用 gh pr view。不要滥用 gh,不要评论拉取请求、批准它或请求审查者。

GitLab

仅在需要时调用 glab 获取审查所需的信息。地图已经完成了本地优先的读取,因此不要再次列出相同的文件、重新获取已存储的 diff,或轮询流水线。发出少量针对性的调用是可以的,例如当标题、基础分支或正文缺失时使用 glab mr view。不要滥用 glab,不要评论合并请求、批准它或请求审查者。

搜索 Bug

依次读取以下文件:

  1. .astroidal/packets/bug-map.md
  2. .astroidal/packets/architecture.md
  3. .astroidal/packets/security.md
  4. .astroidal/packets/performance.md
  5. .astroidal/packets/ux.md
  6. .astroidal/packets/correctness.md
  7. references/review-lenses.md(与本技能同级)

应用目录中的门禁(gate)、规范检查(spec pass)和标准检查(standards pass)。然后应用与“新增行”中文件匹配的每种语言章节。跳过其他语言章节。

覆盖 Bug 地图中的每个变更路径。从 Added lines 章节开始。该章节就是变更内容,每个拉取请求一个代码块。当 diff 是通过远程获取时,符号摘录可能为空;在栈中它只包含顶部。空摘录表示缺少上下文,而非空变更。

不要找到第一个可能文件就停止。对于“新增行”中的每个非测试源文件代码块:

  • 读取整个代码块,包括当代码块提示更多内容在证据文件中时其下方的行。
  • 根据目录检查该代码块,而不仅仅是与文件名匹配的类别。以下五个类别是最低要求。
  • 当同一个文件列出多个拉取请求时,请审查每个代码块。映射的主体仅包含栈顶。
  • 当代码块不足以确认或排除 Bug 时,打开文件。
  • 对于每个变更的符号,检查地图中列出的一级调用者和被调用者,如果变更可能破坏它们。

特别关注以下情况:错误的分支、将 false 或空值视为缺失、差一错误或时区不匹配、失败后阻止重试的锁或状态、通过拼接构建的 URL 或查询、使用了错误身份的身份验证检查,以及一级调用者仍在使用旧方式的约定。高分值不是发现,也不能作为跳过代码块的借口。

搜索所有以下类别:

  • 逻辑和边界情况:错误的分支、差一错误、吞掉的错误、空指针崩溃
  • 数据丢失和状态:迁移、竞态、部分写入、过期缓存
  • 损坏的约定:API、类型、路由、导出行为、模式不匹配
  • 安全 Bug:权限漏洞、注入、密钥、不可信的信任边界
  • UX 流程错误:死胡同、缺失错误状态、空状态、加载状态、导航故障

寻找重要问题。包中的线索是提示而非发现。代码异味、长文件、缺失测试或依赖项升级只有在目录的前置检查通过时才能算作发现。忽略格式、命名、注释、表扬、问题和未指明具体故障的重构。

编写发现

写入 .astroidal/findings.json:

{
  "findings": [
    {
      "pr": 12,
      "severity": "high",
      "description": "一句话描述哪里出了问题。",
      "path": "src/auth.ts",
      "line": 12,
      "quote": "从文件中复制的确切行内容",
      "recommendation": "移除该 Bug 的具体变更。",
      "category": "security"
    }
  ]
}

severity 可以是 critical、high 或 medium,根据目录中的门禁判断。critical 指用户路径上的崩溃、数据丢失、权限绕过、注入或密钥泄露。high 指会导致实际错误结果、写入丢失、竞态或约定破坏的问题。medium 指现实边缘情况下会失败的问题。quote 是从新增行代码块、映射文件或其一级邻居中复制的准确一行。将 pr 设置为引入该行的拉取请求编号,如果是本地变更则省略。

说明哪里出了问题,指出符号名称,给出消除该 Bug 的变更。对于安全和架构问题,说明为什么那个变更有效。不要含糊其辞、重述引用的行或提交问题。只有在检查了所有非测试源文件的“新增行”之后,且无一包含重要 Bug 时,findings 数组才允许为空。

当变更文件因目录未显示的原因而属于同一组时,为组命名。图表会自行绘制目录,并以线表示导入。组适用于跨越这些的流程、特性或共享约定。

{
  "findings": [],
  "groups": [
    {
      "name": "Payment links",
      "paths": ["apps/admin/lib/whatsapp.ts", "apps/admin/lib/proxied-link.ts"]
    }
  ]
}

使用简短名称,并至少包含两个映射路径。当没有额外内容需要归组时,省略 groups。

然后运行:

npx --yes astroidal rank

如果 rank 因为引用或路径错误而丢弃某个发现,请修复该发现并再次运行 rank。不要发明一个替代 Bug 来保持计数。不要运行第三次 rank。

回复

在聊天中写一段简短的摘要。以一行可粘贴的文本开头:Astroidal {分数} · Passed 或 Astroidal {分数} · Fix first。然后指出最严重的问题以及两个输出路径:.astroidal/review.md 和 .astroidal/constellation.html。不要粘贴发现表格。不要重新创建图表。最终由人类决定是否合并。

相关技能