Kanbanlan
Kanbanlan gives a repository one documented coordination workflow for humans and coding agents. Today its canonical kanban home is GitHub Issues with a GitHub Projects v2 projection; its core identity and provider contract are portable to other canonical homes.
It provides:
- one-command repository and Project setup;
- browser-based GitHub CLI authentication when credentials or the
projectscope are missing; - repository labels, issue/PR templates, and managed
AGENTS.md/CLAUDE.mdinstructions; - a private local snapshot shared across Git worktrees;
- dry-run-first reconciliation between issue labels, Project Status, active claims, and linked pull requests; and
- immutable, provider-independent Kanbanlan IDs;
- safe capture, claim, release, handoff, and review commands; and
- durable per-request records stored in the repository.
GitHub Issues remain canonical in the current provider. Kanbanlan does not store API tokens, require an MCP server, or create another server-side database.
Install
Kanbanlan requires Python 3.11+, Git, and GitHub CLI. The examples below use uv for installation and development.
Install the latest release from PyPI:
uv tool install kanbanlan
Once installed, upgrade to the latest release with:
kanbanlan upgrade
On normal CLI use, Kanbanlan also checks PyPI at most once every three days and
prints a short notice when a newer release is available. Set
KANBANLAN_NO_UPDATE_CHECK=1 to disable these checks.
Or install the unreleased development version from GitHub:
uv tool install git+https://github.com/jmitchel3/kanbanlan.git
To install a local checkout instead:
uv tool install .
For development:
uv sync --group dev
uv run pytest
uv run ruff check .
uv build
Initialize a repository
Start the guided setup wizard from any GitHub-backed repository:
cd /path/to/repository
kanbanlan init
The three-step wizard detects the repository and default branch, defaults to a
fresh copy of the Kanbanlan Project
template, collects the
staging and optional production branch, then shows a summary for confirmation
before it changes repository files or Project settings. The copied Project is
titled <repository name> Delivery by default and includes the template's
preconfigured views. GitHub and cache work shows progress as it runs, including
a clear failed step if setup stops.
You can also provide any choice up front. Reuse an existing Project:
cd /path/to/repository
kanbanlan init --project-url https://github.com/orgs/acme/projects/2
Create a new empty Project instead of using the default template:
kanbanlan init --create-project --project-title "Product Delivery" --open
Copy a different Project template, including its useful views:
kanbanlan init --template-project template-owner/1 --project-title "Product Delivery"
init authenticates through
gh auth login --web when necessary, ensures the GitHub token has the
project scope, links the Project to the repository, repairs the Status field,
creates the workflow labels, writes managed repository files, adds open issues,
and reconciles their state.
Use --non-interactive in automation; without a Project source it copies the
default template. Provide --project-number, --project-url,
--create-project, or --template-project to override that default. Use
--local-only with an existing Project reference to generate repository files
without GitHub mutations. Pass --no-open to suppress the wizard's browser
question or --open to open the configured Project after setup.
Terminal colors distinguish headings, workflow states, priorities, warnings,
and errors when output is interactive. Use --color always or --color never
to choose explicitly. Kanbanlan also respects the standard NO_COLOR
environment variable. Progress is written to stderr so commands such as
snapshot, path, and capture keep clean, pipe-friendly stdout.
Kanbanlan does not create custom Project views or GitHub's built-in auto-add
workflow through the API. Plain kanbanlan init copies the default template so
its views are present from the start. With --create-project, --open opens
the empty Project so a Board view can be added manually. Kanbanlan's own
reconcile --apply keeps item states correct even when GitHub Project workflows
are not configured.
Optional background reconciliation
Successful live initialization and reconciliation register the repository with one user-scoped worker. It deduplicates worktrees through Git's common directory, refreshes enabled repositories on a bounded schedule, applies only safe repairs, and records last-good snapshot and retry health without storing credentials.
kanbanlan worker status
kanbanlan worker enable --github-login YOUR_GITHUB_ACCOUNT
kanbanlan worker start
kanbanlan worker stop
kanbanlan worker disable
The worker resolves the selected account's credential at runtime with
gh auth token --user; it never runs gh auth switch and never writes a token
to the registry. See docs/workflow/worker.md for
macOS LaunchAgent and Linux systemd user-service examples. The worker is
opt-in, has no Docker requirement, and explicit disablement persists.
Daily use
kanbanlan ensure # refresh only when the worktree-shared cache is stale
kanbanlan next # report the first unblocked Ready issue
kanbanlan status # summarize the local cache
kanbanlan reconcile # report drift, without mutations
kanbanlan reconcile --apply # apply and verify the displayed repairs
kanbanlan --json next # stable output for agents and automation
The cache lives at <primary-checkout>/.cache/kanbanlan/ with private file
permissions. A failed refresh preserves the last good snapshot and records the
error in health.json.
Request lifecycle
kanbanlan capture "Add export audit log" --priority priority:p1
kanbanlan claim KBL-... --touchpoints "audit API; exports UI; migrations"
kanbanlan record KBL-...
kanbanlan review KBL-...
kanbanlan release KBL-... --reason "Waiting for product decision" --blocked
kanbanlan handoff KBL-... --session codex-next --branch work/kbl-audit \\
--worktree /path/to/worktree --reason "Shift change"
capture assigns a globally unique KBL-... Kanbanlan ID. Lifecycle commands
accept that ID, a GitHub issue number, or the normalized GitHub provider
reference. reconcile --apply assigns IDs to requests created through GitHub's
web interface or by older Kanbanlan releases.
By default claim posts the claim first, verifies that it is the earliest
active claim, and only then creates a dedicated worktree from the configured
default branch. If checkout creation fails, it releases the claim and returns
the card to Ready. Use --no-worktree only from an existing non-default
branch/worktree.
record creates docs/kanbanlan/requests/<Kanbanlan ID>.md once. Complete its
decisions, verification, and delivered-result sections in the implementation
PR. Kanbanlan never overwrites manual changes to an existing record. Volatile
status and claim movements remain in the live canonical home rather than Git.
Portable architecture
The versioned configuration distinguishes the GitHub code host, the canonical kanban home, and board projections. Normalized snapshots expose a Kanbanlan ID, provider ID, display ID, provider reference, canonical URL, lifecycle state, claims, and linked pull requests. Workflow reconciliation depends on a provider contract; GitHub is its first implementation.
This keeps the CLI as the portable agent interface. MCP integrations may wrap
it, but agents can operate using ordinary shell access and --json. Linear or
Asana adapters, mirroring, webhooks, and multi-master conflict resolution are
deliberately outside the current implementation.
Managed repository files
init writes:
.kanbanlan.toml;.github/ISSUE_TEMPLATE/work-request.yml;.github/pull_request_template.md;docs/workflow/kanbanlan.md;- a marked Kanbanlan section in
AGENTS.mdandCLAUDE.md; and /.cache/kanbanlan/and/.worktrees/in.gitignore.
Generated standalone files carry a marker. Existing custom templates are not
overwritten unless --force is passed. Agent instruction sections are
updated only between kanbanlan:start and kanbanlan:end markers.
State model
| Issue label | Project Status |
|---|---|
status:intake |
Inbox |
status:ready |
Ready |
status:in-progress |
In progress |
status:blocked |
Blocked |
status:review |
In review |
| closed issue | Done |
Priorities are priority:p0 through priority:p3. An active CLAIM forces In
progress; an open pull request that closes the issue forces In review; a closed
issue forces Done. Issue labels are the fallback status record when the
Project is temporarily unavailable.
Diagnostics
kanbanlan auth
kanbanlan doctor
kanbanlan path
kanbanlan snapshot
kanbanlan refresh
doctor checks configuration, authentication, Project Status options, labels,
and cache health without mutating GitHub.
Contributing and security
Bug reports and focused pull requests are welcome. See CONTRIBUTING.md for the development workflow. Please report security vulnerabilities privately as described in SECURITY.md.
Kanbanlan is available under the MIT License.
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 kanbanlan-0.4.0.tar.gz.
File metadata
- Download URL: kanbanlan-0.4.0.tar.gz
- Upload date:
- Size: 74.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1b40e734db0fee400d7d8de274736b4c402fa89e1386ecfd9158c5e33e5c312
|
|
| MD5 |
a673bdacf0fbc3e2e2e7a778dbc9b279
|
|
| BLAKE2b-256 |
e9412bf7d2f2f0486044b397b3eb8f37ea10b140d4cda389d44ff800722265fd
|
Provenance
The following attestation bundles were made for kanbanlan-0.4.0.tar.gz:
Publisher:
release.yaml on jmitchel3/kanbanlan
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kanbanlan-0.4.0.tar.gz -
Subject digest:
d1b40e734db0fee400d7d8de274736b4c402fa89e1386ecfd9158c5e33e5c312 - Sigstore transparency entry: 2262207529
- Sigstore integration time:
-
Permalink:
jmitchel3/kanbanlan@cd05357f7e24fbfd727c70d72e6615003c1d2d19 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/jmitchel3
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@cd05357f7e24fbfd727c70d72e6615003c1d2d19 -
Trigger Event:
release
-
Statement type:
File details
Details for the file kanbanlan-0.4.0-py3-none-any.whl.
File metadata
- Download URL: kanbanlan-0.4.0-py3-none-any.whl
- Upload date:
- Size: 52.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a3a307e28ef635e7595e4ad8e157e174f398508bdef9c3805e9c905e6a0b5b7
|
|
| MD5 |
8bdf7c8743f25af2b740620ac55a020f
|
|
| BLAKE2b-256 |
06166f3d0d10bf5e7c2ad9b9b90db48edea09665e4d99229643f9533068a0ccc
|
Provenance
The following attestation bundles were made for kanbanlan-0.4.0-py3-none-any.whl:
Publisher:
release.yaml on jmitchel3/kanbanlan
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kanbanlan-0.4.0-py3-none-any.whl -
Subject digest:
0a3a307e28ef635e7595e4ad8e157e174f398508bdef9c3805e9c905e6a0b5b7 - Sigstore transparency entry: 2262207899
- Sigstore integration time:
-
Permalink:
jmitchel3/kanbanlan@cd05357f7e24fbfd727c70d72e6615003c1d2d19 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/jmitchel3
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@cd05357f7e24fbfd727c70d72e6615003c1d2d19 -
Trigger Event:
release
-
Statement type: