smart-commit-copilot-cli 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +37 -7
- package/docs/configuration.md +23 -2
- package/docs/contracts.md +10 -2
- package/docs/getting-started.md +18 -4
- package/docs/publish.md +1 -1
- package/docs/releases/0.1.6-draft.md +72 -0
- package/docs/verification.md +15 -0
- package/examples/config/smart-commit.json +3 -1
- package/out/cliApp.js +3 -1
- package/out/cliApp.js.map +1 -1
- package/out/commands/bridge.js +54 -23
- package/out/commands/bridge.js.map +1 -1
- package/out/commitMessage/index.js +28 -8
- package/out/commitMessage/index.js.map +1 -1
- package/out/commitMessage/prompt.js +2 -0
- package/out/commitMessage/prompt.js.map +1 -1
- package/out/commitMessage/protocol.js +122 -8
- package/out/commitMessage/protocol.js.map +1 -1
- package/out/config/cliArgs.js +12 -0
- package/out/config/cliArgs.js.map +1 -1
- package/out/config/constants.js +1 -0
- package/out/config/constants.js.map +1 -1
- package/out/config/env.js +9 -0
- package/out/config/env.js.map +1 -1
- package/out/config/file.js +10 -0
- package/out/config/file.js.map +1 -1
- package/out/config/legacySmartCommit.js +14 -0
- package/out/config/legacySmartCommit.js.map +1 -1
- package/out/config/schema.js +18 -1
- package/out/config/schema.js.map +1 -1
- package/out/contracts.js +15 -6
- package/out/contracts.js.map +1 -1
- package/out/llm/responseCorrection.js +32 -0
- package/out/llm/responseCorrection.js.map +1 -0
- package/out/passHistory/index.js +51 -22
- package/out/passHistory/index.js.map +1 -1
- package/out/passHistory/store.js +29 -1
- package/out/passHistory/store.js.map +1 -1
- package/out/passHistory/types.js +23 -1
- package/out/passHistory/types.js.map +1 -1
- package/out/promptContext.js +19 -3
- package/out/promptContext.js.map +1 -1
- package/out/renderOutput.js +2 -0
- package/out/renderOutput.js.map +1 -1
- package/out/reporting/prompt.js +13 -1
- package/out/reporting/prompt.js.map +1 -1
- package/out/reporting/timeWindow.js +7 -0
- package/out/reporting/timeWindow.js.map +1 -1
- package/out/reporting/types.js +1 -0
- package/out/reporting/types.js.map +1 -1
- package/out/review/diffClassifier.js +535 -0
- package/out/review/diffClassifier.js.map +1 -0
- package/out/review/index.js +27 -11
- package/out/review/index.js.map +1 -1
- package/out/review/mockProvider.js +157 -8
- package/out/review/mockProvider.js.map +1 -1
- package/out/review/openaiProvider.js +10 -4
- package/out/review/openaiProvider.js.map +1 -1
- package/out/review/parser.js +13 -0
- package/out/review/parser.js.map +1 -1
- package/out/review/prompt.js +76 -4
- package/out/review/prompt.js.map +1 -1
- package/out/skills/types.js +3 -0
- package/out/skills/types.js.map +1 -0
- package/package.json +2 -1
- package/src/code-review-skills/c-code-review/SKILL.md +165 -0
- package/src/code-review-skills/c-code-review/references/build-and-tooling.md +16 -0
- package/src/code-review-skills/c-code-review/references/concurrency-and-signals.md +16 -0
- package/src/code-review-skills/c-code-review/references/error-handling-and-cleanup.md +16 -0
- package/src/code-review-skills/c-code-review/references/macros-headers-and-build-boundaries.md +16 -0
- package/src/code-review-skills/c-code-review/references/performance-and-data-movement.md +16 -0
- package/src/code-review-skills/c-code-review/references/pointers-memory-and-resource-lifecycle.md +18 -0
- package/src/code-review-skills/c-code-review/references/scoring-guide.md +40 -0
- package/src/code-review-skills/c-code-review/references/undefined-behavior-and-safety.md +17 -0
- package/src/code-review-skills/code-review/SKILL.md +150 -0
- package/src/code-review-skills/code-review/references/code-quality-checklist.md +53 -0
- package/src/code-review-skills/code-review/references/removal-plan.md +45 -0
- package/src/code-review-skills/code-review/references/scoring-guide.md +38 -0
- package/src/code-review-skills/code-review/references/security-checklist.md +53 -0
- package/src/code-review-skills/code-review/references/solid-checklist.md +55 -0
- package/src/code-review-skills/cpp-code-review/SKILL.md +165 -0
- package/src/code-review-skills/cpp-code-review/references/build-and-tooling.md +12 -0
- package/src/code-review-skills/cpp-code-review/references/concurrency-and-atomics.md +14 -0
- package/src/code-review-skills/cpp-code-review/references/exceptions-and-error-model.md +16 -0
- package/src/code-review-skills/cpp-code-review/references/memory-raii-and-lifetimes.md +19 -0
- package/src/code-review-skills/cpp-code-review/references/performance-and-hot-paths.md +16 -0
- package/src/code-review-skills/cpp-code-review/references/scoring-guide.md +41 -0
- package/src/code-review-skills/cpp-code-review/references/templates-api-and-abi.md +13 -0
- package/src/code-review-skills/cpp-code-review/references/undefined-behavior-and-safety.md +18 -0
- package/src/code-review-skills/csharp-code-review/SKILL.md +159 -0
- package/src/code-review-skills/csharp-code-review/references/async-and-cancellation.md +16 -0
- package/src/code-review-skills/csharp-code-review/references/concurrency.md +15 -0
- package/src/code-review-skills/csharp-code-review/references/exceptions-and-api-contracts.md +16 -0
- package/src/code-review-skills/csharp-code-review/references/memory-resources-and-interop.md +16 -0
- package/src/code-review-skills/csharp-code-review/references/nullable-types-and-patterns.md +15 -0
- package/src/code-review-skills/csharp-code-review/references/scoring-guide.md +41 -0
- package/src/code-review-skills/csharp-code-review/references/web-data-and-security.md +15 -0
- package/src/code-review-skills/frontend-code-review/SKILL.md +143 -0
- package/src/code-review-skills/frontend-code-review/references/accessibility-and-semantic-ux.md +33 -0
- package/src/code-review-skills/frontend-code-review/references/interaction-and-state-lifecycle.md +39 -0
- package/src/code-review-skills/frontend-code-review/references/rendering-performance-and-resource-loading.md +34 -0
- package/src/code-review-skills/frontend-code-review/references/scoring-guide.md +38 -0
- package/src/code-review-skills/frontend-code-review/references/security-and-data-boundary.md +34 -0
- package/src/code-review-skills/golang-code-review/SKILL.md +153 -0
- package/src/code-review-skills/golang-code-review/references/api-contract-and-maintainability.md +25 -0
- package/src/code-review-skills/golang-code-review/references/concurrency-and-lifecycle.md +25 -0
- package/src/code-review-skills/golang-code-review/references/error-handling-and-reliability.md +24 -0
- package/src/code-review-skills/golang-code-review/references/performance-and-allocation.md +25 -0
- package/src/code-review-skills/golang-code-review/references/scoring-guide.md +40 -0
- package/src/code-review-skills/golang-code-review/references/security-and-trust-boundary.md +20 -0
- package/src/code-review-skills/java-code-review/SKILL.md +153 -0
- package/src/code-review-skills/java-code-review/references/api-contract-and-maintainability.md +22 -0
- package/src/code-review-skills/java-code-review/references/concurrency-and-lifecycle.md +27 -0
- package/src/code-review-skills/java-code-review/references/error-handling-and-reliability.md +25 -0
- package/src/code-review-skills/java-code-review/references/performance-and-resource-usage.md +23 -0
- package/src/code-review-skills/java-code-review/references/scoring-guide.md +40 -0
- package/src/code-review-skills/java-code-review/references/security-and-trust-boundary.md +20 -0
- package/src/code-review-skills/mobile-code-review/SKILL.md +171 -0
- package/src/code-review-skills/mobile-code-review/references/async-state-and-side-effects.md +19 -0
- package/src/code-review-skills/mobile-code-review/references/lifecycle-and-navigation.md +19 -0
- package/src/code-review-skills/mobile-code-review/references/performance-and-resource-management.md +19 -0
- package/src/code-review-skills/mobile-code-review/references/resilience-and-device-conditions.md +19 -0
- package/src/code-review-skills/mobile-code-review/references/scoring-guide.md +38 -0
- package/src/code-review-skills/mobile-code-review/references/storage-permissions-and-security.md +19 -0
- package/src/code-review-skills/mobile-code-review/references/testing-and-regression-coverage.md +21 -0
- package/src/code-review-skills/php-code-review/SKILL.md +159 -0
- package/src/code-review-skills/php-code-review/references/inclusion-superglobals-and-scope.md +21 -0
- package/src/code-review-skills/php-code-review/references/language-types-and-autoload.md +19 -0
- package/src/code-review-skills/php-code-review/references/oop-magic-and-errors.md +17 -0
- package/src/code-review-skills/php-code-review/references/performance-data-access-and-testing.md +16 -0
- package/src/code-review-skills/php-code-review/references/request-lifecycle-and-runtime.md +15 -0
- package/src/code-review-skills/php-code-review/references/scoring-guide.md +39 -0
- package/src/code-review-skills/php-code-review/references/security-and-io-boundary.md +24 -0
- package/src/code-review-skills/python-code-review/SKILL.md +147 -0
- package/src/code-review-skills/python-code-review/references/exception-and-lifecycle.md +15 -0
- package/src/code-review-skills/python-code-review/references/input-and-data-security.md +20 -0
- package/src/code-review-skills/python-code-review/references/maintainability-and-testing.md +21 -0
- package/src/code-review-skills/python-code-review/references/performance-and-resource-usage.md +21 -0
- package/src/code-review-skills/python-code-review/references/scoring-guide.md +38 -0
- package/src/code-review-skills/rust-code-review/SKILL.md +165 -0
- package/src/code-review-skills/rust-code-review/references/api-traits-and-evolution.md +16 -0
- package/src/code-review-skills/rust-code-review/references/cargo-features-and-test-coverage.md +16 -0
- package/src/code-review-skills/rust-code-review/references/concurrency-async-and-sync.md +17 -0
- package/src/code-review-skills/rust-code-review/references/error-handling-and-reliability.md +17 -0
- package/src/code-review-skills/rust-code-review/references/macros-ffi-and-embedded.md +19 -0
- package/src/code-review-skills/rust-code-review/references/ownership-borrowing-and-unsafe.md +20 -0
- package/src/code-review-skills/rust-code-review/references/performance-and-allocations.md +18 -0
- package/src/code-review-skills/rust-code-review/references/scoring-guide.md +41 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 构建与工具链检查清单
|
|
2
|
+
|
|
3
|
+
## 标准与编译选项
|
|
4
|
+
|
|
5
|
+
- `-std=c11`/`c17`、`C_STANDARD`、警告等级和优化选项是否与新增代码用法一致。
|
|
6
|
+
- 是否关闭关键警告或弱化 `-Wall`/`-Wextra`/`-Werror` 等质量门槛而没有说明。
|
|
7
|
+
|
|
8
|
+
## Sanitizer 与分析工具
|
|
9
|
+
|
|
10
|
+
- ASan、UBSan、静态分析或格式检查配置是否被明显禁用、降级或误配。
|
|
11
|
+
- 头文件搜索路径、宏定义和目标链接是否让新文件无法被正确编译或分析。
|
|
12
|
+
|
|
13
|
+
## 构建脚本边界
|
|
14
|
+
|
|
15
|
+
- Make/Meson/CMake 规则是否遗漏新源文件、公共头文件或平台分支。
|
|
16
|
+
- 仅在 diff 涉及构建或工具配置时启用本清单;不推断 CI 或未展示脚本行为。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 并发与信号检查清单
|
|
2
|
+
|
|
3
|
+
## 线程与共享状态
|
|
4
|
+
|
|
5
|
+
- `pthread` 共享状态是否在所有读写路径上保持一致的锁或原子保护。
|
|
6
|
+
- 锁顺序、条件变量配对和错误路径解锁是否完整,避免死锁或泄漏锁。
|
|
7
|
+
|
|
8
|
+
## 原子与可见性
|
|
9
|
+
|
|
10
|
+
- 原子读写是否和非原子访问混用到同一共享对象上。
|
|
11
|
+
- 自旋、标志位和停止信号是否存在可证的竞态或忙等退化。
|
|
12
|
+
|
|
13
|
+
## 信号处理
|
|
14
|
+
|
|
15
|
+
- 信号处理函数中是否调用了非 async-signal-safe 接口。
|
|
16
|
+
- 主流程与信号处理之间共享的标志位是否使用适当类型和同步方式。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 错误处理与清理路径检查清单
|
|
2
|
+
|
|
3
|
+
## 返回码与 `errno`
|
|
4
|
+
|
|
5
|
+
- 系统调用、库函数和内部 helper 的返回值是否被检查,并在失败时中止后续依赖操作。
|
|
6
|
+
- 读取 `errno` 前是否确认前一个调用确实失败,且没有被后续调用覆盖。
|
|
7
|
+
|
|
8
|
+
## 清理路径
|
|
9
|
+
|
|
10
|
+
- `goto cleanup`、`break`、`return` 等退出路径是否统一释放已申请资源。
|
|
11
|
+
- 部分初始化失败时,是否只清理已成功初始化的对象,避免重复释放或遗漏回滚。
|
|
12
|
+
|
|
13
|
+
## 错误传播
|
|
14
|
+
|
|
15
|
+
- 错误码是否保留足够信息供上层区分重试、用户错误和内部故障。
|
|
16
|
+
- 记录错误或包装错误时,是否丢失原始失败条件、长度信息或上下文。
|
package/src/code-review-skills/c-code-review/references/macros-headers-and-build-boundaries.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 宏、头文件与构建边界检查清单
|
|
2
|
+
|
|
3
|
+
## 宏与条件编译
|
|
4
|
+
|
|
5
|
+
- 函数式宏是否有副作用重复求值、缺少括号或与类型不匹配的问题。
|
|
6
|
+
- `#ifdef`/`#ifndef` 分支是否让不同平台下的行为、布局或导出接口出现不一致风险。
|
|
7
|
+
|
|
8
|
+
## 头文件契约
|
|
9
|
+
|
|
10
|
+
- 头文件是否暴露不必要的内部实现、可变全局状态或缺少 include guard / `#pragma once`。
|
|
11
|
+
- 声明与定义、`extern`、`static inline`、结构体前置声明是否与新增调用方式一致。
|
|
12
|
+
|
|
13
|
+
## 模块边界
|
|
14
|
+
|
|
15
|
+
- 新增公共头或导出符号时,是否破坏已有调用约定、初始化顺序或错误处理契约。
|
|
16
|
+
- 仅凭 diff 可见信息判断问题,不假设未展示模块的包含顺序和链接方式。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 性能与数据移动检查清单
|
|
2
|
+
|
|
3
|
+
## 热路径分配与拷贝
|
|
4
|
+
|
|
5
|
+
- 热路径上是否引入频繁 `malloc`/`free`、重复清零或可避免的缓冲区重分配。
|
|
6
|
+
- 结构体或大缓冲区是否被不必要复制,而不是复用、传指针或按长度窗口处理。
|
|
7
|
+
|
|
8
|
+
## 扫描与复杂度
|
|
9
|
+
|
|
10
|
+
- 是否把单次扫描改成重复 `strlen`、重复查找或嵌套遍历,导致明显复杂度退化。
|
|
11
|
+
- 字符串和二进制数据处理是否出现多余的 `memcpy`/`memmove` 链式搬运。
|
|
12
|
+
|
|
13
|
+
## 系统调用与 I/O
|
|
14
|
+
|
|
15
|
+
- 高频路径是否引入过细粒度的系统调用、刷新、日志或同步操作。
|
|
16
|
+
- 仅在 diff 可见的热路径和长度行为上报告问题,不臆测真实负载。
|
package/src/code-review-skills/c-code-review/references/pointers-memory-and-resource-lifecycle.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 指针、内存与资源生命周期检查清单
|
|
2
|
+
|
|
3
|
+
## 所有权与释放
|
|
4
|
+
|
|
5
|
+
- `malloc`/`calloc`/`realloc` 的返回值是否在可见路径上检查失败分支。
|
|
6
|
+
- 新增分配后是否在所有早返回、错误路径和成功路径上保持成对释放,避免泄漏或双重释放。
|
|
7
|
+
- `realloc` 是否直接覆盖原指针,导致失败时丢失原地址。
|
|
8
|
+
|
|
9
|
+
## 指针与边界
|
|
10
|
+
|
|
11
|
+
- 指针算术、数组下标和长度参数是否在 diff 中显示可能越界或差一错误。
|
|
12
|
+
- `memcpy`/`memmove`/`strncpy`/`snprintf` 的目标长度是否与实际缓冲区大小一致。
|
|
13
|
+
- 返回局部变量地址、悬空指针、释放后继续使用是否在 diff 中可证。
|
|
14
|
+
|
|
15
|
+
## 资源清理
|
|
16
|
+
|
|
17
|
+
- 文件描述符、`FILE *`、锁、映射区或库句柄是否在失败路径上遗漏释放。
|
|
18
|
+
- 初始化一半失败时,是否按已完成的步骤逆序清理。
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 评分指南
|
|
2
|
+
|
|
3
|
+
评分由**最严重的已确认问题**决定基准区间,再在区间内微调。
|
|
4
|
+
|
|
5
|
+
## 第一步:确定基准区间
|
|
6
|
+
|
|
7
|
+
| 最严重问题 | 分值区间 |
|
|
8
|
+
|-----------|---------|
|
|
9
|
+
| 无问题 | 9.0-10.0 |
|
|
10
|
+
| 仅 P2/P3 | 7.5-9.0 |
|
|
11
|
+
| P1 | 4.0-7.0 |
|
|
12
|
+
| P0(内存损坏、数据竞争、明显 UB) | 2.0-3.5 |
|
|
13
|
+
| P0(安全漏洞、命令执行、凭证泄露) | 1.0-2.5 |
|
|
14
|
+
|
|
15
|
+
## 第二步:在区间内调整
|
|
16
|
+
|
|
17
|
+
- **影响广度**:影响全局状态、热路径或所有调用方取下限;仅局部边界触发取上限,差距约 0.5-1.0 分
|
|
18
|
+
- **问题数量**:每多一个独立同级别问题,向下移约 0.3-0.5 分
|
|
19
|
+
- **可逆性**:可快速定位、低风险修复的问题可上浮 0.3-0.5 分
|
|
20
|
+
|
|
21
|
+
> 多个问题时取区间下限附近;单个问题且影响有限时取区间上限附近。
|
|
22
|
+
|
|
23
|
+
## C 语境硬上限
|
|
24
|
+
|
|
25
|
+
- 有任意 P0 -> 评分上限 3.5
|
|
26
|
+
- 可证的缓冲区越界、释放后使用、双重释放或格式化字符串漏洞 -> 评分上限 2.5
|
|
27
|
+
- 可证的数据竞争或未同步共享状态访问 -> 评分上限 2.5
|
|
28
|
+
- 明显遗漏错误处理导致资源泄漏、状态损坏或失败后继续执行 -> 评分上限 3.0
|
|
29
|
+
- 硬编码真实凭证或 secret 泄露 -> 评分上限 2.0
|
|
30
|
+
- 纯文件删除(无逻辑变更)-> 评分记为 N/A
|
|
31
|
+
- 测试、bench、示例中的问题 -> 最高计为 P2,不纳入 P0/P1 计数
|
|
32
|
+
|
|
33
|
+
## 评分语义
|
|
34
|
+
|
|
35
|
+
| 分值 | 提交建议 | 含义 |
|
|
36
|
+
|------|---------|------|
|
|
37
|
+
| 9.0-10.0 | ✅ 可以提交 | 无明显问题 |
|
|
38
|
+
| 7.5-9.0 | ✅ 可以提交,跟进修复 | 有轻微问题,不影响提交 |
|
|
39
|
+
| 4.0-7.0 | 🔧 修复后提交 | 存在 P1 问题,影响广取下限,影响窄取上限 |
|
|
40
|
+
| 1.0-3.5 | 🚫 禁止提交 | 存在 P0 问题,必须修复 |
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# 未定义行为与安全检查清单
|
|
2
|
+
|
|
3
|
+
## 越界与未初始化
|
|
4
|
+
|
|
5
|
+
- 数组、缓冲区和字符串操作是否可能读写越界,或把终止符空间算漏。
|
|
6
|
+
- 局部变量、结构体字段或输出缓冲区是否在读取前完成初始化。
|
|
7
|
+
|
|
8
|
+
## 整数与格式化
|
|
9
|
+
|
|
10
|
+
- 长度、容量、偏移和乘法是否存在可证的溢出、截断或符号转换问题。
|
|
11
|
+
- `printf`/`snprintf`/日志格式串是否与参数类型一致,且格式串不来自未校验输入。
|
|
12
|
+
|
|
13
|
+
## 别名与危险接口
|
|
14
|
+
|
|
15
|
+
- 类型转换、强制转指针、对齐假设和 `void *` 回转是否依赖未证实前提。
|
|
16
|
+
- `gets`、不受限的 `strcpy`/`sprintf`、未校验的 `scanf` 等危险接口是否被引入。
|
|
17
|
+
- 仅在 diff 可证时报告 UB,不推断编译器优化或平台专有行为。
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-reviewer
|
|
3
|
+
description: "本地代码自审技能,用于开发者 commit 前对自己的改动进行预审。当用户请求 'review 代码'、'审查这次改动'、'找 diff 里的问题'、'review staged changes' 或 'code review this diff' 时使用。重点识别真实缺陷、安全漏洞、性能回退和设计问题,给出可执行的修复建议。默认只输出审查结论,不直接修改代码。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 代码审查
|
|
7
|
+
|
|
8
|
+
## 问题门槛
|
|
9
|
+
|
|
10
|
+
每条问题必须满足以下三点,否则不输出:
|
|
11
|
+
|
|
12
|
+
1. **可定位**:能指向具体文件和新增行号
|
|
13
|
+
2. **可自证**:仅凭当前 diff 和可见上下文即可成立,不依赖 diff 之外的假设
|
|
14
|
+
3. **可修复**:给出具体修复方案,而非泛泛建议
|
|
15
|
+
|
|
16
|
+
同一根因的多处表现合并为一条,不重复列举。
|
|
17
|
+
|
|
18
|
+
## 严重级别
|
|
19
|
+
|
|
20
|
+
| 等级 | 含义 | 处理 |
|
|
21
|
+
|------|------|------|
|
|
22
|
+
| **P0** | 安全漏洞、数据损坏、必现 crash | 必须修复后才能提交 |
|
|
23
|
+
| **P1** | 逻辑错误、功能异常、明显性能/可靠性回退 | 提交前修复 |
|
|
24
|
+
| **P2** | 可维护性问题、测试不足、非阻塞设计问题 | 当前批次修复或登记后续任务 |
|
|
25
|
+
| **P3** | 次要改进 | 可选 |
|
|
26
|
+
|
|
27
|
+
## 工作流
|
|
28
|
+
|
|
29
|
+
### 1) 确认审查范围
|
|
30
|
+
|
|
31
|
+
先用 `git status -sb` 判断当前状态,再决定审查哪部分:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
git status -sb
|
|
35
|
+
git --no-pager diff --stat # unstaged 改动
|
|
36
|
+
git --no-pager diff --cached --stat # staged 改动
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- 有 unstaged 改动 → 审查 `git --no-pager diff`
|
|
40
|
+
- 只有 staged 改动 → 审查 `git --no-pager diff --cached`
|
|
41
|
+
- 两者都有 → 优先审查 staged `git --no-pager diff --cached`,并提示可再单独审查 unstaged(`git --no-pager diff`)
|
|
42
|
+
|
|
43
|
+
diff 较大时写入文件再读取:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
git --no-pager diff > code-review.patch
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**边界情况:**
|
|
50
|
+
- **用户直接提供 diff 文本**:跳过 git 命令,直接审查提供的内容。
|
|
51
|
+
- **没有任何变更**:说明当前没有可审查内容,提示用户指定 commit 范围(如 `git diff main...HEAD`)。
|
|
52
|
+
- **diff 较大**:先用 `--stat` 列出改动文件,按文件逐个审查,不要一次性处理全部 diff。
|
|
53
|
+
|
|
54
|
+
### 2) 代码分析
|
|
55
|
+
|
|
56
|
+
#### a) 安全与可靠性
|
|
57
|
+
|
|
58
|
+
加载 `references/security-checklist.md`,说明问题的触发路径和影响范围。只在有明确代码路径支撑时才输出安全问题。
|
|
59
|
+
|
|
60
|
+
#### b) 代码质量
|
|
61
|
+
|
|
62
|
+
加载 `references/code-quality-checklist.md`,优先报告会导致错误结果或失败不可见的问题。
|
|
63
|
+
|
|
64
|
+
#### c) 架构与设计
|
|
65
|
+
|
|
66
|
+
加载 `references/solid-checklist.md`,检查本次改动是否引入新的设计问题。有重构建议时给出分步方案,不建议整体重写。
|
|
67
|
+
|
|
68
|
+
#### d) 冗余与删除(diff 中没有代码删除时跳过)
|
|
69
|
+
|
|
70
|
+
加载 `references/removal-plan.md`,确认被删代码无残留引用,相关测试和配置已同步清理。
|
|
71
|
+
|
|
72
|
+
### 3) 整理问题列表
|
|
73
|
+
|
|
74
|
+
确认每条问题满足门槛(可定位、可自证、可修复)。同一根因的多处表现合并为一条。不为凑数量降低标准。
|
|
75
|
+
|
|
76
|
+
### 4) 评分
|
|
77
|
+
|
|
78
|
+
加载 `references/scoring-guide.md`,**每次审查必须根据该指南给出具体评分**:先按最严重问题确定基准区间,再按影响广度、问题数量、可逆性在区间内微调,最终输出一个具体分值(如 8.5、7.0),不得只写区间或省略评分;纯文件删除时记为 N/A。
|
|
79
|
+
|
|
80
|
+
### 5) 输出格式
|
|
81
|
+
|
|
82
|
+
按以下格式输出:
|
|
83
|
+
|
|
84
|
+
```markdown
|
|
85
|
+
## 审查摘要
|
|
86
|
+
|
|
87
|
+
**审查范围**:X 个文件,Y 行新增
|
|
88
|
+
|
|
89
|
+
**评分**:X / 10(必须为具体分值,如 8.5;仅纯删除时为 N/A)
|
|
90
|
+
|
|
91
|
+
**提交建议**:✅ 可以提交 / ✅ 可以提交,跟进修复 / 🔧 修复后提交 / 🚫 禁止提交
|
|
92
|
+
|
|
93
|
+
**问题统计**:P0 × 个 / P1 × 个 / P2 × 个 / P3 × 个
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 各维度结果
|
|
98
|
+
|
|
99
|
+
| # | 维度 | 结论 |
|
|
100
|
+
|---|------|------|
|
|
101
|
+
| 1 | 安全与可靠性 | ✅ 无问题 / ⚠️ 存在问题(简述) |
|
|
102
|
+
| 2 | 代码质量 | ✅ 无问题 / ⚠️ 存在问题(简述) |
|
|
103
|
+
| 3 | 架构与设计 | ✅ 无问题 / ⚠️ 存在问题(简述) / 不适用 |
|
|
104
|
+
|
|
105
|
+
<!-- 纯文件删除时:前三行均填"不适用(纯删除,未引入新代码)",并在末尾追加一行:
|
|
106
|
+
| 4 | 冗余与删除 | ✅ 删除安全 / ⚠️ 存在问题(简述) | -->
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 问题列表
|
|
111
|
+
|
|
112
|
+
### P0 🔴 严重
|
|
113
|
+
无
|
|
114
|
+
|
|
115
|
+
### P1 🟠 高
|
|
116
|
+
1. **[文件:行号] 问题标题**
|
|
117
|
+
- **问题**:一句话说明是什么问题
|
|
118
|
+
- **影响**:一句话说明会导致什么后果
|
|
119
|
+
- **修复**:具体方案
|
|
120
|
+
|
|
121
|
+
### P2 🟡 中
|
|
122
|
+
无
|
|
123
|
+
|
|
124
|
+
### P3 🟢 低
|
|
125
|
+
无
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 总体评价
|
|
130
|
+
|
|
131
|
+
2–3 句话说明是否建议提交,以及还需要哪些修复或跟进。
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**输出规则:**
|
|
135
|
+
- 每次审查必须在「审查摘要」中给出根据 `references/scoring-guide.md` 计算的具体评分(X / 10),不得省略。
|
|
136
|
+
- 直接给问题,不写前言铺垫。
|
|
137
|
+
- 每条问题写清楚:位置、问题是什么、影响是什么、如何修复。
|
|
138
|
+
- 纯文件删除时,明确写"评分不适用"。
|
|
139
|
+
- 禁止在模板之外添加"亮点"、"优点"、"表扬"等额外章节。
|
|
140
|
+
- `## 总体评价` 只写 2–3 句连续段落,不用列表或子标题。
|
|
141
|
+
|
|
142
|
+
## 参考文件
|
|
143
|
+
|
|
144
|
+
| 文件 | 用途 |
|
|
145
|
+
|------|------|
|
|
146
|
+
| `security-checklist.md` | 安全与可靠性检查项 |
|
|
147
|
+
| `code-quality-checklist.md` | 错误处理、性能、边界条件、并发检查项 |
|
|
148
|
+
| `solid-checklist.md` | 架构与设计问题检查项 |
|
|
149
|
+
| `removal-plan.md` | 冗余代码识别与删除计划模板 |
|
|
150
|
+
| `scoring-guide.md` | 评分模型、区间规则和提交建议 |
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
code# 代码质量检查项
|
|
2
|
+
|
|
3
|
+
## 错误处理
|
|
4
|
+
|
|
5
|
+
- 异常被 catch 后直接丢弃,没有重新抛出也没有实质处理
|
|
6
|
+
- 捕获异常后只打 log,调用方无法感知失败,流程继续执行
|
|
7
|
+
- async 函数没有 await,或 Promise 没有 catch,失败静默丢失
|
|
8
|
+
- 降级逻辑掩盖了真实错误,让问题更难排查
|
|
9
|
+
|
|
10
|
+
## 性能与缓存
|
|
11
|
+
|
|
12
|
+
- 循环内部触发 N+1 query 或重复 I/O(每次迭代都查一次数据库)
|
|
13
|
+
- 热路径上有高开销操作(序列化、反射、大对象创建)
|
|
14
|
+
- cache key 缺少关键维度,导致不同请求拿到相同缓存数据
|
|
15
|
+
- 集合或缓冲区无界增长,随时间或并发量线性膨胀
|
|
16
|
+
|
|
17
|
+
## 边界条件
|
|
18
|
+
|
|
19
|
+
- 访问 null/nil/undefined 前没有 guard check
|
|
20
|
+
- 对空集合直接取第一个元素,或对空字符串做字符串操作
|
|
21
|
+
- 存在除零风险(分母来自外部输入或计算结果)
|
|
22
|
+
- off-by-one 错误:边界用 `<` 还是 `<=`,索引从 0 还是 1 开始
|
|
23
|
+
- `0`、`false`、`""` 这类合法值被 falsy 判断误判为"无值"
|
|
24
|
+
- 对整数范围的假设未校验(例如假设数值一定为正)
|
|
25
|
+
|
|
26
|
+
## 资源管理
|
|
27
|
+
|
|
28
|
+
- 连接、文件句柄、锁、数据库 session 没有在所有路径上释放(包括异常路径)
|
|
29
|
+
- try-finally 或 with/defer 只覆盖了正常路径,异常路径漏掉了
|
|
30
|
+
- 对象从容器中移除后,底层资源(连接池、文件描述符)仍然存活
|
|
31
|
+
|
|
32
|
+
## 并发
|
|
33
|
+
|
|
34
|
+
- 多线程/协程场景下读写共享可变状态,没有加锁或使用 atomic 操作
|
|
35
|
+
- lazy initialization 没有考虑并发,可能被多次初始化
|
|
36
|
+
- 回调或事件处理函数修改外部共享状态,没有同步保证
|
|
37
|
+
|
|
38
|
+
## 测试
|
|
39
|
+
|
|
40
|
+
- 测试只覆盖 happy path,没有覆盖异常、边界、空值场景
|
|
41
|
+
- 断言过于宽泛,无法证明核心行为正确(例如只断言返回了某个类型)
|
|
42
|
+
- 测试 setup 本身存在脆弱点(依赖外部状态、时序、全局变量)
|
|
43
|
+
- 关键业务逻辑变更后,没有对应新增或更新测试
|
|
44
|
+
|
|
45
|
+
## 排查思路
|
|
46
|
+
|
|
47
|
+
审查时依次问自己:
|
|
48
|
+
|
|
49
|
+
- 这里失败了,调用方能感知吗?错误会在哪里暴露?
|
|
50
|
+
- 输入为空、为零、为空集合、超出范围或重复提交时,会发生什么?
|
|
51
|
+
- 哪些逻辑在循环、重试或热路径中执行,是否引入了重复计算或额外 I/O?
|
|
52
|
+
- 即使抛异常,哪些资源仍然必须被释放?
|
|
53
|
+
- 如果某个疑点没有具体代码路径支撑,不作为正式问题输出。
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# 冗余代码识别与删除计划
|
|
2
|
+
|
|
3
|
+
## 可以立即删除
|
|
4
|
+
|
|
5
|
+
适用条件:代码确认无用,且已通过引用搜索确认没有调用方。
|
|
6
|
+
|
|
7
|
+
| 字段 | 内容 |
|
|
8
|
+
|------|------|
|
|
9
|
+
| **位置** | `path/to/file:line` |
|
|
10
|
+
| **删除原因** | 无用代码 / 冗余分支 / 已被替代 |
|
|
11
|
+
| **证据** | 无引用 / 路径失效 / 接口已过时 |
|
|
12
|
+
| **影响范围** | 无 / 极低 |
|
|
13
|
+
| **需要同步清理** | 相关测试、配置、文档 |
|
|
14
|
+
| **删除后验证** | 跑哪些测试、检查哪些日志或监控指标 |
|
|
15
|
+
|
|
16
|
+
## 暂不删除,制定计划
|
|
17
|
+
|
|
18
|
+
适用条件:代码看起来可以删,但存在不确定因素(仍有调用方、需要迁移、归属不明确)。
|
|
19
|
+
|
|
20
|
+
| 字段 | 内容 |
|
|
21
|
+
|------|------|
|
|
22
|
+
| **位置** | `path/to/file:line` |
|
|
23
|
+
| **现在不能删的原因** | 仍有调用方 / 需要迁移 / 归属不清 |
|
|
24
|
+
| **前置条件** | 删除前必须先完成什么 |
|
|
25
|
+
| **迁移计划** | 安全的执行顺序(如:先新增替代实现 → 迁移调用方 → 删旧代码) |
|
|
26
|
+
| **验证方式** | 用 `rg` 确认无引用 / 观察相关日志 / 检查监控指标 |
|
|
27
|
+
| **回滚方案** | 出问题如何恢复 |
|
|
28
|
+
|
|
29
|
+
## 删除前检查表
|
|
30
|
+
|
|
31
|
+
- 用 `rg` 或等价工具搜索全部直接引用
|
|
32
|
+
- 排查动态引用(反射、字符串拼接、配置文件中的类名/方法名)
|
|
33
|
+
- 确认外部调用方(其他服务、脚本、CI/CD pipeline)不再依赖
|
|
34
|
+
- 更新或删除相关测试
|
|
35
|
+
- 更新相关文档和配置
|
|
36
|
+
- 如果是对外接口,确认已完成 deprecation 通知和迁移窗口
|
|
37
|
+
|
|
38
|
+
## 排查思路
|
|
39
|
+
|
|
40
|
+
判断是否可以删除时,依次问自己:
|
|
41
|
+
|
|
42
|
+
- 这段代码是真的无用,还是引用关系暂时没有找到(动态加载、反射、外部服务调用)?
|
|
43
|
+
- 删除后,哪些运行路径、配置项、脚本或外部调用方会受影响?
|
|
44
|
+
- 现在直接删,还是先补迁移计划?哪种风险更低?
|
|
45
|
+
- 如果证据还不完整,不下"可以立即删除"的结论,改为制定计划。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 评分指南
|
|
2
|
+
|
|
3
|
+
评分由**最严重的已确认问题**决定基准区间,再在区间内微调。
|
|
4
|
+
|
|
5
|
+
## 第一步:确定基准区间
|
|
6
|
+
|
|
7
|
+
| 最严重问题 | 分值区间 |
|
|
8
|
+
|-----------|---------|
|
|
9
|
+
| 无问题 | 9.0–10.0 |
|
|
10
|
+
| 仅 P2/P3 | 7.5–9.0 |
|
|
11
|
+
| P1 | 4.0–7.0 |
|
|
12
|
+
| P0(crash、数据损坏) | 2.0–3.5 |
|
|
13
|
+
| P0(安全漏洞、认证绕过) | 1.0–2.5 |
|
|
14
|
+
|
|
15
|
+
## 第二步:在区间内调整
|
|
16
|
+
|
|
17
|
+
- **影响广度**:影响所有用户取下限,仅边界场景触发取上限,差距约 0.5–1.0 分
|
|
18
|
+
- **问题数量**:每多一个独立同级别问题,向下移约 0.3–0.5 分
|
|
19
|
+
- **可逆性**:出问题后可以快速定位修复,可在区间内上浮 0.3–0.5 分
|
|
20
|
+
|
|
21
|
+
> 多个问题时取区间下限附近;单个问题且影响有限时取区间上限附近。
|
|
22
|
+
|
|
23
|
+
## 硬上限
|
|
24
|
+
|
|
25
|
+
- 有任意 P0 → 评分上限 3.5
|
|
26
|
+
- 核心功能完全失效 → 评分上限 2.5
|
|
27
|
+
- 硬编码真实 credentials 或 secret 泄露 → 评分上限 2.0
|
|
28
|
+
- 纯文件删除(无逻辑变更)→ 评分记为 N/A
|
|
29
|
+
- 测试文件的问题 → 最高计为 P2,不纳入 P0/P1 计数
|
|
30
|
+
|
|
31
|
+
## 评分语义
|
|
32
|
+
|
|
33
|
+
| 分值 | 提交建议 | 含义 |
|
|
34
|
+
|------|---------|------|
|
|
35
|
+
| 9.0–10.0 | ✅ 可以提交 | 无明显问题 |
|
|
36
|
+
| 7.5–9.0 | ✅ 可以提交,跟进修复 | 有轻微问题,不影响提交 |
|
|
37
|
+
| 4.0–7.0 | 🔧 修复后提交 | 存在 P1 问题,影响广取下限,影响窄取上限 |
|
|
38
|
+
| 1.0–3.5 | 🚫 禁止提交 | 存在 P0 问题,必须修复 |
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 安全与可靠性检查项
|
|
2
|
+
|
|
3
|
+
## 输入输出安全
|
|
4
|
+
|
|
5
|
+
- **Injection**:用户输入通过字符串拼接直接进入 SQL、NoSQL query、shell 命令或模板引擎,没有使用 parameterized query 或安全 API
|
|
6
|
+
- **XSS**:未经 escape 的用户数据直接输出到 HTML,或通过 `innerHTML`/`dangerouslySetInnerHTML` 插入页面
|
|
7
|
+
- **SSRF**:用户可控的 URL 被服务端直接发起请求,没有校验目标地址是否合法
|
|
8
|
+
- **Path traversal**:用户输入拼接到文件路径,没有 canonicalize 和白名单校验
|
|
9
|
+
- **ReDoS**:用户输入进入带有回溯风险的正则表达式,可能导致 CPU 占用飙升
|
|
10
|
+
|
|
11
|
+
## 认证与授权
|
|
12
|
+
|
|
13
|
+
- 新增的 API endpoint 或 route 没有经过认证中间件
|
|
14
|
+
- 操作资源前没有校验资源归属当前用户(水平越权)
|
|
15
|
+
- 接口直接信任客户端传来的 user_id、role、tenant_id 等身份字段,没有服务端验证
|
|
16
|
+
- 存在 tenant 隔离缺失:A 租户的请求能查到 B 租户的数据
|
|
17
|
+
|
|
18
|
+
## Credentials 与敏感数据
|
|
19
|
+
|
|
20
|
+
- token、API key、密码、private key 硬编码在代码或配置文件中
|
|
21
|
+
- log 中输出了完整请求/响应体,包含 credentials 或 PII
|
|
22
|
+
- 敏感字段没有在序列化或日志输出时被 mask 或过滤
|
|
23
|
+
|
|
24
|
+
## 运行时可靠性
|
|
25
|
+
|
|
26
|
+
- 外部服务调用没有 timeout,可能导致请求一直挂起
|
|
27
|
+
- 没有 retry 限制或 circuit breaker,外部故障会造成雪崩
|
|
28
|
+
- 无界循环或递归,可能导致 CPU 耗尽或 stack overflow
|
|
29
|
+
- 在请求主路径上执行阻塞 I/O(如同步读大文件),影响并发处理能力
|
|
30
|
+
- 大批量数据一次性加载进内存,存在 OOM 风险
|
|
31
|
+
|
|
32
|
+
## Race condition 与数据一致性
|
|
33
|
+
|
|
34
|
+
- **check-then-act**:先判断条件再执行操作,中间没有加锁或原子操作保护,存在 TOCTOU 问题
|
|
35
|
+
- 共享可变状态在多线程/多协程场景下没有同步控制
|
|
36
|
+
- **read-modify-write**:先读取再修改再写回,没有事务或乐观锁保护,并发时会有数据覆盖
|
|
37
|
+
- 重试机制可能导致操作重复执行,没有 idempotency 保证
|
|
38
|
+
|
|
39
|
+
## 加密与序列化
|
|
40
|
+
|
|
41
|
+
- 安全场景使用弱算法(MD5/SHA1 做密码 hash,ECB 模式加密)
|
|
42
|
+
- IV 或 salt 硬编码或重复使用,破坏加密随机性
|
|
43
|
+
- 直接 deserialize 不可信来源的数据(pickle、Java serialization、YAML.load),存在 RCE 风险
|
|
44
|
+
- 加密数据没有 MAC/HMAC 做完整性校验,可能被篡改
|
|
45
|
+
|
|
46
|
+
## 排查思路
|
|
47
|
+
|
|
48
|
+
审查时依次问自己:
|
|
49
|
+
|
|
50
|
+
- 这条数据从入口到落库或输出,中间有没有绕过校验、鉴权或过滤的路径?
|
|
51
|
+
- 这次改动是否新开了 API 入口、新增了信任边界,或扩大了已有权限范围?
|
|
52
|
+
- 如果输入异常、权限失效或外部系统不可用,系统会安全失败,还是会直接暴露风险?
|
|
53
|
+
- 如果没有明确代码路径支撑,停止延伸,不作为正式问题输出。
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# 架构与设计检查项
|
|
2
|
+
|
|
3
|
+
## SOLID 原则
|
|
4
|
+
|
|
5
|
+
### SRP(单一职责)
|
|
6
|
+
|
|
7
|
+
- 一个模块/类同时承担多个独立的变化原因(例如同时处理数据获取、业务规则和格式化输出)
|
|
8
|
+
- 单个函数同时做校验、业务计算、持久化和通知,职责杂糅
|
|
9
|
+
|
|
10
|
+
### OCP(开闭原则)
|
|
11
|
+
|
|
12
|
+
- 新增一种场景需要修改核心逻辑,而不是通过新增实现或配置完成
|
|
13
|
+
- 本应用 strategy/plugin 模式的地方,只能靠堆 if-else / switch 扩展
|
|
14
|
+
|
|
15
|
+
### LSP(里氏替换)
|
|
16
|
+
|
|
17
|
+
- 子类覆盖父类方法时,收紧了前置条件或放宽了后置条件,破坏了调用方的期望
|
|
18
|
+
- 调用方需要用 `instanceof` 或类型判断来规避某个具体子类的异常行为
|
|
19
|
+
|
|
20
|
+
### ISP(接口隔离)
|
|
21
|
+
|
|
22
|
+
- 接口定义了超出调用方实际需要的方法,调用方被迫实现或依赖不需要的部分
|
|
23
|
+
- 一个接口同时服务多个差异很大的使用场景,导致任何一方改动都影响所有人
|
|
24
|
+
|
|
25
|
+
### DIP(依赖倒置)
|
|
26
|
+
|
|
27
|
+
- 高层业务逻辑直接 `import` 或 `new` 底层实现(数据库、文件系统、第三方 SDK)
|
|
28
|
+
- 存储层、网络层或框架细节渗透到核心业务逻辑中,替换底层时必须修改业务代码
|
|
29
|
+
|
|
30
|
+
## 常见设计坏味道
|
|
31
|
+
|
|
32
|
+
- **超长函数**:函数超过 50–80 行,或嵌套超过 3 层,很可能承担了太多职责
|
|
33
|
+
- **数据泥团(Data Clump)**:多个参数总是一起出现,应该封装成一个对象
|
|
34
|
+
- **依恋情结(Feature Envy)**:函数大量使用另一个类的字段,逻辑应该移过去
|
|
35
|
+
- **基本类型偏执(Primitive Obsession)**:用 string/int 表示有明确业务含义的概念(如 userId、currency、status),应该引入明确类型
|
|
36
|
+
- **散弹式修改(Shotgun Surgery)**:一个需求变化需要修改多处不相关的文件
|
|
37
|
+
- **魔法值**:裸数字或字符串字面量,没有命名常量说明含义
|
|
38
|
+
- **过度预设计**:为假想的未来需求引入抽象层,当前没有任何实际使用场景
|
|
39
|
+
|
|
40
|
+
## 重构建议原则
|
|
41
|
+
|
|
42
|
+
- 优先给出改动最小、风险可控的拆分方案
|
|
43
|
+
- 说明调整后的边界为何更清晰,以及对现有调用方的影响
|
|
44
|
+
- 改动较大时,给出分步方案(先拆接口 → 再迁移实现 → 再删旧代码)
|
|
45
|
+
- 不建议整体重写,除非现有结构无法安全演进
|
|
46
|
+
|
|
47
|
+
## 排查思路
|
|
48
|
+
|
|
49
|
+
审查时依次问自己:
|
|
50
|
+
|
|
51
|
+
- 这些职责为什么会落在同一个模块或函数里?是历史积累还是设计失误?
|
|
52
|
+
- 如果再新增一种场景,现有结构是更容易扩展,还是更容易失控?
|
|
53
|
+
- 调用方是否已经为了适配当前设计,写了额外的 workaround 逻辑?
|
|
54
|
+
- 这次改动暴露的是局部实现问题,还是更上层的边界划分问题?
|
|
55
|
+
- 如果判断不能落到具体调用关系、边界混乱点或新增改动带来的实际影响上,不作为正式问题输出。
|