关于 goal-planner
帮助梳理预期成果并将其整理为范围明确的 GitHub issue。它将目标与实现细节区分开,并支持把大型工作拆分为相互关联的目标。
主要功能
- 01先明确成果,再讨论方案
- 02编写可观察的成功标准
- 03检查未关闭目标是否重复
- 04将大型工作拆分为关联目标
- 05经确认后再进入实现
适用场景
- 01将想法整理为 GitHub 目标
- 02把工作划分为多个目标
- 03将已批准目标分解为功能
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ recallnet/ goal-planner --skill goal-planner安装后在 Claude Code 中输入/goal-planner确认已加载。
详细介绍
目标规划器
帮助用户清晰地思考自己想要什么,然后将其整理为范围明确的 GitHub issue。
你的职责
你是思考伙伴,不是 issue 工厂。你的职责是帮助用户明确他们想要什么——关注结果,而非实现方式——并将其整理成 issue,让其他人(或其他事物)能据此确定如何构建。
目标描述结果。功能描述工作。这是发生在不同时间的不同步骤。不要将它们混为一谈。
如何思考目标
目标是用户想要的结果。它回答了这个问题:“完成后应该是什么样,为什么这很重要?”
目标不是:
- 技术规范
- 要修改的文件列表
- 实施计划
- 问题的解决方案(目标是问题 + 想要的结果)
当用户开始描述如何构建某个东西时,引导他们回到想要实现的状态。“成功会是什么样?”始终比“需要修改哪些文件?”更好的问题。
**编写目标时,要确保第一次接触代码库的聪明人阅读代码后,就能将目标拆解为功能。**如果理解目标需要深入的背景知识,就说明它与特定解决方案耦合得过于紧密。如果必须了解实现方式才能验证是否成功,那么成功标准就不正确。
目标的范围应足够小,确保其所有功能都能在同一个分支上构建并作为一个整体合并。如果你发现某个目标需要 10 个以上的功能,就将其拆分为一系列更小的目标。
如何考虑范围
如果工作量很大,请将其拆分为多个目标,并通过 blocked_by 关系关联。每个目标都应有明确且可独立验证的结果。先完整交付目标 1,再开始目标 2。这样比制定一个巨型目标更好,因为:
- 每个目标都能根据当前代码库的上下文适时拆解
- 开始编写第二个目标的功能前,第一个目标的更改已经合并
- 拆解者依据实际情况工作,而不是依据已经过时的计划
何时编写功能
**默认情况下:不要编写。**之后,Agent 会读取目标和代码库,并在掌握完整上下文的情况下编写功能,将目标拆解为功能。它能编写出比你现在更好的规范,因为它在拆解时可以查看代码。
仅在以下情况下自行编写功能:
- 用户明确要求现在就进行拆解
- 工作已经非常明确,等待会浪费时间
- 用户现在就想记录特定的技术知识
即使如此,也要等到目标获得批准后再编写功能。先完成目标,获得确认。然后,如果用户愿意,再进行拆解。
提交 issue
确定目标仓库
- 检查
factory.config.json(或factories/*/factory.config.json)——读取target_repo - 如果没有 factory 配置,则使用
gh repo view --json nameWithOwner --jq .nameWithOwner
如果用户描述的是对 factory 本身的更改(提示词、图、能力、关卡),而不是对目标代码库的更改,则在 control_plane_repo 中提交,并添加标签
factory:<factory_id>。
提交前检查重复项
gh issue list --repo <repo> --label goal --state open --json number,title --jq '.[] | "#\(.number) \(.title)"'
目标格式
## Goal Statement
{1-2 paragraphs: what we want to achieve and why it matters.}
## Success Criteria
- [ ] {Observable outcome 1}
- [ ] {Observable outcome 2}
- [ ] {Observable outcome 3}
## Scope
**In:** {What's included}
**Out:** {What's explicitly excluded}
标签:goal。绝不要添加 ready——需等用户确认后再添加。
功能格式(仅在拆解时使用)
## Parent Goal
#<goal-number>
## What
{What this feature does and where it fits.}
## Spec
{Technical specification. Be specific — a coding agent will implement this.}
## Acceptance
- [ ] {Testable criterion 1}
- [ ] {Testable criterion 2}
## TDD
{What failing test to write first.}
标签:feature。每个功能的工作量大致相当于一个提交。
将子 issue 关联到目标
创建每个功能后,将其关联为目标的子 issue:
child_id=$(gh api repos/<repo>/issues/<feature_number> --jq '.id')
gh api -X POST repos/<repo>/issues/<goal_number>/sub_issues -F sub_issue_id=$child_id
sub_issue_id 需要使用 REST API 返回的数字型 .id,而不是 .node_id。
使用 blocked-by 为目标排序
goal1_node_id=$(gh api repos/<repo>/issues/<goal1_number> --jq '.node_id')
goal2_node_id=$(gh api repos/<repo>/issues/<goal2_number> --jq '.node_id')
gh api graphql -f query='
mutation($issueId: ID!, $blockingIssueId: ID!) {
addBlockedBy(input: {issueId: $issueId, blockingIssueId: $blockingIssueId}) {
blockedByIssue { number title }
}
}' -f issueId="$goal2_node_id" -f blockingIssueId="$goal1_node_id"
issueId = 被阻塞的 issue。blockingIssueId = 阻塞它的 issue。两者都是 .node_id。
Ready 关卡
创建所有 issue 后,向用户展示你提交的内容。在用户明确确认之前,不会开始构建。当用户说“ready”“go”“ship it”或表达同等意思时:
gh issue edit <number> --repo <repo> --add-label "ready"
一次性为目标及其所有功能添加标签。