Skip to main content
Glama
with-pebbly

aseprite-ai-artist

by with-pebbly

Draw

draw

Apply multiple pixel-art operations—pixels, lines, shapes, fills, text, or grid art—to one Aseprite cel as a single undoable action.

Instructions

Apply a batch of drawing operations to one cel, as a single undoable action. Ops: pixels, line, polyline, rect, ellipse, fill, replace, dither, gradient, clear, blit, text, grid. Batch aggressively — a whole sprite in one call is normal and correct, and it means the user can undo your work with one Ctrl+Z. Set paletteLock (default true) to snap every colour to the sprite's palette by perceptual distance before anything is written, so you cannot silently widen a curated palette. Ops run in array order, so paint fills before outlines and outlines before highlights. 'text' is laid out here from a bitmap font and expanded to plain pixels before it reaches Aseprite — pass measureOnly: true with only 'text' ops to get each one's ink bounds without touching the sprite, e.g. to centre a label first. 'grid' paints a picture written as text — one character per pixel, a legend mapping characters to colours, the same shape look op="ascii" returns — so you can see the whole silhouette while you write it instead of composing it from shapes. It is the easiest way to draw a small sprite or a whole animation frame, and to edit one: read a region with look op="ascii" layer=… rulers=false, change the rows, and send them back as a grid at the region's x/y.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
opsYesApplied in order, in one transaction.
frameNo1-based frame number. Omit to use the active frame.
labelNoName shown in Aseprite's undo history. Describe the intent, e.g. 'shade helmet'.
layerNoLayer name. Omit to use the active layer.
spriteNoWhich sprite: its id as '#7' (what every result reports back, and the only unambiguous form — two unsaved documents are both called 'Sprite'), its filename, or its display name. Omit to use the sprite Aseprite has focused.
createCelNoCreate the cel if the target layer/frame has none.
measureOnlyNoEvery op must be 'text'. Returns each one's ink bounds without calling Aseprite at all — use to size a panel or centre a label before actually drawing it.
paletteLockNoSnap every colour to the nearest palette entry (CIELAB ΔE). Set false only when the user asked to introduce new colours.
selectionOnlyNoClip every op to the current selection.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
frameNo
layerNo
boundsNoBounding box actually touched.
spriteNo
opsAppliedNo
textBoundsNoOnly present when `measureOnly` was set.
measureOnlyNo
colorsSnappedNoColours palette-lock moved, and how far. A large ΔE means the palette lacks that colour.
pixelsChangedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.7.0
    • changedInput schema / properties / ops / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "description": "Colour as #rrggbb or #rrggbbaa.",
      -        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "pixels",
      -        "type": "string"
      -      },
      -      "points": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "color": {
      -              "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -              "description": "Per-pixel colour. Falls back to the op's `color`."
      -            },
      -            "x": {
      -              "type": "integer"
      -            },
      -            "y": {
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 20000,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "points"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "from": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "kind": {
      -        "const": "line",
      -        "type": "string"
      -      },
      -      "thickness": {
      -        "default": 1,
      -        "exclusiveMinimum": 0,
      -        "maximum": 64,
      -        "type": "integer"
      -      },
      -      "to": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "closed": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Fill colour; only meaningful when closed."
      -      },
      -      "kind": {
      -        "const": "polyline",
      -        "type": "string"
      -      },
      -      "points": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "x": {
      -              "type": "integer"
      -            },
      -            "y": {
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 2,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "points"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "description": "Outline colour.",
      -        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -        "type": "string"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Omit for an outline only."
      -      },
      -      "kind": {
      -        "const": "rect",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "height": {
      -            "exclusiveMinimum": 0,
      -            "type": "integer"
      -          },
      -          "width": {
      -            "exclusiveMinimum": 0,
      -            "type": "integer"
      -          },
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y",
      -          "width",
      -          "height"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "rect"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Colour as #rrggbb or #rrggbbaa."
      -      },
      -      "kind": {
      -        "const": "ellipse",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "additionalProperties": false,
      -        "description": "Bounding box of the ellipse.",
      -        "properties": {
      -          "height": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/height"
      -          },
      -          "width": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/width"
      -          },
      -          "x": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/x"
      -          },
      -          "y": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/y"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y",
      -          "width",
      -          "height"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "rect"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "at": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "contiguous": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "kind": {
      -        "const": "fill",
      -        "type": "string"
      -      },
      -      "tolerance": {
      -        "default": 0,
      -        "description": "Largest per-channel difference (0–255) still counted as the clicked colour. RGB sprites only; indexed and grayscale fills stay exact.",
      -        "maximum": 255,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "replace",
      -        "type": "string"
      -      },
      -      "region": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "to": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "colorA": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "colorB": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "dither",
      -        "type": "string"
      -      },
      -      "pattern": {
      -        "default": "bayer4",
      -        "enum": [
      -          "checker",
      -          "bayer2",
      -          "bayer4",
      -          "bayer8",
      -          "noise"
      -        ],
      -        "type": "string"
      -      },
      -      "ratio": {
      -        "default": 0.5,
      -        "description": "0 = all colorA, 1 = all colorB.",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "rect": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rect",
      -      "colorA",
      -      "colorB"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "direction": {
      -        "default": "vertical",
      -        "enum": [
      -          "vertical",
      -          "horizontal",
      -          "diagonal",
      -          "radial"
      -        ],
      -        "type": "string"
      -      },
      -      "dither": {
      -        "default": false,
      -        "description": "Dither the band boundaries.",
      -        "type": "boolean"
      -      },
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "gradient",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "steps": {
      -        "default": 4,
      -        "description": "Banded, not smooth — a smooth gradient is not pixel art.",
      -        "maximum": 64,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "to": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rect",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "clear",
      -        "type": "string"
      -      },
      -      "region": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect",
      -        "description": "Omit to clear the whole cel."
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "flipHorizontal": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "flipVertical": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "fromFrame": {
      -        "exclusiveMinimum": 0,
      -        "type": "integer"
      -      },
      -      "fromLayer": {
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "blit",
      -        "type": "string"
      -      },
      -      "skipTransparent": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "to": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "anchor": {
      -        "default": "top_left",
      -        "description": "Resolved against the glyph ink box, not the full advance box — outline and shadow never shift it.",
      -        "enum": [
      -          "top_left",
      -          "top",
      -          "top_right",
      -          "left",
      -          "center",
      -          "right",
      -          "bottom_left",
      -          "bottom",
      -          "bottom_right",
      -          "baseline_left",
      -          "baseline",
      -          "baseline_right"
      -        ],
      -        "type": "string"
      -      },
      -      "bold": {
      -        "default": 0,
      -        "description": "Grid-cell passes grown rightward; 0 is regular weight.",
      -        "maximum": 3,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "font": {
      -        "default": "pixel5x7",
      -        "description": "Name in knowledge/fonts, without the .json extension.",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "text",
      -        "type": "string"
      -      },
      -      "letterSpacing": {
      -        "default": 1,
      -        "type": "integer"
      -      },
      -      "lineSpacing": {
      -        "default": 1,
      -        "type": "integer"
      -      },
      -      "outlineColor": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Colour as #rrggbb or #rrggbbaa."
      -      },
      -      "outlineDiagonals": {
      -        "default": true,
      -        "description": "8-neighbour outline instead of 4.",
      -        "type": "boolean"
      -      },
      -      "scale": {
      -        "default": 1,
      -        "maximum": 8,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "shadowColor": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Colour as #rrggbb or #rrggbbaa."
      -      },
      -      "shadowOffset": {
      -        "additionalProperties": false,
      -        "default": {
      -          "x": 1,
      -          "y": 1
      -        },
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "text": {
      -        "description": "Multiline via \\n.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "x": {
      -        "type": "integer"
      -      },
      -      "y": {
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "text",
      -      "x",
      -      "y",
      -      "color"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "grid",
      -        "type": "string"
      -      },
      -      "legend": {
      -        "additionalProperties": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Colour as #rrggbb or #rrggbbaa."
      -        },
      -        "description": "One character → colour; null is transparent. '.' is transparent unless you redefine it.",
      -        "type": "object"
      -      },
      -      "rows": {
      -        "description": "Top to bottom, one character per pixel, every row the same width.",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 256,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "transparent": {
      -        "default": "erase",
      -        "description": "Transparent cells: 'erase' clears them, so the grid's rectangle ends up exactly as written; 'skip' leaves the pixel underneath, to stamp a shape over existing art.",
      -        "enum": [
      -          "erase",
      -          "skip"
      -        ],
      -        "type": "string"
      -      },
      -      "x": {
      -        "default": 0,
      -        "description": "Sprite x of the grid's left column.",
      -        "type": "integer"
      -      },
      -      "y": {
      -        "default": 0,
      -        "description": "Sprite y of the grid's top row.",
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "legend",
      -      "rows"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "description": "Colour as #rrggbb or #rrggbbaa.",
      +        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "pixels",
      +        "type": "string"
      +      },
      +      "points": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "color": {
      +              "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +              "description": "Per-pixel colour. Falls back to the op's `color`."
      +            },
      +            "x": {
      +              "type": "integer"
      +            },
      +            "y": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 20000,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "points"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "from": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "kind": {
      +        "const": "line",
      +        "type": "string"
      +      },
      +      "thickness": {
      +        "default": 1,
      +        "exclusiveMinimum": 0,
      +        "maximum": 64,
      +        "type": "integer"
      +      },
      +      "to": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "closed": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Fill colour; only meaningful when closed."
      +      },
      +      "kind": {
      +        "const": "polyline",
      +        "type": "string"
      +      },
      +      "points": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "x": {
      +              "type": "integer"
      +            },
      +            "y": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 2,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "points"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "description": "Outline colour.",
      +        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +        "type": "string"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Omit for an outline only."
      +      },
      +      "kind": {
      +        "const": "rect",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "height": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "width": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y",
      +          "width",
      +          "height"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "rect"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "kind": {
      +        "const": "ellipse",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "additionalProperties": false,
      +        "description": "Bounding box of the ellipse.",
      +        "properties": {
      +          "height": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/height"
      +          },
      +          "width": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/width"
      +          },
      +          "x": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/x"
      +          },
      +          "y": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/y"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y",
      +          "width",
      +          "height"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "rect"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "contiguous": {
      +        "default": true,
      +        "type": "boolean"
      +      },
      +      "kind": {
      +        "const": "fill",
      +        "type": "string"
      +      },
      +      "tolerance": {
      +        "default": 0,
      +        "description": "Largest per-channel difference (0–255) still counted as the clicked colour. RGB sprites only; indexed and grayscale fills stay exact.",
      +        "maximum": 255,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "replace",
      +        "type": "string"
      +      },
      +      "region": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "to": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "colorA": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "colorB": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "dither",
      +        "type": "string"
      +      },
      +      "pattern": {
      +        "default": "bayer4",
      +        "enum": [
      +          "checker",
      +          "bayer2",
      +          "bayer4",
      +          "bayer8",
      +          "noise"
      +        ],
      +        "type": "string"
      +      },
      +      "ratio": {
      +        "default": 0.5,
      +        "description": "0 = all colorA, 1 = all colorB.",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "rect": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rect",
      +      "colorA",
      +      "colorB"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "direction": {
      +        "default": "vertical",
      +        "enum": [
      +          "vertical",
      +          "horizontal",
      +          "diagonal",
      +          "radial"
      +        ],
      +        "type": "string"
      +      },
      +      "dither": {
      +        "default": false,
      +        "description": "Dither the band boundaries.",
      +        "type": "boolean"
      +      },
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "gradient",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "steps": {
      +        "default": 4,
      +        "description": "Banded, not smooth — a smooth gradient is not pixel art.",
      +        "maximum": 64,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "to": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rect",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "clear",
      +        "type": "string"
      +      },
      +      "region": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect",
      +        "description": "Omit to clear the whole cel."
      +      }
      +    },
      +    "required": [
      +      "kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "flipHorizontal": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "flipVertical": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "fromFrame": {
      +        "exclusiveMinimum": 0,
      +        "type": "integer"
      +      },
      +      "fromLayer": {
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "blit",
      +        "type": "string"
      +      },
      +      "skipTransparent": {
      +        "default": true,
      +        "type": "boolean"
      +      },
      +      "to": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "anchor": {
      +        "default": "top_left",
      +        "description": "Resolved against the glyph ink box, not the full advance box — outline and shadow never shift it.",
      +        "enum": [
      +          "top_left",
      +          "top",
      +          "top_right",
      +          "left",
      +          "center",
      +          "right",
      +          "bottom_left",
      +          "bottom",
      +          "bottom_right",
      +          "baseline_left",
      +          "baseline",
      +          "baseline_right"
      +        ],
      +        "type": "string"
      +      },
      +      "bold": {
      +        "default": 0,
      +        "description": "Grid-cell passes grown rightward; 0 is regular weight.",
      +        "maximum": 3,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "font": {
      +        "default": "pixel5x7",
      +        "description": "Name in knowledge/fonts, without the .json extension.",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "text",
      +        "type": "string"
      +      },
      +      "letterSpacing": {
      +        "default": 1,
      +        "type": "integer"
      +      },
      +      "lineSpacing": {
      +        "default": 1,
      +        "type": "integer"
      +      },
      +      "outlineColor": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "outlineDiagonals": {
      +        "default": true,
      +        "description": "8-neighbour outline instead of 4.",
      +        "type": "boolean"
      +      },
      +      "scale": {
      +        "default": 1,
      +        "maximum": 8,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "shadowColor": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "shadowOffset": {
      +        "additionalProperties": false,
      +        "default": {
      +          "x": 1,
      +          "y": 1
      +        },
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "text": {
      +        "description": "Multiline via \\n.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "x": {
      +        "type": "integer"
      +      },
      +      "y": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "text",
      +      "x",
      +      "y",
      +      "color"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "grid",
      +        "type": "string"
      +      },
      +      "legend": {
      +        "additionalProperties": {
      +          "anyOf": [
      +            {
      +              "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Colour as #rrggbb or #rrggbbaa."
      +        },
      +        "description": "One character → colour; null is transparent. '.' is transparent unless you redefine it.",
      +        "type": "object"
      +      },
      +      "rows": {
      +        "description": "Top to bottom, one character per pixel, every row the same width. Up to the canvas size.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "transparent": {
      +        "default": "erase",
      +        "description": "Transparent cells: 'erase' clears them, so the grid's rectangle ends up exactly as written; 'skip' leaves the pixel underneath, to stamp a shape over existing art.",
      +        "enum": [
      +          "erase",
      +          "skip"
      +        ],
      +        "type": "string"
      +      },
      +      "x": {
      +        "default": 0,
      +        "description": "Sprite x of the grid's left column.",
      +        "type": "integer"
      +      },
      +      "y": {
      +        "default": 0,
      +        "description": "Sprite y of the grid's top row.",
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "legend",
      +      "rows"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changedv0.5.0
    • changedInput schema / properties / ops / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "description": "Colour as #rrggbb or #rrggbbaa.",
      -        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "pixels",
      -        "type": "string"
      -      },
      -      "points": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "color": {
      -              "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -              "description": "Per-pixel colour. Falls back to the op's `color`."
      -            },
      -            "x": {
      -              "type": "integer"
      -            },
      -            "y": {
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 20000,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "points"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "from": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "kind": {
      -        "const": "line",
      -        "type": "string"
      -      },
      -      "thickness": {
      -        "default": 1,
      -        "exclusiveMinimum": 0,
      -        "maximum": 64,
      -        "type": "integer"
      -      },
      -      "to": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "closed": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Fill colour; only meaningful when closed."
      -      },
      -      "kind": {
      -        "const": "polyline",
      -        "type": "string"
      -      },
      -      "points": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "x": {
      -              "type": "integer"
      -            },
      -            "y": {
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 2,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "points"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "description": "Outline colour.",
      -        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -        "type": "string"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Omit for an outline only."
      -      },
      -      "kind": {
      -        "const": "rect",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "height": {
      -            "exclusiveMinimum": 0,
      -            "type": "integer"
      -          },
      -          "width": {
      -            "exclusiveMinimum": 0,
      -            "type": "integer"
      -          },
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y",
      -          "width",
      -          "height"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "rect"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Colour as #rrggbb or #rrggbbaa."
      -      },
      -      "kind": {
      -        "const": "ellipse",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "additionalProperties": false,
      -        "description": "Bounding box of the ellipse.",
      -        "properties": {
      -          "height": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/height"
      -          },
      -          "width": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/width"
      -          },
      -          "x": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/x"
      -          },
      -          "y": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/y"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y",
      -          "width",
      -          "height"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "rect"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "at": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "contiguous": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "kind": {
      -        "const": "fill",
      -        "type": "string"
      -      },
      -      "tolerance": {
      -        "default": 0,
      -        "maximum": 255,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "replace",
      -        "type": "string"
      -      },
      -      "region": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "to": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "colorA": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "colorB": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "dither",
      -        "type": "string"
      -      },
      -      "pattern": {
      -        "default": "bayer4",
      -        "enum": [
      -          "checker",
      -          "bayer2",
      -          "bayer4",
      -          "bayer8",
      -          "noise"
      -        ],
      -        "type": "string"
      -      },
      -      "ratio": {
      -        "default": 0.5,
      -        "description": "0 = all colorA, 1 = all colorB.",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "rect": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rect",
      -      "colorA",
      -      "colorB"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "direction": {
      -        "default": "vertical",
      -        "enum": [
      -          "vertical",
      -          "horizontal",
      -          "diagonal",
      -          "radial"
      -        ],
      -        "type": "string"
      -      },
      -      "dither": {
      -        "default": false,
      -        "description": "Dither the band boundaries.",
      -        "type": "boolean"
      -      },
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "gradient",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "steps": {
      -        "default": 4,
      -        "description": "Banded, not smooth — a smooth gradient is not pixel art.",
      -        "maximum": 64,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "to": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rect",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "clear",
      -        "type": "string"
      -      },
      -      "region": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect",
      -        "description": "Omit to clear the whole cel."
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "flipHorizontal": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "flipVertical": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "fromFrame": {
      -        "exclusiveMinimum": 0,
      -        "type": "integer"
      -      },
      -      "fromLayer": {
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "blit",
      -        "type": "string"
      -      },
      -      "skipTransparent": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "to": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "anchor": {
      -        "default": "top_left",
      -        "description": "Resolved against the glyph ink box, not the full advance box — outline and shadow never shift it.",
      -        "enum": [
      -          "top_left",
      -          "top",
      -          "top_right",
      -          "left",
      -          "center",
      -          "right",
      -          "bottom_left",
      -          "bottom",
      -          "bottom_right",
      -          "baseline_left",
      -          "baseline",
      -          "baseline_right"
      -        ],
      -        "type": "string"
      -      },
      -      "bold": {
      -        "default": 0,
      -        "description": "Grid-cell passes grown rightward; 0 is regular weight.",
      -        "maximum": 3,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "font": {
      -        "default": "pixel5x7",
      -        "description": "Name in knowledge/fonts, without the .json extension.",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "text",
      -        "type": "string"
      -      },
      -      "letterSpacing": {
      -        "default": 1,
      -        "type": "integer"
      -      },
      -      "lineSpacing": {
      -        "default": 1,
      -        "type": "integer"
      -      },
      -      "outlineColor": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Colour as #rrggbb or #rrggbbaa."
      -      },
      -      "outlineDiagonals": {
      -        "default": true,
      -        "description": "8-neighbour outline instead of 4.",
      -        "type": "boolean"
      -      },
      -      "scale": {
      -        "default": 1,
      -        "maximum": 8,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "shadowColor": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Colour as #rrggbb or #rrggbbaa."
      -      },
      -      "shadowOffset": {
      -        "additionalProperties": false,
      -        "default": {
      -          "x": 1,
      -          "y": 1
      -        },
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "text": {
      -        "description": "Multiline via \\n.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "x": {
      -        "type": "integer"
      -      },
      -      "y": {
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "text",
      -      "x",
      -      "y",
      -      "color"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "description": "Colour as #rrggbb or #rrggbbaa.",
      +        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "pixels",
      +        "type": "string"
      +      },
      +      "points": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "color": {
      +              "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +              "description": "Per-pixel colour. Falls back to the op's `color`."
      +            },
      +            "x": {
      +              "type": "integer"
      +            },
      +            "y": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 20000,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "points"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "from": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "kind": {
      +        "const": "line",
      +        "type": "string"
      +      },
      +      "thickness": {
      +        "default": 1,
      +        "exclusiveMinimum": 0,
      +        "maximum": 64,
      +        "type": "integer"
      +      },
      +      "to": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "closed": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Fill colour; only meaningful when closed."
      +      },
      +      "kind": {
      +        "const": "polyline",
      +        "type": "string"
      +      },
      +      "points": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "x": {
      +              "type": "integer"
      +            },
      +            "y": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 2,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "points"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "description": "Outline colour.",
      +        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +        "type": "string"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Omit for an outline only."
      +      },
      +      "kind": {
      +        "const": "rect",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "height": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "width": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y",
      +          "width",
      +          "height"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "rect"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "kind": {
      +        "const": "ellipse",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "additionalProperties": false,
      +        "description": "Bounding box of the ellipse.",
      +        "properties": {
      +          "height": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/height"
      +          },
      +          "width": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/width"
      +          },
      +          "x": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/x"
      +          },
      +          "y": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/y"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y",
      +          "width",
      +          "height"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "rect"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "contiguous": {
      +        "default": true,
      +        "type": "boolean"
      +      },
      +      "kind": {
      +        "const": "fill",
      +        "type": "string"
      +      },
      +      "tolerance": {
      +        "default": 0,
      +        "description": "Largest per-channel difference (0–255) still counted as the clicked colour. RGB sprites only; indexed and grayscale fills stay exact.",
      +        "maximum": 255,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "replace",
      +        "type": "string"
      +      },
      +      "region": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "to": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "colorA": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "colorB": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "dither",
      +        "type": "string"
      +      },
      +      "pattern": {
      +        "default": "bayer4",
      +        "enum": [
      +          "checker",
      +          "bayer2",
      +          "bayer4",
      +          "bayer8",
      +          "noise"
      +        ],
      +        "type": "string"
      +      },
      +      "ratio": {
      +        "default": 0.5,
      +        "description": "0 = all colorA, 1 = all colorB.",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "rect": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rect",
      +      "colorA",
      +      "colorB"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "direction": {
      +        "default": "vertical",
      +        "enum": [
      +          "vertical",
      +          "horizontal",
      +          "diagonal",
      +          "radial"
      +        ],
      +        "type": "string"
      +      },
      +      "dither": {
      +        "default": false,
      +        "description": "Dither the band boundaries.",
      +        "type": "boolean"
      +      },
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "gradient",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "steps": {
      +        "default": 4,
      +        "description": "Banded, not smooth — a smooth gradient is not pixel art.",
      +        "maximum": 64,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "to": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rect",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "clear",
      +        "type": "string"
      +      },
      +      "region": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect",
      +        "description": "Omit to clear the whole cel."
      +      }
      +    },
      +    "required": [
      +      "kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "flipHorizontal": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "flipVertical": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "fromFrame": {
      +        "exclusiveMinimum": 0,
      +        "type": "integer"
      +      },
      +      "fromLayer": {
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "blit",
      +        "type": "string"
      +      },
      +      "skipTransparent": {
      +        "default": true,
      +        "type": "boolean"
      +      },
      +      "to": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "anchor": {
      +        "default": "top_left",
      +        "description": "Resolved against the glyph ink box, not the full advance box — outline and shadow never shift it.",
      +        "enum": [
      +          "top_left",
      +          "top",
      +          "top_right",
      +          "left",
      +          "center",
      +          "right",
      +          "bottom_left",
      +          "bottom",
      +          "bottom_right",
      +          "baseline_left",
      +          "baseline",
      +          "baseline_right"
      +        ],
      +        "type": "string"
      +      },
      +      "bold": {
      +        "default": 0,
      +        "description": "Grid-cell passes grown rightward; 0 is regular weight.",
      +        "maximum": 3,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "font": {
      +        "default": "pixel5x7",
      +        "description": "Name in knowledge/fonts, without the .json extension.",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "text",
      +        "type": "string"
      +      },
      +      "letterSpacing": {
      +        "default": 1,
      +        "type": "integer"
      +      },
      +      "lineSpacing": {
      +        "default": 1,
      +        "type": "integer"
      +      },
      +      "outlineColor": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "outlineDiagonals": {
      +        "default": true,
      +        "description": "8-neighbour outline instead of 4.",
      +        "type": "boolean"
      +      },
      +      "scale": {
      +        "default": 1,
      +        "maximum": 8,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "shadowColor": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "shadowOffset": {
      +        "additionalProperties": false,
      +        "default": {
      +          "x": 1,
      +          "y": 1
      +        },
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "text": {
      +        "description": "Multiline via \\n.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "x": {
      +        "type": "integer"
      +      },
      +      "y": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "text",
      +      "x",
      +      "y",
      +      "color"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "grid",
      +        "type": "string"
      +      },
      +      "legend": {
      +        "additionalProperties": {
      +          "anyOf": [
      +            {
      +              "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Colour as #rrggbb or #rrggbbaa."
      +        },
      +        "description": "One character → colour; null is transparent. '.' is transparent unless you redefine it.",
      +        "type": "object"
      +      },
      +      "rows": {
      +        "description": "Top to bottom, one character per pixel, every row the same width.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 256,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "transparent": {
      +        "default": "erase",
      +        "description": "Transparent cells: 'erase' clears them, so the grid's rectangle ends up exactly as written; 'skip' leaves the pixel underneath, to stamp a shape over existing art.",
      +        "enum": [
      +          "erase",
      +          "skip"
      +        ],
      +        "type": "string"
      +      },
      +      "x": {
      +        "default": 0,
      +        "description": "Sprite x of the grid's left column.",
      +        "type": "integer"
      +      },
      +      "y": {
      +        "default": 0,
      +        "description": "Sprite y of the grid's top row.",
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "legend",
      +      "rows"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed5 schema fields changedv0.4.0
    • addedInput schema / properties / measureOnly
      Added value: +{
      +  "default": false,
      +  "description": "Every op must be 'text'. Returns each one's ink bounds without calling Aseprite at all — use to size a panel or centre a label before actually drawing it.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / ops / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "description": "Colour as #rrggbb or #rrggbbaa.",
      -        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "pixels",
      -        "type": "string"
      -      },
      -      "points": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "color": {
      -              "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -              "description": "Per-pixel colour. Falls back to the op's `color`."
      -            },
      -            "x": {
      -              "type": "integer"
      -            },
      -            "y": {
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 20000,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "points"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "from": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "kind": {
      -        "const": "line",
      -        "type": "string"
      -      },
      -      "thickness": {
      -        "default": 1,
      -        "exclusiveMinimum": 0,
      -        "maximum": 64,
      -        "type": "integer"
      -      },
      -      "to": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "closed": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Fill colour; only meaningful when closed."
      -      },
      -      "kind": {
      -        "const": "polyline",
      -        "type": "string"
      -      },
      -      "points": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "x": {
      -              "type": "integer"
      -            },
      -            "y": {
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 2,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "points"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "description": "Outline colour.",
      -        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -        "type": "string"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Omit for an outline only."
      -      },
      -      "kind": {
      -        "const": "rect",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "height": {
      -            "exclusiveMinimum": 0,
      -            "type": "integer"
      -          },
      -          "width": {
      -            "exclusiveMinimum": 0,
      -            "type": "integer"
      -          },
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y",
      -          "width",
      -          "height"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "rect"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "fill": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      -        "description": "Colour as #rrggbb or #rrggbbaa."
      -      },
      -      "kind": {
      -        "const": "ellipse",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "additionalProperties": false,
      -        "description": "Bounding box of the ellipse.",
      -        "properties": {
      -          "height": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/height"
      -          },
      -          "width": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/width"
      -          },
      -          "x": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/x"
      -          },
      -          "y": {
      -            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/y"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y",
      -          "width",
      -          "height"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "rect"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "at": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "color": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "contiguous": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "kind": {
      -        "const": "fill",
      -        "type": "string"
      -      },
      -      "tolerance": {
      -        "default": 0,
      -        "maximum": 255,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "color",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "replace",
      -        "type": "string"
      -      },
      -      "region": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "to": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "colorA": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "colorB": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "dither",
      -        "type": "string"
      -      },
      -      "pattern": {
      -        "default": "bayer4",
      -        "enum": [
      -          "checker",
      -          "bayer2",
      -          "bayer4",
      -          "bayer8",
      -          "noise"
      -        ],
      -        "type": "string"
      -      },
      -      "ratio": {
      -        "default": 0.5,
      -        "description": "0 = all colorA, 1 = all colorB.",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "rect": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rect",
      -      "colorA",
      -      "colorB"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "direction": {
      -        "default": "vertical",
      -        "enum": [
      -          "vertical",
      -          "horizontal",
      -          "diagonal",
      -          "radial"
      -        ],
      -        "type": "string"
      -      },
      -      "dither": {
      -        "default": false,
      -        "description": "Dither the band boundaries.",
      -        "type": "boolean"
      -      },
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      },
      -      "kind": {
      -        "const": "gradient",
      -        "type": "string"
      -      },
      -      "rect": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "steps": {
      -        "default": 4,
      -        "description": "Banded, not smooth — a smooth gradient is not pixel art.",
      -        "maximum": 64,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "to": {
      -        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rect",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "clear",
      -        "type": "string"
      -      },
      -      "region": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect",
      -        "description": "Omit to clear the whole cel."
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "flipHorizontal": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "flipVertical": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "from": {
      -        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      -      },
      -      "fromFrame": {
      -        "exclusiveMinimum": 0,
      -        "type": "integer"
      -      },
      -      "fromLayer": {
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "blit",
      -        "type": "string"
      -      },
      -      "skipTransparent": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "to": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "x": {
      -            "type": "integer"
      -          },
      -          "y": {
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "description": "Colour as #rrggbb or #rrggbbaa.",
      +        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "pixels",
      +        "type": "string"
      +      },
      +      "points": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "color": {
      +              "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +              "description": "Per-pixel colour. Falls back to the op's `color`."
      +            },
      +            "x": {
      +              "type": "integer"
      +            },
      +            "y": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 20000,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "points"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "from": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "kind": {
      +        "const": "line",
      +        "type": "string"
      +      },
      +      "thickness": {
      +        "default": 1,
      +        "exclusiveMinimum": 0,
      +        "maximum": 64,
      +        "type": "integer"
      +      },
      +      "to": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "closed": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Fill colour; only meaningful when closed."
      +      },
      +      "kind": {
      +        "const": "polyline",
      +        "type": "string"
      +      },
      +      "points": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "x": {
      +              "type": "integer"
      +            },
      +            "y": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 2,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "points"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "description": "Outline colour.",
      +        "pattern": "^#?([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +        "type": "string"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Omit for an outline only."
      +      },
      +      "kind": {
      +        "const": "rect",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "height": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "width": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y",
      +          "width",
      +          "height"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "rect"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "fill": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "kind": {
      +        "const": "ellipse",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "additionalProperties": false,
      +        "description": "Bounding box of the ellipse.",
      +        "properties": {
      +          "height": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/height"
      +          },
      +          "width": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/width"
      +          },
      +          "x": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/x"
      +          },
      +          "y": {
      +            "$ref": "#/properties/ops/items/anyOf/3/properties/rect/properties/y"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y",
      +          "width",
      +          "height"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "rect"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "contiguous": {
      +        "default": true,
      +        "type": "boolean"
      +      },
      +      "kind": {
      +        "const": "fill",
      +        "type": "string"
      +      },
      +      "tolerance": {
      +        "default": 0,
      +        "maximum": 255,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "color",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "replace",
      +        "type": "string"
      +      },
      +      "region": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "to": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "colorA": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "colorB": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "dither",
      +        "type": "string"
      +      },
      +      "pattern": {
      +        "default": "bayer4",
      +        "enum": [
      +          "checker",
      +          "bayer2",
      +          "bayer4",
      +          "bayer8",
      +          "noise"
      +        ],
      +        "type": "string"
      +      },
      +      "ratio": {
      +        "default": 0.5,
      +        "description": "0 = all colorA, 1 = all colorB.",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "rect": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rect",
      +      "colorA",
      +      "colorB"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "direction": {
      +        "default": "vertical",
      +        "enum": [
      +          "vertical",
      +          "horizontal",
      +          "diagonal",
      +          "radial"
      +        ],
      +        "type": "string"
      +      },
      +      "dither": {
      +        "default": false,
      +        "description": "Dither the band boundaries.",
      +        "type": "boolean"
      +      },
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "kind": {
      +        "const": "gradient",
      +        "type": "string"
      +      },
      +      "rect": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "steps": {
      +        "default": 4,
      +        "description": "Banded, not smooth — a smooth gradient is not pixel art.",
      +        "maximum": 64,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "to": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rect",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "clear",
      +        "type": "string"
      +      },
      +      "region": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect",
      +        "description": "Omit to clear the whole cel."
      +      }
      +    },
      +    "required": [
      +      "kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "flipHorizontal": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "flipVertical": {
      +        "default": false,
      +        "type": "boolean"
      +      },
      +      "from": {
      +        "$ref": "#/properties/ops/items/anyOf/3/properties/rect"
      +      },
      +      "fromFrame": {
      +        "exclusiveMinimum": 0,
      +        "type": "integer"
      +      },
      +      "fromLayer": {
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "blit",
      +        "type": "string"
      +      },
      +      "skipTransparent": {
      +        "default": true,
      +        "type": "boolean"
      +      },
      +      "to": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "anchor": {
      +        "default": "top_left",
      +        "description": "Resolved against the glyph ink box, not the full advance box — outline and shadow never shift it.",
      +        "enum": [
      +          "top_left",
      +          "top",
      +          "top_right",
      +          "left",
      +          "center",
      +          "right",
      +          "bottom_left",
      +          "bottom",
      +          "bottom_right",
      +          "baseline_left",
      +          "baseline",
      +          "baseline_right"
      +        ],
      +        "type": "string"
      +      },
      +      "bold": {
      +        "default": 0,
      +        "description": "Grid-cell passes grown rightward; 0 is regular weight.",
      +        "maximum": 3,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "color": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color"
      +      },
      +      "font": {
      +        "default": "pixel5x7",
      +        "description": "Name in knowledge/fonts, without the .json extension.",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "text",
      +        "type": "string"
      +      },
      +      "letterSpacing": {
      +        "default": 1,
      +        "type": "integer"
      +      },
      +      "lineSpacing": {
      +        "default": 1,
      +        "type": "integer"
      +      },
      +      "outlineColor": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "outlineDiagonals": {
      +        "default": true,
      +        "description": "8-neighbour outline instead of 4.",
      +        "type": "boolean"
      +      },
      +      "scale": {
      +        "default": 1,
      +        "maximum": 8,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "shadowColor": {
      +        "$ref": "#/properties/ops/items/anyOf/0/properties/color",
      +        "description": "Colour as #rrggbb or #rrggbbaa."
      +      },
      +      "shadowOffset": {
      +        "additionalProperties": false,
      +        "default": {
      +          "x": 1,
      +          "y": 1
      +        },
      +        "properties": {
      +          "x": {
      +            "type": "integer"
      +          },
      +          "y": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "text": {
      +        "description": "Multiline via \\n.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "x": {
      +        "type": "integer"
      +      },
      +      "y": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "text",
      +      "x",
      +      "y",
      +      "color"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedOutput schema / properties / measureOnly
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / textBounds
      Added value: +{
      +  "description": "Only present when `measureOnly` was set.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "bounds": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "height": {
      +                "type": "integer"
      +              },
      +              "width": {
      +                "type": "integer"
      +              },
      +              "x": {
      +                "type": "integer"
      +              },
      +              "y": {
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "x",
      +              "y",
      +              "width",
      +              "height"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Ink bounds of the laid-out text; null for text with no ink (e.g. all spaces)."
      +      },
      +      "index": {
      +        "description": "Position of this op in the `ops` array.",
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "index"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "sprite",
      -  "layer",
      -  "frame",
      -  "opsApplied",
      -  "pixelsChanged",
      -  "colorsSnapped"
      -]
  4. Changed1 schema field changedv0.1.6
    • changedInput schema / properties / sprite / description
      Previous value: -"Sprite filename or id. Omit to use the sprite Aseprite has focused."New value: +"Which sprite: its id as '#7' (what every result reports back, and the only unambiguous form — two unsaved documents are both called 'Sprite'), its filename, or its display name. Omit to use the sprite Aseprite has focused."
  5. First observedv0.1.0

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: ops execute in array order, paletteLock snaps to palette by CIELAB ΔE to avoid silently widening a curated palette, text is laid out and expanded to plain pixels before reaching Aseprite, and measureOnly computes ink bounds 'without touching the sprite'. The 'single undoable action' framing is consistent with destructiveHint=false rather than contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and batching rule, then moves to paletteLock, ordering, text/measureOnly, and grid. Dense but each sentence carries distinct guidance; the grid sentences are long and could be tightened, keeping it short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 9-param, 13-op tool with full schema coverage and an output schema, the description covers the non-obvious behaviors an agent must know: ordering, palette snapping, measure-only measurement, and the grid round-trip. Minor gap is no explicit mention of how blit/replace/gradient interact with selection or palette locking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: paletteLock's perceptual-snap purpose and its 'set false only when the user asked to introduce new colours', measureOnly's requirement that every op be text and its no-side-effect return, and the ordering guarantee for `ops`. Remaining op-specific params (blit, dither, gradient) are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Apply a batch of drawing operations to one cel, as a single undoable action') and enumerates the op vocabulary. It also positions itself against the read-side sibling by referencing `look op="ascii"`, so an agent can distinguish it from transform/select without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong usage direction: 'Batch aggressively', 'a whole sprite in one call is normal and correct', and the read-modify-write workflow via `look op="ascii"` then grid. It names the read counterpart but stops short of explicit when-not-to-use guidance against mutating siblings like transform or recolor.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.