Skip to content

Sync roadmap plans (epics, stories, tasks) to GitHub Issues & Projects v2 -- idempotent, async, provider-agnostic

License

Notifications You must be signed in to change notification settings

aryeko/planpilot

planpilot logo planpilot

CI codecov PyPI Python Downloads License: MIT

Sync roadmap plans (epics, stories, tasks) to GitHub Issues and Projects v2.

⭐ If planpilot helps you manage your roadmaps, consider giving it a star!

What it does

planpilot takes structured plan files and turns them into a fully linked project board:

flowchart LR
    A["roadmap.md"] --> B["epics.json\nstories.json\ntasks.json"]
    B -->|planpilot| C["GitHub Issues\n+ Projects v2"]
    C --> D["Epic / Story / Task\nissue types"]
    C --> E["Sub-issue\nhierarchy"]
    C --> F["Blocked-by\ndependencies"]
    C --> G["Project fields\nstatus, priority,\niteration, size"]
Loading
  • One-way sync: local plan files -> GitHub
  • Idempotent: safe to rerun -- updates existing issues via markers
  • Dry-run first: preview all changes before applying
  • Multi-epic: sync multiple epics natively in one run
  • Provider-agnostic: adapter pattern supports GitHub today, with Jira/Linear planned
  • Async-first: built on asyncio for fast, concurrent sync operations

Architecture

planpilot follows SOLID principles with a modular, provider-agnostic design:

src/planpilot/
├── core/            # Runtime domains (auth/config/contracts/engine/plan/providers/renderers)
├── cli/             # CLI parser/app/commands and persistence helpers
├── sdk.py           # SDK composition root and public facade
└── __init__.py      # Public API exports

Core domains provide business logic, and the SDK composes runtime pieces. This keeps provider and renderer implementations swappable without changing engine internals.

See docs/design/architecture.md for the full architecture guide.

Requirements

  • Python 3.11+
  • GitHub token with repo and project scopes
  • gh CLI only when using auth: "gh-cli"

Installation

# Install pipx if you don't have it
brew install pipx && pipx ensurepath   # macOS
# or: sudo apt install -y pipx && pipx ensurepath   # Debian/Ubuntu

# Install planpilot
pipx install planpilot

pipx installs CLI tools in isolated environments -- avoids PEP 668 / "externally managed environment" errors on macOS Homebrew and system Python.

Alternative: pip (inside a virtualenv)
python3 -m venv .venv && source .venv/bin/activate
pip install planpilot
From source (Poetry)
poetry install

Install Agent Skill

Agent Self-Install

Tell your agent:

Fetch and follow instructions from https://raw.githubusercontent.com/aryeko/planpilot/v2.3.0/skills/INSTALL.agent.md

The agent will install both planpilot and the skill automatically.

Manual Install

Install the skill to the open discovery path used by agent platforms that support filesystem skills:

mkdir -p ~/.agents/skills/roadmap-to-github-project

curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/v2.3.0/skills/roadmap-to-github-project/SKILL.md" \
  -o ~/.agents/skills/roadmap-to-github-project/SKILL.md

Or from a local checkout:

cp skills/roadmap-to-github-project/SKILL.md \
  ~/.agents/skills/roadmap-to-github-project/SKILL.md

Full standalone instructions: skills/INSTALL.md

Quickstart

1. Generate planpilot.json

planpilot init

The interactive wizard auto-detects your git remote and guides you through provider, target repo, board URL, plan layout, and auth. Or create the config manually:

cat > planpilot.json <<'JSON'
{
  "provider": "github",
  "target": "your-org/your-repo",
  "board_url": "https://github.com/orgs/your-org/projects/1",
  "plan_paths": {
    "epics": ".plans/epics.json",
    "stories": ".plans/stories.json",
    "tasks": ".plans/tasks.json"
  },
  "sync_path": ".plans/sync-map.json"
}
JSON

2. Dry-run (preview changes)

planpilot sync --config ./planpilot.json --dry-run

3. Apply changes

planpilot sync --config ./planpilot.json --apply

4. Multi-epic plans

planpilot supports multi-epic plans natively. Keep all epics/stories/tasks in the configured plan files and run once:

planpilot sync --config ./planpilot.json --apply

CLI commands

planpilot init

Flag Default Description
--output, -o planpilot.json Output file path
--defaults off Generate config with auto-detected defaults (no prompts)

planpilot sync

Flag Default Description
--config ./planpilot.json Path to planpilot.json
--dry-run Preview mode (no provider mutations)
--apply Apply mode
--verbose off Enable verbose logging

planpilot clean

Flag Default Description
--config ./planpilot.json Path to planpilot.json
--dry-run Preview which issues would be deleted
--apply Execute deletions
--all off Delete all planpilot-managed issues by label, regardless of current plan hash
--verbose off Enable verbose logging

planpilot map sync

Flag Default Description
--config ./planpilot.json Path to planpilot.json
--dry-run Preview local sync-map reconciliation
--apply Persist reconciled local sync-map
--plan-id auto Explicit remote plan ID to reconcile
--verbose off Enable verbose logging

map sync reconciles local artifacts from provider metadata only; it does not mutate provider items. In apply mode it writes both the local sync-map and local plan files.

Full CLI reference: docs/modules/cli.md

Plan file schemas

See docs/reference/plan-schemas.md for plan schema examples and docs/modules/plan.md for validation behavior.

A complete working example is in the examples/ directory, including sample rendered issue bodies and a sync-map output.

Documentation

Support

Branding

Branding assets (logo + social preview images) are in assets/branding/navigator/.

Development

Development tasks use poethepoet:

poe lint           # ruff check
poe format         # ruff format
poe docs-links     # validate local markdown links
poe test           # pytest -v --ignore=tests/e2e
poe test-e2e       # run offline E2E suite
poe coverage       # pytest + HTML coverage report
poe coverage-e2e   # E2E-only coverage XML
poe typecheck      # mypy
poe check          # lint + format-check + typecheck + tests

Contributing

See CONTRIBUTING.md for setup and development instructions.

License

MIT

About

Sync roadmap plans (epics, stories, tasks) to GitHub Issues & Projects v2 -- idempotent, async, provider-agnostic

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •