generate-standup

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Generate Daily Standup

生成每日站会内容

Produces a daily standup post from live GitHub activity and optionally posts it to the
mitodl/hq
Check-ins discussion.
Requires:
gh
(authenticated) and
jq
.

基于实时GitHub活动生成每日站会帖子,并可选择发布至
mitodl/hq
的Check-ins讨论区。
**依赖:**已认证的
gh
jq

Step 1 — Fetch GitHub context

步骤1 — 获取GitHub上下文

Run the bundled context script before asking any questions:
bash
bash skills/process/generate-standup/scripts/get-standup-context.sh [-t YYYY-MM-DD] [-o org1,org2]
FlagDescriptionDefault
-t
"Today" date (
YYYY-MM-DD
)
today (UTC)
-o
Comma-separated orgs to search
mitodl,openedx
The script outputs a JSON object:
json
{
  "meta": { "username", "today", "yesterday", "tomorrow", "since" },
  "checkin_discussion": { "id", "number", "title", "url", "createdAt" },
  "prs_authored":    [...],
  "prs_reviewed":    [...],
  "issues":          [...],
  "rfc_discussions": [...]
}
  • meta.yesterday
    is the previous weekday (Friday if today is Monday).
  • meta.tomorrow
    is the next weekday (Monday if today is Friday).
  • meta.since
    is midnight UTC on
    meta.yesterday
    — the fetch window start.
  • checkin_discussion
    is the most recent Check-ins discussion in
    mitodl/hq
    . Keep its
    id
    (GraphQL node ID) and
    url
    for Steps 4–5.
  • Do not infer or fabricate activity beyond what the script returns.

