diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 386ff96..5fffb27 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -36,7 +36,9 @@ - AgentPane does NOT stop agents in onDestroy — onDestroy fires on layout remounts, not just explicit close. Stop-on-close is handled externally (was TilingGrid in v2, now workspace teardown in v3). - Agent dispatcher (`src/lib/agent-dispatcher.ts`) is a singleton that routes sidecar events to the agent store. Handles subagent routing (project-scoped sessions skip layout pane, render in TeamAgentsPanel; detached mode creates layout pane). Session persistence via registerSessionProject() + persistSessionForProject() (saves state + messages to SQLite on complete). - AgentQueryOptions supports `permission_mode` field (flows Rust -> sidecar -> SDK). Defaults to 'bypassPermissions', supports 'default' mode. allowDangerouslySkipPermissions is conditionally set. Also supports: `setting_sources` (defaults to ['user', 'project']), `system_prompt`, `model`, `claude_config_dir` (for multi-account), `additional_directories`. -- Claude profiles: claude_list_profiles() reads ~/.config/switcher/profiles/ with profile.toml metadata. Profile selector in AgentPane when >1 profile. Selected profile's config_dir -> claude_config_dir -> CLAUDE_CONFIG_DIR env var override in sidecar. +- Claude profiles: claude_list_profiles() reads ~/.config/switcher/profiles/ with profile.toml metadata. Profile set per-project in Settings (project.profile field), passed through ClaudeSession -> AgentPane `profile` prop -> resolved to config_dir for SDK. Profile name shown as info-only in ProjectHeader. +- ProjectBox has project-level tab bar: Claude | Files | Context. Content area switches between ClaudeSession+TeamAgentsPanel, ProjectFiles (project-scoped markdown viewer), and ContextPane. ProjectFiles.svelte accepts cwd/projectName props (not workspace store). +- ProjectHeader shows CWD (ellipsized from START via `direction: rtl`) + profile name as info-only text on right side. AgentPane no longer has DIR/ACC toolbar — CWD and profile are props from parent. - Skill discovery: claude_list_skills() reads ~/.claude/skills/ (dirs with SKILL.md or .md files). claude_read_skill() reads content. AgentPane `/` prefix triggers autocomplete menu. Skill content injected as prompt via expandSkillPrompt(). - claude-bridge.ts adapter wraps profile/skill Tauri commands (ClaudeProfile, ClaudeSkill interfaces). - Sidecar build: `npm run build:sidecar` bundles SDK into agent-runner.mjs via esbuild (no --external, SDK included in bundle). diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f9f25f..b9e5b67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,18 +8,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Project-level tab bar in ProjectBox: Claude | Files | Context tabs switch the content area between ClaudeSession, ProjectFiles, and ContextPane +- ProjectFiles.svelte: project-scoped markdown file viewer (file picker sidebar + MarkdownPane), accepts cwd/projectName props +- ProjectHeader info bar: CWD path (ellipsized from start via `direction: rtl`) + profile name displayed as read-only info alongside project icon/name - Emoji icon picker in SettingsTab: 24 project-relevant emoji in 8-column grid popup, replaces plain text icon input - Native directory picker for CWD fields: custom `pick_directory` Tauri command using `rfd` crate with `set_parent(&window)` for modal behavior on Linux; browse buttons added to Default CWD, existing project CWD, and Add Project path inputs in SettingsTab - `rfd = { version = "0.16", default-features = false, features = ["gtk3"] }` direct dependency for modal file dialogs (zero extra compile — already built transitively via tauri-plugin-dialog) - CSS relative units rule (`.claude/rules/18-relative-units.md`): enforces rem/em for layout CSS, px only for icons/borders/shadows ### Changed -- ProjectBox layout: switched from flex to CSS grid (`grid-template-rows: auto 1fr auto`) — header (auto) | Claude session (fills remaining) | terminal (16rem fixed) +- ProjectBox layout: CSS grid with 4 rows (`auto auto 1fr auto`) — header | tab bar | content | terminal; content area switches by tab +- AgentPane: removed DIR/ACC toolbar entirely — CWD and profile now passed as props from parent (set in Settings, shown in ProjectHeader); clean chat window with prompt + send button only - AgentPane prompt area: anchored to bottom (`justify-content: flex-end`) instead of vertical center, removed `max-width: 600px` constraint — uses full panel width +- ClaudeSession passes `project.profile` to AgentPane for automatic profile resolution - ProjectGrid.svelte CSS converted from px to rem: gap 0.25rem, padding 0.25rem, min-width 30rem - TerminalTabs.svelte CSS converted from px to rem: tab bar, tabs, close/add buttons, empty state ### Removed +- AgentPane session toolbar (DIR/ACC inputs) — CWD and profile are now props, not interactive inputs - Nerd Font codepoints for project icons — replaced with emoji (`📁` default) for cross-platform compatibility - Nerd Font `font-family` declarations from ProjectHeader and TerminalTabs - Stub `pick_directory` Tauri command (replaced by `tauri-plugin-dialog` frontend API) diff --git a/CLAUDE.md b/CLAUDE.md index 7b071b4..5480e71 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -71,7 +71,7 @@ Terminal emulator with SSH and Claude Code session management. v1 (GTK3+VTE Pyth | `v2/src/lib/components/Context/ContextPane.svelte` | ctx database viewer (projects, entries, search) | | `v2/src/lib/components/StatusBar/StatusBar.svelte` | Global status bar (group name, project count, agent count, cost) | | `v2/src/lib/components/Notifications/ToastContainer.svelte` | Toast notification display | -| `v2/src/lib/components/Workspace/` | v3 components: GlobalTabBar, ProjectGrid, ProjectBox, ProjectHeader, ClaudeSession, TeamAgentsPanel, AgentCard, TerminalTabs, CommandPalette, DocsTab, ContextTab, SettingsTab | +| `v2/src/lib/components/Workspace/` | v3 components: GlobalTabBar, ProjectGrid, ProjectBox, ProjectHeader, ClaudeSession, TeamAgentsPanel, AgentCard, TerminalTabs, ProjectFiles, CommandPalette, DocsTab, ContextTab, SettingsTab | | `v2/src/lib/types/groups.ts` | TypeScript interfaces (ProjectConfig, GroupConfig, GroupsFile) | | `v2/src/lib/adapters/session-bridge.ts` | Session/layout/group persistence IPC wrapper | | `v2/src/lib/components/Markdown/MarkdownPane.svelte` | Markdown file viewer (marked.js + shiki, live reload) | diff --git a/TODO.md b/TODO.md index 7c857cf..8c45206 100644 --- a/TODO.md +++ b/TODO.md @@ -11,6 +11,7 @@ ## Completed +- [x] **Project box tabs + clean AgentPane** -- Project-level tab bar (Claude|Files|Context), ProjectFiles component, CWD+profile in header as info-only, AgentPane toolbar removed. | Done: 2026-03-08 - [x] **Project workspace layout redesign** -- CSS grid layout for ProjectBox (header|session|terminal), bottom-anchored AgentPane prompt, emoji icons replacing Nerd Font, px→rem conversions across 4 components. | Done: 2026-03-08 - [x] **Native directory picker** -- Added tauri-plugin-dialog for native OS folder picker on CWD fields (Default CWD, project CWD, Add Project path). Removed stub pick_directory command. | Done: 2026-03-08 - [x] **Fix sidebar drawer content-driven width** -- Root cause: leftover v2 grid layout on #app in app.css (`grid-template-columns: var(--sidebar-width) 1fr`) constrained .app-shell to 260px. Removed grid; JS $effect measurement now works correctly, all 4 tabs scale to content. | Done: 2026-03-08 diff --git a/docs/v3-progress.md b/docs/v3-progress.md index c9c1f3e..e1273c4 100644 --- a/docs/v3-progress.md +++ b/docs/v3-progress.md @@ -347,3 +347,33 @@ All editor themes map to the same `--ctp-*` CSS custom property names (26 vars). - [x] ProjectGrid.svelte: gap 4px → 0.25rem, padding 4px → 0.25rem, min-width 480px → 30rem - [x] TerminalTabs.svelte: tab bar, tabs, close/add buttons all converted to rem - [x] ProjectBox.svelte: min-width 480px → 30rem + +### Session: 2026-03-08 — Project-Level Tabs + Clean AgentPane + +#### ProjectHeader Info Bar +- [x] Added CWD path display (ellipsized from START via `direction: rtl` + `text-overflow: ellipsis`) +- [x] Added profile name as info-only text (right side of header) +- [x] Home dir shortening: `/home/user/foo` → `~/foo` + +#### Project-Level Tab Bar +- [x] Added tab bar in ProjectBox below header: Claude | Files | Context +- [x] Content area switches between ClaudeSession, ProjectFiles, ContextPane based on selected tab +- [x] CSS grid updated to 4 rows: `auto auto 1fr auto` (header | tabs | content | terminal) +- [x] TeamAgentsPanel still renders alongside ClaudeSession in Claude tab + +#### ProjectFiles Component (NEW) +- [x] Created `ProjectFiles.svelte` — project-scoped markdown file viewer +- [x] Accepts `cwd` + `projectName` props (not workspace store) +- [x] File picker sidebar (10rem) + MarkdownPane content area +- [x] Auto-selects priority file or first file + +#### AgentPane Cleanup +- [x] Removed entire session toolbar (DIR/ACC interactive inputs + all CSS) +- [x] Added `profile` prop — resolved via `listProfiles()` to get config_dir +- [x] CWD passed as prop from parent (project.cwd), no longer editable in pane +- [x] Clean chat interface: prompt (bottom-anchored) + messages + send button +- [x] ClaudeSession now passes `project.profile` to AgentPane + +#### Verification +- All 138 vitest tests pass +- Vite build succeeds