Skip to content

feat(add-host-flag): added host flag as per readme#3

Open
wreed4 wants to merge 81 commits into
GarrickZ2:masterfrom
wreed4:add-host
Open

feat(add-host-flag): added host flag as per readme#3
wreed4 wants to merge 81 commits into
GarrickZ2:masterfrom
wreed4:add-host

Conversation

@wreed4
Copy link
Copy Markdown

@wreed4 wreed4 commented Feb 19, 2026

No description provided.

GarrickZ2 and others added 30 commits February 13, 2026 14:05
feat: send second reminder when task is not submitted
### Changes

**1. Professional Wording for Prompts**
- Updated all dialog messages to use professional, clear language
- Replaced casual terms with technical accuracy:
  - "Worktree" → "Working tree"
  - "They will be LOST" → "These changes will be permanently lost upon archiving"
  - "Cannot check" → "Unable to verify"
  - "Archive anyway?" → "Proceed with archiving?"
- Added warning symbols (⚠) for critical information
- Unified wording between TUI and Web frontend

**2. Code Refactoring**
- Created shared types in `grove-web/src/api/types.ts`
- Created error handling helpers in `grove-web/src/utils/archiveHelpers.ts`
- Refactored BlitzPage and TasksPage to use shared utilities
- Added helper methods to `ArchiveConfirmResponse` in Rust backend
- Eliminated ~150 lines of duplicate code

**3. Improvements**
- Better type safety with shared type definitions
- Improved maintainability by reducing code duplication
- Enhanced user experience with clear, professional messaging
- Consistent UX across TUI and Web interfaces

### Impact
- No functional changes
- All tests passing
- Better code organization and readability

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
添加 AutoLink 功能,在创建 worktree 时自动创建软链接,解决以下问题:
- node_modules 等依赖文件夹需要重新安装
- IDE 配置(.vscode, .idea)不会复制
- 构建产物(target, dist)需要重新生成

- 添加 AutoLinkConfig 结构到配置系统
  - enabled: 是否启用(默认 true)
  - patterns: Glob 模式列表(支持 *, **, ?)
  - check_gitignore: 仅链接被 gitignore 的路径(默认 true)
- 实现 git::is_gitignored() 检查路径是否被 git ignore
- 实现 git::create_worktree_symlinks() 核心功能
  - 使用 globset 库进行高性能 glob 匹配
  - 使用 walkdir 递归遍历主仓库
  - 跨平台支持(Unix/Windows)
  - 自动创建父目录
  - 失败不阻塞 worktree 创建
- 集成到 create_new_task() 流程
- API 层支持(GET/PATCH /api/v1/config)

- 更新 Config 和 ConfigPatch 类型
- 实现 AutoLink Settings Section UI
  - 启用/禁用开关
  - Check Git Ignore 开关
  - 动态模式列表管理(添加/删除)
  - 快速添加预设按钮
  - Glob 语法帮助文档
- 自动保存配置(500ms 防抖)

- 添加 globset 0.4 (glob 模式匹配)
- 添加 walkdir 2 (递归目录遍历)

默认启用并包含以下模式:
- node_modules, **/node_modules
- .vscode, .idea, .fleet
- target, dist, build
- .next, .nuxt

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
简化 AutoLink 配置,移除可选开关,将 UI 移到 Development Tools Section:

## 后端变更
- 移除 AutoLinkConfig.enabled 和 check_gitignore 字段
- AutoLink 始终启用,始终检查 gitignore
- 仅保留 patterns 字段用于配置 glob 模式
- 更新 API DTO,移除相关字段

## 前端变更
- 删除独立的 AutoLink Section
- 将 AutoLink 移到 Development Tools Section 内部
- 移除 Enable AutoLink 和 Check Git Ignore 开关
- 保留完整的模式管理 UI(添加/删除/预设)
- 简化状态管理

## 用户体验改进
- AutoLink 默认启用,减少配置步骤
- 安全性提升:始终检查 gitignore,避免链接被 git 追踪的文件
- UI 更简洁,功能集中在 Development Tools

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Extract shared task operations (create, archive, recover, reset, merge, sync)
from TUI and Web API into new src/operations/tasks.rs module.

