kandown 0.34.3 → 0.35.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.35.1 — 2026-07-26 — "Light Identity"
4
+
5
+ ### Added
6
+
7
+ - **Homepage video storyboard**: Replaced the hand-built board and terminal mocks with black recording frames that specify the exact scenario, duration, aspect ratio, and filename for six real product clips: the hero workflow, a two-agent handoff, Markdown-to-board synchronization, and dedicated Web, TUI, and CLI demonstrations. The three interface briefs share one interactive tabbed stage so the final page will never autoplay three videos at once.
8
+
9
+ ### Changed
10
+
11
+ - **Agent-first homepage narrative**: Reordered and rewrote the landing page around long-running work that survives agent sessions, durable Markdown ownership, completion reports, handoffs, and one shared board across the Web UI, TUI, and CLI. The feature grid, final call to action, shared metadata, footer, and recording documentation now follow the same product promise.
12
+ - **One permanent light website identity**: The marketing and documentation website now uses a single warm light palette regardless of the device preference. Native controls declare `color-scheme: light`, browser chrome uses a fixed white theme color, syntax highlighting emits only the GitHub Light palette, and the animated hero shader uses one documented color path.
13
+ - **Light embedded demo**: The in-browser demo project now starts explicitly in light mode rather than inheriting `prefers-color-scheme`, keeping the transition from the website into the real Kandown application visually consistent while installed projects retain the full product theme system.
14
+ - **Video production guide**: Expanded the website README with the six expected WebM filenames, target durations, 16:10 recording dimensions, loop guidance, and the exact actions to capture in every clip.
15
+
16
+ ### Removed
17
+
18
+ - **Website dark-mode runtime**: Removed the header theme toggle, localStorage preference, pre-paint theme script, OS dark-mode listeners, `data-theme` selectors, dark CSS tokens, dual Shiki palette, shader theme observer, and View Transition wipe. A device can no longer select a different visual identity for the site.
19
+
20
+ ## 0.35.0 — 2026-07-25 — "House Green"
21
+
22
+ - **Added**: **Kandown finally has its own theme, and it is the default** — a `kandown` preset built from the brand palette registered on the website: `#88E138` brand lime (the logo arrow) as the dark-mode primary, `#7AD12A` as its light-background variant, `#0CE931` (the hero shader green) reused as the `success` token, `#F1FFB8` for accent surfaces and `#EBEBEB` for neutral borders, on 4px radius to match the website. Because lime cannot carry white text at any usable contrast, `primary-foreground` is a near-black green in both modes (7.9:1 light, 11.2:1 dark) rather than the usual white. Every other foreground/background pair passes WCAG AA in both modes.
23
+ - **Fixed**: **The default skin silently resolved to Vercel** — `DEFAULT_CONFIG.ui.skin` already read `'kandown'`, but `LEGACY_SKIN_MAP` still aliased `kandown` to `vercel` from before the FABLE_UI theme system, so every fresh project opened in monochrome instead of the brand colors. The alias is gone, the preset now sits first in `THEME_PRESETS` (and is therefore the `[0]` fallback for an unknown id), and `normalizeSkinId` falls back to `kandown` instead of `vercel`.
24
+ - **Changed**: **Website hero rewritten** — the technical breadcrumb (Local-first / MIT / Node / npm) is replaced by a short free, open-source, local promise, and the headline is reframed around Markdown tasks built for AI agents, long-running work, and the web/TUI/CLI trio. The shared tagline and description used for SEO and machine-readable docs were aligned with it.
25
+ - **Added**: **Demo mode** — a third backend for the web UI that answers the Kandown REST API from an in-memory `Map` instead of a disk, so the whole application can run in a browser tab with no CLI, no server and no storage. It plugs in at `apiFetch` (`src/lib/filesystem.ts`) via `registerDemoApi()`, which is why the board, drawer, editor, search, archive and drag-and-drop all work without knowing anything changed — nothing is mocked. Built with `pnpm build:demo`, which also drops `vite-plugin-singlefile` in favour of a normal chunked build. The entire feature is compiled out of the bundle `npx kandown` ships, behind the `__KANDOWN_DEMO_BUILD__` define.
26
+ - **Fixed**: **Header task counter rendered `[object Object] tasks`** — `useAnimatedNumber` returns a Motion `MotionValue`, which has to be rendered by a `motion.*` component that subscribes to it; wrapping it in `String()` stringified the object itself. Every user of the web board saw this on every screen.
27
+ - **Fixed**: **Repository root could open as a project named `templates`** — implicit project resolution now checks the current directory and walks upward for the nearest valid `.kandown/kandown.json` instead of recursively scanning child directories. This keeps the live board anchored to the canonical root `.kandown/` + `tasks/` layout, works from nested paths such as `src/`, and prevents packaged init assets under `templates/` from being mistaken for a project.
28
+ - **Changed**: **Removed downward child-project auto-discovery** — launching Kandown from a directory above a project no longer guesses which descendant board to open. Run it inside the intended project (or one of its subdirectories), or pass an explicit `--path`, for deterministic selection.
29
+ - **Cleaned**: Removed accidentally committed `templates/daemon.json` runtime state and `templates/kandown.html` generated output. The configuration, documentation, and welcome-task seeds required by `kandown init` remain in `templates/`.
30
+
3
31
  ## 0.34.3 — 2026-07-24 — "Motion Polish — Drag Fix"
