Skip to content

Releases: river0825/unprose

v0.30.0

Choose a tag to compare

@river0825 river0825 released this 22 Oct 07:11

Added

  • Draw an actor again at one sentence (docs/diagrams.md §6b "Drawn again at one sentence"). layout: { actors: repeat } and repeat: true only 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: lead on that sentence now draws Lead again for it, next to the sentence — with or
    without repeat. The lint warns when drawAgain names an actor the sentence does not have, and says so when it
    names one at its first appearance; canvas_read_board says 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 the id you 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

Choose a tag to compare

@river0825 river0825 released this 22 Oct 07:02

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; label bug) and Suggest a feature (the problem, the idea, the version; label enhancement).
    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_feedback takes kind: 'bug' | 'idea' and a title, 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_REPO sends issues elsewhere
    (default: the repository updates come from, river0825/unprose); GET /api/version names it as issuesRepo.

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 a kind is a document, so stories came out as a
    row of identical pages. The domain-story prompt, the domain-storytelling skill, the tool description and
    AGENTS.md now say: declare the work objects, draw an icon per kind of thing under icons: (the main work object
    first, three to seven in a story) and use its name as the kind. The skill has a new references/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-icon now 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 under workObjects).

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) without before made the history panel throw, and the whole page went blank. Each
    change is now read repaired: before missing reads as {}, ops not 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 as parent: undefined, which JSON drops, so the
    item stayed in. An update now takes a key away with null (parent: null).

v0.28.0

Choose a tag to compare

@river0825 river0825 released this 22 Oct 00:34

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 as data.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 (or repeat: true on 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

Choose a tag to compare

@river0825 river0825 released this 21 Oct 07:23

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

Choose a tag to compare

@river0825 river0825 released this 15 Oct 02:56

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.hidden on 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 in canvas_read_board and canvas_context — not what it
    holds, unless includeHidden: true; the layout check, canvas_snapshot and 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.
  • 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_draw and awd graph --canvas read
    what they need from it — who moved, added and deleted what — from GET …/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, diff and every canvas_wait check 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

Choose a tag to compare

@river0825 river0825 released this 13 Oct 02:39

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_board and canvas_context now 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 …/settings lists them as frameless.

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

Choose a tag to compare

@river0825 river0825 released this 13 Oct 01:50

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
    — its goto, a flows entry, 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", "點擊 → 設定" — write goto: <screen> instead; a note that repeats its goto can go; one that
    names another screen than its goto is a warning. Told by awd design lint / design_lint only, 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_layout and the frame panel's Layout.

Changed

  • null in a comment update's data removes 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 as PATCH /api/boards/:id for meta.

v0.24.0

Choose a tag to compare

@river0825 river0825 released this 12 Oct 04:15

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 lint reports an on that 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_board lists 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 new canvas_todo tool; canvas_context counts 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_snapshot draws 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

Choose a tag to compare

@river0825 river0825 released this 08 Oct 09:38

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.callout on the note comment; data.ui.callout,
    data.ui.note, items[i].callout, rowCallouts on 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

Choose a tag to compare

@river0825 river0825 released this 08 Oct 09:36

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 with canvas_files and 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_context and the
    top of canvas_read_board say 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, and PUT / PATCH of 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
    PUT that leaves out another agent's diagram keeps it. GET /api/boards/:id/settings also returns handover.