feat(mobile-ui): Added mobile-friendly features so the UI renders well on mobile#4
Open
wreed4 wants to merge 36 commits into
Open
feat(mobile-ui): Added mobile-friendly features so the UI renders well on mobile#4wreed4 wants to merge 36 commits into
wreed4 wants to merge 36 commits into
Conversation
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>
- 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I had trouble testing this locally, so hopefully it's not complete slop... apologies if it is.