ccgx-workflow 1.0.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.
- package/LICENSE +22 -0
- package/README.md +469 -0
- package/README.zh-CN.md +466 -0
- package/bin/ccg.mjs +2 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.mjs +173 -0
- package/dist/index.d.mts +1774 -0
- package/dist/index.d.ts +1774 -0
- package/dist/index.mjs +2029 -0
- package/dist/shared/ccgx-workflow.WgUzkiC3.mjs +5248 -0
- package/package.json +129 -0
- package/templates/commands/agents/assumptions-analyzer.md +129 -0
- package/templates/commands/agents/code-fixer.md +292 -0
- package/templates/commands/agents/codebase-mapper.md +152 -0
- package/templates/commands/agents/debug-session-manager.md +247 -0
- package/templates/commands/agents/debugger.md +111 -0
- package/templates/commands/agents/eval-auditor.md +171 -0
- package/templates/commands/agents/framework-selector.md +152 -0
- package/templates/commands/agents/get-current-datetime.md +29 -0
- package/templates/commands/agents/init-architect.md +114 -0
- package/templates/commands/agents/integration-checker.md +163 -0
- package/templates/commands/agents/interface-auditor.md +170 -0
- package/templates/commands/agents/nyquist-auditor.md +131 -0
- package/templates/commands/agents/pattern-mapper.md +111 -0
- package/templates/commands/agents/phase-runner.md +321 -0
- package/templates/commands/agents/plan-checker.md +255 -0
- package/templates/commands/agents/planner.md +320 -0
- package/templates/commands/agents/team-architect.md +186 -0
- package/templates/commands/agents/team-qa.md +121 -0
- package/templates/commands/agents/team-reviewer.md +157 -0
- package/templates/commands/agents/ui-ux-designer.md +573 -0
- package/templates/commands/agents/verifier.md +274 -0
- package/templates/commands/analyze.md +210 -0
- package/templates/commands/autonomous.md +792 -0
- package/templates/commands/cancel.md +132 -0
- package/templates/commands/clean-branches.md +117 -0
- package/templates/commands/codex-exec.md +404 -0
- package/templates/commands/commit.md +151 -0
- package/templates/commands/context.md +332 -0
- package/templates/commands/debate.md +165 -0
- package/templates/commands/debug.md +226 -0
- package/templates/commands/enhance.md +64 -0
- package/templates/commands/execute.md +380 -0
- package/templates/commands/init.md +123 -0
- package/templates/commands/optimize.md +217 -0
- package/templates/commands/plan.md +373 -0
- package/templates/commands/result.md +106 -0
- package/templates/commands/review.md +338 -0
- package/templates/commands/rollback.md +116 -0
- package/templates/commands/spec-impl.md +139 -0
- package/templates/commands/spec-init.md +101 -0
- package/templates/commands/spec-plan.md +210 -0
- package/templates/commands/spec-research.md +152 -0
- package/templates/commands/spec-review.md +120 -0
- package/templates/commands/status.md +206 -0
- package/templates/commands/team-exec.md +265 -0
- package/templates/commands/test.md +236 -0
- package/templates/commands/verify-work.md +338 -0
- package/templates/commands/verify.md +66 -0
- package/templates/commands/workflow.md +190 -0
- package/templates/commands/worktree.md +128 -0
- package/templates/hooks/ccg-context-monitor.js +159 -0
- package/templates/hooks/ccg-session-state.cjs +510 -0
- package/templates/hooks/ccg-statusline.js +142 -0
- package/templates/output-styles/abyss-command.md +56 -0
- package/templates/output-styles/abyss-concise.md +89 -0
- package/templates/output-styles/abyss-cultivator.md +302 -0
- package/templates/output-styles/abyss-ritual.md +70 -0
- package/templates/output-styles/engineer-professional.md +89 -0
- package/templates/output-styles/laowang-engineer.md +127 -0
- package/templates/output-styles/nekomata-engineer.md +120 -0
- package/templates/output-styles/ojousama-engineer.md +121 -0
- package/templates/prompts/claude/analyzer.md +59 -0
- package/templates/prompts/claude/architect.md +54 -0
- package/templates/prompts/claude/debugger.md +71 -0
- package/templates/prompts/claude/optimizer.md +73 -0
- package/templates/prompts/claude/reviewer.md +63 -0
- package/templates/prompts/claude/tester.md +69 -0
- package/templates/prompts/codex/analyzer.md +58 -0
- package/templates/prompts/codex/architect.md +54 -0
- package/templates/prompts/codex/debugger.md +74 -0
- package/templates/prompts/codex/optimizer.md +81 -0
- package/templates/prompts/codex/reviewer.md +73 -0
- package/templates/prompts/codex/tester.md +62 -0
- package/templates/prompts/gemini/analyzer.md +61 -0
- package/templates/prompts/gemini/architect.md +55 -0
- package/templates/prompts/gemini/debugger.md +78 -0
- package/templates/prompts/gemini/frontend.md +64 -0
- package/templates/prompts/gemini/optimizer.md +84 -0
- package/templates/prompts/gemini/reviewer.md +80 -0
- package/templates/prompts/gemini/tester.md +68 -0
- package/templates/rules/ccg-skill-routing.md +83 -0
- package/templates/rules/ccg-skills.md +71 -0
- package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -0
- package/templates/scripts/invoke-model.mjs +949 -0
- package/templates/scripts/repatch-gemini-plugin.mjs +194 -0
- package/templates/skills/SKILL.md +92 -0
- package/templates/skills/domains/ai/SKILL.md +35 -0
- package/templates/skills/domains/ai/agent-dev.md +242 -0
- package/templates/skills/domains/ai/llm-security.md +288 -0
- package/templates/skills/domains/ai/prompt-and-eval.md +279 -0
- package/templates/skills/domains/ai/rag-system.md +542 -0
- package/templates/skills/domains/architecture/SKILL.md +43 -0
- package/templates/skills/domains/architecture/api-design.md +225 -0
- package/templates/skills/domains/architecture/caching.md +299 -0
- package/templates/skills/domains/architecture/cloud-native.md +285 -0
- package/templates/skills/domains/architecture/message-queue.md +329 -0
- package/templates/skills/domains/architecture/security-arch.md +297 -0
- package/templates/skills/domains/data-engineering/SKILL.md +208 -0
- package/templates/skills/domains/development/SKILL.md +47 -0
- package/templates/skills/domains/development/cpp.md +246 -0
- package/templates/skills/domains/development/go.md +323 -0
- package/templates/skills/domains/development/java.md +277 -0
- package/templates/skills/domains/development/python.md +288 -0
- package/templates/skills/domains/development/rust.md +313 -0
- package/templates/skills/domains/development/shell.md +313 -0
- package/templates/skills/domains/development/typescript.md +277 -0
- package/templates/skills/domains/devops/SKILL.md +40 -0
- package/templates/skills/domains/devops/cost-optimization.md +272 -0
- package/templates/skills/domains/devops/database.md +217 -0
- package/templates/skills/domains/devops/devsecops.md +198 -0
- package/templates/skills/domains/devops/git-workflow.md +181 -0
- package/templates/skills/domains/devops/observability.md +280 -0
- package/templates/skills/domains/devops/performance.md +336 -0
- package/templates/skills/domains/devops/testing.md +283 -0
- package/templates/skills/domains/frontend-design/SKILL.md +244 -0
- package/templates/skills/domains/frontend-design/agents/openai.yaml +4 -0
- package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -0
- package/templates/skills/domains/frontend-design/claymorphism/references/tokens.css +52 -0
- package/templates/skills/domains/frontend-design/component-patterns.md +202 -0
- package/templates/skills/domains/frontend-design/engineering.md +287 -0
- package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -0
- package/templates/skills/domains/frontend-design/glassmorphism/references/tokens.css +32 -0
- package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -0
- package/templates/skills/domains/frontend-design/liquid-glass/references/tokens.css +81 -0
- package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -0
- package/templates/skills/domains/frontend-design/neubrutalism/references/tokens.css +44 -0
- package/templates/skills/domains/frontend-design/reference/color-and-contrast.md +132 -0
- package/templates/skills/domains/frontend-design/reference/interaction-design.md +195 -0
- package/templates/skills/domains/frontend-design/reference/motion-design.md +99 -0
- package/templates/skills/domains/frontend-design/reference/responsive-design.md +114 -0
- package/templates/skills/domains/frontend-design/reference/spatial-design.md +100 -0
- package/templates/skills/domains/frontend-design/reference/typography.md +133 -0
- package/templates/skills/domains/frontend-design/reference/ux-writing.md +107 -0
- package/templates/skills/domains/frontend-design/state-management.md +680 -0
- package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -0
- package/templates/skills/domains/frontend-design/ux-principles.md +156 -0
- package/templates/skills/domains/infrastructure/SKILL.md +201 -0
- package/templates/skills/domains/mobile/SKILL.md +225 -0
- package/templates/skills/domains/orchestration/SKILL.md +30 -0
- package/templates/skills/domains/orchestration/multi-agent.md +263 -0
- package/templates/skills/domains/security/SKILL.md +73 -0
- package/templates/skills/domains/security/blue-team.md +436 -0
- package/templates/skills/domains/security/code-audit.md +265 -0
- package/templates/skills/domains/security/pentest.md +226 -0
- package/templates/skills/domains/security/red-team.md +374 -0
- package/templates/skills/domains/security/threat-intel.md +372 -0
- package/templates/skills/domains/security/vuln-research.md +369 -0
- package/templates/skills/impeccable/adapt/SKILL.md +201 -0
- package/templates/skills/impeccable/animate/SKILL.md +176 -0
- package/templates/skills/impeccable/arrange/SKILL.md +126 -0
- package/templates/skills/impeccable/audit/SKILL.md +149 -0
- package/templates/skills/impeccable/bolder/SKILL.md +118 -0
- package/templates/skills/impeccable/clarify/SKILL.md +185 -0
- package/templates/skills/impeccable/colorize/SKILL.md +144 -0
- package/templates/skills/impeccable/critique/SKILL.md +203 -0
- package/templates/skills/impeccable/critique/reference/cognitive-load.md +106 -0
- package/templates/skills/impeccable/critique/reference/heuristics-scoring.md +234 -0
- package/templates/skills/impeccable/critique/reference/personas.md +178 -0
- package/templates/skills/impeccable/delight/SKILL.md +305 -0
- package/templates/skills/impeccable/distill/SKILL.md +123 -0
- package/templates/skills/impeccable/extract/SKILL.md +94 -0
- package/templates/skills/impeccable/harden/SKILL.md +357 -0
- package/templates/skills/impeccable/normalize/SKILL.md +72 -0
- package/templates/skills/impeccable/onboard/SKILL.md +248 -0
- package/templates/skills/impeccable/optimize/SKILL.md +268 -0
- package/templates/skills/impeccable/overdrive/SKILL.md +143 -0
- package/templates/skills/impeccable/polish/SKILL.md +205 -0
- package/templates/skills/impeccable/quieter/SKILL.md +104 -0
- package/templates/skills/impeccable/teach-impeccable/SKILL.md +72 -0
- package/templates/skills/impeccable/typeset/SKILL.md +117 -0
- package/templates/skills/orchestration/multi-agent/SKILL.md +533 -0
- package/templates/skills/run_skill.js +129 -0
- package/templates/skills/scrapling/SKILL.md +98 -0
- package/templates/skills/scrapling/references/api-quick-ref.md +127 -0
- package/templates/skills/scrapling/references/cookie-vault.md +56 -0
- package/templates/skills/scrapling/references/maintenance.md +79 -0
- package/templates/skills/scrapling/references/site-patterns.md +86 -0
- package/templates/skills/scrapling/references/troubleshooting.md +95 -0
- package/templates/skills/scrapling/templates/basic_fetch.py +19 -0
- package/templates/skills/scrapling/templates/parse_only.py +15 -0
- package/templates/skills/scrapling/templates/session_login.py +19 -0
- package/templates/skills/scrapling/templates/stealth_cloudflare.py +28 -0
- package/templates/skills/tools/extract-learnings/SKILL.md +77 -0
- package/templates/skills/tools/forensics/SKILL.md +89 -0
- package/templates/skills/tools/gen-docs/SKILL.md +116 -0
- package/templates/skills/tools/gen-docs/scripts/doc_generator.js +435 -0
- package/templates/skills/tools/health/SKILL.md +121 -0
- package/templates/skills/tools/lib/shared.js +98 -0
- package/templates/skills/tools/map-codebase/SKILL.md +118 -0
- package/templates/skills/tools/override-refusal/SKILL.md +53 -0
- package/templates/skills/tools/override-refusal/agents/openai.yaml +4 -0
- package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -0
- package/templates/skills/tools/verify-change/SKILL.md +143 -0
- package/templates/skills/tools/verify-change/scripts/change_analyzer.js +289 -0
- package/templates/skills/tools/verify-module/SKILL.md +130 -0
- package/templates/skills/tools/verify-module/scripts/module_scanner.js +171 -0
- package/templates/skills/tools/verify-quality/SKILL.md +163 -0
- package/templates/skills/tools/verify-quality/scripts/quality_checker.js +337 -0
- package/templates/skills/tools/verify-security/SKILL.md +146 -0
- package/templates/skills/tools/verify-security/scripts/security_scanner.js +283 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: '多模型测试生成:智能路由 {{BACKEND_PRIMARY}} 后端测试 / {{FRONTEND_PRIMARY}} 前端测试'
|
|
3
|
+
argument-hint: "<测试目标> [--role=architect|critic|implementer|tester|writer]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Test - 多模型测试生成
|
|
7
|
+
|
|
8
|
+
根据代码类型智能路由,生成高质量测试用例。
|
|
9
|
+
|
|
10
|
+
## 使用方法
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
/test <测试目标> [--role=<name>]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Role-based routing(v4.1 specialist matrix)
|
|
17
|
+
|
|
18
|
+
可选 `--role=<name>` 叠加 role 维度路由(默认 `tester`,可显式覆盖):
|
|
19
|
+
|
|
20
|
+
| Role × Layer | architect | critic | implementer | tester | writer |
|
|
21
|
+
| ------------- | -------------- | ------------------- | ----------- | ------------- | --------------- |
|
|
22
|
+
| **backend** | codex/architect.md | codex/reviewer.md (adversarial) | codex/architect.md | codex/tester.md | claude |
|
|
23
|
+
| **frontend** | gemini/architect.md | gemini/reviewer.md (adversarial) | gemini/architect.md | gemini/tester.md | gemini/analyzer.md |
|
|
24
|
+
| **fullstack** | codex+gemini/architect.md | both reviewer.md (adversarial) | runner 决(per-file) | runner 决(per-file) | claude |
|
|
25
|
+
|
|
26
|
+
**未传 --role 时按 v4.0 智能路由(后端 → {{BACKEND_PRIMARY}}/tester.md,前端 → {{FRONTEND_PRIMARY}}/tester.md,全栈并行),完全兼容**。`--role=critic` 触发"测试用例反例挖掘"——专门构造打破现有测试假设的边界条件。详见 `src/utils/specialist-router.ts`。
|
|
27
|
+
|
|
28
|
+
## 上下文
|
|
29
|
+
|
|
30
|
+
- 测试目标:$ARGUMENTS
|
|
31
|
+
- 智能路由:后端 → {{BACKEND_PRIMARY}},前端 → {{FRONTEND_PRIMARY}},全栈 → 并行
|
|
32
|
+
- 遵循项目现有测试框架和风格
|
|
33
|
+
|
|
34
|
+
## 你的角色
|
|
35
|
+
|
|
36
|
+
你是**测试工程师**,编排测试生成流程:
|
|
37
|
+
- **{{BACKEND_PRIMARY}}** – 后端测试生成(**后端权威**)
|
|
38
|
+
- **{{FRONTEND_PRIMARY}}** – 前端测试生成(**前端权威**)
|
|
39
|
+
- **Claude (自己)** – 整合测试、验证运行
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 调用通道路由(v4.1 Phase 20,CCG codeagent 退役)
|
|
44
|
+
|
|
45
|
+
CCG v4.1 把双模型并行通道从 `Bash(codeagent-wrapper)` **默认切换**为 plugin spawn:
|
|
46
|
+
|
|
47
|
+
1. **优先 plugin spawn**(默认):装了 `codex@openai-codex` + `gemini@google-gemini` plugin → 用 `Agent(subagent_type="codex:codex-rescue")` + `Agent(subagent_type="gemini:gemini-rescue")` 并行,主线接 ≤200 token 摘要。
|
|
48
|
+
2. **降级 codeagent-wrapper**(v4.0 BC fallback):plugin 未装 → fallback 到 Bash 调用,行为与 v4.0 完全一致。
|
|
49
|
+
|
|
50
|
+
**判定**:preflight `Bash` 跑 `ls ~/.claude/plugins/` 看有无 `codex@*` / `gemini@*` 子目录。helper 见 `src/utils/plugin-detection.ts`。
|
|
51
|
+
|
|
52
|
+
⚠️ Test 命令在主线 context 内,**允许** `Agent(...)`——与 subagent "禁止嵌套 spawn" 约束不冲突。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 多模型调用规范
|
|
57
|
+
|
|
58
|
+
**工作目录**:
|
|
59
|
+
- `{{WORKDIR}}`:**必须通过 Bash 执行 `pwd`(Unix)或 `cd`(Windows CMD)获取当前工作目录的绝对路径**,禁止从 `$HOME` 或环境变量推断
|
|
60
|
+
- 如果用户通过 `/add-dir` 添加了多个工作区,先用 Glob/Grep 确定任务相关的工作区
|
|
61
|
+
- 如果无法确定,用 `AskUserQuestion` 询问用户选择目标工作区
|
|
62
|
+
|
|
63
|
+
**调用语法**(v4.1 Phase 20 双通道):
|
|
64
|
+
|
|
65
|
+
**通道 A — plugin spawn(默认)**:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
Agent({
|
|
69
|
+
subagent_type: "<codex:codex-rescue|gemini:gemini-rescue>",
|
|
70
|
+
description: "Test: <backend|frontend>",
|
|
71
|
+
prompt: `ROLE_FILE: <角色提示词路径>
|
|
72
|
+
|
|
73
|
+
<TASK>
|
|
74
|
+
需求:为以下代码生成测试
|
|
75
|
+
<代码内容>
|
|
76
|
+
需求描述:<增强后的需求(如未增强则用 $ARGUMENTS)>
|
|
77
|
+
要求:
|
|
78
|
+
1. 使用项目现有测试框架
|
|
79
|
+
2. 覆盖正常路径、边界条件、异常处理
|
|
80
|
+
</TASK>
|
|
81
|
+
|
|
82
|
+
OUTPUT: 完整测试代码
|
|
83
|
+
Return ≤200 token structured summary (plugin-native protocol).
|
|
84
|
+
`
|
|
85
|
+
})
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
并行**两个 Agent 在同一 message 内同时 spawn**。
|
|
89
|
+
|
|
90
|
+
**通道 B — codeagent-wrapper fallback**(plugin 未装时降级,并行用 `run_in_background: true`):
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
Bash({
|
|
94
|
+
command: "~/.claude/bin/codeagent-wrapper {{LITE_MODE_FLAG}}--progress --backend <{{BACKEND_PRIMARY}}|{{FRONTEND_PRIMARY}}> {{GEMINI_MODEL_FLAG}}- \"{{WORKDIR}}\" <<'EOF'
|
|
95
|
+
ROLE_FILE: <角色提示词路径>
|
|
96
|
+
<TASK>
|
|
97
|
+
需求:为以下代码生成测试
|
|
98
|
+
<代码内容>
|
|
99
|
+
需求描述:<增强后的需求(如未增强则用 $ARGUMENTS)>
|
|
100
|
+
要求:
|
|
101
|
+
1. 使用项目现有测试框架
|
|
102
|
+
2. 覆盖正常路径、边界条件、异常处理
|
|
103
|
+
</TASK>
|
|
104
|
+
OUTPUT: 完整测试代码
|
|
105
|
+
EOF",
|
|
106
|
+
run_in_background: true,
|
|
107
|
+
timeout: 3600000,
|
|
108
|
+
description: "简短描述"
|
|
109
|
+
})
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
> ⚠️ 通道 B `codeagent-wrapper` 在 v4.1 已标 **deprecated**,将在 v5.0 移除。
|
|
113
|
+
|
|
114
|
+
**角色提示词**:
|
|
115
|
+
|
|
116
|
+
| 模型 | 提示词 |
|
|
117
|
+
|------|--------|
|
|
118
|
+
| 后端 | `~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/tester.md` |
|
|
119
|
+
| 前端 | `~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/tester.md` |
|
|
120
|
+
|
|
121
|
+
**智能路由**:
|
|
122
|
+
|
|
123
|
+
| 代码类型 | 路由 |
|
|
124
|
+
|---------|------|
|
|
125
|
+
| 后端 | {{BACKEND_PRIMARY}} |
|
|
126
|
+
| 前端 | {{FRONTEND_PRIMARY}} |
|
|
127
|
+
| 全栈 | 并行执行两者 |
|
|
128
|
+
|
|
129
|
+
**并行调用 + 事件驱动等待(v4.5.2 起)**:
|
|
130
|
+
|
|
131
|
+
1. 同 message 内 spawn 多个 `Bash(run_in_background: true)` 并行任务
|
|
132
|
+
2. spawn 完后主线说明已启动 task-id,**直接 turn end**,**不调 TaskOutput**
|
|
133
|
+
3. Claude Code 引擎在每个 task 完成时自动发 `<task-notification>` system-reminder 触发主线新 turn
|
|
134
|
+
4. 主线在新 turn 处理:从 `<output-file>` 路径 read stdout,按通道 schema parse 结果
|
|
135
|
+
5. **必须等所有相关 task 都收到通知**才进入下一阶段(按 task-id 计数已收齐)
|
|
136
|
+
|
|
137
|
+
⛔ **禁止**:
|
|
138
|
+
- 调 `TaskOutput({block: true, timeout: 600000})` —— v4.5.1 之前的旧 freeze poll 模式,已废弃
|
|
139
|
+
- 收到部分通知就跳过等其他模型
|
|
140
|
+
- 主动 Kill task
|
|
141
|
+
|
|
142
|
+
⚠️ **失败处理**:notification status=failed / exit ≠ 0 / stdout < 100B / JSON parse 失败 → v1.7.87 标准 2-retry / 5s / 3-attempts;3 次全失败才降级单模型继续。
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 执行工作流
|
|
147
|
+
|
|
148
|
+
**测试目标**:$ARGUMENTS
|
|
149
|
+
|
|
150
|
+
### 🔍 阶段 0:Prompt 增强(可选)
|
|
151
|
+
|
|
152
|
+
`[模式:准备]` - **Prompt 增强**(按 `/ccg:enhance` 的逻辑执行):分析 $ARGUMENTS 的意图、缺失信息、隐含假设,补全为结构化需求(明确目标、技术约束、范围边界、验收标准),**用增强结果替代原始 $ARGUMENTS,后续调用后端/前端模型 时传入增强后的需求**
|
|
153
|
+
|
|
154
|
+
### 🔍 阶段 1:测试分析
|
|
155
|
+
|
|
156
|
+
`[模式:研究]`
|
|
157
|
+
|
|
158
|
+
1. 检索目标代码的完整实现
|
|
159
|
+
2. 查找现有测试文件和测试框架配置
|
|
160
|
+
3. 识别代码类型:[后端/前端/全栈]
|
|
161
|
+
4. 评估当前测试覆盖率和缺口
|
|
162
|
+
|
|
163
|
+
### 🔬 阶段 2:智能路由测试生成
|
|
164
|
+
|
|
165
|
+
`[模式:生成]`
|
|
166
|
+
|
|
167
|
+
**⚠️ 根据代码类型必须调用对应模型**(参照上方调用规范):
|
|
168
|
+
|
|
169
|
+
- **后端代码** → `Bash({ command: "...--backend {{BACKEND_PRIMARY}}...", run_in_background: false })`
|
|
170
|
+
- ROLE_FILE: `~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/tester.md`
|
|
171
|
+
- **前端代码** → `Bash({ command: "...--backend {{FRONTEND_PRIMARY}}...", run_in_background: false })`
|
|
172
|
+
- ROLE_FILE: `~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/tester.md`
|
|
173
|
+
- **全栈代码** → 并行调用两者:
|
|
174
|
+
1. `Bash({ command: "...--backend {{BACKEND_PRIMARY}}...", run_in_background: true })`
|
|
175
|
+
- ROLE_FILE: `~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/tester.md`
|
|
176
|
+
2. `Bash({ command: "...--backend {{FRONTEND_PRIMARY}}...", run_in_background: true })`
|
|
177
|
+
- ROLE_FILE: `~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/tester.md`
|
|
178
|
+
用 `TaskOutput` 等待结果
|
|
179
|
+
|
|
180
|
+
OUTPUT:完整测试代码(使用项目现有测试框架,覆盖正常路径、边界条件、异常处理)
|
|
181
|
+
|
|
182
|
+
**必须等所有模型返回后才能进入下一阶段**。
|
|
183
|
+
|
|
184
|
+
**务必遵循上方 `多模型调用规范` 的 `重要` 指示**
|
|
185
|
+
|
|
186
|
+
### 🔀 阶段 3:测试整合
|
|
187
|
+
|
|
188
|
+
`[模式:计划]`
|
|
189
|
+
|
|
190
|
+
1. 收集模型输出
|
|
191
|
+
2. Claude 重构:统一风格、确保命名一致、优化结构、移除冗余
|
|
192
|
+
|
|
193
|
+
### ✅ 阶段 4:测试验证
|
|
194
|
+
|
|
195
|
+
`[模式:执行]`
|
|
196
|
+
|
|
197
|
+
1. 创建测试文件
|
|
198
|
+
2. 运行生成的测试
|
|
199
|
+
3. 如有失败,分析原因并修复
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 输出格式
|
|
204
|
+
|
|
205
|
+
```markdown
|
|
206
|
+
## 🧪 测试生成:<测试目标>
|
|
207
|
+
|
|
208
|
+
### 分析结果
|
|
209
|
+
- 代码类型:[后端/前端/全栈]
|
|
210
|
+
- 测试框架:<检测到的框架>
|
|
211
|
+
|
|
212
|
+
### 生成的测试
|
|
213
|
+
- 测试文件:<文件路径>
|
|
214
|
+
- 测试用例数:<数量>
|
|
215
|
+
|
|
216
|
+
### 运行结果
|
|
217
|
+
- 通过:X / Y
|
|
218
|
+
- 失败:<如有,列出原因>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## 测试策略金字塔
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
/\ E2E (10%)
|
|
225
|
+
/--\ Integration (20%)
|
|
226
|
+
/----\ Unit (70%)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 关键规则
|
|
232
|
+
|
|
233
|
+
1. **测试行为,不测试实现** – 关注输入输出
|
|
234
|
+
2. **智能路由** – 后端测试用 {{BACKEND_PRIMARY}},前端测试用 {{FRONTEND_PRIMARY}}
|
|
235
|
+
3. **复用现有模式** – 遵循项目已有的测试风格
|
|
236
|
+
4. 外部模型对文件系统**零写入权限**
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ccg:verify-work
|
|
3
|
+
description: 会话式 UAT 工作流 - UAT.md 状态文件 + cold-start smoke 自动注入 + 自动 diagnose-plan-fix 收敛环(v4.0 P9)
|
|
4
|
+
argument-hint: "[task-id]"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Write
|
|
8
|
+
- Edit
|
|
9
|
+
- Glob
|
|
10
|
+
- Grep
|
|
11
|
+
- Bash
|
|
12
|
+
- AskUserQuestion
|
|
13
|
+
- Agent
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Verify Work — 会话式 UAT 工作流(v4.0 Phase 9)
|
|
17
|
+
|
|
18
|
+
v3.0 的 verify-work 是纯**编排器**——按变更性质开 verify-{module,security,quality,change} 子门,跑完聚合报告。但它**没法做真正的 UAT**:
|
|
19
|
+
|
|
20
|
+
1. 用户得自己拿着报告人肉对照"这事儿到底验没验过";
|
|
21
|
+
2. `/clear` 后所有上下文丢失,UAT 进度归零;
|
|
22
|
+
3. 只看代码不跑冷启动——race condition / silent seed failure / 缺环境变量在生产才暴露;
|
|
23
|
+
4. 用户报 issue 后没有自动收敛环——靠用户手动来回贴报告。
|
|
24
|
+
|
|
25
|
+
v4.0 把 verify-work 改造成**有状态的会话工作流**:
|
|
26
|
+
|
|
27
|
+
- **UAT.md frontmatter 状态文件**:跨 `/clear` 持久化,下次进入命令自动 resume;
|
|
28
|
+
- **逐项核对**(show expected → ask if matches):每条期望行为都明示问,不让模糊滑过;
|
|
29
|
+
- **Cold-start smoke 自动注入**:扫 git diff 命中关键路径即注入"杀进程 → 清临时态 → 冷启动 → 主查询返回数据"测试;
|
|
30
|
+
- **自动 diagnose → planner --gaps → plan-checker 收敛环**(max 3 轮):用户报 issue 立即触发,无需手动调度。
|
|
31
|
+
|
|
32
|
+
**与 v3.0 的关系**:v3.0 的多门聚合不删,迁移为 Step 2(verify-* 子门作为静态扫描)。v4.0 的会话循环裹在外层(Step 0/1/3/4/5)。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 使用方法
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
/ccg:verify-work # 自动按 git diff / .context/state.md 推断 task-id
|
|
40
|
+
/ccg:verify-work phase-09-uat-session # 显式指定 task-id
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**第一次跑** → 新建 `.context/uat/<task-id>/UAT.md` 状态文件。
|
|
44
|
+
**再次跑** → Read 状态文件,从 `pending_checks` 头部继续问。
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## UAT.md frontmatter schema(跨会话状态文件)
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
---
|
|
52
|
+
task_id: phase-09-uat-session
|
|
53
|
+
started_at: 2026-05-03T22:47:00Z
|
|
54
|
+
cold_start_injected: true
|
|
55
|
+
gaps:
|
|
56
|
+
- { symptom: "list empty after refresh", severity: high, status: open, loop_count: 1, plan_ref: ".context/uat/<id>/fix-G-01.md" }
|
|
57
|
+
completed_checks:
|
|
58
|
+
- { id: C1, expected: "login button visible", matched: true }
|
|
59
|
+
- { id: C2, expected: "list shows 5 items", matched: false, gap_ref: G-01 }
|
|
60
|
+
pending_checks:
|
|
61
|
+
- { id: C3, expected: "logout works" }
|
|
62
|
+
---
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
字段约定:
|
|
66
|
+
|
|
67
|
+
| 字段 | 类型 | 含义 |
|
|
68
|
+
|------|------|------|
|
|
69
|
+
| `task_id` | string | 与 `.context/uat/<task-id>/` 路径同源;缺失 = 文件损坏,重建 |
|
|
70
|
+
| `started_at` | ISO 8601 | 起始时间,用于跨会话审计 |
|
|
71
|
+
| `cold_start_injected` | bool | 防止重复注入 |
|
|
72
|
+
| `gaps[]` | list | 用户报告的偏离 / 失败,含 `symptom / severity / status / loop_count / plan_ref` |
|
|
73
|
+
| `completed_checks[]` | list | 已问过的 check(matched=true/false)|
|
|
74
|
+
| `pending_checks[]` | list | 待问的 check(顺序就是问的顺序)|
|
|
75
|
+
|
|
76
|
+
`severity ∈ {critical, high, medium, low}`,`status ∈ {open, fixed, deferred}`。
|
|
77
|
+
|
|
78
|
+
**调用方算法以 `src/utils/uat-session.ts` 中的 `parseUatFrontmatter` / `renderUatFrontmatter` 为权威。** Node 脚本可直接 `import`,LLM 在会话中按本表手写也行——schema 一致即可。
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 工作流程(lifecycle)
|
|
83
|
+
|
|
84
|
+
### Step 0 — Resume 检测
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
TASK_ID="${1:-$(detect-task-id)}" # detect-task-id 见下
|
|
88
|
+
UAT_DIR=".context/uat/${TASK_ID}"
|
|
89
|
+
UAT_FILE="${UAT_DIR}/UAT.md"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`detect-task-id` 优先级:
|
|
93
|
+
1. 命令参数 `$ARGUMENTS`(用户显式给)
|
|
94
|
+
2. `.context/state.md` 当前 phase 字段
|
|
95
|
+
3. `git rev-parse --abbrev-ref HEAD` 分支名(取最后一段)
|
|
96
|
+
4. 用 `verify-work-$(date +%Y%m%d-%H%M)` 兜底
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
if [ -f "$UAT_FILE" ]; then
|
|
100
|
+
echo "Resume mode: existing UAT session for ${TASK_ID}"
|
|
101
|
+
else
|
|
102
|
+
mkdir -p "$UAT_DIR"
|
|
103
|
+
# 新建 UAT.md(Step 1 完成后写入)
|
|
104
|
+
fi
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Resume 时**:
|
|
108
|
+
- Read UAT.md → 解析 frontmatter
|
|
109
|
+
- 显示当前进度:`X/Y checks done, Z gaps open`
|
|
110
|
+
- 跳到 Step 4,继续问 `pending_checks` 头部
|
|
111
|
+
|
|
112
|
+
**新建时**:进 Step 1。
|
|
113
|
+
|
|
114
|
+
### Step 1 — 收集 expected behaviors(生成 pending_checks)
|
|
115
|
+
|
|
116
|
+
读取以下来源(按可用性逐个 fallback):
|
|
117
|
+
|
|
118
|
+
| 来源 | 字段 |
|
|
119
|
+
|------|------|
|
|
120
|
+
| `.ccg/roadmap.md` 当前 phase | `acceptance` 段每条独立 bullet |
|
|
121
|
+
| OpenSpec proposal `proposal.md` | "Success criteria" / "Acceptance" |
|
|
122
|
+
| PRD / SPEC.md | 用户可观察行为 |
|
|
123
|
+
| git commit message 主语 | 主语转 expected(兜底) |
|
|
124
|
+
|
|
125
|
+
每条转一个 `UatCheck`:
|
|
126
|
+
|
|
127
|
+
```yaml
|
|
128
|
+
{ id: C<n>, expected: "<人类可观察行为>" }
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**只允许"用户可观察行为"**——禁止 "bcrypt installed" / "function exists",必须是 "user can reset password" / "list shows correct count"。
|
|
132
|
+
|
|
133
|
+
### Step 2 — 静态门 + cold-start smoke 注入
|
|
134
|
+
|
|
135
|
+
#### 2a. 静态扫描(v3.0 多门保留)
|
|
136
|
+
|
|
137
|
+
按 git diff 性质开门(v3.0 决策矩阵):
|
|
138
|
+
|
|
139
|
+
| 变更性质 | 触发判据 | 门组 |
|
|
140
|
+
|---------|---------|------|
|
|
141
|
+
| 新模块 | `git status` 显示新增目录 | verify-module → verify-security → verify-quality |
|
|
142
|
+
| 小改动 | diff ≤ 30 行 | verify-quality → verify-change |
|
|
143
|
+
| 常规改动 | diff 30-200 行 | verify-change → verify-quality → verifier agent |
|
|
144
|
+
| 安全敏感 | 触及 auth/crypto/input/secret/sql 关键字 | verify-security → verify-change → verifier agent |
|
|
145
|
+
| 重构 | 含 `refactor:` commit | verify-change → verify-quality → verify-security |
|
|
146
|
+
|
|
147
|
+
每门返回结构化 `{ gate, status, counts, top_findings, artifacts }`,**FAIL with critical** 立即 short-circuit 用户先修,进 Step 5 前不继续问 UAT。
|
|
148
|
+
|
|
149
|
+
#### 2b. Cold-start smoke 自动注入
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
CHANGED=$(git diff --name-only HEAD)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
按 `src/utils/uat-session.ts:shouldInjectColdStart()` 等价规则扫:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
触发正则(任一命中即注入):
|
|
159
|
+
- (^|/)server\.(ts|js|mjs|cjs|tsx)$
|
|
160
|
+
- (^|/)app\.(ts|js|mjs|cjs|tsx)$
|
|
161
|
+
- (^|/)main\.(ts|js|mjs|cjs|tsx|go|py|rs)$
|
|
162
|
+
- (^|/)bootstrap\.(ts|js|mjs|cjs)$
|
|
163
|
+
- (^|/)startup[._-]?[a-z]*
|
|
164
|
+
- (^|/)database/
|
|
165
|
+
- (^|/)db/
|
|
166
|
+
- (^|/)migrations?/
|
|
167
|
+
- (^|/)seeds?/
|
|
168
|
+
- (^|/)docker-compose[a-z0-9._-]*\.ya?ml$
|
|
169
|
+
- (^|/)Dockerfile[a-z0-9._-]*$
|
|
170
|
+
- (^|/)\.env(\..+)?$
|
|
171
|
+
- (^|/)k8s/
|
|
172
|
+
- (^|/)kubernetes/
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
命中即把以下模板**作为 C0 插入 pending_checks 头部**(先问 cold-start,再问其他 expected):
|
|
176
|
+
|
|
177
|
+
```markdown
|
|
178
|
+
### Cold-Start Smoke Test (auto-injected)
|
|
179
|
+
|
|
180
|
+
**Trigger**: changes touched cold-start critical paths: `<file-list>`
|
|
181
|
+
|
|
182
|
+
**Why this matters**: Race conditions / silent seed failures / missing env vars
|
|
183
|
+
only surface on a fresh boot. Skipping this leaves prod cold-start bugs unverified.
|
|
184
|
+
|
|
185
|
+
**Steps**:
|
|
186
|
+
1. Kill any running process: `pkill -f <pattern>; docker compose down -v`
|
|
187
|
+
2. Clear ephemeral state (caches/sockets/lock files; KEEP volumes/data unless required)
|
|
188
|
+
3. Cold-boot from scratch: `pnpm dev` / `docker compose up -d` / `make run`
|
|
189
|
+
4. Issue the primary query — expected non-empty payload, status 200, no 5xx/timeout
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
更新 `cold_start_injected: true`,禁止重复注入。
|
|
193
|
+
|
|
194
|
+
### Step 3 — Persist UAT.md(首次写入)
|
|
195
|
+
|
|
196
|
+
Render frontmatter(按上文 schema)+ 主体段:"## Session Log"(每条 check 的 Q&A 时间戳追加于此)。Write 到 `${UAT_DIR}/UAT.md`。
|
|
197
|
+
|
|
198
|
+
### Step 4 — 会话式 UAT(show expected → ask if matches)
|
|
199
|
+
|
|
200
|
+
主循环(每轮处理 pending_checks 头部一条):
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
1. 取 pending_checks[0]
|
|
204
|
+
2. 向用户呈现:
|
|
205
|
+
"Check ${id}: ${expected}
|
|
206
|
+
Did this behave as expected? (y / n / skip / abort)"
|
|
207
|
+
使用 AskUserQuestion 工具
|
|
208
|
+
3. 收到回答:
|
|
209
|
+
- y → completed_checks.push({ ...check, matched: true })
|
|
210
|
+
- n → 进入 Step 5(自动 diagnose)
|
|
211
|
+
- skip → completed_checks.push({ ...check, matched: undefined, note: "skipped" })
|
|
212
|
+
- abort → 写报告 + 退出
|
|
213
|
+
4. 写回 UAT.md(每答一条都持久化,避免会话中断丢进度)
|
|
214
|
+
5. pending_checks.shift(); 回到 1
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
所有 pending 答完 → 进 Step 6。
|
|
218
|
+
|
|
219
|
+
### Step 5 — 自动 diagnose → planner --gaps → plan-checker 收敛环
|
|
220
|
+
|
|
221
|
+
用户答 `n` 时:
|
|
222
|
+
|
|
223
|
+
#### 5a. 推断严重度 + append gap
|
|
224
|
+
|
|
225
|
+
按 `inferIssueSeverity(report)` 等价规则:critical → high → medium → low 顺序扫关键词,命中即定级,不命中默认 medium。
|
|
226
|
+
|
|
227
|
+
```yaml
|
|
228
|
+
gaps:
|
|
229
|
+
- { symptom: "<用户原话>", severity: <inferred>, status: open, loop_count: 0 }
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
#### 5b. 并行 spawn diagnose
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
Agent(subagent_type="ccg:debug", task=<symptom>, run_in_background=true)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
debug agent 找根因,输出 `.context/uat/<task-id>/diagnose-G-<n>.md`。
|
|
239
|
+
|
|
240
|
+
#### 5c. spawn planner --gaps
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
Agent(subagent_type="planner", mode="--gaps", input=diagnose_report)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
输出修复 plan:`.context/uat/<task-id>/fix-G-<n>.md`。
|
|
247
|
+
|
|
248
|
+
#### 5d. spawn plan-checker(复用 Phase 6 helper)
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
Agent(subagent_type="plan-checker", plan=<fix-plan>)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
返回 `{ findings, hasBlocker, counts }`。
|
|
255
|
+
|
|
256
|
+
#### 5e. max-3-loop 收敛
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
loop_count += 1
|
|
260
|
+
if not hasBlocker:
|
|
261
|
+
- gap.status = fixed; gap.plan_ref = <fix-plan-path>
|
|
262
|
+
- apply fix(spawn codex/gemini-rescue 或 user 手改)
|
|
263
|
+
- 回到 Step 4 主循环(继续下一条 pending_check)
|
|
264
|
+
elif loop_count >= 3:
|
|
265
|
+
- escalate to user via AskUserQuestion:
|
|
266
|
+
"Convergence loop exhausted (3/3). Choose:
|
|
267
|
+
(a) force-accept partial fix
|
|
268
|
+
(b) provide guidance & retry one more loop
|
|
269
|
+
(c) abort and roll back this gap"
|
|
270
|
+
else:
|
|
271
|
+
- 把 plan-checker findings 喂回 planner --gaps,回到 5c
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**3 轮上限是硬规约**——与 plan-review-convergence / code-review-fix 一致。
|
|
275
|
+
|
|
276
|
+
### Step 6 — 终态报告
|
|
277
|
+
|
|
278
|
+
所有 check 已答(含 skip)+ 所有 gap 状态 ∈ {fixed, deferred}:
|
|
279
|
+
|
|
280
|
+
```markdown
|
|
281
|
+
# Verify Work Final Report — <task-id>
|
|
282
|
+
|
|
283
|
+
## Summary
|
|
284
|
+
- Checks: <pass>/<total> matched, <skip> skipped
|
|
285
|
+
- Gaps: <fixed>/<total> fixed, <deferred> deferred, <open> still open
|
|
286
|
+
- Cold-start smoke: <PASS|FAIL|N/A>
|
|
287
|
+
- Static gates: <verify-module|security|quality|change> 各自 status
|
|
288
|
+
- Convergence loops triggered: <n>
|
|
289
|
+
|
|
290
|
+
## 综合判决
|
|
291
|
+
| 维度 | 状态 |
|
|
292
|
+
|------|------|
|
|
293
|
+
| 阻断项 | <n> |
|
|
294
|
+
| 告警项 | <n> |
|
|
295
|
+
| 修复优先级 | <列表> |
|
|
296
|
+
|
|
297
|
+
**建议**: ✅ 可交付 | ⚠ 建议处理 N 项告警 | ❌ 阻断项需先修
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
报告写到 `.context/uat/<task-id>/REPORT.md`,UAT.md 保留作为审计 trail。
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## 与 .context / roadmap 集成
|
|
305
|
+
|
|
306
|
+
- 报告 + UAT.md 落 `.context/uat/<task-id>/`,不是临时目录
|
|
307
|
+
- `.context/state.md` 追加引用:`UAT: see uat/<task-id>/REPORT.md`
|
|
308
|
+
- 不修改 `.ccg/roadmap.md`(autonomous 主线管)
|
|
309
|
+
|
|
310
|
+
## 与各 verify-* skill 的契约
|
|
311
|
+
|
|
312
|
+
| Skill | 在本工作流的角色 |
|
|
313
|
+
|-------|-----------------|
|
|
314
|
+
| verify-module | Step 2a 静态门,新模块场景必跑 |
|
|
315
|
+
| verify-security | Step 2a 静态门,安全敏感场景必跑 |
|
|
316
|
+
| verify-quality | Step 2a 静态门,30+ 行变更必跑 |
|
|
317
|
+
| verify-change | Step 2a 静态门,常规改动必跑 |
|
|
318
|
+
| verifier agent | Step 2a 末尾兜底,做需求矩阵反向溯源(v4 Phase 8 加 Level 4 数据流) |
|
|
319
|
+
|
|
320
|
+
## 与 v4.0 helper 的契约
|
|
321
|
+
|
|
322
|
+
| Helper | 用途 |
|
|
323
|
+
|--------|------|
|
|
324
|
+
| `src/utils/uat-session.ts:shouldInjectColdStart` | Step 2b 触发判定 |
|
|
325
|
+
| `src/utils/uat-session.ts:buildColdStartSmokeTemplate` | Step 2b 测试模板 |
|
|
326
|
+
| `src/utils/uat-session.ts:parseUatFrontmatter` / `renderUatFrontmatter` | UAT.md 状态文件 IO |
|
|
327
|
+
| `src/utils/uat-session.ts:inferIssueSeverity` | Step 5a 严重度推断 |
|
|
328
|
+
| `src/utils/uat-session.ts:decideConvergence` | Step 5e max-3-loop 判定 |
|
|
329
|
+
| `src/utils/plan-checker.ts:runPlanChecker` | Step 5d 修复计划静态校验 |
|
|
330
|
+
|
|
331
|
+
## 硬性约束
|
|
332
|
+
|
|
333
|
+
- **不重复实现已有 skill 的检测逻辑**:Step 2a 完全复用 verify-* skill
|
|
334
|
+
- **UAT.md 必须每条 check 答完即持久化**:避免 `/clear` 丢进度
|
|
335
|
+
- **Cold-start smoke 不重复注入**:`cold_start_injected: true` 后跳过
|
|
336
|
+
- **3 轮收敛上限严格执行**:不允许"再来一轮",必须升级用户三选
|
|
337
|
+
- **失败 short-circuit**:Step 2a 任一门 FAIL with critical 立即停 UAT 询问
|
|
338
|
+
- **不修改 `.ccg/roadmap.md` / `.ccg-research/` / `templates/scripts/invoke-model.mjs`**
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: '统一校验关卡:按 --gate=change|quality|security|module 子门路由到对应 skill,--all 等价 verify-work'
|
|
3
|
+
argument-hint: '--gate=<change|quality|security|module|all> [path]'
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Read
|
|
6
|
+
- Glob
|
|
7
|
+
- Grep
|
|
8
|
+
- Bash
|
|
9
|
+
- Agent
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# /ccg:verify - 统一校验关卡(v4.0+)
|
|
13
|
+
|
|
14
|
+
替代 v3.x 时代的 4 个独立命令 `/ccg:verify-{change,quality,security,module}`,统一入口 + 子门路由,降低命令面板认知负担。
|
|
15
|
+
|
|
16
|
+
## 使用方法
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
/ccg:verify --gate=change [path] # 变更影响分析(diff/doc 同步)
|
|
20
|
+
/ccg:verify --gate=quality [path] # 代码质量(复杂度/重复/命名)
|
|
21
|
+
/ccg:verify --gate=security [path] # 安全漏洞扫描
|
|
22
|
+
/ccg:verify --gate=module <path> # 模块完整性(README/DESIGN/结构)
|
|
23
|
+
/ccg:verify --gate=all [path] # 等价 /ccg:verify-work(自动按变更类型选门)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
如未提供 `--gate`,默认 `--gate=all`。
|
|
27
|
+
|
|
28
|
+
## 参数解析
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
$ARGUMENTS
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
从 `$ARGUMENTS` 解析:
|
|
35
|
+
- 提取首个 `--gate=<value>` 或 `--gate <value>`
|
|
36
|
+
- 剩余非 flag 参数作为 `<path>`
|
|
37
|
+
- 未指定 gate → 默认 `all`
|
|
38
|
+
|
|
39
|
+
## 路由规则
|
|
40
|
+
|
|
41
|
+
| --gate | 实际调用 | 说明 |
|
|
42
|
+
|--------|---------|------|
|
|
43
|
+
| `change` | 读取并执行 `~/.claude/skills/ccg/tools/verify-change/SKILL.md` | 沿用旧 verify-change skill 的脚本 |
|
|
44
|
+
| `quality` | 读取并执行 `~/.claude/skills/ccg/tools/verify-quality/SKILL.md` | 沿用旧 verify-quality skill 的脚本 |
|
|
45
|
+
| `security` | 读取并执行 `~/.claude/skills/ccg/tools/verify-security/SKILL.md` | 沿用旧 verify-security skill 的脚本 |
|
|
46
|
+
| `module` | 读取并执行 `~/.claude/skills/ccg/tools/verify-module/SKILL.md` | 沿用旧 verify-module skill 的脚本 |
|
|
47
|
+
| `all` | 调用 `/ccg:verify-work` 编排器 | 按 git diff 变更类型自动选门 |
|
|
48
|
+
|
|
49
|
+
## 兼容性
|
|
50
|
+
|
|
51
|
+
旧的 `/ccg:verify-change` / `/ccg:verify-quality` / `/ccg:verify-security` / `/ccg:verify-module` 仍可工作(由 Skill Registry 自动生成),但 SKILL.md 已标记 `deprecated_in: v4.0`、`replaced_by: /ccg:verify --gate=<name>`。建议新工作流使用本统一命令。
|
|
52
|
+
|
|
53
|
+
## 执行流程
|
|
54
|
+
|
|
55
|
+
1. **解析参数** - 提取 `--gate` 与 `path`
|
|
56
|
+
2. **路由分发** - 按 gate 值读取对应 SKILL.md,加载脚本/知识
|
|
57
|
+
3. **执行子门** - 沿用对应 skill 的脚本与报告格式(不重新实现)
|
|
58
|
+
4. **聚合输出** - 沿用子门原报告格式,无修饰
|
|
59
|
+
|
|
60
|
+
## 注意事项
|
|
61
|
+
|
|
62
|
+
- 本命令不**重新实现**校验逻辑,纯路由层。所有逻辑仍在 4 个 verify-* SKILL.md 中维护。
|
|
63
|
+
- `--gate=all` 是 `/ccg:verify-work` 的别名,未来可能合并。
|
|
64
|
+
- 如脚本需要传 `--mode`(如 verify-change 的 `--mode staged`),通过 `path` 之后的额外参数透传:`/ccg:verify --gate=change -- --mode staged`。
|
|
65
|
+
|
|
66
|
+
---
|