Skip to content

Releases: Paliverse/workboard

WorkBoard 0.3.10

Choose a tag to compare

@github-actions github-actions released this 28 Oct 03:33

Added

  • Authors couldn't edit or remove their own timeline notes without hand-editing board.json. note REF edit NOTE_ID and note REF rm NOTE_ID now do it (note.edit and note.rm in call, with id). Only the author may change a note; others get owned. Each change adds a note-edited or note-removed history event, and an edited note carries editedAt and shows "edited" in the browser. Editing a note clears earlier acknowledgements of it, so an edited finding shows in the card owner's inbox again, even if it was posted before its subtask was accepted. Notes the subtask workflow writes itself (results, acceptances, takeovers) can't be changed. edit or rm without a note ID is plain note text.
  • On Windows, npm installed only workboard.cmd and wb.cmd, so every argument went through cmd.exe: line breaks cut the command short, quotes, %, ^ and & were mangled, Rust-based shells such as omp's refused multi-line arguments with "batch file arguments are invalid", and Python's subprocess couldn't find workboard at all. Global npm installs now also get workboard.exe and wb.exe, a small launcher that runs the real binary with the arguments untouched; killing the launcher (a caller's timeout) also ends the binary, while servers and upgrades the binary starts keep running. npm copies it after install, and each run through the .cmd shim restores it if it is missing or outdated. npm uninstall -g leaves the two launchers behind; run on their own they say what is missing and how to fix it, and the uninstall instructions list them.

Changed

  • A note summary over 160 characters or with a line break was refused, so agents retried or cut their own text. The summary now keeps its first line, cut at a word break with "…" if still too long, and the full text moves to the top of the body. This holds for the CLI, call and the browser API. Only a body that ends up over the body limit is refused, and results report "summaryMoved": true.
  • note 12 "text" failed because --summary was required. The text can now be given positionally ("text" in call); giving both is refused with both named.
  • Commands that write a card recorded the writer as agent when no label was set. They now refuse with invalid and ask for --actor, "actor" in the call request, or WORKBOARD_ACTOR. Reads still work without a label, and the browser still records user.
  • A call request with a key its op doesn't take said only OP doesn't take "x", and a guessed key that replaced a required one ({"op":"search","query":…}) was reported as search needs "terms". The unknown key is now reported first, with the keys the op takes and, for common guesses, the key to use: search doesn't take "query" (use "terms"); search takes: terms, limit, fields, board, actor.
  • An unknown call op said only op X is not available in call. It now lists every call op and names the right one for common guesses (list/get → query or context, move → fly, claim → start or subtask.claim, create/new → add, help → workboard COMMAND --help outside call). On the command line, argparse's "invalid choice" for those guesses gains a did you mean workboard fly? line.
  • Input to call that wasn't JSON failed with a bare decoder message such as Expecting value: line 1 column 1 (char 0). The error now quotes the first 60 characters that arrived; when the double quotes are missing (a shell stripped them, or bash brace-expanded the object) it says so and shows the heredoc form. Empty stdin shows the heredoc form too.

WorkBoard 0.3.9

Choose a tag to compare

@github-actions github-actions released this 14 Oct 03:50

Fixed

  • The browser's "Sort cards by newest" sorted each column once, so every card added later, including those agents add from the CLI, landed at the bottom of its column. The board menu now has a "Newest cards first" setting instead, which persists for each board in that browser: while it is on, every column except Done lists cards newest first, and dragging a card within a column is refused with a hint to turn it off (moving a card to another column still works). Turning it off restores the manual order. The saved card order is left untouched, and the sort-cards structure operation in the HTTP API is unchanged.

WorkBoard 0.3.8

Choose a tag to compare

@github-actions github-actions released this 12 Oct 03:39

Changed

  • The card's owner finishes a delegated step in one request: subtask.done with a result on available work, or on work it holds after subtask.claim or subtask.takeover, completes the step and accepts it at once, and the timeline records both. Before, available work was refused until claimed, and the owner then had to subtask.accept its own result. Work another worker holds still needs subtask.takeover with a reason first, and other workers' results still need subtask.accept. In the browser, the card owner's checkbox on an available delegated step is enabled and finishes it the same way. The card's done refusal points to this, and the skill tells Main to close a step it did, a superseded step or a gone worker's step this way.
  • wait --subtask returns at once only when that subtask changed after --after, not whenever anything on its card did. Each delegated subtask now has changedRev, the board revision that last changed it or a note on it, set by the server like the card's. Subtasks already on disk get a stamp the next time their card is saved with a change; until then, and for plain checklist subtasks, wait falls back to the card's changedRev. The skill drops its line about waiting again after a changed with nothing new.
  • A card keeps its whole history. Before, only the last 40 entries were kept, so a long-running card lost its oldest events; rows already dropped are not restored. show without --full still prints the last 10, and context still leaves history out unless --full.

