kanvas-board 0.4.0rc1__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.
- kanvas_board-0.4.0rc1/.gitignore +6 -0
- kanvas_board-0.4.0rc1/CHANGELOG.md +63 -0
- kanvas_board-0.4.0rc1/LICENSE +21 -0
- kanvas_board-0.4.0rc1/PKG-INFO +264 -0
- kanvas_board-0.4.0rc1/README.md +242 -0
- kanvas_board-0.4.0rc1/kanvas.html +3703 -0
- kanvas_board-0.4.0rc1/kanvas.py +1807 -0
- kanvas_board-0.4.0rc1/pyproject.toml +64 -0
- kanvas_board-0.4.0rc1/skill/SKILL.md +116 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
## v0.4.0 — 2026-10-19
|
|
3
|
+
Kanvas runs without Obsidian. The board is a JSON file, agents use a new CLI, and you plan and review in an interactive HTML page.
|
|
4
|
+
|
|
5
|
+
- Add `kanvas.html`: a single-file board with a dependency graph (swimlanes per group, left-to-right or top-to-bottom, adjustable spacing, lineage highlighting, drag to connect) and a kanban view, right-click menus for cards, dependencies and empty space, undo and redo that keep agents' changes, a task panel with Markdown, notes and review actions, filters, search, dark mode and keyboard shortcuts
|
|
6
|
+
- Status at a glance: cards are outlined in their state colour over a faint fill, proposed cards are dashed, blocked cards hatched, a light circles running tasks and their arrows flow, and the header shows overall progress
|
|
7
|
+
- Agent activity shows as it happens: a toast says what was proposed, started or finished, and by whom when the change came with a note, and the changed cards flash
|
|
8
|
+
- YOLO chains glow gold: their target cards get a ring of fire, their arrows are thick glowing gold lines, turning YOLO on sweeps along the chain, and a header chip counts the tasks agents may take on and jumps to each target
|
|
9
|
+
- New logo, a K whose arms are arrows, in the header, the favicon and `img/icon.svg`
|
|
10
|
+
- A calmer toolbar: the state counts form one filter control, settings you choose once (graph direction, card order, spacing, finished tasks, theme) live in a labelled Display menu, renaming the board and managing groups move to a menu on the board name, the zoom controls form a small horizontal bar, and toolbar tooltips show each control's shortcut
|
|
11
|
+
- Works from the keyboard and with screen readers: menus move with the arrow keys, close with Escape or Tab and give focus back to their button, the Display panel keeps focus while you change settings, Tab goes round the task panel's controls and focus stays there when the panel updates, tooltips also appear on keyboard focus, and the sync status, progress, YOLO chip and icon-only buttons have names
|
|
12
|
+
- The task panel opens on the left and leads with what to do next: a card in the task's state colour holds the latest agent summary and the actions for that state (approve, start, review, reopen), what it waits on, and a copyable `work on ID` for ready tasks; state and group change from the header, the description shows its checklist progress, and notes can be edited or deleted (hover a note, or double-click it); an edited note keeps its author and time and records when it was edited
|
|
13
|
+
- Add `kanvas.py serve`: live two-way sync between the browser, the file and your agents, with compare-and-swap saves
|
|
14
|
+
- Open `kanvas.html` directly in Chrome or Edge to edit `kanvas.json` in place, or export a read-only snapshot with `kanvas.py export`
|
|
15
|
+
- Replace `canvas-tool.py` with `kanvas.py`; boards live in `kanvas.json` with stable formatting for clean diffs, which the CLI and the browser write byte for byte the same
|
|
16
|
+
- `finish` requires a summary, stored as a note, so task descriptions stay as written (#10)
|
|
17
|
+
- New tasks pick what they depend on and what they block from a searchable multi-select, or by clicking cards on the graph; choices that would create a cycle are greyed out
|
|
18
|
+
- Tidier graph: arrows that skip levels run between cards instead of under them, arrow ends spread along the card edge, cards are ordered to cut crossings and lined up so more arrows are straight
|
|
19
|
+
- Manual graph layout (`M`): cards keep the order of `kanvas.json`; drag a card up or down to reorder it, or into another swimlane to change its group; drag a swimlane by its name to reorder the groups
|
|
20
|
+
- Delete a group from its swimlane's right-click menu or from Groups… on the board name: its tasks stay without a group, or go with it if you tick the box
|
|
21
|
+
- Arrow keys select the next card in that direction, in the graph and the board
|
|
22
|
+
- The graph hides arrows for dependencies that another dependency already implies, and draws them dashed while one of their tasks is selected
|
|
23
|
+
- YOLO: mark a task in the board and agents may start and finish everything it depends on without approval or review, then the task itself, which comes back to you for review and ends the YOLO; YOLO on a task further along takes over the chain, so each chain ends with one review; its confirmation can be skipped with "Don't ask again" and brought back from the keyboard shortcuts dialog
|
|
24
|
+
- Agents add notes with `note`; notes record the author (`--as`, `KANVAS_AGENT`)
|
|
25
|
+
- Group prefixes may contain digits, such as `L0C-01` (#12), and IDs continue past 99
|
|
26
|
+
- Install Kanvas as the `kanvas` command on Linux, macOS and Windows with `uv tool install kanvas-board` or `pipx install kanvas-board`, or try it with `uvx kanvas-board`; uv downloads Python when it is missing, and agents keep using the project's copy, so they need nothing installed
|
|
27
|
+
- `init` installs an agent skill in `.agents/skills/kanvas/`, where Codex, Cursor, Gemini CLI, OpenCode and GitHub Copilot find it, with a copy in `.claude/skills/` for Claude Code; it creates an `AGENTS.md` pointing to it when the project has none, and never modifies existing files (#8); run without a folder, it sets up the folder of an existing board, else the top folder of the git repository, and `kanvas init .` keeps the current folder
|
|
28
|
+
- `serve` in a project without a board offers to create one, so a first-time user needs only `kanvas serve`; without a person at the terminal it fails with a message naming `kanvas init`
|
|
29
|
+
- Or let your agent set Kanvas up: the README has one sentence to paste into Claude Code, Codex, Cursor, Gemini CLI or OpenCode, which runs `init` and starts planning with you. When a sandbox keeps `.agents/` read-only, as Codex's does, `init` changes nothing and says to run it outside the sandbox
|
|
30
|
+
- Messages name the command you typed: `kanvas ...` for the installed command, `python .agents/skills/kanvas/kanvas.py ...` for the project's copy
|
|
31
|
+
- The browser page suggests `kanvas serve`, or the project's copy when the command is not installed, and the empty board asks you to have your agent interview you and plan the project
|
|
32
|
+
- `status` and `serve` say when a project's agent copy is out of date and suggest `kanvas init`, or `uv tool upgrade kanvas-board` when the installed `kanvas` is the older one
|
|
33
|
+
- Text options read UTF-8 from `--stdin` or `--file` on every platform, fixing multi-line and non-ASCII text on Windows (#20, #23)
|
|
34
|
+
- Agents can rework proposals until you approve them: `edit` changes the title, description or group, `withdraw` deletes proposals and `undepend` removes dependencies. Approved tasks and proposals under YOLO stay yours to change, and the board shows a notice when an agent revises or withdraws a proposal
|
|
35
|
+
- The skill's planning guidance fits any kind of work: agents first look at what the project already holds and what you want from the board, and size tasks to how you want to follow them, from large milestones to small steps
|
|
36
|
+
- The skill asks agents to sign notes with their tool's name (`claude-code`, `cursor`, `codex`, ...) so the board shows who did what
|
|
37
|
+
- Text arguments may follow options, as in `note DV-01 --as claude "..."`
|
|
38
|
+
- Add `check`, `depend`, `add-group`, `import` (migrates Obsidian `.canvas` boards) and `export`
|
|
39
|
+
- Writes are locked and atomic, so several agents and the browser can work at once; a board in a folder you cannot write to fails with a clear message
|
|
40
|
+
- Remove the Obsidian plugin, `canvas-watcher.js`, `RULES.md` and the `.canvas` examples
|
|
41
|
+
- Add a test suite and CI on Linux, macOS and Windows
|
|
42
|
+
|
|
43
|
+
## v0.3.1 — 2026-03-19
|
|
44
|
+
- Fix `add-dep` incorrectly rejecting valid edges when a pre-existing unrelated cycle existed elsewhere in the graph
|
|
45
|
+
## v0.3.0 — 2026-03-19
|
|
46
|
+
- Add DAG auto-layout engine to the Canvas Watcher plugin
|
|
47
|
+
- Add vertical and horizontal layout buttons to the Obsidian canvas toolbar
|
|
48
|
+
- Add layer-gap slider to control spacing between dependency levels, persisted across sessions
|
|
49
|
+
- Layout respects group membership, resolves depth conflicts via graph coloring, and applies transitive reduction
|
|
50
|
+
- Add `.gitattributes` to normalize line endings
|
|
51
|
+
|
|
52
|
+
## v0.2.0 — 2026-03-16
|
|
53
|
+
- Add `init` command to set up Kanvas in a project directory
|
|
54
|
+
- Add `--no-plugin` flag to skip Obsidian plugin install during init
|
|
55
|
+
- Improve README setup instructions
|
|
56
|
+
|
|
57
|
+
## v0.1.0 — 2026-03-13
|
|
58
|
+
- Initial release
|
|
59
|
+
- CLI tool (`canvas-tool.py`) with workflow enforcement
|
|
60
|
+
- Workflow rules (`RULES.md`) and agent instructions (`CLAUDE.md`, `AGENTS.md`)
|
|
61
|
+
- Canvas Watcher Obsidian plugin
|
|
62
|
+
- Standalone canvas watcher (`canvas-watcher.js`)
|
|
63
|
+
- Example boards (blank template, sample project)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 XMihura
|
|
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.
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: kanvas-board
|
|
3
|
+
Version: 0.4.0rc1
|
|
4
|
+
Summary: A task board you share with your AI coding agents
|
|
5
|
+
Project-URL: Homepage, https://github.com/XMihura/Kanvas
|
|
6
|
+
Project-URL: Changelog, https://github.com/XMihura/Kanvas/blob/main/CHANGELOG.md
|
|
7
|
+
Project-URL: Issues, https://github.com/XMihura/Kanvas/issues
|
|
8
|
+
Author: XMihura
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: ai agents,claude,codex,cursor,kanban,planning,tasks
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Environment :: Web Environment
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Topic :: Software Development
|
|
20
|
+
Requires-Python: >=3.8
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
<img src="https://raw.githubusercontent.com/XMihura/Kanvas/main/img/icon.svg" alt="" width="72">
|
|
24
|
+
|
|
25
|
+
# Kanvas
|
|
26
|
+
|
|
27
|
+
A task board you share with your AI coding agents. Agents plan and report through a small CLI; you approve, steer and review in an interactive board in your browser.
|
|
28
|
+
|
|
29
|
+
One JSON file, one Python script, one HTML page. No accounts, no build step, no dependencies.
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
## Why
|
|
34
|
+
|
|
35
|
+
AI agents do their best work in a terminal, but a project needs a plan that outlives a single chat: what is left, what depends on what, what was decided and why. Kanvas keeps that plan in `kanvas.json` next to your code, where you and any number of agents work on it together.
|
|
36
|
+
|
|
37
|
+
- **You stay in control.** Agents propose tasks and you approve them. Agents finish tasks and you review them. Only you mark work done, unless you hand a chain of tasks over with YOLO, and even then the task at its end comes back to you for review.
|
|
38
|
+
- **Agents cannot break the board.** They change it through `kanvas.py`, which enforces the workflow and rejects invalid moves with a clear message.
|
|
39
|
+
- **Live.** Agent changes appear in the browser within a second, and your edits are on disk immediately for the agent's next command.
|
|
40
|
+
- **Agent-agnostic.** Claude Code, Codex, Cursor, Gemini CLI, OpenCode, GitHub Copilot, or anything that runs shell commands. Use several at once; notes record who did what.
|
|
41
|
+
- **Git-friendly.** The board is plain, stably formatted JSON. Commit it with the code and your history shows how the plan evolved.
|
|
42
|
+
|
|
43
|
+
## Quick start
|
|
44
|
+
|
|
45
|
+
Kanvas works on Linux, macOS and Windows. You need a browser and [uv](https://docs.astral.sh/uv/), which installs Kanvas and downloads Python too if your computer has none.
|
|
46
|
+
|
|
47
|
+
**1. Install uv** (once). On macOS and Linux, run this in a terminal:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
On Windows, run this in PowerShell:
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Then close the terminal and open a new one.
|
|
60
|
+
|
|
61
|
+
**2. Install Kanvas** (once):
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
uv tool install kanvas-board
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
This gives you the `kanvas` command. If the terminal later cannot find it, run `uv tool update-shell` and open a new terminal.
|
|
68
|
+
|
|
69
|
+
**3. Open the board.** Go to your project's folder and run:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cd path/to/your-project
|
|
73
|
+
kanvas init
|
|
74
|
+
kanvas serve
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`init` creates the board, `kanvas.json`, and installs the agent skill in `.agents/skills/kanvas/`: instructions for your agents and their own copy of Kanvas, so agents need nothing installed. Commit `kanvas.json` and `.agents/` with your project.
|
|
78
|
+
|
|
79
|
+
Agents that support skills pick the skill up automatically, and `init` creates an `AGENTS.md` that points the others to it. If your project already has an `AGENTS.md`, `init` leaves it untouched and, when the file does not mention the skill yet, prints this line for you to add:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
Plan and track work on the Kanvas board; follow .agents/skills/kanvas/SKILL.md.
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`serve` opens the board in your browser. Keep it running while you work; Ctrl+C stops it.
|
|
86
|
+
|
|
87
|
+
**4. Ask your agent:**
|
|
88
|
+
|
|
89
|
+
> Interview me about this project and plan it on the Kanvas board.
|
|
90
|
+
|
|
91
|
+
The plan arrives as proposals. Approve the ones you want, and tell the agent to start working.
|
|
92
|
+
|
|
93
|
+
### Let your agent set it up
|
|
94
|
+
|
|
95
|
+
With uv installed (step 1), you can hand steps 2 to 4 to your agent. Open Claude Code, Codex, Cursor, Gemini CLI or OpenCode in your project's folder and paste:
|
|
96
|
+
|
|
97
|
+
> Set up Kanvas in this project with `uvx kanvas-board init` (https://github.com/XMihura/Kanvas), then follow `.agents/skills/kanvas/SKILL.md` and plan the work with me on the board.
|
|
98
|
+
|
|
99
|
+
The agent creates the board, looks at what the project already holds, asks you what it needs to know and proposes a plan. To watch the board, run `uvx kanvas-board serve` in the project's folder, or `kanvas serve` if you installed Kanvas. Codex keeps `.agents/` read-only in its sandbox, so it asks your permission to run `init` outside it. Gemini CLI loads the skill only in folders you have marked as trusted, and asks before using it.
|
|
100
|
+
|
|
101
|
+
### Other ways to install and update
|
|
102
|
+
|
|
103
|
+
Try Kanvas without installing it:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
uvx kanvas-board init
|
|
107
|
+
uvx kanvas-board serve
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Install with pipx, or straight from GitHub without PyPI:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pipx install kanvas-board
|
|
114
|
+
uv tool install https://github.com/XMihura/Kanvas/archive/refs/heads/main.zip
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Without uv, you need Python 3.8 or newer. [Download](https://github.com/XMihura/Kanvas/archive/refs/heads/main.zip) or clone this repository and run its `kanvas.py` in your project's folder; from then on, use the project's copy (type `python3` where `python` is missing):
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
python path/to/kanvas.py init
|
|
121
|
+
python .agents/skills/kanvas/kanvas.py serve
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
To update, run this, then `kanvas init` again in each project to refresh the copy its agents use:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
uv tool upgrade kanvas-board
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`kanvas status` and `kanvas serve` remind you when a project's copy differs from the installed `kanvas`: they suggest `kanvas init` when the copy is older, and `uv tool upgrade kanvas-board` when it is newer.
|
|
131
|
+
|
|
132
|
+
## How it works
|
|
133
|
+
|
|
134
|
+
```mermaid
|
|
135
|
+
flowchart LR
|
|
136
|
+
agent["AI agents"] -- "kanvas.py start / finish / propose / note" --> board[("kanvas.json")]
|
|
137
|
+
you["You"] -- "browser" --> page["kanvas.html"]
|
|
138
|
+
page <-- "kanvas serve" --> board
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Every task moves through five states. A to-do task whose dependencies are unfinished shows as blocked, and becomes ready by itself once they are done.
|
|
142
|
+
|
|
143
|
+
| State | Color | Who moves it there |
|
|
144
|
+
|-------|-------|--------------------|
|
|
145
|
+
| Proposed | purple | An agent proposes it |
|
|
146
|
+
| To do | blue (gray while blocked) | You approve it |
|
|
147
|
+
| Doing | orange | An agent starts it |
|
|
148
|
+
| Review | pink | The agent finishes it, with a summary of what it did |
|
|
149
|
+
| Done | green | You accept it, or send it back with feedback |
|
|
150
|
+
|
|
151
|
+
Agents may propose tasks and groups, start ready tasks, finish or pause tasks in progress, add notes and add dependencies. Until you approve a proposal, they may also revise, withdraw or rewire it, so you can reshape a plan together in the conversation and the board follows. Everything else belongs to you: approving, changing approved tasks, marking done. Feedback you leave when sending a task back becomes a note the agent reads when it picks the task up again.
|
|
152
|
+
|
|
153
|
+
## The board
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
- **Graph view.** One swimlane per group, laid out by dependency depth, flowing left to right or top to bottom (switch under Display, or press `L`). The automatic layout orders the cards for fewer crossings and straighter arrows, and arrows that skip levels run between cards. Set the card order to Manual under Display (or press `M`) to order the cards yourself: drag a card up or down within its level, or into another swimlane to change its group, and drag a swimlane by its name to reorder the groups. Your order is saved in `kanvas.json`, and right-clicking empty space offers to start from the automatic order. The spacing slider under Display, or `[` and `]`, compresses or extends the space between dependency levels. Hover or select a task to highlight everything it depends on and everything waiting for it. A dependency that another dependency already implies (C needs A and B, and B needs A) stays in the file but is drawn only while A or C is selected, as a dashed arrow. Each card has a dot on its incoming and outgoing side: drag one onto another card to add a dependency in that direction (cycles are refused). Click an arrow to open or remove the dependency.
|
|
158
|
+
- **Board view.** Kanban columns by state. Drag cards between columns, or approve every proposal at once.
|
|
159
|
+
- **New tasks.** Choose what a new task depends on and what it blocks by searching, or with **Pick on graph**: click cards to add or remove them, then press Done (or Enter), or Cancel (or Escape) to keep the earlier choice. Choices that would create a cycle are dimmed, with the reason on hover.
|
|
160
|
+
- **Task panel.** Title, Markdown description, state, group, dependencies and the notes timeline. Approve, start, send to review, mark done, or send back with feedback.
|
|
161
|
+
- **Right-click menus.** On a card: state actions, a new task that depends on it or blocks it, adding and removing dependencies, copying the ID, deleting. On an arrow (left or right click): the two tasks it connects are highlighted and shown in the menu; click either one to open it, or remove the connection. On empty space: a new task in that group, a new group, or deleting that group (its tasks stay without a group unless you choose to delete them too).
|
|
162
|
+
- **Undo and redo.** Ctrl+Z undoes your last change in the browser, Ctrl+Shift+Z or Ctrl+Y redoes it, and the arrows next to New task do the same. Changes agents made in the meantime are kept: an undo only touches what your change touched, and refuses if an agent has changed that since. Inside a text field, Ctrl+Z undoes typing as usual.
|
|
163
|
+
- **YOLO.** "YOLO up to here…" on a card (right-click menu or task panel) hands that task and everything it depends on to the agents: they may start the chain's proposals without approval, and the tasks they finish on the way are done without review. The YOLO task itself comes back to you for review, so a YOLO run ends with one review of the result, and YOLO stops applying once that task is in review. YOLO on a task further along takes over the chain: the YOLO marks inside it go, so only the last task comes back for review. Turning it on approves the chain's current proposals and marks the other tasks waiting for review as done. The task carries a YOLO tag and the tasks it covers a lightning icon; the same menu turns it off.
|
|
164
|
+
- **Everything else.** Filter by state, search (press `/`), hide finished work, groups with their own ID prefixes (from the menu on the board name), light, dark or system theme, keyboard shortcuts (press `?`), arrow keys to move from card to card and Enter to move into its panel (Tab goes round the panel, Escape comes back out), and links: `#BE-02` in the URL opens that task.
|
|
165
|
+
|
|
166
|
+

|
|
167
|
+
|
|
168
|
+
There are three ways to open it:
|
|
169
|
+
|
|
170
|
+
| | |
|
|
171
|
+
|---|---|
|
|
172
|
+
| `kanvas serve` | Any browser, live two-way sync. Concurrent changes from agents and the browser merge automatically. |
|
|
173
|
+
| Open `kanvas.html` directly | The project has a copy in `.agents/skills/kanvas/`. In Chrome or Edge, choose your `kanvas.json` and the page reads and writes it in place, with live updates. Other browsers edit a copy in the tab; **Save** downloads it. |
|
|
174
|
+
| `kanvas export` | A single self-contained, read-only HTML snapshot to share or attach to a pull request. |
|
|
175
|
+
|
|
176
|
+
## CLI
|
|
177
|
+
|
|
178
|
+
You type `kanvas <command>`; `kanvas -h` lists the commands and `kanvas <command> -h` explains one. Agents run the same commands through the project's copy, `python .agents/skills/kanvas/kanvas.py <command>`, so cloud agents and teammates who never installed Kanvas can work on the board too. Messages name the command you typed: `kanvas ...` for the installed command, `python .agents/skills/kanvas/kanvas.py ...` for the project's copy.
|
|
179
|
+
|
|
180
|
+
| Command | Purpose |
|
|
181
|
+
|---------|---------|
|
|
182
|
+
| `status` | Overview: doing, waiting for review, ready, blocked, proposed, problems |
|
|
183
|
+
| `ready` / `blocked` | What can start now / what waits on what |
|
|
184
|
+
| `show ID` | Details, dependencies and notes |
|
|
185
|
+
| `list [STATE or GROUP]` | Tasks by group, optionally filtered |
|
|
186
|
+
| `start ID [-m NOTE]` | To do to doing; proposals under YOLO too |
|
|
187
|
+
| `finish ID -m SUMMARY` | Doing to review, or to done for tasks a YOLO task depends on; the summary is required and kept as a note |
|
|
188
|
+
| `pause ID [-m NOTE]` | Doing back to to do |
|
|
189
|
+
| `note ID TEXT` | Append a note; descriptions stay as the human wrote them |
|
|
190
|
+
| `propose GROUP TITLE [DESC] [--deps ID ...]` | Propose a task |
|
|
191
|
+
| `add-group NAME [--prefix XX]` | Create a group |
|
|
192
|
+
| `batch` | Propose many groups and tasks from JSON on stdin |
|
|
193
|
+
| `depend ID ON [ON ...]` | Add dependencies |
|
|
194
|
+
| `edit ID [--title T] [--group G] [--desc D]` | Revise a proposal that is not approved yet |
|
|
195
|
+
| `withdraw ID [ID ...]` | Delete proposals that are not approved yet |
|
|
196
|
+
| `undepend ID ON [ON ...]` | Remove dependencies from a proposal |
|
|
197
|
+
| `check` | Validate the board; exit code 1 on errors |
|
|
198
|
+
| `serve [--port N] [--host H]` | Open the board in the browser; in a project without a board, offer to create one first |
|
|
199
|
+
| `init [DIR]` | Set up Kanvas in a project, or refresh the agents' copy after an update |
|
|
200
|
+
| `import FILE.canvas` | Migrate a Kanvas 0.x Obsidian board |
|
|
201
|
+
| `export [FILE.html]` | Write a read-only snapshot |
|
|
202
|
+
|
|
203
|
+
`init` creates `kanvas.json` and installs the agent skill in `.agents/skills/kanvas/` (a copy of `kanvas.py`, `kanvas.html` and `SKILL.md`), and a copy of `SKILL.md` in `.claude/skills/` for Claude Code, which reads skills only from there. Codex, Cursor, Gemini CLI, OpenCode and GitHub Copilot read `.agents/skills/`. When the project has no `AGENTS.md`, it creates one that points agents to the skill. Run without a folder, it picks the folder that already holds a board (the current folder or one above it), else the top folder of the git repository, else the current folder; `kanvas init .` keeps the current folder, for one board per subproject. Apart from the skill files it installs, it never modifies an existing file.
|
|
204
|
+
|
|
205
|
+
In a project without a board, `serve` asks whether to create one, then opens it. Without a person at the terminal, it fails with a message naming `kanvas init`.
|
|
206
|
+
|
|
207
|
+
Text arguments also accept `--stdin` and `--file PATH`, read as UTF-8 on every platform, which is the reliable way to pass multi-line or non-ASCII text from any shell. Notes are signed with `--as NAME` or the `KANVAS_AGENT` environment variable. The CLI finds `kanvas.json` in the current directory or any parent; `--board PATH` or `KANVAS_BOARD` point elsewhere.
|
|
208
|
+
|
|
209
|
+
Writes take a short lock and replace the file atomically, so several agents and the browser can work at the same time without losing changes.
|
|
210
|
+
|
|
211
|
+
## File format
|
|
212
|
+
|
|
213
|
+
```json
|
|
214
|
+
{
|
|
215
|
+
"kanvas": 1,
|
|
216
|
+
"title": "Weather dashboard",
|
|
217
|
+
"groups": [
|
|
218
|
+
{
|
|
219
|
+
"id": "BE",
|
|
220
|
+
"name": "Backend"
|
|
221
|
+
}
|
|
222
|
+
],
|
|
223
|
+
"tasks": [
|
|
224
|
+
{
|
|
225
|
+
"id": "BE-02",
|
|
226
|
+
"title": "Fetch and cache forecasts",
|
|
227
|
+
"state": "review",
|
|
228
|
+
"group": "BE",
|
|
229
|
+
"deps": ["BE-01"],
|
|
230
|
+
"desc": "`GET /forecast` proxies Open-Meteo.",
|
|
231
|
+
"notes": [
|
|
232
|
+
{
|
|
233
|
+
"at": "2026-10-19T11:05:00Z",
|
|
234
|
+
"by": "claude",
|
|
235
|
+
"text": "Done: responses cached for 10 minutes; 23 tests pass."
|
|
236
|
+
}
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
States are `proposed`, `todo`, `doing`, `review` and `done`; blocked is computed. `"yolo": true` on a task puts it and everything it depends on under YOLO. A note edited in the browser gets an `"edited"` time next to its original `"at"`. The CLI and the browser write the same canonical formatting, so diffs show only real changes. Unknown fields are preserved. See [`examples/sample.json`](https://github.com/XMihura/Kanvas/blob/main/examples/sample.json) for a complete board.
|
|
244
|
+
|
|
245
|
+
## Migrating from Kanvas 0.x (Obsidian)
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
kanvas init
|
|
249
|
+
kanvas import Project.canvas
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Card colors become states, groups come from the canvas groups, arrows become dependencies, and existing task IDs are kept. The `.canvas` file is left untouched. Once you are happy with the result, delete `Project.canvas`, `canvas-tool.py`, `RULES.md`, the Kanvas instructions in `CLAUDE.md` / `AGENTS.md`, and the `.obsidian/plugins/canvas-watcher` plugin.
|
|
253
|
+
|
|
254
|
+
## Development
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
python -m unittest discover -s tests -v
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
The suite is standard library only; one test also runs the browser's serializer under Node.js when it is installed, to check that both sides write identical files. Contributor notes are in [AGENTS.md](https://github.com/XMihura/Kanvas/blob/main/AGENTS.md).
|
|
261
|
+
|
|
262
|
+
## License
|
|
263
|
+
|
|
264
|
+
MIT
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
<img src="img/icon.svg" alt="" width="72">
|
|
2
|
+
|
|
3
|
+
# Kanvas
|
|
4
|
+
|
|
5
|
+
A task board you share with your AI coding agents. Agents plan and report through a small CLI; you approve, steer and review in an interactive board in your browser.
|
|
6
|
+
|
|
7
|
+
One JSON file, one Python script, one HTML page. No accounts, no build step, no dependencies.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
## Why
|
|
12
|
+
|
|
13
|
+
AI agents do their best work in a terminal, but a project needs a plan that outlives a single chat: what is left, what depends on what, what was decided and why. Kanvas keeps that plan in `kanvas.json` next to your code, where you and any number of agents work on it together.
|
|
14
|
+
|
|
15
|
+
- **You stay in control.** Agents propose tasks and you approve them. Agents finish tasks and you review them. Only you mark work done, unless you hand a chain of tasks over with YOLO, and even then the task at its end comes back to you for review.
|
|
16
|
+
- **Agents cannot break the board.** They change it through `kanvas.py`, which enforces the workflow and rejects invalid moves with a clear message.
|
|
17
|
+
- **Live.** Agent changes appear in the browser within a second, and your edits are on disk immediately for the agent's next command.
|
|
18
|
+
- **Agent-agnostic.** Claude Code, Codex, Cursor, Gemini CLI, OpenCode, GitHub Copilot, or anything that runs shell commands. Use several at once; notes record who did what.
|
|
19
|
+
- **Git-friendly.** The board is plain, stably formatted JSON. Commit it with the code and your history shows how the plan evolved.
|
|
20
|
+
|
|
21
|
+
## Quick start
|
|
22
|
+
|
|
23
|
+
Kanvas works on Linux, macOS and Windows. You need a browser and [uv](https://docs.astral.sh/uv/), which installs Kanvas and downloads Python too if your computer has none.
|
|
24
|
+
|
|
25
|
+
**1. Install uv** (once). On macOS and Linux, run this in a terminal:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
On Windows, run this in PowerShell:
|
|
32
|
+
|
|
33
|
+
```powershell
|
|
34
|
+
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Then close the terminal and open a new one.
|
|
38
|
+
|
|
39
|
+
**2. Install Kanvas** (once):
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
uv tool install kanvas-board
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
This gives you the `kanvas` command. If the terminal later cannot find it, run `uv tool update-shell` and open a new terminal.
|
|
46
|
+
|
|
47
|
+
**3. Open the board.** Go to your project's folder and run:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cd path/to/your-project
|
|
51
|
+
kanvas init
|
|
52
|
+
kanvas serve
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`init` creates the board, `kanvas.json`, and installs the agent skill in `.agents/skills/kanvas/`: instructions for your agents and their own copy of Kanvas, so agents need nothing installed. Commit `kanvas.json` and `.agents/` with your project.
|
|
56
|
+
|
|
57
|
+
Agents that support skills pick the skill up automatically, and `init` creates an `AGENTS.md` that points the others to it. If your project already has an `AGENTS.md`, `init` leaves it untouched and, when the file does not mention the skill yet, prints this line for you to add:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Plan and track work on the Kanvas board; follow .agents/skills/kanvas/SKILL.md.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`serve` opens the board in your browser. Keep it running while you work; Ctrl+C stops it.
|
|
64
|
+
|
|
65
|
+
**4. Ask your agent:**
|
|
66
|
+
|
|
67
|
+
> Interview me about this project and plan it on the Kanvas board.
|
|
68
|
+
|
|
69
|
+
The plan arrives as proposals. Approve the ones you want, and tell the agent to start working.
|
|
70
|
+
|
|
71
|
+
### Let your agent set it up
|
|
72
|
+
|
|
73
|
+
With uv installed (step 1), you can hand steps 2 to 4 to your agent. Open Claude Code, Codex, Cursor, Gemini CLI or OpenCode in your project's folder and paste:
|
|
74
|
+
|
|
75
|
+
> Set up Kanvas in this project with `uvx kanvas-board init` (https://github.com/XMihura/Kanvas), then follow `.agents/skills/kanvas/SKILL.md` and plan the work with me on the board.
|
|
76
|
+
|
|
77
|
+
The agent creates the board, looks at what the project already holds, asks you what it needs to know and proposes a plan. To watch the board, run `uvx kanvas-board serve` in the project's folder, or `kanvas serve` if you installed Kanvas. Codex keeps `.agents/` read-only in its sandbox, so it asks your permission to run `init` outside it. Gemini CLI loads the skill only in folders you have marked as trusted, and asks before using it.
|
|
78
|
+
|
|
79
|
+
### Other ways to install and update
|
|
80
|
+
|
|
81
|
+
Try Kanvas without installing it:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
uvx kanvas-board init
|
|
85
|
+
uvx kanvas-board serve
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Install with pipx, or straight from GitHub without PyPI:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
pipx install kanvas-board
|
|
92
|
+
uv tool install https://github.com/XMihura/Kanvas/archive/refs/heads/main.zip
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Without uv, you need Python 3.8 or newer. [Download](https://github.com/XMihura/Kanvas/archive/refs/heads/main.zip) or clone this repository and run its `kanvas.py` in your project's folder; from then on, use the project's copy (type `python3` where `python` is missing):
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
python path/to/kanvas.py init
|
|
99
|
+
python .agents/skills/kanvas/kanvas.py serve
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
To update, run this, then `kanvas init` again in each project to refresh the copy its agents use:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
uv tool upgrade kanvas-board
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`kanvas status` and `kanvas serve` remind you when a project's copy differs from the installed `kanvas`: they suggest `kanvas init` when the copy is older, and `uv tool upgrade kanvas-board` when it is newer.
|
|
109
|
+
|
|
110
|
+
## How it works
|
|
111
|
+
|
|
112
|
+
```mermaid
|
|
113
|
+
flowchart LR
|
|
114
|
+
agent["AI agents"] -- "kanvas.py start / finish / propose / note" --> board[("kanvas.json")]
|
|
115
|
+
you["You"] -- "browser" --> page["kanvas.html"]
|
|
116
|
+
page <-- "kanvas serve" --> board
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Every task moves through five states. A to-do task whose dependencies are unfinished shows as blocked, and becomes ready by itself once they are done.
|
|
120
|
+
|
|
121
|
+
| State | Color | Who moves it there |
|
|
122
|
+
|-------|-------|--------------------|
|
|
123
|
+
| Proposed | purple | An agent proposes it |
|
|
124
|
+
| To do | blue (gray while blocked) | You approve it |
|
|
125
|
+
| Doing | orange | An agent starts it |
|
|
126
|
+
| Review | pink | The agent finishes it, with a summary of what it did |
|
|
127
|
+
| Done | green | You accept it, or send it back with feedback |
|
|
128
|
+
|
|
129
|
+
Agents may propose tasks and groups, start ready tasks, finish or pause tasks in progress, add notes and add dependencies. Until you approve a proposal, they may also revise, withdraw or rewire it, so you can reshape a plan together in the conversation and the board follows. Everything else belongs to you: approving, changing approved tasks, marking done. Feedback you leave when sending a task back becomes a note the agent reads when it picks the task up again.
|
|
130
|
+
|
|
131
|
+
## The board
|
|
132
|
+
|
|
133
|
+

|
|
134
|
+
|
|
135
|
+
- **Graph view.** One swimlane per group, laid out by dependency depth, flowing left to right or top to bottom (switch under Display, or press `L`). The automatic layout orders the cards for fewer crossings and straighter arrows, and arrows that skip levels run between cards. Set the card order to Manual under Display (or press `M`) to order the cards yourself: drag a card up or down within its level, or into another swimlane to change its group, and drag a swimlane by its name to reorder the groups. Your order is saved in `kanvas.json`, and right-clicking empty space offers to start from the automatic order. The spacing slider under Display, or `[` and `]`, compresses or extends the space between dependency levels. Hover or select a task to highlight everything it depends on and everything waiting for it. A dependency that another dependency already implies (C needs A and B, and B needs A) stays in the file but is drawn only while A or C is selected, as a dashed arrow. Each card has a dot on its incoming and outgoing side: drag one onto another card to add a dependency in that direction (cycles are refused). Click an arrow to open or remove the dependency.
|
|
136
|
+
- **Board view.** Kanban columns by state. Drag cards between columns, or approve every proposal at once.
|
|
137
|
+
- **New tasks.** Choose what a new task depends on and what it blocks by searching, or with **Pick on graph**: click cards to add or remove them, then press Done (or Enter), or Cancel (or Escape) to keep the earlier choice. Choices that would create a cycle are dimmed, with the reason on hover.
|
|
138
|
+
- **Task panel.** Title, Markdown description, state, group, dependencies and the notes timeline. Approve, start, send to review, mark done, or send back with feedback.
|
|
139
|
+
- **Right-click menus.** On a card: state actions, a new task that depends on it or blocks it, adding and removing dependencies, copying the ID, deleting. On an arrow (left or right click): the two tasks it connects are highlighted and shown in the menu; click either one to open it, or remove the connection. On empty space: a new task in that group, a new group, or deleting that group (its tasks stay without a group unless you choose to delete them too).
|
|
140
|
+
- **Undo and redo.** Ctrl+Z undoes your last change in the browser, Ctrl+Shift+Z or Ctrl+Y redoes it, and the arrows next to New task do the same. Changes agents made in the meantime are kept: an undo only touches what your change touched, and refuses if an agent has changed that since. Inside a text field, Ctrl+Z undoes typing as usual.
|
|
141
|
+
- **YOLO.** "YOLO up to here…" on a card (right-click menu or task panel) hands that task and everything it depends on to the agents: they may start the chain's proposals without approval, and the tasks they finish on the way are done without review. The YOLO task itself comes back to you for review, so a YOLO run ends with one review of the result, and YOLO stops applying once that task is in review. YOLO on a task further along takes over the chain: the YOLO marks inside it go, so only the last task comes back for review. Turning it on approves the chain's current proposals and marks the other tasks waiting for review as done. The task carries a YOLO tag and the tasks it covers a lightning icon; the same menu turns it off.
|
|
142
|
+
- **Everything else.** Filter by state, search (press `/`), hide finished work, groups with their own ID prefixes (from the menu on the board name), light, dark or system theme, keyboard shortcuts (press `?`), arrow keys to move from card to card and Enter to move into its panel (Tab goes round the panel, Escape comes back out), and links: `#BE-02` in the URL opens that task.
|
|
143
|
+
|
|
144
|
+

|
|
145
|
+
|
|
146
|
+
There are three ways to open it:
|
|
147
|
+
|
|
148
|
+
| | |
|
|
149
|
+
|---|---|
|
|
150
|
+
| `kanvas serve` | Any browser, live two-way sync. Concurrent changes from agents and the browser merge automatically. |
|
|
151
|
+
| Open `kanvas.html` directly | The project has a copy in `.agents/skills/kanvas/`. In Chrome or Edge, choose your `kanvas.json` and the page reads and writes it in place, with live updates. Other browsers edit a copy in the tab; **Save** downloads it. |
|
|
152
|
+
| `kanvas export` | A single self-contained, read-only HTML snapshot to share or attach to a pull request. |
|
|
153
|
+
|
|
154
|
+
## CLI
|
|
155
|
+
|
|
156
|
+
You type `kanvas <command>`; `kanvas -h` lists the commands and `kanvas <command> -h` explains one. Agents run the same commands through the project's copy, `python .agents/skills/kanvas/kanvas.py <command>`, so cloud agents and teammates who never installed Kanvas can work on the board too. Messages name the command you typed: `kanvas ...` for the installed command, `python .agents/skills/kanvas/kanvas.py ...` for the project's copy.
|
|
157
|
+
|
|
158
|
+
| Command | Purpose |
|
|
159
|
+
|---------|---------|
|
|
160
|
+
| `status` | Overview: doing, waiting for review, ready, blocked, proposed, problems |
|
|
161
|
+
| `ready` / `blocked` | What can start now / what waits on what |
|
|
162
|
+
| `show ID` | Details, dependencies and notes |
|
|
163
|
+
| `list [STATE or GROUP]` | Tasks by group, optionally filtered |
|
|
164
|
+
| `start ID [-m NOTE]` | To do to doing; proposals under YOLO too |
|
|
165
|
+
| `finish ID -m SUMMARY` | Doing to review, or to done for tasks a YOLO task depends on; the summary is required and kept as a note |
|
|
166
|
+
| `pause ID [-m NOTE]` | Doing back to to do |
|
|
167
|
+
| `note ID TEXT` | Append a note; descriptions stay as the human wrote them |
|
|
168
|
+
| `propose GROUP TITLE [DESC] [--deps ID ...]` | Propose a task |
|
|
169
|
+
| `add-group NAME [--prefix XX]` | Create a group |
|
|
170
|
+
| `batch` | Propose many groups and tasks from JSON on stdin |
|
|
171
|
+
| `depend ID ON [ON ...]` | Add dependencies |
|
|
172
|
+
| `edit ID [--title T] [--group G] [--desc D]` | Revise a proposal that is not approved yet |
|
|
173
|
+
| `withdraw ID [ID ...]` | Delete proposals that are not approved yet |
|
|
174
|
+
| `undepend ID ON [ON ...]` | Remove dependencies from a proposal |
|
|
175
|
+
| `check` | Validate the board; exit code 1 on errors |
|
|
176
|
+
| `serve [--port N] [--host H]` | Open the board in the browser; in a project without a board, offer to create one first |
|
|
177
|
+
| `init [DIR]` | Set up Kanvas in a project, or refresh the agents' copy after an update |
|
|
178
|
+
| `import FILE.canvas` | Migrate a Kanvas 0.x Obsidian board |
|
|
179
|
+
| `export [FILE.html]` | Write a read-only snapshot |
|
|
180
|
+
|
|
181
|
+
`init` creates `kanvas.json` and installs the agent skill in `.agents/skills/kanvas/` (a copy of `kanvas.py`, `kanvas.html` and `SKILL.md`), and a copy of `SKILL.md` in `.claude/skills/` for Claude Code, which reads skills only from there. Codex, Cursor, Gemini CLI, OpenCode and GitHub Copilot read `.agents/skills/`. When the project has no `AGENTS.md`, it creates one that points agents to the skill. Run without a folder, it picks the folder that already holds a board (the current folder or one above it), else the top folder of the git repository, else the current folder; `kanvas init .` keeps the current folder, for one board per subproject. Apart from the skill files it installs, it never modifies an existing file.
|
|
182
|
+
|
|
183
|
+
In a project without a board, `serve` asks whether to create one, then opens it. Without a person at the terminal, it fails with a message naming `kanvas init`.
|
|
184
|
+
|
|
185
|
+
Text arguments also accept `--stdin` and `--file PATH`, read as UTF-8 on every platform, which is the reliable way to pass multi-line or non-ASCII text from any shell. Notes are signed with `--as NAME` or the `KANVAS_AGENT` environment variable. The CLI finds `kanvas.json` in the current directory or any parent; `--board PATH` or `KANVAS_BOARD` point elsewhere.
|
|
186
|
+
|
|
187
|
+
Writes take a short lock and replace the file atomically, so several agents and the browser can work at the same time without losing changes.
|
|
188
|
+
|
|
189
|
+
## File format
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"kanvas": 1,
|
|
194
|
+
"title": "Weather dashboard",
|
|
195
|
+
"groups": [
|
|
196
|
+
{
|
|
197
|
+
"id": "BE",
|
|
198
|
+
"name": "Backend"
|
|
199
|
+
}
|
|
200
|
+
],
|
|
201
|
+
"tasks": [
|
|
202
|
+
{
|
|
203
|
+
"id": "BE-02",
|
|
204
|
+
"title": "Fetch and cache forecasts",
|
|
205
|
+
"state": "review",
|
|
206
|
+
"group": "BE",
|
|
207
|
+
"deps": ["BE-01"],
|
|
208
|
+
"desc": "`GET /forecast` proxies Open-Meteo.",
|
|
209
|
+
"notes": [
|
|
210
|
+
{
|
|
211
|
+
"at": "2026-10-19T11:05:00Z",
|
|
212
|
+
"by": "claude",
|
|
213
|
+
"text": "Done: responses cached for 10 minutes; 23 tests pass."
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
States are `proposed`, `todo`, `doing`, `review` and `done`; blocked is computed. `"yolo": true` on a task puts it and everything it depends on under YOLO. A note edited in the browser gets an `"edited"` time next to its original `"at"`. The CLI and the browser write the same canonical formatting, so diffs show only real changes. Unknown fields are preserved. See [`examples/sample.json`](examples/sample.json) for a complete board.
|
|
222
|
+
|
|
223
|
+
## Migrating from Kanvas 0.x (Obsidian)
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
kanvas init
|
|
227
|
+
kanvas import Project.canvas
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Card colors become states, groups come from the canvas groups, arrows become dependencies, and existing task IDs are kept. The `.canvas` file is left untouched. Once you are happy with the result, delete `Project.canvas`, `canvas-tool.py`, `RULES.md`, the Kanvas instructions in `CLAUDE.md` / `AGENTS.md`, and the `.obsidian/plugins/canvas-watcher` plugin.
|
|
231
|
+
|
|
232
|
+
## Development
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
python -m unittest discover -s tests -v
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
The suite is standard library only; one test also runs the browser's serializer under Node.js when it is installed, to check that both sides write identical files. Contributor notes are in [AGENTS.md](AGENTS.md).
|
|
239
|
+
|
|
240
|
+
## License
|
|
241
|
+
|
|
242
|
+
MIT
|