mcpField
K
kill-the-standup

kill-the-standup

github.com/varnan-tech生产力68743 次安装2 周前更新
代码仓库

关于 kill-the-standup

面向使用 Linear、GitHub 和 Slack 的团队的站会汇报技能。它汇总昨天的工作并整理成简报,发布到 Slack 前会先征求确认。

主要功能

  1. 01获取近期更新的 Linear 问题
  2. 02收集昨天的 GitHub 提交
  3. 03将工作归类为 Done 和 Doing
  4. 04发布到 Slack 前预览简报

适用场景

  1. 01准备每日工程站会
  2. 02在 Slack 分享问题与提交进展

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/varnan-tech/opendirectory --skill kill-the-standup

安装后在 Claude Code 中输入/kill-the-standup确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.env.example
README.md
evals/
evals.json
references/
standup-format.md

详细介绍

结束站会

读取昨天的 Linear 事项和 GitHub 提交记录。整理站会更新,并发布到 Slack。


步骤 1:检查设置

确认必需的环境变量已设置:

echo "LINEAR_API_KEY: ${LINEAR_API_KEY:+set}"
echo "SLACK_WEBHOOK_URL: ${SLACK_WEBHOOK_URL:+set}"
echo "GITHUB_REPO: ${GITHUB_REPO:-not set}"
echo "GITHUB_USERNAME: ${GITHUB_USERNAME:-not set}"

如果缺少 LINEAR_API_KEY: 停止。告知用户:“LINEAR_API_KEY 是必需项。请前往 Linear → Settings → API → Personal API keys 获取,并将其添加到 .env 文件中。”

如果缺少 SLACK_WEBHOOK_URL: 停止。告知用户:“SLACK_WEBHOOK_URL 是必需项。请前往 api.slack.com/apps → Your App → Incoming Webhooks 创建 Incoming Webhook,并将其添加到 .env 文件中。”

如果缺少 GITHUB_REPO: 继续。将跳过 GitHub 提交记录。请向用户说明这一点。


步骤 2:获取 Linear 活动

计算昨天的日期,并使用 ISO 8601 格式(例如 2026-04-09T00:00:00.000Z)。

获取当前用户 ID:

curl -s -X POST https://api.linear.app/graphql \
  -H "Authorization: Bearer $LINEAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "query { viewer { id name email } }"}'

从响应中提取 id 字段。保存为 LINEAR_USER_ID。

获取分配给我且自昨天以来有更新的事项:

curl -s -X POST https://api.linear.app/graphql \
  -H "Authorization: Bearer $LINEAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "query($since: DateTime!, $userId: ID!) { issues(first: 50, filter: { assignee: { id: { eq: $userId } } updatedAt: { gte: $since } }) { edges { node { identifier title state { name } url completedAt updatedAt createdAt } } } }",
    "variables": {"since": "YESTERDAY_ISO", "userId": "LINEAR_USER_ID"}
  }'

对事项分类:

  • completedAt 非 null → 已完成
  • state.name 为 "In Progress"、"Started" 或 "In Review" → 进行中
  • state.name 为 "Cancelled" → 跳过
  • state.name 为 "Todo" 或 "Backlog" → 跳过(未处理)

如果没有任何事项:注明“昨天没有找到 Linear 活动。”


步骤 3:获取 GitHub 提交记录

如果未设置 GITHUB_REPO,则静默跳过此步骤。

如果已设置 GITHUB_REPO:

gh api "repos/$GITHUB_REPO/commits?author=${GITHUB_USERNAME:-$(gh api user --jq .login)}&since=YESTERDAY_ISO&per_page=30" \
  --jq '[.[] | {message: .commit.message, url: .html_url}]'

处理提交记录:

  • 提取每条提交消息的第一行(即第一个换行符之前的所有内容)
  • 跳过合并提交:删除所有以 "Merge" 开头的消息
  • 按消息文本去重

如果已设置 GITHUB_REPO,但没有返回任何提交记录:注明“昨天没有找到提交记录。”


步骤 4:整理站会内容

写作前完整阅读 references/standup-format.md。

严格按照以下结构撰写站会内容:

**Done**
- [ENG-123] Title of completed issue
- fix: commit message here

**Doing**
- [ENG-124] Title of in-progress issue

**Blockers**
No blockers.

standup-format.md 中的规则:

  • 不使用第一人称代词("I"、"we")
  • 已完成事项使用过去时,进行中事项使用现在进行时
  • 每个 Linear 事项使用 [IDENTIFIER] Title 格式
  • 每条 GitHub 提交记录使用提交消息的第一行
  • 如果没有已完成事项:在 Done 下写“Nothing completed.”
  • 如果没有进行中事项:在 Doing 下写“Nothing in progress.”
  • 如果没有阻塞事项:写“No blockers.”
  • 总字数少于 200 词

步骤 5:发布到 Slack 或输出

向用户展示整理好的站会内容。

询问:“发布到 Slack,还是仅输出?”

确认发布时:

curl -s -X POST "$SLACK_WEBHOOK_URL" \
  -H "Content-Type: application/json" \
  -d '{
    "blocks": [
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": "*Standup — DATE_HERE*\n\n*Done*\nITEMS\n\n*Doing*\nITEMS\n\n*Blockers*\nITEMS"
        }
      }
    ]
  }'

通过临时文件或 heredoc 传递正文,以避免提交消息或事项标题中的特殊字符导致 shell 引号问题:

cat > /tmp/standup-payload.json << 'ENDJSON'
{
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "STANDUP_CONTENT_HERE"
      }
    }
  ]
}
ENDJSON
curl -s -X POST "$SLACK_WEBHOOK_URL" -H "Content-Type: application/json" -d @/tmp/standup-payload.json

发布后:“站会内容已发布。”

选择“仅输出”时: 将站会内容放入代码块中打印,便于复制粘贴。

评论

支持 Markdown