ai4kanban 0.8.0 → 0.8.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
@@ -96,7 +96,8 @@ without a browser.
96
96
  ```bash
97
97
  akb implement 12 # build the card, then review what was built
98
98
  akb review 12 # judge the delivery in flight on it again
99
- akb refine 12 # sharpen it until it is ready to build
99
+ akb refine 12 # sharpen it; defaults to standard QA
100
+ akb refine 12 --effort lightweight --print # use the chosen effort inline
100
101
  akb create "add dark mode" # write the card(s) for it
101
102
  akb propose # write the next tasks
102
103
  akb archive 12 # finish it
@@ -185,6 +186,7 @@ The flows are `akb guide`:
185
186
  akb guide # every flow, one line each
186
187
  akb guide board # how the board works: card format, layout, memory
187
188
  akb guide qa-loop # settle one card's planning gaps
189
+ akb guide qa-lightweight # short check for clear, localized work
188
190
  akb guide plan-release # fill a release from its goal
189
191
  ```
190
192
 
package/bin/ai4kanban.mjs CHANGED
@@ -234,14 +234,36 @@ function rescueSkillConfig(root, skillDir) {
234
234
 
235
235
  // ---- the board -------------------------------------------------------------
236
236
 
237
+ // Run one board move against `root`.
238
+ //
239
+ // `--dir` is not optional here, even though the process already runs in that folder: with
240
+ // nothing named, the rules WALK UP from the working directory to the nearest docs/kanban/
241
+ // and work on that one. In a folder with no board of its own — every folder an install is
242
+ // pointed at — the nearest board can be anywhere above it, up to the user's home. Naming
243
+ // the folder is what keeps `install --dir X` from repairing somebody else's board and
244
+ // leaving X untouched.
237
245
  function runKanban(rulesFile, root, args) {
238
- const result = spawnSync(process.execPath, [rulesFile, ...args], {
246
+ const [move, ...rest] = args
247
+ const result = spawnSync(process.execPath, [rulesFile, move, '--dir', root, ...rest], {
239
248
  cwd: root,
240
249
  stdio: 'inherit',
241
250
  })
242
251
  if (result.status !== 0) fail(`\`kanban.mjs ${args.join(' ')}\` failed — nothing else was changed`)
243
252
  }
244
253
 
254
+ // The nearest board strictly ABOVE `root`, when there is one. A second board underneath an
255
+ // existing one is legal and occasionally meant, but it is almost never what someone who ran
256
+ // `install` in a subfolder wanted, so it is said out loud.
257
+ function boardAbove(root) {
258
+ let at = path.dirname(path.resolve(root))
259
+ for (;;) {
260
+ if (fs.existsSync(path.join(at, 'docs', 'kanban'))) return at
261
+ const up = path.dirname(at)
262
+ if (up === at) return null
263
+ at = up
264
+ }
265
+ }
266
+
245
267
  // The repair steps an update has to run on a board written by an older version. Each one is
246
268
  // mechanical; anything with a choice in it becomes a note instead.
247
269
  async function repairBoard(rulesFile, root) {
@@ -339,12 +361,17 @@ function checkModules(board) {
339
361
  function cmdInstall(root, tracks) {
340
362
  say(`ai4kanban ${VERSION} — installing into ${root}`)
341
363
  say('')
364
+ const above = fs.existsSync(path.join(root, 'docs', 'kanban')) ? null : boardAbove(root)
365
+ if (above) {
366
+ notes.push(`there is already a board at ${above} — this makes a second one, and commands run here will find this one`)
367
+ }
342
368
  runKanban(builtRules(), root, ['init', ...tracks])
343
369
  sayNotes()
344
370
  say('')
345
371
  // Say what landed, so nobody goes looking for the flows in the repo. They ship with the
346
372
  // command; a project holds its own board and nothing else.
347
- say('That is the board. Nothing was written outside docs/kanban/.')
373
+ say('That is the board, under docs/kanban/. The one line written outside it is `.akb/` in')
374
+ say('.gitignore, which keeps the folders a delivery works in out of git.')
348
375
  say('')
349
376
  say('To drive this board from your coding agent, add the skill — from the button in the')
350
377
  say('board UI (Configuration → Agent setup), or here:')