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 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 → Setup**.
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 and the command itself stays where npm put
72
- it, so a project's git history never carries 350 kB of 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, since not
90
- having it is an ordinary state now adds whatever an older release never wrote to the
91
- board, clears out what it no longer writes, and prints which version you moved from and to
92
- with a link to everything that changed in between. Your cards, config, and memory are never
93
- touched.
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 in the conversation
122
- it is already in, rather than paying for a second agent to do the job it is sitting there
123
- to do. Start a run when you want the work to happen on its own. `akb help runs` carries
124
- the whole rule, beside the commands it applies to. An agent working inside a run the board
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
- Before opening a fresh conversation, `akb chat` ensures this repo has the kanban skill. The
172
- first prompt is only the skill invocation and your message: `/kanban …` for Claude Code,
173
- `$kanban …` for Codex, and `Use the kanban skill: …` for an agent without direct skill-call
174
- syntax. There is no second chat flow or copied board snapshot; the skill reads the current
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
- A chat is still not a run: it never shows in `akb runs`, never holds a card, and never keeps
192
- a run off the card it is about.
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
- Only an agent whose command can take a second message into its own session can hold a
195
- conversation. On any other one, chat says so and names the agents that can.
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 refine # one card, vague to ready
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, started as a
216
- run of its own once the first one ends — so `akb create "…"`, `akb revise`, `akb resolve`,
217
- `akb propose` and `akb plan-release` all come back with their cards refined. Archiving or
218
- rejecting a card does the same for every card it was blocking that now has nothing left in
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 an
572
- agent already in a session does the job itself rather than starting a second one.
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.