在询问任何问题之前,先运行内置的上下文脚本:
bash
bash skills/process/generate-standup/scripts/get-standup-context.sh [-t YYYY-MM-DD] [-o org1,org2]
参数描述默认值
-t
"今日"日期(格式
YYYY-MM-DD
今日(UTC时间)
-o
逗号分隔的要搜索的组织
mitodl,openedx
脚本会输出一个JSON对象:
json
{
  "meta": { "username", "today", "yesterday", "tomorrow", "since" },
  "checkin_discussion": { "id", "number", "title", "url", "createdAt" },
  "prs_authored":    [...],
  "prs_reviewed":    [...],
  "issues":          [...],
  "rfc_discussions": [...]
}
  • meta.yesterday
    为前一个工作日(若今日为周一,则为上周五)。
  • meta.tomorrow
    为下一个工作日(若今日为周五,则为下周一)。
  • meta.since
    meta.yesterday
    的UTC午夜时间——即数据获取窗口的起始时间。
  • checkin_discussion
    mitodl/hq
    中最新的Check-ins讨论区。请保留其
    id
    (GraphQL节点ID)和
    url
    用于步骤4-5。
  • 请勿推断或编造脚本返回内容之外的活动信息。

Step 1b — Query agent session history

步骤1b — 查询Agent会话历史

Using the
sql
tool (
database: "session_store"
), fetch agent sessions active since
meta.since
:
sql
SELECT
  s.id,
  s.repository,
  s.branch,
  s.summary,
  s.created_at,
  s.updated_at,
  c.title        AS checkpoint_title,
  c.overview     AS checkpoint_overview,
  c.work_done    AS checkpoint_work_done
FROM sessions s
LEFT JOIN checkpoints c ON c.session_id = s.id
WHERE s.updated_at >= '<meta.since>'
ORDER BY s.updated_at DESC
For sessions with no checkpoints, fetch the first user turn as a fallback:
sql
SELECT s.id, s.repository, s.branch, t.user_message
FROM sessions s
JOIN turns t ON t.session_id = s.id AND t.turn_index = 0
WHERE s.updated_at >= '<meta.since>'
  AND NOT EXISTS (SELECT 1 FROM checkpoints c WHERE c.session_id = s.id)
ORDER BY s.updated_at DESC
Summarization rules:
Evidence availableAction
Checkpoint with
work_done
/
overview
Use as session summary
No checkpoint; has repo + branch + concrete first turnDerive brief summary from repo/branch + turn intent
No checkpoint; NULL repo or trivial/meta promptSkip
Session is for generating this standupSkip
Store the resulting list of session summaries; use in Steps 3–4 to enrich GitHub-derived bullets and fill in non-GitHub work.

使用
sql
工具(
database: "session_store"
)获取自
meta.since
以来活跃的Agent会话:
sql
SELECT
  s.id,
  s.repository,
  s.branch,
  s.summary,
  s.created_at,
  s.updated_at,
  c.title        AS checkpoint_title,
  c.overview     AS checkpoint_overview,
  c.work_done    AS checkpoint_work_done
FROM sessions s
LEFT JOIN checkpoints c ON c.session_id = s.id
WHERE s.updated_at >= '<meta.since>'
ORDER BY s.updated_at DESC
对于无检查点的会话,获取用户的第一条消息作为备选:
sql
SELECT s.id, s.repository, s.branch, t.user_message
FROM sessions s
JOIN turns t ON t.session_id = s.id AND t.turn_index = 0
WHERE s.updated_at >= '<meta.since>'
  AND NOT EXISTS (SELECT 1 FROM checkpoints c WHERE c.session_id = s.id)
ORDER BY s.updated_at DESC
总结规则:
可用证据操作
包含
work_done
/
overview
的检查点
用作会话总结
无检查点;包含仓库+分支+明确的第一条消息从仓库/分支和消息意图生成简短总结
无检查点;仓库为NULL或提示无实际内容跳过
会话用于生成本次站会内容跳过
保存生成的会话总结列表;在步骤3-4中用于丰富GitHub衍生的项目符号,并补充GitHub外的工作内容。

Step 2 — Ask clarifying questions

步骤2 — 询问澄清问题

Use a single
ask_user
call
with all fields at once.
First, identify session-only work from Step 1b (sessions with
repository: null
or whose repository doesn't appear in
prs_authored
). Format them as a short suggestion list for the
off_github
field description.
The most important field is
timing
— it controls the section headers and which date's activity is treated as "done" work:
json
{
  "timing": {
    "type": "string",
    "title": "When are you posting?",
    "enum": ["EOD — reporting today's work (today/tomorrow headers)",
             "BOD — reporting yesterday's work (yesterday/today headers)"],
    "description": "EOD: post at end of your work day; yesterday section covers today's date (meta.today). BOD: post at start of your work day; yesterday section covers meta.yesterday."
  },
  "blockers": {
    "type": "string",
    "title": "Blockers",
    "description": "Are you blocked on anything? Include a link and the @handle of whoever needs to unblock you. Leave blank if none."
  },
  "announcements": {
    "type": "string",
    "title": "Announcements",
    "description": "Anything to announce not in GitHub? (OOO, special review requests, schedule changes, etc.) Leave blank if none."
  },
  "off_github": {
    "type": "string",
    "title": "Off-GitHub work",
    "description": "Meetings, planning, research, design, or other work that won't appear in GitHub. Leave blank if none.\n\nPossible session-only work detected:\n<bullet list of session-only summaries, or 'none detected'>"
  }
}

使用单次
ask_user
调用,一次性获取所有字段信息。
首先,从步骤1b中识别仅会话中的工作
repository
为NULL或仓库未出现在
prs_authored
中的会话)。将其格式化为
off_github
字段描述的简短建议列表。
最重要的字段是
timing
——它控制章节标题以及将哪一天的活动视为“已完成”工作:
json
{
  "timing": {
    "type": "string",
    "title": "你将在何时发布?",
    "enum": ["EOD — 汇报今日工作(今日/明日标题)",
             "BOD — 汇报昨日工作(昨日/今日标题)"],
    "description": "EOD:在工作日结束时发布;昨日章节对应今日日期(meta.today)。BOD:在工作日开始时发布;昨日章节对应meta.yesterday。"
  },
  "blockers": {
    "type": "string",
    "title": "阻塞事项",
    "description": "你是否遇到任何阻塞?请包含链接和需要协助解除阻塞的人员@用户名。若无则留空。"
  },
  "announcements": {
    "type": "string",
    "title": "公告",
    "description": "是否有未在GitHub上体现的公告?(休假、特殊评审请求、日程变更等)若无则留空。"
  },
  "off_github": {
    "type": "string",
    "title": "GitHub外的工作",
    "description": "会议、规划、研究、设计或其他未在GitHub上体现的工作。若无则留空。\n\n检测到的可能仅会话工作:\n<仅会话总结的项目符号列表,或'未检测到'>"
  }
}

Step 3 — Classify activity

步骤3 — 分类活动

From the user's
timing
answer, determine:
Timing
report_date
(done work)
planned_date
(next work)
Past headerFuture header
EOD
meta.today
meta.tomorrow
What did I work on today?
What am I working on tomorrow?
BOD
meta.yesterday
meta.today
What did I work on yesterday?
What am I working on today?
Bucketing rules:
  • Done (past section): Any PR or issue with
    updatedAt
    or
    mergedAt
    on
    report_date
    . Include both merged and still-open items that were actively worked on that day.
  • Planned (future section): Open PRs and issues the user is continuing, plus anything explicitly stated in user answers. Omit items with no
    updatedAt
    since
    meta.since
    (stale).
  • Announcements: PRs authored by the user that are still open and need human review (exclude bots: Copilot, Gemini, Renovate, Dependabot, Sentry). Also include RFC discussions created today, blockers, and OOO info.
  • Deduplication: A PR in both
    prs_authored
    and
    prs_reviewed
    → list once under the most relevant bucket.
