Repository navigation
Releases: river0825/unprose
Releases · river0825/unprose
Release list
v0.30.0
Added
- Draw an actor again at one sentence (docs/diagrams.md §6b "Drawn again at one sentence").
layout: { actors: repeat }andrepeat: trueonly allow a copy, and the layout decides from its own grid: on a board the person
arranged by hand, "CL1 dials Lead" could still be a long line back to the one Lead, because in the layout's grid CL1
sits next to Lead.drawAgain: leadon that sentence now draws Lead again for it, next to the sentence — with or
withoutrepeat. The lint warns whendrawAgainnames an actor the sentence does not have, and says so when it
names one at its first appearance;canvas_read_boardsays which sentence asked; Egon.io gets one more actor of
the same name. - A new drawing lands next to where you put its neighbour (docs/diagrams.md "What a redraw keeps"). A redraw used
to add a new item where the file's layout put it, which on a moved or locked frame could be far from the item it
belongs to. Now a domain story's new actor drawing goes next to the actor it was drawn beside, a new work object
next to its sentence's actor and a new note next to what it is on — where those are on the board — moved aside when
something is already there, and it keeps that place on later redraws. The preview says "placed next to "CL1", where
you put it".
Fixed
- Inserting a note into a domain story no longer moves the others. Notes were numbered in file order (
note-1,
note-2…), so a note inserted in the middle shifted every later id and the places the person gave them landed on
the wrong notes. A note is now named after what it is on (note-clerk; a second one on the same element
note-clerk-2, or theidyou give it). An older board keeps the person's placement: on its first redraw each
renamed note takes over the old one's place, folds and threads (an old link to a note,?focus=…note.note-2, no
longer finds it).
v0.29.0
Added
- A domain-story group can have a colour (docs/diagrams.md §6b), to tell groups apart:
color:on a group in the
file (orange, blue, yellow, pale-yellow, lilac, green, pink, red, purple), or right-click the group on the board →
Change colour. It draws a pale wash behind the members — light enough for the arrows and names on it — and the
dashed outline in its shade, on the page and in the snapshot; Egon.io export colours the group's outline. Grey (the
default) and white draw no wash, so boards drawn before look the same. A colour chosen on the board survives a redraw
unless the file gives one. - Report a problem · Suggest a feature (docs/canvas.md "Feedback about Unprose"). Problems and ideas are tracked
as GitHub issues, and the person files them: Unprose never posts to GitHub. On the canvas page the entry sits at the
bottom of the keyboard shortcuts (?) and the release notes, and under the board list; a small dialog asks for the
kind, a title and what happened or what would help, says the issue will be public, and Continue on GitHub opens
the new issue in a tab with the form picked and filled in, the running version included — the person checks it and
submits it under their own account. - Issue forms in
.github/ISSUE_TEMPLATE: Report a problem (what happened, what you expected, how to get there,
where, the version; labelbug) and Suggest a feature (the problem, the idea, the version; labelenhancement).
Blank issues stay allowed. The link fills the fields by their ids; a test checks every id against the forms. - File on GitHub on Connected agents → Feedback from agents: the same dialog, filled with what the agent wrote and
the tools it named (never the board id or item ids), to edit before going to GitHub. unprose_feedbacktakeskind: 'bug' | 'idea'and atitle, kept on the record, and its answer has the
record as a prefilled issue link with one line for the agent: the person files it if they want it tracked; an agent
files one itself only when asked and with its own GitHub access.UNPROSE_ISSUES_REPOsends issues elsewhere
(default: the repository updates come from,river0825/unprose);GET /api/versionnames it asissuesRepo.
Changed
- Agents are asked to draw icons for a domain story's things, not to leave every work object a document. The
built-in work-object icons are generic and a work object without akindis a document, so stories came out as a
row of identical pages. Thedomain-storyprompt, thedomain-storytellingskill, the tool description and
AGENTS.md now say: declare the work objects, draw an icon per kind of thing undericons:(the main work object
first, three to seven in a story) and use its name as the kind. The skill has a newreferences/icons.md— when to
draw one, how (an outline on 24 × 24, stroked in ink, never filled), and a gallery of 22 to copy from (invoice,
payment, card, order, appointment, reminder, contract, form, contact, shipment, place …). - Lint asks when most work objects look alike, not only when all do:
work-objects-one-iconnow fires when half
or more of them share one icon, names them, shows an example icon to draw, and points out the ones only named in
a sentence (they can only get a kind once declared underworkObjects).
Fixed
- One malformed change in a board's log no longer blanks the board (#10). A line written by hand
(a board rebuilt after a loss) withoutbeforemade the history panel throw, and the whole page went blank. Each
change is now read repaired:beforemissing reads as{},opsnot a list as none, an op of no known shape is
left out, an unknown author reads as the agent — and the canvas log says what it repaired, once per change, with its
seq. The side panel also draws behind an error boundary: if a part of it still fails, it says so in one line and
the board keeps working. - An item can be dragged out of its frame or lane. It used to stop at the frame's edge. Dropped with its centre
outside, it no longer belongs to the frame (it stays put when the frame moves or hides); dropped inside another frame,
lane or column, it joins that one. A frame or lane inside another stays in it. An item drawn from a file and moved out
keeps its place on a redraw, like any item the person moved. - Taking an item out of its frame, lane or column was lost on the way (a kanban card dropped outside every column,
the Inspector's Move to lane or frame → None): the change was sent asparent: undefined, which JSON drops, so the
item stayed in. An update now takes a key away withnull(parent: null).
v0.28.0
Added
- Fold a line by hand (docs/canvas.md "Folding a line by hand"), any line — a workflow wire, a domain-story
activity, an annotation link. Select it: drag the small handle in the middle of a run to fold the line there, drag
a fold to move it (it snaps level or plumb with the next point), double-click a fold to take it out; dragging the
label folds the line where you drop it. Several folds per line, straight runs with a slightly rounded corner,
undoable, kept by a redraw; agents set them asdata.bend: [{ x, y }, …]. A single bend from an older board (a
curve through one point) is now one fold. - A domain-story arrow is folded around a pictogram it would run through — the shortest way that clears every
box and crosses the fewest other story lines; the number and the verb stay on its first run. The page, the
snapshot and the layout check draw the same; the layout check reports a line still through a box
(wire-through). - A domain story may draw an actor more than once (docs/diagrams.md §6b "Repeated actors").
layout: { actors: repeat }in the file (orrepeat: trueon one actor) draws an actor again where the story comes back to it —
as a work object is drawn for every sentence — instead of a long arrow back to its one drawing. The actor is still
declared once;once(the book's rule) stays the default and draws exactly as before. On a 17-sentence story the
crossings went from 7 to 0 and the lines through pictograms from 4 to 0. Later drawings are<key>.actor.<id>.2,
.3…; annotations and traces go to the first, replay brings each in with its sentence, selecting one lights up
the others, agents read the actor once ("drawn 3 times"), and Egon.io gets one actor per drawing (and gives
several Egon actors of one name back as one actor that repeats).
Fixed
- A domain story's annotation links were not drawn at all: the note had no handle for its dashed line to start
from, so the line was dropped. They are drawn again, a little darker (1.5 px, ink-2, dashed 6 / 4).
v0.27.1
Fixed
- Replaying a big domain story stays readable (docs/diagrams.md §6b "Replay"). The replay used to fit the whole
story, so on a big frame the names came out at ~5 px. A story that can be read whole still starts whole; a bigger
one is told sentence by sentence at 100 %, zoomed out only as far as a long sentence needs to be seen whole, and a
zoom you make while it plays is kept.
v0.27.0
Added
- Hide a frame's contents (docs/canvas.md "Hiding a frame"). Right-click a frame → Hide contents: everything
it holds, the wires with an end in it and the threads about them are no longer drawn, for everyone on the board; the
frame stays as a short strip with its title, "N items hidden" and Show. One ordinary, undoable change
(data.hiddenon the frame) that a redraw keeps. A jump to something inside lands on the strip and says so; nothing
is dropped into it. Agents see one line per hidden frame incanvas_read_boardandcanvas_context— not what it
holds, unlessincludeHidden: true; the layout check,canvas_snapshotand the thumbnail leave it out too. Hiding
an unused mock is also the quickest way to make a big board light: on a 3,824-item board, hiding its 2,681-item
mock cut opening to 0.9 s and a change by someone else to under 0.15 s.
Changed
- A big board is fast again. Measured on a 3,824-item board with a 108 MB change log: opening went from 5.8 s to
1.4 s, and a change by someone else (an agent's add or move) is drawn after 0.15–0.3 s instead of 4–5 s.- Wires are planned again only near what changed (a move or an add re-planned every wire on the board), and the
crossings are counted by intervals — the same routes, ~20× faster. - The page loads the latest 300 changes, trimmed for the Changes tab (
GET …/changes?last=N&brief=1), not the
whole log: 97 MB → 1 MB (33 s → under 1 s through a tunnel). A change's ops are drawn only once it is opened. - The panel re-reads the board's meta alone (
GET …/meta), not the whole board, and only after a redraw. - The Chats list is gathered in one pass over the comments, not one per thread.
- Wires are planned again only near what changed (a move or an add re-planned every wire on the board), and the
- A redraw writes only what changed. An item the file draws exactly as it is gets no op; before, every drawn item
was rewritten (a big UI mock: ~3,000 ops and 3.6 MB of log per redraw, sent to every open page). - A redraw from another machine downloads no log:
awd design draw,design_drawandawd graph --canvasread
what they need from it — who moved, added and deleted what — fromGET …/redraw-inputs(245 KB instead of 97 MB),
kept by the canvas per board; an older canvas is read as before. - The canvas reads its change log through an index:
changes,diffand everycanvas_waitcheck read only
what is new (~260 ms → under 1 ms on a 108 MB log, without blocking the server); a torn last line no longer breaks
reading the log.
Fixed
- After a redraw, undoing your own move no longer says the agent changed the item since: an unchanged item is no
longer re-stamped by the redraw.
v0.26.0
Added
- Do a UI mock click without playing: ⌥ click (Alt+click) an element a click leads from, or right-click it →
Click → , and the view goes to that screen and flashes it — ⌥ ← comes back (docs/diagrams.md §6c
"Clickable"). - A diagram whose frame is gone is told to agents. Removing a frame (over
/ops, or on the page) leaves the
diagram registered — its holder and file snapshot.canvas_read_boardandcanvas_contextnow say so, with the two
ways out: the holder redraws it from the file, or drops the entry (PATCH /api/boards/:id {"meta":{"diagrams":{"<key>":null}}});GET …/settingslists them asframeless.
Changed
- Right-click → Play starts on that screen. Play from the menu of an element, a screen, or a note or thread about
one starts on its screen instead of the first, and Restart goes back there; Play on the frame header or panel still
starts on the first.
v0.25.0
Added
- Clickable — where every click leads, at a glance (docs/diagrams.md §6c "Clickable"). A UI mock's frame header
has a Clickable switch after Play (also in the frame's panel, and Shift+G): every element a click leads from
— itsgoto, aflowsentry, a card that leads somewhere — gets a thin outline and a small→ <screen>tag, and the
frame's panel lists them all by screen; a click on a row takes you to the element. It reads what Play follows, so a
developer sees every clickable item without a "Click → Settings" note on each. Per viewer, nothing stored; Copy as
image draws it. - Play shows its hotspots: a click on something that leads nowhere lights up the screen's clickable elements for a
moment. - Lint: a note that only says where a click goes (
ui-note-says-where-a-click-goes): "Click → Settings",
"Tap: opens the editor", "點擊 → 設定" — writegoto: <screen>instead; a note that repeats itsgotocan go; one that
names another screen than itsgotois a warning. Told byawd design lint/design_lintonly, not marked on the
board.
Fixed
- A redraw leaves no stale notes behind. A UI mock screen's own note now goes when the file drops it, like the
numbered cards; a note someone replied to is no longer deleted under its replies — it stays as a thread about the same
item, without a number. - The layout check sees a card lying on another card (a stale note stacked on live ones, two at the very same
spot) —canvas_check_layoutand the frame panel's Layout.
Changed
nullin a comment update'sdataremoves that key (POST /api/boards/:id/ops): the canvas merges a comment's
data, so leaving a key out never took it away — the same convention asPATCH /api/boards/:idformeta.
v0.24.0
Added
- Annotations — what an item is for — in every diagram kind (docs/diagrams.md §2b, docs/canvas.md →
Annotations). Until now the board only had comments, which are conversations. A design file now takes
annotations: [{ on, text }](EventStorming, story map, journey, kanban, wireframe, UI mock, workflow; a domain
story keeps its Egon.io annotations). Each is drawn the way UI mock callouts are: a small numbered pin on the item
and a quiet card with the same number beside the drawing — in a band below it for the wide kinds, right of the
screen for UI mocks and wireframes — with no author line and no reply box, so nobody reads it as a thread.
awd design lintreports anonthat names nothing. - The person writes annotations on the canvas. Right-click an item → Annotate… (or the item's panel). On an
item drawn from a file it becomes a draft — a dashed card with ✎ — and a proposal to the agent holding the
files, with the one-line file edit attached. That agent judges it in its thread first (true to the design? at odds
with the file or another annotation?) and, when it is sound, applies it at once — the person wrote it, which is
consent — else says why and waits; the redraw draws the numbered card and the draft goes away. On an item with no
file behind it, the card is written on the board itself. Agents see annotations as annotations:
canvas_read_boardlists them per diagram, not as threads (types: ["annotation"]). - TODOs — something still to confirm with someone else (docs/canvas.md → TODOs). Right-click → Add TODO…
(with an optional ask whom) puts an amber square on the item and a card with a check box beside it; the board
panel's TODOs section lists them. A TODO lives on the board only and wakes no agent when it is written. Checking
it off asks What did you find out?: an answer is posted in its thread and goes to the Answered-by agent, which
decides whether the design changes; without one nobody is told. Agents open, list, check off and reopen TODOs with
the newcanvas_todotool;canvas_contextcounts open TODOs and drafts waiting. - Copy link in the right-click menu of every item, comments and annotation cards included — the same link as the
panel's Copy link. A?focus=link opens a comment, a card or a TODO even when the view switches hide it.
Changed
- The Notes switch is three switches: Comments (All / Badges / None, Shift+N — threads only), Annotations
(All / Pins / None, Shift+A; Pins keeps the numbers and shows a card on click) and TODOs (Open / All / None,
Shift+T). UI mock callouts follow Annotations now. Copy as image draws what the switches draw. - A wireframe's
note:is a numbered annotation card, no longer a comment thread. - A redraw removes a numbered card whose annotation left the file (UI mock notes too); a card the person moved
keeps its place. canvas_snapshotdraws annotation cards with their numbered pins, and TODOs as check boxes.- Studio's brief for a draft annotation says: judge it, then apply it at once when it is sound.
v0.23.0
Changed
- UI mock notes are callouts, not a column of sticky notes. v0.21 moved every note of a mock into the gutter
beside its screen, where nothing said which note was about which item. Now a note on an element, a list / tabs /
navbar / sidebar / breadcrumb / select entry or a table row is drawn the way a design review marks a screen: a
small numbered pin on the item itself and a quiet card with the same number beside the screen, numbered
1…n per screen in reading order; cards are as tall as their text. Point at a pin and its card lights up, point at a
card and its pin is outlined, click a pin to select its card. Notes: Badges keeps the pins (the note as tooltip),
None hides pins and cards, also in Copy as image. The screen's own note stays an unnumbered thread; people's
comments and agents' threads go below the callouts. Data:data.callouton the note comment;data.ui.callout,
data.ui.note,items[i].callout,rowCalloutson the element. Redraw a mock to get the numbers. The sample
mock's notes now say what four of its items are for.
v0.22.0
Added
- Hand the files behind diagrams over to another agent (docs/canvas.md → Handing over the files). A board drawn
by one agent (say, the one with the meeting notes) can now be led by another (the one that reads the code): the
person opens Hand over files… in the board panel (or Hand over… on a frame's panel), picks the diagrams —
all checked by default — and the agent, and leaves Also make it Answered by on. The holder settles its open
proposals, redraws what changed and marks the files ready (canvas_handover({ ready: true })), or the person hands
them over anyway when it is gone; the new agent accepts (canvas_handover({ accept: true })), gets the list of files
to copy into its repo withcanvas_filesand redraws once from its copy. Its holder line keeps where the files came
from (holder.from,holder.handover). Every message of the handover thread reaches both sides, also with
untilMention; the panel shows who it waits for; the finished thread folds into a ✓. Only the person starts a
handover (POST /api/boards/:id/handover, then…/ready,…/accept,…/cancel;GET …/handover). - MCP
canvas_handover(local and/mcp): the status,ready,accept,cancel.canvas_contextand the
top ofcanvas_read_boardsay what the open handover waits for.
Changed
- Only the holder redraws a diagram. Until now any agent that redrew a diagram silently became its holder, so two
agents could take it from each other. Now a draw that would take over, change or drop a diagram (or the workflow)
another agent holds is refused before anything is drawn —design_draw(local and remote),awd design draw,
awd graph --canvas, andPUT/PATCHof the board meta (409): the files of "" () are held by
: you cannot redraw them. Propose instead (canvas_files → canvas_propose_edit), or ask the person to hand them
over to you (board panel → Hand over files). A diagram nobody holds yet is free for the first drawer, as before; a
PUTthat leaves out another agent's diagram keeps it.GET /api/boards/:id/settingsalso returnshandover.