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
95%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
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.
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.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.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..github/workflows/lint.yml now reviews build-log-style-list and multi-pane-focus alongside the existing three skills.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).scripts/list-tamboui-modules.sh and scripts/check-display-width.sh under scripts/tests/..github/workflows/tile.yml that runs tessl tile lint and tessl skill review --threshold 85 on changes under tile-owned paths.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.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.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).README.md under the new ## Coding Agent Support section.<area>, <thing>, <module>) in the add-jfr-event skill with brace-style ({area}, {thing}, {module}) so the description passes deterministic skill validation.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.scaffold-toolkit-app, wrap-widget-as-element, add-jfr-event.list-tamboui-modules.sh, check-display-width.sh.rules
skills