Skip to content

feat(mobile-ui): Added mobile-friendly features so the UI renders well on mobile#4

Open
wreed4 wants to merge 36 commits into
GarrickZ2:masterfrom
wreed4:mobile-ui
Open

feat(mobile-ui): Added mobile-friendly features so the UI renders well on mobile#4
wreed4 wants to merge 36 commits into
GarrickZ2:masterfrom
wreed4:mobile-ui

Conversation

@wreed4
Copy link
Copy Markdown

@wreed4 wreed4 commented Feb 19, 2026

I had trouble testing this locally, so hopefully it's not complete slop... apologies if it is.

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 6 commits February 18, 2026 15:26
- Add expandable input box with maximize/minimize toggle (Cmd+Enter to send, Enter for newline, Esc to collapse)
- Move drag-drop zone from chat messages area to input area only
- Simplify expanded mode footer to show only keyboard hints
- Add double-click rename support for FlexLayout tabs with inline input editing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The "+" button now opens an agent selector dropdown instead of directly
creating a chat. Only available agents are shown (unavailable ones hidden).
Custom agents appear in a separate section. The first auto-created chat
still uses the Settings default agent.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Pull: change `git pull` to `git pull origin <current_branch>`
- Push: remove `--set-upstream` flag, use `git push origin <current_branch>`

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix Tauri GUI drag-and-drop by disabling native drag-drop handler
- Fix Settings page not syncing global config cache
- Remove 11 unused files, 2 unused npm deps, ~30 dead exports
- Add scripts/bump-version.sh for unified version management

Co-Authored-By: Claude Opus 4.6 <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