- Add src/operations/tasks.rs with 6 core operations (500 lines)
- Refactor src/app.rs to call operations layer (-132 lines)
- Refactor src/api/handlers/tasks.rs to call operations layer (-199 lines)
- Use existing GroveError/Result for uniform error handling
- Two-phase design for operations requiring session creation:
  * Phase 1: Core business logic (operations layer)
  * Phase 2: Session creation (TUI-specific, Web skips)

- Zero code duplication for business logic
- Single source of truth for task operations
- Easier maintenance (bug fix only needs one change)
- Type-safe error handling across TUI and Web
- Clear separation: Presentation vs Business Logic vs Infrastructure

1. merge_task: Merge task branch into target
2. sync_task: Sync task with target branch (rebase)
3. archive_task: Archive task (remove worktree, cleanup)
4. create_task: Create new task (worktree + branch + metadata)
5. recover_task: Recover archived task
6. reset_task: Reset task (delete + recreate from target)

- All TUI operations tested and working
- All Web API operations tested and working
- Git state consistency verified
- No behavior changes, only code organization
- cargo check: ✓ (no errors, no warnings)
- cargo clippy: ✓ (no warnings)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Extract shared task operation logic into reusable custom hooks to eliminate
77% code duplication (~850 lines) between BlitzPage and TasksPage.

Changes:
- Create 4 custom hooks for state management and operations:
  * useTaskPageState: page-level state (selection, view mode, panels)
  * useTaskNavigation: keyboard navigation (j/k keys)
  * usePostMergeArchive: post-merge archive workflow
  * useTaskOperations: all task operations (commit/merge/archive/sync/rebase/reset/clean)
- Create utility functions: buildContextMenuItems, task state checkers
- Refactor TasksPage: 1154 → 610 lines (-47%)
- Refactor BlitzPage: 1100 → 675 lines (-39%)
- Preserve mode-specific features (Zen: create/recover, Blitz: drag-drop/shortcuts)
- Update CLAUDE.md with hooks architecture documentation

Benefits:
- Single source of truth for all task operations
- Easier maintenance (bug fixes in one place)
- Full TypeScript type safety maintained
- Better code reusability and testability

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…rmance

Large repositories with many remote branches cause slow loading times. This change implements lazy loading of remote branches with a cleaner UI:

- Backend: Added `remote` query parameter to branch APIs (local/origin/upstream)
- Frontend: Remote branches loaded on-demand via collapsible button list
- Automatic folder expansion on first open, user-controlled thereafter
- Filter invalid remote branch names (must match remote/branch format)
- Auto-update task target branches when switching in main repo

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
主要优化:
- 扩展 FileChanges 结构,新增 files_changed 字段
- file_changes() 零成本返回文件数量(无额外 git 调用)
- 删除 projects.rs 中重复的 diff_stat 调用
- 并行化 worktree_to_response 处理(使用 rayon)
- 异步刷新前端项目列表(不阻塞 UI)

性能提升:
- Get Project: 1600ms → 480ms(提速 70%,约 3.3 倍)
- Convert to response: 1200ms → 80ms(提速 93%,约 15 倍)

次要改动:
- 添加 AutoLink TUI 配置面板(a/e/d 快捷键)
- 配置去重逻辑(normalize)
- 添加 rayon 依赖用于并行处理

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Release version 0.5.0 with the following updates:

- Add comprehensive CHANGELOG entry covering all changes from v0.4.13 to HEAD
- Update docs/index.html version references to v0.5.0
- Fix README.md image links (images were renamed, not deleted)
  * screenshot-hero.png → screenshot-hero.jpg
  * demo.gif → work.gif
  * All web-* and other renamed images updated to match current filenames

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…odel/mode support

Add full ACP (Agent Client Protocol) integration allowing Grove to spawn and manage
AI agent sessions. Features include:
- ACP session lifecycle management with broadcast-based event distribution
- WebSocket bridge for web frontend to communicate with ACP agents
- Dynamic model/mode switching via ACP native APIs (no session restart needed)
- Real-time Plan panel powered by ACP SessionUpdate::Plan notifications
- CLI `grove acp` command for interactive agent chat testing
- Config panel support for ACP agent settings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement ACP Terminal protocol so Agent (Claude Code) can execute
commands via terminal/create, terminal/output, wait_for_terminal_exit,
kill_terminal_command, and release_terminal. Commands are executed
through `sh -c` to support shell syntax (&&, pipes, PATH lookup).

