Commit Graph

50 Commits

Author SHA1 Message Date
Fusion
323e151e3a feat(FN-2629): stabilize terminal modal font-size refit
- Enforce terminal xterm root height fill so inline fit heights do not collapse the modal terminal area
- Defer font-size-driven fit to the next animation frame and coalesce pending fits via pendingFitRef
- Remove eager refit calls from zoom keyboard/button handlers and rely on shared font-size effect scheduling
- Expand TerminalModal tests to assert font-size controls and keyboard zoom continue to trigger xterm refits
2026-04-26 22:14:03 -07:00
gsxdsm
9224bc91d4 fix(dashboard): bind xterm onData once to prevent input doubling
Move the xterm.onData -> sendInput wiring (and the window resize listener)
from a separate post-init effect into initTerminal itself, so they share
the xterm instance's lifetime. Under StrictMode + Vite Fast Refresh the
separate effect could re-run and attach a second listener to the same
live xterm instance, producing per-character input doubling (every
keystroke -> two pty.write calls -> shell echoes "aabbcc"). The handler
now reads sendInput via a ref, so function-identity changes no longer
require re-binding. Resize listener is removed at every xterm disposal
site (tab switch, modal close, session-invalid replace, reinitialize).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 17:22:44 -07:00
Fusion
e4d4a0165b feat(FN-2612): merge fusion/fn-2612 (auto-resolved)
- test(FN-2612): complete Step 4 — cover shortcut helpers and panel interactions
- feat(FN-2612): complete Step 3 — style shortcut panel controls
- feat(FN-2612): complete Step 2 — add terminal shortcut panel UI
- feat(FN-2612): complete Step 1 — add control sequence helpers
2026-04-26 14:09:34 -07:00
Fusion
1111411e8b feat(FN-2609): merge fusion/fn-2609 (auto-resolved)
- test(FN-2609): complete Step 4 — cover terminal font-size controls
- feat(FN-2609): complete Step 3 — style terminal font-size controls
- feat(FN-2609): complete Step 2 — add terminal status bar font controls
- feat(FN-2609): complete Step 1 — persist terminal font size state
2026-04-26 13:19:04 -07:00
Fusion
1b3994f1e0 fix(FN-2500): improve terminal modal sizing and input behavior
- Widen the desktop terminal modal to improve usability and align with UX review feedback
- Stabilize terminal input lifecycle handling to avoid focus and interaction regressions
- Add regression coverage for terminal modal input behavior and mobile keyboard layout scenarios
- Include a changeset documenting the terminal modal desktop width and input fixes
2026-04-25 12:14:50 -07:00
Fusion
d281cb2c1e feat(FN-2488): add terminal refresh fallbacks for terminal startup failures
- Add refresh-page actions alongside retry/reinitialize in TerminalModal bootstrap and xterm init error states
- Add terminal error action-group styling so multiple recovery buttons render cleanly
- Extend TerminalModal tests to cover new refresh controls and verify window reload behavior
- Remove unused TaskLogEntry import and drop the stale hooks eslint suppression in dashboard-tui app
2026-04-25 07:34:58 -07:00
gsxdsm
f11800f2c6 refactor(dashboard): split monolithic styles.css into per-component files
Split app/styles.css from ~40k lines down to ~4.5k. Created 56 co-located
component CSS files in app/components/, each imported by its owning .tsx.
The remainder of styles.css holds genuinely global rules (design tokens,
.btn/.card/.modal/.form-input primitives, cross-component @media overrides).

- Lazy-load 13 heavy views (AgentsView, RoadmapsView, NodesView, etc.) via
  React.lazy + Suspense; prefetch all chunks on idle so first navigation is
  instant. Initial JS bundle: 1.58 MB → 1.16 MB (-26%). Initial CSS bundle:
  635 kB → 471 kB (-26%); the rest splits into 13 per-view chunks.

- Add app/test/cssFixture.ts exposing loadAllAppCss() + loadAllAppCssBaseOnly()
  so CSS regression tests load the full per-component bundle (mirroring Vite
  source order). Migrate 30+ tests off direct readFileSync('../styles.css').

- Enable test.css: { include: [/.+/] } in vitest.config.ts so component CSS
  imports actually inject styles in jsdom (fixes getComputedStyle assertions).

