测试治理
provider 采集测试事实、runner 执行真实命令;报告按 decision / collection / execution / scripts 四层分开——策略裁决与证据边界不互相覆盖。测试与辅助文件不进生产度量。
--bloat minhash 膨胀诊断——全部 report-only,不进 gate。--full 组合跳过 diff 前置做全量);test --list 列出已注册 provider,供配置引用。OpenArch 不是又一个 linter。它承认代码腐化是熵、不可避免——所以给你的每个 AI Agent 一套能就地重建的本地治理防线:信息论度量、符号级变更冲击、fail-closed 门禁, 以及一份 Agent 真正会读的行动手册(Skill)。本地、确定、可审计,门禁里没有 LLM。
为什么是它
传统质量门是一次性建好的墙——规则老化、Agent 学会绕过、下次重踩同一个坑。
OpenArch 是一条战壕:阈值随你的项目 P95 自校准,防线由 Agent 读着 playbook 就地重建,
每次改动用符号级证据照亮真实冲击,缺证据就 UNAVAILABLE 绝不假装通过。
门禁里没有 LLM——你的代码不出楼,裁决本地可复现。
装好之后,你和 Agent 的日常就多这四步。"状态是基线,变化是信号"——先建事实,再以变更取证。
只读建立项目事实:基线、策略、治理可用性。判断下一步。
建基线;看 Top-3 局部负担文件与结构候选。
以工作树取证:I_push 冲击、WARN、反模式 finding。
以 Git index 同一快照取证,信号归零再提交。
从拿到 CLI 到 Agent 在项目里跑起来。源码构建与本地 tarball 均正式可用;npm 仓库发行仍暂缓(已在选项中置灰);初始化与验证两步通用。
与其照着下面三步手动敲,更高效的做法是把仓库的 INSTALL.md 直接交给你的 Agent——它会自己读文档、执行构建与 init、验证 Skill,人类只需在关键决策点(个人 / 团队模式、工具链路径)确认。仓库地址:github.com/VilTea/openarch
# 对你的 Agent 说:
读 https://github.com/VilTea/openarch 仓库里的 INSTALL.md,
把 OpenArch 装到当前项目(openarch init --agent claude,若你用的是 codex / cursor / opencode / reasonix 请替换),装完跑 openarch context 验证。
这契合 OpenArch 自身哲学——INSTALL §3.1 本就写着 "Agent: read this",Skill 也是 Agent 真正会读的 playbook。下面的手动三步留给想自己掌控每一步的人。
一条持久命令,所有本地项目和 Agent 会话共享。
前置:Node.js 20+、pnpm 9.x(corepack enable)、bun、Git。先从 GitHub 克隆源码:
# 克隆源码 $ git clone https://github.com/VilTea/openarch $ cd openarch $ corepack enable $ pnpm install $ pnpm release:binary # bun build --compile → 单文件二进制(含 TS 编译器 API,无需 node_modules)
产物在 artifacts/binary/openarch-<平台>-<架构>/:openarch(.exe) + resources/(tree-sitter WASM 语法、脚本资产、Skill)。脚本会在临时项目里先探测(--help、各语言 scan、Skill 安装)再落盘。
# 构建并原子安装到 %LOCALAPPDATA%\OpenArch\bin,写入用户 PATH $ pnpm release:local-command $ openarch --version # 新开终端验证
在受治理项目里把 CLI 作为开发依赖:
$ npm install --save-dev @openarch/cli $ npx openarch init --agent codex
可选:装一份用户级 Skill(跨项目,不含项目作用域):
$ npm install --global @openarch/plugin $ openarch-agent-install --target codex --locale en
用户级安装故意不带项目作用域;每个项目仍用 openarch init --agent <target>。
无网络或内网:本地打 tarball,装进受治理项目,再跑同样的 CLI 初始化:
$ pnpm release:local $ npm install --save-dev /absolute/path/to/openarch-cli-<version>.tgz $ npx openarch init --agent codex
在受治理仓库根目录执行。一条命令同时完成项目初始化与 Agent Skill 装机。
# 把 claude 换成你的 Agent:claude | codex | cursor | opencode | reasonix $ openarch init --agent claude $ openarch context
--agent 决定 Skill 落在哪个 harness 的项目级目录;它读取 .openarch/config.yml 的 presentation.locale 安装 zh 或 en Skill 树,原子替换旧目录。注意:--lang 只改本次 CLI 输出,不会改变已安装的 Skill。
| Harness | 命令 | Skill 位置 |
|---|---|---|
| Claude | openarch init --agent claude | .claude/skills/openarch/ |
| Codex | openarch init --agent codex | .codex/skills/openarch/ |
| Cursor | openarch init --agent cursor | .cursor/skills/openarch/ |
| OpenCode | openarch init --agent opencode | .opencode/skills/openarch/ |
| Reasonix | openarch init --agent reasonix | .reasonix/skills/openarch/ |
| 其它兼容 Agent | openarch init --skill-dir .my-agent/skills | 自定项目相对目录 |
按需装 pre-commit hook、选择个人/团队持久化模式、配置外部工具链。
# 代码仓 pre-commit hook:封存语义证据 + 执行已配置门禁 $ openarch init --install-hook # 个人项目:运行产物不进 Git(只写 .git/info/exclude) $ openarch init --mode personal --install-hook # 团队审查模式:产物 tracked,可经 scan 重建 $ openarch init --mode team --install-hook # 外部工具链(编译器/LSP)是机器事实,绝不进项目依赖 $ openarch toolchains # 查看所需工具 $ openarch init --toolchains user # 用户级;project 则写 .openarch/toolchains.local.yml(入本地 exclude)
CI 可用 OPENARCH_<TOOL_ID>_PATH 环境变量覆盖两个文件。Skill 在发现不可用时会按语言读取对应配置说明。
CLI 装好后,Agent 自己把 OpenArch Skill 装进工作环境。这三步直接抄自 INSTALL §3.1。
执行 openarch init --agent <你的目标>,Skill 落入你的项目级 skills 目录。升级 OpenArch 后重跑刷新(退役文件被原子清除)。
依赖它之前确认目录存在且含 SKILL.md:
$ ls .claude/skills/openarch/SKILL.md若缺失,重跑对应 init --agent 并读错误输出。
已安装的 Skill 就是行动手册:治理工作前先读它,跑 openarch context 建立事实,再按路由选 scan/review/check/rules/docs。check 输出是全量信号面——PASS 也要读 WARN、TEST_BLOAT、反模式 finding;PARTIAL/UNAVAILABLE 是事实边界,不是 clean。
公开命令 11 个 · 高级命令 4 个。逐命令帮助用 openarch <command> --help。
测试治理面向仓库内部的测试事实,机器契约面向外部插件的消费边界——两个位面各自版本化、独立演进,谁也不绑架谁。
provider 采集测试事实、runner 执行真实命令;报告按 decision / collection / execution / scripts 四层分开——策略裁决与证据边界不互相覆盖。测试与辅助文件不进生产度量。
--bloat minhash 膨胀诊断——全部 report-only,不进 gate。--full 组合跳过 diff 前置做全量);test --list 列出已注册 provider,供配置引用。外部插件只消费版本化的 JSON 契约,不解析 .openarch 内部文件:破坏性变更必须 bump version,非破坏字段同版本追加;插件一律读顶层 schema 判断版本,不得用"缺字段即旧版"反推。
contract-catalog-json-v1:context / test-governance / provider-list / rules-facts / docs-check 五份契约的 id、version、status 一览。schema 字段自识别(context-json-v1);readiness 按 enforcing / advisory / optional 分级——code-hook 未装是 ⚠,协调服务未配置是常态。docs-check-json-v1:索引文档、相似候选、未填写模板与处置记录——配合 docs decide 关闭相似候选的处置闭环。governance.persistence 是运行产物是否进 Git 的唯一权威。新项目默认 tracked(团队)。--mode personal 写 local,只在 .git/info/exclude 管理 OpenArch 的 .openarch/ 区块——hook 仍封存证据、执行门禁,但不暂存生成的 baseline/history/审计产物。本地状态随时可用 openarch scan 重建。
它们是机器事实,不是项目依赖——绝不写进 manifest/lockfile。TypeScript 用内置编译器 provider(精确),其余语言按需配置:openarch toolchains 查看,openarch init --toolchains user|project 填绝对路径。工具链不可用时符号级证据 fail-closed(不降级兑底)。符号级 complete 是语言级校准边界:Rust 单 crate 且无 build.rs/workspace/macro/cfg,Go 单 module 且无 go.work/build constraint/生成代码,Java 标准 Maven 布局且无模块/依赖/反射,Python 限 pyright 可解析范围;越界保持 PARTIAL 并保留已收集事实,绝不伪造零。
不是。本地 OpenArch 默认独立工作。只有用户显式执行 openarch init --coordination-url <https://...> 后,远程 Task/会议/语义锁才可用——否则这些操作是 UNAVAILABLE,本地治理照常。地址绝不从 Git remote、目录或环境变量推导。
重跑 openarch init --agent <target>。它会原子替换整个旧 OpenArch Skill 目录,清除退役文件。已安装的 Skill、runtime/plugin 镜像对接入项目是只读输入,发现过期或不匹配时上报上游,不在接入项目内修改。