Files
vectorcraft/docs/control-protocol.md
T
bflatasticandClaude Opus 5.5 321ab52aea M3.45: graphic style links: redefine, break link, options, unused, sort, Select > Same
The Appearance panel names the style a linked object uses and its menu offers Redefine
Graphic Style "name", which updates every object still linked (edited objects keep their
look and are unlinked). The Graphic Styles panel breaks links (button and menu), selects
all unused styles, sorts by name, deletes several styles, and opens Graphic Style Options
(rename; links follow) on double-click; New Graphic Style from the menu or with Alt asks
for a name. Select > Same > Graphic Style and Appearance Attribute work, and Document Info
lists the style names.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 23:03:45 +07:00

4.4 KiB

Control protocol

vectorcraft --control <port> listens on 127.0.0.1:<port> (loopback only). One JSON request per line: {"id": 1, "method": "ui.inspect", "params": {}} → {"id": 1, "ok": true, "result": {...}} or {"id":1,"ok":false,"error":"..."}.

Method Params
engine.execute {command, params} run any engine or UI command (see engine.commands)
engine.commands every command with label, shortcut, params doc, enablement
document.inspect layer tree, selection, history, paint defaults
ui.inspect tool, UI state, view, canvas rect, window size, perf
ui.menu.list / ui.menu.invoke {command, params} the full menu tree / invoke an item
ui.tool.select / ui.tool.list {tool}
ui.pointer `{events:[{kind: down drag
ui.key / ui.text {key, shift?, alt?, cmd?} / {text} synthetic keyboard input
ui.set {brightness?, panel?, rulers?, outline?, grid?, smartGuides?, boundingBox?, controlBar?}
ui.dialog.set / .confirm / .cancel {field, value} fill and submit the open dialog
ui.screenshot {path?} capture the window (PNG). Needs a presented frame: with the screen locked or the window minimized/covered it fails after ~8 s with an explanatory error
ui.render {path?, scale?} render the artboard headlessly (PNG)
ui.resize / ui.focus
app.open / app.save / app.export / app.quit {path} / {path?} / {path?, format?, artboard?, range?, scale?, …} app.open reads every format document.open reads (see document.formats). app.export encodes through the engine's document.export (same options; the document keeps its path) and writes path through the host; without path it returns {dataBase64, format, bytes}, as headless mode does. app.quit, file.close and file.closeAll first open a saveChanges dialog for each modified document (they return {"pending": "saveChanges"}): ui.dialog.confirm saves, ui.dialog.set {field: "discard", value: true} then confirm discards, ui.dialog.cancel cancels the whole close or quit
ui.dialog.* on gradientStop {field: "color" | "opacity" | "location", value} double-clicking a stop on the Gradient tool's annotator opens its popover (fields index, x, y, tab); set color (hex), opacity or location (percentages) and ui.dialog.confirm to apply them to the selected stop. gradient.selectStop {index} picks the stop the annotator, the panels and Delete/←/→ (ui.key) act on

Swatch editors: engine.execute with ui.swatchOptions {name} opens the swatchOptions dialog for a colour swatch (fields name, spot, global, mode: gray/rgb/hsb/cmyk/web, color: "#rrggbb" or a colour object, preview), which previews on the canvas while open; ui.dialog.confirm applies it with swatch.edit as one undo step and ui.dialog.cancel rolls the preview back. Gradient swatches open the Gradient panel and pattern swatches pattern editing instead.

Confirmations: deleting swatches from the Swatches panel opens a confirm dialog (fields message, detail); ui.dialog.confirm runs the command it asks about (here swatch.delete) and ui.dialog.cancel drops it.

New swatches and colour groups: ui.newSwatch {spot?, group?} opens the newSwatch dialog prefilled from the active fill or stroke (fields as in swatchOptions plus group; a gradient or pattern only takes name) and ui.newColorGroup {swatches?} opens newColorGroup (fields name, fromArtwork, toGlobal, includeTints, swatches); ui.dialog.confirm runs swatch.new / swatch.newGroup.

The Color Picker is a dialog too: engine.execute {command: "ui.colorPicker", params: {stroke?, color?}} opens it for the fill (or stroke) proxy; ui.dialog.set {field: "hex", value: "00FF00"} (or color, channel, webOnly, swatches) then ui.dialog.confirm applies the colour through paint.setFill / paint.setStroke.

Graphic styles: ui.graphicStyleOptions {name} opens the graphicStyleOptions dialog (field name) for a style and ui.dialog.confirm renames it with graphicStyle.rename (a name another style has returns an error and keeps the dialog open); without name it names a new style made from the selection (graphicStyle.new).