- Add ESLint rule (no-restricted-syntax) banning direct styles.css reads in
  dashboard test files; points at loadAllAppCss() instead.

- Restore lost utility classes (.text-muted, .text-secondary, .text-dim,
  .form-input) and rescue dropped chat tool-call rules into QuickChatFAB.css.

- Mobile fixes along the way: scroll containment for view containers
  (min-height:0 + -webkit-overflow-scrolling), QuickChatFAB full-screen on
  mobile (with safe-area-inset for iOS home bar), AgentsView single-row
  header layout, ActivityLogModal close button on right, model-combobox
  z-index above the mobile quick-chat panel.

- Bug fix: SkillsView toggle was display:none which hid the input from the
  accessibility tree; replaced with the visually-hidden pattern so screen
  readers + getByRole still find the checkbox.

- Bug fix: standalone Delete button in TaskDetailModal for triage-column
  tasks (Actions dropdown is hidden in triage state, so previously no way
  to delete a freshly-created task without status change first).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 19:39:20 -07:00
gsxdsm
4101af8547 refactor: eliminate remaining 15 any warnings and ratchet rule to error
- TaskCard: four catch((err: any) => err.message) promise handlers in
  archive/unarchive/delete/move → catch((err) => getErrorMessage(err)).
- InlineCreateCard + QuickEntryBox: .catch((err: any)) model-load handlers
  → getErrorMessage(err) with existing @fusion/core import.
- TerminalModal: drop (navigator as any).maxTouchPoints — modern lib.dom
  types already expose the property.
- serve.ts: remove unused any annotation on OpenRouter model mapper; the
  array element type is already inferred from json.data.
- pi.js, runtime-resolution.ts, dashboard.ts, serve.ts, dev-server-port-
  detect.ts, devserver-manager.ts: drop now-stale eslint-disable comments
  that the cleanup made redundant.

Fix a prompt-builder regression surfaced by agent's `any` cleanup: toolCall
with a raw string `arguments` field must be preserved verbatim (JSON-quoted)
rather than coerced to `{}`; restores a previously-passing test.

Then promote @typescript-eslint/no-explicit-any from warn → error. Future
new anys must either come with a one-line disable + justification or use a
real type. Workspace is now lint-clean (0 problems).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:02:37 -07:00
gsxdsm
4cabe7f613 refactor: eliminate ~400 no-explicit-any warnings across the workspace
Parallel subagent pass: four typescript-pro agents on non-overlapping scopes.

Patterns applied:
- catch (err: any) { ... err.message ... } → catch (err) { ... getErrorMessage(err) ... }
  using the new @fusion/core helper. Bare catch {} where the error was unused.
- SQLite row types: defined typed XxxRow interfaces per table and cast
  .all()/.get() results via `as unknown as XxxRow[]` (the double cast is
  required because better-sqlite3 returns Record<string, SQLOutputValue>).
- rowToX(row: any) converters: typed argument with the matching row interface.
- Dynamic settings key writes: (settings as Record<string, unknown>)[key].
- React event handlers and setState callbacks: inferred types or concrete
  React.{Mouse,Change,Form}Event<...> where needed.
- pi-claude-cli: local PiMessage / PiContext duck types to avoid re-typing
  pi-ai concrete shapes; typed Claude stream event message fields.

72 files changed, ~400 anys eliminated. Typecheck passes across the workspace.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:02:36 -07:00
gsxdsm
651c5678d2 refactor: fix and tighten mechanical lint rules
- no-useless-escape: drop needless backslashes in character classes and
  URL/path regexes (gh-cli, store, task, modelFilter, useFileMention,
  RoutineEditor, ScheduleForm).
- no-case-declarations: wrap case bodies in ProjectOverview and
  SettingsModal with block scopes.
- prefer-const: convert a never-reassigned slug binding in agent-import;
  annotate legitimate forward-declared let bindings in dashboard.ts that
  callbacks close over before assignment.
- no-fallthrough: add missing break after settings-subcommand error.
- no-empty-interface/no-empty-object-type: convert ProjectManifest from
  empty interface extension to a type alias.
- no-unused-expressions: replace `x && x.method()` short-circuits in
  TerminalModal with optional chaining.

