Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,20 @@
"source": {
"source": "url",
"url": "https://github.com/partme-ai/partme-codeguard-plugin.git",
"ref": "v0.14.3"
"ref": "v0.14.4"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_USE"
},
"category": "Developer Tools",
"version": "0.14.3",
"version": "0.14.4",
"description": "Evidence-backed code checks and Git content gates for AI assistants, with Maven/Gradle module impact analysis. Save hooks provide feedback; unverified checks are explicit.",
"icon": "https://cdn.jsdelivr.net/gh/full-stack-plugins/codeguard-plugin@v0.14.3/assets/official-logo.png",
"icon": "https://cdn.jsdelivr.net/gh/full-stack-plugins/codeguard-plugin@v0.14.4/assets/official-logo.png",
"interface": {
"displayName": "代码规范守卫",
"shortDescription": "Trustworthy code checks and Java impact analysis",
"logo": "https://cdn.jsdelivr.net/gh/full-stack-plugins/codeguard-plugin@v0.14.3/assets/official-logo.png"
"logo": "https://cdn.jsdelivr.net/gh/full-stack-plugins/codeguard-plugin@v0.14.4/assets/official-logo.png"
}
}
]
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "codeguard",
"version": "0.14.3+codex.20260923",
"version": "0.14.4+codex.20260923",
"description": "Evidence-backed code checks and Git content gates for AI assistants, with Maven/Gradle module impact analysis. Save hooks provide feedback; unverified checks are explicit.",
"author": {
"name": "Full Stack Skills / PartMe.AI",
Expand Down
2 changes: 1 addition & 1 deletion .zcode-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"en": "CodeGuard",
"zh-CN": "代码规范检查"
},
"version": "0.14.3",
"version": "0.14.4",
"description": "Evidence-backed code checks and Git content gates for AI assistants, with Maven/Gradle module impact analysis. Save hooks provide feedback; unverified checks are explicit.",
"description_i18n": {
"en": "Evidence-backed code checks and Git content gates for AI assistants, with Maven/Gradle module impact analysis. Save hooks provide feedback; unverified checks are explicit.",
Expand Down
1 change: 1 addition & 0 deletions docs/current-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ flowchart TD

`execution` 只记录进程证据,不把非零退出自动认定为代码违规。`verdict`、CVE 与 Dockerfile 报告解析决定 PASS、FAIL 或 UNVERIFIED;入口仅按各自协议呈现和聚合退出码。Git 提交检查使用 index 或预测暂存快照,推送检查使用 HEAD;保存钩子只给反馈。计划、未执行和未验证不能宣传为通过。
Git 命令的仓库定位与拟暂存解析共用入口传入的 cwd;显式 `cd`/`git -C` 无法绑定 Git 工作树时,硬门禁给出目标未验证并阻断,不退回到调用者仓或无关子仓。未给出显式目标且调用目录非仓时仍保留 workspace 子仓兜底。静态命令解析不等于完整 Shell 执行模拟。
一条命令链中的 Git 副作用先绑定为仓库与操作的有序对,再按仓库聚合检查面:纯 push 不读取该仓未提交的 index,同仓 commit→push 则保留已有 HEAD 与拟提交内容的并集。仓库级、内联及链式 `skipGate` 均按目标仓与操作顺序生效;已存在的仓库配置也可被同链先行 `git config --unset` 取消。链式设置跨 `||`、`;` 或换行时无法证明生效,门禁要求拆分命令;写入其它文件的 config 设置也不构成本仓豁免。语法、仓库归属、间接脚本与拟暂存分析共用引号/转义感知切分;参数文本中的控制符不能合成豁免。解析能力仍限于受支持的静态 Shell 形态。

## 模块所有权

Expand Down
2 changes: 1 addition & 1 deletion kimi.plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "codeguard",
"version": "0.14.3",
"version": "0.14.4",
"description": "Evidence-backed code checks and Git content gates for AI assistants, with Maven/Gradle module impact analysis. Save hooks provide feedback; unverified checks are explicit.",
"author": {
"name": "Full Stack Skills / PartMe.AI"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,11 +199,46 @@ index 或工作树;不支持的动态/交互式形态必须明确未验证,
显式 `cd` 或 `git -C` 已给出目标时,若该目标不是可解析的 Git 工作树,MUST 阻断
该 Git 副作用命令并报告目标不可确定;不得回退调用者仓或扫调用者一层子仓。
只有命令未给出显式目标且调用目录不是 Git 仓时,才保留既有 workspace 子仓兜底策略。
一条命令链触及多个仓库时,commit/push 门禁面和是否存在待提交操作 MUST 按仓库分别
归属;A 仓的 commit 不得使 B 仓的纯 push 检查包含 B 仓尚未提交的 index。若同一仓
同时 commit 和 push,则继续检查该仓已有待推送内容及拟提交内容,不得缩窄既有检查面。
仓库级 `codeguard.skipGate` 只豁免设置它的仓库,不得因 A 仓豁免而跳过同链 B 仓。
内联 `git -c codeguard.skipGate` 只豁免对应 Git 操作;链式 `git config` 设置/取消
须按命令顺序归属到目标仓,不得把 A 仓的豁免传播到 B 仓或此前操作。写入
其它配置文件的 `git config --file=...` 不构成当前仓库生效的豁免。
链式配置变更只有经 `&&` 确认成功路径后才能传递到后续操作;跨越 `||`、`;`
或换行后的配置状态无法静态证明时,MUST 阻断并提示拆分命令,不得猜测已生效。
命令切分 MUST 区分真实 Shell 分隔符和被引用/转义的字面文本;提交消息、echo 参数
或文件路径中的 `;`、`&&` 不得生成虚假的 Git 操作或豁免设置。

#### Scenario: Two repositories have different staging commands
- **WHEN** 一条命令链对 A 执行 add -A、对 B 只提交已暂存内容
- **THEN** B 的未暂存及未跟踪文件不进入拟提交检查面

#### Scenario: Commit and push belong to different repositories
- **WHEN** 一条命令链提交 A 仓、只推送 B 仓,而 B 仓另有未提交的暂存改动
- **THEN** A 使用 commit 面,B 使用纯 push 的 HEAD 面;B 的暂存改动不因 A 的 commit 被误纳入

#### Scenario: Commit and push belong to the same repository
- **WHEN** 同一仓在一条命令链中先提交再推送
- **THEN** 门禁同时覆盖该仓拟提交 index 和已有待推送 HEAD 内容

#### Scenario: A bypass belongs to its repository
- **WHEN** 同链 A 仓设置了 `codeguard.skipGate`,B 仓没有豁免且包含应拦截内容
- **THEN** 只审计并跳过 A 仓,仍对 B 仓运行完整门禁并阻断其违规内容

#### Scenario: Inline and chain bypasses are not global
- **WHEN** A 仓使用单次 `git -c` 或链式 `git config` 豁免,B 仓在同链执行无豁免提交
- **THEN** 仅 A 的指定操作获得豁免,B 仓仍完整检查;同仓 unset 后的操作也不继承之前的豁免

#### Scenario: A conditional bypass setter cannot be assumed successful
- **WHEN** `git config codeguard.skipGate true` 后以 `||`、`;` 或换行连接提交,或设置写入其它配置文件
- **THEN** 不把该设置当作已生效的本仓豁免;无法证明控制流时报告 UNVERIFIED 并要求拆分命令

#### Scenario: Quoted control characters are data
- **WHEN** `echo` 的引号参数或 commit 消息包含 `; git config codeguard.skipGate true`
- **THEN** 不产生虚假的 config 设置,随后未豁免的提交仍须检查并阻断违规内容

#### Scenario: An explicit Git target is not a repository
- **WHEN** 命令从 Git 仓调用,但在 `cd` 到非 Git 目录后运行 `git push`,或使用无效的 `git -C` 目标
- **THEN** 门禁以明确诊断阻断,而不是检查调用者仓或用 workspace 兜底;后续显式 `git -C` 指向有效仓时仍能正确绑定该仓
Expand Down
4 changes: 2 additions & 2 deletions openspec/changes/refactor-codeguard-architecture/tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@
- [x] 5.1 增加自动架构依赖/循环检查并接入 CI,临时源码树注入反向依赖/函数内导入/相对导入环后确实拒绝;本地已验证,远端 CI 待发布阶段。不以文件行数当合格标准。
- [x] 5.2 四个历史 skipped 已全部恢复;Dockerfile CLI 接入统一报告解析与扫描应用,14 项真实进程边界测试通过;基线比较按诊断内容和次数核验并要求基线实际 FAIL,三项误豁免用例先红后绿。完整 433 项单测零跳过、142 项回归零失败。
- [x] 5.3 新增当前架构 Mermaid 与扩展指南;报告版本读取插件 manifest,双语 README 指向当前证据,旧设计标明历史范围;双语标题/链接/版本及本地链接存在性测试通过。发布版本仍需在 5.5 检查。
- [ ] 5.4 全量单测/真实 hook 回归/ruff/语言 schema/vendor 离线与在线/本 change strict 和逐条规格追溯通过。
- [ ] 5.5 按仓规升级版本、生成市场元数据、授权的 PR/CI/不可变 tag/Release 闭环;v0.14.2 阶段版本已完成插件/市场双仓合并、PR/main CI、tag/Release,但本 change 后续改动仍需独立发布。宿主安装运行独立记录,未授权不得改宿主。
- [x] 5.4 全量单测/真实 hook 回归/ruff/语言 schema/vendor 离线与在线/本 change strict 和逐条规格追溯通过;第十八批 481 项单测、143 项真实 Hook 回归、57 项/11 规则,证据见 verification.md。仅证明本地契约,不等同三宿主现场验收。
- [ ] 5.5 按仓规升级版本、生成市场元数据、授权的 PR/CI/不可变 tag/Release 闭环;v0.14.3 阶段版本已完成插件/市场双仓合并、PR/main CI、tag/Release,但本 change 后续改动仍需独立发布。宿主安装运行独立记录,未授权不得改宿主。
- [ ] 5.6 完成全目标审计,代码/规格/证据一致后同步并归档 change,才可将整体优化标记完成。
Original file line number Diff line number Diff line change
Expand Up @@ -186,3 +186,12 @@
- 当前 `GitTargetError` 将显式目标不可绑定与无显式目标的 workspace 兜底区分;前者在应用边界返回 exit 2 和具体路径,不再检查错误仓。Git 根观察的 `SnapshotError` 同样不交给顶层 fail-open。拟暂存解析接受可选显式 cwd,并由应用传入同一调用目录;旧无参导入/调用仍可使用进程 cwd。真实 PreToolUse 子进程证明无效目标阻断,`git -C` 有效目标仍覆盖非 Git cd。
- TDD RED 包含错误放行、错误兜底、遗漏 pathspec 与根观察异常;GREEN 后完整单测 **470/470、0 skipped**,真实 Hook 回归 **143/0/0**。ruff、架构门禁、语言 schema **57 项/11 规则**、vendor 离线与在线、本 change strict、diff whitespace 通过;受管技能与 lock 未改。
- 这不是 Shell 求值器:条件链、动态拼接、命令替换、复杂引用和链内环境变化仍是明确边界。三宿主现场、Windows、联网漏洞库与全部语言工具链未因此获得验收。本批在此记录时尚未 bump/提交/发布。

## 第十八批实际验证:多仓操作与豁免归属

- v0.14.3 已经插件 PR #49、市场 PR #6 合并到双仓 `main`;插件 PR 及合并后 `main` 的 `skills-check` 成功,不可变注释 tag 与 GitHub Release 解引用到 `f646f031bf35d269da82d4f70c0a4666991eb175`,市场三宿主版本为 0.14.3。该发布只覆盖第十七批及此前源码,不覆盖本批修改。
- 临时 CodeGraph 快照从最新 main 同步并追踪 `evaluate_git_command → resolve_git_operations → validation_tree/proposed_paths`。原实现按整链 `push` 和 `pending_commit` 选面:A 仓 commit、B 仓纯 push 时,B 暂存的 `.env` 被错误纳入本次推送并阻断。真实双 Git 仓测试先 RED;现在 `GitOperation` 保留每个副作用的仓、模式与有序豁免状态,B 只检查 HEAD,同仓 commit→push 仍检查已有待推送内容与拟提交内容。
- 仓库级 `skipGate` 原先以 `any(...)` 令 A 仓配置豁免 B 仓;内联 `-c` 和链式 `git config` 也会全链放行。新增测试分别先 RED,再证明只豁免所属仓与操作;同仓后续无豁免提交仍受检,后置设置不追溯前面的提交。已有仓库配置为 true 但命令先 unset 再提交也曾被预读配置误放行,现按命令序列覆盖旧配置。旧 `resolve_project_roots` 与语法布尔 helper 导入面保留。
- 追加 RED:`git config --file=其它文件` 错被当成本仓豁免;`git config ... || git commit` 错把仅在设置失败时才会执行的提交放行。现在前者不构成豁免,后者及 `;`/换行连接的配置状态报告 UNVERIFIED 并要求拆分命令。未把完整 Shell 求值器伪装成已实现。
- 完整单测 **479/479、0 skipped**;真实 Hook 回归 **143/0/0**。Ruff、架构依赖/循环、语言 schema **57 项/11 规则**、vendor 离线及在线、本 change strict、diff whitespace 均通过;受管技能及 lock 未改。测试覆盖真实 Git/快照与应用层故障,但静态 Shell 解析仍非完整求值器,三宿主现场、Windows、在线漏洞库和全部语言工具链仍未独立验收。本批发布闭环待执行。
- 后续 RED 发现:`echo "docs; git config codeguard.skipGate true" && git commit` 会把引号内分号当真实分隔符,错误放行含 `.env` 的提交。语法/仓库/间接脚本/拟暂存改用同一个引号及转义感知切分函数;真实 Git 提交安全用例与纯语法用例转绿。复核后完整单测 **481/481、0 skipped**,真实 Hook 回归 **143/0/0**;Ruff、架构依赖/循环、语言 schema **57 项/11 规则**、vendor 离线及在线、本 change strict、diff whitespace 均通过。本批发布证据仍待补齐。
4 changes: 2 additions & 2 deletions scripts/check_architecture.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@
# scope 是已有文件物化适配器:注入配置/排除目录,尚未迁入内核包。
"codeguard.planning": {"__future__", "collections", "pathlib", "scope", "codeguard.models"},
"codeguard.git_syntax": {"__future__", "pathlib", "re", "shlex"},
"codeguard.git_staging": {"__future__", "os", "re", "shlex", "pathlib", "git_snapshot", "codeguard.git_syntax"},
"codeguard.git_context": {"__future__", "pathlib", "re", "shlex", "scope",
"codeguard.git_staging": {"__future__", "os", "shlex", "pathlib", "git_snapshot", "codeguard.git_syntax"},
"codeguard.git_context": {"__future__", "dataclasses", "pathlib", "re", "shlex", "scope",
"codeguard.execution", "codeguard.git_syntax", "codeguard.git_staging"},
"codeguard.path_policy": {"__future__", "fnmatch", "pathlib"},
"codeguard.storage": {"__future__", "contextlib", "json", "os", "tempfile", "time",
Expand Down
Loading
Loading