WorkBoard 0.3.7

Choose a tag to compare

@github-actions github-actions released this 11 Oct 16:12

Fixed

  • Blocking a card hid its review, blocker and claim rows from inbox, because block clears the owner, so Main lost sight of finished and running work. The actor who blocked the card now still sees them, by the same holder rule as digest's MINE and query --mine. finding rows wait until the card is In Progress again, since ack needs it. The browser shows a Blocked card's results without Accept and Request changes buttons until it is resumed, since review needs In Progress.
  • The handoff prompt printed the worker's requests as one JSON object on one line, so pasting it into workboard call was invalid ("each call request needs a string op"). It now prints each request on its own line: read, claim, resume (blocked work only), publish, complete. --json requests is unchanged.
  • Refusals name the op that clears them. The card's done refusal follows each subtask that keeps the card open with its next step: subtask.takeover with a reason if the actor holding it is gone, or for available work, claim and finish it or subtask.rm it. subtask accept on work that isn't completed gives the same hint. In call, an unknown subtask.* or comment.* action said "argument op: invalid choice"; it now names the op and lists the real ones: unknown op "subtask.edit"; subtask ops: add, done, ….
  • An HTTP card edit (PATCH api/card/{ref}) could blank the write-up of a Done card, which done refuses. Changing a Done card's writeup to blank or whitespace-only text is now invalid (422); other columns are unchanged.
  • The skill lists note as resume's reason and subtask.rm among the ops, and tells Main to drop a superseded step with subtask.rm (after subtask.takeover if another worker still claims it). It tells a worker whose wait returned changed with nothing new on its subtask to wait again with the returned rev, and says a Blocked card you blocked keeps its inbox rows. Its card takeover line could be read as allowing a takeover only when the user asks; it now says "only if the user asks or the holder is your own gone worker".

WorkBoard 0.3.6

Choose a tag to compare

@github-actions github-actions released this 11 Oct 06:20

Added

  • inbox lists a claim row for each delegated subtask another actor holds on the owner's In Progress card, with owner, state (claimed or blocked), claimedAt and lastActivityAt (the latest of the claim and that subtask's notes), so after a restart Main sees what is still running and which worker went quiet. A blocked subtask lists its blocker row first. The browser's Inbox shows them as "Assignment in progress" or "Assignment blocked", and its count leaves them out.
  • wait --subtask adds notes to its result: the entries posted on that subtask while it waited, so a worker reads Main's answer without another context. It is [] after a timeout or an immediate return.

Changed

  • done works from Backlog and Task too, so work found already done needs no start first. Outside In Progress the card's dependencies must be completed (deps); a Blocked card is state (use resume), and so is a Done card (use rework or reopen). The browser's complete and submit follow the same rule.
  • add --column inprogress ("column":"inprogress" in call) creates and starts a card in one request, with start's dependency and WIP checks, and makes you its owner; a refusal creates nothing. Before, add took only Backlog or Task. The browser's card creation uses the same code: titles are trimmed, and a card created In Progress records start in its history.
  • Every delegated result needs subtask accept before the card's done, and before subtasks that list it as a prerequisite can be claimed or handed off. A result whose review wasn't required used to count once completed; existing ones now show REVIEW PENDING in digest and the browser until accepted. review.required is always true, and doctor doesn't report the stored false it replaces.
  • Subtasks are one flat list. Boards with nested subtasks load flat, each subtask just before the ones it held, keep their delegations, and are saved flat on the next write; doctor doesn't report the change. context --subtask returns only that subtask (focus.ancestorIds is gone), wait --subtask watches only that subtask, and subtask rm removes only the listed IDs. The browser drops its fold and "Add sub-item" controls.
  • context leaves out the card's history unless --full ("full":true); omitted.history counts all of it. Before, it kept the last 25 entries.
  • handoff prints a prompt of about six lines: the card, the subtask, the scope (or "read-only: edit no files"), a takeover or blocked line when one applies, the requests on one line for workboard call, and a pointer to the skill's Worker section. Card text is JSON-quoted as data. --json returns only ok, rev, num, worker, previousOwner, writeScope, scopeWarnings, requests and prompt; commands, placeholders, call, assignment, title, cardId, board, boardName, parentOwner, origin, notes, peers and ancestorIds are gone. The write scope is always the subtask's saved one.
  • digest --json has sweepCandidateCount (a number) instead of the sweepCandidates list of card IDs, and its mine rows are {num, title, column} without id.
  • inbox leaves out findings on a subtask that come before Main's acceptance of it in the timeline; notes posted later still show.
  • handoff requests carry the worker's board and actor, so the prompt names plain workboard call and no board or worker name passes through a shell (names such as R&D used to split the command on Windows).
  • The agent skill is shorter (about 1,700 words instead of 2,500). It asks for expectedRev only on cards you don't hold, and covers add into In Progress, done from Task, accepting every result, the slim handoff, inbox claim rows and wait notes. Rarely used actions left the skill but not the CLI, and its Commands block became a list of ops. docs/agents.md now points to the skill instead of repeating it.

Removed

  • subtask add --parent: subtasks no longer nest. "parent" in a call request is invalid (subtask.add doesn't take "parent").
  • subtask configure --review-required and --no-review-required, since every result needs acceptance. "reviewRequired": true in call is invalid, and reviewRequired in the HTTP configure is 422.
  • handoff --write-scope, --peer and --fields. Set the scope with subtask configure --scope before the handoff.

Fixed

  • workboard upgrade through npm could install the previous version right after a release, because npm answered from its cached package data. It now runs npm install -g --prefer-online @paliverse/workboard@latest.

WorkBoard 0.3.5

Choose a tag to compare

@github-actions github-actions released this 11 Oct 03:34

Fixed

  • The card's owner was refused (owned, "only the current claimant or the parent owner can publish") when posting note --subtask on a plain checklist step of its own card. The owner may now note any subtask of its card, so a step's evidence stays with that step.
  • A worker can post note --subtask on its delegated subtask after subtask done, including after Main accepted it, for example a recheck verdict. Before, the worker had to undone, note and done again, which rewrote the subtask's history and briefly showed approved work as open.
  • note --subtask checks the summary and body before permission, so a too-long summary is invalid in the first reply instead of after an owned refusal and a retry.
  • The call hint for id on a subtask action no longer suggests a subtasks list that delegated actions refuse.
  • In call, a list for an option that takes one value kept only its last item, and an empty list sent nothing. Both are now invalid: notes takes one value, not a list, scope is an empty list; omit it or use clearScope to clear.
  • call errors name request keys instead of the parser's names: a missing field is note needs "summary" or subtask.claim needs "subtask" or "subtasks" instead of "the following arguments are required: what", an unknown key is context doesn't take "fields", and usage errors show "camelKey" without the --*-stdin alternatives that call refuses.
  • In call, a card, column, attachment id or ack note ID starting with - (such as -h) reached the parser, and a request that printed help ended the whole stream. Both are now invalid, and later requests still run.
  • context, note, handoff and wait in call say they take one subtask ID in subtask when given id or subtasks.
  • wait --subtask missed notes posted on that subtask, so a worker waiting for Main's answer timed out. A note on the watched subtask now wakes it.
  • query --column and list --column compared the raw text, so in-progress or In Progress matched nothing and a misspelled column returned an empty list. They now take the same column names as fly, plus any column the board itself has, and an unknown column is invalid.
  • A worker holding a delegated subtask couldn't post note --subtask once the card left In Progress (state). It can now post on any column, for example after the card is Done. A refusal names the subtask's holder and suggests a card note instead.
  • A result on plain checklist steps (subtask done) was silently dropped. It is now invalid, and the error says to post the evidence with note --subtask.
  • Lifecycle and subtask commands check their input (reasons, until, write-ups, results, target columns, dependency IDs) before ownership, so bad input from someone who may not act is invalid in the first reply instead of owned.
  • Refusals name what blocks you: the card's done lists each subtask that keeps it open and what it waits for; start, depends, subtask claim, subtask done and handoff name each unmet prerequisite; a refused ID in a multi-ID accept and the delegated IDs in another multi-ID action are named.
  • subtask done with a new result on accepted work said to reopen it with undone, which was refused, and undone named "Main" as the acceptor. Both now name who accepted it and say to post later evidence with note --subtask.
  • A worker command on a card that isn't In Progress now says to post the result with note --subtask and wait for the owner to start or resume the card. add --delegated, delegate and rm on another owner's card say to ask that owner instead of suggesting takeover, and a claimant refusal points to subtask takeover for a worker that is gone.

Added

  • subtask accept takes several subtask IDs ("subtasks":[...] in call) and accepts them in one revision; if any can't be accepted, none are.
  • digest --json adds mine: the cards you hold, as listed under MINE in the text output.
  • add --notes TEXT or --notes-stdin (notes in call) sets the pinned notes when the card is created; with --from it replaces the copied notes.
  • subtask REF done ID --result-stdin reads the result from stdin.
  • search --limit N keeps the N newest hits, and search --fields LIST picks the hit fields, as in query.
  • handoff --fields LIST keeps only the listed keys in --json, plus ok, rev and num; "fields":"prompt" returns just the brief.
  • handoff on a subtask another worker holds (claimed or blocked) returns a takeover brief for the replacement worker: previousOwner names the holder, and the claim step is subtask takeover with a {reason} placeholder. Blocked work also gets a resume step. Before, it was refused.
  • handoff without a write scope returns a read-only brief that tells the worker to edit no files. Before, it was refused, and Main had to brief read-only workers by hand.
  • context has the card's num at the top, next to rev.
  • scopeWarnings rows add claimedAt and lastActivityAt (the latest note on that subtask, or its claim), so Main can tell a stale claim from active work.
  • inbox also lists completed results that need no review, with review.required false; subtask accept clears them. They still don't hold up done.

Changed

  • search --json hits are {num, title, column} instead of full cards; ask for more with --fields.
  • done without a write-up, or with a blank one, is invalid (was state).
  • state is always status 409. add into a later column, fly REF done, and moving a card into or out of Blocked with fly or start returned 422.
  • attachment add with a missing --file is not_found (was io).
  • An existing export --out destination is status 422, like other invalid errors (was 409).
  • On claimed or blocked work, subtask configure --scope can only grow the saved scope: send the saved paths plus the new ones. Dropping a path, or --clear-scope, is refused with state, since the worker may be editing it.
  • A worker command (done, undone, block, resume, release) on a subtask nobody has claimed is state, saying to claim it first (was owned, "held by nobody").
  • subtask configure, accept, request-changes and ack on a card that isn't In Progress are state, saying to start or resume it first (was owned).
  • Removing delegated subtasks (subtask rm) needs the card's owner, or a card without one (owned).
  • handoff's commands.complete reads the result from stdin (--result-stdin) instead of a --result={result} argument, so multi-line results survive npm's Windows shim.

WorkBoard 0.3.4

Choose a tag to compare

@github-actions github-actions released this 11 Oct 02:04

Added

  • handoff --json adds requests, the worker's four steps (read, claim, publish, complete) as call requests, and call, the argument array that runs them. Workers fill in {summary}, {body} and {result} and send the requests on stdin, so multi-line findings and results survive npm's Windows workboard.cmd shim; the argument-array commands stay unchanged. The handoff prompt now shows the call form.

Fixed

  • digest marked an In Progress card READY TO CLOSE once every subtask was ticked, even while a delegated subtask still awaited its required review, so done was then refused. It now says REVIEW PENDING until done would pass, and the browser's card badge does the same ("Review pending").
  • In call, a subtask action that names the subtask with id instead of subtask now fails with an error saying to use subtask. Before, it said "the following arguments are required: what".

Changed

  • The skill and docs explain that query --mine and digest's MINE include Blocked cards you blocked, and that one open call can chain requests that need an earlier result's rev. They also say to write the remaining review, integration or release work as subtasks, and that Main may take over cards held by its own workers whose sessions ended.

WorkBoard 0.3.3

Choose a tag to compare

@github-actions github-actions released this 11 Oct 01:15

Changed

  • The agent skill is rewritten for call: a table of request keys, a whole session and a worker's requests as JSON, and advice to batch related requests into one call. It now covers the refusals agents actually hit (priority is critical|mid|low, add only into Backlog or Task, done only from In Progress, subtask IDs go in subtask rather than id), read-only delegated work without handoff, and replacing a worker that is gone with subtask takeover. Every JSON example and command form in it runs against the CLI. It no longer has a 6 KB size limit.
  • The contributor guide, pull request template and issue forms are gone. Running from source and the tests are described in docs/install.md.

WorkBoard 0.3.2

Choose a tag to compare

@github-actions github-actions released this 11 Oct 00:19

Fixed

  • 0.3.1 made a one-shot command's board read slower: the first read in each process also stored a parsed copy for reuse, which only call and the server ever reuse. The first read now keeps only the text it read, and the second read of an unchanged board makes the copy. On a 3.7 MB board, the first context in a process took 107 ms instead of 133 ms (0.3.0: 116 ms).

WorkBoard 0.3.1

Choose a tag to compare

@github-actions github-actions released this 10 Oct 23:19

Changed

  • A WorkBoard process reuses its parse of a board while board.json is unchanged, so call and the server answer reads without parsing the whole board again. Any commit, by any process, forces a fresh parse, and each reader gets its own copy. On a real 790-card, 3.7 MB board, 20 context requests in one call took 343 ms instead of 1319 ms: about 7 ms per request after the first instead of 64 ms. call also builds its argument parser once instead of per request.
  • Writes parse the board once instead of three times. save compares cards against the board the transaction loaded under the lock instead of reading it again, and the backup no longer re-parses the bytes it writes to find their revision. On the same board, one note took 316 ms instead of 436 ms, and 10 notes in one call 1.9 s instead of 3.2 s.