@mcgrapeng/ccg 3.1.0 → 4.1.0

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.
@@ -0,0 +1,512 @@
1
+ # CCG — Code Change Guardian
2
+
3
+ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](../LICENSE)
4
+ [![Bash](https://img.shields.io/badge/Shell-Bash%203.2%2B-green.svg)]()
5
+ [![Models](https://img.shields.io/badge/Models-27%2B-purple.svg)]()
6
+
7
+ > **CCG(Code Change Guardian)** 是一套多模型代码评审与 Git 工作流守护系统。
8
+ > 两个独立的模型家族守护你代码的每次变更,从评审、提交、合并,到推送——完整四阶段工作流。
9
+
10
+ **其他语言**:[English](../README.md) · [日本語](README.ja.md) · [한국어](README.ko.md)
11
+
12
+ ---
13
+
14
+ ## 目录
15
+
16
+ - [为什么用 CCG](#为什么用-ccg)
17
+ - [安装](#安装)
18
+ - [快速开始](#快速开始)
19
+ - [四阶段能力集](#四阶段能力集)
20
+ - [模型策略](#模型策略)
21
+ - [配置](#配置)
22
+ - [架构](#架构)
23
+ - [文档](#文档)
24
+
25
+ ---
26
+
27
+ ## 为什么用 CCG
28
+
29
+ | 痛点 | CCG 的解法 |
30
+ |---|---|
31
+ | 单模型评审有盲区 | 两个独立模型家族并行评审——浮现它们**不一致**的地方 |
32
+ | 一刀切的模型既浪费又不够用 | 风险感知自动路由:低风险用便宜的,关键代码用顶级的 |
33
+ | Merge 冲突繁琐且容易出错 | **AI 冲突解决(Bailian 主力)**——多重防护,绝不静默丢代码 |
34
+ | Push 决策缺少上下文 | Stage 4 在 push 前生成**图形化质量评分卡** |
35
+ | 评审无法复用 | JSONL ledger 记录每次评审,按路径可查 |
36
+
37
+ ---
38
+
39
+ ## 安装
40
+
41
+ ### npm 安装(推荐)
42
+
43
+ ```bash
44
+ npm install -g @mcgrapeng/ccg
45
+ ```
46
+
47
+ ### 从源码安装
48
+
49
+ ```bash
50
+ git clone https://github.com/mcgrapeng/ccg.git
51
+ cd ccg
52
+ npm link
53
+ ```
54
+
55
+ ### 验证安装
56
+
57
+ ```bash
58
+ ccg --version
59
+ ccg doctor # 检查环境配置
60
+ ccg config # 显示当前配置
61
+ ccg models # 列出所有可用模型
62
+ ```
63
+
64
+ **环境要求:**
65
+ - `bash 3.2+`、`git`、`curl`、`jq`
66
+ - Node.js >= 16
67
+
68
+ **配置 API 密钥(至少一个):**
69
+ ```bash
70
+ # 阿里云百炼(国内推荐,无需翻墙)
71
+ export BAILIAN_API_KEY="sk-xxxx"
72
+
73
+ # Anthropic Claude
74
+ export ANTHROPIC_API_KEY="sk-ant-xxxx"
75
+
76
+ # Google Gemini
77
+ export GEMINI_API_KEY="AIzaSy-xxxx"
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 快速开始
83
+
84
+ ```bash
85
+ # 1. 评审当前改动
86
+ ccg review
87
+
88
+ # 2. 评审门禁通过后自动 commit
89
+ ccg commit "feat: 添加用户认证"
90
+
91
+ # 3. AI 冲突解决合并分支
92
+ ccg merge main
93
+
94
+ # 4. Push 前图形化分析 & 决策
95
+ ccg push origin main
96
+
97
+ # 辅助命令
98
+ ccg config # 显示当前配置
99
+ ccg models # 列出所有可用模型
100
+ ```
101
+
102
+ ---
103
+
104
+ ## 四阶段能力集
105
+
106
+ CCG 围绕四个阶段构建,每个阶段都有明确的目的、模型策略和安全保证。
107
+
108
+ ### Stage 1 — 代码评审(`ccg review`)
109
+
110
+ **目的**:发现 diff 中的 bug、安全问题和质量问题。
111
+
112
+ **模型策略**:
113
+ - **2 个模型并行**(默认 Codex + Bailian)
114
+ - 用户可通过 `CCG_PROVIDERS` 覆盖
115
+ - 模型由当前 `CCG_MODE` 决定(详见[模型策略](#模型策略))
116
+
117
+ **输出**:合成结果分类为:
118
+ - `AGREEMENT` — 两个评审都标记相同问题(高置信度)
119
+ - `DIVERGENCE` — 评审者意见冲突(需要人类判断)
120
+ - `BLINDSPOT` — 一方漏掉了另一方发现的问题(最高价值)
121
+
122
+ **流水线**:
123
+ ```
124
+ git diff → 风险评分 → 模式选择
125
+ → 并行:[Codex 评审 + Bailian 评审]
126
+ → 合成 → AGREEMENT | DIVERGENCE | BLINDSPOT
127
+ ```
128
+
129
+ **安全保证**:
130
+ - Prompt injection 防御(不可信内容标记、每次调用独立 nonce)
131
+ - 大 diff 警告(>200KB 可能超过 context)
132
+ - Cleanup trap(Ctrl+C 杀子进程)
133
+ - 部分失败处理(1/2 成功 → 继续并警告)
134
+
135
+ ---
136
+
137
+ ### Stage 2 — 自动提交(`ccg commit`)
138
+
139
+ **目的**:只有通过评审的代码才进入 git 历史——**不做额外的 LLM 调用**。
140
+
141
+ **🚫 Stage 2 零 LLM 调用**——直接复用 Stage 1 的评审结果(synthesis verdict)。
142
+
143
+ **模型策略**:无。读取上一步的 `.git/ccg/last-review.json`,逐字节校验 diff 哈希,防止改动后偷偷提交。
144
+
145
+ **Verdicts**(继承自 Stage 1):
146
+ | Verdict | 行为 |
147
+ |---|---|
148
+ | `merge` | ✅ 允许 commit |
149
+ | `discuss` | ⚠️ 默认允许(可设 `CCG_GATE_DISCUSS=block` 阻止)|
150
+ | `fix-required` | ❌ 阻止 commit(要求修复重新评审)|
151
+
152
+ **流水线**:
153
+ ```
154
+ staged diff → 计算 SHA256 → 对比 last-review.json 中的哈希
155
+ → 完全匹配 → 读 verdict
156
+ ✅ merge/discuss → 提交
157
+ ❌ fix-required → 拒绝(输出上次评审缺陷)
158
+ → 哈希不匹配 → diff 被篡改,拒绝提交(要求重新评审)
159
+ ```
160
+
161
+ **安全保证**:
162
+ - 提交网关完全确定性:无 API 调用,无超时,无幻觉
163
+ - diff 篡改检测:哈希不匹配立即拒绝
164
+ - 评审一次,可靠执行:不会因为 API 抖动弱化决策
165
+
166
+ ---
167
+
168
+ ### Stage 3 — AI 合并(`ccg merge <target>`)⭐ **核心竞争力**
169
+
170
+ **目的**:专业、可靠地解决合并冲突。
171
+
172
+ **模型策略**:
173
+ - **Bailian 是主要解决器**(代码可靠性最高)
174
+ - 如果 Bailian 失败,降级到 **Codex + Gemini 并行**
175
+ - 全部失败 → `NEEDS_HUMAN_DECISION`
176
+
177
+ **冲突分类**(只有 `content` 进入 AI):
178
+ | 类型 | 处理方式 |
179
+ |---|---|
180
+ | `content` | AI 解决 |
181
+ | `binary` | 转人工 |
182
+ | `submodule` | 转人工 |
183
+ | `symlink` | 转人工 |
184
+ | `delete_modify` | 转人工 |
185
+ | `both_deleted` | 转人工 |
186
+ | `added_one_side` | 转人工 |
187
+ | `both_added` | 转人工 |
188
+
189
+ **流水线**:
190
+ ```
191
+ checkout target → 备份分支 → git merge --no-commit
192
+ ↓ (每个冲突文件)
193
+ 分类 → 解析 <<<<<<< 块
194
+ → Bailian 解决
195
+ ↓ (失败)
196
+ Codex + Gemini 并行
197
+ ↓ (都失败)
198
+ NEEDS_HUMAN_DECISION
199
+ → 校验(无 markdown fence、无冲突标记、内容非空)
200
+ → 原子文件重写(mktemp + mv、保留权限)
201
+ → git add(如解决)
202
+
203
+ commit(如全部干净)| 不 commit(如有需人工)
204
+ ```
205
+
206
+ **安全保证**:
207
+ - 合并前创建备份分支(`ccg-backup/<target>-<时间戳>-<pid>-<rand>`)
208
+ - 工作树不干净、detached HEAD、操作中等 → 拒绝
209
+ - 远端分叉 → 拒绝
210
+ - 每个冲突独立 nonce 防止 OURS/THEIRS 注入
211
+ - 校验解决内容(无 markdown fence、无冲突标记、内容非空)
212
+ - 原子文件替换(`mktemp` + `mv`)
213
+ - 保留文件权限,拒绝写入 symlink
214
+ - **绝不静默丢代码** —— 失败转 NEEDS_HUMAN
215
+ - 实时进度:`[3/12] src/auth.js ... ✅ 已解决`
216
+ - 限制最大冲突数(默认 50,可通过 `CCG_MERGE_MAX_CONFLICTS` 覆盖)
217
+
218
+ ---
219
+
220
+ ### Stage 4 — Push 前分析(`ccg push <remote> <branch>`)
221
+
222
+ **目的**:在 push 前给用户一份全面、图形化的报告——让用户做出明智决定。
223
+
224
+ **模型策略**:使用 Bailian LLM 做风险评分(失败时降级到规则引擎)。
225
+
226
+ **报告内容**:
227
+ ```
228
+ ╔══════════════════════════════════════════════════════════╗
229
+ ║ 🚀 CCG Pre-Push Analysis Report 🚀 ║
230
+ ╚══════════════════════════════════════════════════════════╝
231
+
232
+ 📍 分支 / 远程 / HEAD / 作者 / 时间
233
+
234
+ ┌─ 提交摘要 ─────────────────────────────────────────────┐
235
+ │ Ahead: N 个 / Behind: M 个
236
+ └────────────────────────────────────────────────────────┘
237
+
238
+ 📝 带质量标记的提交(✓ 规范提交 / ⚠ WIP)
239
+
240
+ ┌─ 代码变更 ─────────────────────────────────────────────┐
241
+ │ 文件 / 新增 / 删除 + 视觉条形图
242
+ └────────────────────────────────────────────────────────┘
243
+
244
+ 📂 文件分类:💻 代码 / 🧪 测试 / 📖 文档 / ⚙️ 配置
245
+
246
+ 🚨 检测到敏感文件(.env、*.pem、credentials 等)
247
+
248
+ ┌─ 风险评估 ─────────────────────────────────────────────┐
249
+ │ 评分:🔴 CRITICAL (85) — auth + payment
250
+ │ [████████████████████████████████████████████]
251
+ └────────────────────────────────────────────────────────┘
252
+
253
+ 📊 Push 质量评分卡:
254
+ ✅ 规范的 commit message
255
+ ✅ 代码变更伴随测试
256
+ ❌ 包含敏感文件
257
+ ✅ 与远端同步
258
+ ⚠️ 高风险——需谨慎审查
259
+
260
+ ┌─ 推荐 ─────────────────────────────────────────────────┐
261
+ │ 🔴 NOT RECOMMENDED (3/5 通过)
262
+ └────────────────────────────────────────────────────────┘
263
+
264
+ ┌─ 决策 ─────────────────────────────────────────────────┐
265
+ │ y — push | n — 取消 | d — 查 diff | l — 查 log
266
+ └────────────────────────────────────────────────────────┘
267
+ ```
268
+
269
+ **质量检查项**:
270
+ 1. 规范的 commit message(`feat|fix|chore|...:`)
271
+ 2. 代码变更伴随测试文件更新
272
+ 3. 不包含敏感文件(`.env`、`*.pem`、`credentials` 等)
273
+ 4. 与远端同步(不落后)
274
+ 5. 风险等级可接受(<80)
275
+
276
+ ---
277
+
278
+ ## 模型策略
279
+
280
+ ### 三种模式
281
+
282
+ CCG 基于风险评分自动选择模式,或通过 `CCG_MODE` 强制指定。
283
+
284
+ | 风险评分 | 自动模式 | 策略 |
285
+ |---|---|---|
286
+ | `< 30` | `cost` | 全部使用便宜的 Bailian 模型 |
287
+ | `30 – 70` | `balanced` | Claude/GPT/Gemini 混合(中级)|
288
+ | `> 70` | `quality` | Claude/GPT/Gemini 顶级 |
289
+
290
+ ### 每种模式的模型
291
+
292
+ | 模式 | Codex 槽位 | Claude 槽位 | Gemini 槽位 | Bailian 槽位 |
293
+ |---|---|---|---|---|
294
+ | **`cost`** | `deepseek-v4` | `claude-haiku-4-5` | `qwen-3.7` | `kimi-k2.6` |
295
+ | **`balanced`** | `gpt-5.4` | `claude-sonnet-4-6` | `gemini-2.5-flash` | `qwen-3.6` |
296
+ | **`quality`** | `gpt-5.5` | `claude-opus-4-7` | `gemini-3.5-flash` | `deepseek-v4` |
297
+
298
+ - **Cost 模式**:全 Bailian 平台国产顶级模型(DeepSeek、Qwen、Kimi、GLM、Mimo)
299
+ - **Balanced 模式**:Claude/GPT/Gemini 中级
300
+ - **Quality 模式**:Claude Opus + GPT-5.5 + Gemini-3.5-flash 顶级
301
+
302
+ ### 各阶段的模型使用
303
+
304
+ | 阶段 | 用模型? | 使用哪个 |
305
+ |---|---|---|
306
+ | **Diff Capture** | ❌ | 纯 git 操作 |
307
+ | **Risk Score** | ❌ 默认 | 纯规则、确定性、零成本;`CCG_RISK_LLM=1` 才用 Bailian LLM |
308
+ | **Stage 1: 评审** | ✅ 2 个并行(不同厂商)| 非 quality:两个不同厂商 Bailian(默认 qwen + deepseek);quality:codex/gemini/claude 三选二 |
309
+ | **Synthesize** | ✅ 1 个 | 非 quality:Bailian;quality:三件套里没上场的那个(缺省 claude)|
310
+ | **Stage 2: 提交门禁** | ❌ 0 次 LLM | 复用 Stage 1 verdict(零额外成本)|
311
+ | **Stage 3: Merge 冲突** | ✅ **Bailian 优先** | Claude → Codex + Gemini 作为降级 |
312
+ | **Stage 4: Push 检查** | ❌ 默认 | 风险评分(纯规则,同 Risk Score)|
313
+
314
+ ### 可用的 Bailian 模型
315
+
316
+ | 模型 | 等级 | 输入 ¥/1M | 输出 ¥/1M | 说明 |
317
+ |---|---|---|---|---|
318
+ | `qwen-3.7` | quality | 0.30 | 0.90 | 最新 Qwen |
319
+ | `deepseek-v4` | quality | 0.35 | 1.05 | 顶级推理 |
320
+ | `kimi-k2.6` | quality | 0.32 | 0.96 | 长上下文 |
321
+ | `glm-5.1` | quality | 0.28 | 0.84 | 多模态 |
322
+ | `qwen-3.6` | balanced | 0.25 | 0.75 | |
323
+ | `mimo-v2.5-pro` | balanced | 0.22 | 0.66 | |
324
+ | `qwen-3.6-plus` | balanced | 0.20 | 0.60 | |
325
+ | `qwen-3.5-sonnet` | balanced | 0.15 | 0.45 | |
326
+ | `deepseek-v4-lite` | balanced | 0.18 | 0.54 | |
327
+ | `kimi-k2.6-lite` | balanced | 0.16 | 0.48 | |
328
+ | `glm-5.1-lite` | balanced | 0.14 | 0.42 | |
329
+ | `mimo-v2.5` | cost | 0.11 | 0.33 | |
330
+ | `qwen-3.5-haiku` | cost | 0.05 | 0.15 | 最便宜 |
331
+
332
+ ---
333
+
334
+ ## 配置
335
+
336
+ ### 环境变量
337
+
338
+ | 变量 | 默认值 | 说明 |
339
+ |---|---|---|
340
+ | **开关 / 模式** | | |
341
+ | `CCG_MODE` | auto | `cost` / `balanced` / `quality` |
342
+ | `CCG_REVIEW` | `on` | 主开关:`on` / `off`(关闭时 `ccg review` 为空操作,`ccg commit` 跳过状态检查)|
343
+ | `CCG_PROVIDERS` | auto(按模式)| Stage 1 的提供商(最多 2 个并行)。quality: codex+gemini, cost/balanced: bailian 对。Claude 默认保留给综合步骤。|
344
+ | **提供商模型** | | |
345
+ | `CCG_CODEX_MODEL` | 按模式 | 覆盖 Codex 模型 |
346
+ | `CCG_CLAUDE_MODEL` | 按模式 | 覆盖 Claude 模型 |
347
+ | `CCG_GEMINI_MODEL` | 按模式 | 覆盖 Gemini 模型 |
348
+ | `CCG_BAILIAN_MODEL` | 按模式 | 覆盖 Bailian 模型 |
349
+ | `CCG_DEEPSEEK_MODEL` | 按模式 | 覆盖 DeepSeek 模型 |
350
+ | `CCG_KIMI_MODEL` | 按模式 | 覆盖 Kimi 模型 |
351
+ | `CCG_GLM_MODEL` | 按模式 | 覆盖 GLM 模型 |
352
+ | `CCG_MINIMAX_MODEL` | 按模式 | 覆盖 MiniMax 模型 |
353
+ | `CCG_MIMO_MODEL` | 按模式 | 覆盖 Mimo 模型 |
354
+ | **API 密钥** | | |
355
+ | `BAILIAN_API_KEY` | — | Bailian(阿里云)API 密钥 |
356
+ | `ANTHROPIC_API_KEY` / `CLAUDE_API_KEY` | — | Anthropic API 密钥 |
357
+ | `GEMINI_API_KEY` | — | Google Gemini API 密钥 |
358
+ | `DEEPSEEK_API_KEY` | — | DeepSeek 官方 API 密钥 |
359
+ | `KIMI_API_KEY` | — | Kimi(月之暗面)官方 API 密钥 |
360
+ | `GLM_API_KEY` | — | GLM(智谱)官方 API 密钥 |
361
+ | `MINIMAX_API_KEY` | — | MiniMax 官方 API 密钥 |
362
+ | `MIMO_API_KEY` | — | Mimo 官方 API 密钥 |
363
+ | **自定义端点(代理)** | | |
364
+ | `CCG_CODEX_BASE_URL` / `OPENAI_BASE_URL` | OpenAI | Codex / OpenAI 代理 URL |
365
+ | `CCG_CLAUDE_BASE_URL` / `ANTHROPIC_BASE_URL` | api.anthropic.com | Claude 代理 URL |
366
+ | `CCG_GEMINI_BASE_URL` / `GEMINI_BASE_URL` | Google | Gemini 代理 URL |
367
+ | `CCG_BAILIAN_BASE_URL` | dashscope.aliyuncs.com | Bailian 代理 URL |
368
+ | `CCG_DEEPSEEK_BASE_URL` | api.deepseek.com/v1 | DeepSeek 官方 API URL |
369
+ | `CCG_KIMI_BASE_URL` | api.moonshot.cn/v1 | Kimi 官方 API URL |
370
+ | `CCG_GLM_BASE_URL` | open.bigmodel.cn/api/paas/v4 | GLM 官方 API URL |
371
+ | `CCG_MINIMAX_BASE_URL` | api.minimax.chat/v1 | MiniMax 官方 API URL |
372
+ | `CCG_MIMO_BASE_URL` | — | Mimo 官方 API URL(必填)|
373
+ | **超时 / 参数** | | |
374
+ | `CCG_CODEX_TIMEOUT` | 240 | Codex 超时(秒)|
375
+ | `CCG_GEMINI_TIMEOUT` | 120 | Gemini 超时(秒)|
376
+ | `CCG_BAILIAN_TIMEOUT` | 120 | Bailian 超时(秒)|
377
+ | `CCG_CLAUDE_TIMEOUT` | 120 | Claude 超时(秒)|
378
+ | `CCG_DEEPSEEK_TIMEOUT` | 120 | DeepSeek 超时(秒)|
379
+ | `CCG_KIMI_TIMEOUT` | 120 | Kimi 超时(秒)|
380
+ | `CCG_GLM_TIMEOUT` | 120 | GLM 超时(秒)|
381
+ | `CCG_MINIMAX_TIMEOUT` | 120 | MiniMax 超时(秒)|
382
+ | `CCG_MIMO_TIMEOUT` | 120 | Mimo 超时(秒)|
383
+ | `CCG_BAILIAN_TEMP` | 0.7 | Bailian 温度 |
384
+ | `CCG_BAILIAN_MAX_TOKENS` | 4096 | Bailian 最大 token 数 |
385
+ | `CCG_BAILIAN_RETRIES` | 3 | Bailian 重试次数 |
386
+ | `CCG_CLAUDE_RETRIES` | 3 | Claude 重试次数 |
387
+ | **门禁 / 提交** | | |
388
+ | `CCG_GATE_OFFLINE` | 0 | 设为 1 跳过 Stage 2 评审 |
389
+ | `CCG_GATE_DISCUSS` | allow | 设为 `block` 阻止 discuss verdict |
390
+ | `CCG_NO_AUTO_ADD` | 0 | Stage 2:跳过自动 `git add -A`,仅使用已暂存内容 |
391
+ | `CCG_COMMIT_FORCE` | 0 | Stage 2:绕过 diff 哈希检查(强制提交)|
392
+ | `CCG_AUTOCOMMIT_ALL` | 0 | 自动提交所有更改(包括未跟踪文件)|
393
+ | `CCG_AUTOCOMMIT_DRY_RUN` | 0 | 自动提交干跑模式 |
394
+ | `CCG_DIFF_CACHED_ONLY` | 0 | 仅使用缓存的 diff |
395
+ | **合并** | | |
396
+ | `CCG_MERGE_DRY_RUN` | 0 | Stage 3:解决但不 commit |
397
+ | `CCG_MERGE_NO_AI` | 0 | Stage 3:跳过 AI 解决 |
398
+ | `CCG_MERGE_NO_FETCH` | 0 | Stage 3:跳过远程 fetch |
399
+ | `CCG_MERGE_MAX_CONFLICTS` | 50 | Stage 3:最大冲突文件数 |
400
+ | `CCG_MERGE_KEEP_BACKUP` | 0 | Stage 3:成功后保留备份分支 |
401
+ | **缓存 / 账本 / 报告** | | |
402
+ | `CCG_NO_CACHE` | 0 | 禁用 prompt 缓存 |
403
+ | `CCG_CACHE_TTL_HOURS` | 24 | Prompt 缓存 TTL |
404
+ | `CCG_CACHE_DIR` | XDG 默认 | 自定义缓存目录 |
405
+ | `CCG_MAX_PROMPT_KB` | 100 | 最大 prompt 大小(KB)|
406
+ | `CCG_USAGE_LOG` | XDG 默认 | 自定义用量日志路径 |
407
+ | `CCG_LEDGER_LOG` | XDG 默认 | 自定义账本日志路径 |
408
+ | `CCG_LEDGER_MAX_LINES` | 10000 | 账本最大行数(超过后轮转)|
409
+ | `CCG_NO_HISTORY` | 0 | 禁用评审历史注入 |
410
+ | `CCG_HISTORY_MAX` | 3 | 注入的历史评审最大数量 |
411
+ | `CCG_NO_REPORT` | 0 | 禁用报告持久化 |
412
+ | `CCG_REPORT_DIR` | .ccg/reports | 自定义报告目录 |
413
+ | `CCG_KEEP_ARTIFACTS` | 0 | 保留 workdir 用于调试 |
414
+ | **其他** | | |
415
+ | `CCG_ALLOW_SAME_VENDOR` | 0 | 允许 Stage 1 使用相同供应商 |
416
+ | `CCG_SYNTH_PROVIDER` | auto | 覆盖综合器提供商 |
417
+ | `CCG_RISK_LLM` | 0 | 启用基于 LLM 的风险评分 |
418
+
419
+ ### 使用示例
420
+
421
+ ```bash
422
+ # 关键评审强制 quality 模式
423
+ CCG_MODE=quality ccg review
424
+
425
+ # 仅使用 Bailian(国内友好)
426
+ CCG_PROVIDERS="bailian" ccg review
427
+
428
+ # 指定 Bailian 模型
429
+ CCG_BAILIAN_MODEL=deepseek-v4 ccg review
430
+
431
+ # 使用 DeepSeek 官方 API
432
+ DEEPSEEK_API_KEY="sk-xxx" CCG_PROVIDERS="deepseek" ccg review
433
+
434
+ # 使用 Kimi(月之暗面)官方 API
435
+ KIMI_API_KEY="sk-xxx" CCG_PROVIDERS="kimi" ccg review
436
+
437
+ # 使用 GLM(智谱)官方 API
438
+ GLM_API_KEY="xxx.xxx" CCG_PROVIDERS="glm" ccg review
439
+
440
+ # 使用 MiniMax 官方 API
441
+ MINIMAX_API_KEY="xxx" CCG_PROVIDERS="minimax" ccg review
442
+
443
+ # 使用 Mimo 官方 API(需要自定义 base URL)
444
+ MIMO_API_KEY="sk-xxx" CCG_MIMO_BASE_URL="https://api.mimo.com/v1" CCG_PROVIDERS="mimo" ccg review
445
+
446
+ # 混合独立提供商(不同厂商)
447
+ DEEPSEEK_API_KEY="sk-xxx" KIMI_API_KEY="sk-xxx" CCG_PROVIDERS="deepseek kimi" ccg review
448
+
449
+ # 干跑 merge(解决但不 commit)
450
+ CCG_MERGE_DRY_RUN=1 ccg merge main
451
+
452
+ # 跳过 AI merge(仅检测冲突)
453
+ CCG_MERGE_NO_AI=1 ccg merge main
454
+ ```
455
+
456
+ ---
457
+
458
+ ## 架构
459
+
460
+ ```
461
+ ccg/
462
+ ├── ccg # 入口(4 行委托)
463
+ ├── ccg.sh # 核心引擎(~3000 行)
464
+ │ ├── _ccg_xdg_* / _ccg_vcs_* # XDG 路径 + git 抽象
465
+ │ ├── ccg_init / ccg_preflight # workdir 初始化
466
+ │ ├── ccg_diff_capture # 4 层 diff fallback
467
+ │ ├── ccg_risk_score # Bailian LLM + 规则引擎
468
+ │ ├── ccg_codex / ccg_gemini # 提供商执行器
469
+ │ ├── _ccg_bailian_retry # Bailian 带重试/退避
470
+ │ ├── ccg_synthesize # AGREEMENT/DIVERGENCE/BLINDSPOT
471
+ │ ├── ccg_precommit_gate # Stage 2 提交门禁
472
+ │ └── ccg_merge # Stage 3 AI 合并
473
+ │ ├── _ccg_classify_conflict # content/binary/submodule/...
474
+ │ ├── _ccg_parse_conflicts # 提取 <<<<<<<>>>>>>> 块
475
+ │ ├── _ccg_resolve_one_conflict # Bailian 优先的 AI 解决
476
+ │ └── _ccg_apply_resolutions # 原子文件重写
477
+ ├── ccg-bailian-models.sh # 13 个模型的 Bailian 注册表
478
+ ├── ccg-bailian-integration.sh # Bailian API 调用辅助
479
+ ├── ccg-multi-provider.sh # 多提供商编排
480
+ ├── ccg-workflow.sh # 4 阶段工作流入口
481
+ └── ccg.md # Claude Code slash command 规范
482
+
483
+ docs/
484
+ ├── README.zh-CN.md / .ja.md / .ko.md # 翻译
485
+ ├── ARCHITECTURE.md(+ 3 个翻译) # 架构深度
486
+ └── CHANGELOG.md # 版本历史
487
+ ```
488
+
489
+ ### 存储路径(遵循 XDG 规范)
490
+
491
+ | 路径 | 内容 |
492
+ |---|---|
493
+ | `$XDG_DATA_HOME/ccg/usage.log` | Token 用量 + 成本日志 |
494
+ | `$XDG_DATA_HOME/ccg/ledger.jsonl` | 按评审的 JSONL ledger |
495
+ | `$XDG_CACHE_HOME/ccg/cache/` | Prompt hash → 结果缓存(24h TTL)|
496
+ | `$XDG_CONFIG_HOME/ccg/` | 用户配置 |
497
+
498
+ 旧版 `~/.ccg/*` 首次运行时自动迁移。
499
+
500
+ ---
501
+
502
+ ## 文档
503
+
504
+ - [架构深度解析](ARCHITECTURE.zh-CN.md)([English](ARCHITECTURE.md) · [日本語](ARCHITECTURE.ja.md) · [한국어](ARCHITECTURE.ko.md))
505
+ - [更新日志](CHANGELOG.md)
506
+ - [Slash command 规范](../ccg.md) — Claude Code `/ccg` 命令
507
+
508
+ ---
509
+
510
+ ## 许可证
511
+
512
+ MIT
package/package.json CHANGED
@@ -1,12 +1,17 @@
1
1
  {
2
2
  "name": "@mcgrapeng/ccg",
3
- "version": "3.1.0",
4
- "description": "Code Divergence Detector for Claude Code runs Codex + Gemini in parallel on the same diff and surfaces where they disagree.",
3
+ "version": "4.1.0",
4
+ "description": "Code Change Guardian — a multi-model code review and Git workflow automation CLI for Claude Code: divergence-aware review, risk-aware model routing, AI merge-conflict resolution, and a graphical pre-push gate.",
5
5
  "keywords": [
6
6
  "claude-code",
7
7
  "code-review",
8
+ "git-workflow",
9
+ "merge-conflict-resolution",
10
+ "pre-push",
11
+ "risk-aware",
8
12
  "codex",
9
13
  "gemini",
14
+ "bailian",
10
15
  "ai",
11
16
  "slash-command",
12
17
  "cli",
@@ -23,6 +28,10 @@
23
28
  },
24
29
  "license": "MIT",
25
30
  "author": "mcgrapeng",
31
+ "private": false,
32
+ "bin": {
33
+ "ccg": "./bin/ccg.js"
34
+ },
26
35
  "type": "commonjs",
27
36
  "engines": {
28
37
  "node": ">=16"
@@ -31,24 +40,8 @@
31
40
  "darwin",
32
41
  "linux"
33
42
  ],
34
- "bin": {
35
- "ccg": "bin/ccg.js"
36
- },
37
- "main": "bin/ccg.js",
38
- "files": [
39
- "bin/",
40
- "ccg.sh",
41
- "ccg.md",
42
- "scripts/",
43
- "LICENSE",
44
- "README.md",
45
- "README.zh-CN.md",
46
- "README.ja.md",
47
- "README.ko.md",
48
- "CHANGELOG.md"
49
- ],
50
43
  "scripts": {
51
- "test": "bash tests/test_ccg.sh",
52
- "lint:sh": "shellcheck ccg.sh scripts/install.sh || true"
44
+ "test": "for t in tests/test_*.sh; do echo \"== $t ==\"; bash \"$t\" || exit 1; done",
45
+ "lint:sh": "shellcheck ccg.sh ccg-workflow.sh ccg-multi-provider.sh ccg-bailian-models.sh ccg-bailian-integration.sh scripts/install.sh || true"
53
46
  }
54
47
  }