Then ratchet these rules from warn → error so regressions are blocked.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:02:36 -07:00
gsxdsm
7d31b21c77 fix(FN-000): skip iOS gesture focus handler so typed keys reach xterm
On iOS Safari/PWA, tapping the terminal opened the on-screen keyboard but
keystrokes were silently dropped. After the earlier CSS fix (c7266b7f) the
helper textarea now covers the terminal surface and iOS focuses it natively
on tap — but the bubble-phase onPointerDown/onTouchStart handler kept
re-focusing xterm + the textarea and calling setSelectionRange during the
touch gesture. That is the same class of re-focus-mid-gesture that the
prior commit identified as disrupting iOS input attribution; moving from
capture to bubble phase wasn't enough.

- Early-return from handleTerminalGestureFocus on
  (hover: none) and (pointer: coarse), so iOS handles focus with no JS
  interference.
- Desktop (fine pointer) keeps the existing behavior because the textarea
  stays 1x1 off-screen and still needs programmatic focus on canvas click.
- Add a regression test covering the no-op path with the media query mocked.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 12:38:13 -07:00
gsxdsm
c7266b7fbd fix(FN-000): restore iOS terminal input by full-covering helper textarea
On iOS Safari/PWA, tapping the terminal opened the keyboard but typed
keys produced no output. Focus landed on a 1×1 opacity-0.01 helper
textarea overlapped by the xterm canvas, and capture-phase gesture
handlers re-focused on every tap — a combination iOS silently drops
input events on.

- On touch-primary devices, expand .xterm-helper-textarea to cover the
  entire terminal surface (100% × 100%, opacity 0, z-index 2) via
  @media (hover: none) and (pointer: coarse). Taps land on the
  textarea directly, so iOS grants keyboard + input events natively.
- Desktop keeps the 1×1 rule so xterm's canvas-level drag-to-select
  and mouse tracking continue to work.
- Revert onPointerDownCapture/onTouchStartCapture/onClickCapture back
  to bubble-phase onPointerDown/onTouchStart; capture phase was
  confusing iOS's focus attribution and is no longer needed now that
  taps reach the textarea directly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 10:42:44 -07:00
Fusion
b1d9d43d2e fix(FN-000): harden mobile terminal focus capture for soft keyboard 2026-04-18 21:17:01 -07:00
Fusion
453076f666 feat(FN-2075): merge fusion/fn-2075 2026-04-18 20:56:12 -07:00
Fusion
be8add9ef4 style(FN-1847): unify dialog overlay styling and add accessibility attributes
- Add role=dialog and aria-modal attributes to all modal dialogs for accessibility
- Standardize close button aria-labels across all modals
- Unify overlay backdrop-filter, z-index, and background styles in styles.css
- Add light theme overrides for non-standard overlay backgrounds
- Update AgentListModal tests to reflect new aria attributes
- Add changeset for @gsxdsm/fusion package
2026-04-15 20:44:40 -07:00
gsxdsm
208062b8b4 feat(FN-1765): merge fusion/fn-1765 2026-04-15 01:01:08 -07:00
Fusion
a51e75941c feat(FN-1862): add completion state tracking for onboarding
- Add markOnboardingCompleted() to set completedAt timestamp when user finishes onboarding
- Add isOnboardingCompleted() to check if onboarding was completed (vs dismissed)
- Update ModelOnboardingModal to call markOnboardingCompleted on successful completion
- Skip onboarding auto-open when already completed locally
- Add completion state tracking tests in ModelOnboardingModal.test.tsx
- Add model-onboarding-state unit tests
- Update useAuthOnboarding to check local completion state before auto-opening
- Document localStorage completion state tracking pattern in .fusion/memory.md
2026-04-14 23:44:40 -07:00
gsxdsm
42da5e80cb feat(FN-1748): merge fusion/fn-1748 2026-04-14 22:45:59 -07:00
gsxdsm
8c798952c4 feat(FN-1746): merge fusion/fn-1746 2026-04-14 10:58:57 -07:00
gsxdsm
4e33f55b23 feat(FN-1739): merge fusion/fn-1739 2026-04-14 10:29:21 -07:00
gsxdsm
745c9c7ff4 feat(FN-1602): merge fusion/fn-1602 2026-04-12 19:16:15 -07:00
gsxdsm
29255a4a6a feat(FN-1276): scope dashboard persistence by project
- Add a project storage utility with scoped key helpers and key inventories for global vs project state
- Scope dashboard/task view, list preferences, quick-entry drafts, agent/tree state, terminal tabs, usage view, and modal draft persistence to projectId
- Reload persisted UI state when project context changes so per-project settings and drafts do not leak across projects
- Update and expand dashboard tests, including new projectStorage coverage and scoped persistence regression fixes
2026-04-08 10:39:38 -07:00
gsxdsm
c43357937b fix(FN-1234): stabilize mobile terminal tab switching
- Add session-aware terminal fit/resize logic so deferred viewport callbacks only affect the active tab session
- Trigger a post-init re-fit when keyboard overlap is already present during async xterm initialization
- Guard data, scrollback, and exit handlers to prevent stale session output from writing into a newly active tab
- Add FN-1234 regression tests for mobile tab switching with keyboard overlap, resize propagation, and scrollback isolation
2026-04-08 07:30:32 -07:00
gsxdsm
9a332c4b61 fix(FN-1135): retry xterm imports when MIME errors occur
- Add retryDynamicImport helper in TerminalModal with targeted retry detection for MIME type and dynamic import fetch failures
- Retry xterm module imports with backoff delays (500ms, 1500ms, 3000ms) and preserve original error reporting when retries are exhausted
- Add TerminalModal tests covering successful retry recovery, exhausted retry fallback to init error UI, and no-retry behavior for non-retryable failures
- Add a changeset patch for @gsxdsm/fusion describing the terminal initialization fix
2026-04-07 22:50:17 -07:00
gsxdsm
4097d9d250 feat(FN-1021): stabilize terminal first-open bootstrap and WebSocket recovery
- Harden TerminalModal bootstrap to handle invalid/expired sessions on first open
- Add WebSocket reconnection logic for terminal sessions that become invalid mid-stream
- Create useTerminal hook with robust session lifecycle management
- Create useTerminalSessions hook for multi-session terminal coordination
- Add comprehensive tests for TerminalModal, useTerminal, and useTerminalSessions
- Document terminal first-open reliability behavior in dashboard README
2026-04-07 00:20:12 -07:00
gsxdsm
1c232a17c4 fix(FN-1043): fix terminal mobile keyboard layout
- Defer fitAddon.fit() via requestAnimationFrame after CSS repaint to ensure container dimensions are settled
- Add overflow:hidden to keyboard-open CSS rule to prevent layout shift
- Add regression tests for xterm re-fit on mobile keyboard open/close
- Update terminal mobile keyboard documentation in README files
2026-04-06 21:35:46 -07:00
gsxdsm
db4aa3a7c7 fix(FN-1002): lower iOS Safari keyboard detection threshold for mobile reliability
- Lower virtual keyboard detection threshold from 150px to 80px to reduce missed detections on modern iOS Safari
- Add 30px noise filter to ignore minor viewport fluctuations that aren't real keyboard events
- Add comprehensive threshold boundary tests (80px/30px) covering edge cases for keyboard show/hide detection
2026-04-05 19:10:19 -07:00
gsxdsm
169acbc7a2 feat(FN-959): add --overlay-padding-top CSS variable to reposition modal on mobile keyboard open
- Add --overlay-padding-top CSS custom property to modal overlay styles
- Update TerminalModal component to apply dynamic padding-top when mobile keyboard is detected
- Add regression tests verifying overlay padding-top behavior with keyboard events
2026-04-05 11:19:38 -07:00
gsxdsm
bf84bea5a0 fix(FN-967): add activeTab to TerminalModal xterm init effect dependencies 2026-04-05 10:20:57 -07:00
gsxdsm
c79aec6d3e fix(FN-962): clean up worktrees on retry and fix branch suffix mismatch
When tasks fail and retry, the old worktree lingered on disk and the new
worktree got a random name causing worktrunk to report it as unassigned.
Now: retry clears worktree/branch fields, removes old worktree from disk,
and createWorktree returns the actual branch name (including -2 suffixes)
so task.branch always matches reality.

Also fixes pre-existing test failures: Terminal WebSocket mock sessions
missing lastActivityAt, and TerminalModal keyboard overlap tests leaking
cached _initialViewportHeight between tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 10:09:14 -07:00
gsxdsm
818f5786bd fix(FN-872): fix mobile keyboard overlap in TerminalModal
- Detect real mobile keyboards via visual viewport resize events instead of relying on unreliable CSS env() variables
- Handle bothPortrait and landscape keyboard orientations with appropriate padding adjustments
- Add iOS Safari workarounds: scroll reset on open, touch-action isolation, inert body scroll blocking
- Add comprehensive regression tests (432 lines) covering viewport resize, orientation changes, iOS Safari quirks, and edge cases
- Update README with refined mobile keyboard handling documentation
2026-04-04 22:54:13 -07:00
gsxdsm
8ad3a121b1 feat(FN-928): scroll terminal into view when mobile keyboard opens
- Detect mobile viewport resize in TerminalModal to infer keyboard open/close
- Use visualViewport API and smooth scroll to keep terminal visible on mobile
- Add tests for scroll behavior with mobile keyboard open/close scenarios
2026-04-04 21:21:32 -07:00
gsxdsm
025b639d92 fix(FN-948): restructure xterm init guard to allow reinit on modal reopen
- Fix terminal failing to render when TerminalModal is closed and reopened
- Restructure xterm initialization guard so Terminal instance and addons are recreated on subsequent opens
- Add regression test suite covering mount/unmount/remount, dispose behavior, and scrollback preservation
2026-04-04 19:01:46 -07:00
gsxdsm
83b709b4e6 fix(FN-930): fix terminal WebSocket reconnection stale closure bug
- Add activeTab and connectionStatus to the subscription effect dependency array in TerminalModal
- Ensures WebSocket reconnects properly when terminal tab is reactivated or connection status changes
2026-04-04 14:19:24 -07:00
gsxdsm
10e86d63f7 feat(FN-881): add bounded bootstrap timeouts and xterm init watchdog
- Add bounded bootstrap timeouts with stale-result guards to useTerminalSessions hook
- Implement xterm init watchdog with distinct recovery path for terminal initialization failures
- Refactor TerminalModal component with improved error handling and timeout recovery
- Add comprehensive test suites for useTerminalSessions hook and TerminalModal component
- Update dashboard README with watchdog documentation
2026-04-04 10:48:23 -07:00
gsxdsm
6c3f540e0e fix(FN-868): add terminal bootstrap error handling with retry and improve workflow step manager
- Add bootstrap error state and retry logic to useTerminalSessions hook to prevent indefinite 'Starting terminal' hang
- Add error/retry UI states in TerminalModal component with CSS styling
- Add tests for useTerminalSessions bootstrap error and retry behavior
- Refactor WorkflowStepManager with template support and improved UX
- Extract CSS from inline styles to stylesheet for terminal and workflow components
- Document terminal startup error handling and non-hanging guarantee in dashboard README
2026-04-04 07:11:40 -07:00
gsxdsm
c1f5e4bb4f fix(FN-842): fix new-tab xterm lifecycle for immediate output rendering
- Fix xterm terminal lifecycle so new tabs render output immediately instead of showing blank
- Refactor terminal management: move open/close logic from AgentsView to AgentDetailView per-tab
- Simplify AgentsView and AgentListModal to delegate terminal creation to individual agent tabs
- Update TerminalModal to handle xterm init/resize lifecycle correctly
- Add regression tests for new-tab behavior while modal is already open
- Update README terminal section with new-tab rendering behavior docs
2026-04-04 06:28:02 -07:00
gsxdsm
1d45cdb82b feat(FN-830): add mobile keyboard-aware terminal positioning
- Implement visual viewport API to reposition terminal above on-screen keyboard
- Add smooth CSS transition for terminal modal height changes on mobile
- Add comprehensive regression tests for keyboard overlap and resize behavior
- Remove stale test files (NewTaskModal, TaskForm) and clean up ActivityLogModal tests
- Document mobile keyboard handling approach in dashboard README
2026-04-04 00:19:40 -07:00
gsxdsm
603a04e312 feat(FN-802): route script launches through TerminalModal instead of ScriptRunDialog
- Route saved script launches from App.tsx directly into TerminalModal, removing the ScriptRunDialog component entirely
- Add openGeneration handling and initialCommand support to TerminalModal for reliable script execution
- Add openGeneration to initialCommand effect dependencies to prevent stale closures
- Remove 114 lines of now-unused styles.css rules related to ScriptRunDialog
- Update tests: replace ScriptRunDialog tests with TerminalModal execution tests, update App routing tests
- Update README to document terminal-based script launch behavior
2026-04-03 20:47:41 -07:00
gsxdsm
be89cb3581 fix(FN-759): restructure terminal header for mobile and add regression tests
- Restructure TerminalModal header layout to support mobile viewports with proper flex sizing
- Add CSS styles for responsive terminal header with title truncation and icon wrapping
- Add inline comment documenting mobile header layout contract
- Add comprehensive TerminalModal test suite covering mobile layout, resize behavior, and header interactions
- Clean up unrelated store test and changeset remnants from prior work
2026-04-02 22:59:37 -07:00
gsxdsm
05f2114743 fix(FN-000): scope dashboard project flows 2026-04-02 17:51:04 -07:00
gsxdsm
1d133afeb9 feat(FN-682): add multi-tab terminal support with session persistence
- Add useTerminalSessions hook for managing multiple terminal sessions
- Update TerminalModal to support multiple tabs with persistent sessions
- Fix memory leak in useTerminalSessions (proper cleanup on unmount)
- Fix type leak (avoid exposing internal session state)
- Add comprehensive test coverage for useTerminalSessions hook
- Update TerminalModal tests for multi-tab behavior
- Remove obsolete test files and highlightDiff utility
2026-04-02 10:22:31 -07:00
gsxdsm
dbfb8bc1d9 feat(KB-608): complete integration testing and fix terminal race condition
- Add comprehensive TerminalModal tests covering initialization race condition
- Update SettingsModal tests for new behavior
- Fix terminal initialization race condition in TerminalModal
- Remove obsolete test files (board.test.ts, useToast.test.tsx, modelFilter.test.ts, agent-heartbeat.test.ts)
- Clean up old changeset files for resolved issues
- Add changeset for dashboard terminal fix
- Minor CLI command and store improvements
2026-03-31 17:50:16 -07:00
gsxdsm
0e61a45d72 feat(KB-141): fix workspace type resolution and add clean-checkout typecheck tests
- Remove dist-dependent workspace type resolution from all tsconfig files

