kanbai 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kanbai-0.1.0/.github/workflows/ci.yml +42 -0
- kanbai-0.1.0/.github/workflows/release.yml +52 -0
- kanbai-0.1.0/.gitignore +35 -0
- kanbai-0.1.0/CHANGELOG.md +46 -0
- kanbai-0.1.0/LICENSE +21 -0
- kanbai-0.1.0/Makefile +134 -0
- kanbai-0.1.0/PKG-INFO +225 -0
- kanbai-0.1.0/README.md +182 -0
- kanbai-0.1.0/assets/logo.png +0 -0
- kanbai-0.1.0/assets/webui.png +0 -0
- kanbai-0.1.0/docs/other-harnesses.md +53 -0
- kanbai-0.1.0/kanbai/__init__.py +6 -0
- kanbai-0.1.0/kanbai/board.py +275 -0
- kanbai-0.1.0/kanbai/cli.py +449 -0
- kanbai-0.1.0/kanbai/config.py +60 -0
- kanbai-0.1.0/kanbai/errors.py +42 -0
- kanbai-0.1.0/kanbai/models.py +133 -0
- kanbai-0.1.0/kanbai/scaffold.py +220 -0
- kanbai-0.1.0/kanbai/storage.py +181 -0
- kanbai-0.1.0/kanbai/web/__init__.py +5 -0
- kanbai-0.1.0/kanbai/web/app.py +224 -0
- kanbai-0.1.0/kanbai/web/server.py +66 -0
- kanbai-0.1.0/kanbai/web/static/Sortable.min.js +2 -0
- kanbai-0.1.0/kanbai/web/static/apple-touch-icon.png +0 -0
- kanbai-0.1.0/kanbai/web/static/htmx.min.js +1 -0
- kanbai-0.1.0/kanbai/web/static/icon.png +0 -0
- kanbai-0.1.0/kanbai/web/static/style.css +404 -0
- kanbai-0.1.0/kanbai/web/templates/_archive.html +31 -0
- kanbai-0.1.0/kanbai/web/templates/_board.html +19 -0
- kanbai-0.1.0/kanbai/web/templates/_card.html +16 -0
- kanbai-0.1.0/kanbai/web/templates/_detail.html +50 -0
- kanbai-0.1.0/kanbai/web/templates/_edit.html +40 -0
- kanbai-0.1.0/kanbai/web/templates/_new_sprint.html +28 -0
- kanbai-0.1.0/kanbai/web/templates/_plan.html +33 -0
- kanbai-0.1.0/kanbai/web/templates/board.html +115 -0
- kanbai-0.1.0/kanbai/web/watcher.py +23 -0
- kanbai-0.1.0/pyproject.toml +168 -0
- kanbai-0.1.0/tests/conftest.py +16 -0
- kanbai-0.1.0/tests/test_board.py +191 -0
- kanbai-0.1.0/tests/test_cli.py +132 -0
- kanbai-0.1.0/tests/test_config.py +58 -0
- kanbai-0.1.0/tests/test_scaffold.py +74 -0
- kanbai-0.1.0/tests/test_storage.py +91 -0
- kanbai-0.1.0/tests/test_web.py +537 -0
- kanbai-0.1.0/uv.lock +1702 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: ci-${{ github.ref }}
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
check:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Install uv
|
|
24
|
+
uses: astral-sh/setup-uv@v5
|
|
25
|
+
with:
|
|
26
|
+
python-version: ${{ matrix.python-version }}
|
|
27
|
+
enable-cache: true
|
|
28
|
+
|
|
29
|
+
- name: Install dependencies
|
|
30
|
+
run: uv sync --all-extras
|
|
31
|
+
|
|
32
|
+
- name: Lint (ruff)
|
|
33
|
+
run: uv run ruff check kanbai tests
|
|
34
|
+
|
|
35
|
+
- name: Type check (mypy)
|
|
36
|
+
run: uv run mypy
|
|
37
|
+
|
|
38
|
+
- name: Type check (ty)
|
|
39
|
+
run: uv run ty check
|
|
40
|
+
|
|
41
|
+
- name: Tests (pytest)
|
|
42
|
+
run: uv run pytest
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Publish to PyPI when a version tag is pushed, e.g. `git tag v0.1.0 && git push --tags`.
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
tags: ["v*.*.*"]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Install uv
|
|
18
|
+
uses: astral-sh/setup-uv@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.12"
|
|
21
|
+
|
|
22
|
+
- name: Verify the tag matches the package version
|
|
23
|
+
run: |
|
|
24
|
+
TAG="${GITHUB_REF_NAME#v}"
|
|
25
|
+
VERSION="$(grep -m1 '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')"
|
|
26
|
+
echo "tag=$TAG pyproject=$VERSION"
|
|
27
|
+
test "$TAG" = "$VERSION"
|
|
28
|
+
|
|
29
|
+
- name: Build sdist + wheel
|
|
30
|
+
run: uv build
|
|
31
|
+
|
|
32
|
+
- uses: actions/upload-artifact@v4
|
|
33
|
+
with:
|
|
34
|
+
name: dist
|
|
35
|
+
path: dist/
|
|
36
|
+
|
|
37
|
+
publish:
|
|
38
|
+
needs: build
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
environment:
|
|
41
|
+
name: pypi
|
|
42
|
+
url: https://pypi.org/p/kanbai
|
|
43
|
+
permissions:
|
|
44
|
+
id-token: write # required for PyPI Trusted Publishing (OIDC)
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/download-artifact@v4
|
|
47
|
+
with:
|
|
48
|
+
name: dist
|
|
49
|
+
path: dist/
|
|
50
|
+
|
|
51
|
+
- name: Publish to PyPI
|
|
52
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
kanbai-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Environment and IDE
|
|
2
|
+
.venv/
|
|
3
|
+
.env
|
|
4
|
+
.vscode/
|
|
5
|
+
.claude/
|
|
6
|
+
.cursor/
|
|
7
|
+
.codex/
|
|
8
|
+
.mcp.json
|
|
9
|
+
|
|
10
|
+
# Cache
|
|
11
|
+
.mypy_cache
|
|
12
|
+
.pytest_cache
|
|
13
|
+
.ruff_cache
|
|
14
|
+
|
|
15
|
+
# Build and Compiled
|
|
16
|
+
dist/
|
|
17
|
+
_build/
|
|
18
|
+
*.pyc
|
|
19
|
+
.DS_Store
|
|
20
|
+
|
|
21
|
+
# Test Coverage
|
|
22
|
+
.coverage
|
|
23
|
+
htmlcov/
|
|
24
|
+
coverage.xml
|
|
25
|
+
|
|
26
|
+
# KanbAI
|
|
27
|
+
.kanbai
|
|
28
|
+
|
|
29
|
+
# Local work
|
|
30
|
+
tmp/
|
|
31
|
+
scratchworks/
|
|
32
|
+
scratchwork.py
|
|
33
|
+
.python-version
|
|
34
|
+
*.local.*
|
|
35
|
+
ISSUES.md
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2026-09-23
|
|
11
|
+
|
|
12
|
+
Initial release: a file-based Kanban board for Claude Code and other AI coding harnesses.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **Board storage** — one Markdown card per file with YAML frontmatter, organized in
|
|
17
|
+
per-column folders under `.kanbai/`. Atomic writes; the folder is the source of truth
|
|
18
|
+
for a card's column.
|
|
19
|
+
- **Sprint workflow columns** — `backlog → todo → doing → review → done`. `kanbai next`
|
|
20
|
+
reads the sprint (`todo`) and respects card order and blocking dependencies.
|
|
21
|
+
- **CLI** (`kanbai`): `init`, `add`, `list`, `next`, `show`, `move`, `start`, `review`,
|
|
22
|
+
`done`, `edit`, `archive`, `rm`, `new-sprint`, and `ui`. Read commands support `--json`.
|
|
23
|
+
- **`kanbai init`** — scaffolds `.kanbai/` and the Claude Code integration (`.claude/rules`
|
|
24
|
+
+ skills `kanbai-next` / `kanbai-sprint` / `kanbai-status`). Idempotent and degrades
|
|
25
|
+
gracefully when integration files can't be written.
|
|
26
|
+
- **Review flow** — finished cards go to `review` via `kanbai review`; the user approves
|
|
27
|
+
them to `done` with `kanbai done`.
|
|
28
|
+
- **Web UI** (`kanbai ui`, FastAPI + HTMX, assets vendored for offline use):
|
|
29
|
+
- Board view; create cards; move cards by drag-and-drop (with persisted reordering) or
|
|
30
|
+
from the card detail modal.
|
|
31
|
+
- Card detail, edit, archive, and delete modals.
|
|
32
|
+
- "Plan sprint" and "New sprint" modals; text search and label filtering.
|
|
33
|
+
- Live updates via Server-Sent Events; WIP-limit and blocked-by-dependency indicators.
|
|
34
|
+
- Logo and favicon; `--reload` development mode; `--poll` for sandboxes/containers.
|
|
35
|
+
- **WIP limits** — optional `[wip]` config per column; the CLI and UI warn (never block)
|
|
36
|
+
when a column is over its limit.
|
|
37
|
+
- **`new-sprint`** — archives `done` cards (recording each card's origin column in
|
|
38
|
+
`archived_from`) and optionally moves the active columns back to the backlog.
|
|
39
|
+
|
|
40
|
+
### Packaging
|
|
41
|
+
|
|
42
|
+
- Packaged with hatchling; `kanbai` console entry point. Optional `ui` extra
|
|
43
|
+
(fastapi, uvicorn, jinja2, watchfiles, python-multipart). MIT licensed.
|
|
44
|
+
|
|
45
|
+
[Unreleased]: https://github.com/rennan-cockles/kanbai/compare/v0.1.0...HEAD
|
|
46
|
+
[0.1.0]: https://github.com/rennan-cockles/kanbai/releases/tag/v0.1.0
|
kanbai-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Rennan Cockles
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
kanbai-0.1.0/Makefile
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
.PHONY: help start install pre-commit lint-fix lint ruff mypy ty ruff-check format-check ruff-fix fmt pre-commit-sim type-check test test-unit test-ci pre-commit-run dev release-dry release release-info tag-release inspect-release publish-docs docs env-check mcp-run mcp-inspector
|
|
2
|
+
.DEFAULT_GOAL := help
|
|
3
|
+
# .ONESHELL:
|
|
4
|
+
|
|
5
|
+
# Load .env (if present) and export its vars to all recipe subprocesses.
|
|
6
|
+
# Optional so targets still work without a .env file.
|
|
7
|
+
-include .env
|
|
8
|
+
export
|
|
9
|
+
|
|
10
|
+
# Variables
|
|
11
|
+
PROJECT_NAME=KanbAI
|
|
12
|
+
ENV_PREFIX=$(shell python -c "if __import__('pathlib').Path('.venv/bin/pip').exists(): print('.venv/bin/')")
|
|
13
|
+
# Parallel pytest workers (pytest-xdist); use -n0 to disable (e.g. test-watch)
|
|
14
|
+
PYTEST_PARALLEL ?= -n auto
|
|
15
|
+
|
|
16
|
+
# Colors for output
|
|
17
|
+
BOLD := \033[1m
|
|
18
|
+
RED := \033[31m
|
|
19
|
+
GREEN := \033[32m
|
|
20
|
+
YELLOW := \033[33m
|
|
21
|
+
BLUE := \033[34m
|
|
22
|
+
RESET := \033[0m
|
|
23
|
+
|
|
24
|
+
help: ## Show this help message
|
|
25
|
+
@echo "$(BOLD)$(PROJECT_NAME) Development Commands$(RESET)"
|
|
26
|
+
@echo ""
|
|
27
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "$(BLUE)%-20s$(RESET) %s\n", $$1, $$2}'
|
|
28
|
+
@echo ""
|
|
29
|
+
@echo "$(YELLOW)Main Commands:$(RESET)"
|
|
30
|
+
@echo " $(GREEN)make start$(RESET) - Start API, wait for health, setup pre-commit, run CLI"
|
|
31
|
+
@echo " $(GREEN)make lint$(RESET) - Run all linting and formatting checks"
|
|
32
|
+
@echo " $(GREEN)make test$(RESET) - Run all tests with coverage"
|
|
33
|
+
@echo ""
|
|
34
|
+
@echo "$(YELLOW)Development Workflow:$(RESET)"
|
|
35
|
+
@echo " 1. $(GREEN)make lint-fix$(RESET) - Fix code issues before staging"
|
|
36
|
+
@echo " 2. $(GREEN)git add .$(RESET) - Stage your changes"
|
|
37
|
+
@echo " 3. $(GREEN)git commit$(RESET) - Commit (pre-commit hooks will run)"
|
|
38
|
+
|
|
39
|
+
start: install pre-commit ## Start local environment
|
|
40
|
+
|
|
41
|
+
install: ## Install project dev dependencies
|
|
42
|
+
@echo "$(YELLOW)Installing dev dependencies with Poetry...$(RESET)"
|
|
43
|
+
@poetry install --with dev --all-extras
|
|
44
|
+
@echo "$(GREEN)✓ Dev dependencies installed$(RESET)"
|
|
45
|
+
|
|
46
|
+
pre-commit: ## Install and configure pre-commit hooks
|
|
47
|
+
@echo "$(YELLOW)Setting up pre-commit hooks...$(RESET)"
|
|
48
|
+
@poetry run pre-commit install
|
|
49
|
+
@echo "$(GREEN)✓ Pre-commit hooks configured$(RESET)"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# Development and Quality Commands
|
|
53
|
+
# Note: The order of lint operations matches pre-commit hooks for consistency:
|
|
54
|
+
lint-fix: fmt ruff-fix ruff-check format-check type-check ## Run all linting and formatting checks
|
|
55
|
+
lint: ruff-check format-check type-check ## Run all linting and formatting checks
|
|
56
|
+
ruff: ruff-check format-check ## Run Ruff linting and formatting checks
|
|
57
|
+
type-check: mypy ty ## Run MyPy and Ty type checks
|
|
58
|
+
|
|
59
|
+
ruff-check: ## Run Ruff linting
|
|
60
|
+
@echo "$(YELLOW)Running Ruff linting...$(RESET)"
|
|
61
|
+
@poetry run ruff check .
|
|
62
|
+
|
|
63
|
+
format-check: ## Check code formatting without making changes
|
|
64
|
+
@echo "$(YELLOW)Checking code formatting...$(RESET)"
|
|
65
|
+
@poetry run ruff format . --check
|
|
66
|
+
|
|
67
|
+
ruff-fix: ## Run Ruff linting with auto-fix (matches pre-commit behavior)
|
|
68
|
+
@echo "$(YELLOW)Running Ruff linting with auto-fix...$(RESET)"
|
|
69
|
+
@poetry run ruff check . --fix || true
|
|
70
|
+
|
|
71
|
+
fmt: ## Run code formatting
|
|
72
|
+
@echo "$(YELLOW)Running code formatting...$(RESET)"
|
|
73
|
+
@poetry run ruff format .
|
|
74
|
+
|
|
75
|
+
pre-commit-sim: ## Simulate pre-commit hooks exactly (for troubleshooting)
|
|
76
|
+
@echo "$(YELLOW)Simulating pre-commit hooks...$(RESET)"
|
|
77
|
+
@poetry run ruff check . --fix --exit-non-zero-on-fix || echo "Ruff applied fixes"
|
|
78
|
+
@poetry run ruff format .
|
|
79
|
+
|
|
80
|
+
mypy: ## Run MyPy type checking
|
|
81
|
+
@echo "$(YELLOW)Running MyPy type checking...$(RESET)"
|
|
82
|
+
@poetry run mypy
|
|
83
|
+
|
|
84
|
+
ty: ## Run Ty type checking
|
|
85
|
+
@echo "$(YELLOW)Running Ty check...$(RESET)"
|
|
86
|
+
@poetry run ty check
|
|
87
|
+
|
|
88
|
+
test: ## Run all tests with coverage (parallel via pytest-xdist)
|
|
89
|
+
@echo "$(YELLOW)Running all tests with coverage...$(RESET)"
|
|
90
|
+
@poetry run pytest $(PYTEST_PARALLEL) --cov --cov-report=term-missing:skip-covered --cov-report=html
|
|
91
|
+
|
|
92
|
+
test-unit: ## Run all unit tests with coverage (parallel via pytest-xdist)
|
|
93
|
+
@echo "$(YELLOW)Running unit tests with coverage...$(RESET)"
|
|
94
|
+
@poetry run pytest $(PYTEST_PARALLEL) --cov --cov-report=term-missing:skip-covered --cov-report=html -m "unit"
|
|
95
|
+
|
|
96
|
+
# Jenkins CI/CD specific test targets with XML output
|
|
97
|
+
test-ci: ## Run all tests with CI-friendly output (JUnit XML + Coverage XML)
|
|
98
|
+
@echo "$(YELLOW)Running tests with CI-friendly output...$(RESET)"
|
|
99
|
+
@poetry run pytest $(PYTEST_PARALLEL) --cov --cov-report=term-missing --cov-report=html --cov-report=xml:coverage.xml --cov-fail-under=75 --junitxml=test-results.xml -m "not integration"
|
|
100
|
+
|
|
101
|
+
# Security and Quality Assurance
|
|
102
|
+
security-scan: ## Run security scans
|
|
103
|
+
@echo "$(YELLOW)Running security scans...$(RESET)"
|
|
104
|
+
@poetry run gitleaks dir -v .
|
|
105
|
+
|
|
106
|
+
pre-commit-run: ## Run pre-commit on all files
|
|
107
|
+
@echo "$(YELLOW)Running pre-commit on all files...$(RESET)"
|
|
108
|
+
@poetry run pre-commit run --all-files
|
|
109
|
+
|
|
110
|
+
# Development shortcuts
|
|
111
|
+
dev: start ## Alias for start command
|
|
112
|
+
|
|
113
|
+
# Release and versioning
|
|
114
|
+
release-dry: ## Dry run semantic release
|
|
115
|
+
@echo "$(YELLOW)Running semantic release dry run...$(RESET)"
|
|
116
|
+
@poetry run semantic-release version --print
|
|
117
|
+
|
|
118
|
+
release: ## Create a new release
|
|
119
|
+
@echo "$(YELLOW)Creating new release...$(RESET)"
|
|
120
|
+
@poetry run semantic-release version
|
|
121
|
+
|
|
122
|
+
# Environment management
|
|
123
|
+
env-check: ## Check environment setup
|
|
124
|
+
@echo "$(YELLOW)Checking environment setup...$(RESET)"
|
|
125
|
+
@echo "$(BLUE)Python version:$(RESET) $$(python --version 2>/dev/null || echo 'Not found')"
|
|
126
|
+
@echo "$(BLUE)Poetry version:$(RESET) $$(poetry --version 2>/dev/null || echo 'Not found')"
|
|
127
|
+
@echo "$(BLUE)Docker version:$(RESET) $$(docker --version 2>/dev/null || echo 'Not found')"
|
|
128
|
+
@echo "$(BLUE)Docker Compose version:$(RESET) $$(docker compose version 2>/dev/null || echo 'Not found')"
|
|
129
|
+
@echo "$(BLUE)Pre-commit installed:$(RESET) $$(poetry run pre-commit --version 2>/dev/null || echo 'Not found')"
|
|
130
|
+
@if [ -f .env ]; then \
|
|
131
|
+
echo "$(GREEN)✓ .env file exists$(RESET)"; \
|
|
132
|
+
else \
|
|
133
|
+
echo "$(YELLOW)⚠ .env file not found - copy from .env.example$(RESET)"; \
|
|
134
|
+
fi
|
kanbai-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: kanbai
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A file-based Kanban board for Claude Code and other AI coding harnesses
|
|
5
|
+
Author-email: Rennan Cockles <rennan.cockles@experian.com>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Rennan Cockles
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Keywords: agent,ai,claude,claude-code,kanban,task-management
|
|
29
|
+
Requires-Python: >=3.10
|
|
30
|
+
Requires-Dist: httpx2>=2.13
|
|
31
|
+
Requires-Dist: pydantic>=2.6
|
|
32
|
+
Requires-Dist: pyyaml>=6.0
|
|
33
|
+
Requires-Dist: rich>=13.0
|
|
34
|
+
Requires-Dist: tomli>=2.0; python_version < '3.11'
|
|
35
|
+
Requires-Dist: typer>=0.12
|
|
36
|
+
Provides-Extra: ui
|
|
37
|
+
Requires-Dist: fastapi>=0.110; extra == 'ui'
|
|
38
|
+
Requires-Dist: jinja2>=3.1; extra == 'ui'
|
|
39
|
+
Requires-Dist: python-multipart>=0.0.9; extra == 'ui'
|
|
40
|
+
Requires-Dist: uvicorn[standard]>=0.29; extra == 'ui'
|
|
41
|
+
Requires-Dist: watchfiles>=0.21; extra == 'ui'
|
|
42
|
+
Description-Content-Type: text/markdown
|
|
43
|
+
|
|
44
|
+
<p align="center">
|
|
45
|
+
<img src="assets/logo.png" alt="KanbAI" width="650">
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
# KanbAI
|
|
49
|
+
|
|
50
|
+
A file-based Kanban board that lives in your repo, built for **Claude Code** and other AI
|
|
51
|
+
coding harnesses (and humans too). The board is plain Markdown files under `.kanbai/`,
|
|
52
|
+
driven by a simple `kanbai` CLI and a local web UI. Installed and invoked as `kanbai`.
|
|
53
|
+
|
|
54
|
+
<p align="center">
|
|
55
|
+
<img src="assets/webui.png" alt="KanbAI web UI" width="840">
|
|
56
|
+
</p>
|
|
57
|
+
|
|
58
|
+
## Why
|
|
59
|
+
|
|
60
|
+
- **The board lives in your repo.** One Markdown card per task, one folder per column —
|
|
61
|
+
git-friendly, diffable, no external service, no database.
|
|
62
|
+
- **Claude drives it.** `kanbai init` installs a rule + skills so Claude picks the next
|
|
63
|
+
task, implements it, and moves it across the board while you review.
|
|
64
|
+
- **You stay in control.** Finished work waits in `review` for your approval, and a
|
|
65
|
+
friendly local web UI lets you watch and manage everything live.
|
|
66
|
+
|
|
67
|
+
## How it works
|
|
68
|
+
|
|
69
|
+
`kanbai init` creates a `.kanbai/` folder — one directory per column, one Markdown card
|
|
70
|
+
per task:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
.kanbai/
|
|
74
|
+
├── config.toml
|
|
75
|
+
├── backlog/
|
|
76
|
+
│ └── 004-add-oauth-login.md
|
|
77
|
+
├── todo/
|
|
78
|
+
├── doing/
|
|
79
|
+
├── review/
|
|
80
|
+
├── done/
|
|
81
|
+
└── archive/
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Each card is Markdown with YAML frontmatter (managed by the CLI — don't edit by hand):
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
---
|
|
88
|
+
id: "004"
|
|
89
|
+
title: Add OAuth login
|
|
90
|
+
status: backlog
|
|
91
|
+
priority: high
|
|
92
|
+
order: 1
|
|
93
|
+
labels: [auth, backend]
|
|
94
|
+
deps: []
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Description
|
|
98
|
+
Support "Sign in with Google".
|
|
99
|
+
|
|
100
|
+
## Acceptance criteria
|
|
101
|
+
- [ ] OAuth flow works end to end
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### The sprint workflow
|
|
105
|
+
|
|
106
|
+
Cards flow through five columns:
|
|
107
|
+
|
|
108
|
+
| Column | Meaning |
|
|
109
|
+
|--------|---------|
|
|
110
|
+
| `backlog` | Everything to do eventually. New cards land here. |
|
|
111
|
+
| `todo` | The current sprint — what's planned for now. |
|
|
112
|
+
| `doing` | In progress. |
|
|
113
|
+
| `review` | Finished, awaiting your approval. |
|
|
114
|
+
| `done` | Approved and complete. |
|
|
115
|
+
|
|
116
|
+
`kanbai next` only reads the **sprint** (`todo`), respecting card order and blocking
|
|
117
|
+
dependencies — so the backlog stays out of the way until you plan work into the sprint.
|
|
118
|
+
When work is finished it goes to `review`; **you** approve it into `done`.
|
|
119
|
+
|
|
120
|
+
## Install
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
uv add --dev kanbai # add to your project as a dev dependency
|
|
124
|
+
# or
|
|
125
|
+
pip install kanbai
|
|
126
|
+
|
|
127
|
+
# for the web UI, install the extra:
|
|
128
|
+
uv add --dev 'kanbai[ui]' # or: pip install 'kanbai[ui]'
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Quick start
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
kanbai init # scaffold .kanbai/ + Claude integration
|
|
135
|
+
kanbai add "Build the login screen" -p high # lands in the backlog
|
|
136
|
+
kanbai move 001 todo # plan it into the sprint
|
|
137
|
+
kanbai list # show the board
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Then open a Claude Code session and ask it to *"work through the KanbAI board"*.
|
|
141
|
+
|
|
142
|
+
## Working with Claude Code
|
|
143
|
+
|
|
144
|
+
`kanbai init` installs the integration into `.claude/`:
|
|
145
|
+
|
|
146
|
+
- **`.claude/rules/kanbai.md`** — teaches Claude the board convention, loaded every session.
|
|
147
|
+
- **Skills** — `kanbai-next` (work one card and stop), `kanbai-sprint` (work the whole
|
|
148
|
+
sprint), and `kanbai-status` (summarize the board).
|
|
149
|
+
|
|
150
|
+
Claude then works one card at a time:
|
|
151
|
+
|
|
152
|
+
1. `kanbai next --json` — pick the next actionable sprint task.
|
|
153
|
+
2. `kanbai start <id>` — move it to `doing`.
|
|
154
|
+
3. Implement it (reading `kanbai show <id> --json` for the details).
|
|
155
|
+
4. `kanbai review <id>` — send it to `review` and **stop**.
|
|
156
|
+
5. You review the work and approve it with `kanbai done <id>`.
|
|
157
|
+
|
|
158
|
+
Allow the CLI without prompts by adding `Bash(kanbai *)` to your `.claude/settings.json`.
|
|
159
|
+
|
|
160
|
+
Using another assistant (Cursor, Windsurf, Aider, Copilot, …)? The board is harness-agnostic
|
|
161
|
+
— see [docs/other-harnesses.md](docs/other-harnesses.md).
|
|
162
|
+
|
|
163
|
+
## Web UI
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
kanbai ui # serves the board and opens your browser
|
|
167
|
+
kanbai ui --reload # auto-restart on code changes (development)
|
|
168
|
+
kanbai ui --poll # for sandboxes/containers without OS file events
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
The UI (FastAPI + HTMX, assets vendored so it works offline) lets you:
|
|
172
|
+
|
|
173
|
+
- View the board and **create, edit, move, archive, or delete** cards.
|
|
174
|
+
- **Drag-and-drop** between columns (with persisted reordering) or move from a card's modal.
|
|
175
|
+
- **Plan a sprint** (move several backlog cards to `todo` at once) and **start a new sprint**
|
|
176
|
+
(archive done cards, optionally reset the active columns).
|
|
177
|
+
- **Search** cards and **filter by label**.
|
|
178
|
+
- Browse and **restore** archived cards.
|
|
179
|
+
- See **WIP-limit** and **blocked-by-dependency** indicators, and **live updates** as Claude
|
|
180
|
+
moves cards from the CLI (via Server-Sent Events).
|
|
181
|
+
|
|
182
|
+
## Configuration
|
|
183
|
+
|
|
184
|
+
`.kanbai/config.toml` is created by `init` and can be edited:
|
|
185
|
+
|
|
186
|
+
```toml
|
|
187
|
+
[board]
|
|
188
|
+
name = "my-project"
|
|
189
|
+
columns = ["backlog", "todo", "doing", "review", "done"]
|
|
190
|
+
|
|
191
|
+
[defaults]
|
|
192
|
+
priority = "medium"
|
|
193
|
+
|
|
194
|
+
# Optional work-in-progress limits per column (the CLI and UI warn when exceeded).
|
|
195
|
+
[wip]
|
|
196
|
+
doing = 3
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Commands
|
|
200
|
+
|
|
201
|
+
| Command | Description |
|
|
202
|
+
|---------|-------------|
|
|
203
|
+
| `kanbai init` | Scaffold `.kanbai/` and install the Claude Code integration. |
|
|
204
|
+
| `kanbai add "title"` | Create a card in `backlog` (use `-c todo` for the sprint). |
|
|
205
|
+
| `kanbai list [column]` | Show the board, a single column, or the `archive`. |
|
|
206
|
+
| `kanbai next` | Print the next actionable card in the sprint (`todo`). |
|
|
207
|
+
| `kanbai show <id>` | Show full details of a card. |
|
|
208
|
+
| `kanbai move <id> <column>` | Move a card to a column. |
|
|
209
|
+
| `kanbai start <id>` | Move a card to `doing`. |
|
|
210
|
+
| `kanbai review <id>` / `kanbai done <id>` | Send a card to `review` / approve it to `done`. |
|
|
211
|
+
| `kanbai edit <id>` | Update fields of a card. |
|
|
212
|
+
| `kanbai archive <id>` / `kanbai restore <id>` | Archive a card / restore it from the archive. |
|
|
213
|
+
| `kanbai rm <id>` | Delete a card permanently. |
|
|
214
|
+
| `kanbai new-sprint` | Archive done cards (optionally reset active columns to the backlog). |
|
|
215
|
+
| `kanbai ui` | Serve the board in a local web UI (needs the `ui` extra). |
|
|
216
|
+
|
|
217
|
+
Add `--json` to read-only commands for machine-readable output.
|
|
218
|
+
|
|
219
|
+
## Changelog
|
|
220
|
+
|
|
221
|
+
See [CHANGELOG.md](CHANGELOG.md).
|
|
222
|
+
|
|
223
|
+
## License
|
|
224
|
+
|
|
225
|
+
MIT
|