@pi-unipi/kanboard 3.0.0-alpha.3 → 3.0.0-alpha.31
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.
- package/README.md +98 -186
- package/index.ts +331 -60
- package/package.json +8 -8
- package/skills/kanboard/SKILL.md +67 -31
- package/src/badges.ts +93 -0
- package/src/bus-hooks.ts +28 -0
- package/src/commands.ts +240 -99
- package/src/debug.ts +20 -0
- package/src/guard.ts +267 -109
- package/src/monitor.ts +330 -0
- package/src/move.ts +63 -0
- package/src/notice-buffer.ts +74 -0
- package/src/reminders.ts +234 -0
- package/src/settings.ts +90 -89
- package/src/shapes.ts +5 -0
- package/src/runner.ts +0 -952
package/README.md
CHANGED
|
@@ -1,218 +1,130 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Kanboard
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
storage, transition rules and web UI live in the Rust binary
|
|
5
|
-
([`crates/kanboard`](../../crates/kanboard) — one writer for every change); this
|
|
6
|
-
package is the terminal-side bridge: commands, the task runner, hub settings and
|
|
7
|
-
the `kanboard` skill.
|
|
3
|
+
Keep a per-project board of work for later, and let the agent work the tasks when you allow it.
|
|
8
4
|
|
|
9
|
-
|
|
5
|
+
`@pi-unipi/kanboard` · part of [UniPi](../../README.md)
|
|
10
6
|
|
|
11
|
-
|
|
7
|
+

|
|
12
8
|
|
|
13
|
-
|
|
14
|
-
(display-only, never enters the LLM context):
|
|
9
|
+

|
|
15
10
|
|
|
16
|
-
|
|
17
|
-
|---|---|
|
|
18
|
-
| `open [--host H] [--port N]` | Ensure the daemon (reuse a healthy one, else spawn `serve` detached) and print `http://127.0.0.1:<port>/p/<slug>`. The browser opens only when `openBrowser` is on. |
|
|
19
|
-
| `onboard` | `project add` for this workspace and remembers the slug. Idempotent. |
|
|
20
|
-
| `close` | Shut down the board daemon — the web UI goes offline until the next `open`. Running tasks are unaffected. |
|
|
21
|
-
| `status` | Daemon pid/port, project counts, active claims (session/pid/host/staleness), this session's queue, and the runner's current task. |
|
|
22
|
-
| `doctor` | ✓/✗ setup check (binary, daemon health, project, summary agent, bind, claims) as a display-only message. |
|
|
11
|
+
## What it does
|
|
23
12
|
|
|
24
|
-
|
|
13
|
+
- Keeps tasks in lanes: Backlog, Todo, In Progress, In Review, Blocked, Done, Cancelled and Archived.
|
|
14
|
+
- Opens a web board for each project. The board updates when the agent or the CLI changes a task.
|
|
15
|
+
- Lets you add a task from the prompt with no agent turn.
|
|
16
|
+
- Lets the agent work tasks only within a budget that you give it, or in autowork.
|
|
17
|
+
- Asks the agent to continue a task that it started and did not finish.
|
|
18
|
+
- Stores tasks as markdown files. The Rust binary `unipi-kanboard` writes all changes. Refer to [the crate README](../../crates/kanboard/README.md).
|
|
25
19
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
| `/unipi:kanboard-do <request>` | Reveal the skill and hand the request to the agent with board writes enabled for that turn. The agent may add/move/queue/note; it cannot run tasks — queued ids are drained by the runner when the turn ends. |
|
|
30
|
-
| `/unipi:kanboard-autowork start\|stop` | `start` runs ready tasks one by one (queue order first, then `claim-next`); `stop` finishes the current task, then stops. |
|
|
31
|
-
|
|
32
|
-
The old `add`/`work`/`stop` subcommands and bare-text capture now just point at
|
|
33
|
-
these commands.
|
|
34
|
-
|
|
35
|
-
## Runner (`/unipi:kanboard-autowork start`)
|
|
36
|
-
|
|
37
|
-
One job per session. The **runner owns the lifecycle transitions** the agent is
|
|
38
|
-
not allowed to write:
|
|
39
|
-
|
|
40
|
-
1. `claim-next --session <sid> --pid <ppid> --host <host> --gate <chainGate>` —
|
|
41
|
-
nothing ready → `Nothing ready (N waiting on deps, M blocked)`.
|
|
42
|
-
2. **The task's labels decide how it runs** (`edit <ID> --strategy
|
|
43
|
-
none|goal|ralph|swarm|graph` and `--plan yes|no`; `auto`/unset = jev picks).
|
|
44
|
-
jev gets one `choice` call with only the unset questions (title + body
|
|
45
|
-
≤2000 chars): strategy criteria none/goal/ralph/swarm/graph + plan yes/no.
|
|
46
|
-
jev null → `none` + no plan; the decision is logged to
|
|
47
|
-
`~/.unipi/logs/kanboard.log` with `UNIPI_DEBUG_KANBOARD=1`.
|
|
48
|
-
3. `set-run --mode`, then the task goes to the agent as a user message: title,
|
|
49
|
-
body, last 10 activity entries, each dependency with its status and last note,
|
|
50
|
-
and the rules (block with a comment to ask a question; never write
|
|
51
|
-
`in_review`/`done`/`cancelled`; work only on this task).
|
|
52
|
-
- **plan=yes** → plan mode is entered through workflow's `unipi:plan-enter`
|
|
53
|
-
runner first; approval stays interactive; a discarded plan releases the
|
|
54
|
-
task to Todo with `plan discarded`. The chosen strategy applies to the
|
|
55
|
-
work turn after approval (deferred until `planModeChanged`).
|
|
56
|
-
- **goal** → long-horizon's `unipi:goal-start` runner starts a goal with the
|
|
57
|
-
task as the objective; the goal id is recorded with `set-run --goal` and
|
|
58
|
-
completion is read back with `unipi:goal-status`.
|
|
59
|
-
- **swarm / graph** → long-horizon's `unipi:lh-explicit` runner sets the
|
|
60
|
-
explicit mode for the work turn.
|
|
61
|
-
- **ralph** → `unipi:ralph-start` starts the checklist loop (task title +
|
|
62
|
-
body as the checklist file); with no `- [ ]` items or a failed start it
|
|
63
|
-
falls back to goal, then none.
|
|
64
|
-
4. Run end (a `/plan` settle after the last `agent_end`, once the agent reports
|
|
65
|
-
idle with no queued messages): the task is re-read — if the agent blocked it,
|
|
66
|
-
that is respected and reported (`▣ UNI-12 blocked: <comment>`) and the loop
|
|
67
|
-
continues; otherwise `release --to in_review --comment <last assistant text
|
|
68
|
-
≤500 chars>`. `Esc` (aborted turn) → `release --to todo --comment "interrupted
|
|
69
|
-
by user"` and the loop stops. Session shutdown → `release --to todo` with
|
|
70
|
-
`session ended`.
|
|
71
|
-
5. After each task: `✓ UNI-12 → In Review: <first line>`, then the loop takes
|
|
72
|
-
the next id from the session **queue** (`claim-next --id`; entries that went
|
|
73
|
-
stale are dropped with a notice), falls back to `claim-next` while autowork
|
|
74
|
-
is on, and stops when nothing is ready. The event loop is never blocked.
|
|
75
|
-
|
|
76
|
-
Footer: `▣ UNI-12 · <strategy>[ +plan]` while a task runs. The claimed task is persisted with
|
|
77
|
-
`pi.appendEntry("unipi:kanboard-runner", …)`, so `/reload` or a resume offers to
|
|
78
|
-
resume it or releases it to Todo.
|
|
79
|
-
|
|
80
|
-
## Settings (hub section "Kanboard")
|
|
81
|
-
|
|
82
|
-
| Setting | Default | Notes |
|
|
83
|
-
|---|---|---|
|
|
84
|
-
| `chainGate` | `in_review` | `done` waits for a finished dependency |
|
|
85
|
-
| `idleMin` | `10` | Passed to `serve --idle-min` |
|
|
86
|
-
| `port` | `0` | Passed to `serve --port` (0 = OS-assigned) |
|
|
87
|
-
| `archiveAfterDays` | `0` | > 0 → `archive-sweep --after-days N` on session start (fire and forget) |
|
|
88
|
-
| `openBrowser` | `false` | Open the board in a browser on `open` |
|
|
89
|
-
| `requireAuth` | `false` | Also require the access token on 127.0.0.1 (remote always does) |
|
|
90
|
-
| `keepToken` | `false` | Reuse `<home>/token` across daemon restarts |
|
|
91
|
-
| `queueMax` | `10` | Tasks a session may queue (0 = unlimited); passed to the CLI as `UNIPI_KANBOARD_QUEUE_MAX` |
|
|
92
|
-
| `maxSessions` | `2` | Distinct sessions running tasks per project (`UNIPI_KANBOARD_MAX_SESSIONS`) |
|
|
93
|
-
| `turnAddLimit` | `20` | `add` calls allowed per -do turn or runner task (0 = unlimited) |
|
|
94
|
-
| *actions* | | `Open board…`, `Stop daemon`, `Summary agent command…`, `Rotate access token` |
|
|
95
|
-
|
|
96
|
-
`Summary agent command…` writes through `settings set agent-command` and
|
|
97
|
-
`Rotate access token` runs `rotate-token` — both are **user-only** (actor=agent
|
|
98
|
-
is refused), as are `settings set` calls generally. `settings show` is read-only.
|
|
99
|
-
|
|
100
|
-
## Binary resolution
|
|
101
|
-
|
|
102
|
-
1. `UNIPI_KANBOARD_BIN` (explicit path)
|
|
103
|
-
2. `@pi-unipi/kanboard-<platform>-<arch>/bin/unipi-kanboard[.exe]` (K4 ships these)
|
|
104
|
-
3. the dev build `<repo>/crates/kanboard/target/{release,debug}/unipi-kanboard`
|
|
105
|
-
|
|
106
|
-
Nothing found → every command reports
|
|
107
|
-
`kanboard binary unavailable for <platform>-<arch>` and does nothing else.
|
|
108
|
-
|
|
109
|
-
**Agent bash env:** pi has no extension-level mechanism to add env vars to the
|
|
110
|
-
`bash` tool (only replacing bash via `registerTool` + `BashToolOptions`, which
|
|
111
|
-
would change tool schemas mid-session and break the prefix cache — spec principle
|
|
112
|
-
4 forbids that). So the task prompt and the skill pass `--actor agent --project
|
|
113
|
-
<slug>` explicitly and call the binary by absolute path.
|
|
114
|
-
|
|
115
|
-
## Skill
|
|
116
|
-
|
|
117
|
-
`skills/kanboard/SKILL.md` describes the CLI, the lanes, who may move what, and
|
|
118
|
-
the rules agents must follow. It is a normal pi skill (jev skill-judging can
|
|
119
|
-
reveal it on intent), and `/unipi:kanboard-do` force-reveals it by emitting
|
|
120
|
-
`unipi:skills:reveal`, which utility turns into the usual append-only reveal
|
|
121
|
-
message — the system prompt is never touched.
|
|
122
|
-
|
|
123
|
-
## Platforms and packaging
|
|
124
|
-
|
|
125
|
-
| Platform | npm package | Rust target | Notes |
|
|
126
|
-
|---|---|---|---|
|
|
127
|
-
| Linux x64 | `@pi-unipi/kanboard-linux-x64` | `x86_64-unknown-linux-musl` | static-pie, 3.9 MB |
|
|
128
|
-
| Linux arm64 | `@pi-unipi/kanboard-linux-arm64` | `aarch64-unknown-linux-musl` | static |
|
|
129
|
-
| macOS arm64 | `@pi-unipi/kanboard-darwin-arm64` | `aarch64-apple-darwin` | |
|
|
130
|
-
| macOS x64 | `@pi-unipi/kanboard-darwin-x64` | `x86_64-apple-darwin` | cross-built from macos-14 |
|
|
131
|
-
| Windows x64 | `@pi-unipi/kanboard-win32-x64` | `x86_64-pc-windows-msvc` | |
|
|
132
|
-
|
|
133
|
-
They are **optional dependencies** of this package (`os`/`cpu` gated), so `npm install`
|
|
134
|
-
pulls exactly one. `.github/workflows/kanboard-binaries.yml` builds them (tests +
|
|
135
|
-
clippy on native targets, release build per target, artifact per platform) and, on
|
|
136
|
-
a `v*` tag, attaches the binaries to the GitHub release. Publishing to npm:
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
UniPi installs this package:
|
|
137
23
|
|
|
138
24
|
```bash
|
|
139
|
-
|
|
140
|
-
npm run publish:kanboard # publishes, or skips loudly
|
|
25
|
+
pi install npm:@pi-unipi/unipi
|
|
141
26
|
```
|
|
142
27
|
|
|
143
|
-
|
|
144
|
-
an empty platform package can never be published. CI publishes only when an
|
|
145
|
-
`NPM_TOKEN` secret exists — this repository has none, so the release job attaches
|
|
146
|
-
artifacts and says so.
|
|
147
|
-
|
|
148
|
-
Local packaging proof (no registry, no network):
|
|
28
|
+
To install this package alone:
|
|
149
29
|
|
|
150
30
|
```bash
|
|
151
|
-
|
|
152
|
-
# packs packages/kanboard + the linux-x64 platform package, installs both into a
|
|
153
|
-
# temp node_modules, resolves the binary through src/bin.ts and runs --version
|
|
31
|
+
pi install npm:@pi-unipi/kanboard
|
|
154
32
|
```
|
|
155
33
|
|
|
156
|
-
|
|
34
|
+
npm installs the binary for your platform as an optional package: Linux x64 and arm64, macOS x64 and arm64, and Windows x64.
|
|
157
35
|
|
|
158
|
-
|
|
159
|
-
|
|
36
|
+
1. Run `/unipi:kanboard onboard` to register the project.
|
|
37
|
+
2. Run `/unipi:kanboard-add Fix the flaky login test` to add a task.
|
|
38
|
+
3. Run `/unipi:kanboard open` and open the link that it prints.
|
|
39
|
+
4. Run `/unipi:kanboard-do work the login tasks` to let the agent work them.
|
|
160
40
|
|
|
161
|
-
|
|
162
|
-
ssh -N -L 37473:127.0.0.1:37473 <hostname> # then open http://127.0.0.1:37473
|
|
163
|
-
```
|
|
41
|
+
## Commands
|
|
164
42
|
|
|
165
|
-
|
|
43
|
+
| Command | What it does |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `/unipi:kanboard` | Lists the commands. |
|
|
46
|
+
| `/unipi:kanboard open [--host H] [--port N]` | Starts the board daemon if it does not run, and prints the board link. |
|
|
47
|
+
| `/unipi:kanboard close` | Stops the board daemon. Tasks in progress do not change. |
|
|
48
|
+
| `/unipi:kanboard onboard` | Registers this project. You can run it again with no effect. |
|
|
49
|
+
| `/unipi:kanboard status` | Shows the daemon and the active claims. |
|
|
50
|
+
| `/unipi:kanboard show [--all]` | Shows the board in the chat. |
|
|
51
|
+
| `/unipi:kanboard doctor` | Examines the setup: binary, daemon, project and bind address. |
|
|
52
|
+
| `/unipi:kanboard-add [-p 1-5] [--after ID] [--status backlog\|todo] <title>` | Adds a task. Lines below the title become the description. A file path in the description becomes an attachment. |
|
|
53
|
+
| `/unipi:kanboard-do <request>` | Gives the request to the agent with a task budget. `off` removes the budget. |
|
|
54
|
+
| `/unipi:kanboard-autowork start\|stop` | `start` lets the agent work all ready tasks, one at a time. `stop` stops the offers of new tasks. |
|
|
166
55
|
|
|
167
|
-
|
|
168
|
-
/unipi:kanboard open --host 0.0.0.0 --port 37473 # every interface
|
|
169
|
-
/unipi:kanboard open --host tailscale # the tailnet IPv4
|
|
170
|
-
```
|
|
56
|
+
Priority `-p`: 1 none, 2 low, 3 medium, 4 high, 5 urgent.
|
|
171
57
|
|
|
172
|
-
|
|
173
|
-
only. `tailscale` resolves through `tailscale ip -4` (clear error when tailscale
|
|
174
|
-
is not installed). For a wildcard bind the printed URLs cover the machine
|
|
175
|
-
hostname, every non-internal IPv4 and the tailnet address, and a warning says
|
|
176
|
-
`board is reachable from the network; anyone with the link can edit it`.
|
|
58
|
+
The output of these commands shows in the chat. It does not go into the model context.
|
|
177
59
|
|
|
178
|
-
|
|
179
|
-
writes it to `daemon.json` alongside `host`. Every request must carry it:
|
|
60
|
+
## Task budget
|
|
180
61
|
|
|
181
|
-
-
|
|
182
|
-
the same URL without the parameter (so the token leaves the address bar),
|
|
183
|
-
- the `kb_token` cookie, or
|
|
184
|
-
- `Authorization: Bearer <token>`.
|
|
62
|
+
`/unipi:kanboard-do` gives the agent two budgets:
|
|
185
63
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
`{ok, version}` (no pid) off-loopback, and POSTs are refused when their `Origin`
|
|
189
|
-
does not match the request `Host` (drive-by CSRF), in both modes. Loopback binds
|
|
190
|
-
keep no token at all.
|
|
64
|
+
- **Task slots** (`doTasks`, default 5). Each `start` uses one slot.
|
|
65
|
+
- **Board writes** (`doWrites`, default 10). `add`, `edit`, `link`, `order`, a move between Backlog and Todo, and a `note` on a task of another session each use one write.
|
|
191
66
|
|
|
192
|
-
|
|
193
|
-
host/port, `serve` reports `bindingChanged` and `/unipi:kanboard open` stops the
|
|
194
|
-
old one and starts the new one (`restarted kanboard on 0.0.0.0:37473`). The
|
|
195
|
-
daemon runs no jobs, so nothing is lost.
|
|
67
|
+
Some operations are always free: reads, and `finish`, `move <ID> blocked`, `note` and `attach` on tasks that this session started. The budget stays until the agent uses it. A new `-do` fills the budget again. It does not add to the old budget.
|
|
196
68
|
|
|
197
|
-
|
|
69
|
+
In autowork, the agent has no budget. It can use any mode, for example goal or ralph.
|
|
198
70
|
|
|
199
|
-
|
|
200
|
-
`daemon.lock` for the daemon, and `projects/<slug>/{project.json,board.lock,tasks/*.md,queues/<session>.json}`.
|
|
201
|
-
The extension never edits those files — the binary owns them.
|
|
71
|
+
Subagents and sidekicks can read the board, but cannot write to it. The guard tells them to report to the lead.
|
|
202
72
|
|
|
203
|
-
##
|
|
73
|
+
## Settings
|
|
204
74
|
|
|
205
|
-
|
|
206
|
-
|---|---|
|
|
207
|
-
| `kanboard binary unavailable for <platform>-<arch>` | No `UNIPI_KANBOARD_BIN`, no platform package and no dev build. Build `crates/kanboard` (`cargo build --release`) or set `UNIPI_KANBOARD_BIN`. |
|
|
208
|
-
| The board says *"N task file(s) need repair"* | A file was edited by hand. One bad file no longer blocks the board (it is skipped and reported); run `unipi-kanboard validate --fix`, then `validate`. |
|
|
209
|
-
| `UNI-5 is unreadable: … (line N)` | That task's own file is broken — repair it before moving/noting it. |
|
|
210
|
-
| The daemon looks stale | `unipi-kanboard status` (pid + liveness), then `/unipi:kanboard close`, `unipi-kanboard stop` (SIGTERM, ≤3s) or the hub's **Stop daemon** action. |
|
|
211
|
-
| Nothing is ready | `unipi-kanboard list --ready --json` shows `waitingFor`; a cancelled dependency blocks forever — `link`/`unlink` to re-plan. |
|
|
212
|
-
| The runner prompts for permission on every board call | Fixed in auto mode: `unipi-kanboard … --actor agent` is allow-listed by the permission gate (ask mode still asks). |
|
|
75
|
+
Open `/unipi:settings` → **Kanboard**. The file is `~/.unipi/config/kanboard/config.json`.
|
|
213
76
|
|
|
214
|
-
|
|
77
|
+
| Key | Default | What it does |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| `chainGate` | `in_review` | Status that a dependency must reach before the next task is ready: `in_review` or `done`. The web board uses it. |
|
|
80
|
+
| `idleMin` | `10` | Minutes with no board open before the daemon stops. |
|
|
81
|
+
| `host` | `127.0.0.1` | Bind address. Any other address needs an access token. |
|
|
82
|
+
| `port` | `0` | Daemon port. `0` lets the OS select a port. |
|
|
83
|
+
| `archiveAfterDays` | `0` | Archives done and cancelled tasks after this many days. `0` turns it off. |
|
|
84
|
+
| `retentionDays` | `90` | Moves archived and cancelled tasks to cold storage after this many days. |
|
|
85
|
+
| `openBrowser` | `false` | Opens the board in a browser on `open`. |
|
|
86
|
+
| `requireAuth` | `false` | Asks for the token on `127.0.0.1` too. |
|
|
87
|
+
| `keepToken` | `false` | Uses the same token after a daemon restart. |
|
|
88
|
+
| `maxSessions` | `2` | Number of sessions that can hold In Progress tasks in one project. |
|
|
89
|
+
| `turnAddLimit` | `20` | `add` calls in one turn. `0` means no limit. |
|
|
90
|
+
| `reminders` | `true` | Reminds the agent to `start` a Todo task before it edits files. |
|
|
91
|
+
| `doTasks` | `5` | Task slots that one `-do` gives. |
|
|
92
|
+
| `doWrites` | `10` | Board writes that one `-do` gives. |
|
|
93
|
+
|
|
94
|
+
At session start, Kanboard runs `archive-sweep` when `archiveAfterDays` or `retentionDays` is more than 0.
|
|
95
|
+
|
|
96
|
+
## How it works
|
|
97
|
+
|
|
98
|
+
Kanboard has no task runner. The agent works each task in your session. When a run ends, a monitor on the [turn arbiter](../../docs/architecture/turn-arbiter.md) can add one message to continue:
|
|
99
|
+
|
|
100
|
+
- **Claims** (priority 50). A task that this session started is still In Progress. The monitor asks the agent to continue, finish or block it.
|
|
101
|
+
- **Next task** (priority 40). Autowork is on and a ready task exists. The monitor offers it. When no task is ready, autowork stops.
|
|
102
|
+
|
|
103
|
+
The monitor waits for a [long-horizon](../../docs/architecture/long-horizon.md) owner (priority 100) and for pending events. It stops after you press `Esc` or a run fails. It also stops after 2 runs with no tool calls, after 5 messages for one task, or after 3 offers of one task in autowork.
|
|
104
|
+
|
|
105
|
+
At session start, Kanboard releases claims of dead processes. At session end, it moves the open claims of this session back to Todo. The next start shows a notice about these tasks.
|
|
106
|
+
|
|
107
|
+
## Remote access
|
|
108
|
+
|
|
109
|
+
The daemon listens on `127.0.0.1` by default and needs no token. To use the board from another machine, use an SSH tunnel:
|
|
215
110
|
|
|
216
111
|
```bash
|
|
217
|
-
|
|
112
|
+
ssh -N -L 37473:127.0.0.1:37473 <hostname>
|
|
218
113
|
```
|
|
114
|
+
|
|
115
|
+
You can also bind another address, for example `/unipi:kanboard open --host 0.0.0.0 --port 37473` or `--host tailscale`. Then the daemon makes an access token, and the printed link contains it. Anyone with the link can edit the board.
|
|
116
|
+
|
|
117
|
+
## Troubleshooting
|
|
118
|
+
|
|
119
|
+
| Problem | Fix |
|
|
120
|
+
|---|---|
|
|
121
|
+
| `kanboard binary unavailable for <platform>-<arch>` | Set `UNIPI_KANBOARD_BIN` to the binary path, or build `crates/kanboard` with `cargo build --release`. |
|
|
122
|
+
| The board says that some task files have errors | Run `unipi-kanboard validate --fix`, then `unipi-kanboard validate`. |
|
|
123
|
+
| The daemon does not respond | Run `/unipi:kanboard close`, then `/unipi:kanboard open`. |
|
|
124
|
+
| No task is ready | Run `unipi-kanboard list --ready --json` and read `waitingFor`. A cancelled dependency blocks a task. |
|
|
125
|
+
|
|
126
|
+
## See also
|
|
127
|
+
|
|
128
|
+
- [Kanboard crate: CLI, daemon and JSON API](../../crates/kanboard/README.md)
|
|
129
|
+
- [Turn arbiter](../../docs/architecture/turn-arbiter.md)
|
|
130
|
+
- [Commands reference](../../docs/reference/commands.md)
|