Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ __pycache__/
.omx/
.serena/
data/
worktree/worktrees/
*.pid
*.zip
iii.lock
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ npx skills add iii-hq/iii --all
| [`editor`](editor/) | Rust | A shared code workspace — open buffers, file tree, unified diffs, fuzzy find and conflict-safe saves, held in `state` so an agent and a person see one editor. Files and git go through `shell`; ships a console editor page. |
| [`vscode`](vscode/) | Node | VS Code as an iii worker — `vscode::*` runs the VS Code Server through the `code` CLI per workspace, and a Console page embeds the Workbench for the working directory. |
| [`compose-ui`](compose-ui/) | Node | The compose daemon in the Console — a **Compose** page over `compose::*` with live container state, lifecycle actions, worker packages, and per-container log tails, plus a `compose-ui::changed` trigger type for supervisor changes. |
| [`kanban`](kanban/) | Node | Repository-aware multi-worker Kanban runs — launch Harness and external worker tasks under one root session, isolate them in managed Git worktrees, gate dependencies, review results, and land approved branches from the Console. |
| [`iii-directory`](iii-directory/) | Rust | Engine introspection, workers-registry proxy, filesystem-backed skills, system prompts, and agent profiles, plus one-shot lexical function search — `directory::search_functions` returns compact candidates for the relevant functions (BM25 + coverage pruning, installed + installable-from-registry) and directs callers to batch selected ids through `engine::functions::info`; its search hint is injected at most once per turn. |
| [`lsp`](lsp/) | Rust | Language Server for iii function ids, trigger configs, and worker discovery. Autocomplete / hover across JS/TS, Python, Rust. |
| [`lsp-vscode`](lsp-vscode/) | Node | VS Code extension package `iii-lsp`, embedding the `lsp` server. |
Expand Down
10 changes: 10 additions & 0 deletions iii-permissions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,14 @@ rules:
- '!harness::stop'
- '!harness::on-config-change'
- '!harness::sweep-pending'
# kanban: Console asset delivery and lifecycle sinks are engine plumbing.
# Run/task mutations stay at the needs_approval default; read-only board,
# model, and executor discovery are allowlisted below.
- '!kanban::ui-content'
- '!kanban::on-agent-task'
- '!kanban::on-harness-completed'
- '!kanban::on-session-changed'
- '!kanban::on-worktree-changed'
# eval: durable orchestration internals are trigger/queue targets only.
# Starting, cancelling, and deleting evaluations remain approval-gated by
# the default. Status/result are read-only and the exact evaluator is pure.
Expand Down Expand Up @@ -299,6 +307,8 @@ rules:
- worktree::get
- worktree::status
- worktree::validate
- kanban::executors::list
- kanban::models::list
# editor: the reading half. editor::diff is pure (two strings in, a patch
# out — no I/O at all); the rest read through the shell worker, so they reach
# nothing shell::fs::read and shell::exec could not already reach.
Expand Down
79 changes: 79 additions & 0 deletions kanban/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# kanban

Repository-aware multi-worker runs in the Console. The **Kanban** page combines
a root Harness session, native or external child executors, dependency gates,
isolated Git worktrees, review, and explicit landing in one Kanban board.
Existing Harness conversations with child sessions appear automatically, while
runs created from Kanban receive a real root session so every task remains
visible in the Console's native conversation hierarchy.

Harness and the session manager remain the execution source of truth. Kanban
stores only run definitions, task dispatch metadata, dependencies, workspace
references, and review decisions. The worktree Worker owns Git lifecycle and
status. Reactive triggers keep the page current without another scheduler.

## Install

```bash
iii compose add kanban
```

The page appears in the Console as **Kanban** (`#/ext/kanban`). It discovers
available executors from the live function registry. Harness is supported
natively; workers that expose a `::task` function using the durable
`agent_tasks` result contract are added automatically.

## What the page controls