Add `!` shell mode in TaskChat: typing `!` in empty input enters shell
mode (visual indicator + dedicated placeholder), Backspace/Escape exits.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Each ACP task can now have multiple independent chat sessions, each with
its own agent binding, WebSocket connection, and conversation history.

Backend:
- Add ChatSession struct + chats field on Task (with backward-compat migration)
- Per-chat CRUD API: list/create/update-title/delete at /tasks/{id}/chats
- Per-chat WebSocket at /tasks/{id}/chats/{chatId}/ws
- Session key includes chat_id for isolated ACP session management
- Live detection iterates over all chat sessions

Frontend:
- Chat header with dropdown selector (newest first), "+" new chat button
- Per-chat WebSocket connection pool with state cache on switch
- Double-click title to rename, delete via dropdown menu

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Support 9 built-in ACP agents (Claude, CodeX, Gemini, Copilot, Cursor,
OpenCode, Qwen, Kimi, Trae) with per-mode command availability checking.
Add CustomAgent system for user-defined local/remote agents with modal UI.

Backend: resolve_agent() maps agent IDs to ACP commands, remote WebSocket
transport via tokio-tungstenite, batch command check API, custom agents
persisted in config.toml.

Frontend: mode-aware AgentPicker with disabled state for missing commands,
CustomAgentModal for CRUD operations, dynamic "Connected to" display,
ACP Adapter section in Environment panel for Chat mode.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add @ file mention: type @ to search files with fuzzy matching,
  insert file path chips (warning color) distinct from /command chips
- Hide FileSearchBar in ACP chat mode (redundant with @ mention)
- Default plan panel to collapsed with always-visible progress (n/m)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Consolidate per-task data from scattered directories (notes/, review/,
activity/, ai/) into unified tasks/<task-id>/ folders. Add storage
version tracking and auto-migration on startup. Remove all legacy
format compatibility code, moving it to a dedicated migrate module.
Also add thought_chunk/permission_request support in TaskChat and
improve settings mode toggle UI.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add JSONL-based chat history persistence (chat_history.rs) with
  compaction: consecutive MessageChunk/ThoughtChunk merged, ToolCall +
  ToolCallUpdate merged preserving title
- Migrate chat metadata from tasks.toml to independent chats/chats.toml
  per task, remove task-level acp_session_id
- Suppress agent load_session replay, use Grove's own disk storage for
  all agents uniformly; send disk history immediately on WS connect
  (parallel with agent startup) for faster UI display
- Inject GROVE_* env vars into ACP agent subprocess for task context
- Add PermissionResponse event to persist user permission choices,
  so they display as resolved on history replay
- Fix duplicate tool display by using upsert semantics for tool_call
  events on the frontend
- Remove legacy task-level ws_handler route, clean up debug logs,
  simplify input placeholder text

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…d concurrent cancel

Implement a message queue on AcpSessionHandle so users can queue messages
while the agent is busy. The queue persists on the server, surviving browser
refreshes and reconnections. Key changes:

- Add pending_queue + queue_paused fields to AcpSessionHandle with full
  queue management API (queue/dequeue/update/clear/pause/resume)
- Use tokio::select! in command loop so Cancel is processed concurrently
  with prompt, fixing Stop and Send Now buttons
- Add QueueUpdate broadcast event and WebSocket message types
- Frontend: server-driven queue UI with edit/delete/send-now/clear-all,
  dynamic send button states, and always-editable input when connected

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Editable fields (Task Name, Notes) now use bg-color-bg (bright) to
indicate interactivity, while readonly fields (Target Branch, info box)
use bg-color-bg-secondary to visually recede.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove `chats_legacy` field and auto-migration from Task struct
- Remove `location` string fallback from review comment API
- Remove unused `migrateLayoutConfig` function from LayoutEditor
- Remove legacy uppercase pane type colors, unify presets to lowercase
- Clean up misleading "backward compatibility" comments

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
tokio-tungstenite native-tls depends on openssl-sys which fails
when cross-compiling to aarch64-unknown-linux-musl.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Integrate flexlayout-react for professional panel management
- Support Terminal, Chat, Review, Editor panel types
- Enable multiple instances per panel type with tabbed interface
- Implement drag-and-drop, split, resize, and maximize features
- Add custom FlexLayout theme matching Grove design system
- Separate BlitzPage and TasksPage for distinct layout requirements
- Share TaskInfoPanel and FlexLayoutContainer between both modes
- Refactor TaskToolbar to "Add" semantics for new panel instances
- Restore TaskView usage in both BlitzPage and TasksPage
- Fix test_default_session_type to match actual logic

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…plexer field

