GitHub integration

Mirror planning state to issues, milestones and releases. One-way — planning files stay the source of truth.

Opt-in. Disabled by default. Every operation is a no-op when the integration is off, gh is missing, or auth has expired — GitHub failures never block your workflow.

Enable

{
  "github": {
    "enabled": true,
    "repo": "owner/name",
    "milestone_prefix": "v",
    "labels": {
      "objective": "devflow:objective",
      "in_progress": "devflow:in-progress",
      "gaps": "devflow:gaps"
    }
  }
}

Prerequisites: the gh CLI installed and authenticated. If the auth flow needs a TTY, hand it off with /devflow:handoff.

df-tools gh status     # is the integration reachable?

What syncs, and when

TriggerActionManual equivalent
End of /devflow:new-projectOne milestone per roadmap version, one issue per objective; numbers persisted to .planning/.gh-mapping.jsondf-tools gh sync-objectives
Verifier finds gapsPosts the gaps: block from VERIFICATION.md as an issue commentdf-tools gh comment <obj> @file:path
Verification passesCloses the issue with a link to the verification reportdf-tools gh close-issue <obj>
Tag push vX.Y.ZRelease notes generated from SUMMARY.md files since the previous tagdf-tools gh sync-release vX.Y.Z
ManualAny of the above/devflow:gh-sync [objectives|release <tag>|status]

Additional CLI surface:

df-tools gh resolve <objectiveId>    # objective → issue number
df-tools gh sync <objectiveId>       # one objective: body + sticky comment + Project v2 fields
df-tools gh pull <objectiveId>       # detect drift from GitHub; --apply to reconcile

The mapping file

.planning/.gh-mapping.json is the source of truth for objective-to-issue correspondence:

{
  "milestone_id": 12,
  "objectives": { "1": 42, "2": 43, "2.1": 44 }
}

Commit it. Re-running sync-objectives is idempotent — existing issues are edited, not duplicated — but only because this file survives.

What does not sync

df-tools gh pull is the one concession: it detects drift (an objective closed or relabelled on GitHub) and can reconcile with --apply. It is opt-in and explicit, not automatic.

Troubleshooting

df-tools gh status

Common “skipped” reasons:

MessageFix
github.enabled is falseset enabled: true
gh CLI not installedinstall from cli.github.com
gh not authenticatedauthenticate the gh CLI
github.repo must be set as "owner/name"fix the format — it is owner/name, not a URL