4
32
 
5
33
  - **Fixed**: **Cards could not be dragged between columns after the v0.34.2 motion polish** — the `motion.div` → plain `<div>` replacement in `Card.tsx` accidentally dropped the `draggable` HTML5 attribute and the `{...dragHandlers}` spread that wire `onDragStart` / `onDragEnd` on each card. Without `draggable` the native HTML5 drag event never fired, so the board could not move tasks between columns even though the click-to-open drawer still worked. Restores `draggable` and `dragHandlers` on the card container; no other behavior changes.
@@ -356,8 +384,8 @@
356
384
 
357
385
  ## 0.15.0 — 2026-07-07 — "Boot Splash"
358
386
 
359
- - **Added**: **Boot splash** — au lancement du projet, le titre `kandown` + badge `v<version>` reste affiché pendant 5 secondes, puis fond en fade-out pour ne laisser que le logo. Le nom du projet ouvert prend ensuite sa place comme titre de page du header, avec une transition douce.
360
- - **Added**: **Document title dynamique** — l'onglet du navigateur reflète désormais le projet courant (`<Projet> · Kandown`) au lieu d'un titre statique.
387
+ - **Added**: **Boot splash** — on project launch, the `kandown` title and a `v<version>` badge stay on screen for 5 seconds, then fade out to leave only the logo. The name of the open project then takes its place as the header's page title, with a soft transition.
388
+ - **Added**: **Dynamic document title** — the browser tab now reflects the current project (`<Project> · Kandown`) instead of a static title.
361
389
 
362
390
  ## 0.14.1 — 2026-07-07 — "Resilience Pass"
363
391
 
package/README.md CHANGED
@@ -6,8 +6,8 @@
6
6
 
7
7
  <p align="center">
8
8
  <strong>Too Many Ideas, Not Enough Agents.</strong><br>
9
- Kandown helps you queue tasks in an elegant and clever way — file-based Kanban backed by plain Markdown.<br>
10
- Zero backend · Zero database · No account · AI-agent friendly
9
+ A local-first Kanban board where every task is a Markdown file you own forever.<br>
10
+ Zero backend · Zero database · No account · Built for working alongside AI agents
11
11
  </p>
12
12
 
13
13
  <p align="center">
@@ -17,230 +17,224 @@
17
17
  <img src="https://img.shields.io/badge/local--first-100%25-orange" alt="100% local-first">
18
18
  </p>
19
19
 
20
- ---
21
-
22
- ## Description
23
-
24
- Kandown is a **local-first Kanban board** where your tasks live as plain Markdown files. No cloud, no account, no vendor lock-in — just a `.kandown/` folder in your project that you own forever.
25
-
26
- - **Your data is portable** — tasks are `.md` files versioned with git, readable by any text editor or AI agent
27
- - **AI-agent friendly** — Claude, Codex, Gemini, Goose, Aider, and OpenCode can read and update tasks directly
28
- - **Dual interface** — a polished web UI + a full terminal TUI, both running entirely offline
29
- - **Single-file deployment** — `kandown.html` is a self-contained app you can open in any browser
20
+ <p align="center">
21
+ <a href="#quick-start">Quick start</a> ·
22
+ <a href="#for-ai-agents">For AI agents</a> ·
23
+ <a href="#cli-reference">CLI</a> ·
24
+ <a href="#features">Features</a> ·
25
+ <a href="#contributing">Contributing</a>
26
+ </p>
30
27
 
31
28
  ---
32
29
 
33
- ## Installation
30
+ ## What it is
34
31
 
35
- ```bash
36
- npm install -g kandown
37
- ```
32
+ Kandown drops a `tasks/` folder into your project and gives you three ways to work
33
+ with it: a polished web board, a full terminal UI, and a scriptable CLI. All three
34
+ read and write the same plain Markdown files.
38
35
 
39
- **Requirements:** Node.js 18+
36
+ - **Your data is just files.** One `.md` per task, versioned in git, readable by any
37
+ editor, any script, any AI agent. Nothing to export, nothing to lose.
38
+ - **Agents are first-class users**, not an integration. Claude Code, Codex, Gemini
39
+ CLI, Goose, Aider and OpenCode all drive the board directly.
40
+ - **Fully offline.** No account, no cloud, no telemetry. The web UI is one
41
+ self-contained HTML file you can open anywhere.
40
42
 
41
43
  ---
42
44
 
43
- ## Usage
44
-
45
- ### Initialize in any project
45
+ ## Quick start
46
46
 
47
47
  ```bash
48
+ npm install -g kandown # Node.js 18+
48
49
  cd my-project
49
50
  kandown init
51
+ kandown
50
52
  ```
51
53
 
52
- This creates two folders at your project root:
54
+ `kandown init` creates two folders at your project root:
53
55
 
54
56
  ```
57
+ tasks/ # your tasks — the source of truth
58
+ ├── t1.md # one Markdown file per task
59
+ └── archive/ # archived tasks live here
60
+
55
61
  .kandown/ # config + web UI + agent docs
56
- ├── kandown.html # Single-file web app
57
- ├── kandown.json # Project config (columns, appearance)
58
- ├── AGENT.md # AI-agent quick reference
59
- └── AGENT_KANDOWN.md # Full agent reference
60
-
61
- tasks/ # Task files (source of truth)
62
- ├── t1.md # One .md file per task
63
- └── archive/ # Archived tasks live here
62
+ ├── kandown.json # columns, theme, notifications, agents
63
+ ├── kandown.html # the web app, one self-contained file
64
+ ├── instructions.md # optional: your project's agent instructions
65
+ └── AGENT*.md # agent reference, kept in sync with the CLI
64
66
  ```
65
67
 
66
- > **Layout note:** tasks live at the project root in `./tasks/`, not inside
67
- > `.kandown/`. This keeps config and data cleanly separated. If you're
68
- > upgrading from an older version with tasks in `.kandown/tasks/`, the CLI
69
- > will move them automatically the first time you run it — nothing to do.
68
+ `kandown` then starts a small local daemon and opens both a **web board** in your
69
+ browser and a **terminal UI** in your shell. The daemon outlives the TUI, so the
70
+ browser keeps working after you quit — stop it with `d` in the TUI or
71
+ `kandown daemon stop`.
70
72
 
71
- ### Launch the board
73
+ Tasks live at your project root rather than inside `.kandown/` so that config and
74
+ data stay cleanly separated. Upgrading from an older layout? The CLI moves them for
75
+ you on first run.
72
76
 
73
- ```bash
74
- kandown
75
- ```
77
+ ---
76
78
 
77
- This starts a per-project local web daemon, then opens:
78
- - A **web UI** in your browser (board view, list view, task editor)
79
- - A **terminal TUI** for keyboard-driven workflow (works over SSH, no browser needed)
79
+ ## For AI agents
80
80
 
81
- The web daemon stays alive after you quit the TUI so the browser keeps working. Stop or restart it anytime from the TUI with `d`, or from the CLI with `kandown daemon stop`.
81
+ This is the part that makes kandown different, so it is worth two minutes.
82
82
 
83
- ### CLI Commands
83
+ ### One command for context
84
84
 
85
- | Command | Description |
86
- |---|---|
87
- | `kandown` | Launch web UI + board TUI |
88
- | `kandown init` | Initialize in current project |
89
- | `kandown board` | TUI only (no browser) |
90
- | `kandown settings` | Terminal settings editor |
91
- | `kandown daemon status` | Show this project's web daemon status |
92
- | `kandown daemon start` | Start/reconnect this project's web daemon |
93
- | `kandown daemon stop` | Stop this project's web daemon |
94
- | `kandown daemon refresh-all` | Refresh open projects and restart outdated daemons with the current CLI version |
95
- | `kandown update` | Update `kandown.html` to latest |
96
- | `kandown list` \| `show` \| `create` \| `move` \| `assign` \| `commit` | One-shot task commands (see below) |
97
- | `kandown tasks` | Full help for the one-shot task commands |
98
- | `kandown work` | **For AI agents:** print the agent rules + a live board digest (see below) |
99
- | `kandown help` | CLI help |
85
+ ```bash
86
+ kandown work
87
+ ```
100
88
 
101
- ### One-shot task commands (scriptable, agent-friendly)
89
+ That prints, as plain Markdown on stdout:
102
90
 
103
- Top-level, non-interactive commands for scripting, CI, and AI agents — no wrapper prefix, just `kandown <command>`. Every command auto-inits `.kandown/` on first use, same as the interactive CLI.
91
+ 1. **The agent rules** served from the installed CLI, so they are never a stale
92
+ copy frozen into your repo at init time.
93
+ 2. **Your project instructions** — optional, from `.kandown/instructions.md`. Stack
94
+ quirks, "always use pnpm", commit-message language, token-efficiency
95
+ preferences.
96
+ 3. **A live board digest** — column counts, tasks per column with blocked-by
97
+ annotations, and a computed **next actionable task** (unblocked, closest to done,
98
+ highest priority).
104
99
 
105
- | Command | Description |
106
- |---|---|
107
- | `kandown list` | List tasks — `[-s status] [-a assignee] [-t tag] [-p priority] [--archived] [--json]` |
108
- | `kandown show <id>` | Print a task file's raw content |
109
- | `kandown create "title"` | Create a task — `[-p priority] [-a assignee] [-t tag ...] [--to status] [--id custom-id] [--json]` |
110
- | `kandown move <id> <status>` | Move a task — `<status>` is a column name or `"archived"` |
111
- | `kandown assign <id> [name]` | Assign a task (omit name to unassign) |
112
- | `kandown commit [-m "message"]` | `git add tasks/ .kandown/kandown.json` + `git commit` |
100
+ One call, full context. `kandown init` adds a single line to your `AGENTS.md` /
101
+ `CLAUDE.md` pointing at it — no block of rules copied in to go stale.
102
+
103
+ The Settings page has an **Agent `kandown work` output** configurator: toggle each
104
+ block, switch to a concise token-efficient mode, hide digest fields, see an
105
+ estimated token count, or take full control with a raw template using
106
+ `{{baseRules}}`, `{{projectInstructions}}` and `{{boardDigest}}`.
107
+
108
+ ### Scriptable, composable, offline
113
109
 
114
110
  ```bash
115
111
  kandown list --json | jq '.[] | select(.priority=="P1")'
116
- kandown create "Refactor auth middleware" -p P1 -t backend
117
- kandown move t42 Done
118
- kandown assign t42 alice
112
+ ID=$(kandown create "Refactor auth middleware" -p P1 -t backend)
113
+ kandown move "$ID" Done
119
114
  kandown commit -m "tasks: add auth refactor"
120
115
  ```
121
116
 
122
- **Output contract:** stdout carries data only (task ids, JSON, tables) — everything decorative (`✓ Created…`, warnings, errors) goes to stderr. This keeps `ID=$(kandown create "...")` and `kandown list --json | jq ...` clean and composable. Exit code `0` on success, non-zero on error — safe to check in scripts.
117
+ **Output contract:** stdout carries data only ids, JSON, tables. Everything
118
+ decorative (`✓ Created…`, warnings, errors) goes to stderr. So `$(kandown create
119
+ …)` captures exactly one id, and `--json | jq` never chokes on a checkmark. Exit
120
+ code `0` on success, non-zero on failure.
123
121
 
124
- **No update checks:** the task commands and `kandown daemon` never touch the npm registry, so they stay fast and fully offline-capable — ideal for CI and for AI agents driving the board directly.
122
+ **No network, ever.** The task commands and `kandown daemon` never contact the npm
123
+ registry, so they stay instant and work offline — ideal for CI and for agents in a
124
+ loop.
125
125
 
126
- ### `kandown work` — the agent entrypoint
126
+ ### MCP
127
127
 
128
- `kandown init` no longer copies a block of rules into your `AGENTS.md`/`CLAUDE.md` — it appends a single line instead:
128
+ ```bash
129
+ kandown mcp # stdio MCP server
130
+ claude mcp add kandown -- kandown mcp
131
+ ```
129
132
 
130
- > This project uses **kandown** for task management. **Always run `kandown work` when starting a new task** — it prints the current rules and board state, kept in sync with the installed CLI version.
133
+ ### Launching agents from the board
131
134
 
132
- Running `kandown work` prints, as plain markdown on stdout:
135
+ Press `a` on any task in the terminal UI to hand it to an agent:
133
136
 
134
- 1. **The agent rules** always fresh, served straight from the installed CLI version instead of a copy that goes stale the moment the package updates.
135
- 2. **Project instructions** (optional) — `.kandown/instructions.md`, this project only (stack quirks, "always use pnpm", commit message language, token-efficient agent preferences, etc).
136
- 3. **A live board digest** column counts, tasks per column with blocked-by annotations, and a computed **"next actionable task"** (closest to done, unblocked, highest priority) — so the agent gets its context in the same call.
137
+ | Agent | Binary | Launch mode |
138
+ |---|---|---|
139
+ | Claude Code | `claude` | interactive session |
140
+ | OpenAI Codex | `codex` | interactive session |
141
+ | Gemini CLI | `gemini` | `-p` initial prompt |
142
+ | Goose | `goose` | `run --text`, non-interactive |
143
+ | Aider | `aider` | `--message` initial prompt |
144
+ | OpenCode | `opencode` | TUI, context written to `/tmp` |
137
145
 
138
- The Settings page includes an **Agent → kandown work output** configurator. You can toggle each generated block, switch the base rules to a concise token-efficient mode, hide detailed digest fields, see an estimated token count, or use **Raw template** mode to control the complete output with `{{baseRules}}`, `{{projectInstructions}}`, and `{{boardDigest}}` variables.
146
+ Or point kandown at your own tooling with `KANDOWN_AGENT_HOOK_URL` and let any
147
+ IDE, bot or webhook receive tasks.
139
148
 
140
- Kandown keeps generated agent reference docs inside `.kandown/` only. If `.kandown/AGENT_KANDOWN.md` is missing, malformed, or an outdated generated copy, the CLI recreates it from the installed package template. Custom behavior belongs in `.kandown/instructions.md` and `.kandown/kandown.json`, not in project-root agent files.
149
+ ---
141
150
 
142
- This removes the drift problem of a rules block frozen into every project's `AGENTS.md` at init time, keeps the injected footprint to one line, and lets you layer project instructions without touching the agent file at all.
151
+ ## CLI reference
143
152
 
144
- > **Upgrading from before v0.18.0?** `kandown shell <cmd>` was removed (no alias) — the commands are now top-level: `kandown list/show/create/move/assign/commit`. Existing projects keep their old `AGENTS.md`/`CLAUDE.md` block until you re-run `kandown init`. The CLI prints a one-time notice about this the next time you run an interactive command after updating — see [Environment variables](#environment-variables) if you want to silence version-check output entirely.
153
+ ### Interactive
145
154
 
146
- ---
155
+ | Command | Description |
156
+ |---|---|
157
+ | `kandown` | Web UI + terminal board |
158
+ | `kandown init` | Initialize in the current project |
159
+ | `kandown board` | Terminal UI only, no browser |
160
+ | `kandown settings` | Terminal settings editor |
161
+ | `kandown doctor` | Diagnose config, daemon, ports, task frontmatter |
162
+ | `kandown help` | Full help |
147
163
 
148
- ## Environment variables
164
+ ### Tasks — non-interactive, agent- and CI-friendly
149
165
 
150
- | Variable | Effect |
166
+ | Command | Description |
151
167
  |---|---|
152
- | `KANDOWN_NO_UPDATE=1` | Disable the background auto-update check entirely (recommended for CI) |
153
- | `KANDOWN_DEBUG=1` | Print full stack traces on unexpected errors instead of a one-line summary |
154
- | `KANDOWN_AGENT_HOOK_URL` | POST endpoint that receives tasks sent via the "Send to Agent" button / TUI `g` key |
155
- | `KANDOWN_AGENT_HOOK_LABEL` | Custom label for the agent hook button (default: `Agent`) |
156
- | `KANDOWN_AGENT_HOOK_HEADERS` | JSON object of extra HTTP headers to send with the agent hook request |
168
+ | `kandown list` | List tasks `[-s status] [-a assignee] [-t tag] [-p priority] [--archived] [--json]` |
169
+ | `kandown show <id>` | Print a task file's raw content |
170
+ | `kandown create "title"` | Create `[-p priority] [-a assignee] [-t tag …] [--to status] [--id custom-id] [--json]` |
171
+ | `kandown move <id> <status>` | Move to a column, or to `archived` |
172
+ | `kandown assign <id> [name]` | Assign, or unassign by omitting the name |
173
+ | `kandown commit [-m msg]` | `git add tasks/ .kandown/kandown.json` + commit |
174
+ | `kandown export` / `import` | JSON / CSV out, Trello JSON or Markdown in |
157
175
 
158
- Interactive runs of `kandown` check npm for updates at most once every 24 hours (never for the task commands or `daemon`, never when stdout isn't a terminal) and auto-install silently when one is found.
176
+ ### Daemon & maintenance
177
+
178
+ | Command | Description |
179
+ |---|---|
180
+ | `kandown daemon status\|start\|stop` | Manage this project's web daemon |
181
+ | `kandown daemon refresh-all` | Restart outdated daemons on the current CLI version |
182
+ | `kandown projects` | List every open kandown project on this machine |
183
+ | `kandown update` | Update the CLI and the project's `kandown.html` |
159
184
 
160
185
  ---
161
186
 
162
- ## Security notes
187
+ ## Features
163
188
 
164
- - The local web daemon binds to `127.0.0.1` only and issues a random per-project API token on startup (stored in the gitignored `.kandown/daemon.json`, injected into the served page). Every API route except the read-only `GET /api/daemon` identity check requires it — a stray browser tab on another site can't read or write your tasks through it.
165
- - `.kandown/daemon.json` and `.kandown/daemon.lock` are runtime-only files; `kandown init` adds them to `.kandown/.gitignore` automatically.
189
+ ### Board & views
166
190
 
167
- ---
191
+ Horizontal kanban with drag-and-drop · sectioned list view with filters and search ·
192
+ full-text search across titles, bodies, subtasks, tags, assignee and priority ·
193
+ command palette (`⌘K`) · freely editable columns · group-by
194
+ (priority / assignee / epic) · due-date banner · guarded double-click deletion ·
195
+ bulk archive or delete of a whole column.
168
196
 
169
- ## Features
197
+ ### Tasks
170
198
 
171
- ### Board & Views
199
+ WYSIWYG Markdown editor · subtask checklists with per-step descriptions, reports and
200
+ keyboard reordering · priority, assignee, tags, due date, epic, owner type ·
201
+ `depends_on` dependencies with a gate that refuses to close a blocked task ·
202
+ human/agent owner filtering · quick-add syntax
203
+ (`Fix login p1 #backend @chacha due:friday`) · task templates ·
204
+ external-change detection.
172
205
 
173
- | Feature | Description |
174
- |---|---|
175
- | Board view | Horizontal kanban with drag-and-drop |
176
- | List view | Sectioned vertical list with filters, search, and drag-and-drop between statuses |
177
- | Content search | Search titles, body, subtasks, tags, assignee, priority |
178
- | Command palette | `⌘K` / `Ctrl+K` for quick actions |
179
- | Custom columns | Add, rename, delete columns freely |
180
- | Guarded deletion | Double-click to delete — no accidents |
181
- | Terminal bulk actions | Archive or permanently delete every task in the terminal column with confirmation |
206
+ ### Appearance
182
207
 
183
- ### Task Management
208
+ **38 built-in themes** (Vercel, Linear, Claude, Apple, Stripe, Catppuccin, Dracula,
209
+ Nord, Terminal, Synthwave and more) plus custom themes defined in JSON · light /
210
+ dark / auto · tokenised radius, shadows, density and motion · 5 font stacks ·
211
+ animated WebGL background · **48 languages** · browser and sound notifications.
184
212
 
185
- | Feature | Description |
186
- |---|---|
187
- | Rich task drawer | WYSIWYG markdown editor for title, metadata, subtasks, body |
188
- | Subtasks | Full checklist with progress tracking on cards |
189
- | Subtask editor | Add, reorder-by-keyboard, check off, remove, and edit per-step descriptions and reports |
190
- | Metadata fields | Priority, assignee, tags, due date, owner type |
191
- | Owner filtering | Filter human vs AI-agent tasks separately |
192
- | External-change detection | Warns when files are modified outside the app |
213
+ ### Terminal UI
193
214
 
194
- ### Appearance & UX
215
+ Keyboard-driven and mouse-aware, works over SSH with no browser.
195
216
 
196
- | Feature | Description |
217
+ | Key | Action |
197
218
  |---|---|
198
- | 5 built-in skins | Kandown, Graphite, Sage, Cobalt, Rose |
199
- | Theme modes | Auto (system), Light, Dark |
200
- | 5 font stacks | Inter, System, Serif, Mono, Rounded |
201
- | Animated backgrounds | WebGL fluid simulation (LiquidEther) |
202
- | 48 languages | Full i18n support |
203
- | Notifications | Browser + sound alerts for status changes, edits, completions |
219
+ | `j`/`k`, `h`/`l` | Navigate tasks / columns |
220
+ | `n` · `e` · `m` | New task · edit in `$EDITOR` · move |
221
+ | `/` · `f` | Fuzzy search · cycle filters |
222
+ | `a` · `g` | Launch an agent · send to agent hook |
223
+ | `x` · `D` | Archive · delete |
224
+ | `d` · `r` · `?` | Toggle daemon · reload · cheatsheet |
204
225
 
205
- ### AI Agent Integration
226
+ Drag a task with the mouse to move it between columns.
206
227
 
207
- Press `a` in the board TUI to launch an AI agent on any task. Supported agents:
208
-
209
- | Agent | Binary | Launch mode |
210
- |---|---|---|
211
- | Claude Code | `claude` | Interactive session |
212
- | OpenAI Codex | `codex` | Interactive session |
213
- | Gemini CLI | `gemini` | `-p` flag for initial prompt |
214
- | Goose | `goose` | `run --text` for non-interactive |
215
- | Aider | `aider` | `--message` for initial prompt |
216
- | OpenCode | `opencode` | TUI, context written to `/tmp` |
228
+ ### Web shortcuts
217
229
 
218
- ### Keyboard Shortcuts
230
+ `⌘K` palette · `⌘1`/`⌘2` board/list · `N` new · `R` reload · `/` search ·
231
+ `⌘S` save · `⌘⌫` delete · `Esc` close.
219
232
 
220
- | Shortcut | Action |
221
- |---|---|
222
- | `⌘K` / `Ctrl+K` | Command palette |
223
- | `⌘1` / `Ctrl+1` | Board view |
224
- | `⌘2` / `Ctrl+2` | List view |
225
- | `N` | New task |
226
- | `R` | Reload from disk |
227
- | `/` | Focus search |
228
- | `Esc` | Close drawer / palette |
229
- | `⌘S` / `Ctrl+S` | Save task |
230
- | `⌘⌫` / `Ctrl+Backspace` | Delete task (with confirmation) |
231
-
232
- ### TUI extras
233
-
234
- | Shortcut / gesture | Action |
235
- |---|---|
236
- | `d` | Start/stop the per-project web daemon |
237
- | Mouse drag task | Move a task between columns in the terminal |
238
- | `m` | Open the focused task context menu |
239
- | `r` | Reload board from disk |
233
+ ---
240
234
 
241
- ### Data Model
235
+ ## The data model
242
236
 
243
- Each task is a standalone Markdown file:
237
+ One task, one file, no index:
244
238
 
245
239
  ```markdown
246
240
  ---
@@ -250,6 +244,7 @@ status: Todo
250
244
  priority: P1
251
245
  tags: [backend, security]
252
246
  assignee: chacha
247
+ depends_on: [t7]
253
248
  created: 2026-04-10
254
249
  ---
255
250
 
@@ -259,50 +254,85 @@ created: 2026-04-10
259
254
  Why this task exists.
260
255
 
261
256
  ## Subtasks
262
- - [ ] Set up OAuth provider
263
257
  - [x] Create user model
264
- - [ ] Add session middleware
258
+ report: Added src/models/user.ts with the schema and migrations.
259
+ - [ ] Set up OAuth provider
265
260
  ```
266
261
 
262
+ | Field | Meaning |
263
+ |---|---|
264
+ | `status` | Board column, from `board.columns` in `kandown.json` |
265
+ | `order` | Sort position within the column |
266
+ | `priority` | `P1`–`P4` |
267
+ | `tags`, `assignee` | Free-form labels, username or agent name |
268
+ | `ownerType` | `human` or `ai` — drives owner filtering |
269
+ | `depends_on` | Task ids blocking this one; moving to the terminal column is refused while any is unresolved |
270
+ | `report` | Completion summary in Markdown, shown prominently in the UI |
271
+
267
272
  ---
268
273
 
269
- ## Contributing
274
+ ## Configuration
270
275
 
271
- Contributions are welcome! Please read the existing code style and conventions before submitting PRs.
276
+ ### Environment variables
272
277
 
273
- ### Development Setup
278
+ | Variable | Effect |
279
+ |---|---|
280
+ | `KANDOWN_NO_UPDATE=1` | Disable the background update check (recommended in CI) |
281
+ | `KANDOWN_DEBUG=1` | Print full stack traces instead of a one-line summary |
282
+ | `KANDOWN_AGENT_HOOK_URL` | Endpoint that receives tasks from "Send to Agent" / TUI `g` |
283
+ | `KANDOWN_AGENT_HOOK_LABEL` | Custom label for the agent hook button |
284
+ | `KANDOWN_AGENT_HOOK_HEADERS` | JSON object of extra headers for the hook request |
285
+
286
+ Interactive runs check npm for updates at most once every 24 hours — never for the
287
+ task commands, never for `daemon`, never when stdout is not a terminal — and install
288
+ silently when one is found.
289
+
290
+ ### Security
291
+
292
+ The local daemon binds to `127.0.0.1` only and mints a random per-project API token
293
+ at startup, stored in the gitignored `.kandown/daemon.json` and injected into the
294
+ page it serves. Every route except the read-only `GET /api/daemon` identity check
295
+ requires it, so an unrelated browser tab cannot reach your tasks by scanning
296
+ localhost ports. Task ids are validated before they touch the filesystem.
297
+
298
+ ---
299
+
300
+ ## Contributing
301
+
302
+ Contributions are welcome.
274
303
 
275
304
  ```bash
276
305
  git clone https://github.com/vava-nessa/kandown.git
277
306
  cd kandown
278
- pnpm install
279
- pnpm dev # Web UI at localhost:5176
307
+ pnpm install # also installs the git hooks
308
+ pnpm dev # web UI at localhost:5176
280
309
  ```
281
310
 
282
- ### Scripts
311
+ Before your first change, read — in this order:
283
312
 
284
- | Script | Description |
313
+ | Document | What it gives you |
285
314
  |---|---|
286
- | `pnpm dev` | Vite dev server for web UI |
287
- | `pnpm dev:cli` | Watch-mode build for CLI TUI |
288
- | `pnpm build` | Full build: typecheck web app CLI |
289
- | `pnpm build:cli` | CLI TUI build only |
290
- | `pnpm preview` | Preview production build |
291
- | `pnpm typecheck` | TypeScript check |
292
-
293
- ---
315
+ | [`AGENTS.md`](AGENTS.md) | The project's rules, including which files are generated |
316
+ | [`CODEMAP.md`](CODEMAP.md) | Every source file with a one-line summary generated from JSDoc |
317
+ | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | How the pieces fit and which invariants not to break |
318
+ | [`docs/RELEASE.md`](docs/RELEASE.md) | The release runbook |
294
319
 
295
- ## License & credits
320
+ The short version: **`bin/*.js` are build output, not source** — edit `src/cli/`
321
+ instead. Every source file carries a JSDoc `@file` / `@description` header, `CODEMAP.md`
322
+ is generated from them on every commit, and CI fails if either drifts.
296
323
 
297
- [MIT](LICENSE) © 2026 [Vanessa Depraute](https://vanessadepraute.dev) — GitHub: [vava-nessa](https://github.com/vava-nessa).
298
-
299
- Created and maintained by [Vanessa Depraute](https://vanessadepraute.dev).
324
+ | Script | Description |
325
+ |---|---|
326
+ | `pnpm dev` | Vite dev server for the web UI |
327
+ | `pnpm dev:app` | Full build, then launch the CLI |
328
+ | `pnpm dev:cli` | Watch-mode build of the CLI bundles |
329
+ | `pnpm build` | Version inject → agent-doc sync → typecheck → web → CLI |
330
+ | `pnpm typecheck` | TypeScript, no emit |
331
+ | `pnpm codemap` | Regenerate `CODEMAP.md` / `CODEMAP.json` |
300
332
 
301
333
  ---
302
334
 
303
- <p align="center">
304
- <a href="#-quick-start">Quick Start</a> ·
305
- <a href="#-features">Features</a> ·
306
- <a href="#-cli-commands">CLI</a> ·
307
- <a href="#-ai-agent-integration">AI Agents</a>
308
- </p>
335
+ ## License
336
+
337
+ [MIT](LICENSE) © 2026 [Vanessa Depraute](https://vanessadepraute.dev) —
338
+ GitHub: [vava-nessa](https://github.com/vava-nessa)
package/bin/kandown.js CHANGED
@@ -15,7 +15,7 @@ import { spawn, execSync } from "child_process";
15
15
  import { homedir } from "os";
16
16
 
17
17
  // src/lib/version.ts
18
- var KANDOWN_VERSION = "0.34.3";
18
+ var KANDOWN_VERSION = "0.35.1";
19
19
 
20
20
  // src/cli/lib/updater.ts
21
21
  import { fileURLToPath } from "url";
@@ -1206,8 +1206,8 @@ function openBrowser(target) {
1206
1206
  }
1207
1207
 
1208
1208
  // src/cli/lib/cli-shared.ts
1209
- import { existsSync as existsSync7, readFileSync as readFileSync7, readdirSync as readdirSync4, statSync as statSync4 } from "fs";
1210
- import { join as join7, resolve as resolve2, basename } from "path";
1209
+ import { existsSync as existsSync7, readFileSync as readFileSync7, readdirSync as readdirSync4 } from "fs";
1210
+ import { join as join7, resolve as resolve2, basename, dirname as dirname4 } from "path";
1211
1211
  import { spawn as spawn4 } from "child_process";
1212
1212
 
1213
1213
  // src/cli/lib/init.ts
@@ -1383,30 +1383,21 @@ function stripFirstPositional(args, value) {
1383
1383
  return result;
1384
1384
  }
1385
1385
  function resolveKandownDir(pathArg = ".kandown", cwd = process.cwd()) {
1386
- if (basename(cwd) === ".kandown" || existsSync7(join7(cwd, "kandown.json"))) {
1387
- return cwd;
1388
- }
1389
1386
  if (pathArg !== ".kandown") {
1390
1387
  return resolve2(cwd, pathArg);
1391
1388
  }
1392
- let entries;
1393
- try {
1394
- entries = readdirSync4(cwd);
1395
- } catch {
1396
- return resolve2(cwd, pathArg);
1397
- }
1398
- for (const name of entries) {
1399
- if (name.startsWith(".") || name === "node_modules" || name === "tasks") continue;
1400
- const subPath = join7(cwd, name);
1401
- let stat;
1402
- try {
1403
- stat = statSync4(subPath);
1404
- } catch {
1405
- continue;
1389
+ let currentDir = resolve2(cwd);
1390
+ while (true) {
1391
+ if (basename(currentDir) === ".kandown" && existsSync7(join7(currentDir, "kandown.json"))) {
1392
+ return currentDir;
1393
+ }
1394
+ const candidate = join7(currentDir, ".kandown");
1395
+ if (existsSync7(join7(candidate, "kandown.json"))) {
1396
+ return candidate;
1406
1397
  }
1407
- if (!stat.isDirectory()) continue;
1408
- const found = resolveKandownDir(pathArg, subPath);
1409
- if (existsSync7(found)) return found;
1398
+ const parentDir = dirname4(currentDir);
1399
+ if (parentDir === currentDir) break;
1400
+ currentDir = parentDir;
1410
1401
  }
1411
1402
  return resolve2(cwd, pathArg);
1412
1403
  }