gh-skillview is a .NET 10 / Terminal.Gui v2 terminal UI and CLI for browsing,
installing, updating, and cleaning up gh skill skills.
This repo exists to make gh skill easier to inspect and safer to operate from
the terminal, with both a full-screen TUI and scriptable CLI commands.
src/SkillView.Core/— shared bootstrapping, CLI dispatch,ghadapters, inventory, logging, and all TUI screens.src/SkillView.App/— standaloneskillviewentrypoint.src/SkillView.GhExtension/—gh skillviewextension entrypoint.tests/SkillView.Tests/— xUnit coverage for core services, CLI JSON output, and TUI helpers.tests/SkillView.IntegrationTests/— in-process Terminal.Gui integration smoke tests using the ANSI driver and one event-loop tick.
- Build/style verification:
dotnet build - Full tests:
dotnet test --no-build - Integration tests only:
dotnet test tests/SkillView.IntegrationTests/SkillView.IntegrationTests.csproj - Launch TUI:
src/SkillView.App/bin/Debug/net10.0/osx-arm64/skillview - For CLI global flags such as
--scan-root, pass them before the subcommand:skillview --scan-root /tmp/root list --json
- Keep this file and
agent_docs/up to date as new durable agent-facing workflow or testing lessons are discovered. Put short repo-wide rules here; put detailed procedures in a focused file underagent_docs/. - Prefer the built
skillviewhost binary overdotnet runfor PTY-driven TUI automation.dotnet runcan add first-run noise and long startup delays, especially with sandboxedHOME. - For PTY-driven TUI testing, use an isolated temp workspace and verify
side-effects from the shell after each destructive step. See
agent_docs/tui-pty-testing.md. - SkillView requires
gh2.95.0 or newer (GhBinaryLocator.MinimumVersion); that version guarantees the fullgh skillsurface SkillView relies on, so there is no per-flag capability probe — only a singlegh skill --helpsmoke check. InstallAgentCatalogtracks the fullgh skill install --help--agentlist as ofgh2.97.0 (48 entries — gh 2.97.0 replacedwindsurfwithdevinand addedgrok, cli/cli#13987 and cli/cli#13864).HomeRelativePathis best-effort and nullable — only set when the on-disk config-dir convention was independently verified; a null path just means that agent is never pre-checked or shown in the Doctor "detected agents" table (cosmetic only, never gates the actual install call). Re-diff againstgh skill install --helpand update the catalog when bumping theghminimum again. The agent checkboxes inInstallScreen,InstallConfirmModal, andRepoSkillPickerModalrender via the sharedAgentCheckboxGridhelper inside a scrollableView(ViewportSettingsFlags.HasVerticalScrollBar) — don't revert to a fixed-row/fixed-height layout, the catalog is too long to fit on screen unscrolled.- Config/theme bootstrap uses
TuiConfigurationBuilder(MEC-based), not the legacy staticConfigurationManager.Enable(...)/Disable(...)— that API is obsolete as of Terminal.Gui 2.4.14 and scheduled for removal. Do not reintroduce it.SkillViewApp.RunAsyncdoesnew TuiConfigurationBuilder(SkillViewAppName).ApplyToStaticFacades()beforeWingetTuiTheme.Register(...)—ApplyToStaticFacades()still pushes onto the same staticSchemeManager/ThemeManagerfacadesWingetTuiTheme.Registertargets, so that call's ordering/behavior is unchanged. - Install flows default to
--agent universal(not blank) when the user hasn't explicitly checked any agent checkboxes —InstallConfirmModal. DefaultAgents, shared byInstallScreenandRepoSkillPickerModal(viaBuildOptionsFromSelection). Verified against livegh2.96.0: a blank--agentat user scope installs to gh's default (~/.copilot/skills), while--agent universal --scope userinstalls to the shared, agent- agnostic~/.agents/skills. Skipped when a custom--dirpath is set (--diroverrides--agententirely).ScanRootResolver.UserSeedshas a matching.agents/skillsentry so the inventory scan actually discovers skills installed there — keep both in sync if this default ever changes. - Current package compatibility: SkillView is pinned to Terminal.Gui
2.4.17and Terminal.Gui.Editor2.5.7, the latest stable releases of each as of 2026-07. Test projects useMicrosoft.NET.Test.Sdk18.8.1,xunit.v33.2.2, andxunit.runner.visualstudio3.1.5. If tests fail to compile on missingTestContext, rerundotnet restoreso stale xUnit 2.x assets are replaced.tests/SkillView.Tests/Build/PackageReferenceTests.csandCliDispatcherHelpTests.VersionFlag_IncludesTerminalGuiVersionhardcode the exact Terminal.Gui version string — update both alongside any bump. src/SkillView.Core/SkillView.Core.csprojowns the defaultTerminalGuiVersionproperty. Keep thePackageReferenceonVersion="$(TerminalGuiVersion)"so CI can override it via MSBuild without editing source.- Terminal.Gui's modern lifecycle is now the right default for SkillView:
use
Application.Create().Init()to create the app instance andIApplication.Dispose()/usingfor teardown. Do not add new uses of the legacy staticApplication.Init()/Application.Shutdown()path. - Tie async TUI work to the lifetime of the owning app/dialog with a
CancellationToken, and only update UI throughapp.Invoke()while that lifetime is still active. Do not fall back to direct UI mutation after teardown. - The main TUI host path now runs through
SkillViewApp.RunAsync(ct), andEntryPoint.RunAsyncawaits it directly. Keep external cancellation wired to the app lifetime so Terminal.Gui can stop the active runnable viaIApplication.RunAsync(..., ct, ...). SkillViewAppnow keeps the search shell and pane state, whileSkillViewWorkflowCoordinatorowns install/update/installed/remove/cleanup/ doctor orchestration plus the shared inventory capture/rescan flow. Put new workflow-level behavior there unless it truly belongs to the search shell.- Package-manager dark-launch scaffolding lives under
packaging/and the release workflow only generates Homebrew / WinGet artifacts when the repo variables (HOMEBREW_TAP_ENABLED,HOMEBREW_TAP_REPO,WINGET_ENABLED) are explicitly enabled. It does not push to a tap repo or submit to WinGet yet. - Terminal.Gui
2.4.17remains compatible with the modernApplication.Create().Init()lifecycle; the localUnconditionalSuppressMessageworkaround and temporary App-level warning mask stay removed after a verification publish proved the App entrypoint no longer needs them. - CI's standalone AOT smoke publish now promotes
IL2026,IL3050, andIL3053to errors forSkillView.App; keep the gh extension's project-level suppression local until that host gets its separate re-evaluation. - Prefer
KeyBindingsfor view-local command remaps like table preview shortcuts. Keep the current window/tableKeyDownrouting where the app is intentionally centralizing whole-screen actions (search/install/open/logs, installed-screen filter/sort/remove, cleanup actions, etc.), not because of the oldTableViewtype-to-search swallowing bug. - On Terminal.Gui
2.4.17,TableView.CollectionNavigator = nullis the supported way to disable type-to-search. Treat#5232as the fix for the old printable-key swallowing behavior and prefer this documented path over the old custom matcher workaround. - Sanitize untrusted text before assigning it to preview/detail/log panes.
TerminalEscapeSanitizeris now the shared UI-layer guard for remote preview markdown, search metadata, installed-skill detail markdown, cleanup/remove summaries, and rendered log text. - Terminal.Gui
2.4.17enables bracketed-paste mode. SkillView does not need custom handling for it: editableTextFieldinputs accept terminal-native paste through Terminal.Gui's defaultCommand.Pastepipeline, while read-only panes ignore paste events.TerminalEscapeSanitizerstill applies to rendered remote content and is separate from Terminal.Gui's pasted-input sanitization. - If Copilot-specific, Claude-specific, or other agent-platform guidance turns out to matter for this repo, capture the repo-relevant part here so future agents do not need to rediscover it from external docs.
agent_docs/running-tests.md— standard verification commands, UI-focused test filters, and opt-inghcontract-test workflow details.agent_docs/release-engineering.md— release workflow, asset naming, AOT RID matrix, and attestation conventions.docs/runbooks/release-rollback.md— rollback steps for live GitHub Releases and the current Homebrew / WinGet dark-launch artifacts.agent_docs/tui-pty-testing.md— sandboxed PTY workflow, synchronization strategy, verification scripts, and known pitfalls for terminal UI testing.