上次给团队落地第一套项目级Skills时,我本来觉得这事不难——把每个人平时手写的那些Claude Code、Codex里的小技能收集一下,按统一目录放好,再约定几个命名规则,基本就完事了。结果第二天就被现实教育了:个人Skills写得再好,拼到项目里也未必能跑。真正的坑不在“技能怎么写”,而在“技能之间怎么配合、状态怎么流转、人对AI产出怎么校验”。这篇就当作系列的第6篇,聊聊项目级Skills开发与团队协作、项目管理结合时,我趟过一遍之后留下的实操经验。
先说清楚一件事:这里讨论的Skills,不是系统集成项目管理工程师软考里的“技能”,也不是Ros2、OpenClaw周边那些资源包,而是面向AI编程代理的“AI技能”,是喂给Claude Code、Codex这类工具的结构化指令与脚本集合。说它是“项目级”,是指一整个团队在同一个仓库、同一套项目流程里共用,而不是某个人自己爽。
1. 为什么项目级Skills不是把个人Skill放大
1.1 先分清“个人Skills”和“项目级Skills”的差别
个人级Skills解决的是个人的高频小动作。比如我经常用 “git-commit-message” 这个技能,自动把暂存区的diff整理成符合 Conventional Commits 的提交信息;“meeting-notes” 把随手记的杂乱文字转换成结构化纪要。这种技能的特点是:输入输出自己定义,数据只需要自己理解,坏了也不影响别人。
项目级Skills完全不是这个玩法。它服务的对象从“我自己”变成了“项目交付节奏、团队信息同步、风险控制”这些团队共同目标。它的运行深度也会变:个人Skills通常是“一条指令对应一次动作”,项目级Skills则往往是由多个动作串联成的“小流程”。
拿“周报”来举例。个人态的技能可以是:丢给我一段本周做的事,AI帮我润色成一封给老板的周报。项目态的周报技能则是:自动去Linear/Jira里拉截止到现在的Issues列表,统计哪些完成、哪些没动、哪些被阻塞,再扫一遍Git提交记录里的分支和PR,对照代码仓库实际进展和任务系统里的记录,找出“说做完但没提交”“提交了但没更新任务”的不一致点,最后按照团队统一模板生成一份周报草案。
这两件事看起来都叫“周报技能”,做起来差得远。后者如果只是把前者复制几份,失败几乎是必然的。
1.2 项目级Skills“有状态”后才谈得上协作
个人Skills本质上可以是无状态的,每次调用都是一次全新的问答。但项目级Skills必须建立“项目状态”这个概念。因为一个团队协作场景下,AI不是只服务一次,而是要在整个迭代周期里反复介入:这周它帮你生成了站会摘要,下周还得继续;这次它帮你整理了上线Checklist,下次迭代还得复用同一套节奏。如果技能没有记忆,每次都要从零理解“我们项目现在处于什么阶段”“当前Sprint是哪几条”“哪些人负责哪块”,那它的质量和效率都上不去,还会因为上下文不一致产生前后矛盾的建议。
所以做项目级Skills时,我强烈建议先建立一个「状态文件」。通常放在项目目录下的 .ai/ 或 docs/ai/ 里,结构类似:
markdown复制# 项目状态快照
迭代: 23.2
周期: 2025-04-14 ~ 2025-04-25
目标: 客户工作台改版上线 / 支付链路超时指标恢复
## 当前成员分工
- 张一: 前端工作台
- 李二: 支付BFF层
- 王三: 数据迁移脚本
## 活跃需求与状态
- WLT-293 客户工作台List页重构: In Progress
- WLT-297 退款超时告警: Blocked(等待运维开通权限)
- WLT-301 账单导出性能优化: Done(待QA回归)
这个文件可以由Skills定时更新,也可以由团队成员在迭代计划会上手动过一遍。每次任何项目级Skill运行时,第一步先去读这个Snapshot后再动手。这样才能保证多个技能之间看到的是同一个“现状”。否则AI就像个只看了项目Wiki片段的顾问,给出的结论永远和实际脱节。
1.3 项目级Skills的三要素雏形
趟过几次坑之后,我现在认定一套可用的项目级Skills必须包含三类东西,缺一个都容易变废案:
- 通用型套路技能:例如“分支合并到主干前自动跑检查”“按angular规范生成PR描述”,这种属于可复用动作,收在公开技能库里即可。
- 项目定制化技能:例如团队内部有特殊状态流、特殊上线前检查项、特殊文档模板,这些需要把团队约定写进去。
- 项目状态同步技能:负责维护和更新前面说的状态文件,以及定期从API拉数据,把最新进展同步成统一格式。
第三类是大家最容易漏掉的。很多团队做了十几个技能,都是“做得漂亮但不知道当前项目处于什么状态”,结果每个技能都需要人工先把当前上下文喂给它,AI的价值直接少了一半。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从项目管理流程反推Skill清单:建模比写代码重要
2.1 项目协作里到底有哪些信息流转
我在做项目级规划时习惯先用一张“信息流转图”在纸上推演,弄清楚项目从需求提出到上线回顾,中间有哪些信息节点、经过哪些人的手、沉淀成什么产物。多数软件项目管理流程无非是这几段:
- 需求收集与澄清
- 需求拆分与排期
- 迭代过程跟踪与站会同步
- 测试验收与上线发布
- 迭代复盘与改进
每一段都有大量“结构化整理”的工作。比如需求澄清后的会议纪要、站会后的任务同步、上线前的Checklist、复盘会中的Action Items统计。这些东西有一个共性:信息早已散落在对话、评论、API数据里,只是没被汇拢。
AI Skills在这中间能帮的忙,就是把散落的数据拉出来、按统一格式重组。这也是为什么项目级Skills和项目管理天然契合——它们本质上是“团队信息流的搬运工”。
2.2 哪些动作最值钱:技能价值评估表
不是说流程里每个动作都值得做成Skill。做过AI产品的人都有这种体感:技能做得太多太细,最后几乎没人用,因为触发成本大于收益。怎么挑?我参照自己的实践给一个筛选逻辑:看模板化程度、发生频率、容错率、上下游数据完整性。
| 流程动作 | 人工耗时 | 模板化程度 | 频率 | 数据来源是否可靠 | 是否值得做成Skill |
|---|---|---|---|---|---|
| 会议纪要转结构化任务 | 高 | 高 | 每周多次 | 取决于录音/笔记质量 | 非常值得 |
| 站会日报生成 | 中 | 高 | 每日 | Linear/Jira状态基本可靠 | 值得 |
| 周报汇总 | 高 | 高 | 每周 | 任务系统+Git记录足够 | 非常值得 |
| 迭代排期自动建议 | 高 | 低 | 每迭代 | 依赖历史数据和人判断 | 暂不推荐 |
| 测试用例生成 | 中 | 中 | 随需求 | 依赖PR描述/需求文档 | 可以试点 |
| 风险自动预警 | 中 | 低 | 持续 | 依赖异常标注 | 谨慎 |
从表里能看出来一个规律:凡是数据源头明确、步骤可以模板化、出错了也不至于造成灾难后果的动作,最适合先拿来做项目级Skills。反过来,那种高度依赖人对业务理解才能拍板的动作,比如排期、需求优先级判断,AI可以做辅助参考,但现阶段不应做成一个“全自动Skill”。
2.3 先别急着做“自动排期”这类重活
顺手提一个很多人容易踩的坑:一提到项目管理Skills,第一反应就想做一个“自动排期”或者“自动把需求拆成任务并发到看板”的技能。我理解这种冲动,但建议你先按兵不动。
自动排期难就难在团队的习惯、成员节奏、历史债务都是非结构化信息。你让Skill去分析“这个需求几天能做完”,它往往只能根据标题字数、描述复杂度做很粗的猜测,这种猜测给到明眼人手里一眼就能看出不靠谱。结果就是:跑出来一份看似完整、实际上不能用的计划,比不做还难受。
比较好的路线是先从“表达层”入手:把会议里散落的讨论整理成结构化的需求卡、把任务状态同步成周报摘要、把release note根据git历史自动整理成用户能看懂的语言。这些动作少依赖主观判断,却能让整个团队的信息一致性立刻上一个台阶。等项目级Skills的基础设施稳定了,团队在使用过程中对AI的信任也建立了,再往“预测、建议、决策辅助”方向试探。
3. 设计协作协议:输入、输出与状态文件的约定
3.1 让SKILL.md成为团队的“接口文档”
写个人技能时,SKILL.md怎么写很随意,能让自己看懂就行。但项目级技能不是写给自己看的,它要经受团队的审视、同事的修改、后续新人的阅读理解。所以SKILL.md在项目里应该当作接口文档来对待。
一个可维护的SKILL.md至少需要四段:
- 技能定位:写给不知道这个技能是什么的人看,一句话说清楚它干什么。
- 输入约定:明确用户要提供什么、从哪个API拉数据、需要什么环境变量。这块要写得死板一些,别用“如果……可能……也可以”这种模糊表达。
- 工作流程:按步骤写清“先看状态文件,再拉数据,接着处理,最后产出”。给AI看的执行步骤要像菜谱一样,步骤式、可复核,不要让AI自己发明流程。
- 输出约定:输出物是什么格式、放到项目哪个目录、用什么文件命名。没有这个约束,每个AI生成的文件名都会让你头大。
3.2 状态文件就是项目级Skills的短期记忆
前面提到的状态文件,每次由技能更新后,写入 .ai/project-state.md。如果你不做这步,每个Skill在调用时都要靠模型去Github、Issue列表、代码结构里重新拼“项目现状”,浪费Token不说,还经常拼错。
这里我踩过的坑是要不要把所有项目信息都塞进状态文件。第一次做的时候,我把各模块完整架构、技术栈说明、成员职责全塞进了状态文件,结果Skill每次读取都占掉大半个上下文窗口,后续生成质量反而下降。后来收敛成只放六个板块:当前迭代、迭代目标、成员分工、活跃需求状态、关键风险、近期决策记录。够用且清爽。
同时要管住状态文件更新的入口。我的做法是在SKILL.md里强制一个更新流程:任何Skill如果发现“任务状态”和它的操作结果不一致(比如代码已合入但Issue还没更新,或反过来),都应该把它列为“待人工更新项”放给用户确认,不要让模型自己改状态。
技术上的小建议是:更新状态文件时尽量使用“全量覆写”。因为增量修改容易出现残留旧数据的问题,AI没法像人一样区分“这段是上次的陈旧记录还是本次真的改了”。全量覆写配合定期Git快照,误操作还能迅速回滚。
3.3 第三方工具的数据接入姿态
项目管理和协作里,最难的不是没有API,而是API返回格式和人类认知状态之间的落差。以Linear为例,它的查询语法很干净,一条GraphQL能拉出不少信息,我在项目里把“拉本轮迭代数据”抽成了一个通用脚本,技能内部直接调用,效果会稳定很多。
python复制# scripts/pull_linear.py
# 用法:LINEAR_API_KEY=xxx python pull_linear.py --team TEA --in-days 7
import os
import json
import sys
from datetime import datetime, timedelta
from urllib import request
API_URL = "https://api.linear.app/graphql"
def run_query(query, variables=None):
body = json.dumps({"query": query, "variables": variables}).encode()
req = request.Request(API_URL, data=body, headers={
"Content-Type": "application/json",
"Authorization": os.environ["LINEAR_API_KEY"]
})
with request.urlopen(req) as resp:
return json.load(resp)
if __name__ == "__main__":
cut_off = (datetime.now() - timedelta(days=int(sys.argv[1]))).strftime("%Y-%m-%d")
q = """
query Issues($cutOff: DateTime) {
issues(filter: { updatedAt: { gte: $cutOff } }) {
nodes {
identifier title description
state { name }
assignee { displayName }
}
}
}
"""
res = run_query(q, {"cutOff": cut_off})
rows = []
for node in res["data"]["issues"]["nodes"]:
rows.append({
"id": node["identifier"],
"title": node["title"],
"state": node["state"]["name"],
"assignee": node["assignee"]["displayName"] if node["assignee"] else "未分配"
})
print(json.dumps(rows, ensure_ascii=False, indent=2))
脚本尽量保持在“数据搬运层”,不做智能判断。判断交给SKILL.md里的工作流去指导模型完成。好处是:模型只会负责组织语言和做语义整合,数据是否实时、字段是否全,都靠脚本来兜底。这也是项目级Skills里很重要的一个思路——用确定性代码去做数据获取,把语言模型的精力聚焦在“处理和生成”上。
4. 一次完整的项目协作型Skill实战:从任务状态到周报
4.1 场景与验收标准
纸上谈兵够多了,拿一个我们组已经稳定运行两个迭代的实战来说说。场景是:每周五下午,所有PM和Tech Lead需要一份项目周报。以前的流程是各模块负责人手动去Linear导出数据、翻Git记录、再填一份固定模板的Docs,怎么也得忙乎一小时。
我们做的技能叫 weekly-report。它的定义分两层:
- 快速模式:输入“生成周报”,它会基于最终状态文件、Linear接口数据和Git log自动产出符合团队模板的周报。
- 手动补充模式:生成完初稿后,如果发现某些Issue状态和实际进度不符,它会明确列出“你需要在以下3个条目中手动修正”,绝不擅自推断。
验收标准也定得很具体:周报的基础事实准确度(任务状态、负责人、延期/阻塞标识)要保证100%来自数据源,AI只生成归纳性表述,AI建议意见部分不得超过全文的20%。
4.2 核心三步走下来其实是数据整合问题
Week 1的流程相对朴素,核心逻辑是三步:
第一步,先由Agent去读状态文件,把当前迭代、目标、成员分工这些基础信息取出来。这是上下文的重要来源,省得AI从多种来源猜。
第二步,调用 pull_linear.py 拉取本周更新过的Issues列表,再执行一次 git log --since="7 days ago" --pretty=format:"%h|%an|%s" --no-merges 拿到提交记录。把这两组数据交给模型。
第三步,模型按团队周报模板拼接。我们用的模板板块如下:
- 本周目标与达成情况
- 各模块关键进展(基于已完成/进行中的Issue)
- 风险与阻塞清单
- 下周计划预告
- 需要PM/其他团队协调的事项
下面是模板中的“风险与阻塞清单”区段,我们希望模型能按统一口径输出问题:
markdown复制## 风险与阻塞清单
| 编号 | 标题 | 状态 | 影响 | 建议Owner | 备注 |
|---|---|---|---|---|---|
| WLT-297 | 退款超时告警 | Blocked | 支付链路可观测性缺失 | 李二 | 等待运维开通权限,超时3天 |
实际上这个工作流运行起来后,我们发现最关键的问题不是生成不出来,而是生成出来后“看起来太顺畅了”。模型会默认把还没完全验证的任务润色成很有把握的结果。后来我在输入约定里明确加上一条规则:一切“完成”结论必须要有“PR merged”或“Issue state=Done”的数据佐证,否则一律落到“进行中”或“待验证”。这是个非常简单但极其有效的约束。
4.3 状态映射的坑:不同团队对同一状态的认知不一样
做跨团队周报时候,遇到的最头疼问题其实是“状态名的语义对齐”。同一个Linear状态机里,有些业务线的“In Review”代表代码Review中,还没有联调;另一个小组的“In Review”可能已经算上生产环境验证了。如果不把状态按团队自定义说明告诉AI,AI生成的周报会把两个小组同等对待,看起来整齐,实际失真。
这两个状态需要映射成“更适合汇报”的汇总层口径,例如:
| Linear原始状态 | 汇报口径 | 是否算“完成” | 备注 |
|---|---|---|---|
| Backlog | 未开始 | 否 | 排除掉,不算本周内容 |
| In Progress | 进行中 | 否 | 记录负责人与停留天数 |
| In Review | 功能完成待验证 | 否 | 注明所处Stage |
| Done | 已交付 | 是 | 须与合并到主干的Commit关联 |
| Blocked | 阻塞 | 否 | 必须填风险摘要 |
我还给模型设计了明确的输出规则,当它判断一个条目算“Done”时,必须附上两个里至少一个证据:任务状态为Done,或主干上存在对应标识的Merge提交。没证据宁可标注“待确认”,也不要把乐观情绪写进周报。这样调完之后,周报给到管理层手里,被挑出事实错误的概率大幅下降。
4.4 把周报能力沉淀成可复用Skills后的收益
技能上线第一周最有意思的变化不是生成省了多少分钟,而是为了能自动生成可靠周报,团队成员竟然主动把Linear状态维护得更及时了。因为数据上游不规范,周报里就会明晃晃标注“未分配Owner”“已停留7天无进展”,谁也不想被点名。有人抱怨这个周报技能太无情,但我内心知道做成对了。
从成本角度来看也划算。原先一个模块负责人写周报平均半小时,两三个手工整理数据的动作还要多人来回确认。现在模型产初稿后,模块负责人只需要花三五分钟校验,多数人直接改两处措辞就发出去了。关键是每个人都确信AI引用的每条结论都能在Linear和Git里找到对应出处。
5. 仓库化治理与推广节奏:让项目级Skills活下来
5.1 给Skills建一套工程化目录
项目级Skills多了之后,绝不能继续散在每个人的 .claude/skills 里。我的经验是服务器上单独建一个 team-ai 仓库,里面统一维护,然后再根据各工具能力做分发。
一个经过几轮迭代验证的结构大概是:
text复制team-ai/
├─ skills/
│ ├─ meeting-to-tasks/
│ │ ├─ SKILL.md
│ │ ├─ scripts/parse_transcript.py
│ │ └─ templates/task-card.md
│ ├─ weekly-report/
│ │ ├─ SKILL.md
│ │ ├─ scripts/pull_linear.py
│ │ └─ templates/weekly-report.md
│ ├─ release-checklist/
│ │ ├─ SKILL.md
│ │ └─ templates/checklist.md
│ └─ pr-description/
│ ├─ SKILL.md
│ └─ prompts/design-notes.md
├─ state/
│ └─ project-state.md
├─ templates/ # 团队公共文档模板
├─ scripts/ # 数据拉取和校验类脚本
└─ README.md # 使用说明与环境变量指引
每个技能都自带脚本和模板,不要跨技能互相引用文件,否则改一个会影响另一个,破坏隔离性。状态文件放外部独立目录,方便同一团队里多个技能共同读写。如果担心状态文件被误提交到Git,可以在仓库根目录加 .gitignore 把该文件排除,仅保留示例文件。
5.2 多工具共存的挂载说明
现在不少团队会同时用Claude Code、Codex或其他AI编程工具,并不是所有人都在一个生态里。Skills作为工程资产,建议源头统一放一份规范方案,放在 team-ai 仓库。然后按工具要求,用自动化脚本同步或软链到对应目录,例如把 skills/weekly-report 链接到代码仓库的 .claude/skills/weekly-report,让Claude Code自动发现该技能。Codex走它自己的加载方式即可。
手工复制会引发版本漂移。改了一版后有人还在用旧版,这几乎是团队协作里最容易出现的事故。从第一天起就用脚本同步或者统一约定“唯一事实源”,能省后面很多维护成本。
5.3 不要一次铺开,按节奏试点
最开始我也犯过急于“全面落地”的毛病:一口气做出了站会摘要、周报、迭代复盘、需求卡生成、测试用例草稿等七八个技能,恨不得让全团队立刻用上。结果很明显,大家记不住这么多命令,也不知道什么时候该触发哪个技能。
后来我改成小步快跑。第一阶段只推两个最容易被感知价值的技能:周报自动化和会议纪要转任务清单。前者是被催得最紧的文档任务,后者是所有开会人共同的痛点。试点小组选一个配合度高、流程相对标准化的组,别选管理最混乱的组,否则AI很难在数据混乱环境里产出稳定结果。
等试点跑顺,形成一个“每周跑出来的东西有专人审核、有问题及时回滚”的节奏后,再逐步扩展到其他小组。要记住:项目级Skills不是加功能,是加协作习惯。习惯的养成需要时间。
5.4 怎么看这套Skills到底值不值
最后补充一下效果衡量。我觉得不要只看“节省了多少工时”这种虚荣指标,要看它对团队协作质量的真实影响。我更关注的观测项包括:
- 有多少比例的周报,团队成员只改了个别措辞就敢直接发出去
- 例会/周会上,用于“同步事实”的时间是否下降,用于“讨论问题和决策”的时间是否提升
- 风险条目从出现到最后被处理的平均延迟是否缩短
- 跨角色信息不对称的抱怨是否减少,比如测试说“不知道这个需求到底做完没有”
我们实际情况是:周报编辑时间明显缩短,而站会上的同步时常显著下降,敏捷教练反馈会议质量提高。最意外的是,为了喂数据给Skills形成的“状态更新习惯”,居然比任何制度要求都管用。这也是我会在第二期继续坚持做项目级Skills的核心原因——AI帮团队找回的不是效率,是信息秩序。
如果你正准备在项目里开始搭这套东西,我的实用建议是:先别急着实现第一个技能。花半天时间把团队的信息流转路径、状态命名、交付口径梳理清楚,再动手。宁可让这批Skills在“项目脏数据”面前丑态百出,也不要让它在规范流程里自我高潮。数据不好,流程不齐,任何Skill都飞不起来;但反过来,当团队真的愿意把数据维护当作基础设施来认真对待时,AI技能带来的杠杆,会比你想象中大得多。
