Commit Graph

14 Commits

Author SHA1 Message Date
Matt Toohey e2fa4e8619 fix: prevent horizontal scrolling in sidebar nav (#14)
When overflow-y is set to auto, browsers implicitly set overflow-x to
auto as well, creating an unwanted horizontal scrollbar. Explicitly set
overflow-x-hidden on the sidebar nav element.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 10:52:50 +11:00
Matt Toohey c6739f6327 fix: settings modal X button not dismissing dialog (#13)
The content div overlapped the absolutely-positioned close button,
intercepting click events. Adding z-10 ensures the button stays above
the content layer.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 10:44:44 +11:00
Wes 5b1a8ba0c3 feat: add ACP client integration for multi-agent support (#12)
* feat: add ACP client integration for multi-agent support

Port the acp-client crate from builderbot and integrate it into the
goose2 Tauri app. This enables connecting to ACP-compatible agents
(Goose, Claude Code, Codex, Pi, Amp) over stdio.

Rust backend:
- acp-client crate: AcpDriver, MessageWriter/Store traits, agent
  discovery, session management with replay, !Send workaround
- services/acp.rs: TauriMessageWriter (streams via events),
  TauriStore (session persistence), AcpService
- commands/acp.rs: discover_acp_providers, acp_send_message

Frontend:
- api/acp.ts: provider discovery + message sending
- useAcpStream.ts: Tauri event listener for streaming responses

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: wire ACP chat flow with default Goose agent

- Create default Goose ACP agent on first launch (auto-selected)
- Replace mock chat with real ACP routing in useChat
- Enable useAcpStream in ChatView for streaming responses
- Add 13 tests for ACP streaming + default agent creation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: nested button hydration error and streaming text accumulation

- TabBar: restructure tab as div[role=tab] with span close target to
  eliminate button-inside-button HTML violation
- useAcpStream: accumulate text chunks in a ref before passing to
  updateStreamingText, so the full text is displayed instead of only
  the last chunk
- useChat: remove unused biome suppression comment

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: resolve three critical ACP messaging bugs

1. Parameter name mismatch: use snake_case keys in Tauri invoke
   to match Rust function parameter names
2. Premature cleanup: don't clear streamingMessageId in finally
   block — acpSendMessage returns immediately (Rust runs in bg),
   let useAcpStream handle cleanup on acp:done event
3. Timing race: enable useAcpStream when streamingMessageId is set
   (not chatState), so listener is active before events arrive

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: resolve three ACP streaming bugs

- Use camelCase params in acp_send_message invoke (Tauri 2 default)
- Always enable useAcpStream listener to avoid missing events
- Clear streamingMessageId on non-abort errors to unstick UI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: extract duplicate findLastIndex to shared utility

Both chatStore.ts and useChat.ts had identical findLastIndex helper
functions. Extracted to src/shared/lib/arrays.ts following the existing
shared/lib pattern (cn.ts).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: remove binaryPath from AcpProvider, rewrite hook tests

- Remove binaryPath from AcpProvider interface (backend only sends id/label)
- Rewrite useAcpStream tests to mock Tauri listen() and use renderHook()
- Tests now verify actual hook behavior: event dispatch, session filtering,
  text accumulation, cleanup on unmount, enabled flag

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add markdown rendering and fix UI spacing to match goose-spence

Add MarkdownContent component with syntax highlighting, GFM support,
and copy-to-clipboard on code blocks. Update MessageBubble, ThinkingBlock,
and MessageTimeline to use markdown rendering and proper spacing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: correct inline code detection for react-markdown v9 and add dark mode prose support

Remove deprecated `inline` prop and detect block code via language class or newline content.
Add `dark:prose-invert` so prose text is readable in dark mode.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add AcpSessionRegistry for robust process lifecycle management

Prevents dangling `goose acp` processes by tracking running ACP sessions
with CancellationTokens, cancelling all on app exit, and cleaning up
stale session files on startup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix cargo fmt formatting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 15:57:13 -07:00
Wes fde43f3038 Replace default Tauri icons with Goose app icon (#11)
* Replace default Tauri icons with Goose app icon

Copied the goose silhouette icon from the goose desktop app into all
Tauri icon slots (macOS, Windows, iOS, Android) so the app displays
the correct brand icon.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add proper padding to app icon for correct dock sizing

The icon was filling the entire canvas edge-to-edge, making it appear
~25% larger than other apps in the dock and Alt+Tab bar. Added ~10%
transparent padding on each side following Apple's icon guidelines.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 15:39:09 -07:00
Wes 3b8baf07e3 fix: persona & skill dialog layouts + drag-and-drop on new cards (#9)
* fix: persona & skill dialog layouts + drag-and-drop on new cards

Restructure PersonaEditor and CreateSkillDialog to use fixed
header/footer with a scrollable middle area so action buttons
stay visible. Add useFileImportZone hook and wire drag-and-drop
file import onto the "New Persona" and "New Skill" cards.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test: update SkillsView empty state text assertion

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 15:39:01 -07:00
Wes a088b17b80 feat: personas & skills — rename, import/export, creation, and layout fixes (#8)
* feat: personas, skills, and import/export improvements

- Rename "Agents" to "Personas" across the UI (sidebar, headings, descriptions)
- Load markdown persona files from ~/.goose/agents/ on startup with periodic
  refresh (60s interval + window focus), parsed from YAML frontmatter + body
- Implement persona import/export matching sprout's .persona.json v1 format
  with export from card menu and import via file picker
- Implement "New Skill" creation dialog with kebab-case validation, writing
  SKILL.md files to ~/.goose/skills/{name}/
- Add backend path traversal protection for skill name validation
- Fix persona creation to persist through backend API (was local-only)
- Fix import to refresh from backend instead of creating store duplicates
- Disable delete button for disk-loaded personas in the UI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add edit, duplicate, export, and import for skills

- Add update_skill backend command to edit existing SKILL.md files
- Add export_skill command returning sprout-compatible .skill.json format
- Add import_skills command with file validation and name collision handling
- Convert CreateSkillDialog to support edit mode (read-only name, pre-filled fields)
- Add dropdown menu on skill cards with Edit, Duplicate, Export, Delete
- Add Import button with file picker on Skills page
- Duplicate generates unique {name}-copy suffix

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: make skills and personas pages fill full height with proper scrolling

Both pages now use flex column layout with h-full to fill the parent
container, and an inner scrollable wrapper with overflow-y-auto for
content overflow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix cargo fmt and clippy warnings

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: delete persistence, confirmation dialogs, and export notifications

- Fix persona deletion to persist via backend API (was local-only)
- Add delete confirmation dialog for both personas and skills
- Show export notification toast with filename after successful export

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: hide delete option for built-in and disk-loaded personas

Instead of showing a disabled delete button, hide it entirely for
personas that can't be deleted (built-in and markdown-loaded).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test: update PersonaCard test for hidden delete on built-in personas

The delete menu item is now hidden (not disabled) for built-in and
disk-loaded personas, so the test checks it's absent rather than disabled.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test: add comprehensive tests for skills and persona features

- CreateSkillDialog: 17 tests (rendering, name validation, edit mode, form submission)
- SkillsView: 11 tests (rendering, search, card menu, delete confirmation)
- usePersonas hook: 6 tests (loading, CRUD, refresh)
- Agents API: 3 tests (export, import, refresh invoke calls)

Total test count: 100 → 137

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 14:31:33 -07:00
renovate[bot] aed88d7242 chore(deps): update actions/cache action to v5 (#6)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-30 14:10:28 -07:00
Wes cca7907ef3 feat: chat experience preparation — UI components, stores, and goose2.0 visual match (#7)
* feat: chat experience preparation — UI components, stores, and goose2.0-style chat input

Add chat and agent management UI infrastructure without ACP protocol implementation:
- Rich chat UI: ChatInput (matching goose2.0 design with mode/model/folder pickers),
  MessageBubble, MessageTimeline, StreamingIndicator, ThinkingBlock, ToolCallCard
- Agent/Persona management: PersonaCard, PersonaEditor, PersonaGallery, AgentConfig
- Zustand stores for chat state, agent state, session management
- Rust backend: persona CRUD, session storage, sidecar management commands
- Shared UI primitives: DropdownMenu, Tooltip, Popover (Radix UI)
- Type system for messages (text, images, tool calls, thinking, reasoning)
- Fix Agents page spacing to match Skills page layout

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: match goose2.0 visual design — theme colors, message styling, and UI polish

- Update theme colors to pure monochrome (remove blue-gray tint) matching goose2.0
- Restyle MessageBubble: remove bubble backgrounds, right-align user messages,
  smaller avatars, dimmed agent text, hover-reveal actions
- Restyle ToolCallCard as compact inline pills with status colors and elapsed time
- Restyle ThinkingBlock with brain icon circle and left-border content indent
- Fix tab close button right padding (px-3 → pl-3 pr-1.5)
- Replace hardcoded "WB" initials with generic User icon in sidebar

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: resolve Rust fmt and clippy dead_code warnings for CI

Allow dead_code on preparation types/methods that will be wired up
when ACP integration lands.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use getByPlaceholderText in E2E test for chat input

The placeholder text is an HTML attribute, not visible text content,
so getByText doesn't find it. Switch to getByPlaceholderText.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use CSS selector for placeholder text in E2E smoke test

getByPlaceholderText is not available in this Playwright version.
Use locator with attribute selector instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 10:31:32 -07:00
renovate[bot] e6750f0d95 chore(deps): update all non-major dependencies (#5)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-30 10:25:23 -07:00
Wes ea7d712cf0 feat: add Skills and Agents pages with sidebar navigation (#4)
- Add SkillsView and AgentsView stub pages matching goose2.0 layout
  (title left, action button right, search bar, empty state)
- Add MainPanelLayout shared component for page layout
- Add SearchBar shared component for page-level search
- Add page-transition CSS animation (matching goose2.0)
- Add storage path constants (~/.goose/)
- Wire up sidebar nav items (Agents, Skills) with view routing
- Add AppView type and view state management to AppShell
- Sidebar active state uses subtle bg-background-secondary treatment
2026-03-29 20:34:23 -07:00
Wes efec8897d2 feat: port floating sidebar from goose2.0 (#3)
* feat: port floating sidebar from goose2.0

- Rewrite Sidebar.tsx with floating panel design (backdrop blur, rounded corners, shadow)
- Smooth collapse/expand animation (48px ↔ 240px) with staggered label transitions
- Search bar morphs between icon-only and full bar with ⌘K badge
- Nav items with staggered fade-in animation delays
- Collapsible recent chats section
- User avatar footer as settings trigger
- GooseIcon SVG in header (replaces emoji)
- Update AppShell layout: sidebar wrapped in padding div for floating effect
- Add ⌘B keyboard shortcut for sidebar toggle
- All color tokens mapped to goose2 design system

* fix: add missing GooseIcon and GooseLogo files

* fix: remove duplicate sidebar toggle, fix traffic lights on blur

- Remove PanelLeft sidebar toggle from TabBar (sidebar has its own toggle)
- Add solid background behind macOS traffic light area so window controls
  remain visible when the window loses focus
- Clean up unused onSidebarToggle prop from TabBar/AppShell

* fix: make TabBar fully opaque so macOS traffic lights stay visible on blur

The previous fix added a solid background div behind the traffic light
area, but it rendered within the semi-transparent parent context
(bg-background/80 backdrop-blur-sm). The OS compositor still saw
transparency and hid the traffic lights on window blur.

Simply making the TabBar background fully opaque fixes this properly.

* fix: clean up nav items, subtle ⌘K badge, remove backdrop-blur for traffic lights

- Nav items: keep only New Chat, Agents, Skills (removed Tasks, Artifacts, Apps)
- ⌘K badge: lighter text color (foreground-secondary/40), no background
- Sidebar: remove backdrop-blur-xl and make bg fully opaque — fixes macOS
  traffic lights disappearing on window blur

* fix: improve sidebar border contrast in dark mode

In dark mode, border-primary (#3f434b) and background-secondary (#3f434b)
are identical, making sidebar dividers and the search border invisible.

Switched all internal sidebar borders/dividers to border-secondary (#525b68)
which provides clear contrast against the sidebar background in both themes.

* fix: align dark mode palette with goose2.0

Updated dark mode color tokens to match goose2.0's much darker palette:
- background-primary: #22252a → #0d0d0d (near black, was too light)
- background-secondary: #3f434b → #141414 (sidebar, card-like)
- background-tertiary: #474e57 → #262626 (muted surfaces)
- Borders, text, and ring colors adjusted accordingly
- This also fixes the dark mode border visibility issue since
  border-primary (#262626) is now distinct from background-secondary (#141414)

* fix: revert custom traffic light code, rely on Tauri's built-in trafficLightPosition

The custom Rust code that called setHidden:NO on focus events was
interfering with Tauri's native traffic light positioning, causing
them to shift down. Removed the custom code entirely — Tauri's
trafficLightPosition config in tauri.conf.json handles positioning
correctly on its own.
2026-03-29 14:00:45 -07:00
Wes 70acf22cb8 feat: scaffold Goose2 desktop app with full UI and testing infrastructure (#2)
* feat: scaffold Tauri + React app with window dragging and app icon

Sets up the goose2 desktop app with:
- Tauri 2 + React 19 + Vite + Tailwind CSS
- Custom titlebar with drag-to-move and double-click maximize/restore
- Window state persistence via tauri-plugin-window-state
- App icon ported from goose-desktop (cyan/amber yin-yang design)
- Theme system with dark/light/system modes
- Hermit toolchain (node, pnpm, biome, just, lefthook)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add app shell layout with tabs, sidebar, and status bar

Adds the main application layout ported from goose2.0's visual design:
- TabBar with session tabs, home button, and sidebar toggle
- Collapsible sidebar with smooth width transition
- Status bar with model name, token count, and status indicator
- AppShell component wiring everything together

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add settings modal with theme section + quality fixes

Settings:
- Settings modal with sidebar nav (Appearance, General, About)
- Theme selector (Light/Dark/System) wired to ThemeProvider
- Accent color picker and density selector (visual placeholders)
- Open via Cmd+, or Settings button in sidebar

Quality fixes:
- Fix stale state bug in tab close handler
- Fix unreachable useTheme guard, add OS theme change listener
- Improve accessibility (ARIA roles, labels, semantic elements)
- Add prefers-reduced-motion support
- Extract shared Tab type to features/tabs/types.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: remove references to nonexistent theme-tokens module

The previous commit introduced imports for a theme-tokens module
that doesn't exist. Remove those imports and define the needed
types locally in ThemeProvider.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: wire up accent colors and density, add AGENTS.md

Theming:
- ThemeProvider now manages accent color and density (persisted to localStorage)
- Accent color applied via --color-accent CSS variable on :root
- Density applied via --density-spacing CSS variable (multiplier)
- AppearanceSettings uses ThemeProvider context instead of local state
- Tailwind config maps accent color variable
- Settings modal animations enhanced to match goose2.0 reference
- Component classes updated to use semantic token names

Documentation:
- AGENTS.md captures all project conventions, patterns, and decisions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: replace ambiguous Tailwind arbitrary durations with config values

Add duration-400 and duration-600 to Tailwind config to avoid
ambiguous class warnings from arbitrary value syntax.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: sidebar minimizes to icon strip instead of hiding

The sidebar now shrinks to a 48px icon-only column when toggled,
instead of disappearing completely. Icons stay visible with tooltips,
labels and section headers are hidden. Smooth width transition.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: improve settings button alignment and styling in sidebar

Match goose2.0's footer pattern with proper padding, full-opacity
border, flex alignment, and smooth transition between states.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add home screen with clock, greeting, and hidden status bar

Home screen shows a live digital clock, time-based greeting, and
placeholder chat input. Status bar hides when on the home view
(no active tab), matching goose2.0's clean home experience.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: improve home screen to match goose2.0, add chat view

Home screen: large mono clock with AM/PM, time-based greeting,
goose2.0-style chat input (rounded-2xl, shadow-lg, model badge).
Chat view: input at bottom with scrollable messages area.
Home vs chat differentiated by active tab state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: chat view now fills the full available height

Remove flex from main element so child components can properly
resolve h-full against the block parent.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add testing infrastructure (Vitest, Playwright, CI)

Testing:
- Vitest for unit/component tests with jsdom + React Testing Library
- 13 tests across 3 test files (ThemeProvider, cn utility, HomeScreen)
- Playwright for E2E smoke tests (4 tests)
- Test setup with matchMedia mock for jsdom

Tooling:
- Just targets: test, test-watch, test-coverage, test-e2e
- Lefthook pre-push now runs unit tests
- CI gate includes tests

CI/CD:
- GitHub Actions workflow with 4 jobs: lint, test, desktop, rust-lint
- Playwright artifacts uploaded on failure
- Rust caching for faster builds

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: resolve all Biome formatting and lint issues

Auto-format all files with Biome. Fix lint issues:
- Add type="button" to all interactive buttons
- Replace span[role=button] with proper button element
- Add dialog role to settings modal
- Biome-ignore for standard accessibility !important pattern

All checks pass: pnpm check, pnpm test, pnpm build.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: add src-tauri/target/ to .gitignore

Prevent Rust/Tauri build artifacts from being committed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: exclude Tauri generated schemas from Biome formatting

* chore: update .gitignore for full project coverage

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: pin CI actions to commit SHAs for Semgrep compliance

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: resolve CI failures and improve lefthook auto-formatting

- Fix dtolnay/rust-toolchain action SHA (was invalid, causing all Rust
  CI jobs to fail)
- Fix Biome folder ignore pattern (remove trailing /**)
- Update lefthook pre-commit to auto-format with biome instead of
  just checking

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use vite preview directly with explicit host for E2E server

The Playwright webServer was using `pnpm preview --port 4173` which
invoked vite preview without --host, causing it to bind to localhost
(IPv6 ::1) instead of 127.0.0.1. This caused ERR_CONNECTION_REFUSED
in CI and locally. Switch to npx vite preview with --host 127.0.0.1
and --strictPort to ensure reliable binding.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: gracefully handle non-Tauri browser environment

Check for Tauri runtime before calling window APIs so the app
renders correctly in browser-based E2E tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: make E2E smoke tests more robust with longer timeouts

- Add 10s timeout for element visibility (CI can be slow to render)
- Use .first() for model badge to handle multiple matches
- Fix strict mode violation for duplicate text matches

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: smooth transition for status bar show/hide

Status bar now slides and fades in/out with a 300ms transition
instead of appearing/disappearing abruptly when switching views.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use dynamic import for Tauri API to prevent browser crash

Static import of @tauri-apps/api/window fails at module load time
in non-Tauri environments. Use dynamic import() guarded by
__TAURI_INTERNALS__ check so the app renders in Playwright.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use python http.server for E2E tests, start with empty tabs

Switch Playwright webServer from npx vite preview to python3 http.server
for more reliable static file serving in CI. Start app with no tabs
open (home screen by default).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: align E2E setup with Sprout's proven configuration

- Use url instead of port for webServer readiness check
- Remove -b 127.0.0.1 flag from python http.server command
- Add explicit cwd to webServer config
- Use pnpm exec instead of npx for Playwright in CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: remove unused @tauri-apps/plugin-opener JS dependency

The Rust-side tauri-plugin-opener is still registered, but the JS
binding package was never imported from frontend code. Removing it
keeps the dependency list honest. Dark mode colors already match
goose2.0 — no changes needed there.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 09:34:05 -07:00
block-open-source[bot] c4c3728da7 prepare repo template 2026-03-27 16:44:20 +00:00
block-open-source[bot] afe8ca67cd Initial commit 2026-03-27 16:44:17 +00:00