mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-14 17:09:46 +00:00
Merge main into fix/graph-series-gradient-per-mark
# Conflicts: # docs/mcp.md
This commit is contained in:
+35
-12
@@ -1,6 +1,6 @@
|
||||
# VectorCraft MCP server
|
||||
|
||||
> **Last updated:** 2026-11-13 · **Change:** Envelopes: a top object's side whose pieces are all one curve split at anchors follows that curve's parameter (#7097); existing response shapes retained. Previously: Save location-refusal error (#6146); existing response shapes retained.
|
||||
> **Last updated:** 2026-11-13 · **Change:** Snap to Point with Smart Guides off draws no Smart Guides labels or lines, #7250; no response-shape change. Previously: Envelopes: a top object's side whose pieces are all one curve split at anchors follows that curve's parameter (#7097); existing response shapes retained.
|
||||
|
||||
`vectorcraft-cli mcp` runs a [Model Context Protocol](https://modelcontextprotocol.io) server on stdio
|
||||
(newline-delimited JSON-RPC 2.0; see [Protocol](#protocol) for version negotiation). Agents use it to
|
||||
@@ -805,13 +805,17 @@ color changed by `paint.invert`, `paint.complement`, `edit.colors.invert`, `edit
|
||||
`addon.color.filter`, `addon.color.applyNearestSwatch` or the ink limit of `addon.color.printFixes`. The recolor
|
||||
commands store it too when they are given a series group, the graph or a group that holds the graph. A row a command
|
||||
leaves as it was keeps what the graph stores. When one command changes several paths of a series, the frontmost of
|
||||
them sets what the graph stores. A gradient is stored with its placement relative to the box of the path it was stored
|
||||
from (a stroke's box is the path's bounds grown by half the weight), and every path of the series, the legend swatch
|
||||
included, takes it at the same place on its own box when the graph is drawn again, also after the data changes or the
|
||||
graph moves. The graph saves this as `fillUnitBox` and `strokeUnitBox` in its series paints. A gradient stored from a
|
||||
path with no width or no height is drawn at the place in the document where it was stored. So is a gradient a graph
|
||||
stored without these flags. The graph does not store a stroke's dashes, caps, joins, arrowheads, width
|
||||
profile or brush. These commands do not store the colors they give a graph's axes and labels, which are drawn again
|
||||
them sets what the graph stores. While Global Edit is on, a path directly in a series that takes an edit from another
|
||||
match (a graph's paths are matches only while the graph is isolated) has what changed on it stored for its series: the
|
||||
paint, weight, opacity and blend mode of the topmost visible fill and stroke, and the object's opacity and blend mode.
|
||||
`addon.arrange.randomizeOpacity` and `addon.arrange.sort` with `apply: "opacity"` store the object opacity, with the
|
||||
blend mode, of the frontmost path of a series whose opacity they change. A gradient is stored with its placement relative
|
||||
to the box of the path it was stored from (a stroke's box is the path's bounds grown by half the weight), and every path
|
||||
of the series, the legend swatch included, takes it at the same place on its own box when the graph is drawn again, also
|
||||
after the data changes or the graph moves. The graph saves this as `fillUnitBox` and `strokeUnitBox` in its series
|
||||
paints. A gradient stored from a path with no width or no height is drawn at the place in the document where it was
|
||||
stored. So is a gradient a graph stored without these flags. The graph does not store a stroke's dashes, caps, joins,
|
||||
arrowheads, width profile or brush. These commands do not store the colors they give a graph's axes and labels, which are drawn again
|
||||
with the paint they had.
|
||||
|
||||
`text.setFormat` without `start` and `end`, on a graph or on its labels, stores the character and paragraph attributes
|
||||
@@ -5094,6 +5098,8 @@ the canvas (coordinates out of range)".
|
||||
`path.setHandle`, `path.moveAnchor` and `path.insertAnchor` edit subpath 0 when `subpath` is absent or null, and refuse a `subpath` that
|
||||
is not a whole number of 0 or more, such as 1.5, -1 or "1" ("missing integer `subpath`"); `path.split` refuses such
|
||||
an `anchor` or `segment` in the same way. The document does not change and no undo step is recorded.
|
||||
`path.moveAnchor` to the point the anchor is at, and `path.setHandle` to the point the handle is at on an anchor that
|
||||
keeps its kind, leave the document as it is and record no undo step.
|
||||
`path.insertAnchor` keeps the direct-selected anchors and selected segments of the path on the same points: those
|
||||
after the new anchor on its subpath are numbered one higher, and a selected segment that the new anchor splits stays
|
||||
selected as its two halves, with the new anchor as an end of both that moves with them. Undo restores the path and
|
||||
@@ -5236,6 +5242,13 @@ round, such as a rectangle, stays as it is. Closed paths stay closed and open pa
|
||||
{"name":"run_command","arguments":{"command":"object.path.smooth","params":{"level":80}}}
|
||||
```
|
||||
|
||||
`path.smoothRegion` (the Smooth tool) keeps the end points of an open path where they are. When the stretch it refits
|
||||
reaches the first or last anchor of an open path, the curve there leaves or arrives along the smoothed path within
|
||||
`radius` of that end rather than along the first or last segment, so a jagged end turns with the rest of the path; it
|
||||
keeps the segment's direction when the smoothed path there turns back by 90° or more. Where the stretch ends inside a
|
||||
path, the curve keeps the direction of the part outside the drag. `object.path.smooth` and Simplify keep each end's
|
||||
direction.
|
||||
|
||||
In the desktop app, Object › Path › Smooth and the canvas context menu's Smooth… (listed while the selection holds a
|
||||
path) open the slider (`ui.menuDialog {command: "object.path.smooth"}`, dialog `smoothSlider` with field `level`) at
|
||||
the Auto-Smooth level, and the slider previews the result until `ui.dialog.confirm`; `ui.smoothAuto` moves the open
|
||||
@@ -5813,7 +5826,7 @@ The Selection & Anchor Display and General preferences apply to `pointer_gesture
|
||||
- `usePreciseCursors`: the Pen, Eyedropper, Slice and Blend tools' pointers are a crosshair.
|
||||
- `snapToPointTolerance` (1–8 px, 2 by default): with View › Snap to Point on and Smart Guides off (desktop app), the
|
||||
point a selection is dragged by, a drawn point and a transform tool's reference point land on an anchor or a ruler
|
||||
guide that near.
|
||||
guide that near, showing none of the Smart Guides labels or lines.
|
||||
- `moveLockedWithArtboard`: `artboard.move {moveArt: true}`, the Artboard tool and `artboard.rearrange` move locked and
|
||||
hidden art, and art that is also on a locked artboard, with the artboard too, and `artboard.setProps {scaleArt: true}`
|
||||
scales it too; off (the default) it stays where it is. `artboard.duplicate`, `artboard.copy` and `artboard.cut` copy or
|
||||
@@ -7240,7 +7253,14 @@ result carries the same files as a zip (`{name: "<name>.zip", dataBase64}`, entr
|
||||
document, objects, graphicStyles, brushes, spotColors, patterns, gradients, symbols, fonts, fontDetails, linkedImages,
|
||||
embeddedImages, repeats), `fonts` (the fonts the document's type uses, the type in opacity masks and in the art of
|
||||
its symbols and pattern swatches included, which the fonts and fontDetails categories list; with `selectionOnly`, the
|
||||
fonts of the selected type), `brushNames` (the brushes the art's strokes use, each once, hidden strokes, strokes at an opacity of 0, strokes with no
|
||||
fonts of the selected type), `fontDetails` (`[{font, match, family, style, file, embedding}]`: each font of `fonts`,
|
||||
in order, as the fontDetails category's rows give it: `match` is `exact`, `style` (a style the family lacks, shown in
|
||||
`family` `style`), `missingWithFallback` (not installed, shown in `family` `style`) or `missing`; `file` is the face's
|
||||
file name, null for a built-in face; `embedding` is `allowed`, `editing`, `previewPrint` or `forbidden`, null when no
|
||||
face is found), `imageObjects` (`[{name, width, height, linked, file}]`: the image objects in the order the
|
||||
linkedImages and embeddedImages categories list them, with the file a linked image's row shows and null for an
|
||||
embedded one), `document.unitId` (the document's units as Preferences › Units names them, such as `millimeters`, beside
|
||||
the English `document.units`), `brushNames` (the brushes the art's strokes use, each once, hidden strokes, strokes at an opacity of 0, strokes with no
|
||||
paint or width, guides, paths with no segment, type that draws no characters, a group's or layer's own strokes, a compound path member's own strokes and an image's strokes without a
|
||||
shape left out; with `selectionOnly`, the brushes the selected
|
||||
objects' strokes use), `brushes` (`[{name, type}]`: those brushes with their types, `calligraphic`, `scatter`, `art`,
|
||||
@@ -7253,9 +7273,11 @@ whose drawn characters use a pattern included, hidden fills and strokes, fills a
|
||||
member's own fills and strokes, an image's fills and strokes that no Convert to Shape or Outline Object effect gives a
|
||||
shape, and characters that draw nothing (spaces and line breaks without an underline or strikethrough) left out, with
|
||||
the patterns it uses, which the patterns category lists as Pattern Objects and `objects.patterns` counts; with `selectionOnly`, those in the selection),
|
||||
`patternNames` (the patterns those objects use), `gradientObjects` (`[{id, name, gradients}]`: every object filled or
|
||||
`patternNames` (the patterns those objects use), `gradientObjects` (`[{id, name, gradients, kinds}]`: every object filled or
|
||||
stroked with a gradient, by the same rules as `patternObjects`, with the gradients it uses: the name of the gradient
|
||||
swatch a gradient is linked to, else `Linear gradient`, `Radial gradient` or `Freeform gradient`; the gradients category
|
||||
swatch a gradient is linked to, else its kind's name, such as `Linear gradient`, `Radial gradient` or `Freeform gradient`;
|
||||
`kinds` gives, for each of `gradients`, the kind (`linear`, `radial`, `conic`, `diamond` or `freeform`) of a gradient
|
||||
named by its kind and null for a swatch's name; the gradients category
|
||||
lists them as Gradient Objects and `objects.gradients` counts them; gradient swatches no art uses are not listed; with
|
||||
`selectionOnly`, those in the selection), `gradientNames` (the gradients those objects use), `spotObjects`
|
||||
(`[{id, name, spotColors}]`: every object filled or stroked with a spot color swatch, as a solid color or in the
|
||||
@@ -11524,5 +11546,6 @@ the error text. The interactive fallback applies only to ordinary File > Save, n
|
||||
|
||||
| Date | Change |
|
||||
|---|---|
|
||||
| 2026-11-13 | Snap to Point with Smart Guides off draws no Smart Guides labels or lines (#7250). |
|
||||
| 2026-11-13 | Envelopes: a top object's side whose pieces are all one curve split at anchors follows that curve's parameter (#7097). |
|
||||
| 2026-11-11 | Document READ_ONLY_LOCATION for saves (#6146); no response-shape change. |
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user