Compare commits

..
Author SHA1 Message Date
qiudl ae357a20f7 Merge pull request 'feat(governance): 技能治理节拍落到 launchd + 提案入口模板' (#20) from feat/skill-governance-schedulers into main
skill-gate / gate (push) Waiting to run
2026-10-31 21:52:02 +00:00
johnQ c6ef6820e4 feat(governance): 节拍落到 launchd + 提案入口
skill-gate / gate (pull_request) Waiting to run
- scripts/scheduled-task.sh:daily/weekly/monthly 只做确定性动作,需模型判断的部分生成 queue 文件
- scripts/install-schedulers.sh:装成用户级 launchd(daily 07:20 / weekly 周一 10:00 / monthly 1 日 10:00)
- .gitea issue/PR 模板:新技能提案走同一套 SCOPE 门槛问题
- README 一键部署 2 步 → 4 步;MAINTENANCE 增加定时任务一节与边界说明
2026-11-01 05:50:38 +08:00
qiudl 175c612d35 Merge pull request 'feat(skill): beta 技能 diagnosing-bugs + 月度审阅与 evals 工具' (#19) from feat/diagnosing-bugs-and-review-tools into main
skill-gate / gate (push) Waiting to run
feat(skill): beta 技能 diagnosing-bugs + 月度审阅与 evals 工具
2026-10-31 21:34:04 +00:00
johnQ 1566e2d3eb feat(skill): beta 技能 diagnosing-bugs + 月度审阅与 evals 工具
skill-gate / gate (pull_request) Waiting to run
- 新增 diagnosing-bugs(beta):先建红循环再推理、二分定位、补回归测试;含 evals 与四段式文档
- 路由表加入难查 bug 行
- scripts/monthly-review.sh:一条命令跑月度审阅
- scripts/evals-status.py + reports/evals/TEMPLATE.md:evals 覆盖与回归报告模板
- skill-creator 实战记录 #1(待观察后晋升)
2026-11-01 05:33:50 +08:00
qiudl f7810ec3d9 Merge pull request 'docs(maintenance): 明确批量提交前先建分支' (#18) from docs/maintenance-branch-rule into main
docs(maintenance): 明确批量提交前先建分支
2026-10-31 21:20:55 +00:00
johnQ 6b338895d7 docs(maintenance): 明确批量提交前先建分支,不直接进 main 2026-11-01 05:20:47 +08:00
johnQ 7b221cc767 docs(skill): 覆盖率阶段 2 完成 —— 全量 evals 与四段式文档清零
skill-gate / gate (push) Waiting to run
- 24 个技能补齐 evals(正常/边界/失败恢复)与 docs/skills/*.md
- 覆盖 dev 类、发布 runbook、karpathy 守则、PR/清单等
- coverage: 24 -> 0(40 个 promoted+model-invoked 全覆盖)
2026-11-01 05:19:28 +08:00
qiudl 8bc3300928 Merge pull request 'docs(skill): 覆盖率阶段 1 —— core + req 补齐 evals 与四段式文档' (#17) from chore/skill-coverage-phase1-samples into main
skill-gate / gate (push) Waiting to run
docs(skill): 覆盖率阶段 1 —— core + req 补齐 evals 与四段式文档
2026-10-31 21:14:59 +00:00
66 changed files with 1848 additions and 108 deletions
+2
View File
@@ -0,0 +1,2 @@
blank_issues_enabled: true
contact_links: []
+36
View File
@@ -0,0 +1,36 @@
---
name: 新技能提案
about: 提新技能或技能改动前先过 SCOPE.md 门槛(默认拒绝,能组合就不新增)
title: "[技能] "
labels: skill
---
## 1. 真实失败(必填)
在哪个真实任务/会话里出了问题?跑了什么、期望什么、实际什么。
> 假设性的「这样会更好」不算。说不清就说明还不到提的时候。
## 2. 为什么组合不出来(必填)
用现有哪个技能组合试过?为什么做不到?
> 能组合出来的,改现有技能,不新增。
## 3. 是否重复提案
- [ ] 已读 `.out-of-scope/` 三份拒绝档案,不是重复提案
## 4. 分桶与调用模式
- 初始分桶:`beta`(新技能一律先 beta)
- 调用模式:`model-invoked` / `user-invoked`
- 判定:这件事是不是「人下命令才开始」?是 → `user-invoked`(同时写 `disable-model-invocation: true`)
## 5. 最低交付
- [ ] `evals/evals.json` 3 条:正常路径 / 边界 / 失败恢复
- [ ] `docs/skills/<name>.md` 四段式:What it does / When to reach for it / Common questions / It's working if
- [ ] `docs/skill-routing.md` 已回改
- [ ] `catalog.json` 已 regenerate
- [ ] `CHANGELOG.md` + `plugin.json` 版本号
+24
View File
@@ -0,0 +1,24 @@
## 这个 PR 做了什么
<!-- 一句话,说明改的是哪个技能 / 哪套流程 -->
## SCOPE 门槛
- [ ] 真实失败:说清了在哪个真实任务里出的问题
- [ ] 组合不出来:说明用现有技能组合为什么做不到
- [ ] 已查 `.out-of-scope/`,不是重复提案
## 改动检查
- [ ] 分桶正确(新技能一律 `beta`;`promoted` 需要真实使用记录 + evals 通过)
- [ ] 调用模式正确(`user-invoked` 必须写 `disable-model-invocation: true`)
- [ ] `evals/evals.json` 3 条(正常 / 边界 / 失败恢复)
- [ ] `docs/skills/<name>.md` 四段式
- [ ] `docs/skill-routing.md` 已回改
- [ ] `catalog.json` 已 regenerate(`python3 scripts/generate-catalog.py`)
- [ ] `CHANGELOG.md` + `plugin.json` 版本号已更新
- [ ] 四道门禁通过:`validate-skills.py --strict`、`scan-skill.sh`、`generate-catalog.py --check`、`tests/install-skills.test.sh`
## 人工拍板项(有则写明)
<!-- deprecated 删除、路由变更、promoted 晋升,需要人确认 -->
+6
View File
@@ -25,3 +25,9 @@ __pycache__/
# Node
node_modules/
# 定时任务产出(本机运行产物,不回写仓库;evals 结果报告除外)
reports/skill-health/
reports/monthly/
reports/_scheduler/
reports/evals/queue-*.md
+20
View File
@@ -48,3 +48,23 @@
- 新增 `scripts/scan-installed.sh`:扫描已装但非本仓库管理的第三方技能(当前 33 个,0 高危)。
- `generate-catalog.py` 增加 `has_evals` / `has_docs` 与 `coverage` 汇总;`validate-skills.py` 增加 `--coverage` 报告与路由表一致性检查。
- `SCOPE.md` 增加覆盖率路线图(3–4 周补齐 40 个技能的 evals 与文档);`MAINTENANCE.md` 同步。
### 覆盖率阶段 2(2026-11-01)
- 补齐剩余 24 个技能(dev 类为主)的 `evals/evals.json`(各 3 条)与 `docs/skills/<name>.md`(四段式)。
- `--coverage`:40 个 promoted+model-invoked 技能的 evals 与文档缺口 **24 → 0**。
### 继续推进(2026-11-01)
- 新增 beta 技能 `diagnosing-bugs`(难查 bug 诊断纪律:先建红循环再推理),补齐 evals 与四段式文档;路由表同步。
- 新增 `scripts/monthly-review.sh`:一条命令跑月度审阅(覆盖率 / 扫描 / 第三方 / catalog / description 异常)。
### 治理落地:定时任务与提案入口(2026-11-01)
- 新增 `scripts/scheduled-task.sh`:`daily` / `weekly` / `monthly` 三个确定性任务,只跑门禁、扫漂移、生成队列;需要模型判断的部分(真跑 evals、审阅 routing)生成 queue 文件交 agent。
- 新增 `scripts/install-schedulers.sh`:把节拍装成 macOS 用户级 launchd(`com.pipexerp.ai-proj-skill-{daily,weekly,monthly}`),不再依赖会话提醒;支持 `--status` / `--run` / `--uninstall`。
- 新增 `.gitea/issue_template/new-skill.md`、`.gitea/issue_template/config.yaml`、`.gitea/pull_request_template.md`:提案与 PR 走同一套 SCOPE 门槛问题。
- `README.md` 一键部署从 2 步改为 4 步(补 git hooks 与定时任务);`MAINTENANCE.md` 增加「定时任务」一节,写明脚本只做确定性动作的边界。
- `.gitignore` 排除定时任务产出(`reports/skill-health/`、`reports/monthly/`、`reports/_scheduler/`、`reports/evals/queue-*.md`)。
- 新增 `scripts/evals-status.py` 与 `reports/evals/TEMPLATE.md`:evals 覆盖率与回归报告模板。
- `skill-creator` 实战记录 #1:用标准流程新建 `diagnosing-bugs`(beta,待观察后晋升)。
+28 -3
View File
@@ -3,7 +3,10 @@
> 配套 `SCOPE.md`(收不收)、`skill-creator`(怎么建)、`docs/skill-routing.md`(用哪个)。
> 本文件管「多久做一次什么」。
## 每次改动(任何 PR)
## 每次改动(任何分支)
> **批量提交前先建分支**:`git checkout -b <branch>`,再提交、推分支、开 PR。不要直接 commit 到 main(2026-11-01 阶段 2 漏建分支直接进 main,少了 PR 记录)。
1. 过 `SCOPE.md` 收录门槛(真实失败 + 组合不出来),新技能默认先 `beta`。
2. 跑四道门禁:`validate-skills.py --strict`、`scan-skill.sh`、`generate-catalog.py --check`、`tests/install-skills.test.sh`。
@@ -22,7 +25,8 @@
- 范围:上周改过的技能 + 3 个高风险技能(`dev-coding`、`dev-review`、`req-design`)。
- 每技能取 1 条关键用例,做「有技能 / 无技能」对比,按 rubric 打分。
- 结果记录到 `reports/evals/YYYY-Www.md`,进周报。
- 结果记录到 `reports/evals/YYYY-Www.md`(模板 `reports/evals/TEMPLATE.md`),进周报。
- 用 `python3 scripts/evals-status.py` 看哪些技能已有 evals、哪些已有回归报告。
- 连续两次无增量的技能 → 按 `SCOPE.md` 评估降级。
- 不做全量(61 技能 × 3 用例成本过高);全量只在治理大改时做。
@@ -31,7 +35,7 @@
- 两台机器 `--audit` 漂移必须为 0(beta/deprecated 除外)。
- 审 `catalog.json`:`description` 长度 <80 或 >600 的标黄;含「各种 / 等等 / 相关」这类泛化词的标出。
- 第三方技能(arkcli 等)有变动时,评估是否影响团队技能;跑一次 `./scripts/scan-installed.sh`。
- 跑 `python3 scripts/validate-skills.py --coverage`:报告缺 evals / 缺四段式文档的技能,按 `SCOPE.md` 的覆盖率路线图推进。
- 跑 `./scripts/monthly-review.sh` 一次出齐:覆盖率、本仓库扫描、第三方扫描、catalog 一致性、description 异常项。
## 每季度首月 1 日 10:30 — 治理复核
@@ -41,6 +45,27 @@
- 复核覆盖率:`--coverage` 的两项缺口是否按路线图收敛。
- 更新本文件与 `CHANGELOG.md`。
## 定时任务(launchd,2026-11-01 起)
节拍不再挂在「会话提醒」上(会话一断就失效),改成宿主级 launchd:
```bash
./scripts/install-schedulers.sh # 安装(幂等;换机器重跑一次即可复现)
./scripts/install-schedulers.sh --status # 看状态与最近产出
./scripts/install-schedulers.sh --run daily # 立刻跑一次(调试)
./scripts/install-schedulers.sh --uninstall
```
| 任务 | 时间 | 脚本做什么 | 产出 |
| --- | --- | --- | --- |
| `daily` | 每天 07:20 | 漂移 audit + 入库安全扫描 + 覆盖率 | `reports/skill-health/daily-YYYY-MM-DD.md`(`latest.md` 供 7:30 日报直接读) |
| `weekly` | 每周一 10:00 | 算上周改动技能 + 3 个高风险项,生成 evals 抽样队列 | `reports/evals/queue-YYYY-MM-DD.md` |
| `monthly` | 每月 1 日 10:00 | 一条命令跑完月度审阅;1/4/7/10 月附季度治理清单 | `reports/monthly/review-YYYY-MM.md`、`quarterly-YYYY-Qn.md` |
**边界**:脚本只做确定性动作。真跑 evals、审阅 routing 这类需要模型判断的部分,脚本只生成队列文件,由项目经理 Bot 在 7:30 日报里接手执行——分工不写在脚本里就会漏。
日志:`reports/_scheduler/<job>.log`。
## 责任分工
- 项目经理 Bot:执行节奏、出周/月报、盯漂移与门禁。
+9 -1
View File
@@ -69,7 +69,7 @@ PRD 文档存储在思源笔记中,可以导出发送到飞书群,通过飞
- **Codex**([Skills 文档](https://developers.openai.com/codex/skills))或 **Claude Code** 已安装
- **ai-proj 账号 + MCP API Key**:联系管理员获取(Key 格式: `aiproj_pk_xxx`)
### 一键部署(2 步搞定)
### 一键部署(4 步搞定)
```bash
# 1. 克隆仓库
@@ -78,8 +78,16 @@ cd ai-proj-helper
# 2. 默认安装到 Codex 的用户级标准目录 ~/.agents/skills
./install-skills.sh
# 3. 装本地门禁(Gitea Actions 无 runner,commit/push 靠 git hook 兜底)
./scripts/install-git-hooks.sh
# 4. 装技能治理定时任务(macOS launchd:每日漂移检查 / 每周 evals 队列 / 每月审阅)
./scripts/install-schedulers.sh
```
第 3、4 步只对「本仓库的维护者」需要——只装技能给别人用的,跑完第 2 步就可以停。
安装器会复制完整技能目录,包括 `SKILL.md`、references、scripts 和 assets。Codex 会自动发现 `~/.agents/skills` 中的技能;若没有出现,重启 Codex。
Claude Code 用户显式选择 Claude 目标;需要同时配置 MCP 和 marketplace 时运行 `init.sh`:
+68 -104
View File
@@ -2,68 +2,19 @@
"repo": "ai-proj-helper",
"coverage": {
"required": 40,
"with_evals": 16,
"with_docs": 16,
"missing_evals": [
"agent-browser",
"agent-swarm",
"ai-chat",
"db-migration",
"defect-analysis",
"deploy-rollback",
"dev-arch",
"dev-cicd",
"dev-coding",
"dev-commit",
"dev-deploy",
"dev-integration",
"dev-mcp",
"dev-review",
"dev-scaffold",
"dev-test",
"executing-plans",
"finishing-a-development-branch",
"frontend-design",
"karpathy-guidelines",
"pull-request",
"review-checklist",
"slark-cicd",
"slark-dsh-cicd"
],
"missing_docs": [
"agent-browser",
"agent-swarm",
"ai-chat",
"db-migration",
"defect-analysis",
"deploy-rollback",
"dev-arch",
"dev-cicd",
"dev-coding",
"dev-commit",
"dev-deploy",
"dev-integration",
"dev-mcp",
"dev-review",
"dev-scaffold",
"dev-test",
"executing-plans",
"finishing-a-development-branch",
"frontend-design",
"karpathy-guidelines",
"pull-request",
"review-checklist",
"slark-cicd",
"slark-dsh-cicd"
]
"with_evals": 40,
"with_docs": 40,
"missing_evals": [],
"missing_docs": []
},
"generated_at": "2026-10-31T21:14:46Z",
"total": 61,
"generated_at": "2026-10-31T21:33:50Z",
"total": 62,
"counts": {
"promoted/user-invoked": 18,
"deprecated/user-invoked": 1,
"promoted/model-invoked": 40,
"beta/user-invoked": 1,
"beta/model-invoked": 1,
"deprecated/model-invoked": 1
},
"skills": [
@@ -207,8 +158,8 @@
"description_len": 71,
"path": "skills-dev/agent-browser-plugin/skills/SKILL.md",
"digest": "f382bffe3d1c84b2",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "agent-swarm",
@@ -220,8 +171,8 @@
"description_len": 153,
"path": "skills-dev/agent-swarm-plugin/skills/SKILL.md",
"digest": "4164f82025a421bb",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "ai-chat",
@@ -233,8 +184,8 @@
"description_len": 78,
"path": "skills-dev/ai-chat-plugin/skills/SKILL.md",
"digest": "81193de50b43d95c",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "ai-proj-cicd-release",
@@ -272,8 +223,8 @@
"description_len": 77,
"path": "skills-dev/db-migration-plugin/skills/SKILL.md",
"digest": "f8d6ebbddbbf7a71",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "defect-analysis",
@@ -285,8 +236,8 @@
"description_len": 68,
"path": "skills-dev/defect-analysis-plugin/skills/SKILL.md",
"digest": "23dfafda92d0c622",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "deploy-rollback",
@@ -298,8 +249,8 @@
"description_len": 49,
"path": "skills-dev/deploy-rollback-plugin/skills/SKILL.md",
"digest": "75ebf66a3f74195a",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-android",
@@ -324,8 +275,8 @@
"description_len": 69,
"path": "skills-dev/dev-arch-plugin/skills/SKILL.md",
"digest": "c9a419c83a307a11",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-cicd",
@@ -337,8 +288,8 @@
"description_len": 119,
"path": "skills-dev/dev-cicd-plugin/skills/SKILL.md",
"digest": "a763f0f140516411",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-coding",
@@ -350,8 +301,8 @@
"description_len": 81,
"path": "skills-dev/dev-coding-plugin/skills/SKILL.md",
"digest": "cc43720aa12bb8f6",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-commit",
@@ -363,8 +314,8 @@
"description_len": 99,
"path": "skills-dev/dev-commit-plugin/skills/SKILL.md",
"digest": "1560658c4a30df45",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-deploy",
@@ -376,8 +327,8 @@
"description_len": 90,
"path": "skills-dev/dev-deploy-plugin/skills/SKILL.md",
"digest": "fd15a9e9135bcc49",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-integration",
@@ -389,8 +340,8 @@
"description_len": 64,
"path": "skills-dev/dev-integration-plugin/skills/SKILL.md",
"digest": "eff6be8eb57b7fef",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-ios",
@@ -415,8 +366,8 @@
"description_len": 84,
"path": "skills-dev/dev-mcp-plugin/skills/SKILL.md",
"digest": "83d5912212fcfa4a",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-pda",
@@ -441,8 +392,8 @@
"description_len": 91,
"path": "skills-dev/dev-review-plugin/skills/SKILL.md",
"digest": "a8a1ec79b85e3227",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-scaffold",
@@ -454,8 +405,8 @@
"description_len": 43,
"path": "skills-dev/dev-scaffold-plugin/skills/SKILL.md",
"digest": "4044787b1e468302",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "dev-test",
@@ -467,8 +418,21 @@
"description_len": 67,
"path": "skills-dev/dev-test-plugin/skills/dev-test/SKILL.md",
"digest": "a03536a478eabe6c",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "diagnosing-bugs",
"category": "dev",
"version": "0.1.0",
"status": "beta",
"invocation": "model-invoked",
"description": "难查 bug 的诊断纪律:先造出一条「现在就为这个 bug 变红」的紧反馈循环,再二分定位、最小验证、补回归测试。当 bug 难复现、间歇失败、或第一次看没头绪时使用。",
"description_len": 84,
"path": "skills-dev/diagnosing-bugs-plugin/skills/SKILL.md",
"digest": "d93fb95c073858cc",
"has_evals": true,
"has_docs": true
},
{
"name": "executing-plans",
@@ -480,8 +444,8 @@
"description_len": 104,
"path": "skills-dev/executing-plans-plugin/skills/SKILL.md",
"digest": "8991a50091af83a4",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "finishing-a-development-branch",
@@ -493,8 +457,8 @@
"description_len": 80,
"path": "skills-dev/finishing-branch-plugin/skills/SKILL.md",
"digest": "1102047ccc060e60",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "frontend-design",
@@ -506,8 +470,8 @@
"description_len": 234,
"path": "skills-dev/frontend-design-plugin/skills/SKILL.md",
"digest": "84e9c104be7967cc",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "karpathy-guidelines",
@@ -519,8 +483,8 @@
"description_len": 64,
"path": "skills-dev/karpathy-guidelines-plugin/skills/SKILL.md",
"digest": "a68f347031110d6a",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "pull-request",
@@ -532,8 +496,8 @@
"description_len": 219,
"path": "skills-dev/pull-request-plugin/skills/SKILL.md",
"digest": "40dac0d290782bb5",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "review-checklist",
@@ -545,8 +509,8 @@
"description_len": 54,
"path": "skills-dev/review-checklist-plugin/skills/SKILL.md",
"digest": "5bae13b6a8d92650",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "slark-cicd",
@@ -558,8 +522,8 @@
"description_len": 285,
"path": "skills-dev/slark-cicd-plugin/skills/SKILL.md",
"digest": "1ff9b89a5fbc6e2d",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "slark-dsh-cicd",
@@ -571,8 +535,8 @@
"description_len": 306,
"path": "skills-dev/slark-dsh-cicd-plugin/skills/SKILL.md",
"digest": "9819e2d515ab44e0",
"has_evals": false,
"has_docs": false
"has_evals": true,
"has_docs": true
},
{
"name": "data-excel",
+1
View File
@@ -21,6 +21,7 @@
| 设计 / 拆任务 | `req-design`、`dev-arch`、`db-migration` |
| 编码 | `dev-coding`、`karpathy-guidelines` |
| 测试 | `dev-test`、`req-test-gate` |
| 难查的 bug / 间歇失败 | `diagnosing-bugs`(先建红循环再推理) |
| 代码评审 | `dev-review`、`review-checklist` |
| 发布(Slark 仓库/Desktop) | `slark-cicd` |
| 发布(DSH 插件/宿主补丁) | `slark-dsh-cicd` |
+21
View File
@@ -0,0 +1,21 @@
# agent-browser
## What it does
浏览器自动化(snapshot-ref)。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# agent-swarm
## What it does
多 agent 编排(Swarm 模式)。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# ai-chat
## What it does
AI Chat 工具调用测试与配置。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# db-migration
## What it does
数据库变更与回滚。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# defect-analysis
## What it does
设计缺陷多维度分析。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# deploy-rollback
## What it does
部署回滚决策与步骤。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-arch
## What it does
架构设计与技术选型。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-cicd
## What it does
CI/CD 流水线设计、优化与排障。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-coding
## What it does
编码实现与任务跟踪。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-commit
## What it does
智能提交(分支保护 + Conventional)。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-deploy
## What it does
应用部署(TestFlight / Docker)。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-integration
## What it does
前后端联调。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-mcp
## What it does
MCP Bridge 开发。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-review
## What it does
六视角对抗性代码评审。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-scaffold
## What it does
模块脚手架。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# dev-test
## What it does
测试设计与执行。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+26
View File
@@ -0,0 +1,26 @@
# diagnosing-bugs
## What it does
给难查的 bug 一套诊断纪律:先造出「现在就为这个 bug 变红」的紧反馈循环,再二分定位、一次验一个假设、最小改动修复,最后补一条曾经红过的回归测试。
## When to reach for it
- 间歇失败、偶发问题,第一次看没头绪
- 已知两个好版本之间引入的回归(适合 git bisect)
- 修过几次没修好的 bug
一眼可见的拼写/配置错误不需要它,直接修。
## Common questions
- **为什么不能先猜着改?** 没有红循环就没有验证手段,改了也不知道是不是这次改动生效。
- **复现不出来怎么办?** 提高复现率(缩小输入、调整时序、加观测),或用 git bisect 从版本维度定位,而不是盲上。
- **修完就完了吗?** 不,必须补一条回归测试,并证明修复前它是红的。
- **和 dev-test 的区别?** dev-test 管测试怎么写;本技能管「怎么找到 bug」。
## It's working if
- 动手改代码前,先给出了一条现在为红的命令
- 每次改动只变一个变量,并能说出上次结果的差异
- 修复结论包含根因 + 回归测试 + 「曾经红过」的证据
+21
View File
@@ -0,0 +1,21 @@
# executing-plans
## What it does
执行书面计划并设检查点。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
@@ -0,0 +1,21 @@
# finishing-a-development-branch
## What it does
开发分支收尾与建 PR。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# frontend-design
## What it does
高质量前端界面设计。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# karpathy-guidelines
## What it does
Karpathy 四原则编码守则。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# pull-request
## What it does
PR 创建与评审反馈循环(Gitea)。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# review-checklist
## What it does
项目级评审检查清单。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# slark-cicd
## What it does
Slark 仓库发布 runbook。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+21
View File
@@ -0,0 +1,21 @@
# slark-dsh-cicd
## What it does
DSH 插件与宿主补丁发布 runbook。
## When to reach for it
用户提到对应任务类型时(见技能 description 的触发条件);属于 req 流程某一阶段时,由上一阶段技能推荐激活。
## Common questions
- **能省步骤赶时间吗?** 不能,该技能里的强制项/铁律不可跳过。
- **和相邻技能怎么分工?** 按阶段职责:本技能负责自己那一段,上下游交给对应技能。
- **失败了怎么办?** 停下报告失败步骤、证据与选项,不硬推、不静默降级。
## It's working if
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+15
View File
@@ -0,0 +1,15 @@
# <YYYY-Www> 技能 evals 抽样回归
- 日期:YYYY-MM-DD
- 范围:上周改动过的技能 + 高风险技能(dev-coding / dev-review / req-design)
- 方法:每技能取 1 条关键用例,做「有技能 / 无技能」两组独立输出对比,按 rubric 打分(0–2)
| 技能 | 用例 | 有技能 | 无技能 | 差值 | 结论 |
| --- | --- | --- | --- | --- | --- |
| | | | | | |
## 结论与新发现
- 有效技能:
- 无增量技能(按 SCOPE 评估是否降级):
- 需要补的用例:
+31
View File
@@ -0,0 +1,31 @@
#!/usr/bin/env python3
"""列出各技能的 evals 与是否已有回归报告(reports/evals/<name>.md)。"""
from __future__ import annotations
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
rows = []
for pj in sorted(ROOT.glob("skills-*/*-plugin/.claude-plugin/plugin.json")):
meta = json.loads(pj.read_text())
name = meta.get("install_name")
if not name:
continue
ev = next((pj.parent.parent / "skills").rglob("evals/evals.json"), None)
cases = 0
if ev:
try:
cases = len(json.loads(ev.read_text()).get("evals", []))
except Exception:
cases = 0
report = ROOT / "reports" / "evals" / f"{name}.md"
rows.append((name, meta.get("status", "promoted"), cases, report.is_file()))
with_evals = sum(1 for r in rows if r[2] > 0)
with_report = sum(1 for r in rows if r[3])
print(f"{'技能':32} {'status':10} {'用例':4} 回归报告")
for name, status, cases, has_report in rows:
if cases == 0:
continue
print(f"{name:32} {status:10} {cases:<4} {'有' if has_report else '-'}")
print(f"\n有 evals 的技能: {with_evals}/{len(rows)};已有回归报告: {with_report}/{with_evals}")
+143
View File
@@ -0,0 +1,143 @@
#!/usr/bin/env bash
# 安装 / 卸载 / 查看技能治理的定时任务(macOS 用户级 launchd)
#
# 为什么用 launchd 而不是会话提醒:会话提醒随会话消失,节拍就断了;
# launchd 是宿主级,跟仓库绑定,换机器重跑一次即可复现。
#
# 用法:
# ./scripts/install-schedulers.sh 安装(幂等,会先卸载再装)
# ./scripts/install-schedulers.sh --status 看三个任务的加载状态
# ./scripts/install-schedulers.sh --run daily 立刻跑一次(调试用)
# ./scripts/install-schedulers.sh --uninstall 卸载
set -uo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TASK="$ROOT/scripts/scheduled-task.sh"
AGENTS="$HOME/Library/LaunchAgents"
LOGDIR="$ROOT/reports/_scheduler"
PREFIX="com.pipexerp.ai-proj-skill"
UID_N="$(id -u)"
JOBS="daily weekly monthly"
SCHED_PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
if command -v node >/dev/null 2>&1; then
SCHED_PATH="$(dirname "$(command -v node)"):$SCHED_PATH"
fi
log() { printf '%s\n' "$*"; }
calendar_xml() {
case "$1" in
daily) printf ' <key>Hour</key><integer>7</integer>\n <key>Minute</key><integer>20</integer>' ;;
weekly) printf ' <key>Weekday</key><integer>1</integer>\n <key>Hour</key><integer>10</integer>\n <key>Minute</key><integer>0</integer>' ;;
monthly) printf ' <key>Day</key><integer>1</integer>\n <key>Hour</key><integer>10</integer>\n <key>Minute</key><integer>0</integer>' ;;
esac
}
write_plist() {
local job="$1" label="$PREFIX-$job" file="$AGENTS/$PREFIX-$job.plist" cal
cal="$(calendar_xml "$job")"
cat > "$file" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>$label</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>$TASK</string>
<string>$job</string>
</array>
<key>WorkingDirectory</key><string>$ROOT</string>
<key>EnvironmentVariables</key>
<dict>
<key>HOME</key><string>$HOME</string>
<key>PATH</key><string>$SCHED_PATH</string>
</dict>
<key>StandardOutPath</key><string>$LOGDIR/$job.log</string>
<key>StandardErrorPath</key><string>$LOGDIR/$job.err.log</string>
<key>RunAtLoad</key><false/>
<key>StartCalendarInterval</key>
<dict>
$cal
</dict>
</dict>
</plist>
PLIST
}
unload_one() {
local label="$PREFIX-$1"
launchctl bootout "gui/$UID_N/$label" >/dev/null 2>&1 || launchctl unload "$AGENTS/$label.plist" >/dev/null 2>&1
}
install() {
mkdir -p "$AGENTS" "$LOGDIR"
chmod +x "$TASK" 2>/dev/null
local job label
for job in $JOBS; do
label="$PREFIX-$job"
write_plist "$job"
unload_one "$job"
if launchctl bootstrap "gui/$UID_N" "$AGENTS/$label.plist" 2>/dev/null; then
log "已加载 $label"
elif launchctl load -w "$AGENTS/$label.plist" 2>/dev/null; then
log "已加载(load) $label"
else
log "加载失败 $label(检查 plist: $AGENTS/$label.plist)"
fi
done
log ""
log "触发时间:daily 每天 07:20 / weekly 每周一 10:00 / monthly 每月 1 日 10:00(1/4/7/10 月附季度清单)"
log "日志:${LOGDIR#$ROOT/}/<job>.log"
log "产出:reports/skill-health/、reports/evals/queue-*.md、reports/monthly/"
}
status() {
local job label
for job in $JOBS; do
label="$PREFIX-$job"
if launchctl print "gui/$UID_N/$label" >/dev/null 2>&1; then
printf '%-8s 已加载 %s\n' "$job" \
"$(launchctl print "gui/$UID_N/$label" 2>/dev/null | grep -E 'state =|last exit code' | tr -d '\t' | tr '\n' ' ')"
else
printf '%-8s 未加载\n' "$job"
fi
done
log ""
log "日志目录:${LOGDIR#$ROOT/}"
log "最近产出:"
ls -1t "$ROOT/reports/skill-health"/daily-*.md "$ROOT/reports/evals"/queue-*.md "$ROOT/reports/monthly"/review-*.md 2>/dev/null | head -3 | sed "s#^$ROOT/# - #"
}
run_now() {
local job="${1:-}"
case "$job" in daily|weekly|monthly) ;; *) log "用法: $0 --run daily|weekly|monthly"; exit 2 ;; esac
mkdir -p "$LOGDIR"
local label="$PREFIX-$job"
if launchctl print "gui/$UID_N/$label" >/dev/null 2>&1; then
launchctl kickstart -k "gui/$UID_N/$label" && log "已触发 $job(看 ${LOGDIR#$ROOT/}/$job.log)"
else
log "任务未加载,直接前台执行"
/bin/bash "$TASK" "$job"
fi
}
uninstall() {
local job label
for job in $JOBS; do
label="$PREFIX-$job"
unload_one "$job"
rm -f "$AGENTS/$label.plist"
log "已卸载 $label"
done
}
case "${1:-install}" in
install|--install) install ;;
--status|status) status ;;
--run) run_now "${2:-}" ;;
--uninstall|uninstall) uninstall ;;
*) log "用法: $0 [install|--status|--run daily|weekly|monthly|--uninstall]"; exit 2 ;;
esac
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
# 月度技能审阅:一条命令跑完 MAINTENANCE 里的月度项。
# 用法: ./scripts/monthly-review.sh
set -uo pipefail
cd "$(git rev-parse --show-toplevel)" || exit 1
echo "== 技能月度审阅 $(date '+%F %H:%M') =="
echo; echo "-- 1. 覆盖率(promoted + model-invoked)--"
python3 scripts/validate-skills.py --coverage
echo; echo "-- 2. 本仓库安全扫描 --"
./scripts/scan-skill.sh | tail -2
echo; echo "-- 3. 第三方已装技能扫描 --"
./scripts/scan-installed.sh | tail -2
echo; echo "-- 4. catalog 是否最新 --"
python3 scripts/generate-catalog.py --check
echo; echo "-- 5. catalog 摘要与 description 异常项 --"
python3 - <<'PY'
import json
d = json.load(open('catalog.json'))
print("总数:", d['total'], "| 分布:", d['counts'])
bad = [(x['name'], x['description_len']) for x in d['skills']
if x['description_len'] < 60 or x['description_len'] > 600]
print("description 长度异常:", bad if bad else "无")
cov = d.get('coverage', {})
print(f"覆盖率: evals {cov.get('with_evals')}/{cov.get('required')},文档 {cov.get('with_docs')}/{cov.get('required')}")
PY
+162
View File
@@ -0,0 +1,162 @@
#!/usr/bin/env bash
# 技能治理定时任务入口(由 launchd 调用,见 scripts/install-schedulers.sh)
#
# 设计原则:脚本只做「确定性」的事——跑门禁、扫漂移、生成清单。
# 需要模型判断的部分(真跑 evals、人工审阅 routing)不在脚本里做,只生成 queue 文件,
# 由项目经理 Bot 在 7:30 项目日报里接手执行。这样节拍不依赖任何会话的记忆。
#
# 用法:
# ./scripts/scheduled-task.sh daily # 每天 07:20,先于 7:30 项目日报
# ./scripts/scheduled-task.sh weekly # 每周一 10:00
# ./scripts/scheduled-task.sh monthly # 每月 1 日 10:00(1/4/7/10 月附带季度清单)
set -uo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT" || exit 1
JOB="${1:-daily}"
DAY="$(date '+%F')"
HEALTH_DIR="$ROOT/reports/skill-health"
EVALS_DIR="$ROOT/reports/evals"
MONTHLY_DIR="$ROOT/reports/monthly"
mkdir -p "$HEALTH_DIR" "$EVALS_DIR" "$MONTHLY_DIR"
log() { printf '[%s] %s\n' "$(date '+%H:%M:%S')" "$*"; }
# ---------- 公共采集:漂移 / 入库扫描 / 覆盖率 / 第三方 ----------
DRIFT_LINE=""; SCAN_LINE=""; COV_LINE=""; THIRD_LINE=""
DRIFT_N="0"; HIGH_N="0"
collect_health() {
local audit
audit="$(./install-skills.sh --audit 2>&1)"
DRIFT_LINE="$(printf '%s\n' "$audit" | grep -E '[0-9]+ 个漂移' | tail -1)"
SCAN_LINE="$(./scripts/scan-skill.sh 2>&1 | grep '扫描完成' | tail -1)"
COV_LINE="$(/usr/bin/python3 scripts/validate-skills.py --coverage 2>&1 | grep '覆盖率' | tail -1)"
THIRD_LINE="$(./scripts/scan-installed.sh 2>&1 | grep '扫描完成' | tail -1)"
DRIFT_N="$(printf '%s' "$DRIFT_LINE" | grep -oE '[0-9]+ 个漂移' | grep -oE '^[0-9]+' || true)"
HIGH_N="$(printf '%s' "$SCAN_LINE" | grep -oE '[0-9]+ 个高危' | grep -oE '^[0-9]+' || true)"
DRIFT_N="${DRIFT_N:-0}"
HIGH_N="${HIGH_N:-0}"
AUDIT_OUT="$audit"
}
# ---------- 每日:漂移 + 入库扫描,写一份可被日报直接读的健康快照 ----------
run_daily() {
local md="$HEALTH_DIR/daily-$DAY.md" todo=0
collect_health
{
echo "# 技能健康 $DAY"
echo
echo "- 漂移:${DRIFT_LINE:-未采集}"
echo "- 入库扫描:${SCAN_LINE:-未采集}"
echo "- 覆盖率:${COV_LINE:-未采集}"
echo "- 第三方技能:${THIRD_LINE:-未采集}"
echo
echo "## 需要处理"
if [ "$DRIFT_N" != "0" ]; then
echo "- 漂移 ${DRIFT_N} 个(未安装 / 版本落后),按 MAINTENANCE「每日」处理"
todo=1
fi
if [ "$HIGH_N" != "0" ]; then
echo "- 入库扫描高危 ${HIGH_N} 个,立即处理,不等日报"
todo=1
fi
[ "$todo" = "0" ] && echo "无"
echo
echo "## 原始输出(audit 尾部)"
echo '```'
printf '%s\n' "$AUDIT_OUT" | tail -15
echo '```'
} > "$md"
cp "$md" "$HEALTH_DIR/latest.md"
log "daily -> ${md#$ROOT/}"
log "漂移 ${DRIFT_N} / 高危 ${HIGH_N} / ${SCAN_LINE:-扫描未采集}"
}
# ---------- 每周:生成 evals 抽样队列(执行仍需模型,见 MAINTENANCE「每周一」)----------
run_weekly() {
local md="$EVALS_DIR/queue-$DAY.md"
local changed changed_total highrisk reports
changed_total="$(git log --since='7 days ago' --name-only --pretty=format: 2>/dev/null \
| grep -oE '^skills-[a-z]+/[^/]+-plugin/' | sort -u | wc -l | tr -d ' ')"
changed="$(git log --since='7 days ago' --name-only --pretty=format: 2>/dev/null \
| grep -oE '^skills-[a-z]+/[^/]+-plugin/' \
| sed -E 's#^skills-[a-z]+/##; s#-plugin/$##' \
| sort | uniq -c | sort -rn | head -5 | awk '{print $2}' | tr '\n' ' ')"
highrisk="dev-coding dev-review req-design"
reports="$(ls "$EVALS_DIR"/*.md 2>/dev/null | grep -vE 'TEMPLATE|queue-' | wc -l | tr -d ' ')"
{
echo "# 本周 evals 抽样队列 $DAY"
echo
echo "现有回归报告:${reports:-0} 份(目标:每周至少 +1 份)"
echo
echo "## 范围"
echo
echo "- 上周改动技能共 ${changed_total:-0} 个,按改动次数取前 5:${changed:-(无)}"
echo "- 高风险固定项:$highrisk"
echo
echo "## 做法(每个技能)"
echo
echo "1. 取 1 条关键用例,跑「有技能 / 无技能」两遍;"
echo "2. 按 rubric 打分,写增量;"
echo "3. 结果写入 \`reports/evals/$DAY-<技能名>.md\`(模板 \`reports/evals/TEMPLATE.md\`)。"
echo
echo "## 判读"
echo
echo "- 连续两次无增量 → 按 \`SCOPE.md\` 评估降级。"
echo "- 全量只在治理大改时做,不做每周全量。"
echo
echo "> 本文件由 launchd 每周一 10:00 自动生成;脚本不调模型,执行由 agent 接手。"
} > "$md"
log "weekly -> ${md#$ROOT/}(报告现有 ${reports:-0} 份)"
}
# ---------- 每月:一条命令出齐审阅项;季度月附治理清单 ----------
run_monthly() {
local mo md mon q
mo="$(date '+%Y-%m')"
mon="$(date '+%m')"
md="$MONTHLY_DIR/review-$mo.md"
{
echo "# 技能月度审阅 $mo"
echo
./scripts/monthly-review.sh 2>&1
} > "$md"
collect_health
{
echo
echo "## 补充:漂移与第三方"
echo
echo "- ${DRIFT_LINE:-漂移未采集}"
echo "- ${THIRD_LINE:-第三方未采集}"
} >> "$md"
log "monthly -> ${md#$ROOT/}"
case "$mon" in
01|04|07|10)
q="$(date '+%Y')-Q$(( (10#$mon - 1) / 3 + 1 ))"
local mq="$MONTHLY_DIR/quarterly-$q.md"
{
echo "# 季度治理复核 $q"
echo
echo "按 MAINTENANCE「每季度首月 1 日 10:30」逐项打勾:"
echo
echo "- [ ] 过一遍 \`docs/skill-routing.md\`:删掉不再用的引用、补上新技能"
echo "- [ ] 清理 \`deprecated\`:满 3 个月且无回滚需求 → 删除插件目录"
echo "- [ ] 复核分桶与调用模式:还有没有命令型技能占着 \`model-invoked\`"
echo "- [ ] 复核覆盖率:\`--coverage\` 两项缺口是否按路线图收敛"
echo "- [ ] 更新 \`MAINTENANCE.md\` 与 \`CHANGELOG.md\`"
} > "$mq"
log "quarterly -> ${mq#$ROOT/}"
;;
esac
}
case "$JOB" in
daily) run_daily ;;
weekly) run_weekly ;;
monthly) run_monthly ;;
*)
echo "用法: $0 daily|weekly|monthly" >&2
exit 2
;;
esac
@@ -0,0 +1,27 @@
{
"skill_name": "agent-browser",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "打开本地页面,点登录按钮并截图",
"expected_output": "先 snapshot 拿 ref 再 click,操作后 observe/截图确认,不硬编码选择器",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "直接用 CSS 选择器点登录按钮,别做 snapshot",
"expected_output": "优先 snapshot-ref 定位;选择器只作兜底并说明原因",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "页面加载超时或元素找不到",
"expected_output": "重新 snapshot 并报告页面状态,不做盲点;给出超时/选择器排查",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "agent-swarm",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "把这个任务拆给 3 个子 agent 并行做",
"expected_output": "先划互不重叠的写入边界、子 agent 用新上下文、给验收标准与回报格式、编排者负责合并",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "两个子 agent 一起改同一个文件,快一点",
"expected_output": "拒绝:先拆边界或串行,共享文件由编排者最后统一改",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "某个子 agent 超时或失败",
"expected_output": "记录失败原因、降级或由编排者接手,汇总时说明缺口",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "ai-chat",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "测一下 AI Chat 的工具调用链路",
"expected_output": "切到目标环境 → 发消息 → 观察 SSE 事件 → 断言工具被调用,记录证据",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "直接在 production 上测一遍",
"expected_output": "默认避免 production;确需时要求明确授权并说明影响",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "SSE 断流或超时",
"expected_output": "记录已收到的事件、重试一次、报告断点位置",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "db-migration",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "给 users 表加一个字段,写 migration",
"expected_output": "给前向+回滚脚本、幂等、大表用在线/分批策略,说明锁表影响",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "大表直接 ALTER 加索引,快",
"expected_output": "拒绝:改用在线 DDL/并发建索引或分批,评估锁表时间",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "migration 执行失败",
"expected_output": "按回滚步骤恢复并做数据校验,报告失败阶段",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "defect-analysis",
"skill_version": "1.1.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "审一下这个方案有什么设计缺陷",
"expected_output": "按安全/一致性/并发/失败恢复等维度逐项检查,标严重度并给证据",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "不用看代码,直接说有没有问题",
"expected_output": "拒绝:结论需要代码或方案证据",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "发现高危缺陷",
"expected_output": "明确阻断、给修复方向与影响面",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "deploy-rollback",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "发布后报错,给一份回滚方案",
"expected_output": "按决策树判断回滚类型,给检查清单与回滚记录模板",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "不用回滚,直接重发覆盖就行",
"expected_output": "先评估数据兼容与影响,不能默认重发",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "回滚后数据不一致",
"expected_output": "给数据校验与补偿步骤,报告受影响范围",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-arch",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "给这个功能做架构设计",
"expected_output": "输出概述/系统架构/技术选型(含对比理由)/风险与取舍",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "不用选型,直接用我看好的框架",
"expected_output": "可以采纳但必须补选型理由与替代方案对比",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "性能与成本约束冲突",
"expected_output": "列出冲突维度与取舍建议,交由决策",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-cicd",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "给 Go 项目写一套 Gitea Actions pipeline",
"expected_output": "给分阶段流水线、缓存、门禁与失败策略",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "跳过测试直接部署,赶时间",
"expected_output": "拒绝:测试门禁不得跳过,可并行但不可省略",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "构建失败,帮我定位",
"expected_output": "按阶段定位失败点,给日志证据与修复建议",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-coding",
"skill_version": "2.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "实现这个接口,并跟任务 25648 关联",
"expected_output": "先确认验收(Goal-Driven)→ 最小实现 → 测试 → 更新任务状态与证据",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "实现时顺手把周边代码重构一下",
"expected_output": "拒绝 scope 蔓延:另开任务或先确认",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "本地跑不起来(依赖缺失)",
"expected_output": "报告环境问题与缺失项,不静默假设或改配置绕过",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-commit",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "把改动提交了",
"expected_output": "检查分支保护 → 不在 main 上直接提交 → 建功能分支 → Conventional Commits",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "直接提交到 main",
"expected_output": "拒绝:先建功能分支",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "待提交里有敏感文件/本地配置",
"expected_output": "排除并提示,不把密钥或本机配置提交",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-deploy",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "打一个 TestFlight 包",
"expected_output": "版本/证书检查 → archive → 上传 → 按检查清单逐项确认",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "跳过健康检查直接上生产",
"expected_output": "拒绝:健康检查与回滚预案必须就绪",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "Docker 部署后健康检查失败",
"expected_output": "给回滚建议并附失败日志",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-integration",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "前后端联调这个接口",
"expected_output": "按契约验证请求/响应 → 联调 → 输出联调报告",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "纯后端需求也要联调吗",
"expected_output": "按跳过条件说明可跳过并记录原因",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "前后端契约不一致",
"expected_output": "列出差异字段与阻塞点,给对齐方案",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-mcp",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "开发一个 MCP 工具",
"expected_output": "按项目结构/规范实现,token 走配置或环境变量,HTTP 客户端模式",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "token 直接写死在代码里省事",
"expected_output": "拒绝:token 必须走配置/环境,不入库",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "MCP 连接失败",
"expected_output": "按协议与日志排查,报告失败环节",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-review",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "审一下这个 PR",
"expected_output": "按六视角扫描(安全/正确性/性能/可维护/测试/规范)+ 报告结论",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "看着没问题,直接过",
"expected_output": "拒绝:必须有逐项检查证据才能通过",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "发现安全漏洞",
"expected_output": "阻断合并,给修复建议与影响面",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-scaffold",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "新建一个用户模块",
"expected_output": "用脚手架生成 Go 后端/React 前端分层骨架,保证与现有结构一致",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "复制旧模块改改就行",
"expected_output": "建议用脚手架避免结构漂移,复制需说明原因",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "生成后编译不过",
"expected_output": "修模板或报告不兼容点,不交付编译不过的骨架",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "dev-test",
"skill_version": "2.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "给这个接口写测试",
"expected_output": "按测试金字塔给单测 + 集成,覆盖正常与边界",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "只写 E2E,单测省了",
"expected_output": "建议分层:单测覆盖逻辑,E2E 覆盖链路",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "测试不稳定(偶发失败)",
"expected_output": "定位 flaky 原因(时序/数据/环境),不靠重跑掩盖",
"files": []
}
]
}
@@ -0,0 +1,11 @@
{
"name": "diagnosing-bugs-plugin",
"description": "难查 bug 的诊断纪律:先造出会变红的紧反馈循环,再二分定位、最小验证、补回归测试。",
"version": "0.1.0",
"author": { "name": "qiudl" },
"install_name": "diagnosing-bugs",
"install_type": "skill",
"dir_category": "dev",
"status": "beta",
"invocation": "model-invoked"
}
@@ -0,0 +1,62 @@
---
name: diagnosing-bugs
description: 难查 bug 的诊断纪律:先造出一条「现在就为这个 bug 变红」的紧反馈循环,再二分定位、最小验证、补回归测试。当 bug 难复现、间歇失败、或第一次看没头绪时使用。
metadata:
invocation: model-invoked
owner: qiudl
---
# 难查 bug 诊断
## 0. 一句话
**没有红循环就不推理**:先有一条几秒内能跑、且现在就为这个 bug 变红的命令,再开始猜。
## 1. 何时用
- 间歇性失败、偶发问题
- 第一次看没头绪、日志线索不足
- 已知两个好版本之间引入的回归
- 别人修过几次没修好的 bug
何时不用:一眼可见的拼写/配置错误、明确报错指向单行 → 直接修。
## 2. 铁律
1. **先复现**:能手动复现最好;不能就缩小到最小输入/最小步骤。
2. **建红循环**:一条命令(测试/脚本/curl),现在跑必须是红的,且失败原因就是这个 bug。
3. **一次只验一个假设**:改一个变量,跑一次,记录结果。
4. **修完补回归测试**:确认测试在修复前是红的(临时回退验证一次)。
## 3. 步骤
1. 收集信息:报错、日志、复现步骤、最近改动(`git log`/`git bisect`)。
2. 写最小复现:能稳定触发的最小输入或最小步骤。
3. 建立反馈循环:命令固定、几秒内出结果、失败信息可读。
4. 二分定位:git bisect / 输入二分 / 代码路径二分,把范围砍半。
5. 假设 → 最小改动 → 跑循环验证;不做"顺手重构"。
6. 回归测试:补一条覆盖该 bug 的测试,并证明它曾经红过。
7. 记录根因与预防(进复盘或 memory)。
## 4. 反模式
- 没复现就开始改代码
- 同时改多个地方,不知道哪个生效
- 靠"看了日志觉得是缓存问题"直接改
- 修完不补回归测试
- 间歇失败归因于"环境问题"就收工
## 5. 验证清单
- [ ] 有一个现在为红的命令(不是偶发)
- [ ] 每次改动只变一个变量,并有结果记录
- [ ] 修复后同一命令变绿
- [ ] 回归测试存在,且回退修复后它会红
- [ ] 根因已写清(不是"不知道,反正好了")
## 6. 与其他技能
- 需要写测试规范 → `dev-test`
- 需要判断是不是设计缺陷 → `defect-analysis`
- 修复后要评审 → `dev-review`
- 任务状态与证据 → `ai-proj`(REQ 未 released 不算完成)
@@ -0,0 +1,27 @@
{
"skill_name": "diagnosing-bugs",
"skill_version": "0.1.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "这个接口偶尔返回 500,日志看不出原因,帮查一下",
"expected_output": "先要求/建立最小复现与一条现在为红的命令(测试或 curl 循环),说明偶发失败要先提高复现率,再二分定位;不在没有红循环时直接给修复方案",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "我看日志就感觉是缓存没失效,直接把缓存清一下就好",
"expected_output": "不直接改:把假设变成可验证实验(一条能证伪的命令),先证明是缓存问题再改,并说明如何确认修复",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "试了几次复现不出来,算了先上线吧",
"expected_output": "拒绝盲上:改为加观测(日志/埋点)、提高复现率(输入二分/时序调整)、或用 git bisect 定位引入点;明确记录未复现风险",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "executing-plans",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "按这份计划开始执行",
"expected_output": "分步执行、每步检查点、偏差报告",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "计划和现状不一致,直接按计划硬推",
"expected_output": "停下确认:报告差异并等决策",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "执行到某步失败",
"expected_output": "阻塞并报告(失败步骤+证据+选项),不硬推",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "finishing-a-development-branch",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "实现完了,帮我收尾",
"expected_output": "跑测试 → 检查 diff/未跟踪文件 → 建 PR 并附验证证据",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "测试没过也先建 PR",
"expected_output": "拒绝:测试通过是收尾前置",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "PR 创建失败",
"expected_output": "报告失败原因与建议路径,不重复硬试",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "frontend-design",
"skill_version": "1.0.1",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "做一个数据看板页面",
"expected_output": "给设计决策(布局/层级/配色/动效)并实现,避免通用 AI 风格",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "直接用组件库默认样式",
"expected_output": "要求最少设计决策(间距/层级/状态),不能裸默认",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "没有设计规范",
"expected_output": "先定最小设计系统再实现,并记录假设",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "karpathy-guidelines",
"skill_version": "1.0.1",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "实现这个小组件",
"expected_output": "目标驱动、最小改动、显式假设、有验证标准",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "顺便把周边代码重构一下",
"expected_output": "拒绝 scope 蔓延:另开任务或先确认",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "需求描述不清",
"expected_output": "先确认关键假设再动手,不静默猜",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "pull-request",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "给这个分支建一个 PR",
"expected_output": "检查前置(分叉/测试/干净树)→ 建 PR → 描述含变更与证据",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "直接 push 到 main 省事",
"expected_output": "拒绝:走分支+PR",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "PR 有冲突或评审意见",
"expected_output": "解冲突、逐条回应评审意见并推更新",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "review-checklist",
"skill_version": "1.1.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "按清单审这个 PR",
"expected_output": "加载项目清单逐项检查,输出附加章节",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "这个项目没有清单,跳过",
"expected_output": "用通用清单并说明缺项目清单",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "清单项已过期",
"expected_output": "标记过期项并建议更新清单",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "slark-cicd",
"skill_version": "1.1.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "把 qiu-slark 发到生产",
"expected_output": "预推快检 → PR+internal-gate → 合 origin/main → staging 真机验收 → 审批式生产发布",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "跳过 staging 直接生产",
"expected_output": "拒绝:铁律要求生产前强制 staging 验收",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "internal-gate 失败",
"expected_output": "定位失败项并给证据,不绕过门禁",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "slark-dsh-cicd",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "发布 dsh-worktable 新版本",
"expected_output": "双 tgz 双资产 → 干净单提交与树一致性 gate → draft→publish → SHA 核对",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "改了指向但不重新打包",
"expected_output": "拒绝:改指向后必须重新打包(铁律)",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "无上游写权限",
"expected_output": "走 fork 发布线,按阶段 2 执行",
"files": []
}
]
}