用途
Project Pulse 适用于需要从 GitHub issue 和 PR 中获取产品经理(PM)与架构师视角项目健康状态的场景。它遵循 GitHub 优先的同步模型:GitHub 是事实来源,本地文件只是缓存与分析产物。
适用场景包括:
- 每日或每周优先级同步。
- 自主行动前的控制器规划刷新。
- 检测过期 issue 和优先级漂移。
- 生成用于讨论的简洁 PM 报告。
- 将仓库状态转换为执行计划(下一步做什么、哪些可以并行、哪些应延后)。
不适用于:
- issue 的代码实现。
- PR 审查或 PR 修复执行。
工作流程
- 从参数、PULSE_REPO 或 git remote 解析目标仓库(owner/repo)。
- 优先读取本地 pulse 产物(report.json、issues-index.json、prs-index.json)。
- 如果缓存过期,从 GitHub 拉取 issue 和 PR 数据(gh issue list、gh pr list)。
- 用最新游标(last_max_updated_at)更新本地同步状态(sync-state.json)。
- 生成分析产物:issues/ 与 issues-index.json、prs/ 与 prs-index.json、report.json、report.md、sync-state.json。
- 从报告信号中得出规划决策:优先级计划(由标签与风险信号映射为 P0/P1/P2)、并行工作流(相互独立的轨道)、阻塞项与前置条件(例如在开展新功能工作前先处理失败的 PR 检查)、供控制器触发器使用的建议后续动作。
默认读取路径(必需)
进行优先级、规划或风险分析时,始终按以下顺序:
- 读取 ${PULSE_BASE_DIR}/report.json
- 读取 ${PULSE_BASE_DIR}/issues-index.json 和 ${PULSE_BASE_DIR}/prs-index.json
- 仅在缓存过期或明确强制刷新时,才从 GitHub 刷新
当 pulse 缓存较新时,不要以直接调用 gh issue list / gh pr list 查询开头。
控制器规则(必需)
当请求涉及优先级、规划、风险、排序或架构状态时:
- 先运行 project-pulse。
- 基于 pulse 产物得出结论。
- 仅在验证特定缺失字段时,才以直接 GitHub API 读取作为回退或验证。
规划与设计指引
把 report.json 当作决策输入,而不仅是状态快照。决策顺序:
- 先稳定执行面:若 pr_totals.failing_checks > 0,优先修复 PR,再开启新的实现线程;若 pr_totals.changes_requested > 0,优先收敛评审反馈以降低队列延迟。
- 保护最高优先级交付:把 priority:critical 的 issue 视为每日同步队列;保持 WIP 有界,避免在 critical 队列增长时启动中优先级工作。
- 控制流程健康:用 stale_issues 和 stalled_prs 检测漂移,并指派负责人或升级动作。
- 规划架构增量:用 pulse 结果把工作拆分为独立轨道(runtime/core、policy/controller、quality/security);避免在一次运行中耦合不相关的架构变更。
建议的控制器动作映射:
- failing_prs 非空 -> 触发 github-pr-fix
- ready_to_merge_candidates 非空 -> 运行 merge-policy 检查或人工评审门禁
- priority:critical issue 队列非空且 PR 面稳定 -> 触发 github-issue-solve
- 无紧急信号 -> no-op / 等待并继续监控
脚本用法
运行 scripts/pulse.sh。
示例:
# Use current git repo remote
skills/project-pulse/scripts/pulse.sh
# Explicit repo
skills/project-pulse/scripts/pulse.sh holon-run/holon
# Include closed issues in analysis
PULSE_INCLUDE_CLOSED=true skills/project-pulse/scripts/pulse.sh holon-run/holon
环境变量
- PULSE_REPO:可选的仓库覆盖(owner/repo)。
- PULSE_INCLUDE_CLOSED:true|false(默认 false)。
- PULSE_MAX_ISSUES:最多拉取的 issue 数(默认 500)。
- PULSE_MAX_PRS:最多拉取的 PR 数(默认 500)。
- PULSE_STALE_DAYS:过期阈值天数(默认 14)。
- PULSE_MAX_AGE_MINUTES:缓存新鲜度阈值(分钟,默认 10)。
- PULSE_FORCE_REFRESH:true|false,绕过缓存强制同步 GitHub(默认 false)。
- PULSE_BASE_DIR:仓库本地 pulse 数据的基础目录(默认 $HOME/.holon/project-pulse/<owner>/<repo>)。
- PULSE_OUT_DIR:分析输出目录(默认 ${PULSE_BASE_DIR})。
- PULSE_STATE_DIR:本地缓存/游标目录(默认 ${PULSE_BASE_DIR})。
- PULSE_SPLIT_ISSUES:true|false,将 issue 存为每 issue 一个文件(默认 true)。
- PULSE_KEEP_RAW_ISSUES:true|false,同时保留聚合的 issues.json(默认 false)。
- PULSE_SPLIT_PRS:true|false,将 PR 存为每 PR 一个文件(默认 true)。
- PULSE_KEEP_RAW_PRS:true|false,同时保留聚合的 prs.json(默认 false)。
输出约定
- ${PULSE_OUT_DIR}/issues/:当 PULSE_SPLIT_ISSUES=true 时,每 issue 一个快照(<number>.json)。
- ${PULSE_OUT_DIR}/issues-index.json:当 PULSE_SPLIT_ISSUES=true 时用于快速扫描的紧凑索引。
- ${PULSE_OUT_DIR}/issues.json:当 PULSE_SPLIT_ISSUES=false 或 PULSE_KEEP_RAW_ISSUES=true 时的聚合快照。
- ${PULSE_OUT_DIR}/prs/:当 PULSE_SPLIT_PRS=true 时,每 PR 一个快照(<number>.json)。
- ${PULSE_OUT_DIR}/prs-index.json:当 PULSE_SPLIT_PRS=true 时用于快速扫描的紧凑索引。
- ${PULSE_OUT_DIR}/prs.json:当 PULSE_SPLIT_PRS=false 或 PULSE_KEEP_RAW_PRS=true 时的聚合快照。
- ${PULSE_OUT_DIR}/report.json:机器可读的 PM 摘要。
- ${PULSE_OUT_DIR}/report.md:人类可读的 PM 摘要。
- ${PULSE_STATE_DIR}/sync-state.json:最新游标与同步元数据。
report.json 包含 next_actions,供控制器直接消费。
Schema 详情参见 references/report-schema.md。规划用法参见 references/planning-playbook.md。
说明
- 默认将写操作(标签/评论编辑)保留在本脚本之外。
- 本技能为分析优先,默认安全。