ai4kanban 0.7.1 → 0.8.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/README.md +32 -56
- package/bin/ai4kanban.mjs +41 -3
- package/dist/kanban.mjs +14721 -7438
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,17 +65,12 @@ akb skill install # add it, or bring an older copy up to date
|
|
|
65
65
|
That writes one file into `.claude/skills/kanban/` (Claude Code) and
|
|
66
66
|
`.agents/skills/kanban/` (Codex): `SKILL.md`, a short note telling a coding agent the board
|
|
67
67
|
is here and that `akb` owns it. The board app does the same thing from a button:
|
|
68
|
-
**Configuration →
|
|
68
|
+
**Configuration → General**.
|
|
69
69
|
|
|
70
70
|
Nothing else is copied in. The flows ship inside the command (`akb guide`), so a newer
|
|
71
|
-
command is newer flows in every project at once
|
|
72
|
-
it
|
|
73
|
-
|
|
74
|
-
An agent that finds no `akb` on the PATH doesn't stop: the note's first section says what to
|
|
75
|
-
run instead — the copy in this project where there is one, and otherwise `npx --yes
|
|
76
|
-
ai4kanban@<the version that wrote the note>`, pinned so the rules match the board. A run
|
|
77
|
-
started from the app or the CLI is told the same thing in its own words, and `akb skill`
|
|
78
|
-
says it to you at the moment the note lands.
|
|
71
|
+
command is newer flows in every project at once, and a project's git history never carries
|
|
72
|
+
350 kB of it. An agent that finds no `akb` on the PATH doesn't stop: the note names what to
|
|
73
|
+
run instead, pinned to the version that wrote it so the rules match the board.
|
|
79
74
|
|
|
80
75
|
## Update
|
|
81
76
|
|
|
@@ -86,15 +81,11 @@ npm install -g ai4kanban@latest # a newer command
|
|
|
86
81
|
akb update # a repaired board, from the project root
|
|
87
82
|
```
|
|
88
83
|
|
|
89
|
-
`akb update` refreshes a skill folder that is already there — it never adds one
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
It can't do the first line to itself — replacing the file that is running is how you get
|
|
96
|
-
half a command — so it checks npm and names that line when it is behind, rather than
|
|
97
|
-
reporting success a release late.
|
|
84
|
+
`akb update` refreshes a skill folder that is already there — it never adds one — adds
|
|
85
|
+
whatever an older release never wrote to the board, clears out what it no longer writes, and
|
|
86
|
+
prints which version you moved from and to with a link to everything that changed in between.
|
|
87
|
+
Your cards, config, and memory are never touched. It can't do the first line to itself, so it
|
|
88
|
+
checks npm and names that line when it is behind.
|
|
98
89
|
|
|
99
90
|
## Put an agent to work
|
|
100
91
|
|
|
@@ -103,7 +94,8 @@ card can be built from a terminal, over ssh, or from a script, without a chat se
|
|
|
103
94
|
without a browser.
|
|
104
95
|
|
|
105
96
|
```bash
|
|
106
|
-
akb implement 12 # build the card
|
|
97
|
+
akb implement 12 # build the card, then review what was built
|
|
98
|
+
akb review 12 # judge the delivery in flight on it again
|
|
107
99
|
akb refine 12 # sharpen it until it is ready to build
|
|
108
100
|
akb create "add dark mode" # write the card(s) for it
|
|
109
101
|
akb propose # write the next tasks
|
|
@@ -118,11 +110,10 @@ point at, and the command that closes the job.
|
|
|
118
110
|
akb implement 12 --print # the steps, for whoever is asking
|
|
119
111
|
```
|
|
120
112
|
|
|
121
|
-
That is the mode for an agent already in a session: it does the job
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
started always gets the printed flow, so a run can't spawn a copy of itself.
|
|
113
|
+
That is the mode for an agent already in a session: it does the job where it is, rather than
|
|
114
|
+
paying for a second agent to do it. Start a run when you want the work to happen on its own.
|
|
115
|
+
An agent working inside a run always gets the printed flow, so a run can't spawn a copy of
|
|
116
|
+
itself. `akb help runs` carries the whole rule.
|
|
126
117
|
|
|
127
118
|
The run keeps working after the command returns. Watch it, or stop it, from anywhere —
|
|
128
119
|
including from the board app, which drives its buttons through these same commands:
|
|
@@ -168,31 +159,19 @@ akb chat 12 # the conversation so far
|
|
|
168
159
|
akb chat 12 --clear # forget it and start fresh
|
|
169
160
|
```
|
|
170
161
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
board when it needs it.
|
|
176
|
-
|
|
177
|
-
The reply arrives as it is written, and the next message lands in the same session — the
|
|
178
|
-
agent still has everything said before, so you can ask a follow-up without explaining your
|
|
179
|
-
project again. Every message is its own command, so the conversation is picked up from any
|
|
180
|
-
terminal and survives closing one. The board's conversation and each card's are separate,
|
|
181
|
-
and both live under `docs/kanban/.chats/`, on your machine and out of git.
|
|
182
|
-
|
|
183
|
-
From there, chat behaves exactly like using the kanban skill in your coding agent. The skill
|
|
184
|
-
prints the board-specific flow and does the work in the conversation by default; ask for a
|
|
185
|
-
background run when you want another agent to take it independently. If you explicitly say
|
|
186
|
-
which way, that wins.
|
|
187
|
-
|
|
188
|
-
A change to a card a run is already working on is refused, and the refusal names the card
|
|
189
|
-
and what that run is doing — the same rule that keeps two runs off one card.
|
|
162
|
+
Chat is the kanban skill in a persistent agent session — the first prompt is only the skill
|
|
163
|
+
invocation and your message, and the skill reads the current board itself. It prints the
|
|
164
|
+
board-specific flow and does the work in the conversation by default; ask for a background run
|
|
165
|
+
when you want another agent to take it independently.
|
|
190
166
|
|
|
191
|
-
|
|
192
|
-
|
|
167
|
+
Every message is its own command, so a conversation is picked up from any terminal and
|
|
168
|
+
survives closing one. The board's conversation and each card's are separate, both under
|
|
169
|
+
`docs/kanban/.chats/`, on your machine and out of git.
|
|
193
170
|
|
|
194
|
-
|
|
195
|
-
|
|
171
|
+
A chat is not a run: it never shows in `akb runs` and never holds a card. A change to a card a
|
|
172
|
+
run is already working on is refused, and the refusal names the card and what that run is
|
|
173
|
+
doing. Only an agent whose command can take a second message into its own session can hold a
|
|
174
|
+
conversation; on any other, chat says so and names the agents that can.
|
|
196
175
|
|
|
197
176
|
## The manual
|
|
198
177
|
|
|
@@ -205,19 +184,16 @@ The flows are `akb guide`:
|
|
|
205
184
|
```bash
|
|
206
185
|
akb guide # every flow, one line each
|
|
207
186
|
akb guide board # how the board works: card format, layout, memory
|
|
208
|
-
akb guide
|
|
187
|
+
akb guide qa-loop # settle one card's planning gaps
|
|
209
188
|
akb guide plan-release # fill a release from its goal
|
|
210
189
|
```
|
|
211
190
|
|
|
212
|
-
A printed flow already carries the ones its action needs, in full, so this is for the
|
|
213
|
-
rest.
|
|
191
|
+
A printed flow already carries the ones its action needs, in full, so this is for the rest.
|
|
214
192
|
|
|
215
|
-
A run that writes or changes a card is followed by `akb refine` on that card,
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
its way. Each one is an ordinary run: it shows in `akb runs`, has its own log, and
|
|
220
|
-
`akb stop` ends it.
|
|
193
|
+
A run that writes or changes a card is followed by `akb refine` on that card, as a run of its
|
|
194
|
+
own — so `akb create`, `akb revise`, `akb resolve`, `akb propose` and `akb plan-release` all
|
|
195
|
+
come back with their cards refined. Archiving or rejecting a card does the same for every card
|
|
196
|
+
it was blocking that now has nothing left in its way.
|
|
221
197
|
|
|
222
198
|
## What it won't do
|
|
223
199
|
|
package/bin/ai4kanban.mjs
CHANGED
|
@@ -188,6 +188,13 @@ async function placeSkill(root, mode) {
|
|
|
188
188
|
const result = installSkill(root, mode === 'update' ? 'present' : undefined, PROGRAM)
|
|
189
189
|
for (const w of result.wrote) did.push(`${w.refreshed ? 'refreshed' : 'wrote'} ${w.path}/ — ${w.files} (${w.agent})`)
|
|
190
190
|
for (const s of result.skipped) notes.push(`${s.path} — ${s.why}`)
|
|
191
|
+
// The commit guard (#324), which goes in wherever the skill does. The FIRST write says
|
|
192
|
+
// so, so a user who ran `akb update` for something else learns it is there before a
|
|
193
|
+
// commit refuses; a rewrite of the board's own copy is silent, the way a refresh is.
|
|
194
|
+
if (result.hook?.wrote && !result.hook.wrote.refreshed) {
|
|
195
|
+
did.push(`wrote ${result.hook.wrote.path} — refuses a commit on the branch a delivery is landing on (\`--no-verify\` gets past it)`)
|
|
196
|
+
}
|
|
197
|
+
if (result.hook?.note) notes.push(result.hook.note)
|
|
191
198
|
// A project that has one agent's folder but not the other's. Update never writes a folder
|
|
192
199
|
// that isn't there — a plugin install keeps the skill in a read-only cache, and a board
|
|
193
200
|
// installed today has no folder at all until someone asks for one. Say the line that adds
|
|
@@ -370,6 +377,7 @@ async function cmdSkill(root, mode) {
|
|
|
370
377
|
say(`ai4kanban ${VERSION} — the coding agent skill in ${root}`)
|
|
371
378
|
say('')
|
|
372
379
|
for (const folder of state.folders) say(` ${folder.path}/ — ${sayFolder(folder)} (${folder.agent})`)
|
|
380
|
+
await sayHookState(root)
|
|
373
381
|
say('')
|
|
374
382
|
if (!state.installed) say(`Not installed. \`${PROGRAM} skill install\` writes it, and so does the board UI's button.`)
|
|
375
383
|
else if (state.outdated) say(`Older than this command. \`${PROGRAM} skill install\` brings it up to date.`)
|
|
@@ -411,6 +419,16 @@ async function sayPathState() {
|
|
|
411
419
|
say(` ${GET_LINE}`)
|
|
412
420
|
}
|
|
413
421
|
|
|
422
|
+
// Where the commit guard stands (#324), said next to the folders an agent reads. A project
|
|
423
|
+
// that is not a git repository has no hook to have, and gets no line about one.
|
|
424
|
+
async function sayHookState(root) {
|
|
425
|
+
const { readCommitHook, sayCommitHook } = await rules()
|
|
426
|
+
if (typeof readCommitHook !== 'function' || typeof sayCommitHook !== 'function') return
|
|
427
|
+
const hook = readCommitHook(root)
|
|
428
|
+
if (hook.state === 'no-git') return
|
|
429
|
+
say(` ${hook.path} — ${sayCommitHook(hook.state)}`)
|
|
430
|
+
}
|
|
431
|
+
|
|
414
432
|
function sayFolder(folder) {
|
|
415
433
|
if (folder.state === 'absent') return 'not installed'
|
|
416
434
|
if (folder.state === 'linked') return 'a symlink into a source checkout — never written over'
|
|
@@ -534,7 +552,8 @@ ${INTRO}
|
|
|
534
552
|
akb install [--tracks a,b,c] scaffold docs/kanban/ — the board, and nothing else
|
|
535
553
|
akb skill whether a coding agent can drive this board
|
|
536
554
|
akb skill install add the skill: SKILL.md into .claude/skills/kanban/
|
|
537
|
-
and .agents/skills/kanban
|
|
555
|
+
and .agents/skills/kanban/, plus the commit guard in
|
|
556
|
+
.git/hooks/pre-commit
|
|
538
557
|
akb skill refresh rewrite a skill that is already here, and write none
|
|
539
558
|
that isn't — how the note learns a new spelling of the
|
|
540
559
|
command
|
|
@@ -568,8 +587,8 @@ Put an agent to work on the board:
|
|
|
568
587
|
akb agent which agent runs them, and how it is set up
|
|
569
588
|
|
|
570
589
|
A run keeps working after the command returns. Add \`--print\` to any of the first four and
|
|
571
|
-
nothing starts: it prints what to do instead, filled in for this board — which is how
|
|
572
|
-
agent already
|
|
590
|
+
nothing starts: it prints what to do instead, filled in for this board — which is how the
|
|
591
|
+
agent you are already talking to does the job itself rather than starting a run of its own.
|
|
573
592
|
|
|
574
593
|
\`akb help runs\` is the whole of it — every command a coding agent may call, and when.
|
|
575
594
|
\`akb agent\` is where you pick the agent, its model and its key.
|
|
@@ -626,6 +645,10 @@ async function cmdBoard(args) {
|
|
|
626
645
|
// command line is the command's own.
|
|
627
646
|
const RUN_COMMANDS = new Set([
|
|
628
647
|
'implement',
|
|
648
|
+
// The two runs a delivery makes after its build (#302). The board starts each itself;
|
|
649
|
+
// typed by hand they put a stopped delivery back in motion.
|
|
650
|
+
'review',
|
|
651
|
+
'correct',
|
|
629
652
|
'run',
|
|
630
653
|
'refine',
|
|
631
654
|
'resolve',
|
|
@@ -633,6 +656,9 @@ const RUN_COMMANDS = new Set([
|
|
|
633
656
|
'create',
|
|
634
657
|
'propose',
|
|
635
658
|
'plan-release',
|
|
659
|
+
// Write a closed version's changelog into its summary file (#232) — the run the board
|
|
660
|
+
// UI's close starts, and the one a terminal close names.
|
|
661
|
+
'changelog',
|
|
636
662
|
// Finish setting the board up (#173) — the steps that read the repo and think, as one
|
|
637
663
|
// run. It is a run like the rest: the board UI's button starts exactly this.
|
|
638
664
|
'setup',
|
|
@@ -647,7 +673,19 @@ const RUN_COMMANDS = new Set([
|
|
|
647
673
|
'log',
|
|
648
674
|
'stop',
|
|
649
675
|
'resume',
|
|
676
|
+
// End the DELIVERY in flight on a card and hand the card back (#301). `stop` ends one
|
|
677
|
+
// run of it; this ends the job.
|
|
678
|
+
'cancel',
|
|
679
|
+
// Throw a delivery's worktree and branch away (#303). Cancel leaves them where they are;
|
|
680
|
+
// this is the only thing that removes one.
|
|
681
|
+
'discard',
|
|
682
|
+
// Sign off the tree a delivery would land (#308), on a board that requires it. It ends
|
|
683
|
+
// nothing and starts nothing — it lets a delivery already waiting carry on.
|
|
684
|
+
'approve',
|
|
650
685
|
'agent',
|
|
686
|
+
// Which account this MACHINE is signed in to Cloud as (#326). Like `guide`, it needs no
|
|
687
|
+
// board: the sign-in belongs to the machine, not to any one project.
|
|
688
|
+
'cloud',
|
|
651
689
|
// The board's flows, shipped with this command rather than copied into each project.
|
|
652
690
|
'guide',
|
|
653
691
|
// What a started run's watcher is spawned as. Never typed by a person.
|