local-kanban 1.16.0 → 2.0.0-beta.2

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.
Files changed (56) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +93 -8
  3. package/README.ru.md +93 -8
  4. package/bin/kb +28 -18
  5. package/package.json +1 -1
  6. package/public/js/automations.js +143 -36
  7. package/public/js/away-rules.js +5 -0
  8. package/public/js/away.js +55 -0
  9. package/public/js/board.js +49 -11
  10. package/public/js/chat.js +113 -29
  11. package/public/js/core.js +111 -5
  12. package/public/js/drawer.js +71 -23
  13. package/public/js/glyphs.js +28 -7
  14. package/public/js/health.js +1 -0
  15. package/public/js/init.js +14 -4
  16. package/public/js/link-lines.js +48 -0
  17. package/public/js/live-link.js +1 -1
  18. package/public/js/now-terms.js +10 -2
  19. package/public/js/pace-rules.js +18 -0
  20. package/public/js/project.js +12 -2
  21. package/public/js/review-rules.js +5 -2
  22. package/public/js/settings.js +23 -4
  23. package/public/js/share.js +18 -3
  24. package/public/js/shipped-rules.js +11 -0
  25. package/public/js/sidebar.js +14 -1
  26. package/public/js/sse.js +3 -3
  27. package/public/js/term-delta.js +52 -0
  28. package/public/js/term-input-rules.js +2 -1
  29. package/public/js/unsaved.js +7 -2
  30. package/public/style.css +54 -7
  31. package/skills/kanban/SKILL.md +6 -2
  32. package/src/auto-health.js +36 -0
  33. package/src/auto-resume.js +183 -0
  34. package/src/automations.js +293 -26
  35. package/src/chat-feed.js +87 -27
  36. package/src/claude-asks.js +2 -2
  37. package/src/claude-now.js +6 -6
  38. package/src/claude-sessions.js +10 -6
  39. package/src/db.js +44 -1
  40. package/src/health.js +9 -6
  41. package/src/own-wait.js +14 -6
  42. package/src/phantom.js +34 -4
  43. package/src/ready-gate.js +11 -0
  44. package/src/routes/automations.js +19 -1
  45. package/src/routes/chat.js +23 -5
  46. package/src/routes/dashboard.js +4 -4
  47. package/src/routes/projects.js +20 -5
  48. package/src/routes/share.js +6 -1
  49. package/src/routes/system.js +44 -7
  50. package/src/routes/tasks.js +20 -9
  51. package/src/routes/terminal.js +16 -2
  52. package/src/schema.sql +13 -4
  53. package/src/share.js +123 -10
  54. package/src/shipped.js +117 -0
  55. package/src/sync/github.js +1 -0
  56. package/src/work-feed.js +2 -0
package/CHANGELOG.md CHANGED
@@ -8,6 +8,86 @@ version it goes out as and opens an empty one again. Released sections are histo
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [2.0.0-beta.2]
12
+
13
+ ### Added
14
+
15
+ - A status «Ready to ship» between Doing and Deploying, off by default: with the switch in Settings → Statuses a finished task waits for your word, and the board itself refuses Deploying past it, and Doing straight to Review. A project can say otherwise in its settings.
16
+ - A mark on the cards of Ready to ship and Review: on main, only in a branch or no commits found, and a filter of Review for what is not on main.
17
+
18
+ ### Fixed
19
+
20
+ - The chat shows helpers and workflows at work: those started without the background flag, those brought back after a stop, and those that woke after finishing.
21
+ - The terminal sends what changed on the screen instead of the whole screen every second: far less traffic on a phone.
22
+ - The symbol background holds no video memory while it is off, and resizing the window no longer piles up canvases.
23
+ - Scrolling a column with many link lines no longer rewrites all of them on every frame.
24
+ - A comment whose answer got lost on the way is no longer written twice when the page sends it again.
25
+ - Automations: a restart of the board no longer loses the words that tell an interrupted Claude to go on, and a limit line left on the screen past its moment does not hold them.
26
+ - Automations: after a refused start, «Next batch in» counts down to the next try instead of standing at 0:00 for five minutes.
27
+ - `kb show A B` prints every card, a line of `---` between them; it used to print the first one and drop the rest with code 0.
28
+ - **Automations.** The fix of a returned task no longer waits hours for the terminals at their prompts; the grooming's Claude is
29
+ not closed while it asks you; one held task does not stop a batch; a blocked or `ask` task is not resumed.
30
+ - **Words kept.** A last word in a checklist item is not overwritten by a late resend, a failed save of the description no longer
31
+ claims someone else changed it, and words typed into a question that went away come back by themselves.
32
+ - **Phones and failures.** A phone on its side keeps the back gesture on the page, a phone says when the projects did not load,
33
+ a stream that never opened is announced, and a device stopped at the key page is listed in Turned away.
34
+ - **Sessions.** Only a move of the status takes a task over: a note or a field edited from another session does not.
35
+
36
+ ### Changed
37
+
38
+ - **Automations watch the size of CLAUDE.md.** A switch opens a task in a project's backlog when its CLAUDE.md is past the
39
+ norm of Health; you start it yourself, and a task you cancelled does not come back.
40
+ - **A summary when you come back.** With automations on, the first look after eight hours of silence shows what was handed
41
+ in, accepted, returned or got stuck, each line opening its card.
42
+ - **Automations take the queue and a schedule.** Once a marked project is finished its next batch of To do starts, at most 5
43
+ tasks and not over 80% of the limit; a check of Review or the grooming of the backlog can run at a set time. A run the
44
+ sleeping computer missed is skipped.
45
+ - **A repeating automation can fix what its check returns.** A returned task goes back to work in a new session and the
46
+ check comes after it, at most 2 rounds; then the task waits for you.
47
+ - **The board can go on with interrupted work by itself.** A switch in Automations: once the limit has reset or the Mac is
48
+ up, a session cut off mid-work goes on, one a minute, at most 3 times in a row, and never one that waits for you.
49
+ - **An automation can repeat, and one form covers several projects.** A repeating rule stays after its check and waits for
50
+ the next batch, at most 10 checks a day; tick any projects, or all of them, and each gets its rule. At most two checks
51
+ run on the board at once, the others wait for a place.
52
+ - **The board over Wi-Fi opens by a key again.** The QR code and the link carry it, and a browser without them is asked for
53
+ it, so a home-screen app or a private tab is never locked out: the 16 characters can be typed by hand, and the device
54
+ remembers. Settings → Wi-Fi shows the key and changes it. Everyone connected by the plain address needs the new link.
55
+ - **Markdown files open in a window.** A `.md` file Claude wrote or edited opens from the list of changed files in the
56
+ chat, rendered and readable at the width of a page, on a phone too.
57
+ - **A card opens with its chat closed.** It used to open on the chat and scroll to its end, taking the title and the
58
+ description out of sight; now the chat opens from its tab, from ▶ or from «Open in the card».
59
+
60
+ ### Fixed
61
+
62
+ - **Words typed in a chat survive Claude moving to its next task.** In a column of Terminals the field emptied and the
63
+ chat blinked «Loading…» whenever the session took the next task of its batch; the words now stay and the chat stands still.
64
+ - **Claude's last words stay in sight when its turn ends on a step.** A turn that ended by sending helpers or a command to
65
+ the background folded all its text behind the «Worked for» bar.
66
+
67
+ ## [2.0.0-beta.1]
68
+
69
+ **2.0 beta.** The board stopped being a list of tasks next to Claude and became the place you work with it: Claude starts
70
+ inside the board, you talk to it in the card, watch every session side by side, and a fresh Claude checks the work. A
71
+ beta goes to everyone, like a release: `npm install -g local-kanban` and the update button both bring it, and your
72
+ data stays. To stay on the last 1.x, run `npm install -g local-kanban@1.16.0`.
73
+
74
+ ### Changed
75
+
76
+ - **The README shows the board as it is now**, in the dark theme, with Claude moving cards in the first picture.
77
+ - **Update checks understand betas.** A board on a beta is offered the next beta and the release it leads to; before,
78
+ both looked like the version it already had.
79
+
80
+ - **The chat says what Claude is doing while nothing lands in the transcript.** A long script takes a minute or two to
81
+ write, and all that time the chat said only "Claude is working…". The light is green now and tells how long the
82
+ transcript has been silent and, for a Claude inside the board, whether it is thinking or writing and how many tokens
83
+ it wrote. A counter that stood still for a minute with nothing to wait on turns the light yellow: "no answer for 1 min".
84
+ - **Steps tell writing from running.** A step and a folded run of steps say how long Claude took to write them and how
85
+ long they ran: "wrote for 1 min 31 s · ran for 19 s". Before, only the second number was shown, and a session of
86
+ minutes looked like commands of seconds.
87
+ - **Health lists the rules with `paths:` too.** The rules of a project's `.claude/rules` that Claude Code loads only
88
+ when it works with their files are listed with the CLAUDE.md files of subfolders, with their size: past the
89
+ per-file limit Claude Code reads only the start of such a file.
90
+
11
91
  ## [1.16.0]
12
92
 
13
93
  ### Added
package/README.md CHANGED
@@ -1,14 +1,99 @@
1
- # local-kanban
1
+ <h1 align="center">
2
+ <a href="https://www.npmjs.com/package/local-kanban"><img src="public/icon-192.png" alt="local-kanban" width="72" valign="middle" /></a> local-kanban
3
+ <br>
4
+ The kanban board Claude Code works from
5
+ </h1>
2
6
 
3
- [![tests](https://github.com/lamaohub/local-kanban/actions/workflows/test.yml/badge.svg)](https://github.com/lamaohub/local-kanban/actions/workflows/test.yml)
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/local-kanban"><picture><source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/npm/local-kanban.svg?variant=secondary&mode=dark" /><img src="https://shieldcn.dev/npm/local-kanban.svg?variant=secondary&mode=light" alt="Version on npm" /></picture></a>
9
+ <a href="https://github.com/lamaohub/local-kanban/releases/latest"><picture><source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/github/release/lamaohub/local-kanban.svg?variant=secondary&mode=dark" /><img src="https://shieldcn.dev/github/release/lamaohub/local-kanban.svg?variant=secondary&mode=light" alt="Latest release" /></picture></a>
10
+ <a href="LICENSE"><picture><source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/github/license/lamaohub/local-kanban.svg?variant=secondary&mode=dark" /><img src="https://shieldcn.dev/github/license/lamaohub/local-kanban.svg?variant=secondary&mode=light" alt="License" /></picture></a>
11
+ <a href="#requirements"><picture><source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/badge/platforms-macOS%20%C2%B7%20Linux.svg?variant=secondary&mode=dark" /><img src="https://shieldcn.dev/badge/platforms-macOS%20%C2%B7%20Linux.svg?variant=secondary&mode=light" alt="Runs on macOS and Linux" /></picture></a>
12
+ </p>
4
13
 
5
- A local kanban board built for working **in tandem with Claude Code**: the human plans and accepts tasks, Claude takes them from the queue, does the work and reports back — all through a token-efficient CLI called `kb`. Optionally mirrors everything to GitHub (issues + Projects v2).
14
+ <h3 align="center"><a href="#install"><ins>Install</ins></a> &nbsp;·&nbsp; <a href="#how-you-use-it">How it works</a> &nbsp;·&nbsp; <a href="CHANGELOG.md">What's new</a> &nbsp;·&nbsp; <a href="README.ru.md">Русская версия</a></h3>
6
15
 
7
- Русская версия — [README.ru.md](README.ru.md).
16
+ <p align="center">
17
+ <img width="960" src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/board.gif" alt="Claude moves cards across the board on its own: To do, Prep, Doing, Deploying, Review" />
18
+ </p>
8
19
 
9
- ![Board](docs/screenshot-board.png)
20
+ You plan and accept the work, Claude takes it from the queue, does it and reports back. Everything lives in one SQLite file on your machine and is driven by `kb`, a CLI that costs Claude few tokens. GitHub is an optional mirror, and nothing leaves your computer until you turn it on.
10
21
 
11
- ![Dashboard](docs/screenshot-dashboard.png)
22
+ > [!NOTE]
23
+ > **2.0 is in beta, and it is what `npm install -g local-kanban` gives you.** It has been in daily use on real projects. Your board updates in place and keeps its data; to stay on the last 1.x, run `npm install -g local-kanban@1.16.0`. Found something broken? [Open an issue](https://github.com/lamaohub/local-kanban/issues).
24
+
25
+ ## Quick start
26
+
27
+ ```bash
28
+ npm install -g local-kanban
29
+ local-kanban # setup wizard: Enter-Enter-Enter is enough
30
+ local-kanban start # board at http://localhost:3100
31
+ ```
32
+
33
+ Needs Node.js 22 or newer on macOS or Linux. Details are under [Install](#install).
34
+
35
+ ## Features
36
+
37
+ <h3 align="center">▶️ Press play, Claude starts working</h3>
38
+
39
+ <p align="center">One button on <b>To do</b> hands the column to Claude Code, right inside the board: no window opens and no prompt is pasted. Claude takes each task, moves its card as it goes, commits, deploys if the project has a deploy skill, and stops at <b>Review</b>. Done is always&nbsp;your&nbsp;word.</p>
40
+
41
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/claude-now.png" alt="Three Claude sessions working side by side in Claude now, each with its chat" width="100%" /></p>
42
+
43
+ <br/>
44
+ <h3 align="center">💬 Talk to Claude from&nbsp;the&nbsp;card</h3>
45
+
46
+ <p align="center">Every task keeps its own chat: what Claude said, its steps folded, the files it changed, and how long it has been silent. Answer its questions and permissions there, send pictures, queue your next words while it works, or switch to its&nbsp;terminal.</p>
47
+
48
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/card-chat.png" alt="A task card with the chat of its Claude: the steps, the changed files and a field to answer in" width="100%" /></p>
49
+
50
+ <br/>
51
+ <h3 align="center">🔎 A fresh Claude checks&nbsp;the&nbsp;work</h3>
52
+
53
+ <p align="center">Let <b>Review</b> pile up, then press one button. <b>Claude review</b> makes a check task and starts a Claude that did not write the code: it tests every task, tries to break it, moves what survives to Done and leaves a report. <b>Automations</b> can start it the moment a&nbsp;project&nbsp;goes&nbsp;quiet.</p>
54
+
55
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/claude-review.png" alt="Claude review lists the tasks waiting in Review by project, with a Check in Claude button" width="88%" /></p>
56
+
57
+ <br/>
58
+ <h3 align="center">📊 A dashboard that&nbsp;tells&nbsp;the&nbsp;truth</h3>
59
+
60
+ <p align="center">Work time counts only while Claude actually works, and stops when its session closes. See what waits for you, streaks, cycle time, when work happens and what Claude&nbsp;cost&nbsp;you.</p>
61
+
62
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/dashboard.png" alt="The dashboard: tasks waiting for you, week totals and activity charts" width="88%" /></p>
63
+
64
+ <br/>
65
+ <h3 align="center">📱 Your board on&nbsp;your&nbsp;phone</h3>
66
+
67
+ <p align="center"><b>Settings → Wi-Fi</b> shows a QR code. Scan it and the board, the chats and Claude are in your hand, over your own network, with no account and no cloud. Install it as an app, or switch&nbsp;the&nbsp;door&nbsp;off&nbsp;again.</p>
68
+
69
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/phone.png" alt="The board and a task chat on a phone" width="70%" /></p>
70
+
71
+ <br/>
72
+ <h3 align="center">🩺 Keep Claude's instructions&nbsp;healthy</h3>
73
+
74
+ <p align="center">Switch on <b>Settings → Health</b> and the board measures every CLAUDE.md against the norms of Claude Code and shows which projects load more than Claude will follow, and what to&nbsp;move&nbsp;into&nbsp;rules.</p>
75
+
76
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/health.png" alt="Health lists each project with the size of its CLAUDE.md and the norm it breaks" width="88%" /></p>
77
+
78
+ <br/>
79
+ <h3 align="center">🔌 Connected in&nbsp;one&nbsp;click</h3>
80
+
81
+ <p align="center"><b>Settings → Claude Code</b> shows what the board needs and writes it after showing you exactly what will change: the status line for your rate limits, the hook for answers from the card, the skill that teaches Claude&nbsp;the&nbsp;workflow.</p>
82
+
83
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/setup.png" alt="Settings for Claude Code: what shows on the board, how Claude starts and what it may do" width="88%" /></p>
84
+
85
+ <br/>
86
+ ### Also in the box
87
+
88
+ - **Rate limits in the sidebar**: the 5-hour and weekly limits of your subscription, and what each task spent in tokens.
89
+ - **GitHub mirror**: every task an issue, every project a GitHub Project, one way and in the background. Off until you set it.
90
+ - **Backups**: a daily copy, a copy before every migration, and any of them opens as a second board next to the live one.
91
+ - **Manual tasks**: the `noclaude` label keeps your own work out of Claude's metrics, and Claude never takes it.
92
+ - **Linked tasks, subtasks, checklists, pictures in comments, search, hotkeys**, all readable by Claude through `kb`.
93
+ - **English and Russian**, following your system language.
94
+ - **An HTTP API and an event stream** for your own bots and stats: [docs/API.md](docs/API.md).
95
+
96
+ ---
12
97
 
13
98
  ## How you use it
14
99
 
@@ -49,7 +134,7 @@ Claude on it — the report stays on the card of the check.
49
134
 
50
135
  The server listens on **127.0.0.1 only** and has **no authentication**. The board is strictly local: your machine is the trust boundary. **Never expose the port to the network** (no reverse proxies, no `0.0.0.0`, no port forwarding). Third-party integrations should run on the same machine and talk to `127.0.0.1` (see [docs/API.md](docs/API.md)).
51
136
 
52
- The one exception is your own switch: **Settings → Wi-Fi** opens a separate door on the local network (port + 10, `KB_SHARE_PORT`) for people you show its QR code to. Only the link's secret lets anyone in, and with it a guest can do on the board everything you can — including talking to Claude on your computer. It is off by default; switching it off closes the door, a new link drops every guest.
137
+ The one exception is your own switch: **Settings → Wi-Fi** opens a separate door on the local network (port + 10, `KB_SHARE_PORT`) for people you show its QR code to. Only its key lets anyone in: in the link of the QR code, or typed by hand when a browser has no link. With it a guest can do on the board everything you can — including talking to Claude on your computer. The connection is plain HTTP, so the key keeps people out but does not encrypt the traffic: switch the door off on a network of strangers. It is off by default; switching it off closes the door, a new key drops every guest.
53
138
 
54
139
  **The board holds no credentials.** A project can name an SSH host to deploy to, but neither a key
55
140
  nor a password is ever entered here: the board simply runs `ssh <host>`, and who you are, on which
@@ -232,7 +317,7 @@ Your data is never touched by updates: `data/` is gitignored and schema migratio
232
317
 
233
318
  **Rollback:** stop the server, restore the latest file from `data/backups/` (daily) or `data/backups/pre-migrate/` over `data/kanban.db`, then `git checkout <previous tag>` and start again.
234
319
 
235
- Releases live in `main` (stable, tagged); day-to-day development happens in `dev`.
320
+ Releases live in `main` (tagged); day-to-day development happens in `dev`. A beta goes out the same way as a release, so `latest` and the update button bring it too. To go back: `npm install -g local-kanban@1.16.0`.
236
321
 
237
322
  ## Removing the board
238
323
 
package/README.ru.md CHANGED
@@ -1,14 +1,99 @@
1
- # local-kanban
1
+ <h1 align="center">
2
+ <a href="https://www.npmjs.com/package/local-kanban"><img src="public/icon-192.png" alt="local-kanban" width="72" valign="middle" /></a> local-kanban
3
+ <br>
4
+ Канбан-доска, с которой работает Claude Code
5
+ </h1>
2
6
 
3
- [![tests](https://github.com/lamaohub/local-kanban/actions/workflows/test.yml/badge.svg)](https://github.com/lamaohub/local-kanban/actions/workflows/test.yml)
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/local-kanban"><picture><source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/npm/local-kanban.svg?variant=secondary&mode=dark" /><img src="https://shieldcn.dev/npm/local-kanban.svg?variant=secondary&mode=light" alt="Версия в npm" /></picture></a>
9
+ <a href="https://github.com/lamaohub/local-kanban/releases/latest"><picture><source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/github/release/lamaohub/local-kanban.svg?variant=secondary&mode=dark" /><img src="https://shieldcn.dev/github/release/lamaohub/local-kanban.svg?variant=secondary&mode=light" alt="Последний релиз" /></picture></a>
10
+ <a href="LICENSE"><picture><source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/github/license/lamaohub/local-kanban.svg?variant=secondary&mode=dark" /><img src="https://shieldcn.dev/github/license/lamaohub/local-kanban.svg?variant=secondary&mode=light" alt="Лицензия" /></picture></a>
11
+ <a href="#требования"><picture><source media="(prefers-color-scheme: dark)" srcset="https://shieldcn.dev/badge/platforms-macOS%20%C2%B7%20Linux.svg?variant=secondary&mode=dark" /><img src="https://shieldcn.dev/badge/platforms-macOS%20%C2%B7%20Linux.svg?variant=secondary&mode=light" alt="Работает на macOS и Linux" /></picture></a>
12
+ </p>
4
13
 
5
- Локальная канбан-доска для работы **в паре с Claude Code**: человек планирует и принимает задачи, Claude берёт их из очереди, делает и отчитывается — через токен-экономный CLI `kb`. Опционально зеркалит всё в GitHub (issues + Projects v2).
14
+ <h3 align="center"><a href="#установка"><ins>Установить</ins></a> &nbsp;·&nbsp; <a href="#как-этим-пользоваться">Как это работает</a> &nbsp;·&nbsp; <a href="CHANGELOG.md">Что нового</a> &nbsp;·&nbsp; <a href="README.md">English</a></h3>
6
15
 
7
- English version — [README.md](README.md).
16
+ <p align="center">
17
+ <img width="960" src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/board.gif" alt="Claude сам двигает карточки по доске: Сделать, Подготовка, Делаю, Выкатываю, Проверяю" />
18
+ </p>
8
19
 
9
- ![Доска](docs/screenshot-board.png)
20
+ Вы планируете и принимаете работу, Claude берёт её из очереди, делает и отчитывается. Всё лежит в одном файле SQLite на вашем компьютере и управляется через `kb` — CLI, который тратит мало токенов Claude. GitHub — необязательное зеркало: пока вы его не включите, ничего с компьютера не уходит.
10
21
 
11
- ![Дашборд](docs/screenshot-dashboard.png)
22
+ > [!NOTE]
23
+ > **2.0 в бете, и именно её ставит `npm install -g local-kanban`.** Она каждый день работает на настоящих проектах. Доска обновляется на месте и сохраняет данные; остаться на последней 1.x — `npm install -g local-kanban@1.16.0`. Что-то сломалось? [Заведите issue](https://github.com/lamaohub/local-kanban/issues).
24
+
25
+ ## Быстрый старт
26
+
27
+ ```bash
28
+ npm install -g local-kanban
29
+ local-kanban # мастер настройки: хватит Enter-Enter-Enter
30
+ local-kanban start # доска на http://localhost:3100
31
+ ```
32
+
33
+ Нужен Node.js 22 или новее на macOS или Linux. Подробности — в разделе [Установка](#установка).
34
+
35
+ ## Возможности
36
+
37
+ <h3 align="center">▶️ Нажали play — Claude работает</h3>
38
+
39
+ <p align="center">Одна кнопка на колонке <b>Сделать</b> отдаёт её Claude Code прямо внутри доски: окна не открываются, промпт вставлять не нужно. Claude берёт каждую задачу, сам двигает карточку, коммитит, выкатывает, если у проекта есть скилл деплоя, и останавливается на <b>Проверяю</b>. Готово — всегда&nbsp;ваше&nbsp;слово.</p>
40
+
41
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/claude-now.png" alt="Три сессии Claude работают рядом в разделе Claude now, у каждой свой чат" width="100%" /></p>
42
+
43
+ <br/>
44
+ <h3 align="center">💬 Разговор с Claude прямо&nbsp;в&nbsp;карточке</h3>
45
+
46
+ <p align="center">У каждой задачи свой чат: что сказал Claude, свёрнутые шаги, изменённые файлы и сколько он уже молчит. Там же можно ответить на вопросы и разрешения, отправить картинку, поставить следующие слова в очередь, пока он работает, или открыть&nbsp;его&nbsp;терминал.</p>
47
+
48
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/card-chat.png" alt="Карточка задачи с чатом Claude: шаги, изменённые файлы и поле ответа" width="100%" /></p>
49
+
50
+ <br/>
51
+ <h3 align="center">🔎 Работу проверяет свежий&nbsp;Claude</h3>
52
+
53
+ <p align="center">Дайте колонке <b>Проверяю</b> накопиться и нажмите одну кнопку. <b>Claude review</b> заводит задачу-проверку и запускает Claude, который этот код не писал: он тестирует каждую задачу, пробует её сломать, выжившее переводит в Готово и оставляет отчёт. <b>Автоматизации</b> запускают это сами, когда&nbsp;проект&nbsp;затих.</p>
54
+
55
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/claude-review.png" alt="Claude review показывает задачи в проверке по проектам и кнопку Check in Claude" width="88%" /></p>
56
+
57
+ <br/>
58
+ <h3 align="center">📊 Дашборд, которому&nbsp;можно&nbsp;верить</h3>
59
+
60
+ <p align="center">Время работы считается, только пока Claude действительно работает, и стоит, когда сессия закрыта. Видно, что ждёт вас, серии, цикл задачи, когда идёт работа и сколько&nbsp;стоил&nbsp;Claude.</p>
61
+
62
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/dashboard.png" alt="Дашборд: что ждёт вас, итоги недели и графики активности" width="88%" /></p>
63
+
64
+ <br/>
65
+ <h3 align="center">📱 Доска у вас&nbsp;в&nbsp;телефоне</h3>
66
+
67
+ <p align="center"><b>Настройки → Wi-Fi</b> показывают QR-код. Отсканируйте его, и доска, чаты и Claude у вас в руке — по вашей сети, без аккаунтов и облака. Можно поставить как приложение, а дверь&nbsp;в&nbsp;любой&nbsp;момент&nbsp;закрыть.</p>
68
+
69
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/phone.png" alt="Доска и чат задачи на телефоне" width="70%" /></p>
70
+
71
+ <br/>
72
+ <h3 align="center">🩺 Здоровье инструкций&nbsp;Claude</h3>
73
+
74
+ <p align="center">Включите <b>Настройки → Здоровье</b>, и доска сверит каждый CLAUDE.md с нормами Claude Code и покажет, в каких проектах инструкций больше, чем Claude выполнит, и что вынести&nbsp;в&nbsp;правила.</p>
75
+
76
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/health.png" alt="Здоровье: проекты с размером CLAUDE.md и нарушенной нормой" width="88%" /></p>
77
+
78
+ <br/>
79
+ <h3 align="center">🔌 Подключение в&nbsp;один&nbsp;клик</h3>
80
+
81
+ <p align="center"><b>Настройки → Claude Code</b> показывают, чего доске не хватает, и записывают это, сперва показав, что именно изменится: строку состояния для лимитов, хук для ответов из карточки, скилл с рабочим&nbsp;циклом&nbsp;для&nbsp;Claude.</p>
82
+
83
+ <p align="center"><img src="https://raw.githubusercontent.com/lamaohub/local-kanban/main/docs/readme/setup.png" alt="Настройки Claude Code: что показывать на доске, как запускать Claude и что ему можно" width="88%" /></p>
84
+
85
+ <br/>
86
+ ### И ещё
87
+
88
+ - **Лимиты в сайдбаре**: пятичасовой и недельный лимиты подписки и расход токенов по каждой задаче.
89
+ - **Зеркало на GitHub**: задача — issue, проект — GitHub Project, в одну сторону и в фоне. Выключено, пока не настроите.
90
+ - **Бэкапы**: копия каждый день, копия перед каждой миграцией, и любую можно открыть второй доской рядом с живой.
91
+ - **Ручные задачи**: метка `noclaude` не пускает вашу работу в метрики Claude, и Claude такую задачу не возьмёт.
92
+ - **Связи, подзадачи, чек-листы, картинки в комментариях, поиск, горячие клавиши** — и всё это Claude читает через `kb`.
93
+ - **Русский и английский** — по языку системы.
94
+ - **HTTP API и поток событий** для своих ботов и статистики: [docs/API.md](docs/API.md).
95
+
96
+ ---
12
97
 
13
98
  ## Как этим пользоваться
14
99
 
@@ -48,7 +133,7 @@ English version — [README.md](README.md).
48
133
 
49
134
  Сервер слушает **только 127.0.0.1**, авторизации **нет**. Доска строго локальная: граница доверия — твоя машина. **Никогда не выставляй порт наружу** (никаких reverse proxy, `0.0.0.0`, проброса портов). Сторонние интеграции запускаются на той же машине и ходят на `127.0.0.1` (см. [docs/API.md](docs/API.md)).
50
135
 
51
- Исключение одно — твой выключатель: **«Настройки → Wi-Fi»** открывает отдельный вход в локальной сети (порт + 10, `KB_SHARE_PORT`) для тех, кому ты покажешь QR-код. Пускает только секрет ссылки, а с ним гость может на доске всё то же, что и ты, — в том числе писать Claude на твоём компьютере. По умолчанию выключено; выключатель закрывает вход, новая ссылка отключает всех гостей.
136
+ Исключение одно — твой выключатель: **«Настройки → Wi-Fi»** открывает отдельный вход в локальной сети (порт + 10, `KB_SHARE_PORT`) для тех, кому ты покажешь QR-код. Пускает только ключ: он в ссылке QR-кода, а в браузере без ссылки его можно ввести руками. С ним гость может на доске всё то же, что и ты, — в том числе говорить с Claude на твоём компьютере. Соединение идёт простым HTTP: ключ не пускает посторонних, но не шифрует трафик, поэтому в сети с чужими людьми вход выключай. По умолчанию он закрыт; выключатель закрывает вход, а новый ключ выкидывает всех гостей.
52
137
 
53
138
  **Доска не хранит доступов.** У проекта можно указать ssh-хост, куда он выкатывается, но ни ключ, ни
54
139
  пароль здесь не вводятся: доска просто запускает `ssh <хост>`, а кто ты, на каком порту и с каким
@@ -216,7 +301,7 @@ npm run update # git pull + npm install + pm2 restart (если примени
216
301
 
217
302
  **Откат:** останови сервер, восстанови свежий файл из `data/backups/` (суточные) или `data/backups/pre-migrate/` поверх `data/kanban.db`, затем `git checkout <предыдущий тег>` и запусти снова.
218
303
 
219
- Релизы живут в `main` (стабильное, с тегами); ежедневная разработка — в `dev`.
304
+ Релизы живут в `main` (с тегами); ежедневная разработка — в `dev`. Бета выходит так же, как релиз, поэтому `latest` и кнопка обновления приносят и её. Вернуться назад: `npm install -g local-kanban@1.16.0`.
220
305
 
221
306
  ## Как убрать доску
222
307
 
package/bin/kb CHANGED
@@ -14,7 +14,7 @@ const PRI_BY_NAME = { none: 0, low: 1, med: 2, medium: 2, high: 3, p0: 0, p1: 1,
14
14
  const ST_ALIAS = {
15
15
  b: 'backlog', backlog: 'backlog', t: 'todo', todo: 'todo',
16
16
  pp: 'prep', prep: 'prep', d: 'doing', doing: 'doing',
17
- dp: 'deploy', deploy: 'deploy', r: 'review', review: 'review', dn: 'done', done: 'done',
17
+ rd: 'ready', ready: 'ready', dp: 'deploy', deploy: 'deploy', r: 'review', review: 'review', dn: 'done', done: 'done',
18
18
  c: 'cancelled', cancelled: 'cancelled', cancel: 'cancelled',
19
19
  };
20
20
 
@@ -409,7 +409,7 @@ const commands = {
409
409
  const ps = await api('GET', '/api/projects', null, LIST);
410
410
  if (!ps.length) return console.log('no projects');
411
411
  for (const p of ps) {
412
- console.log(`${p.slug} (${p.prefix}) b${p.c_backlog || 0} t${p.c_todo || 0} pp${p.c_prep || 0} d${p.c_doing || 0} dp${p.c_deploy || 0} r${p.c_review || 0} ✓${p.c_done || 0}${p.c_blocked ? ` !${p.c_blocked}` : ''}`);
412
+ console.log(`${p.slug} (${p.prefix}) b${p.c_backlog || 0} t${p.c_todo || 0} pp${p.c_prep || 0} d${p.c_doing || 0}${p.c_ready ? ` rd${p.c_ready}` : ''} dp${p.c_deploy || 0} r${p.c_review || 0} ✓${p.c_done || 0}${p.c_blocked ? ` !${p.c_blocked}` : ''}`);
413
413
  }
414
414
  },
415
415
 
@@ -471,21 +471,30 @@ const commands = {
471
471
  console.log(`${t.key} review 📝`);
472
472
  },
473
473
 
474
+ // A batch is read in one go, so every key is printed, cards apart by a line of ---. A wrong key stops the
475
+ // command before the first request; a task the board does not know stops it there, and says at which key.
474
476
  async show() {
475
- const [id] = args;
476
- if (!id) die('kb show <key>');
477
- const t = await api('GET', `/api/tasks/${key(id)}`, null, TASK);
478
- console.log(`${t.key} ${t.project} ${t.status}${t.pinned ? ' ' + PIN : ''}${t.blocked ? ` blocked: ${t.blocked_reason || ''}` : ''}${PRI[t.priority] ? ' ' + PRI[t.priority] : ''}${t.labels.length ? ' [' + t.labels.join(',') + ']' : ''}`);
479
- console.log(t.title);
480
- if (t.description) console.log(t.description);
481
- printChecklist(t);
482
- printLinks(t);
483
- printIssue(t);
484
- printMoves(t);
485
- printSessions(t);
486
- printUsage(t);
487
- printAttachments(t);
488
- printComments(await api('GET', `/api/tasks/${t.id}/comments`, null, LIST), 5);
477
+ if (!args.length) die('kb show <key> [<key> …]');
478
+ const ids = args.map(key);
479
+ let at = 0;
480
+ process.on('exit', (code) => {
481
+ if (code && ids.length > 1) process.stderr.write(`kb: stopped at ${args[at]}: ${at} of ${ids.length} printed\n`);
482
+ });
483
+ for (; at < ids.length; at++) {
484
+ if (at) console.log('---');
485
+ const t = await api('GET', `/api/tasks/${ids[at]}`, null, TASK);
486
+ console.log(`${t.key} ${t.project} ${t.status}${t.pinned ? ' ' + PIN : ''}${t.blocked ? ` blocked: ${t.blocked_reason || ''}` : ''}${PRI[t.priority] ? ' ' + PRI[t.priority] : ''}${t.labels.length ? ' [' + t.labels.join(',') + ']' : ''}`);
487
+ console.log(t.title);
488
+ if (t.description) console.log(t.description);
489
+ printChecklist(t);
490
+ printLinks(t);
491
+ printIssue(t);
492
+ printMoves(t);
493
+ printSessions(t);
494
+ printUsage(t);
495
+ printAttachments(t);
496
+ printComments(await api('GET', `/api/tasks/${t.id}/comments`, null, LIST), 5);
497
+ }
489
498
  },
490
499
 
491
500
  async add() {
@@ -506,7 +515,7 @@ const commands = {
506
515
  }
507
516
  if (si >= 0) {
508
517
  body.status = ST_ALIAS[args[si + 1]];
509
- if (!body.status) die('kb: status backlog|todo|prep|doing|deploy|review|done');
518
+ if (!body.status) die('kb: status backlog|todo|prep|doing|ready|deploy|review|done');
510
519
  }
511
520
  const t = await api('POST', '/api/tasks', body, TASK);
512
521
  console.log(`${t.key} ${t.status} ${t.project}`);
@@ -515,7 +524,7 @@ const commands = {
515
524
  async mv() {
516
525
  const [id, st] = args;
517
526
  const status = ST_ALIAS[st];
518
- if (!id || !status) die('kb mv <key> backlog|todo|prep|doing|deploy|review');
527
+ if (!id || !status) die('kb mv <key> backlog|todo|prep|doing|ready|deploy|review');
519
528
  const k = key(id);
520
529
  // started by the board runs only after asking (src/phantom.js), while its `kb mv` goes without asking. Before
521
530
  // this, `kb mv <key> done` sent the very request of `kb done` and skipped the question.
@@ -650,6 +659,7 @@ const commands = {
650
659
  if (p.domain) out.push(`domain: ${p.domain}`);
651
660
  // CLAUDE.md", "deployed by skill X", DNS facts) — info printed everything but it
652
661
  if (p.description) out.push(`description: ${p.description}`);
662
+ if (p.ship_gate) out.push('ships on the word: after the commit kb mv <key> ready and wait; deploy only once the person says so');
653
663
  // page; without this line Claude went looking by itself and sometimes missed. A missing
654
664
  // CLAUDE.md is said out loud — it is a signal (the task starts without architecture notes).
655
665
  if (p.path) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "local-kanban",
3
- "version": "1.16.0",
3
+ "version": "2.0.0-beta.2",
4
4
  "license": "MIT",
5
5
  "author": "Dannylamao",
6
6
  "repository": {