质量门禁流水线 (Quality Gate Pipeline)¶
质量门禁 (Quality Gate) 是 PEtFiSh 的发布决策系统。它按顺序运行三项检查——代码检查 (lint)、安全审计 (security audit) 和元数据验证 (metadata validation)——然后输出通过 (PASS)、有条件通过 (CONDITIONAL) 或失败 (FAIL) 的决策。
概览 (Overview)¶
skill/
│
├─ 1. Lint (代码检查)
│ └─ 得分 ≥ 80/100
│
├─ 2. Security Audit (安全审计)
│ └─ 风险 ≤ 0.5 且无 CRITICAL (严重) 问题
│
├─ 3. Metadata Validation (元数据验证)
│ └─ Name、version、description 均有效
│
└─ 4. Decision (决策)
├─ PASS → 准备发布
├─ CONDITIONAL → 带着已知问题继续
└─ FAIL → 发布前必须修复
运行门禁 (Running the Gate)¶
通过 /petfish¶
通过脚本¶
# 单个 skill
uv run python .opencode/skills/quality-gate/scripts/run_gate.py \
--path .opencode/skills/my-skill/
# 递归运行 — 目录下的所有 skills
uv run python .opencode/skills/quality-gate/scripts/run_gate.py \
--path .opencode/skills/ --recursive
第 1 阶段:代码检查 (Lint)¶
运行 lint_skill.py 检查结构、格式和触发的可靠性。
检查内容¶
| 检查项 | 规则 | 严重程度 |
|---|---|---|
| 前置元数据字段 | name, version, description 存在 |
ERROR |
| 名称格式 | 小写的短横线命名法 (kebab-case),且与目录匹配 | ERROR |
| 描述长度 | ≤500个字符 | WARNING |
| 触发覆盖率 | 描述内容涵盖主体中 ≥80% 的触发关键词 | ERROR (<50%), WARNING (50–80%) |
| 文件结构 | SKILL.md 存在于预期路径 | ERROR |
| 脚本约定 | 没有 pip install,没有裸 python3 命令 |
WARNING |
评分机制¶
每条规则都有助于得出 0–100 的总分。通过此阶段需要门禁得分 ≥80。
独立运行代码检查¶
/petfish lint .opencode/skills/my-skill/
# 或者直接运行:
uv run python .opencode/skills/skill-lint/scripts/lint_skill.py \
--path .opencode/skills/my-skill/
# CI 环境中输出 JSON 格式:
uv run python .opencode/skills/skill-lint/scripts/lint_skill.py \
--path .opencode/skills/my-skill/ --json
第 2 阶段:安全审计 (Security Audit)¶
运行 audit_skill.py 扫描安全风险。
扫描内容¶
| 领域 | 示例 |
|---|---|
| SKILL.md 指令 | 提示注入向量 (Prompt injection vectors),凭据访问模式 |
scripts/ |
危险命令 (rm -rf, eval),网络访问,超出作用域的文件写入 |
references/ |
嵌入的密钥,硬编码的 token |
| MCP/工具作用域 | 权限过大,无作用域限制的工具访问 |
风险得分 (Risk Score)¶
输出一个 0.0–1.0 的风险得分。门禁要求得分 ≤0.5 并且 无严重 (CRITICAL) 发现。
| 得分范围 | 含义 |
|---|---|
| 0.0–0.2 | 低风险 |
| 0.2–0.5 | 中等风险 — 建议进行审查 |
| 0.5–0.8 | 高风险 — 很可能会被拦截 |
| 0.8–1.0 | 极高风险 — 必须修复 |
独立运行审计¶
/petfish audit .opencode/skills/my-skill/
# 或者直接运行:
uv run python .opencode/skills/skill-security-auditor/scripts/audit_skill.py \
--path .opencode/skills/my-skill/
第 3 阶段:元数据验证 (Metadata Validation)¶
如果 skill 属于某个 pack,则验证 pack 级别的元数据:
name字段与目录名匹配version遵循语义化版本规范 (semver)description存在且非空- Pack 清单 (manifest)(如果存在)列出了该 skill
决策逻辑 (Decision Logic)¶
| 条件 | 决策 |
|---|---|
| Lint ≥80 且 audit ≤0.5 且无 CRITICAL 且 metadata 有效 | PASS (通过) |
| Lint ≥60 且 audit ≤0.7 且存在 trigger-coverage ERROR | CONDITIONAL (有条件通过) |
| Lint <60 或 audit >0.7 或存在 CRITICAL 发现 | FAIL (失败) |
有条件通过处理 (CONDITIONAL Handling)¶
CONDITIONAL 结果意味着存在次要问题但并非阻塞性问题。常见原因:
- 触发覆盖率在 50–80% 之间 (WARNING 级别)
- 中等安全风险 (0.2–0.5)
- 缺少可选字段
您可以继续进行,但应当解决提到的已知问题。
持续集成 (CI Integration)¶
门禁脚本支持为 CI 流水线输出 JSON 格式:
# 返回退出码 (exit code):PASS 为 0,CONDITIONAL 为 1,FAIL 为 2
uv run python .opencode/skills/quality-gate/scripts/run_gate.py \
--path .opencode/skills/my-skill/ --json
批量门禁验证¶
在发布之前为 pack 中的所有 skills 运行门禁:
uv run python .opencode/skills/quality-gate/scripts/run_gate.py \
--path packs/my-pack/.opencode/skills/ --recursive
修复常见失败 (Fixing Common Failures)¶
触发覆盖率过低¶
修复方法:将主体激活 (activation) 部分缺失的触发关键词添加到前置元数据的 description 中。必须覆盖中文和英文的关键词。
代码检查得分低于 80¶
查阅代码检查输出中详细的违反规则说明。最常见的问题包括:
- 缺少
version字段 - 描述超过了 500 个字符
- 目录名与
name字段不匹配
安全审计警告¶
审查每一个发现项。常见的误报 (false positives) 包括:
- 合法需要网络访问的脚本(例如,API 客户端)
- 作为 skill 核心功能一部分的文件写入操作
对于合法的操作,请记录说明理由。对于真正的风险,请进行修复。