by vuejs-ai
The Vue framework for terminal UIs. SFC & JSX, Yoga flexbox, HMR, and testing out of the box.
# Add to your Claude Code skills
git clone https://github.com/vuejs-ai/vue-tuiLast scanned: 6/20/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-06-20T07:50:19.838Z",
"npmAuditRan": false,
"pipAuditRan": true,
"promptInjectionRan": true
}vue-tui is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by vuejs-ai. The Vue framework for terminal UIs. SFC & JSX, Yoga flexbox, HMR, and testing out of the box. It has 334 GitHub stars.
Yes. vue-tui passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/vuejs-ai/vue-tui" and add it to your Claude Code skills directory (see the Installation section above).
vue-tui is primarily written in TypeScript. It is open-source under vuejs-ai on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh vue-tui against similar tools.
No comments yet. Be the first to share your thoughts!
Public beta — the
@vue-tui/runtimeAPI is stabilizing toward 1.0; dev-mode HMR is still experimental. Bug reports welcome.
vue-tui is a Vue-native application framework for interactive terminal UIs. Build with components, develop with HMR, test with confidence.
<template>, TSX, or both@vue-tui/vite plugin (pnpm dev)There are two ways to use vue-tui — scaffold a full project, or drop the runtime into an existing one.
A ready-to-develop setup: Vue SFCs and a terminal HMR dev server via the @vue-tui/vite plugin.
pnpm dlx tiged vuejs-ai/vue-tui/templates/vite my-app
cd my-app
pnpm install
pnpm dev # in-process terminal dev server with HMR
Edit src/app.vue and watch the terminal update instantly.
@vue-tui/runtime is a standalone Vue renderer, independent of the @vue-tui/vite plugin. Author components as SFCs and mount them with createApp, using your own build:
<!-- app.vue -->
<script setup lang="ts">
import { shallowRef } from "vue";
import { Box, Text, useInput } from "@vue-tui/runtime";
const count = shallowRef(0);
useInput((event) => {
if (event.type === "key") {
if (event.key.name === "up") {
count.value++;
} else if (event.key.name === "down") {
count.value--;
}
}
});
</script>
<template>
<Box>
<Text>Count: </Text>
<Text bold color="green">{{ count }}</Text>
<Text dimColor> (↑/↓ to change)</Text>
</Box>
</template>
// main.ts
import { createApp } from "@vue-tui/runtime";
import App from "./app.vue";
createApp(App).mount({ exitOnCtrlC: true });
unplugin-vue/vite, whose default client output is what the terminal renderer needs; JSX uses the HMR-capable @vitejs/plugin-vue-jsx.unplugin-vue/rolldown with tsdown for SFCs, or unplugin-vue-jsx/rolldown for JSX.@vue-tui/vite plugin: plugins: [vueSfc(), vueTui()].@vue-tui/runtime@vue-tui/use@vue-tui/components@vue-tui/testing| Package | Description |
|---|---|
@vue-tui/runtime |
The core framework — Vue 3 renderer for the terminal with common components (Box, Text, etc.), an explicit Inline-history subpath, narrow public layout and Box facts, normalized input, explicit unique focus ownership, lifecycle, and yoga-based flexbox layout. API stabilizing. |
@vue-tui/use |
Reusable public-Runtime-only behavior — lifecycle-scoped input as a function-ref composable or renderless component. |
@vue-tui/vite |
Vite plugin — add vueTui() to vite.config.ts for an in-process terminal dev server with HMR (pnpm dev). Dev only; the production build is a plain tsdown config that bundles the app into one self-contained Node file (see the starter and examples/*/tsdown.config.ts). Experimental; may change. |
@vue-tui/testing |
Deterministic test host — model terminal or stream conditions, inspect content commits, and assert the terminal-emulated screen |
@vue-tui/components |
High-level components built on the runtime primitives — <ScrollBox>, <Spinner>, <Table>, <Newline>, and <Spacer>. |
| Example | Description |
|---|---|
basic-template |
Vue SFC with <template> syntax |
basic-jsx |
Same app in TSX |
coding-agent |
AI coding agent with LLM streaming and interactive UI |
flappy-bird |
Physics-based terminal game with reactive state and borders |
scroll-box |
Bounded viewport with app-controlled scrolling |
@vue-tui/runtimeThe core renderer: the terminal primitives and the composables that read renderer-owned facts. Package guide.
| Component | Import from | Description |
|---|---|---|
<Box> |
@vue-tui/runtime |
Layout container — flex, size, spacing, border, background, clipping, and v-show |
<Text> |
@vue-tui/runtime |
Text — foreground/background color, six modifiers, wrapping, truncation, and v-show |
<Static> |
@vue-tui/runtime/inline |
Commits a mounted subtree to Inline terminal history |
Box and Text have closed prop surfaces: unknown props, misspellings, browser attributes, and listeners such as @click are rejected at runtime instead of silently ignored. The full prop tables are in the Runtime guide.
v-show belongs to the visual host layer rather than to a component allowlist. Vue forwards it through any chain of components whose current effective root is one Box or Text, so ordinary custom single-root components and the first-party Newline, Spacer, Spinner, ScrollBox, and non-empty Table inherit it without dedicated support code. An empty Table with no explicit columns renders no host node or layout space. Fragment and text roots keep Vue's development warning and ineffective behavior, Comment roots are silently ineffective, and Static remains the explicit history-boundary exception.
Static is the only export on that subpath, and it is deliberately absent from the package root.