docs: curate unreleased changelog
Compare release notes with v0.14.0 and the final public behavior. Add missing migration requirements and documented outcomes, consolidate overlapping notes, and remove internal or superseded details without changing historical releases.
This commit is contained in:
parent
445b85ddc0
commit
2afdacfdc3
|
|
@ -99,6 +99,13 @@ PR CI always classifies changed paths through `tools/ci/`. Docs-only changes run
|
|||
|
||||
For user-facing work, add one present-tense outcome under the single appropriate `Unreleased` category: `Breaking changes`, `Added`, `Changed`, `Fixed`, `Performance`, or `Security`. Treat it as release notes, not a commit log: omit tests, benchmarks, CI, internal refactors/tooling, and bugs both introduced and fixed since the last release. After merges, compare the whole section with changes since the latest release, preserve important outcomes, consolidate related work, and remove duplicate bullets/headings. End sentences with periods and retain relevant issue/PR references. Update `README.md` when appropriate and this file when architecture or conventions change. Keep internal plans in ignored `scratch/`, not published docs.
|
||||
|
||||
Before finalizing `Unreleased`:
|
||||
|
||||
- Compare released behavior at the latest published tag with the final implementation, not just commit subjects. Verify questionable fixes existed at that tag; fold fixes to newly added features into their final feature description.
|
||||
- Check public exports, model/config/data contracts, and peer requirements for removals, renames, and upgrade instructions under `Breaking changes`.
|
||||
- Remove superseded intermediate behavior and duplicate outcomes across categories. State platform requirements and concrete supported behavior instead of unqualified compatibility or performance claims.
|
||||
- Run `bun run check:changelog`. Keep historical sections unchanged during routine cleanup; release publication uses the matching tagged section, not regenerated prose.
|
||||
|
||||
## Commit messages
|
||||
|
||||
`commitlint.config.ts` enforces message structure through the **Commit messages** CI job on all PRs, including docs-only changes. Run `bun run check:commits --last` or pass `--from`/`--to` for a branch range. Preserve the release exception and product casing when changing rules; CI gate policy lives in `tools/ci/src/policy.ts`.
|
||||
|
|
|
|||
124
CHANGELOG.md
124
CHANGELOG.md
|
|
@ -4,58 +4,55 @@
|
|||
|
||||
### Breaking changes
|
||||
|
||||
- Use MCP SDK v2 server/client types for programmatic MCP integrations. Define custom tools with native Valibot `input` schemas and execution metadata instead of `params`, `ParamDef`, or `paramToZod()`; tool arguments and effects derive from this shared contract. Tool exposure defaults to inclusion, with independent `mcp`, `ai`, and `webmcp` exclusions; execution support and user permissions still apply.
|
||||
- Use MCP SDK v2 server/client types for programmatic MCP integrations. Define custom tools with native Valibot `input` schemas and execution metadata instead of `params`, `ParamDef`, or `paramToZod()`.
|
||||
- Replace Scene Graph `overrides` records with `instanceOverrides`, using separate `self` and `descendants` maps. Rename `figmaDerivedLayout`, `figmaDerivedTextGlyphs`, and `FigmaDerivedTextGlyph` to `derivedLayout`, `derivedTextGlyphs`, and `DerivedTextGlyph`.
|
||||
- Update custom Vue SDK binding providers to implement `getBindingId()` and handle `unresolved`. Replace `setValue()` with `prepareEdit()`, returning a stable edit key, captured value, setter, and restoration callback.
|
||||
- Replace Vue SDK `useDialogMessages()`, `dialogMessages`, and their catalog keys with the corresponding product-domain message composables and catalogs.
|
||||
- Use Vue 3.5.41 or newer within Vue 3 for the Vue SDK, and CanvasKit 0.41.1 or newer when supplying its optional CanvasKit peer. Update custom CanvasKit integrations to use `PathBuilder` and immutable `Path` operations.
|
||||
|
||||
### Added
|
||||
|
||||
- Expose design inspection and undoable layer-property and variable edits to browser agents through experimental WebMCP in supporting browsers, with explicit Off, Inspect, and Edit access controls in Settings.
|
||||
- Control custom tool exposure independently through `mcp`, `ai`, and `webmcp` exclusions. Tools are included by default, subject to execution support and user permissions.
|
||||
- Bind Design JSX spacing, sizing, corners, and typography directly to numeric document variables.
|
||||
- Define component properties and assign instance values in Design JSX using stable property IDs.
|
||||
- Save AI conversations and attachment previews locally, switch between chats, rename or delete them, and browse saved transcripts across documents. Choose whether reasoning stays collapsed, expands while thinking, or stays expanded, with animated disclosure controls that respect reduced motion.
|
||||
|
||||
- Add a searchable command palette for editor and application actions.
|
||||
- Search current AI provider catalogs from model pickers, with curated recommendations, recent compatible models, and offline fallbacks.
|
||||
- Render triangle and line arrow stroke caps on lines and open vector paths, and choose them from the stroke cap picker.
|
||||
- Expose component properties and instance-swap targets through the Figma API and automation.
|
||||
- Normalize imported stroke dash patterns for more reliable `.fig` compatibility.
|
||||
|
||||
- Create, select, move, duplicate, transfer, and delete canvas and frame guides directly from rulers, with undoable edits, measurements, context-menu actions, and `.fig` round-trip fidelity.
|
||||
- Open to a unified home with recent and configured storage documents in grid or list layouts, and open multiple selected design files in separate tabs.
|
||||
- Snap vector points, moved layers, and resized edges to nearby geometry, guides, frame and canvas bounds, and whole-pixel coordinates, with visible alignment guides and persistent snapping preferences.
|
||||
- Run Pi through AI SDK HarnessAgent as a configurable desktop provider with saved model profiles, secure credentials, existing MCP design tools, and per-profile thinking and permission settings.
|
||||
- Combine components into variant sets through Figma API scripts and automation.
|
||||
- Add local AI usage and technical diagnostics, including token telemetry, provider/model summaries, recent failures, configurable retention, export, and clear controls. (#588)
|
||||
- Add local AI usage and technical diagnostics, including token telemetry, provider/model summaries, recent failures, configurable retention, export, and clear controls (#588).
|
||||
- Import, render, edit, resize, select, and export Figma text-on-path layers while preserving their curved glyph layout.
|
||||
- Show temporary Figma-style distance measurements between selected and Option/Alt-hovered layers. (#491)
|
||||
- Edit Design JSX and HTML/CSS previews in CodeMirror, with theme-aware highlighting, Tailwind viewing, completion, diagnostics, bounded execution, and session-level undo. (#130)
|
||||
- Set provider-specific reasoning effort on supported AI model profiles. (#454)
|
||||
- Show unavailable or substituted document fonts with affected-layer selection and retry actions, and expose font fidelity through the Figma API and MCP tooling. (#503)
|
||||
- Show temporary Figma-style distance measurements between selected and Option/Alt-hovered layers (#491).
|
||||
- Edit Design JSX and HTML/CSS previews in CodeMirror, with theme-aware highlighting, Tailwind viewing, completion, diagnostics, bounded execution, and session-level undo (#130).
|
||||
- Set provider-specific reasoning effort on supported AI model profiles (#454).
|
||||
- Show unavailable or substituted document fonts with affected-layer selection and retry actions, and expose font fidelity through the Figma API, MCP, and `openpencil fonts [file] --json`. Choose `warn`, `strict`, or `allow` font-substitution policies for file-backed CLI raster and PDF exports with `--font-policy` (#503, #625).
|
||||
- Add reusable remote MCP connections for ACP agents, with Streamable HTTP endpoints and credential-backed bearer tokens.
|
||||
- Author and manage multidimensional component variants and published component libraries, including revision previews, linked-instance updates, stable library identities, offline catalogs, storage-backed catalogs, and read-only library definitions. (#239)
|
||||
- Recover unsaved and pathless documents locally, with settings to disable recovery and remove retained snapshots. (#487, #574)
|
||||
- Inspect selected designs with a configured Vision model and attach images to AI chat with bounded analysis and previews. (#232, #471)
|
||||
- Pin selected layers as explicit AI chat context, show collapsible reasoning, copy individual responses, and grow the composer with multiline prompts. (#13)
|
||||
- Render streaming AI responses with the upstream Comark-based Markdown pipeline and optional Shiki code highlighting without the former project fork.
|
||||
- Author and manage multidimensional component variants and published component libraries, including revision previews, linked-instance updates, stable library identities, offline catalogs, storage-backed catalogs, and read-only library definitions (#239).
|
||||
- Recover unsaved and pathless documents locally, including after closing their tabs, with settings to disable recovery and remove retained snapshots (#487, #505, #574).
|
||||
- Inspect selected designs with a configured Vision model and attach images to AI chat with bounded analysis and previews (#232, #471).
|
||||
- Pin selected layers as explicit AI chat context, show collapsible reasoning, copy individual responses, and grow the composer with multiline prompts (#13).
|
||||
|
||||
### Changed
|
||||
|
||||
- Explore editable component, typography, and paint comparisons in the demo, with the original examples preserved on a reference page.
|
||||
- Use compact desktop Home search actions with consistent responsive layout and control sizing.
|
||||
- Keep applied and available Effect styles concise, and collapse equal independent corner fields when all four use the same variable.
|
||||
- Keep pixel-grid rounding invisible while showing alignment guides only for real geometry, objects, and canvas/layout guides.
|
||||
- Copy selections with embedded images into Figma while preserving typed geometry, text sizing, images, components, variables, modes, and shared styles for lossless in-app paste.
|
||||
- Embed images when copying selections into Figma, and preserve geometry, text sizing, component links, variables, modes, and shared styles when pasting within OpenPencil.
|
||||
- Choose the app theme and whether animations follow the system or stay off under Appearance in General Settings, with live updates and persistent preferences.
|
||||
- Put unbound fill and stroke style pickers in section headers, preserve applied and missing style rows, and remove the redundant Dimensions heading for text layers.
|
||||
- Simplify property panels with fill and stroke style pickers in section headers, concise effect style rows, and collapsed equal corner fields when all four share a variable. Preserve applied and missing styles and remove the redundant Dimensions heading for text layers.
|
||||
- Open variable pickers below their trigger when space permits, flipping above near the viewport edge.
|
||||
- Keep AI chat preferences with the model overview and edit models in a fixed-size Settings pane with explicit Save and Cancel actions.
|
||||
- Match page-list density to the layer tree and add subtle, reduced-motion-aware dialog transitions.
|
||||
- Fade in streaming Markdown list items and code lines without animating completed responses.
|
||||
- Vertically center shaped section titles and allow renaming a section by double-clicking its canvas label.
|
||||
- Load supported online fonts before revealing imported pages, preserve substituted text during editing, and shape canvas labels with bundled Inter typography.
|
||||
- Upgrade CanvasKit to 0.41 and use immutable renderer paths through `PathBuilder`.
|
||||
- Upgrade direct model chat providers and transports to AI SDK 7 while retaining the local ACP execution path.
|
||||
- Localize file, clipboard, collaboration, chat, vectorization, storage, recovery, and component-library notifications in every supported language.
|
||||
- Complete translated app, accessibility, font, color, file, clipboard, collaboration, chat, vectorization, storage, recovery, component-library, and connection feedback across supported locales, and synchronize document language with the selected locale.
|
||||
- Separate local MCP server controls, browser WebMCP access, and remote connections in Settings, with inline searchable tool permissions.
|
||||
- Show translated field errors, hints, and consistent contextual alerts in Settings forms, focus the first invalid field on submission, and explain missing requirements instead of silently disabling Save or Test.
|
||||
- Pan horizontally with Shift+wheel while preserving native horizontal trackpad movement.
|
||||
|
|
@ -66,80 +63,67 @@
|
|||
- Avoid recursive desktop HTTP proxy requests when font downloads intercept Tauri IPC traffic.
|
||||
- Keep FIT image fills proportional, centered, and fully visible without stretching or cropped edges.
|
||||
- Preserve edited instance text, including cleared labels, when saving and reopening `.fig` files.
|
||||
- Honor `.pen` frame layout defaults and sizing and padding shorthands so imported auto-layout frames keep their computed dimensions and child positions. (#564)
|
||||
- Honor `.pen` frame layout defaults and sizing and padding shorthands so imported auto-layout frames keep their computed dimensions and child positions (#564).
|
||||
- Avoid macOS Keychain prompts during credential status checks and pause repeated credential access after failures until explicitly retried from Settings.
|
||||
|
||||
- Honor explicit Design JSX instance dimensions and preserve authored overrides through component synchronization.
|
||||
- Route browser Command/Ctrl plus and minus shortcuts to canvas zoom instead of page zoom.
|
||||
- Resolve `$name` references in imported `.pen` fills, stroke fills, font families, dimensions, and spacing without requiring a `--` prefix. (#563)
|
||||
- Resolve `$name` references in imported `.pen` fills, stroke fills, font families, dimensions, and spacing without requiring a `--` prefix (#563).
|
||||
- Resolve bound fields in each layer’s mode, keep variable edits scoped and undoable, and make broken bindings visible and recoverable.
|
||||
- Display letter spacing in pixels and support explicit automatic line height.
|
||||
- Prevent the stock photo tool from replacing text, lines, structural layers, or containers with content while supporting closed shape geometry.
|
||||
- Preserve explicit text alignment metadata on imported Figma vectors across save and reload.
|
||||
|
||||
- Preserve explicit normal blend modes on imported Figma text and vector nodes across save and reload.
|
||||
|
||||
- Preserve implicit fixed-size text inside imported Figma auto-layout frames across save and reload.
|
||||
- Preserve imported Figma text alignment metadata, explicit normal blend modes on text and vectors, and implicit fixed text sizing in auto-layout frames across save and reload.
|
||||
- Normalize imported stroke dash patterns for more reliable `.fig` compatibility.
|
||||
- Stop showing a misleading desktop-only warning when web font loading or catalog lookup fails.
|
||||
- Preserve source text offsets when resolving fallback languages after text-case transformations.
|
||||
- Track character coverage restored from downloaded font cache entries.
|
||||
|
||||
- Resolve fallback fonts reliably for cached characters, mixed-language text, and text-case transformations.
|
||||
- Preserve imported Figma divider-line geometry during auto-layout recomputation, preventing half-pixel shifts on save and reload.
|
||||
|
||||
- Resolve package imports under Node and Bun from ordinary tarballs while preserving Bun source-first workspace execution. (#663)
|
||||
- Resolve package imports under Node and Bun from ordinary tarballs while preserving Bun source-first workspace execution (#663).
|
||||
- Use the user's home directory as the default MCP file root on Windows, avoiding the caller's unreliable working directory.
|
||||
- Open legacy raw `.fig` files that store the Kiwi document and thumbnail without a ZIP wrapper. (#582)
|
||||
- Preserve a frame's auto-layout HUG sizing mode when converting it into a component with `create_component`.
|
||||
- Run `openpencil import` on Node so npm-installed CLI users no longer encounter `Bun is not defined`. (#575)
|
||||
- Open legacy raw `.fig` files that store the Kiwi document and thumbnail without a ZIP wrapper (#582).
|
||||
- Preserve a frame's auto-layout HUG sizing, variable bindings, and variable modes when converting it into a component through the Figma API or automation (#595).
|
||||
- Run `openpencil import` on Node so npm-installed CLI users no longer encounter `Bun is not defined` (#575).
|
||||
- Generate recent-file previews from the conventional `Cover` page without modifying the source file.
|
||||
- Isolate browser-development MCP servers behind worktree-aware Portless WebSocket routes and per-runtime socket/discovery paths, preventing concurrent worktrees from competing for port 7600 or the global MCP socket.
|
||||
- Resolve Vue SDK semantic test selectors correctly in non-browser runtimes. (#397)
|
||||
- Commit vector vertex and Bézier-handle edits when the pointer is released and keep transformed vector-edit overlays aligned. (#586)
|
||||
- Preserve app-created component properties and instance-swap targets across `.fig` save and reload cycles. (#548)
|
||||
|
||||
- Reconnect desktop automation to an already-running MCP server through its discovery file. (#546)
|
||||
- Keep text-editing carets, hit testing, and selection highlights aligned with vertically centered or bottom-aligned text. (#539)
|
||||
- Match AI chat code-block colors and backgrounds to the active theme, and let desktop users select and copy chat text without replacing it with canvas layers. (#537, #538)
|
||||
- Resolve Vue SDK semantic test selectors correctly in non-browser runtimes (#397).
|
||||
- Commit vector vertex and Bézier-handle edits when the pointer is released and keep transformed vector-edit overlays aligned (#586).
|
||||
- Preserve app-created component properties and instance-swap targets across `.fig` save and reload cycles (#548).
|
||||
- Reconnect desktop automation to an already-running MCP server through its discovery file (#546).
|
||||
- Keep text-editing carets, hit testing, and selection highlights aligned with vertically centered or bottom-aligned text (#539).
|
||||
- Match AI chat code-block colors and backgrounds to the active theme, and let desktop users select and copy chat text without replacing it with canvas layers (#537, #538).
|
||||
- Restore visible above, below, and child drop feedback while dragging layers in the Layers panel.
|
||||
- Place editor-created instances beside nested source components in world space, including transformed parents.
|
||||
- Prevent malformed collaboration updates from corrupting synchronized nodes or derived text rendering.
|
||||
- Transfer native `.fig` exports over binary Tauri IPC, preventing large desktop saves from being truncated or exhausting WebView memory. (#484)
|
||||
- Keep unsaved source-less documents recoverable after their editor tab is closed.
|
||||
- Decode zstd-compressed FIG containers, reject invalid compressed payloads, and preserve exact fixture byte ranges. (#397)
|
||||
- Compose caller CSS with Tailwind defaults when importing DOM/CSS documents. (#397)
|
||||
- Preserve desktop HTTP timeout, abort, and empty-response semantics. (#397)
|
||||
- Report whether missing Figma clipboard images were actually fetched. (#397)
|
||||
- Report exhausted provider credit, request failures, and output-token limits through localized chat toasts and copied diagnostics. (#451, #454)
|
||||
- Transfer native `.fig` exports over binary Tauri IPC, preventing large desktop saves from being truncated or exhausting WebView memory (#484).
|
||||
- Decode zstd-compressed FIG containers and reject invalid compressed payloads (#397).
|
||||
- Compose caller CSS with Tailwind defaults when importing DOM/CSS documents (#397).
|
||||
- Preserve desktop HTTP timeout, abort, and empty-response semantics (#397).
|
||||
- Report whether missing Figma clipboard images were actually fetched (#397).
|
||||
- Report exhausted provider credit, request failures, and output-token limits through localized chat toasts and copied diagnostics (#451, #454).
|
||||
- Prevent Windows desktop crashes when loading large system fonts for non-Latin text.
|
||||
- Preserve open vector segments when the same vector network also contains filled regions. (#450)
|
||||
- Match Figma Plugin API behavior for `rescale()`, page `backgrounds`, and nullable visual `absoluteRenderBounds`. (#442)
|
||||
- Keep imported Figma instances linked to their remapped source components so later component edits update existing instances. (#385)
|
||||
- Preserve open vector segments when the same vector network also contains filled regions (#450).
|
||||
- Match Figma Plugin API behavior for `rescale()`, page `backgrounds`, and nullable visual `absoluteRenderBounds` (#442).
|
||||
- Keep imported and pasted Figma instances linked to their remapped source components so later component edits update existing instances (#385).
|
||||
- Restore native copy, cut, and paste shortcuts in desktop text inputs while preserving design clipboard handling on the canvas.
|
||||
- Preserve selected layers when browser clipboard serialization fails during cut operations, and fall back to the session clipboard when system clipboard access is unavailable. (#568)
|
||||
- Treat MCP tool results with an omitted `isError` field as successful while preserving explicit MCP errors. (#583)
|
||||
- Remove the permanent CORS configuration action from cloud-storage settings and report connection results through standard toasts with clear browser-specific guidance.
|
||||
- Complete translated app, accessibility, font, color, collaboration, import, connection-test, and browser fallback text across all supported locales, and synchronize document language with the selected locale.
|
||||
- Preserve effective nested instance text overrides when importing complex Figma component hierarchies. (#102)
|
||||
- Preserve committed desktop text input when the WebView supplies text through the input event before updating the hidden text field (#607).
|
||||
- Preserve selected layers when browser clipboard serialization fails during cut operations, and fall back to the session clipboard when system clipboard access is unavailable (#568).
|
||||
- Treat MCP tool results with an omitted `isError` field as successful while preserving explicit MCP errors (#583).
|
||||
- Preserve effective nested instance text overrides when importing complex Figma component hierarchies (#102).
|
||||
- Preserve SVG clip paths, including clip shapes referenced through `<use>`, when importing editable vectors.
|
||||
- Preserve circles, ellipses, rectangles, lines, polylines, and polygons supplied as JSX children of inline SVG elements. (#452)
|
||||
- Preserve component links when pasting Figma instances so later component edits continue to update them.
|
||||
- Stop local MCP servers after the app disconnects instead of leaving orphaned background processes. (#494)
|
||||
- Preserve circles, ellipses, rectangles, lines, polylines, and polygons supplied as JSX children of inline SVG elements (#452).
|
||||
- Stop local MCP servers after the app disconnects instead of leaving orphaned background processes (#494).
|
||||
- Prevent unbounded instance duplication when editing Figma-imported or pasted components with serialized or renamed children, keep extra instance children in their intended order, and avoid pasted instances re-linking pre-existing instances during clipboard import.
|
||||
|
||||
- Prevent unbounded instance duplication when editing Figma-imported or pasted components with serialized or renamed children, keep extra instance children stable instead of yanking them to the front, and avoid pasted instances re-linking pre-existing instances during clipboard import.
|
||||
### Performance
|
||||
|
||||
- Scope automation and Figma API layout reconciliation to graph nodes and parent containers actually changed by each mutation.
|
||||
- Reduce unnecessary layout work after automation and Figma API edits by updating only affected layers and containers.
|
||||
- Keep rapid trackpad zoom reversals and effect-heavy document navigation responsive by cancelling obsolete reconstruction and reusing safe raster snapshots.
|
||||
- Show the FIG page list from a lightweight Kiwi scan before materializing the full document.
|
||||
- Avoid redundant collaboration writes when synchronized node fields have not changed.
|
||||
- Release obsolete streamed Markdown parser history after each AI response completes, preventing chat memory from multiplying with every streamed chunk. (#544)
|
||||
- Open large documents faster by using cached world positions while finding layers under the pointer. (#527)
|
||||
- Coalesce writable-document autosaves that overlap an active `.fig` export while preserving a trailing save for newer edits. (#528)
|
||||
- Defer JSX generation and syntax highlighting until the Code panel is active, keeping large canvas selections responsive. (#500)
|
||||
- Index Figma clipboard children once during import instead of rescanning every pasted node, keeping large flat pastes linear. (#500)
|
||||
- Release completed streaming-response state to reduce retained chat memory (#544).
|
||||
- Open large documents faster by reducing repeated position calculations when finding layers under the pointer (#527).
|
||||
- Avoid redundant autosaves while a `.fig` export is in progress, while ensuring newer edits are saved afterward (#528).
|
||||
- Defer JSX generation and syntax highlighting until the Code panel is active, keeping large canvas selections responsive (#500).
|
||||
- Paste large, flat Figma selections faster by avoiding repeated scans of clipboard layers (#500).
|
||||
- Reduce peak memory during `.fig` export by sharing immutable binary resources with the isolated export graph.
|
||||
|
||||
|
||||
## 0.14.0 — 2026-08-10
|
||||
|
||||
### Breaking changes
|
||||
|
|
|
|||
Loading…
Reference in a new issue