Incorporating agent sessions:
  • If a session maps to a PR/issue already in the GitHub data, enrich that bullet with context from the session summary — do not create a duplicate.
  • If a session represents work with no GitHub artifact, add it as its own bullet under done or planned based on
    updated_at
    vs
    report_date
    .

根据用户的
timing
回答,确定:
时间选择
report_date
(已完成工作)
planned_date
(后续工作)
过去章节标题未来章节标题
EOD
meta.today
meta.tomorrow
我今日完成了哪些工作?
我明日将开展哪些工作?
BOD
meta.yesterday
meta.today
我昨日完成了哪些工作?
我今日将开展哪些工作?
分类规则:
  • **已完成(过去章节):**任何在
    report_date
    updatedAt
    mergedAt
    记录的PR或Issue。包含已合并和仍在进行中且当日有活跃操作的项目。
  • **计划中(未来章节):**用户将继续推进的开放PR和Issue,加上用户回答中明确提及的事项。排除自
    meta.since
    以来无
    updatedAt
    记录的陈旧项目。
  • **公告:**用户发起的仍开放且需要人工评审的PR(排除机器人:Copilot、Gemini、Renovate、Dependabot、Sentry)。还包括今日创建的RFC讨论、阻塞事项和休假信息。
  • **去重:**同时出现在
    prs_authored
    prs_reviewed
    中的PR → 归入最相关的分类一次。
整合Agent会话:
  • 如果会话对应GitHub数据中已有的PR/Issue,用会话总结的上下文丰富该项目符号——不要创建重复项。
  • 如果会话代表无GitHub工件的工作,根据
    updated_at
    report_date
    的关系,将其作为单独的项目符号添加到已完成或计划中章节。

Step 4 — Render the standup

步骤4 — 渲染站会内容

Use
meta.username
(the GitHub login) as the name.
markdown
<Display Name>

> Standup announcements

- <item>

> <past header>

- <item>

> <future header>

