{"id":52152785,"url":"https://github.com/simon-he95/vue-tui","last_synced_at":"2026-08-07T13:01:16.784Z","repository":{"id":354888044,"uuid":"1225763136","full_name":"Simon-He95/vue-tui","owner":"Simon-He95","description":"Vue 3 terminal UI toolkit for browser DOM and CLI stdout: components, ANSI rendering, markdown transcripts, log views, and agent consoles.","archived":false,"fork":false,"pushed_at":"2026-08-07T08:49:49.000Z","size":17970,"stargazers_count":215,"open_issues_count":11,"forks_count":9,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-08-07T09:25:27.445Z","etag":null,"topics":["agent-console","ansi","cli-ui","dom-renderer","log-viewer","markdown","stdout-renderer","terminal","terminal-components","terminal-ui","tui","ui","virtual-list","vue","vue-terminal","vue-tui","vue3"],"latest_commit_sha":null,"homepage":"https://vue-tui.pages.dev/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Simon-He95.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null,"disclosure":null}},"created_at":"2026-04-30T16:01:22.000Z","updated_at":"2026-08-07T08:51:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"1f4bc599-df07-4e29-a569-5e4830fd091f","html_url":"https://github.com/Simon-He95/vue-tui","commit_stats":null,"previous_names":["simon-he95/vue-tui"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Simon-He95/vue-tui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Simon-He95%2Fvue-tui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Simon-He95%2Fvue-tui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Simon-He95%2Fvue-tui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Simon-He95%2Fvue-tui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Simon-He95","download_url":"https://codeload.github.com/Simon-He95/vue-tui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Simon-He95%2Fvue-tui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36377148,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-07T02:00:06.708Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-console","ansi","cli-ui","dom-renderer","log-viewer","markdown","stdout-renderer","terminal","terminal-components","terminal-ui","tui","ui","virtual-list","vue","vue-terminal","vue-tui","vue3"],"created_at":"2026-08-07T13:01:15.896Z","updated_at":"2026-08-07T13:01:16.777Z","avatar_url":"https://github.com/Simon-He95.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"./docs/public/brand/vue-tui-logo-on-dark.svg\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"./docs/public/brand/vue-tui-logo-on-light.svg\"\u003e\n    \u003cimg alt=\"Vue TUI\" src=\"./docs/public/brand/vue-tui-logo-on-light.svg\" width=\"360\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n# @simon_he/vue-tui\n\n[![npm version](https://img.shields.io/npm/v/@simon_he/vue-tui?style=flat-square)](https://www.npmjs.com/package/@simon_he/vue-tui)\n[![npm downloads](https://img.shields.io/npm/dm/@simon_he/vue-tui?style=flat-square)](https://www.npmjs.com/package/@simon_he/vue-tui)\n[![CI](https://github.com/Simon-He95/vue-tui/actions/workflows/ci.yml/badge.svg)](https://github.com/Simon-He95/vue-tui/actions/workflows/ci.yml)\n[![Runtime compatibility](https://github.com/Simon-He95/vue-tui/actions/workflows/runtime-compat.yml/badge.svg)](https://github.com/Simon-He95/vue-tui/actions/workflows/runtime-compat.yml)\n[![Security](https://github.com/Simon-He95/vue-tui/actions/workflows/security.yml/badge.svg)](https://github.com/Simon-He95/vue-tui/actions/workflows/security.yml)\n![TypeScript types](https://img.shields.io/npm/types/@simon_he/vue-tui?style=flat-square)\n![Node version](https://img.shields.io/node/v/@simon_he/vue-tui?style=flat-square)\n[![MIT License](https://img.shields.io/github/license/Simon-He95/vue-tui?style=flat-square)](./license)\n\n[Docs](https://vue-tui.pages.dev/) | [npm](https://www.npmjs.com/package/@simon_he/vue-tui) | [GitHub](https://github.com/Simon-He95/vue-tui) | [Issues](https://github.com/Simon-He95/vue-tui/issues)\n\nVue TUI is a Vue 3 terminal UI toolkit for building terminal-style interfaces that render to browser DOM, real CLI stdout, and headless tests.\n\nUse it to build browser terminal dashboards, Vue-powered CLI apps, streaming markdown transcripts, log viewers, virtual lists, and AI agent consoles with one shared component model.\n\n## Why Vue TUI?\n\n- **Vue component model for terminal UIs**: build with `TerminalProvider`, `TBox`, `TInput`, `TList`, `TTable`, and more.\n- **Browser + CLI renderers**: render the same UI model to browser DOM or real stdout.\n- **High-throughput surfaces**: virtual lists, append-only logs, streaming markdown, and agent transcripts.\n- **Clear host boundaries**: browser-safe root entrypoint, CLI-only APIs under `/cli`, sanitized links, and explicit host permissions.\n\n## Agent UI Showcase\n\nA real agent console built on `@simon_he/vue-tui` can stream agent output, markdown content, tool-call status, and input chrome in one terminal surface.\n\n[![Agent console rendering built with vue-tui](./docs/public/agent-console-rendering-poster.png)](./docs/public/agent-console-rendering.mp4)\n\n[Watch the rendering demo](./docs/public/agent-console-rendering.mp4)\n\n## Install\n\n```bash\npnpm add @simon_he/vue-tui vue\n```\n\nVue is a peer dependency. The current package supports Vue `\u003e=3.3.0 \u003c4`.\n\n## Runtime Support\n\nThe published package supports Node.js `\u003e=16.17` for CLI/runtime consumers.\n\nDevelopment, release validation, and documentation builds are run on Node.js 20 in CI because the repository toolchain uses modern build/test tooling.\n\n## Entry Points\n\n| Import                                      | Stability    | Use it for                                                                                                                              |\n| ------------------------------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------- |\n| `@simon_he/vue-tui`                         | Public       | Browser-safe terminal core, DOM renderer, stable Vue components, and input host plugin factory                                          |\n| `@simon_he/vue-tui/core`                    | Public       | Terminal core, buffer-facing types, ANSI/theme/path/hyperlink helpers                                                                   |\n| `@simon_he/vue-tui/renderer/dom`            | Public       | DOM renderer factory and renderer capabilities                                                                                          |\n| `@simon_he/vue-tui/vue`                     | Advanced     | Extended Vue components, composables, router helpers, and Vue runtime internals                                                         |\n| `@simon_he/vue-tui/runtime`                 | Advanced     | Runtime wiring, selection helpers, and clipboard abstraction                                                                            |\n| `@simon_he/vue-tui/observability`           | Advanced     | Frame perf store, profiler hooks, and trace helpers                                                                                     |\n| `@simon_he/vue-tui/cli`                     | Public       | Node-only headless Vue app runtime, stdin driver, stdout renderer, path provider, recording, and terminal clipboard helpers             |\n| `@simon_he/vue-tui/markdown`                | Public       | `TMarkdownText`, `TVirtualMarkdown`, markdown parser and layout helpers, streaming markdown block sources                               |\n| `@simon_he/vue-tui/mermaid`                 | Public       | Optional `beautiful-mermaid` bridge: adaptive `TMermaid`（图片 → ANSI → 源码）、`TMermaidText`（ANSI）、`TMermaidImage`（图形协议图片） |\n| `@simon_he/vue-tui/experimental`            | Experimental | `T3DViewport`, `TVideo`, charts, `TVirtualList`, `TTranscriptView`, `TLogView`, TLog companions, and append-only log tooling            |\n| `@simon_he/vue-tui/experimental/video/node` | Experimental | Node-only lazy FFmpeg frame source plus optional yt-dlp resolver for supported video pages                                              |\n| `@simon_he/vue-tui/experimental/3d/bun`     | Experimental | Bun-only raw WGSL/WebGPU Pull renderers, including the vue-tui terminal badge scene                                                     |\n| `@simon_he/vue-tui/agent`                   | Experimental | Agent/console transcript, tool-call header, log, markdown, virtual list, render plane, and overlay component aggregation                |\n| `@simon_he/vue-tui/agent/mermaid`           | Experimental | Agent namespace optional `beautiful-mermaid` bridge: adaptive `TMermaid`、`TMermaidText`、`TMermaidImage`                               |\n\nThe stable surface is terminal core, DOM rendering, CLI runtime, basic Vue components, markdown APIs, and the optional Mermaid bridge. High-throughput log, virtualization, and agent/console aggregation APIs stay under `/experimental` or `/agent` until their public surface settles; keep those imports isolated in application code. Use `/agent/mermaid` when agent code wants the optional Mermaid wrapper without changing the `/agent` main entrypoint.\n\nExperimental chart components are imported from the `/experimental` entrypoint:\n\n```ts\nimport {\n  TCandlestickChart,\n  TContributionGraph,\n  TLineChart,\n  TPieChart,\n} from \"@simon_he/vue-tui/experimental\";\n```\n\n`T3DViewport` is renderer-agnostic and Pull-based. The bundled WGSL renderer is isolated in the Bun-only entrypoint so browser-safe imports do not load native GPU code:\n\n```ts\nimport { T3DViewport } from \"@simon_he/vue-tui/experimental\";\nimport { createTerminalBadge3DRenderer } from \"@simon_he/vue-tui/experimental/3d/bun\";\n\nconst renderer = createTerminalBadge3DRenderer();\n```\n\nInstall the optional `bun-webgpu` peer, then run the complete direction-E terminal badge example with `bun run run:3d:terminal`. Drag to orbit and use a two-finger trackpad gesture or mouse wheel to zoom. CLI hover steering requires `createStdinDriver({ enableMouseMotion: true })`.\n\n#### `experimental/3d/bun` platform requirements\n\n| Requirement                 | Detail                                               |\n| --------------------------- | ---------------------------------------------------- |\n| Runtime                     | **Bun only** — Node.js and browser are not supported |\n| `bun-webgpu` peer           | Must be installed manually: `bun add bun-webgpu`     |\n| macOS x64 / arm64           | ✅ Prebuilt binary available                         |\n| Linux x64                   | ✅ Prebuilt binary available                         |\n| Windows x64                 | ✅ Prebuilt binary available                         |\n| Linux arm64 / musl (Alpine) | ❌ No prebuilt binary — must build from source       |\n\n\u003e `T3DViewport` itself (from `/experimental`) has zero native dependencies and works everywhere. Only `experimental/3d/bun` requires Bun and the optional peer. `bun-webgpu` is an experimental library; see [bun-webgpu](https://github.com/kommander/bun-webgpu) for current status.\n\n#### Terminal graphics protocol requirements\n\n`TVideo` and `T3DViewport` automatically negotiate their output format based on the detected terminal:\n\n| Terminal capability                 | Output quality                                 |\n| ----------------------------------- | ---------------------------------------------- |\n| kitty or iTerm2 protocol            | Pixel-accurate frames (PNG)                    |\n| No graphics protocol (any terminal) | `gray8` ASCII art — functional, lower fidelity |\n\n`TAgentTerminalGraphic` (mermaid diagrams, KaTeX math, images) requires kitty, iTerm2, or sixel to render visually; without a protocol it shows the `fallback` text prop. Always provide a meaningful `fallback` value so non-graphical terminals still convey the content.\n\n\u003e sixel terminals get graphics for `TAgentTerminalGraphic` but ASCII art for `TVideo` / `T3DViewport` — only kitty and iTerm2 support pixel-accurate video and 3D frames. See [docs/platform-contracts.md](./docs/platform-contracts.md) for the full degradation table.\n\nDo not deep import from `@simon_he/vue-tui/dist/...`; only the entry points above are part of the supported package contract.\n\n### Migration: Node Host Adapter Moved To `/cli`\n\nNode-specific input host defaults are no longer exported from the browser-safe root entrypoint.\n\nBefore:\n\n```ts\nimport { createDefaultTInputHostAdapter, defaultTInputHostPlugin } from \"@simon_he/vue-tui\";\n```\n\nAfter:\n\n```ts\nimport { createTInputHostPlugin } from \"@simon_he/vue-tui\";\nimport { createDefaultTInputHostAdapter, defaultTInputHostPlugin } from \"@simon_he/vue-tui/cli\";\n```\n\n### Migration: Root Entry Was Narrowed\n\nThe root entrypoint now keeps only stable browser-safe APIs. Extended Vue components and Vue router/composable helpers move to `@simon_he/vue-tui/vue`.\n\n| Before root import | New import              |\n| ------------------ | ----------------------- |\n| `TAnchor`          | `@simon_he/vue-tui/vue` |\n| `TFlow`            | `@simon_he/vue-tui/vue` |\n| `TInputBox`        | `@simon_he/vue-tui/vue` |\n| `TPathPicker`      | `@simon_he/vue-tui/vue` |\n| `TJsonEditor`      | `@simon_he/vue-tui/vue` |\n| `TRenderPlane`     | `@simon_he/vue-tui/vue` |\n| `TRenderLayer`     | `@simon_he/vue-tui/vue` |\n| `TTransition`      | `@simon_he/vue-tui/vue` |\n| router/composables | `@simon_he/vue-tui/vue` |\n| Node host defaults | `@simon_he/vue-tui/cli` |\n\nBefore:\n\n```ts\nimport { TAnchor, TFlow } from \"@simon_he/vue-tui\";\n```\n\nAfter:\n\n```ts\nimport { TAnchor, TFlow } from \"@simon_he/vue-tui/vue\";\n```\n\n### Hyperlinks\n\nDOM renderer link rendering is opt-in through `domRendererOptions.links`. Once enabled, DOM anchors allow safe absolute and relative targets such as `https:`, `http:`, `mailto:`, `/path`, `./path`, `../path`, `#hash`, and `?q=1`. Link callbacks preserve native browser behavior unless they return `false`.\n\nCLI/stdout rendering uses OSC8 hyperlinks and keeps a stricter boundary: only safe absolute `https:`, `http:`, and `mailto:` hrefs are emitted by default. `file:` links stay opt-in for terminal-specific providers and lower-level `Style.href` writers.\n\n`TLink` is the public component-level link primitive. It renders DOM-safe `Style.href` metadata for absolute `https:` / `http:` / `mailto:` and relative targets, supports focus, click, keyboard activation, and host-controlled attempted opens through `TerminalProvider.linkOpener` or `createTerminalApp({ linkOpener })`. `TLinkifyText` detects safe URLs in plain text and writes the same href metadata without owning activation. Browser `TerminalProvider` defaults to `window.open`; CLI/headless apps must opt in. `TLink` intentionally rejects `file:` URLs; use lower-level `Style.href` writers plus terminal-specific opt-in when exposing file links.\n\n## Browser Usage\n\n```vue\n\u003cscript setup lang=\"ts\"\u003e\nimport { ref } from \"vue\";\nimport { TerminalProvider, TBox, TInput, TLink, TLinkifyText, TText } from \"@simon_he/vue-tui\";\n\nconst input = ref(\"\");\n\u003c/script\u003e\n\n\u003ctemplate\u003e\n  \u003cTerminalProvider :cols=\"80\" :rows=\"24\" :default-style=\"{ fg: 'whiteBright' }\"\u003e\n    \u003cTBox :x=\"0\" :y=\"0\" :w=\"80\" :h=\"24\" border title=\"Demo\" :padding=\"1\"\u003e\n      \u003cTText :x=\"0\" :y=\"0\" :w=\"78\" value=\"Vue TUI is running\" /\u003e\n      \u003cTLink :x=\"0\" :y=\"2\" href=\"https://github.com/Simon-He95/vue-tui\" label=\"Project link\" /\u003e\n      \u003cTLinkifyText :x=\"0\" :y=\"3\" :w=\"78\" value=\"Docs: https://github.com/Simon-He95/vue-tui\" /\u003e\n      \u003cTInput :x=\"0\" :y=\"20\" :w=\"78\" v-model=\"input\" placeholder=\"Type...\" /\u003e\n    \u003c/TBox\u003e\n  \u003c/TerminalProvider\u003e\n\u003c/template\u003e\n```\n\n`TerminalProvider` wires the terminal buffer, DOM renderer, event manager, scheduler, runtime, layout context, and input plugins for browser Vue apps.\n\n## CLI Usage\n\nFor a real terminal, mount a headless Vue app and attach stdout/stdin:\n\n```ts\nimport {\n  createStdinDriver,\n  createStdoutRenderer,\n  createTerminalApp,\n  installTerminalCleanup,\n  type TerminalCleanupHandle,\n} from \"@simon_he/vue-tui/cli\";\nimport App from \"./App.vue\";\n\nconst app = createTerminalApp({\n  cols: process.stdout.columns || 80,\n  rows: process.stdout.rows || 24,\n  component: App as any,\n  defaultStyle: { fg: \"whiteBright\" },\n});\n\napp.mount();\n\nconst renderer = createStdoutRenderer(app.terminal, {\n  output: process.stdout,\n  hideCursor: true,\n  colorMode: \"auto\",\n  allowFileUrls: true,\n});\n\napp.scheduler.flush();\n\nlet driver: ReturnType\u003ctypeof createStdinDriver\u003e | null = null;\nlet terminalCleanup: TerminalCleanupHandle | null = null;\nlet disposed = false;\n\nconst cleanup = () =\u003e {\n  if (disposed) return;\n  disposed = true;\n  terminalCleanup?.uninstall();\n  driver?.dispose();\n  renderer.dispose();\n  app.dispose();\n};\n\nconst exit = () =\u003e {\n  cleanup();\n  process.exit(0);\n};\n\nterminalCleanup = installTerminalCleanup(cleanup, {\n  signalPolicy: \"reraise\",\n  cleanupOnUnhandledRejection: false,\n});\ndriver = createStdinDriver({\n  dispatch(event) {\n    const prevented = app.events.dispatch(event);\n    app.scheduler.flush();\n    return prevented;\n  },\n  enableMouse: true,\n  onExit: exit,\n});\n```\n\nSignal cleanup restores terminal state first. `installTerminalCleanup()` returns a cleanup handle: call `handle.uninstall()` to remove process listeners without disposing the app, or `handle.cleanup()` to run cleanup manually. By default, signal handling uses `signalPolicy: \"reraise\"`: the helper cleans up, removes its own listeners, and re-sends the original signal when no other listener owns that signal. If the host process has other listeners for the same signal, those listeners keep ownership of termination. Set `signalPolicy: \"cleanup-only\"` only when the host explicitly owns termination, or `signalPolicy: \"exit\"` when vue-tui should exit with the conventional signal exit code after cleanup.\n\nUnhandled promise rejections stay host-owned by default. Setting `cleanupOnUnhandledRejection: true` cleans up and rethrows by default. Set `rethrowUnhandledRejection: false` only when the host explicitly wants to suppress the rejection.\n\n## Core Concepts\n\n- `createTerminal({ cols, rows })` owns the cell buffer, cursor, planes, scrollback, and commit events.\n- `createDomRenderer(terminal, container)` renders terminal cells to DOM with row caching and fast paths for plain and styled rows.\n- `createStdoutRenderer(terminal, options)` emits ANSI output for real terminal UIs from `/cli`.\n- `TerminalProvider` is the browser-facing Vue runtime provider.\n- `createTerminalApp()` is the headless runtime for CLI apps and deterministic tests.\n- `TRenderPlane` separates transcript, chrome, input, and overlay surfaces so small updates do not repaint large panes.\n\n## Components\n\n| Area           | Import                                      | Components / APIs                                                                                                                                                                                |\n| -------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| Stable layout  | `@simon_he/vue-tui`                         | `TBox`, `TView`                                                                                                                                                                                  |\n| Stable text    | `@simon_he/vue-tui`                         | `TText`, `TLink`, `TLinkifyText`                                                                                                                                                                 |\n| Stable input   | `@simon_he/vue-tui`                         | `TInput`, `TList`, `TSelect`                                                                                                                                                                     |\n| Stable overlay | `@simon_he/vue-tui`                         | `TDialog`                                                                                                                                                                                        |\n| Vue extended   | `@simon_he/vue-tui/vue`                     | `TAnchor`, `TFlex`, `TFlexItem`, `TFlow`, `TRenderPlane`, `TRenderLayer`, `TTransition`, `TInputBox`, `TPathPicker`, `TJsonEditor`, `TMultilineModal`, `TDebugOverlay`, composables, router APIs |\n| Markdown       | `@simon_he/vue-tui/markdown`                | `TMarkdownText`, `TVirtualMarkdown`                                                                                                                                                              |\n| Mermaid        | `@simon_he/vue-tui/mermaid`                 | `TMermaid`（adaptive，图片→ANSI→源码）、`TMermaidText`、`TMermaidImage`、`beautifulMermaidRenderer`                                                                                              |\n| Experimental   | `@simon_he/vue-tui/experimental`            | `TVideo`, `TContributionGraph`, `TLineChart`, `TCandlestickChart`, `TPieChart`, `TVirtualList`, `TTranscriptView`, `TLogView`, `TLogSearchBar`, `TLogLinksPanel`, `TLogScrollbar`, `TLogMinimap` |\n| Video adapter  | `@simon_he/vue-tui/experimental/video/node` | `createFfmpegVideoFrameSource`, `createYtDlpVideoFrameSource`                                                                                                                                    |\n| Agent console  | `@simon_he/vue-tui/agent`                   | `TAgentTranscript`, `TToolCallView`, `TToolLogView`, `TVirtualMarkdown`, `TVirtualList`, `TRenderPlane`                                                                                          |\n| Agent Mermaid  | `@simon_he/vue-tui/agent/mermaid`           | `TMermaid`（adaptive，图片→ANSI→源码）、`TMermaidText`、`TMermaidImage`、`beautifulMermaidRenderer`                                                                                              |\n| Runtime        | `@simon_he/vue-tui/runtime`                 | runtime, event, and selection APIs                                                                                                                                                               |\n| CLI            | `@simon_he/vue-tui/cli`                     | `createTerminalApp`, `createStdoutRenderer`, `createStdinDriver`, Node host adapters                                                                                                             |\n\nFor streaming Mermaid source, pass `streaming` with `final`. When `streaming=true` and `final=false`, transient renderer errors do not replace the last successfully rendered diagram; if no diagram has rendered yet, `incompleteText` is shown until the source becomes renderable or `final=true` surfaces the final error.\n\nThis table is a category overview. The generated API reference for root, `/vue`, and `/experimental` components lives in [docs/generated/components-api.md](./docs/generated/components-api.md) for humans and [docs/generated/api-manifest.json](./docs/generated/api-manifest.json) for CI, release checks, and README/docs drift checks; the manifest also tracks package entrypoint exports.\n\n## Documentation\n\n| Page                                                               | Purpose                                                              |\n| ------------------------------------------------------------------ | -------------------------------------------------------------------- |\n| [Docs home](./docs/index.md)                                       | Product overview and reading path                                    |\n| [Vue Terminal UI](./docs/guide/vue-terminal-ui.md)                 | English landing page for terminal-style Vue interfaces               |\n| [Vue CLI UI](./docs/guide/vue-cli-ui.md)                           | CLI app model with Vue component composition                         |\n| [CLI stdout renderer](./docs/guide/cli-stdout-renderer.md)         | Stdout renderer, stdin driver, cleanup, and terminal output          |\n| [Terminal log viewer](./docs/guide/terminal-log-viewer.md)         | Append-only logs, retained windows, wrapping, links, and search      |\n| [Markdown transcripts](./docs/guide/markdown-transcript.md)        | Static and streaming markdown transcript rendering                   |\n| [Examples index](./docs/examples.md)                               | Browser, terminal, and smoke example commands                        |\n| [Core API](./docs/api.md)                                          | Terminal, renderer, events, runtime, planes, and scheduler contracts |\n| [Terminal UI best practices](./docs/terminal-ui-best-practices.md) | Cell layout, input focus, render invalidation, transcripts, tests    |\n| [Performance](./docs/performance.md)                               | Practical performance guidance                                       |\n| [Benchmarks](./docs/benchmarks.md)                                 | Release benchmark budgets, sample results, and comparison boundaries |\n| [OpenTUI Solid comparison](./docs/compare-opentui-solid.md)        | Same-scenario comparison protocol and public claim boundaries        |\n| [High-throughput rendering](./docs/high-throughput-rendering.md)   | Scheduler, dirty rows, mailbox, log, and renderer architecture       |\n| [Component acceptance](./docs/components-acceptance.md)            | Release readiness checks for component API and behavior              |\n| [Agent Console](./docs/agent-console.md)                           | Streaming transcript example stack                                   |\n| [Release candidate](./docs/release-candidate.md)                   | 1.0 RC validation, package export checks, and migration notes        |\n| [Security policy](./SECURITY.md)                                   | Vulnerability reporting and terminal permission boundaries           |\n\nRun the docs locally:\n\n```bash\npnpm run docs:dev\npnpm run docs:build\n```\n\n## Examples\n\n```bash\npnpm -C examples/basic dev\npnpm run build:examples\npnpm run build:examples:terminal\npnpm run run:basic:terminal\npnpm run run:agent-console:terminal\npnpm run example:tlog-view-lab\npnpm run example:agent-console\npnpm run example:agent-console:smoke\npnpm run example:agent-console:terminal:smoke\n```\n\nThe smoke commands are deterministic and avoid real LLM APIs, real TTY dependencies, and timing-only pass/fail gates.\n\n## Performance Notes\n\n- Use `TVirtualList` instead of rendering thousands of row components.\n- Use `TLogView` with `createAppendOnlyLogStore({ maxLines })` for retained streaming logs.\n- Provide stable line keys for custom `TLogView` sources; mutable rows should change keys or call the explicit invalidation APIs.\n- Split high-volume content and frequently changing chrome into different `TRenderPlane`s.\n- Style objects are treated as immutable. Reuse stable style objects on hot paths, but pass a new object when a style changes.\n\nUseful checks:\n\n```bash\npnpm run bench:dom-renderer\npnpm run bench:scroll-mailbox\npnpm run bench:phase2\n```\n\n## Issues And Feedback\n\n- Report bugs: [new bug report](https://github.com/Simon-He95/vue-tui/issues/new?template=bug_report.yml)\n- Request features: [new feature request](https://github.com/Simon-He95/vue-tui/issues/new?template=feature_request.yml)\n- Report documentation issues: [new docs issue](https://github.com/Simon-He95/vue-tui/issues/new?template=docs.yml)\n- Report vulnerabilities privately: [Security policy](./SECURITY.md)\n- Browse existing issues: [GitHub issues](https://github.com/Simon-He95/vue-tui/issues)\n\nFor renderer, scheduler, or terminal behavior bugs, include the renderer target (`DOM`, `stdout`, or headless), the relevant command, and a minimal reproduction when possible.\n\n## Development\n\nUse Node.js 20 for repository development, release validation, and documentation builds. This is a toolchain requirement, not the runtime requirement for the published package.\n\n```bash\npnpm install\npnpm run format:check\npnpm run lint\npnpm run typecheck\npnpm run test\npnpm run build\n```\n\nRelease validation:\n\n```bash\npnpm run release:dry-run\n```\n\n`release:dry-run` runs checks, tests, docs build, benchmarks, examples smoke, and packed package install smoke.\n`release:ci` aliases `release:dry-run` for validation-only CI usage. The GitHub Release workflow is preferred because it publishes the already-verified tarball with npm provenance. If workflow token/provenance is unavailable, `release:local:dry-run` and `release:local` publish the locally verified tarball with the `rc` dist-tag. `release` and `release:workflow-only` intentionally fail to avoid accidental direct publishing.\n\n## Package Notes\n\n- The published package ships `dist` only.\n- Root, core, runtime, DOM renderer, observability, Vue, CLI, markdown, experimental, and agent entrypoints are available as ESM, CJS, and type declarations after build.\n- The Mermaid bridge entrypoints ship ESM, CJS, and type declarations.\n- The root browser/core API does not require a Node runtime, but CLI usage expects a Node-like stdout/stdin environment.\n- Terminal emoji and East Asian width behavior still depends on the user terminal and font.\n\n## License\n\n[MIT](./license)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimon-he95%2Fvue-tui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimon-he95%2Fvue-tui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimon-he95%2Fvue-tui/lists"}