Github brief intake
Skill eugenelim/agent-ready-repo/packs/github/.apm/skills/github-brief-intake
The complete AI operating model for software teams — from first idea to production. Three peer-supervised loops (discovery → build → release) over a catalogue of curated packs: skills, subagents, and hooks, each installed in one line. It's npm for your coding agent. Any agent, any stack — Claude Code, Codex, Cursor, Copilot, Gemini, Kiro.
npx -y skills add eugenelim/agent-ready-repo --skill github-brief-intakeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use this skill when the user points at a GitHub Milestone and wants it turned into shippable specs — "turn our Q3 milestone into specs", "intake this milestone as a brief", "we track work in GitHub Issues, pull milestone v2-launch into the spec pipeline". The skill pulls the milestone and its issues via the `gh` CLI, maps them onto a product brief (milestone title -> Outcome draft, open and closed issues -> Shape B user stories tagged with their issue number, milestone URL -> `Epic:` provenance pointer), writes it to `docs/product/briefs/<slug>.md`, and hands off to the `receive-brief` skill to elicit gaps, decompose, and build. Do NOT use for a single issue without a milestone (use `new-spec`) or when the user wants to pull multiple repos (this skill is single-repo, single-milestone).
SKILL.md
12.2 KB, ~2.9k tokens by cl100k_base, as published. Nobody here has run it
Skill: github-brief-intake
This is choreography, not invention. It is the adapter between a GitHub Milestone and the brief-intake pipeline, for teams that keep the what/why of a body of work in GitHub Issues under a Milestone rather than in a written brief.
It composes two things that already exist:
ghCLI (system dependency, not a skill — installed separately;ghowns its own auth and credential management) — every GitHub read. You never write a raw GitHub REST API call inside this skill;gh apiandgh issue listare the only verbs used.receive-briefskill (shipped by the host repo'scorepack; resolved by name through the harness) — the brief inbox: it elicits missing load-bearing fields conversationally, decomposes the brief into independently-shippable slices, and executes each throughnew-spec→work-loop. This skill does not re-explain or re-implement any of that — least of all elicitation. It assembles the brief from GitHub and hands off.
The one thing this skill owns is the GitHub Milestone → brief mapping that
neither side can do alone: receive-brief knows nothing about GitHub, and the
gh CLI knows nothing about briefs.
Cross-skill invocation — name, not path
This skill names receive-brief and new-spec by their name: field, never
by path. Install locations vary by IDE and scope, and skills can be renamed at
install time. Path coupling silently breaks every alternative layout.
Prerequisites
Before stage 1, do two things:
1. Auth posture check
Run gh auth status.
- Authenticated: proceed normally for both public and private repos.
- Unauthenticated: attempt to read the target repo.
- Read succeeds (public repo): note the unauthenticated posture in the
brief's
## Assumptionssection ("Data pulled anonymously — nogh auth login; public repo confirmed.") and continue. - Read returns 404: GitHub returns 404 for both a private repo and a
nonexistent repo when called anonymously — the two are indistinguishable.
Surface the verbatim message: "Repo or milestone not found — if this is a
private repo, run
gh auth loginand retry; if it is public, check the owner/repo/milestone." Stop. Do not retry or attempt further reads.
- Read succeeds (public repo): note the unauthenticated posture in the
brief's
Never dispatch further reads after a 404 or other non-success response.
2. receive-brief availability
Probe whether your harness can dispatch a skill registered under the name
receive-brief.
- Present → normal flow (stage 3 hands off to it).
- Absent → graceful-degradation flow (stage 4). You still produce the
brief and inline the decompose/execute instruction. Note: if
receive-briefis absent, downstreamnew-specandwork-loopmay likewise be absent — acknowledge this in the degradation branch output.
Decide this now so stage 2 knows which shape to write.
Lifecycle
Stage 1 — Intake: resolve owner/repo and enumerate the milestone
Resolve {owner}/{repo} from the user's input (e.g. eugenelim/my-repo).
If not given explicitly, read from the current repo context:
gh repo view --json owner,name --jq '"\(.owner.login)/\(.name)"'
List available milestones (if the user has not named one):
gh api repos/{owner}/{repo}/milestones \
--jq '[.[] | {number, title, description, html_url, open_issues, closed_issues}]'
Surface the list and ask the user to pick. If the user has given a milestone title or number, match it from the list.
Enumerate all issues in the milestone — include both open and closed so the story map captures the full scope:
gh issue list --repo {owner}/{repo} --milestone "<milestone-title>" --state all \
--json number,title,body,labels,url,state
{owner}/{repo} is the value resolved in Stage 1. Use the milestone title in
--milestone — the gh CLI accepts a milestone number or title. If the issue list returns
empty, produce the brief with an empty Shape B section and an elicit note (see
Stage 2 — empty milestone edge case) rather than aborting.
Single-issue input (no milestone): If the user points at a single issue
with no milestone container, that is one feature — new-spec territory, not a
multi-feature brief. Stop and recommend new-spec (confirm before proceeding).
Stage 2 — Map to a Shape B brief
Write a draft brief to docs/product/briefs/<slug>.md, where <slug> is
kebab-case derived from the milestone title (it must match the filename and the
Brief: back-link receive-brief later stamps on derived specs). Confirm the
slug with the user before writing; check whether a file already exists at that
path and require explicit confirmation to overwrite.
If core is installed, copy its docs/product/briefs/_template.md; otherwise
use the carried shape below.
The GitHub → brief mapping is Shape B (story-list):
| Brief field | GitHub source |
|---|---|
Outcome | the milestone title + description, in the user's terms |
Scope / Non-goals | the milestone description, where stated — never invented |
Epic: pointer | the milestone html_url — provenance back to GitHub |
User stories (US-n) | one per issue (below) |
Each issue becomes one US-n line in this pinned format — the trace
receive-brief completes with Satisfies: US-n on derived spec acceptance
criteria depends on it:
- **US-1.** (#42) As a <role>, I want <capability>, so that <benefit>.
- **US-2.** (#43) <issue title, carried verbatim when it isn't story-shaped> [closed]
The issue number is a parenthetical immediately after the id. Reshape the
issue's title into the As a … I want … so that … grammar only when the
source supports it; otherwise carry the title verbatim and let receive-brief
refine it during Elicit. Never invent a role or benefit the issue does not
state. Closed issues (where state == "CLOSED" — uppercase, as returned by
gh issue list) are annotated [closed] after the story text.
Empty milestone edge case: when the issue list is empty, produce a brief
with the milestone metadata (title → Outcome draft, html_url → Epic:) and an
empty ## User stories section, followed by an elicit note: "No issues found
in this milestone — receive-brief will elicit user stories during the Elicit
stage."
Leave Success metrics, Appetite, and any silent Scope to
receive-brief — surfacing and filling those gaps is its Elicit stage, not
yours. The Spec map's Status column is auto-derived downstream; leave it.
Stage 3 — Hand off to receive-brief (the normal flow)
Invoke the receive-brief skill by name, pointing it at the brief file you
just wrote. From here, receive-brief owns everything:
- Elicit — it ingests the brief and asks the user for any missing load-bearing field (Outcome, Scope). A thin milestone is normal input; it elicits rather than rejects. Do not pre-empt this by interrogating the user yourself.
- Decompose — it cuts the stories into independently-shippable slices and surfaces the cut for confirmation.
- Execute — it chains
new-spec→work-loopper slice and stamps theBrief:/Satisfies: US-nback-links.
Your job ends at the handoff. Do not duplicate the Decompose/Execute stages.
Stage 4 — Graceful degradation (the receive-brief-absent flow)
When the Prerequisites probe found no receive-brief skill, do not stop —
you have still produced a useful brief. Inline the following instruction for
the agent to act on directly. Note that downstream new-spec and work-loop
skills may likewise be absent (if core is not installed, none of them
are) — fall back to the host repo's own spec/build process where they are:
Decompose & execute (inlined because
receive-briefis not installed).
- Elicit the gaps. The brief above may be missing its Outcome or Scope. Ask the user for those load-bearing fields — do not invent them. Offer defaults for Success metrics / Appetite; never block on them.
- Decompose by shippability, not by component. Cut into slices each independently shippable and testable — one feature a build loop can carry end to end. Group the
US-nstories into slices. Flag any milestone-sized story for splitting; flag any Outcome no slice covers as a gap.- Surface the cut and wait for confirmation before authoring any spec.
- Execute each confirmed slice through your repo's spec process (the
new-specskill if installed, else your repo's equivalent), then build it (thework-loopskill if installed, else your repo's loop). Stamp each derived spec with aBrief:back-link to this brief and aSatisfies: US-nmarker on the acceptance criteria that satisfy a story.
Carried brief shape (used only when core's _template.md is absent)
# Brief: <one-line outcome>
- **Slug:** `<slug>`
- **Received:** <YYYY-MM-DD>
- **Owner:** <who owns this repo's slice>
- **Epic:** <milestone html_url>
## Outcome
<the milestone title / description, reworded as a problem and user-facing outcome — elicit if the milestone is thin>
## Success metrics
<observable signals; offer a default if absent>
## Scope / Non-goals
**In scope:**
-
**Non-goals:**
-
## User stories
- **US-1.** (#NNN) As a <role>, I want <capability>, so that <benefit>.
## Spec map
| Spec | Status |
| --- | --- |
| `<feature-slug>` | <auto> |
Stage 5 — Post-intake write-back (optional, offer only after brief is confirmed)
After the brief is written and the user has confirmed it, offer (do not require) to update the GitHub issues:
- Comment on one or more issues (e.g. a brief-slug link or a triage note). Confirm per issue or per batch — the user decides the comment text.
- Label one or more issues. Confirm per label application; never remove labels without explicit confirmation.
- Close one or more issues. Confirm individually — closing is irreversible without a reopening step.
Each action type requires separate explicit user confirmation. Never combine comment + label + close into a single prompt — they have different blast radii.
Never edit the body of a GitHub issue. Post-intake write-back is strictly comment / label / close; issue body text is immutable for this skill.
Don't
- Don't write a raw GitHub REST call. Use
gh apiandgh issue list; nevercurl https://api.github.com/...inside the skill body. - Don't reimplement
receive-brief's Elicit stage. Do not interrogate the user for a missing Outcome or Scope — produce the brief and hand off (or, in the degraded path, hand the eliciting instruction to the agent). - Don't invent an Outcome, Scope, or story the milestone or its issues
don't state. A thin milestone is fine — surface the gap;
receive-briefelicits it. - Don't force a single issue into a brief. One issue →
new-spec. A label-filtered list with no milestone → confirm the grouping is intentional first. - Don't become a cross-repo coordination hub. Carry the milestone URL as
the
Epic:pointer only; do not coordinate work across repos. - Don't hardcode a skill or template path. Look skills up by name only.
- Don't edit issue bodies. Post-intake write-back is comment / label / close — never body mutation.
- Don't add credentialed-skill frontmatter.
ghowns its own credential chain; this skill never touches a token. Nocredentialed:field is needed.
What ships with it: 1 file
2.8 KB alongside SKILL.md
- manifest.json2.8 KB