k0-board 0.4.0 → 0.6.0
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/.claude/skills/k0-changelog/SKILL.md +2 -2
- package/.claude/skills/k0-discuss/SKILL.md +105 -0
- package/.claude/skills/k0-discuss/references/rounds.md +280 -0
- package/.claude/skills/k0-epic/SKILL.md +196 -0
- package/.claude/skills/k0-links/.claude-plugin/plugin.json +6 -0
- package/.claude/skills/k0-links/hooks/hooks.json +1 -0
- package/.claude/skills/k0-links/hooks/links.js +128 -0
- package/.claude/skills/k0-links/hooks/register.js +204 -0
- package/.claude/skills/k0-next/SKILL.md +82 -0
- package/.claude/skills/k0-order/SKILL.md +123 -0
- package/.claude/skills/k0-plan/SKILL.md +156 -0
- package/.claude/skills/k0-split/SKILL.md +169 -0
- package/.claude/skills/k0-story/SKILL.md +108 -0
- package/.claude/skills/k0-ultracode/SKILL.md +251 -0
- package/.claude/skills/k0-ultracode/references/agent-brief.md +71 -0
- package/.claude/skills/k0-ultracode/references/modes.md +49 -0
- package/.claude/skills/k0-verify/SKILL.md +219 -0
- package/.claude/skills/k0-whatsnew/SKILL.md +95 -0
- package/.claude/skills/k0-work/SKILL.md +212 -0
- package/CHANGELOG.md +426 -1
- package/LICENSE +83 -18
- package/README.md +1141 -119
- package/bin/k0-board.js +127 -12
- package/menubar/K0MenuBar.swift +35 -5
- package/package.json +14 -2
- package/platform/contract.js +30 -5
- package/platform/darwin/terminal.js +230 -56
- package/platform/index.js +2 -1
- package/platform/linux/index.js +3 -0
- package/platform/linux/tray.py +10 -10
- package/platform/shared/command.js +19 -3
- package/platform/shared/tmux.js +32 -14
- package/platform/win32/index.js +5 -2
- package/platform/win32/terminal.js +24 -8
- package/platform/win32/tray.ps1 +13 -13
- package/server/backlog.js +618 -0
- package/server/changelog.js +13 -13
- package/server/cloud.js +355 -0
- package/server/db.js +2117 -146
- package/server/files.js +60 -21
- package/server/git.js +53 -14
- package/server/idle.js +15 -13
- package/server/index.js +1341 -186
- package/server/launcher.js +122 -14
- package/server/machine.js +10 -1
- package/server/mirror.js +1069 -0
- package/server/prices.js +59 -0
- package/server/projects.js +57 -12
- package/server/servers.js +22 -1
- package/server/sessions.js +5 -5
- package/server/settings.js +25 -2
- package/server/sync.js +383 -0
- package/server/update.js +325 -0
- package/server/usage.js +642 -0
- package/server/watcher.js +67 -13
- package/server/worktree.js +600 -0
- package/server/writer.js +98 -26
- package/web/account.js +265 -0
- package/web/awake.js +62 -0
- package/web/base.css +97 -0
- package/web/board.css +396 -16
- package/web/board.js +1182 -152
- package/web/changelog.js +3 -3
- package/web/files.js +73 -16
- package/web/index.html +110 -12
- package/web/list.css +536 -0
- package/web/list.js +1015 -0
- package/web/mentions.js +27 -9
- package/web/recency.js +10 -10
- package/web/units.js +1 -1
- package/web/usage.css +169 -0
- package/web/usage.html +78 -0
- package/web/usage.js +447 -0
- package/web/view.js +22 -3
- package/web/whatsnew.css +211 -0
- package/web/whatsnew.html +49 -0
- package/web/whatsnew.js +339 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,428 @@ All notable changes to this project are documented here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.6.0]
|
|
10
|
+
|
|
11
|
+
k0 gets an account and a cloud. The board still runs on your machine and keeps working with no
|
|
12
|
+
network, but it now keeps a copy of itself in k0 Cloud, signs in with GitHub or Google, and numbers
|
|
13
|
+
every story once for your whole account instead of once per repository; a board that existed before
|
|
14
|
+
moves over once, after you have seen every old number beside its new one. k0 is in early access,
|
|
15
|
+
and from this version on it is source-available under the Sustainable Use License rather than MIT.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- **k0 Cloud: your board keeps a copy of itself, and you sign in with GitHub or Google.** The board
|
|
20
|
+
still lives on your machine and works with no network at all; every few seconds it sends what
|
|
21
|
+
changed and fetches what your other machines changed, so it survives a lost laptop and reaches a
|
|
22
|
+
second one. Which terminal a session is in, the folder it works in and the commit it started at
|
|
23
|
+
never leave the machine, and nothing from your repositories goes up — not files, not commits.
|
|
24
|
+
k0 is in early access: once you are signed in the board says *You are on the list* and sends
|
|
25
|
+
nothing until your account has been approved, and it notices the approval by itself. The
|
|
26
|
+
sign-in screen only stands in front of the board when there is a way past it. A read-only board
|
|
27
|
+
on the web, and the page where accounts are approved, are coming with the site.
|
|
28
|
+
- **A key is one number for your whole account.** `K150` is the same story in every repository and
|
|
29
|
+
on every machine, and the number comes from the cloud the moment the story is made. Without a
|
|
30
|
+
connection the story is made anyway with a provisional key, `K~3`, which becomes a real one —
|
|
31
|
+
file in `.k0/` renamed with it — as soon as the cloud answers again. Without an account the same
|
|
32
|
+
single counter is kept on your machine.
|
|
33
|
+
- **Moving a board you already had to the account, once, when you say so.** The first time you
|
|
34
|
+
sign in on a machine whose board has stories, nothing is sent until the board has been moved:
|
|
35
|
+
the board shows every old key beside its new one, repository by repository, and how many plans,
|
|
36
|
+
prompts and decisions mention a key. On yes it keeps a copy of the whole board first, renumbers
|
|
37
|
+
everything in the order it was made, updates the keys written inside the text, renames the
|
|
38
|
+
files in `.k0/`, and leaves a list of every old key and its new one beside the copy. *Not now*
|
|
39
|
+
leaves the board exactly as it was.
|
|
40
|
+
- **Who is signed in, and whether the cloud has everything, at the end of the top bar.** Your
|
|
41
|
+
picture and a dot: green when everything is in the cloud, amber while changes are waiting, grey
|
|
42
|
+
when the cloud cannot be reached and the board is carrying on by itself. Its menu has *Sync now*
|
|
43
|
+
and *Sign out*.
|
|
44
|
+
- **`k0-board login` and `k0-board logout`**, and a *k0 Cloud* section in `k0-board doctor` saying
|
|
45
|
+
who is signed in, whether they have been let in, whether the board still has to be moved, and
|
|
46
|
+
how many changes are waiting.
|
|
47
|
+
|
|
48
|
+
How far this has been tried: the whole road was run against the real cloud with a throwaway
|
|
49
|
+
account — signing in, waiting to be let in, the move, a new story numbered by the cloud, and its
|
|
50
|
+
rows arriving there — and the move was rehearsed on a copy of a real board of 938 stories across
|
|
51
|
+
25 repositories. Signing in with GitHub or Google for real has not been tried yet, because neither
|
|
52
|
+
is switched on in the cloud.
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
|
|
56
|
+
- **A story moved to another repository keeps its key.** It used to be given a new one from the
|
|
57
|
+
repository it moved to; now that a key is one number for the whole account, there is nothing
|
|
58
|
+
there for it to collide with.
|
|
59
|
+
|
|
60
|
+
- **k0 is now under the Sustainable Use License instead of MIT.** The code stays public, all of it,
|
|
61
|
+
and you can still use it, change it, and run it for yourself or inside your company; what the
|
|
62
|
+
license no longer allows is taking k0 and selling it to other people as a hosted service. It is
|
|
63
|
+
source-available, not open source, and k0 no longer calls itself that. Versions up to and
|
|
64
|
+
including 0.5.0 were released under MIT and remain under it. The manual and the security notes
|
|
65
|
+
also stop saying that k0 makes a single network request: it now has an account and a cloud of
|
|
66
|
+
its own, and they say so — two places, the cloud and the daily version check, and still nothing
|
|
67
|
+
else.
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
|
|
71
|
+
- **The new tests pass on Windows too.** Nothing about k0 itself changed.
|
|
72
|
+
|
|
73
|
+
## [0.5.0]
|
|
74
|
+
|
|
75
|
+
**The board tells you what to do next, and starts it.** Every story carries one button saying the
|
|
76
|
+
one thing to do with it — *Discuss*, *Plan*, *Work*, or *Resume* on a terminal that was closed —
|
|
77
|
+
and pressing it opens a terminal with the command already sent. Beside it, **Quick Start** opens an
|
|
78
|
+
empty one and leaves the typing to you: the long way round and the short way in, and nothing else.
|
|
79
|
+
You work there and come back when it is done. That is the whole shape of it: the board is the menu,
|
|
80
|
+
the commands are the engine, and you no longer have to know ten commands by heart to find the way
|
|
81
|
+
in.
|
|
82
|
+
|
|
83
|
+
Underneath that, the board learns what the work is *about*. A post-it is now a **story** with a
|
|
84
|
+
stable key of its own — `K42`, and it keeps it for life — and stories can sit under an **epic**, be
|
|
85
|
+
split into tasks, wait on each other, and carry the **decisions** that were taken while they were
|
|
86
|
+
discussed. A `.k0/` folder in each repository keeps a readable copy that survives a lost database,
|
|
87
|
+
and a **counter-check** holds the finished work up against every decision, one by one, before
|
|
88
|
+
anybody presses Done. None of it changes the board you already know: switch the backlog off and it
|
|
89
|
+
is exactly the board it was.
|
|
90
|
+
|
|
91
|
+
### Added
|
|
92
|
+
|
|
93
|
+
- **What Claude points at in a session is one click away, while k0 is running.** Everything the
|
|
94
|
+
last reply named — an address, a folder, a document, an artifact the session published — sits in
|
|
95
|
+
a row just above the prompt, and one click opens it: the browser, Finder, the file viewer, or the
|
|
96
|
+
artifact's claude.ai page. Claude's reply itself is left exactly as it was drawn. It is a Claude
|
|
97
|
+
Code mod the installer offers together with the commands, so it works in every session on the
|
|
98
|
+
machine, and it does nothing at all while k0 is off.
|
|
99
|
+
- **A button on every story saying what to do with it next, which opens the terminal on it.**
|
|
100
|
+
*Discuss* on something nothing has been decided about, *Plan* once it has been discussed, *Work*
|
|
101
|
+
once there is a plan, and *Resume* on a story whose terminal was closed — three words in the
|
|
102
|
+
order the work goes in, and a fourth that is not a command at all. Hover it and it says why this
|
|
103
|
+
and not something else. Pressing it opens a terminal with `/k0-plan K42` already in it and
|
|
104
|
+
already sent, rather than left sitting under the cursor. A story with a session running carries
|
|
105
|
+
no button, because the terminal is where the work is and a double click on the note goes there;
|
|
106
|
+
so does one waiting to be looked over, and one that is done. k0 works out which, and it is the
|
|
107
|
+
same reasoning `/k0-next` does — so the note, the row in the list and the command can never give
|
|
108
|
+
you three different answers. Only `/k0-work` counts as the work having begun: pressing *Discuss*
|
|
109
|
+
leaves the story where it was until the discussion moves it.
|
|
110
|
+
- **Quick Start, the short way in.** It opens a terminal on the story with nothing in it and lets
|
|
111
|
+
you type there. It is the plain button on a story with no suggestion and a quiet link beside the
|
|
112
|
+
suggestion on one that has, and it is what the `+` offers next to *Discuss* when you write a new
|
|
113
|
+
story down.
|
|
114
|
+
- **Notes on a story, which are yours and go nowhere.** Editing a story gives you a list to jot
|
|
115
|
+
things into; they sit on the post-it where you can read them and are never sent to Claude Code.
|
|
116
|
+
A story being written for the first time is not asked for them: at that moment there is nothing
|
|
117
|
+
to note down yet.
|
|
118
|
+
- **The flag is put on from the note, in passing.** It was a checkbox in the pencil dialog, which
|
|
119
|
+
meant opening the dialog, ticking a box and saving for a mark you change your mind about twice a
|
|
120
|
+
day. It is now the glyph at the bottom corner of the post-it: invisible until the pointer is on
|
|
121
|
+
the note, one click on, one click off. A flagged note keeps it lit, takes its border, and its key
|
|
122
|
+
and title take the same colour — so you can tell a flagged one from across the room and not only
|
|
123
|
+
by a hairline.
|
|
124
|
+
- **The repository menu is k0's own, with a search in it.** It was the system's dropdown, which on
|
|
125
|
+
macOS opens a panel from another application in the middle of a board made of paper and cannot
|
|
126
|
+
hold a search at all. It is now the same picker the new-story dialog has: type three letters,
|
|
127
|
+
press Enter.
|
|
128
|
+
- **Epics, stories and tasks.** One post-it is one story. A story can belong to an epic, and a
|
|
129
|
+
story that turned out too big to close is split into tasks that inherit its context. Every one
|
|
130
|
+
of them gets a key — `K42` — that is never reused and never reassigned. That key is the only
|
|
131
|
+
name a story has: where it sits is the tree itself, which can be read.
|
|
132
|
+
- **Decisions you can hold work against.** What was settled while a story was discussed is
|
|
133
|
+
written down one sentence at a time, numbered, and never rewritten — a decision that changes is
|
|
134
|
+
*superseded* by the one that replaced it, and both stay. An epic's decisions are inherited by
|
|
135
|
+
every story under it rather than copied into them, so reversing one reverses it everywhere at
|
|
136
|
+
once.
|
|
137
|
+
- **The counter-check.** `/k0-verify` walks the finished work against every decision the story is
|
|
138
|
+
held to and records a verdict for each, with the evidence. It answers all of them or the run
|
|
139
|
+
does not count, and it never writes over the run before it. A story cannot be marked Done while
|
|
140
|
+
a decision the counter-check found broken has not been answered since — k0 names it, says which
|
|
141
|
+
run found it and what to do about it, instead of quietly letting it through.
|
|
142
|
+
- **Nine commands you type.** `/k0-epic`, `/k0-story`, `/k0-discuss`, `/k0-split`, `/k0-plan`,
|
|
143
|
+
`/k0-work`, `/k0-verify`, `/k0-next`, `/k0-order`. **The installer offers to copy them into your
|
|
144
|
+
own `~/.claude/skills/` in one question**, together with `/k0-import` — and that question is the
|
|
145
|
+
whole setup, because Claude Code looks for a command in the repository you have open and in your
|
|
146
|
+
own skills folder and nowhere else. A command that was never copied out is a command that does
|
|
147
|
+
not exist, and the buttons on the board that offer to run one lead nowhere. If you are not sure
|
|
148
|
+
you said yes, run `npx k0-board@latest` again: it asks only about the ones that are missing.
|
|
149
|
+
They ask their questions in rounds, say how many rounds are left, stop when nothing more would
|
|
150
|
+
change the work, and write every round down before asking the next one — so a terminal that dies
|
|
151
|
+
at round three does not take the first three with it. Everything you say is stored in the
|
|
152
|
+
language you said it in.
|
|
153
|
+
- **A flag, and what waits on what.** A story can be flagged — from the pencil, with the rest of
|
|
154
|
+
what you decide about a story — and it is drawn in the corner of the note with a border round
|
|
155
|
+
the note in the same colour, so a flagged story can be picked out from across the room. A story
|
|
156
|
+
can also be told to wait on another one. Waiting is a note and not a lock: nothing refuses to
|
|
157
|
+
start a story that is waiting, the note is simply marked and it sinks down the running order.
|
|
158
|
+
Opened in the list, a story says both directions: what it is waiting for, and what is waiting for
|
|
159
|
+
it — which is usually the real reason to finish one thing before another.
|
|
160
|
+
- **Something that says what to pick up next.** `/k0-next` answers in one sentence, and the
|
|
161
|
+
answer is k0's rather than the model's — a live session first, then whatever has been sitting
|
|
162
|
+
in Review longest, then what is not waiting on unfinished work, then the flag. Ask twice and
|
|
163
|
+
you get the same answer.
|
|
164
|
+
- **Two views of the same stories: Kanban and List.** The switch is in among the filters, because
|
|
165
|
+
it is the same kind of question — the state pills, the repository and the epic apply to both, so
|
|
166
|
+
changing shape never changes what is in scope. **Kanban** is the board you know, for working: one
|
|
167
|
+
column per repository, and a note now carrying its key, its epic as a coloured label, its flag
|
|
168
|
+
and what it waits on. **List** is for planning: the same stories as rows, three levels deep and
|
|
169
|
+
every repository at once, with a thin heading per repository and epics that open and close with
|
|
170
|
+
their progress bar and, while a discussion is running, which round it is on. Drag a row to
|
|
171
|
+
reorder it, or onto another epic to move it there — those are the two things the interface could
|
|
172
|
+
never do. Dragging never changes state.
|
|
173
|
+
- **The whole of a story, beside the row rather than under it.** Click a row and it opens to the
|
|
174
|
+
side: the counter-check first, then why it exists, the rounds with their questions and answers,
|
|
175
|
+
the decisions with the verdict each one got, the plan, the checklist and the log, and a line
|
|
176
|
+
saying both what it waits for and what is waiting for it. Beside, so the rows you were comparing
|
|
177
|
+
it against do not scroll away. Click an epic and the epic opens the same way — the rounds it was
|
|
178
|
+
argued out in and the decisions every story under it is held to, which is the only place that
|
|
179
|
+
conversation can be watched, because it happens before a single story exists. It follows a
|
|
180
|
+
discussion while the discussion is happening, an epic's as well as a story's.
|
|
181
|
+
- **The `+` makes an epic as well as a story.** It is a small menu now: **Story** is the dialog you
|
|
182
|
+
know, with one field added for the epic it belongs to — pick one this repository already has, or
|
|
183
|
+
type a name and it is made on the spot. **Epic** asks which repository and then opens a terminal
|
|
184
|
+
running `/k0-epic`, because an epic is what a discussion leaves behind and naming one before that
|
|
185
|
+
discussion has happened names something nobody has decided the shape of yet.
|
|
186
|
+
- **A `.k0/` folder in each repository.** One file per epic and one per story, rewritten whenever
|
|
187
|
+
the story changes: the whole backlog in Markdown, readable in a diff and committable. A story's
|
|
188
|
+
file carries the decisions it inherited from its epic as well as its own, under the names the
|
|
189
|
+
counter-check uses — so a file that says `K7·D3` was broken also says, further up, what `K7·D3`
|
|
190
|
+
was. It is also the way back — k0 can rebuild a lost database from those files. Nothing of the
|
|
191
|
+
backlog is written anywhere else in your repository, and never in your `.gitignore`; the one
|
|
192
|
+
other thing that writes into a repository at all is the worktree below, and you have to ask
|
|
193
|
+
for it.
|
|
194
|
+
- **Worktrees, from the board.** `/k0-work` opens a worktree for a session from the branch you
|
|
195
|
+
are standing on, works there, and brings its branch back as a single merge commit before
|
|
196
|
+
removing it. Never a push, never a pull request, and never a conflict resolved on your behalf.
|
|
197
|
+
It also never runs your tests in there, and says why.
|
|
198
|
+
- **A What's New page.** After an update, a discreet dot appears next to `k0` in the top bar and
|
|
199
|
+
leads to a page that says what changed between the version you had and the one running now —
|
|
200
|
+
written by your own Claude, in your language, at the level of detail you ask for. It never
|
|
201
|
+
opens by itself, and the dot goes out when you have read it.
|
|
202
|
+
- **k0 now makes one network request.** Once a day it asks the public npm registry whether there
|
|
203
|
+
is a newer `k0-board`, so the board can mention it. The package name is in the address and
|
|
204
|
+
nothing else: nothing about you, your repositories or your commits leaves the machine, nothing
|
|
205
|
+
is downloaded, and `"updateCheck": false` stops it opening a socket at all.
|
|
206
|
+
- **All of it can be switched off**, from `~/.k0/config.json` — the file the idle timeout already
|
|
207
|
+
lives in, not the database, because a switch you would need `sqlite3` to reach is not a switch.
|
|
208
|
+
`"backlog": false` and the board is the board it always was: nothing extra on a note, no
|
|
209
|
+
next-step button, no Kanban/List switch in the bar, a `+` with no menu behind it, no `.k0/`
|
|
210
|
+
folder created anywhere, and every command says the backlog is turned off rather than reporting
|
|
211
|
+
an empty one — "there is nothing here" and "you turned this off" read the same, and only one of
|
|
212
|
+
them is worth acting on.
|
|
213
|
+
k0 re-reads the file when it changes, so nothing has to be restarted.
|
|
214
|
+
- **`/k0-ultracode`: a story, or a whole epic, run by a manager with agents under it.** It cuts the
|
|
215
|
+
plan into assignments, gives each one to an agent working in a copy of the repository of its own,
|
|
216
|
+
brings the work back one piece at a time, and then — on your branch, never inside a worktree —
|
|
217
|
+
runs the tests, has the result read by an agent that wrote none of it, and walks the story past
|
|
218
|
+
every decision before starting the next one. It asks two questions at the start and never asks
|
|
219
|
+
again: how much rope (*interactive*, *checkpoint* or *autonomous*) and how hard (two, three or
|
|
220
|
+
five agents at a time, one repair attempt or two). Both answers go into the Log, so a terminal
|
|
221
|
+
closed halfway through is picked up on the same terms. It never pushes, never presses **Done** —
|
|
222
|
+
the stories come back in `Review`, counter-checked — and it stops rather than grinding on: the
|
|
223
|
+
repair attempts are spent, what is still broken is said out loud, and everything that works is
|
|
224
|
+
already merged. On the board it sits beside *Work* as a second, quieter word, and on an epic it
|
|
225
|
+
is in the epic's own panel.
|
|
226
|
+
- **A Usage page: what your sessions consumed, a week at a time.** The icon with three bars in the
|
|
227
|
+
top bar opens it. It shows what each day would have cost at the API price list, stacked by model
|
|
228
|
+
(with a subscription you do not pay this, and the page says so), and splits the week by model and
|
|
229
|
+
effort, fast mode included; by the conversation, its subagents and workflow agents; by
|
|
230
|
+
repository; and by account. Every session is listed, the most expensive first, with its model
|
|
231
|
+
and effort, how long Claude actually worked on your turns, its tokens, its cost and how many times
|
|
232
|
+
a limit stopped it. A session that belongs to a story links to it, and the story opens on the
|
|
233
|
+
board. It costs no tokens and opens no connection: everything is read from the transcripts
|
|
234
|
+
Claude Code already keeps on your disk, the history a few megabytes at a time so the board never
|
|
235
|
+
stalls. Two things Claude Code does not keep are handled openly. Which account a reply came from
|
|
236
|
+
is only known from the moment k0 is running, so anything older says *Unknown account* rather than
|
|
237
|
+
being guessed. How full the five-hour and weekly limits are is only handed to the statusline, so
|
|
238
|
+
the manual has a few lines to add to yours; with them, the page draws each account's week and
|
|
239
|
+
estimates, marked `≈`, how much of it each session used. Tried on a copy of a real board with
|
|
240
|
+
four gigabytes of transcripts: the whole history was read in under half a minute without ever
|
|
241
|
+
holding the board up for more than a tenth of a second, and one session counted by hand matched
|
|
242
|
+
it reply for reply.
|
|
243
|
+
|
|
244
|
+
### Changed
|
|
245
|
+
|
|
246
|
+
- **The documents in `out/` are in the file viewer.** A folder of documents keeps what it makes in
|
|
247
|
+
`out/`, and k0 skipped that directory whole because in a code repository it is generated — so a
|
|
248
|
+
folder with twenty-one PDFs and a quiz page in it showed none of them, in the listing, in the
|
|
249
|
+
search by name, or in the files a pasted chat names. `out/`, `dist/` and `build/` are now walked
|
|
250
|
+
into like anywhere else, and the documents in them are listed like any others: the PDFs, the Word
|
|
251
|
+
files, and the pages you open with a double click. Only what a build leaves lying about stays
|
|
252
|
+
out. Where git is in charge git still decides — a directory your `.gitignore` names gives up its
|
|
253
|
+
finished documents and not its pages, because one real site's ignored `dist/` is four thousand
|
|
254
|
+
pages and none of them is the file you went looking for.
|
|
255
|
+
|
|
256
|
+
- **A pasted chat finds a file it names even when the listing has not got it.** Writing
|
|
257
|
+
`out/report.html` in full used to come to nothing at all — not found, not counted, not even
|
|
258
|
+
reported as missing, because no file of that kind was in the listing to compare it with. Now the
|
|
259
|
+
names written out in full that the listing cannot place are checked against the disk, in one
|
|
260
|
+
question, and the ones that are really there come out in the results like any other file, in the
|
|
261
|
+
order the text names them.
|
|
262
|
+
|
|
263
|
+
- **The machine chip says what k0 itself costs.** It measured the sessions and it measured Chrome,
|
|
264
|
+
and never the thing doing the measuring — which for a server that runs under launchd for weeks is
|
|
265
|
+
the one thing it should be least able to hide. Hovering it now also gives k0's own weight and CPU,
|
|
266
|
+
how many times a minute it asks git anything, how many queries it is holding, and how hard the
|
|
267
|
+
watching loop is currently running.
|
|
268
|
+
|
|
269
|
+
- **A card is now a story, everywhere.** The word changed on the board, in the commands k0 ships
|
|
270
|
+
and in what k0 stores. Your board comes back exactly as you left it — same post-its, same
|
|
271
|
+
colours, same ages, same order — but what a post-it stands for now has room for what the work
|
|
272
|
+
is about.
|
|
273
|
+
- **A story's state and its session's status are two different things.** Backlog · Discussed ·
|
|
274
|
+
Planned · Working · Review · Done is where the *work* is; Working · Planning · Planned · Ask ·
|
|
275
|
+
Idle is what the *session* is doing this second. They used to be one column fighting itself,
|
|
276
|
+
which is why ticking something off used to lose what the terminal was in the middle of.
|
|
277
|
+
- **A story keeps every session it has had**, rather than only the last one. Starting a new
|
|
278
|
+
conversation on old work no longer throws away the record of what was tried before.
|
|
279
|
+
- The ChangeLog page and its writer say *story* where they said *card*.
|
|
280
|
+
- **The top bar is one row again.** Two views, a repository filter and seven state pills had pushed
|
|
281
|
+
it onto a second line: the four mode buttons at the end now stand two by two, and the memory chip
|
|
282
|
+
puts RAM, CPU and the closing time one under the other instead of writing them across.
|
|
283
|
+
- **Driving mode resizes the terminals, not just their text.** A terminal you glance at from across
|
|
284
|
+
the room now takes the whole free screen while Driving is lit, and goes back to its usual size and
|
|
285
|
+
its usual text the moment you leave it — one gesture instead of large text left sitting in a small
|
|
286
|
+
window. The price, which used to be the other way round: a window you had dragged onto a second
|
|
287
|
+
screen comes back to the middle of the main one.
|
|
288
|
+
|
|
289
|
+
- **The age at the bottom of a post-it stopped lying.** Starting a session used to leave the line
|
|
290
|
+
blank and the tooltip reading "Your turn for "; a story that had been started before inherited
|
|
291
|
+
the previous session's age and claimed five days the moment you pressed Start; a job you
|
|
292
|
+
reopened said "4 days" instead of "now"; and a backlog post-it jumped to "now" when something
|
|
293
|
+
moved it between two states that look identical on the board. All four were one line reading
|
|
294
|
+
the wrong entry in the story's history.
|
|
295
|
+
- **A board that lost power while it was being brought forward opens again.** The first time this
|
|
296
|
+
version runs, it moves your board to the shape described above. That used to be one long step
|
|
297
|
+
with a single test in front of it: a machine that went down in the middle left a board that
|
|
298
|
+
would never open again, and a second attempt would have given every story a duplicate of every
|
|
299
|
+
session it had lived through. The move is now done in pieces that each stand on their own, and
|
|
300
|
+
k0 writes down that it has been done, so it cannot happen twice.
|
|
301
|
+
- **A story moved to another repository is given a key from that repository**, instead of
|
|
302
|
+
carrying its old number into a repository that already has one.
|
|
303
|
+
- **A story that had somehow been made its own parent can be thrown away again.** The board will
|
|
304
|
+
not make that shape now, and a board that already had one no longer refuses to delete it.
|
|
305
|
+
- **Notes written under the title of a `.k0/` file stay there.** The folder's own README promises
|
|
306
|
+
that whatever you add above the first heading is left alone, and it was not: every rewrite ate
|
|
307
|
+
one more paragraph of it, and the rewrite after that ate the next, until there was nothing left
|
|
308
|
+
and nothing anywhere saying there ever had been. An epic lost them fastest, because an epic has
|
|
309
|
+
no post-it line of its own for k0 to have been aiming at.
|
|
310
|
+
|
|
311
|
+
### Fixed
|
|
312
|
+
|
|
313
|
+
- **The tests pass on Windows and Linux again**, where three of them depended on line endings, on
|
|
314
|
+
how Windows spells its temporary folder, and on two settings changes landing in different
|
|
315
|
+
milliseconds. Nothing about k0 itself changed.
|
|
316
|
+
- **An open board no longer downloads fifty-six gigabytes a day.** It asked the server for
|
|
317
|
+
everything k0 knows once a second and got all of it — two thirds of a megabyte, six hundred
|
|
318
|
+
stories carrying their whole "Why" and their whole plan, most of them finished weeks ago and
|
|
319
|
+
hidden from view, none of which a post-it draws. The board now sends back a stamp of the answer
|
|
320
|
+
it is holding, and when the answer would be identical the server says so in a couple of hundred
|
|
321
|
+
bytes and sends nothing else; when something really changed, what goes out is only what the
|
|
322
|
+
board draws, compressed. The long texts arrive with the story's own panel, which is where they
|
|
323
|
+
were always read. A board on which nothing is happening also stops asking so often, dropping to
|
|
324
|
+
one round every four seconds until something moves or you come back to the tab.
|
|
325
|
+
- **Building that answer stopped costing a disk scan and a query per story.** Every request listed
|
|
326
|
+
your home directory and asked the disk about each entry in it, for a list of repositories that
|
|
327
|
+
changes about once a week; that reading is now kept for half a minute. And the dependencies were
|
|
328
|
+
one statement per story per request — six hundred a second with a tab open — which is now one
|
|
329
|
+
statement for the whole board.
|
|
330
|
+
- **The file viewer asks git every ten seconds instead of every three.** Each round runs two git
|
|
331
|
+
processes against the repository you are reading, and you are reading it, not watching it.
|
|
332
|
+
|
|
333
|
+
- **k0 stops costing anything on a machine nobody is using.** The watching loop went round once a
|
|
334
|
+
second for ever — awake or asleep, looked at or not — and every round asked the database about
|
|
335
|
+
every story twice over and every repository on the board about its git state. On a real board
|
|
336
|
+
that was a couple of dozen git processes every five seconds, dead ones piling up faster than they
|
|
337
|
+
could be buried, and about five per cent of a processor core burnt around the clock, a third of
|
|
338
|
+
it inside SQLite's parser compiling the same queries again. Now the loop goes round every two
|
|
339
|
+
seconds while a session is running or you are in front of the board, and once a minute when there
|
|
340
|
+
is neither, waking at once on anything you press; the queries are compiled once and kept; git is
|
|
341
|
+
asked at most every half minute, and away from the board only about the repositories a session is
|
|
342
|
+
actually working in. Nothing you can see on the board changed.
|
|
343
|
+
- **A board left open in a background tab stops asking.** Every tab polled the server once a second
|
|
344
|
+
whether or not anybody could see it, and because asking is how the server learns somebody is
|
|
345
|
+
watching, a single forgotten tab kept it walking the whole process table and questioning git
|
|
346
|
+
indefinitely. Both the board and the file viewer now pause while their tab is hidden, and take a
|
|
347
|
+
fresh reading the moment you come back — so the first look is never stale. The file viewer's git
|
|
348
|
+
polling stops with it.
|
|
349
|
+
- **The breath on a working post-it no longer costs a repaint.** The faint pulse was an animated
|
|
350
|
+
blurred shadow, which a browser cannot compose and has to redraw sixty times a second, for every
|
|
351
|
+
working post-it, in every open tab. It is now drawn on a layer of its own with only its opacity
|
|
352
|
+
moving. It looks the same, except that the ring sits just inside the post-it's edge rather than
|
|
353
|
+
just outside it.
|
|
354
|
+
- **Sessions that end are forgotten.** k0 kept a note of every session it had ever watched, holding
|
|
355
|
+
the tail of its transcript, and only ever let go of one when a story was deleted or a terminal
|
|
356
|
+
closed by hand — which is not how most sessions end. On a board that had seen a few hundred, that
|
|
357
|
+
was most of what the server was holding at rest.
|
|
358
|
+
- **Clipboard images are swept while k0 is running, not only when it starts.** The sweep was called
|
|
359
|
+
once, at launch, on an app that starts at login and stays up for weeks, so it only ever tidied
|
|
360
|
+
away the session before. A folder of pasted screenshots had grown to 907 MB. It now runs every ten
|
|
361
|
+
minutes, and there is a ceiling on the whole folder as well as on the age of what is in it: one
|
|
362
|
+
screenshot off a large display is ten megabytes, so age alone was never a bound.
|
|
363
|
+
- **A dev server k0 lost track of is not remembered as running.** Rows pointing at processes that
|
|
364
|
+
died while k0 was not running are cleared on the way up. A pid is a number the operating system
|
|
365
|
+
hands out again, and a stale row is one that eventually names somebody else's process.
|
|
366
|
+
|
|
367
|
+
- **Sessions opened by k0 have Claude Code's task list again.** On a newer model such as Opus 5,
|
|
368
|
+
Claude Code starts without its task tools unless it is told otherwise, so a session asked to keep
|
|
369
|
+
a task per step was refused every time it tried. Every session k0 starts, new or resumed, now has
|
|
370
|
+
them, and `/k0-plan`, `/k0-work` and `/k0-verify` keep one task per phase, per step and per
|
|
371
|
+
decision. A session that was already open gets them by being resumed.
|
|
372
|
+
- **Installing again brings your copies of the commands up to date.** They were copied into
|
|
373
|
+
`~/.claude/skills/` once and never again, so a command fixed in a later version kept running its
|
|
374
|
+
old text. Copies that differ from the ones in the package are now replaced, and the installer
|
|
375
|
+
names them.
|
|
376
|
+
- **Double-clicking a post-it does something on every note, not on half of them.** It brought the
|
|
377
|
+
terminal to the front on a story that had one running and did nothing at all on any other, so it
|
|
378
|
+
was a gesture you could not rely on. It now goes where the work is: the terminal if one is
|
|
379
|
+
running, the conversation the closed terminal left behind, and a fresh session on a story that
|
|
380
|
+
never had one.
|
|
381
|
+
- **"That window is gone" stopped being said about a session that is still running.** Closing a
|
|
382
|
+
Terminal window by hand leaves `claude` thinking inside it, and k0 went on holding a window id
|
|
383
|
+
that no longer answered — so a double click reported the session lost while it was working. k0
|
|
384
|
+
now looks the window up by the name it put on it, brings that one up and writes the id down; when
|
|
385
|
+
there is really nothing left to find, it says the window was closed and the session is still
|
|
386
|
+
running, and offers to open it again.
|
|
387
|
+
- **The buttons on a post-it no longer break a word over two lines.** A label that did not fit the
|
|
388
|
+
268 pixels of a note was wrapped mid-phrase, which read as two buttons and made that note stand a
|
|
389
|
+
row taller than the ones beside it.
|
|
390
|
+
- **A note written under a story's title is no longer eaten.** The `.k0/` copy dropped the first
|
|
391
|
+
paragraph above the first heading every time it rewrote a file, taking it for the standfirst k0
|
|
392
|
+
prints itself. An epic prints no standfirst, and neither does a story with an empty description
|
|
393
|
+
— so for those, what was quietly deleted was something a person had written. One paragraph per
|
|
394
|
+
rewrite, in the folder whose own README promises that what you add under the title is left alone.
|
|
395
|
+
- **A `.k0/` folder no longer appears in a repository that has no backlog.** The sweep wrote the
|
|
396
|
+
README explaining the folder before asking whether there was anything to put in it, which on a
|
|
397
|
+
machine with eighteen checkouts meant eighteen folders nobody had asked for. It appears with the
|
|
398
|
+
first story now, and not before.
|
|
399
|
+
- **git taking too long says so.** A command that ran out of time came back carrying git's own
|
|
400
|
+
command line instead of a sentence, because the timeout was recognised by a code that only the
|
|
401
|
+
synchronous calls set. It is the slowest and most confusing failure there is — a commit hook can
|
|
402
|
+
run for fifteen minutes — and it had the least readable answer.
|
|
403
|
+
- **A story moved to another repository is numbered from one, not from three.** It was given its
|
|
404
|
+
key in its new home after it had already arrived there, so it counted itself.
|
|
405
|
+
- **Changing mode no longer gives up halfway through, in silence.** k0 asked Terminal after every
|
|
406
|
+
window id it had ever recorded, one at a time; on a board of two hundred stories nearly all of
|
|
407
|
+
them named a window closed weeks ago, and the wait for those answers pushed the whole thing past
|
|
408
|
+
its own time limit. It was cut off mid-way: some terminals changed, the rest kept the size they
|
|
409
|
+
had, and the failure was read as "Terminal is not running" and never mentioned. k0 now asks once
|
|
410
|
+
for the windows that are open, which takes about a second whatever the board has been through —
|
|
411
|
+
and a pass that does fail says so in the log.
|
|
412
|
+
- **Changing a story's title really does rename its session, running or not.** The field says the
|
|
413
|
+
title is also the session's name, and only the window's title bar kept the promise: a session
|
|
414
|
+
that was still running kept its old name inside Claude Code, and a session that had worked in a
|
|
415
|
+
worktree kept it for good, because the new name was written into a transcript that was not
|
|
416
|
+
there. Now a running session takes the new name the first time you look at it — with its window
|
|
417
|
+
in front of you and Claude Code sitting idle with nothing under the cursor, k0 types `/rename`
|
|
418
|
+
into it and presses Enter, and you see the command go by. It never brings the window up to do
|
|
419
|
+
that, because the keyboard is yours: a terminal jumping up while you type somewhere else took
|
|
420
|
+
your words with it, which is how the first version of this behaved on the author's Mac and why
|
|
421
|
+
it does not any more. What lands in the box is read back before Enter, and anything other than
|
|
422
|
+
the command is deleted rather than sent. A session that has ended gets the name wherever its
|
|
423
|
+
transcript is, worktree or not. On Linux and Windows the running session still waits for its
|
|
424
|
+
end, and `k0-board doctor` says so. Also fixed when the title is changed by a skill rather than
|
|
425
|
+
from the board, which used to rename nothing at all. Checked by hand on macOS on a session in a
|
|
426
|
+
Terminal window; the rest is covered by tests.
|
|
427
|
+
- **Notes on a post-it keep their lines.** They are written one per line, and the post-it ran them
|
|
428
|
+
together — `- OMI - Locato` for two notes — so a list did not read like one. Each note now sits
|
|
429
|
+
on its own line, and the post-it shows three of them before trimming, the same as the prompt.
|
|
430
|
+
|
|
9
431
|
## [0.4.0]
|
|
10
432
|
|
|
11
433
|
The file viewer stops being read-only, and stops being just a pile of documents. It now shows the
|
|
@@ -339,7 +761,10 @@ here is everything that had to change for it to be somebody else's tool as well.
|
|
|
339
761
|
- The personal fixtures k0 grew up on. `test/clean.test.mjs` now fails the build if any of them
|
|
340
762
|
come back.
|
|
341
763
|
|
|
342
|
-
[Unreleased]: https://github.com/alessio-ragni/k0-board/compare/v0.
|
|
764
|
+
[Unreleased]: https://github.com/alessio-ragni/k0-board/compare/v0.6.0...HEAD
|
|
765
|
+
[0.6.0]: https://github.com/alessio-ragni/k0-board/compare/v0.5.0...v0.6.0
|
|
766
|
+
[0.5.0]: https://github.com/alessio-ragni/k0-board/compare/v0.4.0...v0.5.0
|
|
767
|
+
[0.4.0]: https://github.com/alessio-ragni/k0-board/compare/v0.3.0...v0.4.0
|
|
343
768
|
[0.3.0]: https://github.com/alessio-ragni/k0-board/compare/v0.2.0...v0.3.0
|
|
344
769
|
[0.2.0]: https://github.com/alessio-ragni/k0-board/compare/v0.1.2...v0.2.0
|
|
345
770
|
[0.1.2]: https://github.com/alessio-ragni/k0-board/compare/v0.1.1...v0.1.2
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,86 @@
|
|
|
1
|
-
|
|
1
|
+
# License
|
|
2
|
+
|
|
3
|
+
Versions of k0 (the `k0-board` package) up to and including 0.5.0 were released under the MIT
|
|
4
|
+
License and remain available under it. Everything released after 0.5.0 is licensed as follows.
|
|
2
5
|
|
|
3
6
|
Copyright (c) 2026 Alessio Ragni
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
The licensor is Alessio Ragni. The software is k0, published on npm as `k0-board`, together with
|
|
9
|
+
its source code at https://github.com/alessio-ragni/k0-board. All third party components
|
|
10
|
+
incorporated into the software are licensed under the original license provided by the owner of
|
|
11
|
+
the applicable component. Everything else is available under the Sustainable Use License as
|
|
12
|
+
defined below.
|
|
13
|
+
|
|
14
|
+
## Sustainable Use License
|
|
15
|
+
|
|
16
|
+
Version 1.0
|
|
17
|
+
|
|
18
|
+
### Acceptance
|
|
19
|
+
|
|
20
|
+
By using the software, you agree to all of the terms and conditions below.
|
|
21
|
+
|
|
22
|
+
### Copyright License
|
|
23
|
+
|
|
24
|
+
The licensor grants you a non-exclusive, royalty-free, worldwide, non-sublicensable, non-transferable license
|
|
25
|
+
to use, copy, distribute, make available, and prepare derivative works of the software, in each case subject
|
|
26
|
+
to the limitations below.
|
|
27
|
+
|
|
28
|
+
### Limitations
|
|
29
|
+
|
|
30
|
+
You may use or modify the software only for your own internal business purposes or for non-commercial or
|
|
31
|
+
personal use. You may distribute the software or provide it to others only if you do so free of charge for
|
|
32
|
+
non-commercial purposes. You may not alter, remove, or obscure any licensing, copyright, or other notices of
|
|
33
|
+
the licensor in the software. Any use of the licensor’s trademarks is subject to applicable law.
|
|
34
|
+
|
|
35
|
+
### Patents
|
|
36
|
+
|
|
37
|
+
The licensor grants you a license, under any patent claims the licensor can license, or becomes able to
|
|
38
|
+
license, to make, have made, use, sell, offer for sale, import and have imported the software, in each case
|
|
39
|
+
subject to the limitations and conditions in this license. This license does not cover any patent claims that
|
|
40
|
+
you cause to be infringed by modifications or additions to the software. If you or your company make any
|
|
41
|
+
written claim that the software infringes or contributes to infringement of any patent, your patent license
|
|
42
|
+
for the software granted under these terms ends immediately. If your company makes such a claim, your patent
|
|
43
|
+
license ends immediately for work on behalf of your company.
|
|
44
|
+
|
|
45
|
+
### Notices
|
|
46
|
+
|
|
47
|
+
You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these
|
|
48
|
+
terms. If you modify the software, you must include in any modified copies of the software a prominent notice
|
|
49
|
+
stating that you have modified the software.
|
|
50
|
+
|
|
51
|
+
### No Other Rights
|
|
52
|
+
|
|
53
|
+
These terms do not imply any licenses other than those expressly granted in these terms.
|
|
54
|
+
|
|
55
|
+
### Termination
|
|
56
|
+
|
|
57
|
+
If you use the software in violation of these terms, such use is not licensed, and your license will
|
|
58
|
+
automatically terminate. If the licensor provides you with a notice of your violation, and you cease all
|
|
59
|
+
violation of this license no later than 30 days after you receive that notice, your license will be reinstated
|
|
60
|
+
retroactively. However, if you violate these terms after such reinstatement, any additional violation of these
|
|
61
|
+
terms will cause your license to terminate automatically and permanently.
|
|
62
|
+
|
|
63
|
+
### No Liability
|
|
64
|
+
|
|
65
|
+
As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will
|
|
66
|
+
not be liable to you for any damages arising out of these terms or the use or nature of the software, under
|
|
67
|
+
any kind of legal claim.
|
|
68
|
+
|
|
69
|
+
### Definitions
|
|
70
|
+
|
|
71
|
+
The “licensor” is the entity offering these terms.
|
|
72
|
+
|
|
73
|
+
The “software” is the software the licensor makes available under these terms, including any portion of it.
|
|
74
|
+
|
|
75
|
+
“You” refers to the individual or entity agreeing to these terms.
|
|
76
|
+
|
|
77
|
+
“Your company” is any legal entity, sole proprietorship, or other kind of organization that you work for, plus
|
|
78
|
+
all organizations that have control over, are under the control of, or are under common control with that
|
|
79
|
+
organization. Control means ownership of substantially all the assets of an entity, or the power to direct its
|
|
80
|
+
management and policies by vote, contract, or otherwise. Control can be direct or indirect.
|
|
81
|
+
|
|
82
|
+
“Your license” is the license granted to you for the software under these terms.
|
|
83
|
+
|
|
84
|
+
“Use” means anything you do with the software requiring your license.
|
|
85
|
+
|
|
86
|
+
“Trademark” means trademarks, service marks, and similar rights.
|