issue-flow
Agents should behave. Let them follow the issue flow.
issue-flow scaffolds a lightweight issue-tracking workflow into your project so that AI coding agents can pick up GitHub issues, plan work, and land PRs in a consistent way. It supports Cursor, Claude Code, opencode, and Codex via --editor (see Editor support); the examples below use the default, Cursor.
Full documentation: https://issue-flow.readthedocs.io/
Why use it
Every change starts from a GitHub issue, gets a written plan that you approve before any code is touched, and lands as a pull request with a changelog entry. The state of each issue is kept in plain markdown files in your repository, so the work survives across chat sessions and the next agent can pick it up.
It may slow you down a little compared with letting an agent loose. Maybe that is a good thing.
What it does
Running issue-flow init in your project root creates:
your-project/
.issueflows/
00-tools/ # Helper scripts for agents
01-current-issues/ # Active issue markdown files
02-partly-solved-issues/ # Parked / in-progress issues
03-solved-issues/ # Completed issues archive
04-designs-and-guides/ # Durable project context and decisions
this-project.md # Hand-editable project brief (created if missing)
05-epics/ # Staged epic plans (epic<N>_plan.md)
.cursor/
skills/ # Agent Skills (/iflow, /iflow-pick, /iflow-capture,
# /iflow-plan, /iflow-build, /iflow-close, …;
# /iflow-init = harness cold-start)
rules/
issueflow-rules.mdc # Always-on Cursor rule for the workflow
AGENTS.md # Workflow rules (managed block; shared by all editors)
docs/
issue-workflow.md # Human-readable overview of the workflow
The exact agent_dir and the per-editor rules file depend on which editor(s) you scaffold for — see Editor support. AGENTS.md (written as a non-destructive managed block), .issueflows/04-designs-and-guides/this-project.md (a hand-editable project brief created only when missing), and docs/issue-workflow.md are shared by every editor.
The Cursor Agent Skills give agents a repeatable flow and appear in the slash menu. In chat you can also type iflow plan, iflow pick, etc. (space-separated, no /) when your keyboard makes slash awkward — see docs/issue-workflow.md. The linear path is:
/iflow-capture 42oriflow capture 42— pulls GitHub issue #42 into.issueflows/01-current-issues/and archives older issues.iflow planor/iflow-plan— draftsissue<N>_plan.md(Goal / Constraints / Approach / Files to touch / Test strategy / Open questions) and stops for your confirmation./iflow-build— reads the confirmed plan and implements it. If no plan file exists, it offers to run/iflow-planfirst, proceed without a plan, or abort./iflow-close— runs tests, optionally bumps version withuv version --bump, appends aHISTORY.mdentry (or promotes[Unreleased]to a new release section on a bump), updates status files, commits, pushes, and opens a PR./iflow-cleanup— after the PR merges, switches to the default branch, fast-forwards, prunes, and deletes the merged local branch.
Plus a few off-path commands:
/iflow-setup— guided first-time setup: readsissue-flow agent setup-status, works out whether this is a new or an existing project, and walks the gaps (uv init,git init,gh auth login,gh repo create, scaffold) one confirmation at a time. Off-path; never auto-dispatched./iflow-init— harness cold-start / check: guidesissue-flow init/update. Does not capture GitHub issues — that is/iflow-capture. Off-path; never auto-dispatched./iflow-pick— front door: when you haven't chosen an issue yet, it helps pick one (parked work in02-partly-solved-issues/first, else open GitHub issues ranked by milestone, labels, and similarity to recently solved work), creates the<N>-slugbranch, and runs/iflow-capture. Passfixto create a new general-fixes issue. Off-path; never auto-dispatched./iflow— quick start: inspects the current issue's state and dispatches to the right linear step automatically. A branch-derived number (42-fix-login→N=42) is authoritative, so/iflowworks from a fresh branch too./iflow-pause— park the current issue in02-partly-solved-issues/with a Remaining work note; optional WIP commit + switch back to the default branch./iflow-yolo— all-in-one chain (capture → plan → build → close) for small, low-risk issues, with up-front safeguards (refuses on the default branch, refuses with dirty unrelated changes, requires passing tests, single consolidated confirm)./iflow-fix— interactive iterative-fixes session: creates one GitHub issue + long-lived branch, then loops over many small fixes (each gets a short plan, implemented only on confirmation and recorded inissue<N>_status.md), ending with/iflow-close. Coexists with/iflow-pick fix(the one-shot setup). Off-path; never auto-dispatched./iflow-issue— create one well-specified normal GitHub issue (context / spec / acceptance criteria), then optionally branch +/iflow-captureinto the standard lifecycle. Use/iflow-issue epic …for an epic anchor. Off-path; never auto-dispatched./iflow-split— cut one over-large existing issue into 2–5 flat GitHub native sub-issues behind one confirm. Parent stays open as the tracker. Off-path; never auto-dispatched./iflow-status— read-only overview of where every issue stands: the local tracking state (focus / parked / solved) plus open GitHub issues cross-referenced against it. Passlocalto skip the GitHub query. Changes nothing; off-path; never auto-dispatched./iflow-epic— plan a change too large for one issue as staged specs under.issueflows/05-epics/;publishcreates a confirmed stage's GitHub issues behind one confirm. Off-path; never auto-dispatched./iflow-cycle— batch-process a queue of yolo-fit issues under one up-front confirm (yolo/label:<L>/ numbers /epic <N>). Off-path; never auto-dispatched./iflow-auto— unattended large-change orchestrator over a confirmed epic (cycle a stage, recordauto_status.md, adversarialreviewmay reopen/create). Off-path; never auto-dispatched./iflow-review— review open GitHub issues and apply workflow labels (v1: the configuredyololabel) behind one consolidated confirm. Off-path; never auto-dispatched./iflow-doctor— scaffold health check (missing skills/commands, stale config). Off-path; never auto-dispatched./iflow-archive— condense the solved archive (destructive, gated): summarises selectedissue<N>_*groups under03-solved-issues/into a datedYYYY-MM-DD_archived_issues.mdfile. The summary records the pre-archive git ref so every original file stays recoverable (git show <ref>:<path>). Deletes the source files only after one consolidated confirm. Default: archive all but the 5 most recent solved groups; passkeep <K>, an explicit list of issue numbers, orall. Requires a clean working tree. Off-path; never auto-dispatched.
See the docs for worked recipes (review → cycle, epic publish, cycle queues).
The Agent Skills under .cursor/skills/ carry the workflows for on-demand use with /iflow-setup, /iflow-pick, /iflow, /iflow-init, /iflow-capture, /iflow-plan, /iflow-build, /iflow-pause, /iflow-close, /iflow-cleanup, /iflow-yolo, /iflow-fix, /iflow-issue, /iflow-split, /iflow-status, /iflow-epic, /iflow-cycle, /iflow-auto, /iflow-review, /iflow-doctor, /iflow-archive, @iflow-version-bump when you need only the bump steps, or @iflow-history-update when you need only the changelog update (see Cursor Agent Skills).
Prerequisites
issue-flow itself is a small Python CLI, but the scaffolded commands and skills
it writes into your project shell out to a few external tools. If they are
missing, the workflows will fail at runtime — so issue-flow init now
checks for them up front and prints install hints before it does anything.
Required:
- Git — used by every slash command for branch, fetch, status, commit, and push operations. Almost certainly already installed if you're here, but the check covers it for completeness.
- GitHub CLI (
gh) — used by/iflow-captureto fetch issues, by/iflow-closeto open PRs, and by/iflow-cleanupto check PR merge status. After installing, rungh auth loginonce to authenticate.
Recommended:
- uv — how issue-flow itself is meant to be installed, and how this repo manages its own Python environment.
Quick install pointers for gh:
| Platform | Command |
|---|---|
| macOS (Homebrew) | brew install gh |
| Windows (winget) | winget install --id GitHub.cli -e |
| Linux (Debian/Ubuntu) | sudo apt install gh (or see cli.github.com for the official repo) |
If a dependency is missing, issue-flow init prints the installation hints
and asks whether to continue anyway. You can bypass the prompt in automation
with issue-flow init --skip-dep-check (the same flag is available on
issue-flow update), and the prompt is also auto-skipped when stdin is not
a TTY (e.g. CI pipelines).
Multi-root workspaces
Parent folder of several git repos? Do not init the parent. From that folder:
issue-flow workspace bootstrap --yes --default <main-repo> # first time
issue-flow workspace update # later refreshes
Repos already scaffolded, toml missing: issue-flow workspace init --default <main-repo> then workspace update.
Recipe: Use issue-flow in a folder of repos.
Lifecycle commands must still target the correct repo (root: / repo: hints, or issue-flow agent resolve). See .issueflows/04-designs-and-guides/multi-repo-workspaces.md in scaffolded projects.
Optional: graphify integration
issue-flow has a lightweight integration with graphify
(PyPI: graphifyy, CLI: graphify) — a tool that turns the project into a
queryable knowledge graph that AI assistants can read instead of grepping
through files. The integration is opt-in by installing graphifyy as its
own tool (the same way you installed issue-flow): there is no enable flag and
no extras to remember — detection is purely PATH-based. (You can keep an LLM
API key in .env for the optional extract pass; see below.)
What issue-flow does when graphify is on PATH:
issue-flow initandissue-flow updaterungraphify cursor installso the graphify Cursor skill is registered alongside the issue-flow scaffold. If graphify is not installed, both commands just print install hints and continue — they never block.- A new
/iflow-graphifyentry point (skill on Cursor/Codex, command + skill for command-emitting editors) wrapsissue-flow graphify. With no extra args it runsgraphify update <project>— AST-only, no LLM API key required, so the no-arg case "just works". For richer semantic relationships addextract(issue-flow graphify extract) and configure a backend (GEMINI_API_KEY,ANTHROPIC_API_KEY,OPENAI_API_KEY,MOONSHOT_API_KEY, or--backend ollamafor a local LLM). You can set that key in the project.env—issue-flow graphifyloads.envfrom the project root before invoking graphify — or export it in your shell environment. Cursor's own LLM is not available to subprocesses, so graphify needs its own backend. Other subcommands (watch,cluster-only, …) pass through too; trailing flags forward verbatim. - The scaffolded rules and
/iflow-buildmentiongraphify-out/GRAPH_REPORT.mdas a recommended pre-read when the file exists./iflow-graphifyis off-path —/iflownever auto-dispatches to it.
To enable, install graphify as its own standalone tool:
uv tool install graphifyy # recommended
# or
pipx install graphifyy
# or
pip install graphifyy
Why not an
issue-flow[graphify]extra (oruv tool install issue-flow --with graphifyy)?uv tool installonly puts the host package's entry-point scripts on PATH. An extra (or--with graphifyy) pulls graphifyy into issue-flow's venv but leaves thegraphifyCLI invisible to the shell, so/iflow-graphifyandgraphify cursor installwould still fail. Installing graphify as its own tool puts a realgraphifyshim on PATH and matches how we treatgit/gh.
Just installed graphifyy and
issue-flow initsays it's still missing? uv prints~/.local/bin is not on your PATHafter the firstuv tool install. Runuv tool update-shell(refreshes shell rc files), then restart your shell and Cursor so the new PATH takes effect. issue-flow's missing-CLI hint also detects this case and tells you the exact directory to add.
After installing, run issue-flow update once so the graphify Cursor skill
gets registered.
Installation
Requires Python 3.12+ and uv (recommended).
uv tool install issue-flow
Or add it as a dev dependency to your project: uv add --dev issue-flow.
The scaffolded workflows shell out to Git and the GitHub CLI (gh) (run gh auth login once after installing). issue-flow init checks for both up front and prints install hints before it does anything; bypass the prompt in automation with --skip-dep-check.
Quick start
cd your-project
issue-flow init
That's it. Open the project in your editor and, in the chat window:
| Type this | What happens |
|---|---|
iflow pick |
Shows you the open GitHub issues, you choose one, it creates a branch |
iflow plan |
Writes a plan and stops for you to approve it |
iflow build |
Implements the approved plan |
iflow close |
Runs tests, updates the changelog, commits, pushes, opens a pull request |
iflow cleanup |
After the PR is merged: back to the main branch, tidy up local branches |
Forgot where you are? Type iflow and it runs the next step. (Slash forms
such as /iflow-plan work too.)
New to agentic coding, or starting from an empty folder? Use
issue-flow init --mode noviceinstead — a smaller command surface with settings that stop and ask at each step — then typeiflow setupin the chat window and the agent walks you throughuv init,git init,gh auth login, and creating the GitHub repository. See Getting started.
Plus a few off-path commands (never auto-dispatched):
/iflow-setup— guided first-time setup for a new or unprepared project (uv init,git init,gh auth login,gh repo create), one confirmation at a time./iflow-init— harness cold-start / check (issue-flow init/update). Does not capture issues./iflow-pick— front door: helps pick the next issue (parked work first, else open GitHub issues ranked by milestone, labels, and similarity to recent work), creates the branch, and runs/iflow-capture./iflow— quick start: inspects the current issue's state and dispatches to the right linear step automatically (a branch-derived number like42-fix-loginis authoritative)./iflow-pause— park the current issue with a Remaining work note./iflow-yolo— all-in-one chain (capture → plan → build → close) for small, low-risk issues, with up-front safeguards and a single consolidated confirm./iflow-fix— interactive iterative-fixes session: one GitHub issue + long-lived branch, many small confirmed fixes./iflow-issue— create one well-specified normal GitHub issue; optional branch +/iflow-capture./iflow-split— cut an over-large issue into linked GitHub sub-issues./iflow-status— read-only overview of where every issue stands, locally and on GitHub./iflow-epic— staged epic plan + publish; decomposes into normal single-issue work./iflow-cycle— batch yolo queue (yolo/label:<L>/ numbers / epic)./iflow-auto— unattended epic stage via/iflow-cycle+ adversarialreview./iflow-review— propose and apply workflow labels on open issues (v1:yolo)./iflow-doctor— scaffold health check./iflow-archive— condense old solved-issue files into a dated summary (destructive, gated behind one consolidated confirm; originals stay recoverable via git).
Docs cover epics, cycles, and reviews with examples: https://issue-flow.readthedocs.io/
CLI overview
issue-flow init [PROJECT_DIR] [--force] [--skip-dep-check] [--editor EDITOR] [--mode MODE] [--skill-level LEVEL]
issue-flow update [PROJECT_DIR] [--skip-dep-check] [--editor EDITOR]
issue-flow graphify [-C PROJECT_DIR] [...graphify subcommand + args]
issue-flow status [PROJECT_DIR] [--local] [--json]
issue-flow agent state|preflight|switchback|resolve|sweep|archive|capture [...]
issue-flow config add [-C PROJECT_DIR] [--force] [--json]
issue-flow workspace bootstrap|init|update [WORKSPACE_DIR] [...]
initscaffolds; running it again without--forceonly adds missing files.updaterefreshes generated files after upgrading the package (overwrites scaffolds, never your issue markdown).workspace bootstrap/init/updatecover a parent folder of sibling repos (see how-to).status/agent ...give agents (and you) deterministic answers about lifecycle state — focus issue, stage, branch hygiene — instead of having the agent re-derive it by hand.issue-flow --install-completionenables Tab completion for subcommands (bash / zsh / fish).
Full option tables and the agent subcommand reference live in the CLI reference.
Going further
- Configuration —
.envvariables and.issueflows/config.toml; modes (standardvs the markdown-onlysimple), skill levels (basic/standard/advancedquality-tooling guidance), the optional caveman and grill-me skills, the opt-in vendored pstack skills (pstack_skills), and label-driven flows (ayololabel routes an issue through the hands-off chain). - Editor support — what gets scaffolded per editor (Cursor, Claude Code, opencode, Codex), and how multi-root workspaces resolve the right repo.
- Folder of repos —
workspace bootstrap/init/updatefrom a parent folder. - Graphify integration — optional knowledge graph of your codebase that agents can read instead of grepping; enabled simply by installing
graphifyy. - Issue workflow — the human-readable walkthrough of the full lifecycle (also scaffolded into your project).
Development
git clone https://github.com/jepegit/issue-flow.git
cd issue-flow
uv sync
# Run tests
uv run pytest
# Lint
uv run ruff check src/ tests/
See docs/developing.md for more.
Changelog
See HISTORY.md for release notes.
GitHub Actions sync
Sync .issueflows/ folder placement (01-current-issues / 02-partly-solved-issues /
03-solved-issues) to GitHub issue labels (one-way: files → GitHub).
CLI (local or CI):
issue-flow sync # dry-run (shows planned label changes)
issue-flow sync --apply # push labels via gh
issue-flow sync --json # machine-readable report
Managed labels (default prefix status:): status:current, status:parked,
status:solved. Only labels with that prefix are added/removed; other labels
(e.g. yolo) are left alone.
Bootstrap labels once (if they do not exist yet):
gh label create 'status:current' --color 0E8A16
gh label create 'status:parked' --color FBCA04
gh label create 'status:solved' --color 6E7781
By default, issue-flow sync --apply auto-creates any missing managed labels
(bootstrap_labels = true in [issueflow.sync]). Set bootstrap_labels = false
to keep the manual-only behaviour.
Configuration — optional [issueflow.sync] in .issueflows/config.toml:
[issueflow.sync]
enabled = true
label_prefix = "status:"
labels = true
milestones = false
close_on_solved = false
bootstrap_labels = true
[issueflow.sync.milestone_map]
current = ""
parked = ""
solved = ""
Reusable workflow — add a caller in your repo (pin to a release tag):
on:
push:
paths: ['.issueflows/**']
jobs:
sync:
uses: jepegit/issue-flow/.github/workflows/issue-flow-sync.yml@v0.4.4
with:
dry_run: false
secrets: inherit
Requires permissions: issues: write on the job. The workflow installs
issue-flow from PyPI by default (install_mode: pypi); this repo dogfoods
with install_mode: workspace via .github/workflows/issueflow-sync.yml.
Future plans
- More editors — extend
--editorcoverage to further AI coding tools (e.g. Windsurf) on top of the current Cursor / Claude Code / opencode / Codex support. - Custom templates — let users supply their own Jinja2 templates to tailor slash commands and rules to their team's conventions.
- Git hook integration — optionally move issue files on commit based on status markers.
Acknowledgements
issue-flow builds on and takes inspiration from other people's open-source work. Thanks to the authors and communities behind these projects:
| Project | How issue-flow uses it | License |
|---|---|---|
| JuliusBrussee/caveman | Inspiration for the bundled caveman Agent Skill (terse, token-greedy response style). Our version is a trimmed adaptation — full intensity only, English only. |
MIT |
| mattpocock/skills | Matt Pocock's grill-me skill inspired the bundled grill-me Agent Skill (relentless planning interview). Our version is adapted to issue-flow's planning workflow, feeding conclusions into issue<N>_plan.md. |
MIT |
| cursor/plugins — pstack | Lauren Tan's (poteto) pstack skills library. A curated subset of its single-file skills (unslop, tdd, blast-radius, technical-writing, bro, four principle-* skills) is vendored verbatim as opt-in templates (pstack_skills in config.toml); the upstream MIT text ships alongside. |
MIT |
safishamsi/graphify (graphifyy on PyPI) |
Powers the optional knowledge-graph integration (issue-flow graphify, graphify-out/). Installed separately and invoked as an external tool. |
MIT |
| Typer | The issue-flow command-line interface. |
MIT |
| Rich | Formatted terminal output during init / update. |
MIT |
| Jinja2 | Renders the scaffolded skill, command, and rules templates. | BSD-3-Clause |
| tomlkit | Comment-preserving round-trips of .issueflows/config.toml. |
MIT |
| python-dotenv | Loads ISSUEFLOW_* settings from a project .env. |
BSD-3-Clause |
| Zensical | Builds the documentation site (from the Material for MkDocs team). | MIT |
Using or drawing on another project that should be listed here? Open a PR or issue to add a row.
License
This project is released under the MIT License. See the full text in the repository: LICENSE.
Release files for issue-flow 0.5.12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| issue_flow-0.5.12.tar.gz | 339.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| issue_flow-0.5.12-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 753.4 kB
Release files / issue_flow-0.5.12.tar.gz
| Download URL | issue_flow-0.5.12.tar.gz |
|---|---|
| Size | 339.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
09f740a7cbd3f5b7a15681b42e4cf66876ace9064490821776bf8e716e19b82d
|
|
BLAKE2b-256 checksum How to use checksums |
664cf2c6069f1085d0cd9dc020a221f0c74e045f7c349182d8788cf80ade59a8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / issue_flow-0.5.12-py3-none-any.whl
| Download URL | issue_flow-0.5.12-py3-none-any.whl |
|---|---|
| Size | 413.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
357559895b5ef32adc291cd715072ebca2165b974e647caf6ec51837743c7126
|
|
BLAKE2b-256 checksum How to use checksums |
a415bd9f64bda2cdbb5aeec712404ec8e2e569ba81141cb9fce9dc827824270b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log