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 +3 -1
- package/bin/ai4kanban.mjs +29 -2
- package/dist/kanban.mjs +2316 -2075
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
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:')
|