@emergente-labs/effect-cli
v0.1.1
Published
Terminal UI components for Effect-TS CLI applications -- spinners, progress bars, tables, boxes, prompts, and task runners
Maintainers
Readme
@emergente-labs/effect-cli
Terminal UI components for Effect-TS CLI applications. Every component returns Effect.Effect<void> and uses Ref for state management.
Effect has @effect/cli for argument parsing, but no terminal UI library. The alternatives (Ink, listr2, ora, inquirer) don't integrate with Effect. This fills that gap.
Installation
npm install @emergente-labs/effect-cli effectComponents
Spinners
import { withSpinner } from "@emergente-labs/effect-cli";
yield* withSpinner("Loading data...", fetchDataEffect);Progress Bars
import { withProgress } from "@emergente-labs/effect-cli";
yield* withProgress(items, (item, i) => processItem(item), {
showPercentage: true,
showEta: true,
});Tables
import { printTable, quickTable, keyValueTable } from "@emergente-labs/effect-cli";
yield* quickTable(data, { style: "rounded" });
yield* keyValueTable([
["Name", "My App"],
["Version", "1.0.0"],
["Status", "Running"],
]);Boxes
import { printBox, banner, infoBox, errorBox } from "@emergente-labs/effect-cli";
yield* banner("My Application v1.0");
yield* infoBox("Server started on port 3000");
yield* errorBox("Connection failed", { title: "Database Error" });Prompts
import { confirm, select, input, password, multiSelect } from "@emergente-labs/effect-cli";
const confirmed = yield* confirm("Continue?");
const name = yield* input("Project name:", { placeholder: "my-app" });
const secret = yield* password("API Key:");
const framework = yield* select("Framework:", [
{ label: "React", value: "react" },
{ label: "Vue", value: "vue" },
{ label: "Svelte", value: "svelte" },
]);Task Runner
import { runTasks, task, log, printTaskSummary } from "@emergente-labs/effect-cli";
const results = yield* runTasks([
task("install", "Installing dependencies", installEffect),
task("build", "Building project", buildEffect),
task("test", "Running tests", testEffect),
], { showDuration: true });
yield* printTaskSummary(results);Colors & Styling
import { color, style, semantic, styled, createStyle } from "@emergente-labs/effect-cli";
console.log(color("Success!", "green"));
console.log(semantic.error("Something went wrong"));
console.log(styled("Important", "bold", "yellow"));
const highlight = createStyle("cyan", "bold");
console.log(highlight("Highlighted text"));Symbols
import { symbols } from "@emergente-labs/effect-cli";
console.log(`${symbols.success} Done`); // ✔ Done
console.log(`${symbols.error} Failed`); // ✘ Failed
console.log(`${symbols.warning} Warning`); // ⚠ WarningFeatures
- Full ANSI color system with RGB/256-color support
- Box/panel rendering with 6 border styles
- Single and multi-progress bars with ETA
- Interactive prompts (confirm, input, password, select, multiSelect)
- Animated spinners with multiple animation types
- Table renderer with 6 border styles
- Task list renderer (listr-style)
- Cross-platform Unicode symbols (Windows fallbacks)
- Non-interactive fallbacks for CI/CD environments
- Zero external dependencies beyond Effect
License
MIT