- Select any live run and open its root Harness conversation.
- Create up to 24 tasks in one run and choose an executor for each task.
- Give every task its own managed worktree and branch, or use one shared directory.
- Gate tasks on reviewed prerequisites, then dispatch them automatically.
- Mix native Harness agents with external task-contract executors under one root.
- Dispatch immediately or hold tasks in Ready.
- Open the child session or a Shell rooted in the task worktree.
- Stop supported running tasks, retry failed tasks, and accept reviewed work.
- Inspect live Git status and explicitly queue reviewed work for serialized landing.
- Observe existing parent and child Harness sessions without importing or
duplicating them.

## Functions

| Function | Purpose |
|---|---|
| `kanban::board` | Return runs, tasks, executor topology, managed-worktree Git status, and capabilities. |
| `kanban::executors::list` | List currently available Harness and task-contract executors. |
| `kanban::runs::create` | Create a root session plus one or more durable tasks, optionally dispatching them immediately. |
| `kanban::tasks::dispatch` | Dispatch a Ready or attention-blocked task. |
| `kanban::tasks::retry` | Retry an attention-blocked task, preserving the claimed session for a managed worktree. |
| `kanban::tasks::stop` | Stop a running task when its executor exposes a stop function. |
| `kanban::tasks::accept` | Move a reviewed task to Done. |
| `kanban::tasks::land` | Queue a reviewed task's worktree for tested, serialized landing. |

## Reactive updates

Bind `kanban::changed` with an empty config and re-read `kanban::board` when it
fires. The trigger is emitted for Kanban state writes and relevant session
creation, status, and metadata events.

```ts
iii.registerTrigger({
type: 'kanban::changed',
function_id: 'my-worker::on-kanban-change',
config: {},
})
```

## Run from source

```bash
pnpm install
pnpm test
pnpm typecheck
pnpm build
III_URL=ws://127.0.0.1:49134 III_NAMESPACE=my-project pnpm start
```

A standalone process must use the same namespace as the Console and Harness.
Set `III_KANBAN_UI_WATCH=1` to serve page assets from `ui/dist` while developing
the injected UI.
11 changes: 11 additions & 0 deletions kanban/iii-permissions.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
version: 1

rules:
- '!kanban::ui-content'
- '!kanban::on-agent-task'
- '!kanban::on-harness-completed'
- '!kanban::on-session-changed'
- '!kanban::on-worktree-changed'
- '!kanban::board'
- kanban::executors::list
- kanban::models::list
20 changes: 20 additions & 0 deletions kanban/iii.worker.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
iii: v1
name: kanban
language: javascript
deploy: bundle
manifest: package.json
license: Apache-2.0
tags: [kanban, workers, tasks, runs, console, ui]
description: Repository-aware multi-worker runs with Harness sessions, isolated worktrees, and Git review.

runtime:
kind: javascript

scripts:
start: node ./index.mjs

dependencies:
console: "^1.9.11"
state: "^0.22.2"
harness: "^1.8.5"
worktree: "^0.3.4-rc.1"
31 changes: 31 additions & 0 deletions kanban/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"name": "kanban",
"version": "0.1.0",
"private": true,
"description": "Repository-aware multi-worker runs with Harness sessions, isolated worktrees, and Git review.",
"license": "Apache-2.0",
"type": "module",
"engines": {
"node": ">=22"
},
"packageManager": "pnpm@11.13.1",
"scripts": {
"build": "pnpm --dir ui build && node scripts/build-bundle.mjs",
"build:bundle": "node scripts/build-bundle.mjs",
"lint": "biome check .",
"lint:fix": "biome check --write .",
"typecheck": "tsc -p tsconfig.json --noEmit && pnpm --dir ui typecheck",
"test": "vitest run",
"start": "node dist/bundle/index.mjs"
},
"dependencies": {
"iii-sdk": "0.22.1-alpha.25"
},
"devDependencies": {
"@biomejs/biome": "2.4.10",
"@types/node": "^22.10.0",
"esbuild": "^0.25.0",
"typescript": "^5.9.2",
"vitest": "^3.0.0"
}
}
Loading
Loading