NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4660 most downloaded on pub.dev
A full-stack terminal toolkit for Dart featuring Lip Gloss styling, Bubble Tea TUI architecture, and Ultraviolet rendering.
Last release 24 days ago
14 Sep 2026
Release timing varies
gaps range from 9 days to 4 months
Nearly every release is documented
notes for 10 of 10 stable releases
Nothing withdrawn
no release was ever pulled
9 months old
16 releases · first in 2025
One column per month.
Require Dart SDK 3.13.0 or newer.
ProgramDiagnosticsOptions.keyboardNavigation opt-in for panel navigation.TreeModel, TreeItem, and projectedTreeRow Bubble primitives with stable-ID expansion/selection state,H/L and shifted-arrowAdded shared command-palette items, scored matches, deterministic matching, viewport windows, stable item IDs/payloads, editor command state, and a sc
CommandPaletteOverlay +CommandPaletteComponent). Widget and string-view hosts now share onetext_language.dart (EditorLanguageAdapter +EditorLanguageRegistry) and syntax_tree.dart (EditorSyntaxNode /EditorSyntaxTree / SyntaxTreeProvider DTOs) so Tree-sitter, LSP, orcode_extensions.dart as the opt-in home for builtin languageeditor_core.dart barrel now exports only thecodeShouldIncreaseIndentForAdapter alongside the legacytext_placeholders.dart), prompt normalization + external-editorprompt_content.dart), and IDE selection ingestioneditor_selection.dart), with a prompt-composer TUI example wiring allTextAreaModel + Cmd.openEditor + placeholders +stty -ixon, state saved/restored)Ctrl+S/Ctrl+Q reach TUIpgup/pgdown key-binding aliases and prevented unmodifieddart:io/dart:ffi, no builtintext_brackets.dart), regex find/replace with sessionstext_search.dart), multi-selection sets (text_selection_set.dart),workspace_edits.dart), snippetstext_snippets.dart), and indent foldingtext_folding.dart).AsyncSyntaxTreeSession for optional native or isolate-basedtree_sitter_language_pack example package demonstratingTextAreaModel without adding FFI to editor core.TextAreaModel with command dispatch, undo/redo, dirty revisions,EditorRangeResolver, mapSelectionRanges, and mapSelectionEnds soTextView skip folded lines without stranding cursors in hidden bodies.MemoryEditorDocumentStore plus a file-backed example store foradvanced-editor example with findtext_inline_elements.dart)media_attachments.dart: previewmedia_paths.dart, via package:path), acursorOffset getter on TextAreaModel for overlay hit-testing, and amedia-composer example wiring the chip → cursor preview →package:mime).renderModal + ModalChrome, with boxPanelComponent and splicing viacutAnsiByCells slicer) and exported the image rendererImageProtocol, detectImageProtocol, renderImageToAnsi) from themedia-composer viewer paints halfblock pixelsctrl+p) and esc/q viewer close.FrameView, FrameArea, and FrameRenderable for immediate-mode TEAFrameLayout splitting with fixed,FrameArea.inset and FrameArea.centered geometry helpers for paneString, View, orFrameView, including positioned layout and styling guidance.Program and both supported coreKeyBinding, recent messages,charting.dart, git_diff.dart, layout.dart,markdown.dart, runtime.dart, scoring.dart, and text_editing.dartCodeLanguageProfile nowEditorLanguageAdapter, and the colon-indent rule lives on thecode_edit_policy.dart.resolveCodeLanguageProfile keeps its signature as a registry-backed shim.editing.dart / viewing.dart barrels into core-only exports;package:artisanal/editor_core.dart and package:artisanal/artisanal.dartcode_extensions.dart for backwards compatibility.Console and Console.components now use the same capability,FrameLayout facade with Ultraviolet rectangles, fixed andbin, lib, and test areruntime.dart entrypoint for reusable anddart:io platforms.runBrowserProgram(Model) and the sharedTerminalHostServer.clear: true replacesConsole.spin now honors custom completion messages, and generated spinnerclearOnDone is enabled.InlineAnimation.renderConfig constructor parameterStyle and kept a standaloneTextStyle.decorationStyle from enabling an otherwise unspecified underline.TextStyle underline and line-through decorations continuous acrossStyle's explicit whitespace controls.Layout.wrap() continuationchalkdart dependency, unreachable web bootstrap code,artisanal_widgets, including the widget runnerwidgets.dart / testing.dart re-export entrypoints. Widgetpackage:artisanal_widgets.RenderMetrics.isIdle for diagnostic displays without changing theclipAnsiByCells for exact-column overlay composition. Partial wideraster.dart software UV renderer. It acceptsglyf fonts and produces package:image pixels;UvPaintPolicy, shared by native raster, web canvas, and FluttersetCellOwned consumes its input on every path, including rejected orAdded immutable, value-equal TextStyle declarations with Flutter-shaped FontWeight, FontStyle, and TextDecoration values, copyWith(), parent/child mer
TextStyle declarations with Flutter-shaped
FontWeight, FontStyle, and TextDecoration values, copyWith(),
parent/child merge(), and Style composition through applyTo() and
toStyle().ComponentTheme presets and semantic style bundles for built-in
console prompts and display components, configurable through Console.example/widget_catalog.dart CLI for browsing every
built-in Bubble/display component and rendering preset showcases.widgetCatalogEntries registry and filterWidgetCatalog()
helper for application-owned catalogs, command palettes, and help screens.ScreenMode.fixed and FixedViewport for rendering into an arbitrary
primary-screen rectangle without clearing surrounding terminal content.CanvasLine,
CanvasRectangle, CanvasCircle, and CanvasPoints) backed by the existing
braille chart canvas.uv-effects TUI example showing the low-level
Canvas -> BufferRenderSink -> terminal effects pipeline.Added example/text_style , a runnable catalog covering immutable updates, Style composition, span inheritance and resets, selectable text, decorations
example/text_style, a runnable catalog covering immutable updates,Style composition, span inheritance and resets, selectable text,artisanal; theRenderMetricsInjector custom entries to Artisanal's universalWidgetApp's separate built-in metrics overlay and F12 handler.ProgramDiagnosticsOptions.app.dart and the complete widgets.dart public surfacerunWidgetApp, serveWidgetApp, Transport, and widget-orientedapp.dart entrypoint.Listenable, ValueListenable,ChangeNotifier, ValueNotifier, VoidCallback) to package:listenlisten: ^1.0.1). src/widgets/animation/listenable.dart is now apackage:listen/listen.dart directly. Public API viapackage:artisanal_widgets/widgets.dart keeps the same names.ChangeNotifier semantics with package:listen/Flutter: hasListenersnotifyListeners are @protected (notifyListeners remains@visibleForTesting). Subclasses calling them internally are unaffected;Listenable.onError, and dispose()package:listen (asserts in debug).Unsupported operation: Infinity or NaN toInt)RenderSingleChildViewportscrollbar example bounds its Scrollbar with an explicitscroll example does.Bad state: Cannot fire new event) inRenderMetricsInjector: publishes made from inside dispatch (e.g. theReloadFileWatcher.watch waits for native watcher installation beforeTextStyle decoration colors through text rendering copies.TextStyle presentation across soft-wrapped continuation linesText wrap content before resizing Style bordersoption(), hasOption(), argument(), arguments, and
argumentCount convenience methods to Command (Laravel/Artisan-style).
Instead of raw argResults!['name'], commands can now write
option('name') as String?, argument(0), etc.CommandRunner.detectExecutableName() static method that
auto-detects the binary name from Platform.script. Compiled binaries
show their filename (artisan), while dart run invocations show
dart run path/to/script.dart in usage help.getNamespaces() and allCommandsInNamespace() to CommandRunner
for programmatic namespace inspection (matching Symfony Console's
Application::getNamespaces() and Application::all($namespace)).db where db:migrate, db:seed exist) shows subcommands instead of
a "command not found" error. Exits with code 1, matching Symfony.UsageException output is now rendered
as a styled <error> block (white-on-red in ANSI mode) written to stderr,
matching Laravel Artisan's formatBlock($message, 'error', large: true)._extractAllNamespaces() for extracting parent namespace parts from
nested command names like cache:user:list.example/args/ directory with a comprehensive, self-documented demo
covering all 14 args improvements (namespaces, subcommands, verbosity,
non-interactive mode, shell completion, error blocks, help themes, etc.).CommandRunner.run() now attempts namespace discovery before falling back
to _printUsageError. If the missing command matches a namespace prefix,
subcommands are listed instead._printUsageError() now writes styled error blocks to stderr instead of
plain text to stdout._handleMissingCommandAsNamespace() now exits with code 1 instead of the
default usageExitCode (64), matching Symfony Console behavior._error() method; replaced by _styleErrorBlock() which applies
proper white-on-red <error> styling.args.dart to include a complete
GreetCommand example using the new argument/option helpers.See the README for details.
See the README for details.
NumberInputModel bubble for numeric input prompts with min/max validation and configurable step.SuggestModel bubble for auto-complete suggestion prompts with fuzzy filtering.Console.clearScreen() to clear the terminal screen.Console.setTerminalTitle(String) to set the terminal window title.Console.notify(String) to send a desktop notification.Console.grid(List<List<String>>) to render a formatted grid/table to the console.Console.number(...) interactive prompt for reading a numeric value from the user.Console.suggest(...) interactive prompt for auto-complete suggestion input.Fixed terminal corruption on Ctrl+C by enabling signalHandlers: true and sendInterrupt: true in promptProgramOptions, dataTablePromptOptions, and textareaPromptOptions so SIGINT is caught before killing the process and the terminal is properly restored.
Fixed InterruptMsg handling in all 14 _*PromptModel wrapper models so Ctrl+C during any prompt gracefully restores the terminal.
Fixed _AnticipatePromptModel so an InterruptMsg arriving before init() completes (via _initDone guard) exits cleanly instead of hanging.
Fixed runSpinnerTask to call future.ignore() so a rejected future before the await does not produce an unhandled error.
Added example/tui/remote_plugin_generic_service_host_demo.dart plus a
matching guest plugin demo, showing how to register a custom schema-backed
host.ping generic service and call it from an out-of-process plugin.
Fixed init-time exec restore ordering so the first visible frame is only marked complete after a real paint, preserving the initial restored frame before exec-completion updates run.
Wired the remote_plugin_workspace example through the new remote-surface input router, including click-to-focus behavior and a --snapshot-click= test mode for deterministic example coverage.
Extended the remote_plugin_workspace example to route keyboard input into the focused plugin surface, including a --snapshot-key= path so the example regression can assert focused-plugin key handling deterministically.
Extended the remote_plugin_workspace example to route mouse-motion events into hovered plugin surfaces, including a --snapshot-motion= path so the example regression can assert hover-style remote input deterministically.
Bound the remote_plugin_workspace host example to the remote clipboard service and taught the activity plugin to surface the returned clipboard text on c, so the workspace demo now exercises a real host-owned RPC end to end.
Added generic plugin.service.request / host.service.response protocol messages plus a guest-side RemotePluginGuestServices.call(...) helper, so future host-owned RPCs can share one versioned envelope instead of growing one bespoke message pair per service.
Added RemotePluginGenericHostService plus RemotePluginHostConnection.bindGenericService(...), so hosts can dispatch the new generic service envelope by service + method without hand-writing message loops for each plugin connection.
Added optional request/result schema validation to RemotePluginGenericHostService.register(...), so host-owned generic RPCs can reject malformed JSON payloads before they reach service handlers.
Bound the built-in generic clipboard, URL-open, notification, and file-picker helpers to explicit request/result schemas too, so the shared service path now validates those host-owned capabilities consistently instead of only custom generic handlers.
Added optional request/result schema validation to RemotePluginGuestServices.call(...) too, and taught the built-in guest clipboard/URL-open/notification/file-picker helpers to use it on their generic-service branches, so plugins now validate shared-RPC payloads on both sides of the boundary.
Added optional RemotePluginServiceDescriptor discovery payloads to host.hello and taught the built-in guest service helpers to consult them, so plugins can discover the exact service.method pairs and JSON schemas a host exposes instead of relying on the coarse services capability alone.
Added RemotePluginGenericServiceCatalog plus bindGenericServiceCatalog(...), so hosts can register generic service handlers once, reuse the derived discovery descriptors in host.hello, and then bind the same catalog to a plugin connection without duplicating setup.
Added RemotePluginHostConnection.startProcess(..., genericServices: ...), so hosts can pass one generic service catalog that is automatically advertised in host.hello, bound on connect, and disposed with the connection.
Updated the standalone remote-plugin host demos to use RemotePluginHostConnection.startProcess(...) directly, so the public example path now matches the bundled host-side connection API instead of the older manual process/session/controller wiring.
Added RemotePluginHostConnection.startManifest(...) and updated the manifest-backed workspace example to use it, so manifest-discovered plugin hosts no longer need to resolve entrypoints and working directories by hand.
Added direct host-connection coverage for RemotePluginHostConnection.startManifest(...), including manifest-relative entrypoint resolution plus auto-bound generic service startup.
Unified the built-in generic clipboard, URL, notification, and file-picker registrations behind one shared implementation path, so service catalogs, bound generic host services, and descriptor generation stay in sync.
Added loadRemotePluginManifest(...) and RemotePluginHostConnection.startManifestFile(...), so hosts can validate and launch one manifest-backed plugin file directly without first loading a full manifest directory.
Added a remote_plugin_schema_dump example and documented the schema-backed remote-plugin startup path, so plugin authors can dump RemotePluginProtocolSchemas, RemotePluginManifestSchemas, and built-in generic service descriptors without reading the source tree.
Added registerBuiltIns(...) to the generic remote-plugin service catalog and bound generic host service, so hosts can wire the built-in clipboard/URL/notification/file-picker services without repeating four separate registrations.
Added RemotePluginGenericServiceCatalog.builtIns(...), so hosts can construct a ready-to-bind built-in generic service catalog in one expression instead of creating an empty catalog first.
Updated the remote_plugin_workspace host and host-connection coverage to reuse one generic service catalog across multiple plugin connections, so the example path now dogfoods the intended register-once/bind-many service model.
Added RemotePluginWorkspace as a reusable manifest-backed multi-plugin host helper, so library users can launch a shared remote-plugin workspace with one call instead of rebuilding manifest loading, connection maps, shared surfaces, router wiring, and focus helpers in app code.
Migrated clipboard onto the generic remote-plugin service path too, so guest clipboard helpers now use plugin.service.request / host.service.response whenever a host advertises services, while the older typed clipboard messages remain available for backward compatibility.
Migrated URL-opening onto the generic remote-plugin service path too, so guest URL helpers now use plugin.service.request / host.service.response whenever a host advertises services, while the older typed URL-open messages remain available for backward compatibility.
Migrated notifications onto the generic remote-plugin service path too, so guest notification helpers now use plugin.service.request / host.service.response whenever a host advertises services, while the older typed notification messages remain available for backward compatibility.
Migrated file-picker requests onto the generic remote-plugin service path too, so guest picker helpers now use plugin.service.request / host.service.response whenever a host advertises services, while the older typed file-picker messages remain available for backward compatibility.
Updated the remote_plugin_workspace example host to advertise services and bind its clipboard capability through the generic host-service registry, so the flagship multi-plugin demo now dogfoods the shared RPC path too.
Extended the remote_plugin_workspace activity plugin to call the host URL-open and notification services too, so the flagship multi-plugin demo now visibly exercises three shared host-owned RPCs instead of only clipboard.
Extended the remote_plugin_workspace activity plugin to call the host file-picker service too, so the flagship multi-plugin demo now visibly exercises all four built-in shared host-owned RPCs.
Added RemotePluginSurfaceInputRouter so hosts can turn resolved remote surface placements into focus, blur, mouse, and key routing without rebuilding per-surface dispatch logic by hand.
Added RemotePluginSurfaceInputRouter.sendTuiMouse(...) so host apps can forward runtime MouseMsg events into remote plugin surfaces without rewriting button/action translation by hand.
Added resolved placement and hit-test helpers for remote plugin surfaces, so hosts can map global coordinates into the topmost plugin panel or popup using the same placement logic as UV composition.
Added manifest-backed remote plugin discovery helpers plus workspace example manifests, so hosts can validate and load plugin process specs from *.plugin.json files instead of hardcoding entrypoints in app code.
Added typed remote plugin file-picker request/response messages plus reusable host and guest helpers, so plugins can ask hosts to select files or directories without inventing custom service glue.
Added RemotePluginGuestServices so guest plugins can call clipboard, URL-open, and notification host services with awaitable helpers instead of hand-rolling request ids and response matching.
Added typed remote plugin notification request/response messages plus a reusable host-side notification responder, so plugins can ask hosts to surface success/info/warning/error notices without inventing custom protocol messages.
Added typed remote plugin URL-open request/response messages plus a reusable host-side URL opener, so plugins can start delegating external link launches back to the host without custom transport glue.
Added typed remote plugin clipboard request/response messages plus a reusable host-side clipboard responder, so out-of-process plugins can start using host-owned services without inventing ad hoc JSON on top of the surface transport.
Added a remote_plugin_workspace example directory with a full host app plus multiple guest plugins, including a snapshot mode for regression testing and local experimentation.
Added RemotePluginHostConnection.startProcess(...) so plugin hosts can launch a process, complete the handshake, and bind surface state through one host-side entrypoint instead of manually wiring process, session, and controller objects.
Added a popup-oriented remote plugin host/guest example pair that exercises anchored child surfaces and UV composition on top of the new remote plugin controller and layer builder.
Added buildRemotePluginSurfaceLayers(...) plus RemotePluginSurfacePlacement so hosts can turn stored remote plugin surfaces into positioned UV layers and compose anchored child surfaces without rebuilding placement logic by hand.
Added RemotePluginSurfaceDrawable so remote plugin surface state can be rendered directly through the existing UV Drawable/Canvas stack instead of requiring hosts to reimplement cell translation by hand.
Added RemotePluginSurfaceController so plugin hosts can bind a RemotePluginSession directly to host-side surface state updates instead of wiring lifecycle and frame routing by hand.
Added a runnable remote-surface host/guest example pair that launches a plugin process, completes the hello handshake, applies plugin frames into host surface state, and prints the resulting rendered panel.
Added RemotePluginGuestSession plus a stdio binding helper so plugin processes can complete the host/plugin hello handshake and speak the remote-surface protocol without rebuilding channel setup by hand.
Added RemotePluginSurfaceStore so hosts can apply remote-surface open/resize/frame/close messages into concrete per-surface cell state before later compositing.
Added RemotePluginSession and pre-listener channel buffering so host/plugin hello handshakes can complete reliably even when plugins emit plugin.hello immediately on startup.
Added stable package:artisanal/plugins.dart with a typed remote-surface plugin protocol, JSON schema definitions, and message validation helpers for future out-of-process plugin hosts.
Added newline-delimited JSON transport helpers for the remote-surface plugin protocol so plugin hosts can speak the wire format over stdio or sockets without rebuilding framing logic.
Added RemotePluginJsonChannel so plugin hosts can bind typed remote-surface messages directly to line or byte streams instead of managing framing and validation manually.
Added RemotePluginProcess.start(...) so plugin hosts can launch stdio-based plugin executables and interact with them as typed remote-surface message streams.
Added withoutStartupTitle(), withoutStartupProbeOverride(), withoutInput(), withoutOutput(), withoutCancelSignal(), and withoutMovementCapsOverride() helpers so ProgramOptions can clear nullable overrides without rebuilding options manually.
Added ColorPaletteMsg and Cmd.requestColorPalette() so OSC 4 palette replies are exposed through the TUI runtime instead of staying UV-internal.
Added CursorPositionMsg and Cmd.requestCursorPositionReport() so cursor-position reports are exposed through the TUI runtime instead of staying UV-internal.
Added Cmd.requestPrimaryDeviceAttributesReport() so DA1 capability queries have an explicit TUI command helper instead of requiring raw escape writes.
Added Cmd.requestKeyboardEnhancementsReport() so kitty keyboard support queries have an explicit TUI command helper instead of requiring raw escape writes.
Added Cmd.requestSecondaryDeviceAttributesReport() so DA2 capability queries have an explicit TUI command helper instead of requiring raw escape writes.
Added Cmd.requestTertiaryDeviceAttributesReport() so DA3 capability queries have an explicit TUI command helper instead of requiring raw escape writes.
Added Cmd.requestTerminalVersionReport() and Cmd.requestTermcapStrings() so XTVERSION and XTGETTCAP queries have explicit TUI command helpers instead of requiring raw escape writes.
Added Cmd.requestColorSchemeReport() so terminal light/dark scheme queries have an explicit TUI command helper instead of requiring raw escape writes.
Added Cmd.requestModifyOtherKeysReport() so xterm ModifyOtherKeys status queries have an explicit TUI command helper instead of requiring raw escape writes.
Added ModifyOtherKeysMsg plus device-attribute report messages so UV capability/startup reports no longer fall back to raw UV events in the TUI runtime.
Added ModeReportMsg, ColorSchemeMsg, and Cmd.requestModeReport() so UV mode-status replies and light/dark color-scheme reports are exposed through the TUI runtime instead of falling back to raw UV events.
Added WindowPixelSizeMsg, CellSizeMsg, and matching Cmd request helpers so UV pixel-size and cell-size reports are exposed through the TUI runtime instead of staying UV-internal.
Added ProgramOptions.startupProbes / withStartupProbes(...) so custom terminals can explicitly opt into or out of UV startup probing.
Added ProgramOptions.sendSuspendSignal / withoutSuspendSignal() so SuspendMsg can exercise the full terminal release/restore lifecycle without sending SIGTSTP.
Added stable package:artisanal/runtime.dart and package:artisanal/hosts.dart entrypoints for the focused TEA runtime and host/backend surfaces.
Added stable package:artisanal/app.dart, package:artisanal/editors.dart, package:artisanal/selection.dart, and package:artisanal/testing.dart re-exports for the supported widget modules.
Added blendColor() to the public style blending helpers so callers can interpolate a single color pair without building a gradient first.
Added adaptive light-theme defaults to the built-in browser host page and made it emit live color-scheme reports when the browser theme changes while the hosted session is still using the page defaults.
Made the built-in browser host page retint its toolbar and status badges from the hosted terminal theme, so browser-backed sessions no longer keep dark page chrome after a light-theme switch.
Made the built-in browser host page switch its default ANSI palette with the hosted light/dark theme too, so OSC 4 queries and palette resets stay consistent with browser-backed theme changes until the session overrides them.
Preloaded light/dark CSS variables for the built-in browser host page so browser-backed sessions paint with the correct page theme before the host script finishes applying runtime state.
plugin.surface.* wire family so the protocol matches the current model where plugins announce the surfaces they want hosts to render.package:artisanal/... widget entrypoints are documented as umbrella convenience re-exports, while artisanal_widgets remains the primary widget package for widget-first apps.ProgramOptions.mouse and mouseMode docs so passive hover behavior explicitly points callers to MouseMode.allMotion instead of the mouse: true cell-motion default.Program.kill() abort active startup probes immediately, so kill behaves like quit/backend shutdown during pre-render and emoji probing.Program temporarily releases the terminal for exec/suspend, then reapplied deferred titles and inline alt-screen/mode state on restore.Program temporarily releases the terminal for exec/suspend, then resumed them cleanly on restore so background timers do not run against a released terminal.startupTitle when restoring the terminal after exec/suspend when no view-scoped title override is active.package:artisanal/widgets.dart now re-exports the stabilized package:artisanal_widgets/widgets.dart surface instead of the broader experimental compatibility entrypoint.Program treat view-scoped terminal metadata declaratively, resetting colors, progress bars, focus reporting, bracketed paste, mouse mode, and kitty keyboard enhancements when later frames stop requesting them.Program reset view-scoped window titles and cursor styling declaratively, falling back to startupTitle when later frames drop a title override and restoring the default cursor shape when cursor metadata clears.package:artisanal/runtime.dart surface instead of the broader compatibility barrel.package:artisanal/runtime.dart surface instead of the broader compatibility barrel.MouseMode.allMotion so passive hover and free pointer motion work without a button press.RemotePluginSurfaceController traffic until the first host listener attaches, so startup clipboard/URL/notification/file-picker requests are not dropped before host service binders subscribe.messages just after connect(...).ProgramOptions.withoutFilter() so it preserves mouseMode instead of silently resetting it to MouseMode.none.RGB and TN, so browser-backed sessions can participate in termcap-style capability discovery without requiring custom page glue.Cmd.requestModeReport(1004/2004) can complete against hosted browser sessions.window.resize.OSC 4 ; index ; ? palette queries and track palette mutations/resets, so browser-backed sessions can participate in palette reporting too.SuspendMsg as a critical startup-probe lifecycle message so suspend aborts pre-render and emoji probes immediately instead of waiting on their timeouts.ExecProcessMsg as a critical startup-probe lifecycle message so exec release aborts active startup probes immediately instead of waiting on their timeouts.Program message path.Program resize dispatch so passive backend/SIGWINCH resize notifications are deduplicated while explicit Cmd.windowSize() requests still flow through filters and interceptors.Program resize dispatch so repeated passive UV window-size reports are deduplicated before reaching the model.Program coverage for passive resize bursts so distinct backend and UV window-size updates still flow while duplicate sizes collapse.Program coverage for focus and bracketed-paste delivery across both the UV decoder path and the legacy key parser path.Program coverage for live mouse press, wheel, and View.onMouse command delivery across both parser paths.Program coverage for UV mouse motion delivery plus parser-driven standard and in-band resize reports.init() commands such as Cmd.tick(...) so they no longer block the first render.Program emits the current terminal size when dimensions changed while the terminal was released, even if no resize signal or backend resize event arrived during that window.startupTitle first.supportsAnsi: false and isTerminal: false backends instead of writing DA/color/cursor queries directly through the terminal object.Program and UV-to-TUI adapter coverage for mode-status replies and light/dark color-scheme reports.Program and UV-to-TUI adapter coverage for ModifyOtherKeys and primary/secondary/tertiary device-attribute reports.Program and UV-to-TUI adapter coverage for cursor-position reports.Program coverage for terminal-version and XTGETTCAP capability reports.Program coverage for kitty keyboard enhancement reports.Program coverage for secondary device-attribute reports.Program coverage for tertiary device-attribute reports.Program coverage for clipboard read replies.Program coverage for startup ColorProfileMsg delivery.Program startup coverage for UV DA2 and kitty keyboard capability replies.Program coverage for init-triggered suspend and exec lifecycles across both fullscreen renderer backends.Program coverage for view-scoped alt-screen restoration across exec and suspend lifecycles.Program suspend lifecycle coverage for identical view-scoped metadata reapplication, including colors, cursor styling, progress bars, and input modes.Program suspend lifecycle coverage for explicit show/hide cursor overrides so release/restore keeps command-driven cursor visibility stable.supportsAnsi: false hosts so socket/embedded clients that disable ANSI output do not receive DA, OSC color, clipboard, or window-report probes.SocketTerminalHostServer.close(force: true) wait for in-flight session cleanup after tearing down active client sockets, matching the browser host lifecycle contract.SuspendMsg terminal release so fullscreen suspend/restore no longer double-exits alt screen, and added direct suspend lifecycle coverage for metadata, fullscreen state, and startup-title restore.SuspendMsg restore so immediate resume commands such as Cmd.quit() are drained before the forced repaint, avoiding stale post-resume frames when the model exits during resume handling.ExecProcess restore so immediate completion messages such as QuitMsg are drained before the forced repaint, avoiding stale post-exec frames when the model exits during completion handling.ExecProcess/SuspendMsg do not force a second post-restore repaint when immediate queued messages already rendered the first restored frame.New charting module (package:artisanal/charting.dart) with sparkline, histogram, heatmap, line, pie/donut, and ribbon renderers.
package:artisanal/charting.dart) with sparkline, histogram, heatmap, line, pie/donut, and ribbon renderers.<red>...</red>).artisanal_widgets; package:artisanal/widgets.dart now re-exports the widgets package.ultraviolet package.artisanal_widgets package; consumers should include artisanal_widgets in dependency resolution for hosted usage.- documentation + assets
Fixed: CI deadlocks when reading stdin multiple times by introducing SharedInputStream.
stdin multiple times by introducing SharedInputStream.startupProbes against disableRenderer configuration.Require Dart SDK 3.13.0 or newer.
PseudoTerminal.start(ackProcessed: true) is used.TerminalView so control input is delivered only toCtrl+C and Ctrl+Z reach foreground processes.PseudoTerminalView.width and height overrides for nestedAdded a transport-independent VirtualTerminal screen model with incremental ANSI/CSI parsing, cursor movement, erasure, scrolling, resizing, SGR styli
VirtualTerminal screen model withTerminalInputEncoder for translating Artisanal key events intopackage:artisanal_pty/artisanal_pty.dart entrypoint forpackage:artisanal_pty/widgets.dart entrypoint with TerminalViewpty2-backed PseudoTerminalView for artisanal_widgetspty2.PseudoTerminalView.quitOnExit.PseudoTerminalView switchespackage:image, with explicit TrueType font faces and fidelity diagnostics.gallery command with an HTML index, render manifest,captureWidget supports WidgetCaptureMode.renderedFrame, andcaptureProgramFrame requires a recorded nativeFrame instead of treatingInternal version bump to align with ORMed release.
Synchronized release with ormed_cli rebranding.
- Synchronized release.
Improved: Aligned with core ormed releases for advanced ORM features.
- export args classes
- Initial release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →