feat(tui): Configuration pane (pane 8) with LLM / Skills / MCPs tabs (proposal 003 PR-4) - #57
Merged
Merged
Conversation
Implements PR-4 of proposal 003 (ACC TUI usability hardening).
Addresses operator review items 6 and 7: Skills + MCPs need a
proper home (not crammed into Ecosystem); LLM endpoints need to
be testable and visible from a single Configuration surface.
## New screen
`acc/tui/screens/configuration.py` — `ConfigurationScreen` mounts
at pane 8 with three `TabPane`s:
* **LLM Endpoints** — `_render_llm_summary()` shows the configured
`ACCConfig.llm` summary (backend, model, base_url, timeout) as
read-only text. Live per-agent table (`#llm-live-table`) fed
via `watch_snapshot()` from heartbeats, same shape as the old
ecosystem "ACTIVE LLM BACKENDS" table. *Test connection*
button HEAD-pings the configured base_url via stdlib
`urllib.request` (no new dependency) and writes a coloured
result into `#llm-test-result`.
* **Skills** — moved canonical home for the Skills DataTable +
*Upload skill* file-picker flow (mirrors ecosystem's PR-A2
pattern).
* **MCPs** — moved canonical home for the MCP-servers DataTable +
*Upload MCP* file-picker flow.
The Ecosystem copies of Skills + MCPs are kept for one release as
a migration aid; a follow-up PR can remove them once operator
confirms the Configuration pane is the right home. Eliminates
test churn this PR would have otherwise caused.
`_ping_endpoint()` is the pure-stdlib HEAD helper; `4xx` from a
HEAD-rejecting server still counts as "endpoint reachable",
`5xx` and URLError don't.
`_load_acc_config_summary()` is a defensive read of `LLMConfig()`
that falls back to em-dashes if the config module fails to
import — keeps the screen alive on partial installs.
"Assign LLM endpoint to a role" + role.yaml writeback (PR-4 §5
in proposal 003) is deferred to a follow-up so this PR lands
within the 800-LOC budget. Operator-side role editing already
works via the external editor + PR-3's file-watcher.
## Wiring
* `acc/tui/widgets/nav_bar.py` — `_SCREENS` list + `BINDINGS`
extended to include `("8", "configuration", "8 Configuration")`.
Module docstring updated 6 → 8 panes.
* `acc/tui/app.py` — `ConfigurationScreen` imported, registered
in `SCREENS` under `"configuration"`, added to
`_SNAPSHOT_SCREENS` fan-out so the live LLM table refreshes
per HEARTBEAT.
* Every screen's local `BINDINGS` list (`soma`, `nucleus`,
`compliance`, `comms`, `performance`, `ecosystem`, `prompt`,
`configuration`) now carries `("8", "navigate('configuration')",
"Configuration")` so the `8` key works from anywhere.
## Tests
`tests/test_configuration_screen_pilot.py` (NEW, 11 cases):
* `_ping_endpoint_*` (2) — empty url + unreachable host return
`(False, …, elapsed)` without crashing.
* `test_compose_yields_all_three_tabs` — TabPane ids
`tab-llm` / `tab-skills` / `tab-mcps` all present.
* `test_llm_summary_renders_at_mount` — `#llm-config-summary`
Static gets the Backend / Model / Base URL header.
* `test_test_button_updates_result_widget` — monkeypatched ping
returns ok=True → `#llm-test-result` shows the message +
latency.
* `test_test_button_handles_missing_base_url` — empty base_url
surfaces a clear operator-readable error.
* `test_skills_table_populated_from_fixture` /
`test_mcps_table_populated_from_fixture` — moved tables work.
* `test_configuration_registered_in_app_screens` /
`test_nav_bar_includes_configuration` /
`test_nav_bar_has_8_keybinding` — registration hygiene.
**71/71 tests green** across configuration + ecosystem +
coding_agent + prompt + file_picker + oversight TUI files.
No existing tests broken (Ecosystem still mounts Skills + MCPs +
LLM table for back-compat).
## CHANGELOG
`[Unreleased]` § Added gains:
- Configuration pane (pane 8) summary entry
- LLM Endpoints tab description
- Skills + MCPs tabs canonical-home note
`[Unreleased]` § Changed gains:
- NavigationBar 6 → 8 panes + all screens' BINDINGS updated
- Snapshot fan-out routes through the Configuration screen
## Manual verification
```bash
acc-tui # any screen, press '8'
# Configuration pane opens at the LLM Endpoints tab.
# Click Test connection → result shows HTTP status + latency.
# Click Skills / MCPs tabs → tables populated from on-disk manifests.
# Upload skill / Upload MCP buttons → file-picker modal works.
```
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 13, 2026
flg77
added a commit
that referenced
this pull request
May 13, 2026
All six PRs of proposal 003 (ACC TUI usability hardening) are on main: * #54 (PR-1) — Prompt cancel-on-timeout + CHANGELOG/version bump * #55 (PR-2) — Ecosystem role.md detail + searchable filter * #56 (PR-3) — Ecosystem roles/ watcher + selection lock * #57 (PR-4) — Configuration pane (pane 8) * #58 (PR-5) — Performance + Soma cluster/governance context * #59 (PR-6) — CLI/TUI infuse parity + subrole sibling listing pyproject.toml: 0.2.0-dev → 0.2.0 CHANGELOG.md: [Unreleased] section closed off as [0.2.0] (dated 2026-05-14) with a fresh [Unreleased] header ready for the next cycle. Tag v0.2.0 follows this merge. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
flg77
added a commit
that referenced
this pull request
Jun 11, 2026
…rrides (#57) Root-caused live on c26sx RHOAI sandbox: rhoai-corpus nats/redis stuck ImagePullBackOff 'name unknown: Repo not found'. util.ComponentImage derives nats/redis from imageRepository (<repo>:nats-<tag>) or imageRegistry (<reg>/nats:<tag>); with imageRegistry=registry.access.redhat.com (the default) neither path yields a real nats/redis image. A single registry/repo can't serve both the ACC images and stock nats/redis. Add optional full-ref overrides honored before the ComponentImage fallback (no behaviour change when unset). Set e.g. docker.io/library/nats:2.10-alpine / docker.io/library/redis:7-alpine, OR mirror nats/redis into the single imageRepository. Built against current main (ComponentImage model, post-#55). String value fields => deepcopy-safe. acc1: make manifests + go build/test before deploy; promote to flg77/acc once tested. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PR-4 of proposal 003 (ACC TUI usability hardening). Addresses operator review items 6 and 7: Skills + MCPs + LLM endpoint management need a proper home; today they're crammed onto Ecosystem.
New surface
A new pane 8 —
ConfigurationScreen— with threeTabPanes:ACCConfig.llm(backend / model / base_url / timeout); live per-agent backend DataTable fed from snapshots; "Test connection" button HEAD-pings the configured base_urlReachable via the new
8keybinding from any screen.Pragmatic call: keep Ecosystem copies for one release
The Ecosystem copies of Skills + MCPs + LLM table are kept for one release as a migration aid; a follow-up PR can remove them once operator confirms the Configuration pane is the right home. This eliminates ~10 test files needing structural rewrites in a single PR — keeps PR-4 within the 800-LOC budget (947 actual, mostly the new screen + its tests).
Deferred (slot 008 candidate)
"Assign LLM endpoint to a role" + role.yaml writeback (proposal 003 PR-4 §5) is deferred to a follow-up. Operator-side role editing already works via the external editor + PR-3's file-watcher; this PR provides the test path without the write path.
Files
acc/tui/screens/configuration.py(new, 555 LOC)_ping_endpoint+_load_acc_config_summaryhelpersacc/tui/app.pyConfigurationScreenimported; registered inSCREENS+_SNAPSHOT_SCREENSacc/tui/widgets/nav_bar.py_SCREENSandBINDINGSextended to 8 panesacc/tui/screens/*.py(7 files)("8", "navigate('configuration')", "Configuration")CHANGELOG.md[Unreleased]Added + Changed sectionstests/test_configuration_screen_pilot.py(new, 11 cases)Test plan
tests/test_configuration_screen_pilot.py.test_configuration_screen_pilot.py+test_ecosystem_screen_pilot.py+test_coding_agent_tui_pilot.py+test_prompt_screen_pilot.py+test_file_picker_pilot.py+test_oversight_tui_diagnose.py.Manual verification
Reference
Proposal 003 —
…\ACC Implementation\003 - ACC TUI usability hardening.md(operator vault).🤖 Generated with Claude Code