- <item>
Formatting rules:
  • Empty sections: write
    - None
    , never omit the section header.
  • Blockers go in announcements as a bullet; tag with
    @handle
    and link.
  • Links: raw GitHub URLs are fine; markdown
    [text](url)
    formatting is also fine — match what feels natural for the content. Don't force one style.
  • Level of detail: match what the data supports. If a PR/issue title is self-explanatory, a bare link is sufficient. Add a brief description only when context genuinely helps (e.g., the PR title doesn't convey purpose, or the work involved investigation/discussion not captured in a link).
  • Do not impose narrative style: some people post links; some post prose; both are correct. Let the available data guide the output.
  • Do not group PRs across repos into parent bullets unless the user explicitly works across many repos on the same thing and grouping is clearly cleaner — default to separate bullets.
  • Planned section should reflect what's actually next, not a mechanical list of every open PR. Omit items the user is clearly done with.

使用
meta.username
(GitHub登录名)作为显示名称。
markdown
<显示名称>

> 站会公告

- <项目>

> <过去章节标题>

- <项目>

> <未来章节标题>

- <项目>
格式规则:
  • **空章节:**填写
    - None
    ,切勿省略章节标题。
  • 阻塞事项作为项目符号放在公告中;标记
    @用户名
    并添加链接。
  • **链接:**原始GitHub URL即可;也可使用Markdown的
    [文本](链接)
    格式——根据内容选择自然的样式,无需强制统一。
  • **详细程度:**匹配数据支持的内容。如果PR/Issue标题已清晰说明,仅需链接即可。仅当上下文确实有帮助时(例如PR标题无法传达目的,或工作涉及未在链接中体现的调查/讨论)才添加简短描述。
  • **不要强加叙事风格:**有些人只发链接,有些人发段落文字;两种方式都合理。根据可用数据决定输出形式。
  • 不要跨仓库分组PR到父项目符号下,除非用户明确跨多个仓库处理同一事务且分组明显更清晰——默认使用单独的项目符号。
  • 计划章节应反映实际后续工作,而非机械列出所有开放PR。排除用户显然已完成的项目。

Step 5 — Confirm and post

步骤5 — 确认并发布

Display the rendered standup, then use
ask_user
to confirm:
json
{
  "action": {
    "type": "string",
    "title": "Post this standup?",
    "enum": ["Post it", "Edit first", "Cancel"],
    "description": "Post as a comment on <title> (<checkin_discussion.url>), make edits, or cancel."
  }
}
Do not post unless the user selects "Post it".
On confirmation, post using the bundled script:
bash
echo "<rendered standup>" \
  | bash skills/process/generate-standup/scripts/post-standup-comment.sh \
      -d "<checkin_discussion.id>"
The script prints the comment URL on success.

显示渲染后的站会内容,然后使用
ask_user
获取确认:
json
{
  "action": {
    "type": "string",
    "title": "发布此站会内容?",
    "enum": ["发布", "先编辑", "取消"],
    "description": "发布为<title>的评论(<checkin_discussion.url>),进行编辑,或取消操作。"
  }
}
仅当用户选择“发布”时才可发布。
确认后,使用内置脚本发布:
bash
echo "<渲染后的站会内容>" \
  | bash skills/process/generate-standup/scripts/post-standup-comment.sh \
      -d "<checkin_discussion.id>"
脚本成功执行后会打印评论链接。

Example output (EOD, link-primary style)

示例输出(EOD,以链接为主风格)

markdown
Anna G

> Standup announcements

- https://github.com/mitodl/mitxonline/pull/3600 needs review

> What did I work on today?

- worked on https://github.com/mitodl/mitxonline/pull/3600
- updated UI and fixed tests https://github.com/mitodl/mit-learn/pull/3346, received review

> What am I working on tomorrow?

- address feedback https://github.com/mitodl/mit-learn/pull/3346
- resolve https://github.com/mitodl/hq/issues/11440
markdown
Anna G

> 站会公告

- https://github.com/mitodl/mitxonline/pull/3600 需要评审

> 我今日完成了哪些工作?

- 处理了 https://github.com/mitodl/mitxonline/pull/3600
- 更新UI并修复测试 https://github.com/mitodl/mit-learn/pull/3346,已收到评审意见

> 我明日将开展哪些工作?

- 处理 https://github.com/mitodl/mit-learn/pull/3346 的反馈
- 解决 https://github.com/mitodl/hq/issues/11440

Example output (BOD, narrative style)

示例输出(BOD,叙事风格)

markdown
Tobias Macey

> Standup announcements

- PRs needing review:
  - [ol-infrastructure #4659: add Archive/Deep Archive access tier support to OLBucket](https://github.com/mitodl/ol-infrastructure/pull/4659)
  - [ol-data-platform #2238: automate Iceberg table maintenance across the lakehouse](https://github.com/mitodl/ol-data-platform/pull/2238)

> What did I work on yesterday?

- Worked on addressing the hanging open issue for Dagster assets using Polars to read Iceberg tables
- Opened https://github.com/mitodl/ol-infrastructure/pull/4659 for S3 cost optimization

> What am I working on today?

- Finish fixing the Polars/Iceberg hang in Dagster
- Test the Concourse release workflow end to end
- Wrap up self assessment
markdown
Tobias Macey

> 站会公告

- 需要评审的PR:
  - [ol-infrastructure #4659: 为OLBucket添加归档/深度归档访问层级支持](https://github.com/mitodl/ol-infrastructure/pull/4659)
  - [ol-data-platform #2238: 自动化湖仓中Iceberg表的维护](https://github.com/mitodl/ol-data-platform/pull/2238)

> 我昨日完成了哪些工作?

- 处理使用Polars读取Iceberg表的Dagster资产悬而未决的问题
- 为S3成本优化提交了 https://github.com/mitodl/ol-infrastructure/pull/4659

> 我今日将开展哪些工作?

- 完成Dagster中Polars/Iceberg挂起问题的修复
- 端到端测试Concourse发布流程
- 完成自我评估

Example output (ambiguous timing, hybrid style)

示例输出(时间模糊,混合风格)

markdown
Sar

> Standup announcements

- None

> What did I work on yesterday/today?

- Wrote and deployed https://github.com/mitodl/ol-infrastructure/pull/4658
- Continued investigating SCIM sync failures — updates are reaching Keycloak
  logs but not propagating to Learn/MITx Online; restarting Keycloak temporarily
  restores sync, root cause still unknown

> What am I working on today/tomorrow?

- Continue digging into the SCIM update issue

See context script for the GitHub data-fetching implementation and post script for the comment posting implementation.
markdown
Sar

> 站会公告

- None

> 我昨日/今日完成了哪些工作?

- 编写并部署了 https://github.com/mitodl/ol-infrastructure/pull/4658
- 继续调查SCIM同步失败问题——更新已到达Keycloak日志,但未同步到Learn/MITx Online;重启Keycloak可临时恢复同步,根本原因仍未知

> 我今日/明日将开展哪些工作?

- 继续深入排查SCIM更新问题

查看上下文脚本了解GitHub数据获取实现,查看发布脚本了解评论发布实现。