ai4kanban 0.7.0 → 0.7.1

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,7 +65,7 @@ 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 → Agent setup**.
68
+ **Configuration → Setup**.
69
69
 
70
70
  Nothing else is copied in. The flows ship inside the command (`akb guide`), so a newer
71
71
  command is newer flows in every project at once — and the command itself stays where npm put
@@ -134,7 +134,7 @@ akb stop 3f2a1b04 # end one
134
134
  akb resume 3f2a1b04 # continue one that failed
135
135
  ```
136
136
 
137
- Which agent runs them — Claude Code, Codex, Cursor, OpenCode or DeepSeek Harness — and
137
+ Which agent runs them — Claude Code, Codex, Cursor, OpenCode, DeepSeek Harness or ZCode — and
138
138
  what it is set to:
139
139
 
140
140
  ```bash
@@ -153,6 +153,47 @@ An API key is the one thing to leave to the user. Hand them the line rather than
153
153
  for them: a key an agent types lands in its transcript and in the shell history, and a
154
154
  saved key is never read back.
155
155
 
156
+ ## Talk to it about the board
157
+
158
+ Sometimes the answer is a conversation, not a job. `akb chat` opens one about the whole
159
+ board; `akb chat <id>` opens one about that card. It answers, and it does the board work
160
+ you settle on in it.
161
+
162
+ ```bash
163
+ akb chat "what should I build next, and why?"
164
+ akb chat 12 "what is still unclear about this card?"
165
+ akb chat 12 "put this in v1 and drop the last todo" # it makes the change
166
+ akb chat "start a build on 12" # it starts the run
167
+ akb chat 12 # the conversation so far
168
+ akb chat 12 --clear # forget it and start fresh
169
+ ```
170
+
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.
190
+
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.
193
+
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.
196
+
156
197
  ## The manual
157
198
 
158
199
  `akb help runs` is what a coding agent reads: every command it may call — the card work,
package/bin/ai4kanban.mjs CHANGED
@@ -68,12 +68,23 @@ const PROGRAM = (() => {
68
68
  if (/[\\/](_npx|dlx)[\\/]/.test(entry)) return `npx --yes ${NAME}@${VERSION}`
69
69
  const base = path.basename(entry).toLowerCase().replace(/\.(cmd|ps1|exe)$/, '')
70
70
  if (base === 'akb' || base === NAME) return 'akb'
71
- // Relative to where it was typed when that is shorter and still runs — a checkout says
72
- // `node cli/bin/ai4kanban.mjs`, which reads inside a sentence; an absolute path doesn't.
73
- const near = path.relative(process.cwd(), entry)
74
- return `node ${near && !near.startsWith('..') ? near : entry}`
71
+ return `node ${nearPath(entry)}`
75
72
  })()
76
73
 
74
+ // How a path is spelled in something a person is meant to paste back.
75
+ //
76
+ // Relative when it is a short hop down from where the command was typed — a checkout says
77
+ // `node cli/bin/ai4kanban.mjs`, which reads inside a sentence and is what the project's own
78
+ // notes spell. Absolute otherwise, and absolute is the safe answer: run from `/`, a
79
+ // relative path is the whole absolute one with its leading slash quietly removed
80
+ // (`node Users/me/…/ai4kanban.mjs`), which runs from that one folder and nowhere else and
81
+ // reads to everyone else like a typo.
82
+ function nearPath(file) {
83
+ const near = path.relative(process.cwd(), file)
84
+ const shortHop = near && !near.startsWith('..') && !path.isAbsolute(near) && near.split(/[\\/]/).length <= 3
85
+ return shortHop ? near : file
86
+ }
87
+
77
88
  // One line, when this copy isn't `akb`, for the text that spells it `akb` throughout — the
78
89
  // help, and the flows a `--print` hands over. Cheaper than rewriting either, and it holds
79
90
  // for the lines inside them that this command never wrote.
@@ -630,6 +641,9 @@ const RUN_COMMANDS = new Set([
630
641
  // Put a spec agent on a card — a named agent that fills one part of its spec (#187).
631
642
  'spec',
632
643
  'runs',
644
+ // Talking to the agent about the board, or about one card (#240). Not a run: it holds a
645
+ // conversation here, in this process, and starts nothing.
646
+ 'chat',
633
647
  'log',
634
648
  'stop',
635
649
  'resume',