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

CHANGELOG.md

Changelog

All notable changes to the jbaruch/tamboui tessl tile are documented in this file.

The TamboUI Java library itself does not yet maintain a separate changelog; see GitHub releases at https://github.com/tamboui/tamboui/releases for library history.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

[Unreleased]

Added

  • Six always-apply rules surfaced by building the jclaw-demo three-pane TUI against TamboUI 0.2.1-SNAPSHOT (jbaruch/tamboui#1):
    • persistent-stateful-elements — hold ListElement / TableElement / TextInputState as fields so scroll position, selection, and cursor survive across renders.
    • enable-mouse-capture-when-scrollable — override configure() with TuiConfig.builder().mouseCapture(true) whenever the app uses a scrollable widget.
    • focusable-needs-id — every .focusable() must be paired with .id(...); without an id the focus manager refuses to register the element.
    • pick-the-text-element — decision tree for text / richText / richTextArea / markupText / list, including the wrap-height-in-column trap and the container-only-constraints note.
    • projector-safe-colors — avoid .dim() and Color.GRAY for foreground text in demo/conference contexts; prefer saturated primaries.
    • text-input-submit-pattern.onSubmit(Runnable) reads the submitted line from the bound TextInputState and must call state.clear() after handling.
  • Two skills paired with the rules above, also surfaced by the jclaw-demo build (jbaruch/tamboui#1):
    • build-log-style-list — recipe for a log/chat pane: field-held ListElement, the three highlight-killing modifiers (selected(-1), highlightSymbol(""), highlightStyle(Style.EMPTY)), stickyScroll() + scrollbar(), mouseCapture(true) config override, .id(...).focusable(), and a pre-wrap helper for long lines.
    • multi-pane-focus — recipe for multi-pane focus: stable pane-id constants, initial focus set in onStart() via runner().focusManager().setFocus(...), a single paneBorder(id) helper polled per render against focusManager.focusedId(), projector-safe colors for both focused and unfocused borders, and the mouseCapture(true) override that makes click-to-focus work.
  • Positive eval scenarios for both new skills under evals/build-log-style-list-positive/ and evals/multi-pane-focus-positive/. Tasks describe observable pane behavior; criteria grade tile-specific choices (the three highlight modifiers, the configure() override, focusManager.focusedId() polling, etc.) per rules/plugin-evals.md.
  • CI matrix in .github/workflows/lint.yml now reviews build-log-style-list and multi-pane-focus alongside the existing three skills.
  • Eval scenarios under evals/ covering all three skills with a mix of positive and negative cases, merged from tessl scenario generate output and hand-authored scenarios. Generator scenarios won for scaffold-toolkit-dsl-app and jfr-event-conventions (cleaner, no task-to-criterion bleeding); hand-authored kept for wrap-histogram-positive (no inline widget source, vaguer doc location for stronger lift).
  • Bash-script tests for scripts/list-tamboui-modules.sh and scripts/check-display-width.sh under scripts/tests/.
  • GitHub Actions workflow .github/workflows/tile.yml that runs tessl tile lint and tessl skill review --threshold 85 on changes under tile-owned paths.

Removed

  • Eval scenario wrap-existing-list-negative — measured eval lift was −25 (baseline 100%, with-context 75%) and a tightened skill-Step-1 fix attempt regressed it further to −52. Per plugin-evals.md ("coincidence with universal competence: retire or accept as documentation"), the scenario tested generic engineering judgement (investigate before duplicating) rather than any tile-specific prescription, so it is retired rather than reshaped.
  • Eval scenarios scaffold-toolkit-dsl-app and scaffold-without-backend-negative — both scored baseline 100% / with-context 100% (zero lift). Modern Claude models already scaffold a JBang Toolkit DSL app correctly without the tile, and already push back on unsatisfiable build constraints without prompting. The pick-the-api-level and resource-lifecycle rules are kept in the tile as documentation for human readers, but they do not warrant eval coverage because they codify what baseline agents already produce by default.

Changed

  • Promoted the tile from tile/ subdirectory to the repo root so the entrypoint matches the project's README.md (per the tessl context-artifacts rule that the tile entrypoint is the project README).
  • Folded the tile's discovery surface (rules table, skills table, install instructions, registry badge) into the project README.md under the new ## Coding Agent Support section.
  • Replaced XML-style placeholders (<area>, <thing>, <module>) in the add-jfr-event skill with brace-style ({area}, {thing}, {module}) so the description passes deterministic skill validation.
  • Removed redundant "Proceed immediately to Step N" handoff lines from skills — the opening "Process steps in order" already establishes sequential execution.

[0.1.0] — 2026-04-27

Added

  • Initial tile with 8 always-apply rules: pick-the-api-level, render-thread-discipline, char-width-for-display, exception-hierarchy, resource-lifecycle, css-element-style-resolution, jfr-event-conventions, java-8-source-compat.
  • Initial tile with 3 skills: scaffold-toolkit-app, wrap-widget-as-element, add-jfr-event.
  • Initial tile with 2 deterministic helper scripts: list-tamboui-modules.sh, check-display-width.sh.

CHANGELOG.md

README.md

tile.json