npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@spaceflow/review

v5.2.19

Published

Spaceflow 代码审查插件,使用 LLM 对 PR 代码进行自动审查

Downloads

1,936

Readme

@spaceflow/review

npm version License: MIT

Spaceflow AI 代码审查扩展,使用 LLM 对 PR 代码进行自动审查。支持 OpenAI、Gemini、Open Code 等多种 LLM 模式。

安装

pnpm spaceflow install @spaceflow/review

功能特性

  • 多 LLM 支持 — OpenAI、Gemini、Open Code 可选
  • 行级评论 — 在 PR 中精确定位问题代码行
  • 增量审查 — 多次运行时自动去重,追踪问题修复状态
  • 删除代码分析 — 评估删除代码可能带来的风险
  • AI 生成 PR 描述 — 自动总结 PR 功能变更
  • 审查规范 — 支持自定义 Markdown 格式的审查规则
  • 远程规范引用 — 支持从远程仓库 URL 拉取审查规范
  • 系统规则 — 不依赖 LLM 的静态检查(如单文件行数上限)
  • 本地审查 — 审查未提交或暂存区的代码,无需 PR
  • MCP 工具 — 提供 list_rulesget_rules_for_file 等工具供 AI 编辑器使用
  • 问题阻断 — 存在未解决问题时以非零退出码退出,适用于 CI 门禁

使用

# 审查 PR
spaceflow review -p 123 -l openai

# 审查两个分支之间的差异
spaceflow review -b main --head feature/xxx -l openai

# 仅审查指定文件
spaceflow review -f src/app.ts -l openai

# 详细输出(含提示词)
spaceflow review -p 123 -l openai -vv

# 仅分析删除代码
spaceflow review -p 123 --deletion-only -l openai

# 本地审查(未提交的代码)
spaceflow review --local -l openai

# 仅审查暂存区代码
spaceflow review --local staged -l openai

# 仅刷新状态(同步 reactions、resolved 等)
spaceflow review --flush

# 存在 error 级别未解决问题时非零退出
spaceflow review -p 123 --fail-on-issues -l openai

命令行参数

| 参数 | 简写 | 说明 | | --------------------------------- | ---- | ------------------------------------------------------------ | | --pr-number <number> | -p | PR 编号 | | --base <ref> | -b | 基准分支/tag | | --head <ref> | | 目标分支/tag | | --llm-mode <mode> | -l | LLM 模式(openai / gemini / open-code) | | --files <files...> | -f | 仅审查指定文件 | | --commits <commits...> | | 仅审查指定 commits | | --includes <patterns...> | -i | 文件 glob 过滤模式 | | --verbose [level] | -v | 详细输出(1: 过程日志,2: 含提示词) | | --dry-run | -d | 仅打印将要执行的操作 | | --ci | -c | 在 CI 环境中运行 | | --verify-fixes | | 验证历史问题是否已修复 | | --no-verify-fixes | | 禁用历史问题验证 | | --analyze-deletions | | 分析删除代码影响 | | --deletion-only | | 仅执行删除代码分析 | | --deletion-analysis-mode <mode> | | 删除分析 LLM 模式(openai / open-code) | | --generate-description | | 使用 AI 生成 PR 功能描述 | | --output-format <format> | -o | 输出格式(markdown / terminal / json) | | --local [mode] | | 本地审查模式(uncommitted / staged,默认 uncommitted) | | --no-local | | 禁用本地模式 | | --show-all | | 显示所有问题,不过滤非变更行的问题 | | --flush | | 仅刷新状态(同步 reactions、resolved 等),不执行 LLM 审查 | | --event-action <action> | | PR 事件类型(opened / synchronize / closed 等) | | --fail-on-issues [mode] | | 未解决问题时非零退出(off / warn / error / warn+error,默认 error) |

配置

spaceflow.json 中配置 review 字段:

{
  "review": {
    "includes": ["*/**/*.ts", "!*/**/*.spec.*", "!*/**/*.config.*"],
    "references": ["./references"],
    "llmMode": "openai",
    "generateDescription": true,
    "autoUpdatePrTitle": false,
    "lineComments": true,
    "verifyFixes": true,
    "verifyFixesConcurrency": 10,
    "analyzeDeletions": false,
    "deletionAnalysisMode": "openai",
    "whenModifiedCode": ["function", "class"],
    "rules": {
      "no-console": "warn",
      "no-any": "error"
    },
    "concurrency": 5,
    "retries": 3,
    "retryDelay": 1000,
    "invalidateChangedFiles": "invalidate",
    "duplicateWorkflowResolved": "delete",
    "autoApprove": false,
    "failOnIssues": "off",
    "systemRules": {
      "maxLinesPerFile": [500, "warn"]
    }
  }
}

配置项说明

| 字段 | 类型 | 默认值 | 说明 | | ---------------------------- | ---------------------------------------- | -------------- | ---------------------------------------------------------------------- | | includes | string[] | — | 文件 glob 过滤模式 | | references | string[] | — | 审查规范来源(本地路径或远程仓库 URL) | | llmMode | string | "openai" | 默认 LLM 模式 | | generateDescription | boolean | false | AI 生成 PR 功能描述 | | autoUpdatePrTitle | boolean | false | 自动更新 PR 标题 | | lineComments | boolean | false | 在 PR 中发布行级评论 | | verifyFixes | boolean | false | 验证历史问题是否已修复 | | verifyFixesConcurrency | number | 10 | 验证并发数 | | analyzeDeletions | boolean \| "ci" \| "pr" \| "terminal" | false | 删除代码分析(true: 始终启用,"ci": 仅 CI,"pr": 仅 PR,"terminal": 仅终端) | | deletionAnalysisMode | string | "openai" | 删除分析 LLM 模式 | | whenModifiedCode | string[] | — | 代码结构过滤("function" / "class" / "interface" / "type" / "method") | | rules | Record<string, "off" \| "warn" \| "error"> | — | 逐规则严重级别覆盖 | | concurrency | number | 5 | LLM 并发审查数 | | retries | number | 0 | 失败重试次数 | | retryDelay | number | 1000 | 重试间隔(ms) | | invalidateChangedFiles | "invalidate" \| "keep" \| "off" | "invalidate" | 变更文件历史问题处理策略 | | duplicateWorkflowResolved | "off" \| "skip" \| "delete" | "delete" | 重复 workflow 处理策略 | | autoApprove | boolean | false | 所有问题解决后自动提交 APPROVE review | | failOnIssues | "off" \| "warn" \| "error" \| "warn+error" | "off" | 问题阻断模式 | | systemRules | object | — | 系统规则(不依赖 LLM 的静态检查) | | systemRules.maxLinesPerFile| [number, "off" \| "warn" \| "error"] | — | 单文件最大审查行数,超过时跳过 LLM 并生成系统问题 |

MCP 工具

本扩展提供以下 MCP 工具,可在 AI 编辑器(如 Cursor、Windsurf)中使用:

| 工具名 | 说明 | 参数 | | ---------------------- | ------------------------------------------ | ----------------------------------------------- | | list_rules | 列出所有审查规则 | — | | get_rules_for_file | 获取指定文件适用的审查规则 | filePath, includeExamples? | | get_rule_detail | 获取单条规则的详细信息 | ruleId | | get_rules_from_dir | 从指定目录加载审查规则 | dirPath, includeExamples? |

规则搜索目录包括:review.references 配置路径、.cursor/skillsreview-specs

审查规范格式

审查规范使用 Markdown 文件定义,文件名格式为 <extensions>.<type>.md,放置在 references/ 目录或远程仓库中。

文件名约定

<extensions>.<type>.md
  • extensions — 适用的文件扩展名,多个用 & 连接(如 js&tsvue
  • type — 规范类别(如 basefile-namenest

示例:js&ts.base.md → 适用于 .js.ts 文件的基础规范

规则定义格式

每条规则使用 ##### 标题,后跟规则 ID(用反引号方括号包裹):

## 规则标题 `[RuleId]`

规则描述文本...

> - severity `warn`
> - override `[OverriddenRuleId]`
> - includes `*.service.ts` `*.controller.ts`

### Example: 示例标题

#### Good: 正确示例

```typescript
const MAX_COUNT = 100;

Bad: 错误示例

const maxCount = 100;

### 规则配置项

在规则描述中使用引用块(`>`)声明配置:

| 配置项       | 格式                          | 说明                                                         |
| ------------ | ----------------------------- | ------------------------------------------------------------ |
| `severity`   | `> - severity \`warn\``       | 严重级别(`off` / `warn` / `error`),默认 `error`          |
| `override`   | `> - override \`[RuleId]\``   | 覆盖指定规则(前缀匹配),被覆盖的规则问题会被过滤         |
| `includes`   | `> - includes \`*.ts\` \`*.js\`` | 文件匹配模式,仅对匹配的文件生效,支持 `status|glob` 前缀 |

### Override 机制

Override 允许高优先级规则覆盖低优先级规则,避免重复报告:

- 使用前缀匹配:`override [JsTs.FileName]` 会覆盖 `JsTs.FileName` 及其子规则(如 `JsTs.FileName.UpperCamel`)
- 作用域感知:只有当 issue 文件匹配 override 所在 spec 的 `includes` 时才生效
- 文件级 override 写在规范文件头部(第一个 `##` 规则之前),对所有规则生效

### 远程规范引用

`references` 支持以下格式:

```json
{
  "review": {
    "references": [
      "./references",                                    // 本地目录
      "https://github.com/org/repo/tree/main/specs",     // GitHub 仓库目录
      "https://gitea.example.com/org/repo/src/branch/main/specs"  // Gitea 仓库目录
    ]
  }
}

拉取优先级:Git Provider API → tea CLI → git clone 回退 → 本地缓存

审查流程

1. 解析上下文(PR/分支/本地模式) → ReviewContext
2. 加载审查规范(本地 + 远程) → ReviewSpec[]
3. 获取变更文件和代码内容
4. 系统规则检查(静态,不依赖 LLM)
5. LLM 并行审查(按文件分发,注入匹配的规范)
6. 问题过滤(去重、includes、override、非变更行)
7. 历史问题验证(可选,verifyFixes)
8. 删除代码分析(可选,analyzeDeletions)
9. AI 生成 PR 描述(可选,generateDescription)
10. 输出结果(PR 评论 / 终端 / JSON)

参数优先级

命令行 > PR 标题参数 > 配置文件 > 默认值

问题生命周期

每个审查问题(Issue)有以下状态流转:

发现 → 待处理 → 已修复 / 已解决 / 无效

| 状态 | 标记 | 说明 | | ---------- | ----------- | -------------------------------------- | | 待处理 | 🔴/🟡 | 新发现的问题,尚未处理 | | 已修复 | 🟢 | AI 验证代码已修改,问题不再存在 | | 已解决 | ⚪ | 用户手动点击 resolve | | 无效 | ❌ | AI 验证或用户标记为误报 |

严重级别对应的 Emoji:

| 级别 | Emoji | 说明 | | ------ | ----- | ------------ | | error | 🔴 | 必须修复 | | warn | 🟡 | 建议修复 | | off | ⚪ | 规则已关闭 |

增量审查

多次运行 review 时自动追踪问题状态:

  • 轮次(round) — 每次审查递增,记录问题在哪一轮发现
  • 去重 — 相同文件+行号+规则的问题不会重复报告
  • 行号追踪 — 代码变更导致行号移动时自动更新 originalLine
  • 变更文件处理invalidateChangedFiles 控制变更文件的历史问题是否标记为无效

Includes 模式语法

includes 配置支持 glob 模式和变更类型前缀:

基本语法

{
  "includes": ["**/*.ts", "!**/*.spec.ts", "!**/*.config.ts"]
}
  • ! 前缀表示排除模式
  • 使用 micromatch 匹配

变更类型前缀

<status>|<glob> 语法,仅匹配指定变更类型的文件:

| 前缀 | 说明 | 示例 | | ----------- | ------ | ------------------------- | | added\| | 新增文件 | added\|**/*.ts | | modified\| | 修改文件 | modified\|**/*.ts | | deleted\| | 删除文件 | deleted\|**/*.ts |

无前缀则不限变更类型。

注意:文件的 status 是相对 base 分支的全量 diff 结果。例如在当前分支首次引入的文件,无论后续多少次 commit 修改,其 status 始终为 added

whenModifiedCode 过滤

whenModifiedCode 配置可进一步缩小审查范围,只关注特定代码结构:

{
  "whenModifiedCode": ["function", "class"]
}

支持的类型:functionclassinterfacetypemethod

配置后,LLM 只会收到匹配代码块范围内的代码,其余代码被裁剪。

输出格式

markdown(默认 PR 模式)

发布为 PR Review Comment,包含:

  • 按文件分组的问题列表(含严重级别 Emoji)
  • 每个问题的规则 ID、发现时间、开发人员
  • 修复建议代码片段
  • 文件摘要和统计信息
  • 隐藏的 JSON 数据区(用于增量审查状态追踪)

terminal

终端彩色输出,适合本地审查:

  • 🟢 已修复 / 🔴 待处理 error / 🟡 待处理 warn / ⚪ 已解决
  • 按文件分组的摘要和问题详情

json

原始 ReviewResult JSON 结构化输出,适合程序化处理:

{
  "success": true,
  "title": "AI 生成的 PR 标题",
  "description": "PR 功能总结",
  "issues": [...],
  "summary": [...],
  "deletionImpact": {...},
  "round": 2,
  "headSha": "abc1234",
  "stats": {
    "total": 10,
    "validTotal": 8,
    "fixed": 3,
    "resolved": 2,
    "invalid": 2,
    "pending": 3,
    "fixRate": 37.5,
    "resolveRate": 25
  }
}

PR 标题参数

支持在 PR 标题末尾添加参数覆盖默认配置:

feat: 添加新功能 [/ai-review -l openai -v 2]

CI 工作流示例

name: AI Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pnpm spaceflow review --ci -l openai
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

CI 门禁示例

存在 error 级别未解决问题时阻止合并:

      - run: pnpm spaceflow review --ci -l openai --fail-on-issues
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

环境变量

Git Provider

| 变量 | 说明 | | ------------------- | ----------------------------- | | GITHUB_TOKEN | GitHub API Token | | GITHUB_REPOSITORY | 仓库名称(owner/repo 格式) | | GITEA_TOKEN | Gitea API Token | | GITEA_REPOSITORY | Gitea 仓库名称 | | GITLAB_TOKEN | GitLab API Token | | GITLAB_REPOSITORY | GitLab 仓库名称 |

OpenAI

| 变量 | 说明 | | ----------------- | --------------- | | OPENAI_BASE_URL | OpenAI API 地址 | | OPENAI_API_KEY | OpenAI API Key | | OPENAI_MODEL | OpenAI 模型名称 |

Gemini

| 变量 | 说明 | | ------------------ | -------------- | | GEMINI_API_KEY | Gemini API Key |

许可证

MIT