Compare commits

...
Author SHA1 Message Date
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
johnQ 6f5151fcb5 docs(skill): 覆盖率阶段 1 完成 —— core + req 全部补齐 evals 与四段式文档
skill-gate / gate (pull_request) Waiting to run
- 新增 14 个技能的 evals/evals.json(每技能 3 条:正常/边界/失败恢复)
- 新增 14 篇 docs/skills/*.md(What/When/Common questions/It's working if)
- 覆盖 core:pm-ask、pm-risk(ai-proj 已于样板提交)
- 覆盖 req:req-audit/compare/design/dev/lookback/prd/prototype/research/retro/review/test-gate/workflow
- coverage: 38 -> 24(剩余 dev 类等进入阶段 2/3)
2026-11-01 05:14:51 +08:00
johnQ e6ebfd6b9f docs(skill): 覆盖率阶段 1 样板 —— req / ai-proj 的 evals 与四段式文档
- skills-req/req-plugin/skills/evals/evals.json(3 条:正常/边界/失败恢复)
- docs/skills/req.md(What/When/Common questions/It's working if)
- skills-core/ai-proj-plugin/skills/evals/evals.json
- docs/skills/ai-proj.md
- coverage: 40 -> 38
2026-11-01 05:07:53 +08:00
qiudl 26b8fd04b9 Merge pull request 'feat(skill): 本地 git 门禁 + 项目级安装 + 覆盖率与第三方扫描' (#16) from chore/skill-governance-v2 into main
skill-gate / gate (push) Waiting to run
feat(skill): 本地 git 门禁 + 项目级安装 + 覆盖率与第三方扫描
2026-10-31 21:04:27 +00:00
johnQ 04e20babc1 feat(skill): 本地 git 门禁 + 项目级安装 + 覆盖率与第三方扫描
skill-gate / gate (pull_request) Waiting to run
- hooks/git/{pre-commit,pre-push} + scripts/install-git-hooks.sh(Gitea Actions 无 runner,本地兜底)
- install-skills.sh: --scope project --project-dir(装到项目 .agents/skills)
- scripts/scan-installed.sh: 扫第三方已装技能(33 个,0 高危)
- generate-catalog: has_evals/has_docs + coverage;validate --coverage + 路由一致性检查
- SCOPE 覆盖率路线图(3-4 周补齐 40 个技能的 evals 与四段式文档)
- MAINTENANCE/README/CHANGELOG 同步
2026-11-01 05:04:14 +08:00
qiudl 748ea68aa0 Merge pull request 'docs: 新增技能维护节奏 MAINTENANCE.md' (#15) from docs/maintenance-cadence into main
docs: 新增技能维护节奏 MAINTENANCE.md
2026-10-31 14:26:05 +00:00
johnQ 26352c4c69 docs: 新增技能维护节奏 MAINTENANCE.md 并在 README 挂入口 2026-10-31 22:26:00 +08:00
qiudl 6321a8528a Merge pull request 'chore(skill): 安全扫描警告清零 + 加入 skill-gate CI' (#14) from chore/scan-cleanup-and-ci into main
skill-gate / gate (push) Waiting to run
chore(skill): 安全扫描警告清零 + 加入 skill-gate CI
2026-10-31 14:24:12 +00:00
106 changed files with 3039 additions and 66 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
+30
View File
@@ -38,3 +38,33 @@
- 允许清单登记 6 类运维环境地址与示例占位符(非凭据),附理由。
- 安全扫描:57 个警告 → **0 个警告、0 个高危**。
- 新增 `.gitea/workflows/skill-gate.yml`:PR/main 跑 `validate --strict` + `scan` + `catalog --check` + 安装器测试。
- 新增 `MAINTENANCE.md`:技能维护节奏(每日漂移、每周 evals 抽样、每月目录审阅、每季度治理复核)。
### 治理增强(2026-11-01)
- 新增 git 门禁:`hooks/git/pre-commit`(validate --strict / scan / catalog --check)+ `pre-push`(安装器测试),`scripts/install-git-hooks.sh` 一键安装(Gitea Actions 无 runner,本地兜底)。
- `install-skills.sh` 支持 `--scope project --project-dir <根>`:装到项目 `.agents/skills`,独立状态文件。
- 新增 `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,待观察后晋升)。
+73
View File
@@ -0,0 +1,73 @@
# 技能维护节奏
> 配套 `SCOPE.md`(收不收)、`skill-creator`(怎么建)、`docs/skill-routing.md`(用哪个)。
> 本文件管「多久做一次什么」。
## 每次改动(任何分支)
> **批量提交前先建分支**:`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`。
- 本机已用 `./scripts/install-git-hooks.sh` 装好 pre-commit / pre-push,commit/push 时自动执行;Gitea Actions 暂无 runner,不能依赖 CI。
- 跳过单次:`SKILL_GATE_SKIP=1 git commit ...`,提交信息里写原因。
3. 技能有增删改 → **同步回改** `docs/skill-routing.md` 与 `catalog.json`。
4. 更新 `plugin.json` 版本号与 `CHANGELOG.md`。
## 每日(随 7:30 项目日报)
- 两台机器跑 `install-skills.sh --audit`:**drift > 0 就要报**,并注明是「未安装 / 版本落后 / 本地改动」。
- 门禁失败或扫描出高危:立即处理,不等到日报。
- 例外:`beta` 与 `deprecated` 不计入 drift。
## 每周一 10:00 — evals 抽样回归
- 范围:上周改过的技能 + 3 个高风险技能(`dev-coding`、`dev-review`、`req-design`)。
- 每技能取 1 条关键用例,做「有技能 / 无技能」对比,按 rubric 打分。
- 结果记录到 `reports/evals/YYYY-Www.md`(模板 `reports/evals/TEMPLATE.md`),进周报。
- 用 `python3 scripts/evals-status.py` 看哪些技能已有 evals、哪些已有回归报告。
- 连续两次无增量的技能 → 按 `SCOPE.md` 评估降级。
- 不做全量(61 技能 × 3 用例成本过高);全量只在治理大改时做。
## 每月 1 日 10:00 — 漂移与目录审阅
- 两台机器 `--audit` 漂移必须为 0(beta/deprecated 除外)。
- 审 `catalog.json`:`description` 长度 <80 或 >600 的标黄;含「各种 / 等等 / 相关」这类泛化词的标出。
- 第三方技能(arkcli 等)有变动时,评估是否影响团队技能;跑一次 `./scripts/scan-installed.sh`。
- 跑 `./scripts/monthly-review.sh` 一次出齐:覆盖率、本仓库扫描、第三方扫描、catalog 一致性、description 异常项。
## 每季度首月 1 日 10:30 — 治理复核
- 人工过一遍 `docs/skill-routing.md`:删掉不再用的引用、补上新技能。
- 清理 `deprecated`:满 3 个月且无回滚需求 → 删除插件目录。
- 复核分桶与调用模式:还有没有命令型技能占着 `model-invoked`。
- 复核覆盖率:`--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:执行节奏、出周/月报、盯漂移与门禁。
- 改技能的 agent:负责门禁四件套与路由回改。
- 人工拍板项:废弃技能、路由变更、`promoted` 晋升。
+13 -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`:
@@ -208,5 +216,9 @@ A: SSE 模式直连远程服务器,零依赖开箱即用(推荐)。stdio
- Claude(兼容):`./install-skills.sh --agent claude`
- 看漂移:`./install-skills.sh --audit`
- **校验 / 安全 / 清单**:`python3 scripts/validate-skills.py`、`./scripts/scan-skill.sh`、`python3 scripts/generate-catalog.py`
- **本地门禁(Gitea Actions 无 runner,用 git hook 兜底)**:`./scripts/install-git-hooks.sh` 后,每次 commit 自动跑 `validate --strict` + `scan` + `catalog --check`,push 前跑安装器测试。跳过单次:`SKILL_GATE_SKIP=1`。
- **项目级安装**:`./install-skills.sh --agent codex --scope project --project-dir <项目根>` → 装到 `<项目根>/.agents/skills`。
- **第三方技能风险扫描**:`./scripts/scan-installed.sh`(扫已装但非本仓库管理的技能)。
- **建技能**:走 `skill-creator` 技能(收录门槛、分桶、调用模式、evals、四段式文档、路由回改),不要手写。
- **路由表**:`docs/skill-routing.md`(什么任务用哪个技能,人读;由原 `ai-proj-helper-entry` 技能降级而来)。
- **维护节奏**:`MAINTENANCE.md`(每次改动 / 每日 / 每周 / 每月 / 每季度各做什么)。
+14
View File
@@ -43,3 +43,17 @@
3. `./scripts/scan-skill.sh` 无高危项。
4. `python3 scripts/generate-catalog.py` 更新 `catalog.json`。
5. 版本号 + CHANGELOG 更新,走 PR。
## 覆盖率路线图(evals 与四段式文档)
目标集合:`promoted` 且 `model-invoked` 的技能(当前 40 个)。用户级命令技能(`user-invoked`)只要求四段式文档,不强制 evals。
| 阶段 | 范围 | 验收 |
| --- | --- | --- |
| 第 1 周 | `core/` + `req/` 类(约 15 个) | `--coverage` 里这些类目缺口为 0 |
| 第 2 周 | `dev/` 类(约 20 个) | 同上 |
| 第 3–4 周 | 其余(`integration/`、`biz/` 里仍 model-invoked 的) | 全量缺口为 0 |
每个技能的最低要求:`evals/evals.json` 3 条(正常 / 边界 / 失败恢复)+ `docs/skills/<name>.md` 四段式(What it does / When to reach for it / Common questions / It's working if)。
先用 `python3 scripts/validate-skills.py --coverage` 看当前缺口,再按阶段补。
+206 -63
View File
@@ -1,12 +1,20 @@
{
"repo": "ai-proj-helper",
"generated_at": "2026-10-31T14:24:05Z",
"total": 61,
"coverage": {
"required": 40,
"with_evals": 40,
"with_docs": 40,
"missing_evals": [],
"missing_docs": []
},
"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": [
@@ -19,7 +27,9 @@
"description": "商务合同撰写。支持多种合同类型:软件订阅合同、软件定制开发合同、物流合同、销售服务合同、贸易合同等。当用户提到合同、协议、签约、合作协议相关任务时自动激活。",
"description_len": 78,
"path": "skills-biz/biz-contract-plugin/skills/SKILL.md",
"digest": "3c17cae1380d82a4"
"digest": "3c17cae1380d82a4",
"has_evals": false,
"has_docs": false
},
{
"name": "biz-ops",
@@ -30,7 +40,9 @@
"description": "商务运营技能。支持商业计划书(BP)撰写和商务合同起草。当用户提到商业计划书、BP、融资计划、商业模式、合同、协议、签约等相关任务时自动激活。",
"description_len": 71,
"path": "skills-biz/biz-ops-plugin/skills/SKILL.md",
"digest": "aa5433074ba277d6"
"digest": "aa5433074ba277d6",
"has_evals": false,
"has_docs": false
},
{
"name": "biz-plan",
@@ -41,7 +53,9 @@
"description": "商业计划书撰写。支持融资BP、战略规划、商业模式设计等。当用户提到商业计划书、BP、融资计划、商业模式、战略规划相关任务时自动激活。",
"description_len": 66,
"path": "skills-biz/biz-plan-plugin/skills/SKILL.md",
"digest": "b6f43a914b2f7b45"
"digest": "b6f43a914b2f7b45",
"has_evals": false,
"has_docs": false
},
{
"name": "finance",
@@ -52,7 +66,9 @@
"description": "财务对账技能。支持银行对账、应收对账、应付对账、内部往来对账等。通过自然语言实现账单导入、差异分析、对账报告生成。当用户提到对账、银行流水、应收应付、账单核对、财务核销相关任务时自动激活。",
"description_len": 94,
"path": "skills-biz/finance-plugin/skills/SKILL.md",
"digest": "0a9209bc4bf4db3a"
"digest": "0a9209bc4bf4db3a",
"has_evals": false,
"has_docs": false
},
{
"name": "ai-proj-helper-entry",
@@ -63,7 +79,9 @@
"description": "ai-proj-helper 技能库路由:告诉你有哪些技能、什么任务用哪个、以及「REQ released + PDV 通过才算交付」的强制口径。人在开始需求/开发/评审/发布任务前主动调用。",
"description_len": 96,
"path": "skills-core/ai-proj-helper-entry-plugin/skills/SKILL.md",
"digest": "41d39b76d4c71dbf"
"digest": "41d39b76d4c71dbf",
"has_evals": true,
"has_docs": false
},
{
"name": "ai-proj",
@@ -74,7 +92,9 @@
"description": "ai-proj 任务与需求管理。用于创建/查询/更新需求、任务、文档。当用户提到 ai-proj、任务管理、需求管理、REQ-XXX 相关操作时自动激活。",
"description_len": 77,
"path": "skills-core/ai-proj-plugin/skills/SKILL.md",
"digest": "77ce4d2eb10e1d29"
"digest": "77ce4d2eb10e1d29",
"has_evals": true,
"has_docs": true
},
{
"name": "pm-ask",
@@ -85,7 +105,9 @@
"description": "基于 ai-proj MCP + git log 真实数据的项目问答。禁止编造。当用户说\"/ask\"、\"问一下\"、\"统计一下\"、\"最近多少\"、\"谁做了多少\"、\"本月进度\"等项目相关问题时自动激活。",
"description_len": 98,
"path": "skills-core/pm-ask-plugin/skills/SKILL.md",
"digest": "e5b69a0b56985472"
"digest": "e5b69a0b56985472",
"has_evals": true,
"has_docs": true
},
{
"name": "pm-risk",
@@ -96,7 +118,9 @@
"description": "三维度项目风险扫描(需求层/代码层/流程层)。当用户说\"/risk\"、\"风险扫描\"、\"有什么风险\"、\"哪些需求停滞了\"、\"分支健康\"时自动激活。",
"description_len": 72,
"path": "skills-core/pm-risk-plugin/skills/SKILL.md",
"digest": "928cfec76018329f"
"digest": "928cfec76018329f",
"has_evals": true,
"has_docs": true
},
{
"name": "publish",
@@ -107,7 +131,9 @@
"description": "发布 ai-proj-helper 技能市场更新并通知飞书群。用户说 /publish 时激活。",
"description_len": 48,
"path": "skills-core/publish-plugin/skills/SKILL.md",
"digest": "48bfbb4149baddcc"
"digest": "48bfbb4149baddcc",
"has_evals": false,
"has_docs": false
},
{
"name": "skill-creator",
@@ -118,7 +144,9 @@
"description": "团队技能的标准流程:收录门槛、分桶生命周期、调用模式、SKILL.md 规范、evals 全量、四段式文档、路由回改。当要新建技能、大改现有技能、或评审一个技能是否合格时使用。",
"description_len": 88,
"path": "skills-core/skill-creator-plugin/skills/SKILL.md",
"digest": "18f18c43c3fa56a6"
"digest": "18f18c43c3fa56a6",
"has_evals": true,
"has_docs": false
},
{
"name": "agent-browser",
@@ -129,7 +157,9 @@
"description": "浏览器自动化技能。用于网页交互、E2E冒烟测试、需求验收验证、前端开发验证、截图对比。基于 Vercel agent-browser CLI。",
"description_len": 71,
"path": "skills-dev/agent-browser-plugin/skills/SKILL.md",
"digest": "f382bffe3d1c84b2"
"digest": "f382bffe3d1c84b2",
"has_evals": true,
"has_docs": true
},
{
"name": "agent-swarm",
@@ -140,7 +170,9 @@
"description": "Multi-agent orchestration using OpenAI Swarm patterns. Coordinate specialized agents for complex development workflows with handoffs and context sharing.",
"description_len": 153,
"path": "skills-dev/agent-swarm-plugin/skills/SKILL.md",
"digest": "4164f82025a421bb"
"digest": "4164f82025a421bb",
"has_evals": true,
"has_docs": true
},
{
"name": "ai-chat",
@@ -151,7 +183,9 @@
"description": "AI Chat 测试与管理。发送消息测试 AI Chat 工具调用链路,管理工具开关和 Provider 配置,支持 local/staging 环境切换。",
"description_len": 78,
"path": "skills-dev/ai-chat-plugin/skills/SKILL.md",
"digest": "81193de50b43d95c"
"digest": "81193de50b43d95c",
"has_evals": true,
"has_docs": true
},
{
"name": "ai-proj-cicd-release",
@@ -162,7 +196,9 @@
"description": "Execute and audit the AI-Proj service CI/CD flow across Gitea gates, immutable image builds, staging verification, approved production release, rollback, and evidence capture. Use for AI-Proj CI status, release PRs, staging or production deployments, failed-release diagnosis, deployed commit/schema verification, and delivery-chain repair. Do not use for unrelated repositories or macOS application packaging.",
"description_len": 410,
"path": "skills-dev/ai-proj-cicd-release-plugin/skills/SKILL.md",
"digest": "49ef1b6865c2f1b3"
"digest": "49ef1b6865c2f1b3",
"has_evals": false,
"has_docs": false
},
{
"name": "ai-proj-macos-release",
@@ -173,7 +209,9 @@
"description": "Build, sign, notarize, publish, and verify the AI-Proj macOS Apple Silicon package through the repository's release chain. Use when asked to release, republish, update, or repair the downloadable macOS application, including Gatekeeper failures and download-manifest updates. Do not use for service deployments or unrelated applications.",
"description_len": 337,
"path": "skills-dev/ai-proj-macos-release-plugin/skills/SKILL.md",
"digest": "6f2496b941706137"
"digest": "6f2496b941706137",
"has_evals": false,
"has_docs": false
},
{
"name": "db-migration",
@@ -184,7 +222,9 @@
"description": "数据库变更方案插件。Migration 脚本生成、数据迁移策略、回滚方案。挂载在 design 阶段,涉及数据库变更时由 req-design 推荐激活。",
"description_len": 77,
"path": "skills-dev/db-migration-plugin/skills/SKILL.md",
"digest": "f8d6ebbddbbf7a71"
"digest": "f8d6ebbddbbf7a71",
"has_evals": true,
"has_docs": true
},
{
"name": "defect-analysis",
@@ -195,7 +235,9 @@
"description": "系统性设计缺陷分析。对需求方案/代码架构进行多维度检查,发现隐藏的技术风险和设计漏洞。当用户提到缺陷检查、方案审查、设计审计时自动激活。",
"description_len": 68,
"path": "skills-dev/defect-analysis-plugin/skills/SKILL.md",
"digest": "23dfafda92d0c622"
"digest": "23dfafda92d0c622",
"has_evals": true,
"has_docs": true
},
{
"name": "deploy-rollback",
@@ -206,7 +248,9 @@
"description": "回滚方案插件。部署后发现问题时的回滚策略和执行步骤。挂载在 deploy 阶段,部署出问题时激活。",
"description_len": 49,
"path": "skills-dev/deploy-rollback-plugin/skills/SKILL.md",
"digest": "75ebf66a3f74195a"
"digest": "75ebf66a3f74195a",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-android",
@@ -217,7 +261,9 @@
"description": "Android 开发插件。Kotlin + Jetpack Compose + Hilt 依赖注入。当涉及 Android 开发任务时按需加载。",
"description_len": 72,
"path": "skills-dev/dev-android-plugin/skills/SKILL.md",
"digest": "fb058d1059b56cdd"
"digest": "fb058d1059b56cdd",
"has_evals": false,
"has_docs": false
},
{
"name": "dev-arch",
@@ -228,7 +274,9 @@
"description": "软件架构设计技能。用于系统设计、技术选型、架构评审、设计文档编写。当用户提到架构设计、系统设计、技术方案、API 设计相关任务时自动激活。",
"description_len": 69,
"path": "skills-dev/dev-arch-plugin/skills/SKILL.md",
"digest": "c9a419c83a307a11"
"digest": "c9a419c83a307a11",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-cicd",
@@ -239,7 +287,9 @@
"description": "CI/CD 流水线设计、优化与排查。适配 Gitea Actions + Go/Swift/Next.js/Docker 栈。当用户提到 CI、CD、流水线、pipeline、workflow、构建失败、runner 相关任务时自动激活。",
"description_len": 119,
"path": "skills-dev/dev-cicd-plugin/skills/SKILL.md",
"digest": "a763f0f140516411"
"digest": "a763f0f140516411",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-coding",
@@ -250,7 +300,9 @@
"description": "软件编码开发技能。用于代码编写、功能实现、重构优化。集成 ai-proj CLI 进行任务管理和进度跟踪。核心支持 Go 后端 + Vue/React 前端开发。",
"description_len": 81,
"path": "skills-dev/dev-coding-plugin/skills/SKILL.md",
"digest": "cc43720aa12bb8f6"
"digest": "cc43720aa12bb8f6",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-commit",
@@ -261,7 +313,9 @@
"description": "智能 git commit — 分支保护 + 自动建功能分支 + Conventional Commits 生成。当用户说\"提交代码\"、\"commit\"、\"/commit\"、\"保存修改\"时自动激活。",
"description_len": 99,
"path": "skills-dev/dev-commit-plugin/skills/SKILL.md",
"digest": "1560658c4a30df45"
"digest": "1560658c4a30df45",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-deploy",
@@ -272,7 +326,9 @@
"description": "应用部署技能。支持 iOS TestFlight、Docker 容器等多平台部署。当用户提到部署、发布、TestFlight、上架、build、archive 相关任务时自动激活。",
"description_len": 90,
"path": "skills-dev/dev-deploy-plugin/skills/SKILL.md",
"digest": "fd15a9e9135bcc49"
"digest": "fd15a9e9135bcc49",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-integration",
@@ -283,7 +339,9 @@
"description": "前后端联调技能。API 契约验证、接口对接、联调报告生成。对应 req 流程 integration 阶段。纯后端需求自动跳过。",
"description_len": 64,
"path": "skills-dev/dev-integration-plugin/skills/SKILL.md",
"digest": "eff6be8eb57b7fef"
"digest": "eff6be8eb57b7fef",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-ios",
@@ -294,7 +352,9 @@
"description": "iOS 开发插件。Swift/SwiftUI + MVVM 架构,TestFlight 部署。当涉及 iOS 开发任务时按需加载。",
"description_len": 65,
"path": "skills-dev/dev-ios-plugin/skills/SKILL.md",
"digest": "44499e31f1abd5e2"
"digest": "44499e31f1abd5e2",
"has_evals": false,
"has_docs": false
},
{
"name": "dev-mcp",
@@ -305,7 +365,9 @@
"description": "MCP Bridge 开发插件。TypeScript MCP 服务开发,Token 管理,HTTP 客户端模式。当涉及 mcp-task-bridge 开发时按需加载。",
"description_len": 84,
"path": "skills-dev/dev-mcp-plugin/skills/SKILL.md",
"digest": "83d5912212fcfa4a"
"digest": "83d5912212fcfa4a",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-pda",
@@ -316,7 +378,9 @@
"description": "PDA 应用开发插件。Android 原生 + 扫码枪集成 + 离线优先。当涉及 PDA/手持终端开发时按需加载。",
"description_len": 57,
"path": "skills-dev/dev-pda-plugin/skills/SKILL.md",
"digest": "2524f2ecd4f2a834"
"digest": "2524f2ecd4f2a834",
"has_evals": false,
"has_docs": false
},
{
"name": "dev-review",
@@ -327,7 +391,9 @@
"description": "代码评审技能。六视角对抗性扫描法(含 Karpathy Scope 审计),用于 PR 代码审查、安全评审、质量检查。当执行 /req cr 或独立 PR review 时自动激活。",
"description_len": 91,
"path": "skills-dev/dev-review-plugin/skills/SKILL.md",
"digest": "a8a1ec79b85e3227"
"digest": "a8a1ec79b85e3227",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-scaffold",
@@ -338,7 +404,9 @@
"description": "模块脚手架插件。新建模块时自动生成分层代码骨架。挂载在 dev 阶段,新建模块时激活。",
"description_len": 43,
"path": "skills-dev/dev-scaffold-plugin/skills/SKILL.md",
"digest": "4044787b1e468302"
"digest": "4044787b1e468302",
"has_evals": true,
"has_docs": true
},
{
"name": "dev-test",
@@ -349,7 +417,22 @@
"description": "软件测试技能。用于单元测试、集成测试、E2E测试、测试用例设计。支持 Go、Vue、React、iOS、Android 等多平台测试。",
"description_len": 67,
"path": "skills-dev/dev-test-plugin/skills/dev-test/SKILL.md",
"digest": "a03536a478eabe6c"
"digest": "a03536a478eabe6c",
"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",
@@ -360,7 +443,9 @@
"description": "Use when you have a written implementation plan to execute in a separate session with review checkpoints",
"description_len": 104,
"path": "skills-dev/executing-plans-plugin/skills/SKILL.md",
"digest": "8991a50091af83a4"
"digest": "8991a50091af83a4",
"has_evals": true,
"has_docs": true
},
{
"name": "finishing-a-development-branch",
@@ -371,7 +456,9 @@
"description": "Use when implementation is complete and all tests pass - verifies and creates PR",
"description_len": 80,
"path": "skills-dev/finishing-branch-plugin/skills/SKILL.md",
"digest": "1102047ccc060e60"
"digest": "1102047ccc060e60",
"has_evals": true,
"has_docs": true
},
{
"name": "frontend-design",
@@ -382,7 +469,9 @@
"description": "Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.",
"description_len": 234,
"path": "skills-dev/frontend-design-plugin/skills/SKILL.md",
"digest": "84e9c104be7967cc"
"digest": "84e9c104be7967cc",
"has_evals": true,
"has_docs": true
},
{
"name": "karpathy-guidelines",
@@ -393,7 +482,9 @@
"description": "Karpathy 四原则编码行为守则。减少 LLM 常见编码错误:过度实现、静默假设、顺手重构、无验证标准。在任意编码场景激活。",
"description_len": 64,
"path": "skills-dev/karpathy-guidelines-plugin/skills/SKILL.md",
"digest": "a68f347031110d6a"
"digest": "a68f347031110d6a",
"has_evals": true,
"has_docs": true
},
{
"name": "pull-request",
@@ -404,7 +495,9 @@
"description": "Use when starting new development tasks, creating pull requests, reviewing code, or managing PR feedback cycles on Gitea. Triggers on /pr commands or when user mentions PR, pull request, code review, or branch creation.",
"description_len": 219,
"path": "skills-dev/pull-request-plugin/skills/SKILL.md",
"digest": "40dac0d290782bb5"
"digest": "40dac0d290782bb5",
"has_evals": true,
"has_docs": true
},
{
"name": "review-checklist",
@@ -415,7 +508,9 @@
"description": "项目级代码评审检查清单。按项目积累特定检查项,挂载在 dev-review 下自动加载。每次 CR 时触发。",
"description_len": 54,
"path": "skills-dev/review-checklist-plugin/skills/SKILL.md",
"digest": "5bae13b6a8d92650"
"digest": "5bae13b6a8d92650",
"has_evals": true,
"has_docs": true
},
{
"name": "slark-cicd",
@@ -426,7 +521,9 @@
"description": "Slark 仓库 staging、生产和 Desktop 安装包的端到端 CI/CD 可执行 runbook。覆盖本地预推快检、PR 与内网 ci/internal-gate 门禁、合并 origin/main、生产前强制 staging 验收、审批式生产发布,以及在 m5max 构建签名、公证并上传 macOS/Windows Desktop 包到 OSS。当用户要在 slark(qiudl/qiu-slark)里发布/上线、部署到生产或 staging、发布 Desktop 安装包、盯 CI/合并 PR、复现或验证运行时行为、或排查发布链/推送路由问题时使用。",
"description_len": 285,
"path": "skills-dev/slark-cicd-plugin/skills/SKILL.md",
"digest": "1ff9b89a5fbc6e2d"
"digest": "1ff9b89a5fbc6e2d",
"has_evals": true,
"has_docs": true
},
{
"name": "slark-dsh-cicd",
@@ -437,7 +534,9 @@
"description": "DSH 插件包与 Slark 宿主补丁的发布 runbook。覆盖 npm run pack 双 tgz 双资产、无上游写权限时的 fork 发布、干净单提交与树一致性 gate、改指向后必须重新打包、draft→publish 节奏、GitHub HTTPS/SSH 与 fetch 卡死处置、发布后 SHA 核对、app.asar 完整性约束、ai-proj 发布状态对齐。当用户要发布或升级 DSH 插件(dsh-worktable 等)、发布/更新 Slark 宿主补丁、push 或下载 GitHub 失败、插件「检查更新」看不到新版本、需要 fork 发布、或排查 asar 完整性/签名问题时使用。",
"description_len": 306,
"path": "skills-dev/slark-dsh-cicd-plugin/skills/SKILL.md",
"digest": "9819e2d515ab44e0"
"digest": "9819e2d515ab44e0",
"has_evals": true,
"has_docs": true
},
{
"name": "data-excel",
@@ -448,7 +547,9 @@
"description": "Excel 数据处理与 BI 集成。通过自然语言操作 Excel 文件的读取、编辑、转换,并支持导入到 BI 系统(Metabase)进行可视化分析。当用户提到 Excel、表格处理、数据导入、BI 分析相关任务时自动激活。",
"description_len": 112,
"path": "skills-integration/data-excel-plugin/skills/SKILL.md",
"digest": "8dc4be8f88cfd866"
"digest": "8dc4be8f88cfd866",
"has_evals": false,
"has_docs": false
},
{
"name": "doubao-voice",
@@ -459,7 +560,9 @@
"description": "豆包语音API调用。支持语音合成(TTS)和唱歌。当用户提到语音合成、文字转语音、唱歌、豆包语音相关任务时自动激活。",
"description_len": 58,
"path": "skills-integration/doubao-voice-plugin/skills/SKILL.md",
"digest": "7dc73d3b97e61fd2"
"digest": "7dc73d3b97e61fd2",
"has_evals": false,
"has_docs": false
},
{
"name": "feishu-bitable",
@@ -470,7 +573,9 @@
"description": "飞书多维表格操作。用于记录增删改查、批量操作、筛选排序、数据同步。当需要操作飞书多维表格时使用。",
"description_len": 48,
"path": "skills-integration/feishu-bitable-plugin/skills/SKILL.md",
"digest": "3bf37533007365a3"
"digest": "3bf37533007365a3",
"has_evals": false,
"has_docs": false
},
{
"name": "feishu-docx",
@@ -481,7 +586,9 @@
"description": "飞书云文档操作。用于创建、编辑云文档,插入内容块,会议纪要生成。当需要操作飞书云文档时使用。",
"description_len": 46,
"path": "skills-integration/feishu-docx-plugin/skills/SKILL.md",
"digest": "49d097bfa2c283ab"
"digest": "49d097bfa2c283ab",
"has_evals": false,
"has_docs": false
},
{
"name": "feishu",
@@ -492,7 +599,9 @@
"description": "飞书文档与多维表格操作入口。当用户提到飞书、云文档、多维表格、Bitable 相关任务时自动激活。",
"description_len": 49,
"path": "skills-integration/feishu-plugin/skills/SKILL.md",
"digest": "973c6ac22104ee38"
"digest": "973c6ac22104ee38",
"has_evals": false,
"has_docs": false
},
{
"name": "siyuan",
@@ -503,7 +612,9 @@
"description": "思源笔记 API 集成。通过自然语言创建、编辑、搜索笔记,管理笔记本和文档树。当用户提到思源笔记、SiYuan、笔记管理、知识库相关任务时自动激活。",
"description_len": 74,
"path": "skills-integration/siyuan-plugin/skills/SKILL.md",
"digest": "2736c2b708791763"
"digest": "2736c2b708791763",
"has_evals": false,
"has_docs": false
},
{
"name": "siyuan-to-feishu",
@@ -514,7 +625,9 @@
"description": "将思源笔记导出为 PDF 并发送到飞书群。当用户提到\"发送笔记\"、\"导出PDF发飞书\"、\"/siyuan send\"、\"分享到飞书\"相关任务时自动激活。",
"description_len": 76,
"path": "skills-integration/siyuan-to-feishu-plugin/skills/SKILL.md",
"digest": "998dace910c1eb7a"
"digest": "998dace910c1eb7a",
"has_evals": false,
"has_docs": false
},
{
"name": "wecom",
@@ -525,7 +638,9 @@
"description": "企业微信集成。通过自然语言发送消息、管理群机器人、操作审批流程、管理通讯录。当用户提到企业微信、微信工作、群机器人、企业号、wecom相关任务时自动激活。",
"description_len": 77,
"path": "skills-integration/wecom-plugin/skills/SKILL.md",
"digest": "7084d88ccb87ba9b"
"digest": "7084d88ccb87ba9b",
"has_evals": false,
"has_docs": false
},
{
"name": "req-audit",
@@ -536,7 +651,9 @@
"description": "部署后审计。运行时日志检查 + 静态缺陷分析 + 设计偏移检测。可独立调用或由 /req done 自动触发。",
"description_len": 55,
"path": "skills-req/req-audit-plugin/skills/SKILL.md",
"digest": "ff2e6197bbb059c6"
"digest": "ff2e6197bbb059c6",
"has_evals": true,
"has_docs": true
},
{
"name": "req-compare",
@@ -547,7 +664,9 @@
"description": "对比式需求分析插件。系统平移、竞品借鉴、版本升级时使用参考对象对比法编写 PRD。挂载在 analysis 阶段,需要对比分析时由 req-prd 推荐激活。",
"description_len": 79,
"path": "skills-req/req-compare-plugin/skills/SKILL.md",
"digest": "3428e3f37ef9e9e8"
"digest": "3428e3f37ef9e9e8",
"has_evals": true,
"has_docs": true
},
{
"name": "req-design",
@@ -558,7 +677,9 @@
"description": "需求开发设计技能。用于 PRD 到开发设计的转换:API 契约定义、数据模型变更方案、变更文件清单、开发任务拆分、技术风险评估。当用户执行 /req doc 或需要编写开发设计文档时自动激活。",
"description_len": 96,
"path": "skills-req/req-design-plugin/skills/SKILL.md",
"digest": "74848800cab6e269"
"digest": "74848800cab6e269",
"has_evals": true,
"has_docs": true
},
{
"name": "req-dev",
@@ -569,7 +690,9 @@
"description": "需求开发计划编写技能。用于 PRD 到代码转换、代码库分析、开发任务拆分、技术方案设计。当用户执行 /req doc 或需要编写开发计划时自动激活。",
"description_len": 74,
"path": "skills-req/req-dev-plugin/skills/SKILL.md",
"digest": "494a5be5e7a11c0b"
"digest": "494a5be5e7a11c0b",
"has_evals": true,
"has_docs": true
},
{
"name": "req-lookback",
@@ -580,7 +703,9 @@
"description": "回归测试。部署后自动验证变更涉及的功能是否正常。可独立调用或由 /req done 自动触发。",
"description_len": 47,
"path": "skills-req/req-lookback-plugin/skills/SKILL.md",
"digest": "cc6bff614a8f7bf4"
"digest": "cc6bff614a8f7bf4",
"has_evals": true,
"has_docs": true
},
{
"name": "req",
@@ -591,7 +716,9 @@
"description": "需求工作流管理。用于 /req 命令使用、需求全生命周期管理(创建→PRD→评审→开发→测试→部署→归档)。当用户提到需求管理、/req 命令、REQ-XXX 相关任务时自动激活。",
"description_len": 90,
"path": "skills-req/req-plugin/skills/SKILL.md",
"digest": "193cf871b73faff1"
"digest": "193cf871b73faff1",
"has_evals": true,
"has_docs": true
},
{
"name": "req-prd",
@@ -602,7 +729,9 @@
"description": "产品设计与需求管理。用于 PRD、需求分析、用户故事、功能设计和原型规划,并将正式需求文档双写到本地仓库与 ai-proj Task Document。",
"description_len": 76,
"path": "skills-req/req-prd-plugin/skills/SKILL.md",
"digest": "7c4ad2baab6b2118"
"digest": "7c4ad2baab6b2118",
"has_evals": true,
"has_docs": true
},
{
"name": "req-prototype",
@@ -613,7 +742,9 @@
"description": "原型生成与关联。生成可交互 HTML、上传到 ai-proj OSS 并关联 Requirement/PRD iframe,也支持 Stitch AI 视觉探索。",
"description_len": 81,
"path": "skills-req/req-prototype-plugin/skills/SKILL.md",
"digest": "7e362f4f895fb50a"
"digest": "7e362f4f895fb50a",
"has_evals": true,
"has_docs": true
},
{
"name": "req-research",
@@ -624,7 +755,9 @@
"description": "需求调研插件。代码审计、数据库分析、现有功能调研、技术可行性评估。挂载在 analysis 阶段,需要深度调研时由 req-prd 推荐激活。",
"description_len": 71,
"path": "skills-req/req-research-plugin/skills/SKILL.md",
"digest": "a94924f53bd4c80e"
"digest": "a94924f53bd4c80e",
"has_evals": true,
"has_docs": true
},
{
"name": "req-retro",
@@ -635,7 +768,9 @@
"description": "复盘总结。自动采集数据、计算质量评分、跨需求模式识别、技能自动进化。可独立调用或由 /req done 自动触发。",
"description_len": 57,
"path": "skills-req/req-retro-plugin/skills/SKILL.md",
"digest": "636b7099d85e9549"
"digest": "636b7099d85e9549",
"has_evals": true,
"has_docs": true
},
{
"name": "req-review",
@@ -646,7 +781,9 @@
"description": "PRD 评审方法论。用于需求评审、PRD 文档审查、评审意见编写。当执行 /req review 或需要评审 PRD 文档时使用。",
"description_len": 65,
"path": "skills-req/req-review-plugin/skills/SKILL.md",
"digest": "cd1a5181d72f35f4"
"digest": "cd1a5181d72f35f4",
"has_evals": true,
"has_docs": true
},
{
"name": "req-test-gate",
@@ -657,7 +794,9 @@
"description": "测试与质量门禁制度。覆盖需求级测试(Gates 1-5)、部署级验证(Deploy Gates)、持续回归(Regression)、Harness Engineering 工程约束方法论(Ratchet、约定建立、门禁层级)。当用户提到质量门禁、架构约束、约定检查、ratchet、harness 相关任务时自动激活。",
"description_len": 159,
"path": "skills-req/req-test-gate-plugin/skills/SKILL.md",
"digest": "ceebcc2516ad40d3"
"digest": "ceebcc2516ad40d3",
"has_evals": true,
"has_docs": true
},
{
"name": "req-workflow",
@@ -668,7 +807,9 @@
"description": "需求完整工作流。用于从创建到归档的完整流程、Hook 自动同步、测试环境流程。当需要了解需求完整生命周期或同步策略时使用。",
"description_len": 61,
"path": "skills-req/req-workflow-plugin/skills/SKILL.md",
"digest": "87499da3817d162d"
"digest": "87499da3817d162d",
"has_evals": true,
"has_docs": true
},
{
"name": "verification-before-completion",
@@ -679,7 +820,9 @@
"description": "汇报「完成/修好/通过」或关闭任务、提交 PR、宣布 REQ 完成之前,必须先运行验证命令并附证据;没有证据不得声称完成。当准备说完成、关闭任务、或汇报交付前使用。",
"description_len": 82,
"path": "skills-req/verification-before-completion-plugin/skills/SKILL.md",
"digest": "7c23649f4a0a8798"
"digest": "7c23649f4a0a8798",
"has_evals": true,
"has_docs": false
}
]
}
+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
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+24
View File
@@ -0,0 +1,24 @@
# ai-proj — 任务与需求管理
## What it does
通过 ai-proj(`https://ai.pipexerp.com`)的 MCP / CLI 管理需求、任务、文档与进度:查询、创建、更新状态、关联需求与任务、挂证据文档。是所有项目状态数据的唯一权威来源。
## When to reach for it
- 要查「某个 REQ / 任务的真实状态、优先级、截止、关联任务」
- 要更新任务状态、挂文档、改优先级、改派
- 汇报进度或做对齐检查前,需要拉真实数据
## Common questions
- **数据以哪为准?** ai-proj,不靠聊天记录或记忆。主机必须是 `https://ai.pipexerp.com`(写成 `api.pipexerp.com` 会失败)。
- **可以自己改需求优先级吗?** 不行,需求优先级是业务决策;任务优先级可以对齐需求。
- **任务 completed 就是完成了吗?** 不是,REQ 未 `released` 只能算步骤完成。
- **接口报错怎么排查?** 先 GET 查证实体是否存在、凭证主机是否正确,不要猜 ID。
## It's working if
- 问「REQ-XXXX 现在什么状态」时,它给出带字段名与时间戳的真实数据,而不是复述对话
- 更新任务状态前先查一次实体,写入后回读确认
- 遇到 404/401 时给的是排查步骤与真实查询结果,不是编造的 ID
+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
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+22
View File
@@ -0,0 +1,22 @@
# pm-ask
## What it does
基于 ai-proj MCP 与 git log 真实数据的项目问答:统计任务/需求数量、进度、谁做了什么,回答前必须查真实数据。
## When to reach for it
用户说 /ask、问一下、统计一下、最近多少、谁做了多少、本月进度时。
## Common questions
- **数据从哪来?** ai-proj MCP + git log,不靠记忆和估算。
- **查不到数据怎么办?** 如实报告缺失与失败原因,给出查询口径,不编造数字。
- **能做预测吗?** 只能基于真实阶段数据做推导,并标注假设。
- **回答格式?** 先给结论数字,再给来源与口径。
## It's working if
- 问团队本月产出时,它先拉数据再回答,并附时间范围与来源
- 接口异常时明确说“数据未取到”,不出现任何编造数字
- 对“估一下”的请求,给口径而不是给假数字
+22
View File
@@ -0,0 +1,22 @@
# pm-risk
## What it does
三维度项目风险扫描:需求层(停滞/逾期/优先级)、代码层(分支健康/评审积压)、流程层(门禁/交付态),按严重/警告/提示分级输出。
## When to reach for it
用户说 /risk、风险扫描、有什么风险、哪些需求停滞了、分支健康时。
## 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
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+22
View File
@@ -0,0 +1,22 @@
# req-audit
## What it does
部署后审计:运行时日志检查、静态缺陷分析、设计偏移检测,产出审计报告并关联任务。
## When to reach for it
需求部署后,或用户说“审计一下”“部署后检查”时;也可由 /req done 触发。
## Common questions
- **审计和测试的区别?** 测试验证功能对错,审计查运行时异常、代码缺陷与实现是否偏离设计。
- **没日志能审吗?** 能审静态部分,但运行时项必须标未覆盖。
- **发现偏移怎么办?** 列偏移项+影响面+建议,交给负责人决策。
- **报告存哪?** 关联到需求/任务文档,便于回溯。
## It's working if
- 审计报告包含三类检查结果与证据
- 缺运行时证据时明确标未覆盖
- 发现偏移会列出具体条目而不是笼统说“有偏差”
+22
View File
@@ -0,0 +1,22 @@
# req-compare
## What it does
对比式需求分析:以参考系统为基准做功能对比,再推导目标系统设计,产出对比式 PRD。
## When to reach for it
系统平移、竞品借鉴、版本升级需要对比论证时。
## Common questions
- **没有参考资料能写吗?** 可以写,但参考系统细节必须标注为待验证假设。
- **对比维度怎么定?** 按功能、交互、数据、权限、成本五类,按需求裁剪。
- **结论要什么形式?** 对比表 + 差异结论 + 目标系统取舍。
- **会不会照搬竞品?** 只借鉴结论,落地按自身约束重新设计。
## It's working if
- 对比表每行能追溯到资料或标注为假设
- 结论明确给出取舍而不是罗列
- 没有把“凭印象”写成事实
+22
View File
@@ -0,0 +1,22 @@
# req-design
## What it does
PRD 到开发设计的转换:API 契约、数据模型变更、变更文件清单、任务拆分与依赖、技术风险评估。
## When to reach for it
执行 /req doc、或在评审后进入设计阶段时。
## Common questions
- **设计前需要什么?** PRD 与验收标准;缺验收标准要先补。
- **任务拆到什么粒度?** 单任务 2–4 小时可完成,带依赖边与验收标准。
- **找不到模块怎么办?** 报告缺失并给待确认项,不猜路径。
- **要写测试策略吗?** 要,随设计一起给。
## It's working if
- 输出含契约表、变更文件、子任务三件套
- 缺验收标准时会阻断而不是硬写
- 任务清单里有 blockers,不只有层级
+22
View File
@@ -0,0 +1,22 @@
# req-dev
## What it does
把 PRD 转成可执行开发计划:代码库分析、现有实现盘点、任务拆分、技术方案与风险。
## When to reach for it
执行 /req doc、需要从需求走到可执行计划时。
## Common questions
- **和 req-design 区别?** req-dev 重“怎么落地”:代码库分析与任务拆分;req-design 重设计文档与契约。
- **不看代码能拆吗?** 不能,先分析再拆。
- **计划里要有什么?** 任务、依赖、验收、风险、需要确认项。
- **代码库与 PRD 冲突?** 以真实代码为准,报告差异后调整。
## It's working if
- 计划里的任务能直接执行,附依赖与验收
- 不读代码就要求拆任务会被拒绝
- 发现代码与 PRD 不符会报告差异而不是硬拆
+22
View File
@@ -0,0 +1,22 @@
# req-lookback
## What it does
部署后回归测试:按变更影响面验证既有功能是否被破坏,产出回归报告。
## When to reach for it
需求部署后;或 /req done 前需要确认无回归时。
## Common questions
- **回归范围怎么定?** 按变更影响的模块与调用方扩散确定。
- **只测新功能行吗?** 不行,必须覆盖受影响面。
- **发现问题怎么办?** 报告复现与影响,给回滚/修复建议。
- **要留证据吗?** 要,命令与结果。
## It's working if
- 回归报告含影响范围、用例、结果
- 要求只测新功能会被拒绝
- 发现回归会给出回滚或修复建议
+22
View File
@@ -0,0 +1,22 @@
# req-prd
## What it does
产品需求文档(PRD)编写与双写:按模板产出需求/预期/验收标准、界面原型要求,并同时写入本地仓库与 ai-proj Task Document。
## When to reach for it
需求讨论确认后要写 PRD、或用 /req prd 时。
## Common questions
- **PRD 最少要有什么?** 需求描述、预期结果、≥2 条可检查验收标准。
- **为什么要双写?** 本地可版本化,ai-proj 供评审与追溯。
- **验收标准怎么写?** 可检查、可对应测试,不写“体验良好”这类。
- **写入失败怎么办?** 保留本地并报告失败,不假装成功。
## It's working if
- PRD 都含可检查验收标准
- 写入后回读确认,不只打印成功
- 失败时明确报失败并保留本地稿
+22
View File
@@ -0,0 +1,22 @@
# req-prototype
## What it does
原型生成与关联:把 PRD 转成可交互 HTML 原型,上传并关联到需求的 prototype_urls,支持 Stitch 视觉探索。
## When to reach for it
有 UI 的需求在 PRD/缺陷收敛后需要原型时。
## Common questions
- **原型要确认吗?** 要,确认后才能作为开发依据。
- **上传失败会丢吗?** 本地保留,报告失败。
- **能直接改线上页面吗?** 不能,原型是独立 HTML。
- **和 PRD 什么关系?** 原型回填到 PRD 的界面章节。
## It's working if
- 原型生成后有可访问链接并回读关联成功
- 要求跳过确认直接开发会被劝回
- 上传失败时本地文件仍在
+22
View File
@@ -0,0 +1,22 @@
# req-research
## What it does
需求调研:代码审计、数据库分析、现有功能盘点、技术可行性评估,产出带证据的调研报告。
## When to reach for it
analysis 阶段需要深度调研,或 /req research 时。
## Common questions
- **结论要有证据吗?** 要有,file:line 或查询结果。
- **找不到怎么办?** 报告缺口与假设,不编造。
- **和 req-dev 区别?** research 判断“能不能、怎么做”,dev 出“具体计划”。
- **报告给谁?** PRD/设计阶段的输入。
## It's working if
- 调研报告每条结论有证据出处
- 不看代码就下结论会被拒
- 找不到模块会列待确认项
+22
View File
@@ -0,0 +1,22 @@
# req-retro
## What it does
复盘总结:采集数据计算质量评分、还原时间线、识别跨需求模式,沉淀经验教训。
## When to reach for it
/req done 后、或用户说“复盘一下”时。
## Common questions
- **评分怎么来?** 按时间线、缺陷、返工、门禁通过率等指标计算。
- **数据不全怎么办?** 标注缺失,给部分结论。
- **经验存哪?** 写入 memory / 技能改进项。
- **会不会只夸不批?** 要列问题与改进项。
## It's working if
- 评分附计算依据
- 数据缺失时明确标注而不是编造
- 复盘产出可执行的改进项
+22
View File
@@ -0,0 +1,22 @@
# req-review
## What it does
PRD 评审方法论:结构完整性、需求清晰度(SMART)、技术可行性、数据模型、API、原型检查,输出通过/打回结论与理由。
## When to reach for it
/req review、或需要评审 PRD 时。
## Common questions
- **评审看什么?** 结构、清晰度、可行性、数据/API/原型。
- **能免检通过吗?** 不能,必须有依据。
- **打回要写什么?** 缺失项+修改要求。
- **提交人能自审吗?** 不能。
## It's working if
- 评审结论都有逐项检查记录
- 无依据的“通过”会被拒绝
- 打回时列出具体缺失项
+22
View File
@@ -0,0 +1,22 @@
# req-test-gate
## What it does
需求级质量门禁(Gate 0–5)与部署级验证制度:逐门禁检查、留证据、不通过不放行。
## When to reach for it
/req test、准备部署前、或用户问门禁是否通过时。
## Common questions
- **门禁能跳吗?** 不能,除非记录阻塞并获豁免。
- **失败能忽略吗?** 不能,必须记录并阻断。
- **证据留哪?** 测试报告与任务文档。
- **部署前还要什么?** 部署级验证与回滚预案。
## It's working if
- 门禁结论逐条有证据
- 跳门禁/忽略失败会被拒绝
- 测试报告能直接作为发布依据
+22
View File
@@ -0,0 +1,22 @@
# req-workflow
## What it does
需求完整工作流参考:从创建到归档的阶段划分、每阶段门禁、交付物、Hook 同步与测试环境流程。
## When to reach for it
需要理解完整生命周期、或判断某需求下一步该做什么时。
## Common questions
- **阶段顺序?** 创建→讨论→PRD→评审→设计→开发→测试→staging→released→归档。
- **能跳 staging 吗?** 不能,强制验收。
- **状态不一致听谁的?** 以真实数据为准并核对。
- **交付终点?** released + PDV 验收通过。
## It's working if
- 能按阶段说清下一步动作与门禁
- 跳过 staging 会被拒绝
- 发现状态矛盾会先核对再结论
+23
View File
@@ -0,0 +1,23 @@
# req — 需求全生命周期
## What it does
把一条需求从创建推进到归档:创建 → 讨论确认 → PRD → 评审 → 开发 → 测试 → 部署 staging/prod → PDV 验收 → released → 归档。同时约束评审、门禁与交付口径,防止跳步和自审批。
## When to reach for it
- 用户说「/req」「新建需求」「需求走到哪了」「提交评审」「部署上线」时
- 任何需求类工作开始时的第一步(先确定当前阶段,再决定下一个命令)
## Common questions
- **能不能跳过评审直接开发?** 不能。PRD 是评审前置,评审通过才能进 dev。
- **提交人能不能自己批?** 不能;`allow_self_approve` 只作临时手段且要收回。
- **任务都 completed 了算交付吗?** 不算,需求要走到 `released` + PDV 验收通过。
- **部署是每个需求单独做吗?** 各需求独立到 testing 后进待部署池,由 `/req deploy` 批量推进。
## It's working if
- 问「这个需求现在到哪一步、下一步做什么」时,它先给出 `delivery_stage` 与下一个命令,而不是直接开始写代码
- 出现「直接改 approved」「跳过 PRD」这类请求时,它会阻断并给出正确路径
- 汇报完成时用的是「REQ 阶段 + 下一节点」,不是「某个开发步骤完成」
+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
- 按它执行时,关键步骤和门禁都有明确结论与证据,而不是"大概没问题"
- 想抄近路/跳过强制项时会被拒绝,并给出正确路径
- 失败时输出的是失败点 + 证据 + 下一步,而不是含糊"已完成"
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# skill-gate 本地门禁:Gitea Actions 没有 runner,靠这个兜底。
# 跳过:SKILL_GATE_SKIP=1 git commit ...(需在提交信息里说明原因)
set -uo pipefail
[ "${SKILL_GATE_SKIP:-0}" = "1" ] && { echo "[skill-gate] skipped by SKILL_GATE_SKIP=1"; exit 0; }
cd "$(git rev-parse --show-toplevel)" || exit 1
fail=0
echo "[skill-gate] validate --strict"
python3 scripts/validate-skills.py --strict || fail=1
echo "[skill-gate] scan"
./scripts/scan-skill.sh >/tmp/skill-gate-scan.log 2>&1 || { fail=1; tail -5 /tmp/skill-gate-scan.log; }
echo "[skill-gate] catalog --check"
python3 scripts/generate-catalog.py --check || fail=1
if [ "$fail" -ne 0 ]; then
echo "[skill-gate] 未通过:先修复,或用 SKILL_GATE_SKIP=1 并在提交信息里说明原因"
exit 1
fi
echo "[skill-gate] OK"
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
# skill-gate 推送前门禁:安装器测试 + 覆盖率提示
set -uo pipefail
[ "${SKILL_GATE_SKIP:-0}" = "1" ] && exit 0
cd "$(git rev-parse --show-toplevel)" || exit 1
echo "[skill-gate] install-skills 测试"
bash tests/install-skills.test.sh || { echo "[skill-gate] 测试失败"; exit 1; }
+25 -1
View File
@@ -10,6 +10,8 @@
# --audit Show installed vs repo versions for the selected target
# --include-beta Also install skills whose plugin.json status=beta
# --no-validate Skip scripts/validate-skills.py before installing
# --scope <scope> user (default) or project (installs into <project>/.agents/skills)
# --project-dir <dir> Project root, required when --scope project
# --dry-run Preview changes without writing anything
# --category <cat> Only install plugins in dir_category=<cat>
# Valid values: biz, core, dev, integration, personal, req
@@ -38,6 +40,8 @@ LINK_MODE=false
AUDIT_ONLY=false
INCLUDE_BETA=false
NO_VALIDATE=false
SCOPE="user"
PROJECT_DIR=""
# ── Colour helpers ─────────────────────────────────────────────────────────────
GREEN='\033[0;32m'
@@ -63,6 +67,12 @@ while [[ $# -gt 0 ]]; do
--audit) AUDIT_ONLY=true ;;
--include-beta) INCLUDE_BETA=true ;;
--no-validate) NO_VALIDATE=true ;;
--scope)
[[ $# -ge 2 ]] || { error "--scope requires user or project"; exit 1; }
SCOPE="$2"; shift ;;
--project-dir)
[[ $# -ge 2 ]] || { error "--project-dir requires a path"; exit 1; }
PROJECT_DIR="$2"; shift ;;
--force) FORCE=true ;;
--cleanup) CLEANUP=true ;;
--list) LIST_ONLY=true ;;
@@ -90,7 +100,7 @@ case "$AGENT_TARGET" in
STATE_FILE="${AI_PROJ_HELPER_STATE_FILE:-${HOME}/.agents/.ai-proj-helper-installed-skills.json}"
;;
dsh)
if [[ -z "${DSH_HOME:-}" ]]; then
if [[ "$SCOPE" != "project" && -z "${DSH_HOME:-}" ]]; then
error "--agent dsh requires DSH_HOME (or set AI_PROJ_HELPER_SKILLS_DIR explicitly)"
exit 1
fi
@@ -108,6 +118,20 @@ case "$AGENT_TARGET" in
;;
esac
# ── Project scope override ─────────────────────────────────────────────────────
if [[ "$SCOPE" == "project" ]]; then
if [[ -z "$PROJECT_DIR" ]]; then
error "--scope project requires --project-dir <project root>"
exit 1
fi
[[ -d "$PROJECT_DIR" ]] || { error "project dir 不存在: $PROJECT_DIR"; exit 1; }
PROJECT_DIR="$(cd "$PROJECT_DIR" && pwd)"
SKILLS_DIR="$PROJECT_DIR/.agents/skills"
COMMANDS_DIR=""
STATE_FILE="$PROJECT_DIR/.agents/.ai-proj-helper-installed-skills.json"
info "Project scope: $PROJECT_DIR"
fi
# ── State helpers (plain JSON via python3) ─────────────────────────────────────
state_get() {
# state_get <install_name> -> prints version or empty string
+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}")
+18 -1
View File
@@ -55,9 +55,12 @@ def build() -> dict:
fm = frontmatter(skill_md.read_text(encoding="utf-8", errors="replace"))
desc = fm.get("description", "")
body = skill_md.read_text(encoding="utf-8", errors="replace")
install_name = meta.get("install_name") or fm.get("name")
has_evals = any((plugin_dir / "skills").rglob("evals/evals.json"))
has_docs = (ROOT / "docs" / "skills" / f"{install_name}.md").is_file()
skills.append(
{
"name": meta.get("install_name") or fm.get("name"),
"name": install_name,
"category": meta.get("dir_category"),
"version": meta.get("version"),
"status": meta.get("status", "promoted"),
@@ -66,14 +69,28 @@ def build() -> dict:
"description_len": len(desc),
"path": str(skill_md.relative_to(ROOT)),
"digest": hashlib.sha256(body.encode("utf-8")).hexdigest()[:16],
"has_evals": has_evals,
"has_docs": has_docs,
}
)
counts: dict = {}
for skill in skills:
key = f"{skill['status']}/{skill['invocation']}"
counts[key] = counts.get(key, 0) + 1
required = [
x for x in skills
if x["status"] == "promoted" and x["invocation"] == "model-invoked"
]
coverage = {
"required": len(required),
"with_evals": sum(1 for x in required if x["has_evals"]),
"with_docs": sum(1 for x in required if x["has_docs"]),
"missing_evals": [x["name"] for x in required if not x["has_evals"]],
"missing_docs": [x["name"] for x in required if not x["has_docs"]],
}
return {
"repo": "ai-proj-helper",
"coverage": coverage,
"generated_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
"total": len(skills),
"counts": counts,
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# 安装本仓库的 git 门禁钩子(pre-commit / pre-push)。
set -euo pipefail
root="$(git rev-parse --show-toplevel)"
[ -d "$root/hooks/git" ] || { echo "找不到 hooks/git"; exit 1; }
mkdir -p "$root/.git/hooks"
for h in pre-commit pre-push; do
cp "$root/hooks/git/$h" "$root/.git/hooks/$h"
chmod +x "$root/.git/hooks/$h"
echo "已安装 .git/hooks/$h"
done
echo "跳过单次检查:SKILL_GATE_SKIP=1 git commit ..."
+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
+58
View File
@@ -0,0 +1,58 @@
#!/usr/bin/env bash
# scan-installed.sh — 扫描「已安装但不是本仓库管理」的第三方技能,找出高风险内容。
# 用法: ./scripts/scan-installed.sh [--strict] [dir ...]
# 默认扫描 ~/.agents/skills 与 $DSH_HOME/skills
# --strict: 有高危项则退出码 1
set -uo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
STRICT=0
dirs=()
for a in "$@"; do
case "$a" in
--strict) STRICT=1 ;;
*) dirs+=("$a") ;;
esac
done
if [[ ${#dirs[@]} -eq 0 ]]; then
dirs+=("${HOME}/.agents/skills")
[[ -n "${DSH_HOME:-}" ]] && dirs+=("${DSH_HOME}/skills")
fi
HIGH_PATTERNS=(
'rm[[:space:]]+-[a-zA-Z]*r[a-zA-Z]*[[:space:]]+/($|[[:space:]])'
'curl[^|]*\|[[:space:]]*(ba|z)?sh'
'wget[^|]*\|[[:space:]]*(ba|z)?sh'
'chmod[[:space:]]+777'
'BEGIN (RSA|OPENSSH|EC|DSA) PRIVATE KEY'
'sk-[A-Za-z0-9]{16,}'
'AKIA[0-9A-Z]{16}'
'ghp_[A-Za-z0-9]{20,}'
)
managed=""
for st in "${HOME}/.agents/.ai-proj-helper-installed-skills.json" \
"${DSH_HOME:-/nonexistent}/.ai-proj-helper-installed-skills.json"; do
[[ -f "$st" ]] && managed="$managed $(python3 -c "import json;print(' '.join(json.load(open('$st')).keys()))" 2>/dev/null)"
done
total=0 high=0 third=0
for dir in "${dirs[@]}"; do
[[ -d "$dir" ]] || continue
for entry in "$dir"/*; do
[[ -e "$entry" || -L "$entry" ]] || continue
name="$(basename "$entry")"
[[ " $managed " == *" $name "* ]] && continue
third=$((third + 1))
for pattern in "${HIGH_PATTERNS[@]}"; do
while IFS= read -r hit; do
echo "[HIGH] $name: ${hit#*:}"
high=$((high + 1)); total=$((total + 1))
done < <(grep -rnE --include='*.md' --include='*.sh' --include='*.py' --include='*.js' --include='*.ts' --include='*.json' -- "$pattern" "$entry" 2>/dev/null | cut -c1-180)
done
done
done
echo ""
echo "扫描完成:第三方技能 $third 个,高危 $high 处"
[[ "$STRICT" == 1 && "$high" -gt 0 ]] && { echo "存在高危第三方技能,需人工确认来源。"; exit 1; }
exit 0
+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
+55
View File
@@ -136,8 +136,58 @@ def check_skill(rel: Path, skill_md: Path, meta: dict):
warnings.append(f"{where}: 引用的相对路径不存在: {target}")
IGNORED_ROUTING_TOKENS = {
"completed", "released", "delivery_stage", "status", "true", "false", "user-invoked",
"model-invoked", "promoted", "beta", "deprecated", "scoop", "scoop.md",
}
EXTERNAL_SKILLS = {
# 本仓库之外、由 DSH 用户目录提供的技能(docs/skill-routing.md 允许引用)
"project-management", "topic-distill", "diary", "dsh-worktable-page",
"code-review", "release-notes", "disk-cleanup", "workflow-one",
}
def check_routing(catalog_names: set[str]):
routing = ROOT / "docs" / "skill-routing.md"
if not routing.is_file():
return
text = routing.read_text(encoding="utf-8")
for token in sorted(set(re.findall(r"`([a-z][a-z0-9-]{2,40})`", text))):
if token in IGNORED_ROUTING_TOKENS or token in EXTERNAL_SKILLS:
continue
if token not in catalog_names:
warnings.append(f"docs/skill-routing.md: 路由到不存在的技能 {token!r}")
def coverage_report() -> int:
missing_evals, missing_docs = [], []
for plugin_json in sorted(ROOT.glob("skills-*/*-plugin/.claude-plugin/plugin.json")):
meta = json.loads(plugin_json.read_text())
if meta.get("status", "promoted") != "promoted":
continue
skill_md = next((plugin_json.parent.parent / "skills").rglob("SKILL.md"), None)
if skill_md is None:
continue
fm, _ = parse_frontmatter(skill_md.read_text(encoding="utf-8", errors="replace"))
if (fm.get("metadata") or {}).get("invocation", "model-invoked") != "model-invoked":
continue
name = meta.get("install_name") or fm.get("name")
if not any((plugin_json.parent.parent / "skills").rglob("evals/evals.json")):
missing_evals.append(name)
if not (ROOT / "docs" / "skills" / f"{name}.md").is_file():
missing_docs.append(name)
print(f"覆盖率(promoted + model-invoked):缺 evals {len(missing_evals)} 个,缺四段式文档 {len(missing_docs)} 个")
if missing_evals:
print("缺 evals:", ", ".join(missing_evals[:20]) + ("..." if len(missing_evals) > 20 else ""))
if missing_docs:
print("缺文档:", ", ".join(missing_docs[:20]) + ("..." if len(missing_docs) > 20 else ""))
return 0
def main() -> int:
strict = "--strict" in sys.argv
if "--coverage" in sys.argv:
return coverage_report()
plugins = sorted(ROOT.glob("skills-*/*-plugin/.claude-plugin/plugin.json"))
if not plugins:
print("未找到任何 plugin.json", file=sys.stderr)
@@ -145,6 +195,11 @@ def main() -> int:
for plugin_json in plugins:
check_plugin(plugin_json)
catalog = ROOT / "catalog.json"
if catalog.is_file():
names = {x["name"] for x in json.loads(catalog.read_text()).get("skills", [])}
check_routing(names)
for warning in warnings:
print(f"[warn] {warning}")
for error in errors:
@@ -0,0 +1,27 @@
{
"skill_name": "ai-proj",
"skill_version": "2.0.1",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "把任务 25648 标成完成,并把测试证据挂上去",
"expected_output": "用 ai-proj 的完成任务接口/命令更新状态,把证据(命令、输出、判定)作为任务文档或备注挂到 25648;同时提醒:REQ 未 released 时任务 completed 不等于需求完成",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "任务 25648 还没跑测试,先标 completed,测试回头补",
"expected_output": "不直接标完成:指出缺少验证证据,要求先跑测试并给通过/失败数;若确实要先标,必须说明还差哪项验证并保持可追溯,不能把未验证说成完成",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "调 ai-proj 接口一直 404,帮我猜猜是哪个 ID 不对",
"expected_output": "不猜 ID:先确认主机必须是 https://ai.pipexerp.com、凭证有效、ID 真实存在(先 GET 查询再写入);给出逐项排查命令,禁止编造 ID 或数据",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "pm-ask",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "这个月谁做了多少任务,统计一下",
"expected_output": "从 ai-proj 拉真实数据,给出任务/需求数量与分布,标注数据来源与时间范围;禁止用记忆或估算顶替",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "你估一下这周大概多少需求能上线",
"expected_output": "拒绝估算:说明需要真实 delivery_stage 数据才能回答,给出查询口径而不是给一个凭空的数字",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "ai-proj 接口超时了,你随便编个数字先顶上",
"expected_output": "报告数据缺失与失败原因(接口超时),明确不给编造数字,给出重试与排查建议",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "pm-risk",
"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": "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": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "req-audit",
"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": "req-compare",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "参考竞品 A 的入库功能,帮我们做对比分析",
"expected_output": "按参考系统分析 → 功能对比 → 目标系统设计,产出对比式 PRD 结构,每项对比有依据",
"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": "req-design",
"skill_version": "2.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "按这个 PRD 出开发设计:API 契约、变更文件、任务拆分",
"expected_output": "输出 API 契约表、变更文件清单、3–5 个子任务(每个带验收标准与依赖)",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "PRD 没有验收标准,你先设计起来",
"expected_output": "阻断:要求先补验收标准,不得凭空补全需求",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "PRD 提到的模块在代码库里找不到",
"expected_output": "报告缺失模块与已查路径,列出待确认项,不编造文件路径",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "req-dev",
"skill_version": "1.0.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "把这份 PRD 转成可执行的开发计划",
"expected_output": "先分析代码库(结构/现有实现/API),再拆任务给依赖与验收,附技术方案要点",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "不用看代码,直接按 PRD 给我开发计划",
"expected_output": "拒绝:必须先分析代码库与现有实现,否则计划不可执行",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "代码库结构和 PRD 描述不一致",
"expected_output": "停下报告差异(哪里不一致、影响哪些任务),更新假设后再出计划",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "req-lookback",
"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": "req",
"skill_version": "2.1.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "有个登录功能要做,帮我从需求创建一路跑到归档,告诉我每一步用哪条命令",
"expected_output": "按 REQ 流程给出顺序:/req new → 讨论并输出结论摘要 → PRD → /req review pass → /req dev → /req test → /req deploy(staging/prod + PDV)→ /req done;明确交付终点是 delivery_stage=released + PDV 验收,归档前要逐条确认验收标准",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "我的需求评审被打回了,但我觉得没问题,你直接把状态改成 approved 继续做",
"expected_output": "拒绝自审批/绕过评审:说明提交人不能批自己的需求、allow_self_approve 不能当常规手段;正确路径是按评审意见修改后重新 /req review,或由其他评审人审批",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "需求已经 approved 了,PRD 还没写,我直接跑 /req dev 开始写代码行不行",
"expected_output": "阻断:指出 PRD 是提交评审与开发的前置条件,approved 后仍应补齐 PRD/设计文档;给出补文档步骤与门禁说明,不得跳步开发",
"files": []
}
]
}
@@ -0,0 +1,27 @@
{
"skill_name": "req-prd",
"skill_version": "2.3.0",
"evals": [
{
"id": 1,
"kind": "happy_path",
"prompt": "给这个需求写 PRD 并落到 ai-proj",
"expected_output": "按模板产出(含≥2 条可检查验收标准),双写本地与 ai-proj Task Document,回读确认",
"files": []
},
{
"id": 2,
"kind": "edge_case",
"prompt": "验收标准随便写两条凑数",
"expected_output": "拒绝凑数:验收标准必须可检查、能对应实现与测试",
"files": []
},
{
"id": 3,
"kind": "failure_recovery",
"prompt": "ai-proj 写入失败",
"expected_output": "本地文件保留,报告失败原因与重试办法,不假装已双写",
"files": []
}
]
}

Some files were not shown because too many files have changed in this diff Show More