- Add clean-checkout typecheck regression test to CI suite

- Update package.json type definitions for core, engine, dashboard, and cli packages

- Update README with typecheck testing documentation

- Clean up unused test files and component dependencies
2026-03-30 08:24:16 -07:00
gsxdsm
93cda8fe25 fix(KB-058): resolve API naming conflict and TypeScript errors 2026-03-29 23:35:32 -07:00
gsxdsm
0510f0f7a9 feat(KB-058): complete Steps 5 & 6 — xterm.js TerminalModal and styling 2026-03-29 23:28:52 -07:00
gsxdsm
6393d74787 feat(KB-057): add interactive terminal to dashboard
- Add backend terminal API with session management and SSE streaming
- Create useTerminal hook for command execution and history navigation
- Implement interactive TerminalModal with real-time output display
- Add terminal button to Header for quick access
- Style terminal with CSS variables and responsive design
- Add keyboard shortcuts (Ctrl+C to kill, Ctrl+L to clear, arrow keys for history)
- Add security validation for shell commands
2026-03-29 21:11:08 -07:00
gsxdsm
bfd3343be4 feat(KB-057): add interactive terminal to dashboard
- Add backend terminal API with SSE streaming for real-time output
- Create useTerminal hook with command history and navigation
- Refactor TerminalModal into interactive shell component
- Update App and Header for standalone terminal button
- Add CSS styles for terminal UI (prompts, output, spinner, welcome screen)
- Update tests for new terminal behavior
2026-03-29 21:09:57 -07:00
gsxdsm
b8de98cc6d feat(KB-057): complete Step 3 — TerminalModal component with interactive shell UI 2026-03-29 20:59:31 -07:00
gsxdsm
3b71d032a6 feat(KB-048): add collapsible list sections to dashboard
- Add section expansion state management with localStorage persistence
- Update section headers with chevron toggle controls
- Implement conditional task row rendering based on section state
- Add Expand All / Collapse All toolbar controls
- Add CSS styles for chevron rotation animation and section headers
- Add comprehensive tests for collapsible section behavior
2026-03-29 19:51:41 -07:00