- Terminal endpoint now checks task.enable_terminal before connecting
- Falls back to global terminal_multiplexer config when task.multiplexer is invalid
- Handles legacy tasks with multiplexer="acp" but enable_terminal=true
- Returns friendly error when terminal is not enabled for task

Fixes issue where tasks with both Chat and Terminal enabled couldn't connect
to terminal when multiplexer field was set to "acp" instead of "tmux"/"zellij"

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…menu

Integrated Stats/Git/Notes/Comments tabs from TaskInfoPanel into FlexLayout
for unified multi-panel experience. Added right-click context menu for tab
management and fixed infinite loop bug.

Changes:
- Extended PanelType to include 'stats', 'git', 'notes', 'comments'
- TaskInfoPanel icons now open panels in FlexLayout instead of sidebar
- Added tab context menu with Close/Close Others/Close All actions
- Fixed infinite callback loop between TaskView and TasksPage
- Removed expand/collapse button in FlexLayout mode
- Removed persistent icon highlighting in FlexLayout mode

Technical details:
- TaskView now uses forwardRef to expose addPanel method
- TasksPage manages panel operations via ref instead of callbacks
- FlexLayoutContainer renders tab components with proper styling
- Context menu shows smart disable states (e.g., "Close Others" when single tab)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add custom fullscreen button to each TabSet/Panel
- Clicking fullscreen maximizes the Panel using FlexLayout's native maximize API
- Hides other Panels and page-level UI (Header, TaskInfoPanel)
- All tabs within the fullscreen Panel remain accessible
- Disable FlexLayout's native maximize button, use custom button instead

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Major fixes:
- Remove all incorrect `task.multiplexer === "acp"` checks in TaskChat.tsx
  - All tasks (tmux/zellij) can now use Chat functionality
  - Auto-load chats and connect WebSocket for all tasks
  - Remove legacy chat creation logic
- Remove Close button from TaskInfoPanel
- Fix Terminal panel showing duplicate header when session not running
  - Respect hideHeader prop in "Session not running" state

Previous changes (global config refactor):
- Remove Task-level enable_terminal/enable_chat fields (backend + frontend)
- Create ConfigContext for global configuration management
- Replace ViewMode enum with inWorkspace boolean
- Update button visibility to use global config (enable_chat/enable_terminal)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Refactor the Terminal/Chat feature toggles from a two-state (on/off) model
to a three-state model: enabled (available), enabled (unavailable with
warning), and disabled. This gives users clear visibility into dependency
status without auto-correcting their preferences.

- Add terminalAvailable/chatAvailable to ConfigContext with initial
  dependency checks on mount
- Remove auto-correction that silently switched Terminal→Chat when
  multiplexer was missing; now shows warning state instead
- Terminal/Chat cards show warning color + icon when enabled but
  dependencies are missing
- Task panel buttons are disabled with tooltip when feature is unavailable
- Agent picker auto-selects first available agent or clears to placeholder
  when none available
- Add GROVE_TEST_NO_ACP env var to simulate missing ACP agents
- Fix dropdown positioning in AppPicker/AgentPicker/Combobox: use
  position:fixed with viewport-relative coords and actual space
  measurement instead of hardcoded 400px height estimate

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement full ACP ContentBlock support for user-to-agent messages:
- Backend: extract PromptCapabilities from agent, forward to frontend
- Backend: extend Prompt/Queue to carry ContentBlockData attachments
- Frontend: file picker, clipboard paste, drag-drop for image/audio
- Frontend: attachment preview strip, inline display in user messages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GarrickZ2 and others added 26 commits February 24, 2026 14:30
…step

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Build a minimal Grove.app bundle at ~/.grove/ with embedded icon and
a Swift notifier compiled on first run. Replaces terminal-notifier
dependency with self-contained NSUserNotification delivery.

