3.3 实战三:项目仪表盘技能包
引言
小王每天早上都要手动查看:项目有几个未提交的变更?当前在哪个分支?最近做了什么?有没有开放的 PR?
这些都是只读查询,不会产生副作用——适合让 AI 自动触发。
通用需求(所有工具适用)
- 展示项目当前状态的一站式仪表盘
- 只读操作,可以自动触发
- 用户只需说"项目状态"就能触发
Claude Code 实现(详细示例)
创建 .claude/skills/project-status/SKILL.md:
markdown
---
name: project-status
description: 报告项目当前状态。当说"项目怎么样"、"当前状态"、"项目概览"、"今天做了什么"时使用
---
## Git 状态
!`git status --short`
## 当前分支
!`git branch --show-current`
## 最近提交
!`git log --oneline -10`
## 开放 PR
!`gh pr list --state open --limit 5 2>/dev/null || echo "未配置 GitHub CLI"`
## 指令
按 [template.md](template.md) 的格式输出项目状态报告。重点突出:
1. 有多少文件被修改(未提交的变更)
2. 最近的开发方向
3. 是否有需要关注的开放 PR创建 .claude/skills/project-status/template.md:
markdown
# 📊 项目状态报告
## 概览
- 当前分支:{branch}
- 未提交变更:{count} 个文件
- 开放 PR:{count} 个
## 最近活动
{最近 5 条提交的简要说明}
## 注意事项
{需要关注的问题,如长期未合并的 PR、大量未提交变更等}设计决策解析
为什么不设 disable-model-invocation: true?
这个技能包是纯只读的——查看状态不会产生任何副作用。而且这是一个高频操作——小王每天早上都要看项目状态。让 Claude 自动触发,小王只需说"项目怎么样"就能得到报告。
💡 与变更总结技能包的对比
/summarize-changes:低频只读 → 建议手动触发/project-status:高频只读 → 可以自动触发
判断标准:如果一个只读技能包你每天都要用多次,可以自动触发;如果只是偶尔用,建议手动控制。
为什么用辅助文件存模板?
模板可能随项目变化。把它放在独立的 template.md 中:
- 修改模板不需要动 SKILL.md
- 团队可以各自定制模板格式
- 符合渐进式披露——模板只在技能包被调用时才加载
为什么用 2>/dev/null 处理 gh 命令?
不是所有项目都配置了 GitHub CLI。如果没配置,gh pr list 会报错。2>/dev/null || echo "未配置" 让技能包在没有 gh 的环境也能正常运行。
其他工具等效做法
Cursor 用户
在设置中创建 Custom Command,Prompt 内容:
markdown
报告项目当前状态。请执行以下操作:
1. 运行 git status --short 查看文件状态
2. 运行 git branch --show-current 查看当前分支
3. 运行 git log --oneline -10 查看最近提交
4. 如果有 gh CLI,运行 gh pr list --state open --limit 5 查看开放 PR
输出格式化的项目状态报告,重点突出:
- 有多少文件被修改
- 最近的开发方向
- 是否有需要关注的开放 PRWindsurf 用户
yaml
project-status:
globs: "**/*"
instructions: |
当用户询问项目状态时:
- 执行 git status 查看文件变更
- 执行 git branch 查看当前分支
- 执行 git log --oneline -10 查看最近提交
- 输出格式化的项目状态报告📋 工具差异说明
- 辅助文件(template.md):Claude Code 独有独立目录结构,其他工具的模板需内嵌在配置中
- 自动触发:Claude Code 通过 description 判断,Windsurf 通过 globs 匹配,Cursor 无自动触发
测试(Claude Code)
- 确保项目有未提交的变更和几个 commit
- 说"项目怎么样"或输入
/project-status - 检查输出是否包含:分支、变更数、最近提交、PR 信息
练习
🎯 练习题
(Claude Code 用户)为 project-status 技能包增加一个"待办事项"功能:从项目中的 TODO.md 文件读取待办列表并显示。
提示:
- 用
!cat TODO.md 2>/dev/null || echo "没有 TODO.md"`` 注入 - 或者在指令中让 Claude 按需读取 TODO.md
(其他工具用户)为你的工具创建项目状态查询能力。
三个实战的对比
| 维度 | 变更总结 | Issue 修复 | 项目仪表盘 |
|---|---|---|---|
| 自动触发 | ❌ 手动 | ❌ 手动 | ✅ 自动 |
| 有副作用 | 否 | 是 | 否 |
| 参数 | 无 | Issue 编号(CC特有) | 无 |
| 动态注入 | 2 个(CC特有) | 1 个(CC特有) | 4 个(CC特有) |
| 辅助文件 | 无 | 可选 | 模板文件(CC特有) |
| allowed-tools | 无 | 5 个(CC特有) | 无 |
本节小结
📌 本节核心要点
- 只读技能包可以自动触发(通用):项目状态查询没有副作用,让 AI 自动调用
- 辅助文件存模板(Claude Code):修改格式不影响 SKILL.md,团队可定制
- 容错处理(通用):
2>/dev/null || echo让技能包在缺少工具时也能运行 - 三个实战三种模式:手动只读、手动有副作用、自动只读——设计决策的核心差异
思考题
- 如果你有一个部署技能包和一个状态技能包,你会怎么设置自动触发策略?为什么不同?
- (Claude Code 用户)项目仪表盘用了 4 个动态注入。如果其中某个命令执行很慢,怎么优化?
- 你会把这个技能包放在项目级还是个人级?如果团队中有人不用 GitHub 怎么办?
- (其他工具用户)你使用的工具如何实现"高频只读自动触发"?
下一节预告
三个实战完成了!接下来进入进阶能力——如何处理长任务的上下文污染?如何精确控制技能包的激活范围?下一节学习任务隔离执行和精细控制。