Agents should behave. Let them follow the issue flow.
Project description
issue-flow
Agents should behave. Let them follow the issue flow.
issue-flow scaffolds a lightweight issue-tracking workflow into your project so that Cursor AI agents can pick up GitHub issues, plan work, and land PRs in a consistent way.
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
.cursor/
commands/
issue-init.md # /issue-init — fetch a GitHub issue locally
issue-start.md # /issue-start — plan and implement
issue-close.md # /issue-close — test, commit, push, PR
rules/
issueflow-rules.mdc # Always-on Cursor rule for the workflow
docs/
cursor-issue-workflow.md # Human-readable overview of the workflow
The three Cursor slash commands give agents a repeatable flow:
/issue-init 42— pulls GitHub issue #42 into.issueflows/01-current-issues/and archives older issues./issue-start— reads the issue file, plans, and implements./issue-close— runs tests, updates status files, commits, pushes, and opens a PR.
Installation
Requires Python 3.13+ and uv.
uv tool install issue-flow
Or add it as a dev dependency to your project:
uv add --dev issue-flow
Quick start
cd your-project
issue-flow init
That's it. Open the project in Cursor and use /issue-init, /issue-start, /issue-close.
Usage
issue-flow init [PROJECT_DIR] [--force]
issue-flow update [PROJECT_DIR]
issue-flow init
| Argument / Option | Description |
|---|---|
PROJECT_DIR |
Project root directory. Defaults to . (current directory). |
--force, -f |
Overwrite generated Cursor commands, rules, and workflow doc instead of skipping them. |
Running init again without --force is safe: generated scaffold files that already exist are skipped, and issue markdown under .issueflows/ is never touched by init or update. When the CLI detects an existing scaffold, it reminds you about update and --force.
issue-flow update
| Argument / Option | Description |
|---|---|
PROJECT_DIR |
Project root directory. Defaults to . (current directory). |
Use update after upgrading the issue-flow package to refresh the packaged slash commands, Cursor rule, and docs/cursor-issue-workflow.md from the version you have installed. This overwrites those generated files (unlike a plain second init). It still does not modify arbitrary files under .issueflows/ (for example your issue*_original.md / issue*_status.md files), and it creates any new .issueflows/ subdirectories required by the current package.
When to use which
| Goal | Command |
|---|---|
| First-time setup, or add missing files only | issue-flow init |
Pull newer templates after uv tool upgrade issue-flow (or similar) |
issue-flow update |
| Replace generated scaffolds without upgrading logic | issue-flow init --force |
Configuration
issue-flow reads a .env file from the project root (via python-dotenv). The following environment variables are supported:
| Variable | Default | Description |
|---|---|---|
ISSUEFLOW_DIR |
.issueflows |
Name of the issue-tracking directory. |
ISSUEFLOW_CURSOR_DIR |
.cursor |
Name of the Cursor config directory. |
ISSUEFLOW_DOCS_DIR |
docs |
Where to write the workflow documentation file. |
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/
Future plans
- Multi-tool support — generate config for other AI coding tools (Claude Code, Windsurf, etc.) in addition to Cursor.
issue-flow status— show a dashboard of current, partly-solved, and solved issues.- 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.
- GitHub Actions workflow — ship a reusable action that syncs issue state between
.issueflows/and GitHub issue labels/milestones.
License
See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file issue_flow-0.1.4.tar.gz.
File metadata
- Download URL: issue_flow-0.1.4.tar.gz
- Upload date:
- Size: 12.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2923638141955e294a3a2cdce97a2637a0a7c895785dfad3f6a9dfd6edc472d
|
|
| MD5 |
bd33a79a72383ee6b5101d39913934c6
|
|
| BLAKE2b-256 |
adef328bce09843020bef18d2b98f181ca4a581b20470a2b8877309f2c794c66
|
Provenance
The following attestation bundles were made for issue_flow-0.1.4.tar.gz:
Publisher:
publish.yml on jepegit/issue-flow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
issue_flow-0.1.4.tar.gz -
Subject digest:
e2923638141955e294a3a2cdce97a2637a0a7c895785dfad3f6a9dfd6edc472d - Sigstore transparency entry: 1311067925
- Sigstore integration time:
-
Permalink:
jepegit/issue-flow@7b8ddd9b8c179c7b688ccdf0ee0723d945509803 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/jepegit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7b8ddd9b8c179c7b688ccdf0ee0723d945509803 -
Trigger Event:
release
-
Statement type:
File details
Details for the file issue_flow-0.1.4-py3-none-any.whl.
File metadata
- Download URL: issue_flow-0.1.4-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
191f9b48fb52a65e9fe3c30884dbc336b44eef8935c78d90d84dc3975beddaeb
|
|
| MD5 |
c588ea021f3b406da8f8c526c20d197f
|
|
| BLAKE2b-256 |
ae402344c76b8696c15acb440ba01c8f1cd2962c0d90749f7ec9bf56b2869006
|
Provenance
The following attestation bundles were made for issue_flow-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on jepegit/issue-flow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
issue_flow-0.1.4-py3-none-any.whl -
Subject digest:
191f9b48fb52a65e9fe3c30884dbc336b44eef8935c78d90d84dc3975beddaeb - Sigstore transparency entry: 1311067990
- Sigstore integration time:
-
Permalink:
jepegit/issue-flow@7b8ddd9b8c179c7b688ccdf0ee0723d945509803 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/jepegit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7b8ddd9b8c179c7b688ccdf0ee0723d945509803 -
Trigger Event:
release
-
Statement type: