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.
- package/CHANGELOG.md +80 -0
- package/README.md +93 -8
- package/README.ru.md +93 -8
- package/bin/kb +28 -18
- package/package.json +1 -1
- package/public/js/automations.js +143 -36
- package/public/js/away-rules.js +5 -0
- package/public/js/away.js +55 -0
- package/public/js/board.js +49 -11
- package/public/js/chat.js +113 -29
- package/public/js/core.js +111 -5
- package/public/js/drawer.js +71 -23
- package/public/js/glyphs.js +28 -7
- package/public/js/health.js +1 -0
- package/public/js/init.js +14 -4
- package/public/js/link-lines.js +48 -0
- package/public/js/live-link.js +1 -1
- package/public/js/now-terms.js +10 -2
- package/public/js/pace-rules.js +18 -0
- package/public/js/project.js +12 -2
- package/public/js/review-rules.js +5 -2
- package/public/js/settings.js +23 -4
- package/public/js/share.js +18 -3
- package/public/js/shipped-rules.js +11 -0
- package/public/js/sidebar.js +14 -1
- package/public/js/sse.js +3 -3
- package/public/js/term-delta.js +52 -0
- package/public/js/term-input-rules.js +2 -1
- package/public/js/unsaved.js +7 -2
- package/public/style.css +54 -7
- package/skills/kanban/SKILL.md +6 -2
- package/src/auto-health.js +36 -0
- package/src/auto-resume.js +183 -0
- package/src/automations.js +293 -26
- package/src/chat-feed.js +87 -27
- package/src/claude-asks.js +2 -2
- package/src/claude-now.js +6 -6
- package/src/claude-sessions.js +10 -6
- package/src/db.js +44 -1
- package/src/health.js +9 -6
- package/src/own-wait.js +14 -6
- package/src/phantom.js +34 -4
- package/src/ready-gate.js +11 -0
- package/src/routes/automations.js +19 -1
- package/src/routes/chat.js +23 -5
- package/src/routes/dashboard.js +4 -4
- package/src/routes/projects.js +20 -5
- package/src/routes/share.js +6 -1
- package/src/routes/system.js +44 -7
- package/src/routes/tasks.js +20 -9
- package/src/routes/terminal.js +16 -2
- package/src/schema.sql +13 -4
- package/src/share.js +123 -10
- package/src/shipped.js +117 -0
- package/src/sync/github.js +1 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
14
|
+
<h3 align="center"><a href="#install"><ins>Install</ins></a> · <a href="#how-you-use-it">How it works</a> · <a href="CHANGELOG.md">What's new</a> · <a href="README.ru.md">Русская версия</a></h3>
|
|
6
15
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
!
|
|
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 your 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 the 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 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 the 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 project goes 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 tells the 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 cost 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 your 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 the door off 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 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 move into 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 one 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 the 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
|
|
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` (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
14
|
+
<h3 align="center"><a href="#установка"><ins>Установить</ins></a> · <a href="#как-этим-пользоваться">Как это работает</a> · <a href="CHANGELOG.md">Что нового</a> · <a href="README.md">English</a></h3>
|
|
6
15
|
|
|
7
|
-
|
|
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
|
-
|
|
20
|
+
Вы планируете и принимаете работу, Claude берёт её из очереди, делает и отчитывается. Всё лежит в одном файле SQLite на вашем компьютере и управляется через `kb` — CLI, который тратит мало токенов Claude. GitHub — необязательное зеркало: пока вы его не включите, ничего с компьютера не уходит.
|
|
10
21
|
|
|
11
|
-
!
|
|
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>. Готово — всегда ваше слово.</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 прямо в карточке</h3>
|
|
45
|
+
|
|
46
|
+
<p align="center">У каждой задачи свой чат: что сказал Claude, свёрнутые шаги, изменённые файлы и сколько он уже молчит. Там же можно ответить на вопросы и разрешения, отправить картинку, поставить следующие слова в очередь, пока он работает, или открыть его терминал.</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">🔎 Работу проверяет свежий Claude</h3>
|
|
52
|
+
|
|
53
|
+
<p align="center">Дайте колонке <b>Проверяю</b> накопиться и нажмите одну кнопку. <b>Claude review</b> заводит задачу-проверку и запускает Claude, который этот код не писал: он тестирует каждую задачу, пробует её сломать, выжившее переводит в Готово и оставляет отчёт. <b>Автоматизации</b> запускают это сами, когда проект затих.</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">📊 Дашборд, которому можно верить</h3>
|
|
59
|
+
|
|
60
|
+
<p align="center">Время работы считается, только пока Claude действительно работает, и стоит, когда сессия закрыта. Видно, что ждёт вас, серии, цикл задачи, когда идёт работа и сколько стоил 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">📱 Доска у вас в телефоне</h3>
|
|
66
|
+
|
|
67
|
+
<p align="center"><b>Настройки → Wi-Fi</b> показывают QR-код. Отсканируйте его, и доска, чаты и Claude у вас в руке — по вашей сети, без аккаунтов и облака. Можно поставить как приложение, а дверь в любой момент закрыть.</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">🩺 Здоровье инструкций Claude</h3>
|
|
73
|
+
|
|
74
|
+
<p align="center">Включите <b>Настройки → Здоровье</b>, и доска сверит каждый CLAUDE.md с нормами Claude Code и покажет, в каких проектах инструкций больше, чем Claude выполнит, и что вынести в правила.</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">🔌 Подключение в один клик</h3>
|
|
80
|
+
|
|
81
|
+
<p align="center"><b>Настройки → Claude Code</b> показывают, чего доске не хватает, и записывают это, сперва показав, что именно изменится: строку состояния для лимитов, хук для ответов из карточки, скилл с рабочим циклом для 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-код. Пускает только
|
|
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` (
|
|
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
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
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) {
|