Skip to content

v0.1.0

Latest

Choose a tag to compare

@github-actions github-actions released this 14 Jun 19:38
5cc1fd0

0.1.0 (2026-06-14)

Features

  • add app shell, IThemeService, and UI chrome components (65e28ca)
  • add btop theming support and ESC exit on splash page (014b1de)
  • add ISettingsStore interface to plugin SDK (77ac29f)
  • add marketplace domain models with JSON serialization and status merging (bd09ade)
  • add MarketplacePlugin with page, view model, and route registration (fd092ae)
  • add PluginCache, PluginMetadataFetcher, and PluginDownloader (abeae3a)
  • add PluginConfigStore for sources.json and installed.json with default seeding (8c36231)
  • add PluginLoader with built-in + external plugin discovery (614e9ab)
  • add PluginManager orchestrating install, update, uninstall, sync (1ee4989)
  • add PluginSettingsInfo record (6bc8120)
  • Add public API verification tests (290de2d)
  • add RefreshService with interval snapping, speed up/down, and tick emission (29426f5)
  • add Servus.Plugin.Sdk with plugin contracts, tick source, and models (e186835)
  • add ServusPluginBuilder and PluginRegistry for plugin configuration (57fd96f)
  • add SettingsPlugin with placeholder page and route registration (b280ba0)
  • add setup chain, tab bar, plugin routing, and Program.cs entry point (aa557ee)
  • add setup wizard and tab order (#5) (34c8512)
  • add SubNavNode<TView> with inline tab rendering (b5df6b7)
  • add TickRouter actor with demand-driven tick distribution (f59bb5d)
  • add WithSettings to plugin builder API (31d884e)
  • add WithSettings<TPage, TViewModel> extension method (86efa80)
  • Allow custom navigation behavior for routes (84ef1fb)
  • branding: Add owl mascot to figlet logo (7ba6198)
  • btop design system (#4) (cd9d468)
  • collect PluginSettings in PluginRegistry (a7a194a)
  • expose Observable<Tick> on ITickSource for reactive tick consumption (e3d8605)
  • implement ScopedSettingsStore with plugin-name prefix (579d66d)
  • implement SettingsStore with JSON persistence (155faef)
  • Introduce Akka actor for marketplace management (382bb78)
  • Load plugins from subdirectories (45bdcef)
  • marketplace: actor handles AddSource, RemoveSource, CycleUpdatePolicy and per-plugin ops (3f30e69)
  • marketplace: extend state with ActiveOperations, Sources and new messages (61ead77)
  • marketplace: implement Browse, Installed, Sources views with keybindings and key hints (5150390)
  • marketplace: page skeleton with tab bar, view switching, and toast integration (2a9e791)
  • marketplace: use theme colors instead of hardcoded palette (141df02)
  • migrate Marketplace to SubNavNode, replace D1/D2/D3 with B/I/S (433428f)
  • more testing and bug fixes (#6) (e7b8afe)
  • pass plugin name to builder, kebab-case conversion (2fc5308)
  • plugin: add ITabOrderService + TabDescriptor to SDK (7c7904a)
  • plugin: btop-style SubNavNode rendering with live theme (af7a493)
  • rebrand to Puhu naming and add release-please flow (b390869)
  • refresh: global +/-/p keys via RegisterGlobalKeys overload (a7f13ac)
  • refresh: IRefreshController SDK interface with persisted interval (7bd105a)
  • register keyed ISettingsStore per plugin (dfdaceb)
  • register SettingsStore singleton in ServicesSetup (cf075a1)
  • settings: add Setup sub-view to re-run the wizard (f5980e9)
  • settings: add SetupWizardState first-run flag (c861222)
  • settings: add Tabs reorder sub-view to the settings page (0d41223)
  • settings: add Tabs view state to SettingsViewModel (ecc98ef)
  • settings: refresh-rate section with sub-navigation (4e772e2)
  • settings: theme picker with live preview and persistence (f914cdc)
  • shell: app-wide redraw on ticks and theme changes (009eba3)
  • shell: btop-style AppShellNode with embedded key hints, drop legacy chrome nodes (e9cf023)
  • shell: show refresh interval and pause state in top bar (6a54825)
  • shell: tab scroll window logic for top bar overflow (c43e0a8)
  • shell: TopBarNode with embedded logo, scrolling tabs, and clock (7d4f068)
  • splash: add SplashPage with ASCII logo and progress bar (2540281)
  • splash: add SplashViewModel with animated progress (35e7437)
  • splash: wire splash page into startup, navigate via ViewModel (64e1337)
  • tabs: add TabOrder.Apply ordering helper (fc9d344)
  • tabs: add TabOrderService with persistence + change notification (add1873)
  • tabs: add TabRegistry.Reorder preserving active tab (f318218)
  • tabs: apply persisted tab order at startup and register ITabOrderService (429b864)
  • testing: Refactor test context and helpers (ff55832)
  • theme: add GraphGradient to ThemeDefinition with btop parser support (65727bd)
  • theme: bundle four btop-format themes, restore persisted selection at startup (6c29419)
  • themes: embed built-in themes, extend via themes/ folder (ac20b54)
  • theme: theme switching with change notification and persistence (574a61d)
  • type-safe route registration and XML summaries on public API (526a5d9)
  • typed IActorContext with Akka Props and fluent IActorRegistration (5a9f9da)
  • ui: Implement key hint and tab navigation interfaces (e02a92b)
  • wizard: add ColorFormat palette helper (0d07232)
  • wizard: add SetupWizardPage and /setup route (4c33954)
  • wizard: add SetupWizardViewModel (bfde861)
  • wizard: add ThemePaletteNode full color table (057960b)
  • wizard: add WizardChrome breadcrumb, status bar, and rule (ebac7de)
  • wizard: frame the wizard in a Puhu shell with breadcrumb + status bar (2d1bceb)
  • wizard: redesign Welcome (what Puhu is) and Done (summary) screens (2dffb02)
  • wizard: redirect to /setup on first run (9c08c13)
  • wizard: show full theme color palette on the Theme step (37fbc33)

Bug Fixes

  • block Tab on splash, update termina submodule with dispose fix (0ce68e3)
  • bundle Termina DLL in NuGet package instead of external dependency (4f56c18)
  • plugin: correct active sub-nav item cursor advance (1e97831)
  • prevent Termina submodule from producing NuGet packages (dd8183f)
  • prevent Termina submodule from producing NuGet packages (#3) (c81d1dc)
  • remove double-dispose of ProgressBarNode in SplashPage (bc5db79)
  • render border lines as strings to avoid DiffingTerminal char-width gaps (4f4def3)
  • replace PanelNode+SeparatorNode with custom AppShellNode (f20f982)
  • services: Register ISettingsStore with singleton (d478e8f)
  • settings: rebuild sub-views on data changes instead of stale KeyedDynamic cache (d098660)
  • shell: correct key-only hint segment rendering in bottom border (091b61c)
  • shell: route tab state through TabRegistry during transition, serialize registry tests (311b37f)
  • Shift+Tab navigation via page keybindings + Termina backtab fix (2ca06f9)
  • startup: resolve actor registry and startup order for plugin ViewModels (90467db)
  • stop splash animation on deactivation to prevent ObjectDisposedException (517ac89)
  • test: clip RenderTestContext sub-contexts against parent bounds (a8d43e3)
  • theme: align theme folder casing for case-sensitive filesystems (362fed2)
  • theme: built-in themes are not persistable, English SDK docs, hide subject write side (e0162e7)
  • theme: share default GraphGradient instance to preserve ThemeDefinition equality (b463e64)
  • use explicit solution path in CI test step (d9f174e)
  • wizard: disable WizardNode's built-in progress bar (it duplicated the new status bar) (4ecb040)

Documentation

  • add NuGet package README for Puhu.Plugin (178e6f2)
  • move README to repo root, reference from nuspec (b9e2819)
  • rewrite README with framed ASCII logo and add MIT LICENSE (706a992)

Refactoring

  • branding: extract shared PuhuBranding.Logo used by splash + wizard (3df3b12)
  • branding: make PuhuBranding internal with centering-safe LogoBlock (ebf49ea)
  • extract AkkaSetup for plugin actor registration, simplify ActorSystemSetup (8e87410)
  • extract TabRegistry from TabBarNode statics (3ee7727)
  • global Tab/Shift+Tab navigation, eliminate ThemeService.Instance (75fff45)
  • introduce SetupContext to eliminate GetRegisteredSingleton hacks (e7b3f83)
  • make ESC a global quit keybinding via GlobalKeyHandler (4ff96b7)
  • make Servus.Plugin a fat SDK with Akka, R3, and Termina dependencies (ee27047)
  • migrate MarketplacePlugin and SettingsPlugin to simplified builder API (4466a36)
  • move UI nodes to Plugin SDK, use AppShell.Wrap in MarketplacePage (0e59e01)
  • Organize project files into src directory (5ab31ab)
  • plugin: Rename Puhu.Plugin namespaces (4939842)
  • project: Rename TUI projects to Puhu (d6bf661)
  • rename Servus.Plugin.Sdk to Servus.Plugin (directories and project files) (fda2bda)
  • replace GlobalKeyHandler with page-level keybindings (523e58f)
  • settings: extract shared theme/refresh row builders (5ecd521)
  • simplify plugin builder to 4 methods, remove abstraction layers (48372b9)
  • simplify plugin builder to 4 methods, remove abstraction layers (1229eb3)
  • update all namespaces from Servus.Plugin.Sdk to Servus.Plugin (91aaa39)