CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/tamboui

Teaches coding agents how to build TUIs with TamboUI correctly: API-level selection, render-thread discipline, display-width safety, CSS-aware element authoring, and JFR conventions.

76

Quality

95%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Overview
Quality
Evals
Security
Files

jbaruch/tamboui

tessl

A tessl tile that teaches AI coding agents how to use the TamboUI Java terminal-UI library without falling into its sharp edges (render-thread discipline, terminal display widths, CSS-aware element styling, JFR-event conventions).

This repo is the standalone home of the tile. The TamboUI library itself lives at tamboui/tamboui.

Install

tessl install jbaruch/tamboui

Run this from your TamboUI consumer project (or from the TamboUI repo itself if you're contributing). The rules apply automatically; the skills are invoked on demand.

Rules

RuleWhat it enforces
pick-the-api-levelDefault to Toolkit DSL; drop to TuiRunner / Immediate / Inline only when needed.
render-thread-disciplineAll UI mutations on the render thread; use runOnRenderThread from background threads.
char-width-for-displayNever use String.length() / substring for terminal widths — use CharWidth.
exception-hierarchyThrow the right TamboUIException subtype with actionable context.
resource-lifecycleAlways try-with-resources for TuiRunner, Backend, InlineDisplay.
css-element-style-resolutionNullable style fields + resolveEffectiveStyle for CSS-aware elements.
jfr-event-conventionsNaming, enabled() guards, commit(...) helpers, JFR polyfill for Java 8.
java-8-source-compatLibrary modules are Java 8; demos can use Java 21+.
persistent-stateful-elementsHold stateful elements (list, table, textInput) as fields — never rebuild inline in render().
enable-mouse-capture-when-scrollableOverride configure() with mouseCapture(true) whenever the app uses a scrollable widget.
focusable-needs-idEvery .focusable() must be paired with .id(...), else the focus chain silently drops the element.
pick-the-text-elementDecision tree for text / richText / richTextArea / markupText / list — wrap-height is the load-bearing distinction.
projector-safe-colorsAvoid .dim() and Color.GRAY for foreground text in demo/conference contexts; prefer saturated primaries.
text-input-submit-patternonSubmit(Runnable) reads the line from TextInputState; always state.clear() at the end.

Skills

SkillWhen to use
scaffold-toolkit-appBootstrap a new TUI app using the Toolkit DSL.
wrap-widget-as-elementAdd a Toolkit Element wrapping a widget, with proper CSS child-selector support.
add-jfr-eventAdd a new JFR event under dev.tamboui.{area} with the project's conventions.
build-log-style-listBuild a scrollable log/chat pane with sticky scroll, scrollbar, mouse wheel, focus, and pre-wrap for long lines.
multi-pane-focusWire stable ids, initial focus in onStart(), and a projector-safe focused-pane border across multiple panes.

Scripts

The tile ships two helper scripts under scripts/. After install they live at .tessl/tiles/jbaruch/tamboui/scripts/ in your workspace; both accept a path argument for the TamboUI repo root.

ScriptWhat it does
scripts/list-tamboui-modules.shLists Gradle modules from settings.gradle.kts as JSON.
scripts/check-display-width.shGreps widget render code for length() / substring( calls and emits candidates as JSON for review.

Eval Lift

Measured on claude-sonnet-4-6 over 3 scenarios that test tile-specific (not universal) behaviour:

ScenarioBaselineWith TileLift
Refuse to rename commit→trace and drop the JFR enabled() guard19%100%+81
Add a JFR event with TamboUI naming, guard, helper, polyfill26%100%+74
Wrap a widget with resolveEffectiveStyle + nullable Style fields62%100%+38
Aggregate (n=3)36%100%+64

Two zero-lift scenarios were retired per plugin-evals.md ("coincidence with universal competence: retire or accept as documentation"). See CHANGELOG.md for the full history.

Authoring Workflow

Local development runs against the included script-test suite:

bash scripts/tests/run-all.sh
tessl tile lint
tessl skill review --threshold 85 skills/scaffold-toolkit-app
tessl skill review --threshold 85 skills/wrap-widget-as-element
tessl skill review --threshold 85 skills/add-jfr-event
tessl skill review --threshold 85 skills/build-log-style-list
tessl skill review --threshold 85 skills/multi-pane-focus

CI runs the same set on every PR (.github/workflows/lint.yml).

Publishing

Publishing is automated via tesslio/patch-version-publish on push to main (.github/workflows/publish.yml). The action queries the registry for the latest published version, auto-bumps the patch if tile.json is at-or-behind, and publishes. To override (minor/major bump), edit tile.json version to a value greater than the registry latest before pushing.

The workflow needs a TESSL_TOKEN repository secret. Configure it at:

https://github.com/jbaruch/tamboui/settings/secrets/actions

Token can be generated at https://tessl.io/settings/tokens.

Relationship to TamboUI Upstream

This tile is independent: it's authored by an external contributor against the public TamboUI surface. If the TamboUI maintainers want to adopt it as an official tile, the canonical place would be tamboui/tamboui-tessl (or similar) — at which point this repo would be archived with a pointer.

License

MIT — same license as TamboUI itself, since the tile content paraphrases public TamboUI documentation and conventions.

Workspace
jbaruch
Visibility
Public
Created
Last updated
Publish Source
GitHub
Badge
jbaruch/tamboui badge