- macOS: Grove.app + swiftc-compiled grove-notify, launched via `open`
- Linux: fallback to notify-send
- play_sound/send_banner gated with #[cfg(target_os)]
- Pre-build Grove.app on server startup to avoid first-notification delay

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…recated NSUserNotification

Ad-hoc codesign (codesign -s -) enables UNUserNotificationCenter to
work without a paid developer account. This replaces the deprecated
NSUserNotification API with the modern notification framework.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The collapsed sidebar's project icon click handler set isOpen state but
the dropdown was only rendered in the expanded branch, so nothing appeared.
Add dropdown rendering in collapsed state with right-side popover positioning.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add duplicate check in operations::create_task before creating worktree,
preventing ID collisions with archived tasks whose resources still exist.
Also improve Web API error handling to return 409 CONFLICT with message.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- NewTaskDialog: detect "unknown" branch and show warning with disabled
  Create button instead of letting users hit a confusing error
- Backend: unify current_branch fallback to "unknown" across all project
  APIs (was inconsistently "main" in some, "unknown" in others)
- operations::create_task: translate "invalid reference" git error into
  a user-friendly message about needing an initial commit
- TasksPage: show actual backend error message instead of generic
  "Failed to create task"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Show task name and status (active/archived) in duplicate error instead
  of raw slug ID
- Remove "Invalid data:" prefix from InvalidData error display
- Remove noisy "Info: Created N symlink(s)" eprintln logs
- Clean up unused symlinks_created field from CreateTaskResult

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add git::is_diff_empty (git diff --quiet) as fallback for squash merge
detection where is-ancestor fails. Applied to task status display, archive
confirmation, and clean confirmation. Also add pre-merge check to reject
merging already-merged branches with a clear error message.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Wider dropdown (w-72/max-w-sm) to show more of long project names
- Middle truncation: splits text at separator near midpoint so both
  start and end are visible (e.g. open_solu...video_sync)
- Type-to-filter search input with auto-focus when dropdown opens
- Tooltip (title attr) on project items for full name on hover
- Applied to both expanded and collapsed sidebar states

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add useIsMobile hook with mobile/tablet/desktop breakpoints
- Add MobileHeader + MobileDrawer for app-level mobile navigation
- Convert all dialogs to use DialogShell for consistent mobile fullscreen
- Adapt TasksPage, BlitzPage, ProjectsPage for mobile layouts
- Convert sidebar to mobile drawer overlay on narrow screens
- Make Code Review page responsive: overlay sidebars, force unified view,
  compact gutters and comment cards
- Make Editor file tree collapsible with VS Code-style narrow strip,
  mobile drawer overlay
- Swap toolbar action button order (dots before chevron)
- Add PWA manifest for mobile home screen support
- Add mobile media queries to diffTheme.css
- Adapt all components: TaskToolbar, TaskInfoPanel, TaskListItem,
  SettingsPage, LayoutEditor, GitStatusBar, HelpOverlay, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace Bearer Token auth with HMAC-SHA256 signatures for `grove mobile`.
The secret key never travels over the wire — each request is independently
signed with timestamp + nonce, preventing replay attacks.

- Add HMAC-SHA256 request signing with nonce-based replay prevention
- Add `--tls` flag for self-signed certificate HTTPS encryption
- Add `--cert`/`--key` flags for user-provided CA certificates
- Add `--host` and `--public` flags for flexible network binding
- Add pure JS SHA-256 fallback for HTTP non-localhost contexts
- Add AuthGate component for SK extraction and verification
- Add "Access Remotely" section to docs/index.html and README
- `grove web` remains localhost-only with no authentication

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The `ensure_grove_app` function is macOS-only (#[cfg(target_os = "macos")]),
so its `PathBuf` import must also be gated to avoid unused-import error on Linux CI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat(mobile): HMAC-SHA256 auth, optional TLS & remote access
`grove` (no args) now replays the last used launch mode (tui/web/gui/mobile)
with all its arguments. Defaults to TUI on first run. Launch mode preferences
are persisted in ~/.grove/config.toml under [last_launch].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract reusable useFileMention hook from NotesTab for textarea @ mention
- Integrate file mention dropdown into all Review page comment textareas
  (inline comments, file comments, project comments, reply forms, edit forms)
- Fix FileMentionDropdown portal causing page layout shift on @ input by
  initializing with position:fixed off-screen
- Fix Chat chip backspace requiring two presses by handling contentEditable
  chip deletion manually, preventing browser DOM mangling

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…eview

- Write autolink symlink paths (without trailing slash) to shared
  git info/exclude via git-common-dir, preventing git from tracking
  symlinks even when .gitignore uses trailing-slash patterns like
  node_modules/
- Filter symlinks from list_files (Editor file tree), diff_stat
  (Review summary), and get_diff_range (Review full diff)
- Support autolink symlinks in read_file/write_file with two-level
  path traversal protection: logical check then physical check
  allowing paths within worktree or main repo

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace dramatic slide-in/out animations with a quick 150ms crossfade
when switching between tasks. Add key={taskId} to AnimatePresence so
internal state (FlexLayout model, panels) resets correctly on task
switch. Remove TaskView's own slide animation — entry transitions are
now controlled solely by the parent wrapper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Sort displayFiles by path (localeCompare) in both Changes and All
  Files modes so right-side chunks match the left sidebar tree order
- Replace per-file IntersectionObserver highlight with a scroll handler
  that tracks the topmost visible file header via requestAnimationFrame
- Let the validation effect pick the initial selectedFile from the
  sorted displayFiles instead of the raw unsorted git diff output
- Decouple DiffFileView IntersectionObserver from onVisible prop so
  full-file lazy loading still works independently

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Write tool + .md files: render as markdown instead of code block,
  strip outermost code fence wrapper from backend transport format
- Diff blocks: separate +/- prefix into bold colored gutter column
  for clear visual distinction from line content
- Code blocks: use word-wrap instead of horizontal scroll (both
  MarkdownRenderer pre and ToolContentBlock PRE_CLASSES)
- ToolContentBlock markdown path: also strip wrapping code fences

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add min-w-0 to Info Panel parent containers in TasksPage and BlitzPage
  to prevent long content (commit messages, branch names) from stretching
  the panel beyond its allocated flex space
- Change commit message display from truncate to break-words for full
  visibility
- Remove Chat/Terminal/Review/Editor buttons from Info Panel header
  (both desktop and mobile), Workspace button is sufficient entry point

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Wrap spawned threads (ACP session, merge, file watcher) with
  catch_unwind to log panics instead of silently crashing
- Replace bare unwrap() calls with descriptive expect() messages
  in WebSocket serialization, mutex locks, and HTTP response builders
- Detect panics in tokio::select! branches for ACP WS and PTY tasks
- Enable RUST_BACKTRACE=1 by default for better panic diagnostics
- Log server task panic on Tauri exit

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use char_indices() to find valid UTF-8 char boundaries when truncating
task slugs, instead of slicing at raw byte offsets. Chinese characters
(3 bytes each in UTF-8) would cause a panic when the byte index fell
in the middle of a character.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.7.4: fix Info Panel overflow, panic handling, and UI improvements
GarrickZ2 added a commit that referenced this pull request Apr 2, 2026
… and multiple improvements

- fix(web): chat auto-scroll using wheel/touch tracking instead of IntersectionObserver
- fix(web): dynamic bottom padding via ResizeObserver for chat input area
- fix(web): empty file content no longer shows error in Review page (null check)
- fix(web): slash commands buffered WS events now processed correctly
- fix(acp): upsert session.json for AvailableCommands to fix race condition
- fix(acp): exit_code clamp to non-negative before u32 cast
- feat(web): attachment labeling system (Image #1, Audio #2, File #3)
- feat(web): hover badge on attachments for inserting reference chips
- feat(web): labels passed to ACP as ImageContent.uri and AudioContent._meta
- feat(web): Cmd+Shift+[/] for workspace tab switching
- perf(web): tail signature uses content length instead of full string
- perf(web): polling effect uses ref to avoid unnecessary restarts
- perf(web): blob URL revocation on attachment clear to prevent memory leaks

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants