diff --git a/src/CLAUDE.md b/src/CLAUDE.md deleted file mode 100644 index 77eeddd2..00000000 --- a/src/CLAUDE.md +++ /dev/null @@ -1,31 +0,0 @@ -# src/ Structure - -Three-process Electron architecture: - -## Processes -- `main/` - Node.js runtime (file system, IPC, lifecycle) -- `preload/` - Secure bridge (contextBridge API) -- `renderer/` - React/Chromium (UI, state, visualization) -- `shared/` - Cross-process types and utilities - -## Import Pattern -Use barrel exports from domain folders: -```typescript -import { ChunkBuilder, ProjectScanner } from './services'; -``` - -## IPC Communication -Exposed API via `window.electronAPI`, organized by domain: - -| Domain | Methods | Examples | -|--------|---------|---------| -| Sessions | 10 | `getProjects()`, `getSessions()`, `getSessionsPaginated()`, `getSessionDetail()`, `getSessionMetrics()`, `getWaterfallData()`, `getSubagentDetail()`, `searchSessions()`, `getAppVersion()` | -| Repository | 2 | `getRepositoryGroups()`, `getWorktreeSessions()` | -| Validation | 2 | `validatePath()`, `validateMentions()` | -| CLAUDE.md | 3 | `readClaudeMdFiles()`, `readDirectoryClaudeMd()`, `readMentionedFile()` | -| Config | 16 | `config.get()`, `config.update()`, `config.addTrigger()`, `config.openInEditor()`, `config.pinSession()`, `config.unpinSession()`, etc. | -| Notifications | 9 | `notifications.get()`, `notifications.markRead()`, `notifications.onNew()`, etc. | -| Utilities | 7 | `openPath()`, `openExternal()`, `onFileChange()`, `onTodoChange()`, `getZoomFactor()`, `onZoomFactorChanged()` | -| Session | 1 | `session.scrollToLine()` | - -Full API signatures in `src/preload/index.ts`, channel constants in `src/preload/constants/ipcChannels.ts`. diff --git a/src/main/CLAUDE.md b/src/main/CLAUDE.md deleted file mode 100644 index 1911b032..00000000 --- a/src/main/CLAUDE.md +++ /dev/null @@ -1,32 +0,0 @@ -# Main Process - -Node.js runtime handling file system, IPC, and app lifecycle. - -## Structure -- `index.ts` - App entry point, lifecycle management -- `ipc/` - IPC handlers organized by domain -- `services/` - Business logic by domain -- `types/` - Type definitions -- `utils/` - Utility functions -- `constants/` - Shared constants (messageTags, worktreePatterns) - -## IPC Organization -Handlers in `ipc/` by domain: -- `projects.ts` - Project listing -- `sessions.ts` - Session operations -- `search.ts` - Search functionality -- `subagents.ts` - Subagent details -- `validation.ts` - Path validation -- `utility.ts` - Shell & file operations -- `config.ts` - Configuration -- `notifications.ts` - Notifications - -## Adding IPC Handler -1. Add to domain file in `ipc/` -2. If new domain, create file and register in `handlers.ts` -3. Add type in `preload/index.ts` -4. Implement in appropriate service - -## File Watching -FileWatcher service monitors session files with 100ms debounce. -Notifies renderer of changes via IPC events. diff --git a/src/main/ipc/CLAUDE.md b/src/main/ipc/CLAUDE.md deleted file mode 100644 index 1462ee87..00000000 --- a/src/main/ipc/CLAUDE.md +++ /dev/null @@ -1,57 +0,0 @@ -# IPC Handlers - -Domain-organized IPC request handlers for main process. - -## Structure -``` -ipc/ -├── handlers.ts # Initialization and registration -├── config.ts # App configuration handlers -├── configValidation.ts # Config input validation/sanitization -├── guards.ts # IPC argument type guards -├── notifications.ts # Notification management -├── projects.ts # Project listing, repository grouping -├── search.ts # Session content search -├── sessions.ts # Session operations, pagination -├── subagents.ts # Subagent detail drill-down -├── utility.ts # Shell operations, file reading -└── validation.ts # Path validation, file mentioning -``` - -## Handler Pattern -Each domain module exports: -```typescript -// Setup with services -initialize{Domain}Handlers(services) - -// Register with ipcMain -register{Domain}Handlers(ipcMain) - -// Cleanup on app quit -remove{Domain}Handlers(ipcMain) -``` - -## Service Dependencies -`initializeIpcHandlers()` receives service instances: -- `ProjectScanner` - File system scanning -- `SessionParser` - JSONL parsing -- `SubagentResolver` - Subagent linking -- `ChunkBuilder` - Chunk analysis -- `DataCache` - Result caching - -## Response Pattern -Config handlers use `IpcResult` wrapper: -```typescript -return { success: true, data: result }; -return { success: false, error: message }; -``` - -Other handlers return data directly or `null` on error. - -## Adding New Handler -1. Add to existing domain file or create new file -2. Call `initialize{Domain}Handlers()` if new domain -3. Add `register/remove{Domain}Handlers` in `handlers.ts` -4. Add channel constant in `preload/constants/ipcChannels.ts` -5. Add method to ElectronAPI in `preload/index.ts` -6. Implement service logic in `src/main/services/` diff --git a/src/main/services/CLAUDE.md b/src/main/services/CLAUDE.md deleted file mode 100644 index 9ed40777..00000000 --- a/src/main/services/CLAUDE.md +++ /dev/null @@ -1,59 +0,0 @@ -# Services - -Business logic organized by domain. - -## Domains -- `analysis/` - Chunk building, semantic steps, tool execution -- `discovery/` - Project/session scanning, subagent resolution -- `error/` - Error detection, trigger checking -- `infrastructure/` - Cache, file watching, config, notifications -- `parsing/` - JSONL parsing, message classification - -## Key Services - -### Analysis -- **ChunkBuilder** - Orchestrates chunk building -- **ChunkFactory** - Creates chunk objects -- **ConversationGroupBuilder** - Builds conversation groups -- **ProcessLinker** - Links subagents to chunks -- **SemanticStepExtractor** - Extracts steps -- **SemanticStepGrouper** - Groups semantic steps -- **SubagentDetailBuilder** - Builds subagent detail views -- **ToolExecutionBuilder** - Builds tool execution tracking -- **ToolResultExtractor** - Extracts tool results -- **ToolSummaryFormatter** - Formats tool summaries - -### Discovery -- **ProjectPathResolver** - Resolves project paths -- **ProjectScanner** - Scans ~/.claude/projects/ -- **SessionContentFilter** - Filters session content -- **SessionSearcher** - Searches session content -- **SubagentLocator** - Locates subagent files -- **SubagentResolver** - Parses subagent files, detects parallel execution, enriches team metadata/colors -- **SubprojectRegistry** - Tracks subproject associations -- **WorktreeGrouper** - Groups projects by git worktree - -### Parsing -- **SessionParser** - Parses JSONL files -- **MessageClassifier** - Categorizes messages (user, system, AI, noise) -- **ClaudeMdReader** - Reads CLAUDE.md configuration -- **GitIdentityResolver** - Resolves git identities - -### Error -- **ErrorDetector** - Per-tool-use token counting, returns `DetectedError[]` -- **ErrorMessageBuilder** - Builds error notification messages -- **ErrorTriggerChecker** - Matches against notification triggers -- **ErrorTriggerTester** - Tests triggers against historical data -- **TriggerMatcher** - Pattern matching for triggers - -### Infrastructure -- **DataCache** - LRU cache (50 entries, 10min TTL) -- **FileWatcher** - 100ms debounced file watching -- **ConfigManager** - App configuration -- **NotificationManager** - Notification handling -- **TriggerManager** - Notification trigger management - -## Adding Service -1. Create in appropriate domain folder -2. Export from domain's index.ts -3. Re-export from services/index.ts diff --git a/src/main/services/team/ClaudeBinaryResolver.ts b/src/main/services/team/ClaudeBinaryResolver.ts index ba9f28e3..97d37e7d 100644 --- a/src/main/services/team/ClaudeBinaryResolver.ts +++ b/src/main/services/team/ClaudeBinaryResolver.ts @@ -97,7 +97,7 @@ async function collectNvmWindowsCandidates(): Promise { const exts = getWindowsExecutableExtensions(); return versions - .sort((a, b) => b.localeCompare(a, undefined, { numeric: true, sensitivity: 'base' })) + .toSorted((a, b) => b.localeCompare(a, undefined, { numeric: true, sensitivity: 'base' })) .flatMap((version) => exts.map((ext) => path.join(nvmRoot, version, `claude${ext}`))); } diff --git a/src/preload/CLAUDE.md b/src/preload/CLAUDE.md deleted file mode 100644 index bd5df472..00000000 --- a/src/preload/CLAUDE.md +++ /dev/null @@ -1,61 +0,0 @@ -# Preload Process - -Secure bridge between main and renderer processes via Electron's contextBridge. - -## Structure -- `index.ts` - ElectronAPI implementation -- `constants/ipcChannels.ts` - IPC channel name constants - -## ElectronAPI Organization -Groups exposed methods by domain: - -### Session APIs -- `getProjects()`, `getSessions()`, `getSessionsPaginated()` -- `getSessionDetail()`, `getSessionMetrics()`, `getWaterfallData()` -- `getSessionGroups()`, `searchSessions()`, `getAppVersion()` - -### Repository APIs -- `getRepositoryGroups()`, `getWorktreeSessions()` - -### Validation APIs -- `validatePath()`, `validateMentions()` - -### CLAUDE.md APIs -- `readClaudeMdFiles()`, `readDirectoryClaudeMd()`, `readMentionedFile()` - -### Notifications -- `notifications.{get,markRead,markAllRead,delete,clear,getUnreadCount}` -- `notifications.{onNew,onUpdated,onClicked}` - Event listeners - -### Config API -- `config.{get,update}` - Read/write config -- `config.{addTrigger,updateTrigger,removeTrigger,getTriggers,testTrigger}` -- `config.{addIgnoreRegex,removeIgnoreRegex,addIgnoreRepository,removeIgnoreRepository}` -- `config.{snooze,clearSnooze,selectFolders}` -- `config.{openInEditor,pinSession,unpinSession}` - -### Utilities -- `openPath()` - Shell operations -- `openExternal()` - Open URLs in browser -- `onFileChange()` - File watcher events -- `getZoomFactor()` - Get current zoom level -- `onZoomFactorChanged()` - Zoom change listener -- `session.scrollToLine()` - Deep link navigation - -## IPC Pattern -Config operations use `IpcResult` wrapper pattern: -```typescript -interface IpcResult { - success: boolean; - data?: T; - error?: string; -} -``` -The `invokeIpcWithResult()` helper unwraps and throws on failure. - -## Adding New IPC Methods -1. Define channel constant in `constants/ipcChannels.ts` -2. Implement handler in `src/main/ipc/{domain}.ts` -3. Register in `handlers.ts` via `register{Domain}Handlers()` -4. Add method to ElectronAPI in `preload/index.ts` -5. Update `@shared/types/ElectronAPI` if cross-process type needed diff --git a/src/renderer/CLAUDE.md b/src/renderer/CLAUDE.md deleted file mode 100644 index a9346ae1..00000000 --- a/src/renderer/CLAUDE.md +++ /dev/null @@ -1,82 +0,0 @@ -# Renderer Process - -React application running in Chromium. - -## Structure -- `App.tsx` - Root layout -- `main.tsx` - React entry point -- `index.css` - Global styles with Tailwind -- `components/` - UI components by feature -- `store/` - Zustand state (slices pattern) -- `hooks/` - Custom React hooks -- `utils/` - Renderer utilities -- `types/` - Renderer type definitions -- `constants/` - CSS variables (`cssVariables.ts`), layout constants (`layout.ts`), team colors (`teamColors.ts`) -- `contexts/` - React contexts (`TabUIContext.tsx`, `useTabUIContext.ts`) - -## Component Organization -``` -components/ -├── chat/ # Chat display, message items, viewers, context panel -├── common/ # Shared components (badges, dropdowns, token display) -├── dashboard/ # Dashboard views -├── layout/ # Layout components (headers, shells) -├── notifications/ # Notification panels and badges -├── search/ # Search UI and results -├── settings/ # Settings UI -└── sidebar/ # Sidebar navigation -``` - -## Types (`types/`) -- `data.ts` - Core data types (ParsedMessage, SemanticStep, SessionMetrics) -- `groups.ts` - Chat groups (UserGroup, AIGroup, SystemGroup, AIGroupDisplayItem union) -- `contextInjection.ts` - Context tracking (ContextInjection union, ContextStats, ContextPhaseInfo) -- `claudeMd.ts` - CLAUDE.md injection types -- `panes.ts` - Pane layout types -- `tabs.ts` - Tab management types -- `notifications.ts` - Notification types -- `api.ts` - API types - -## Utils (`utils/`) -- `contextTracker.ts` - Visible context tracking (computeContextStats, processSessionContextWithPhases) -- `claudeMdTracker.ts` - CLAUDE.md injection detection -- `aiGroupEnhancer.ts` - AI group enrichment (linkToolCallsToResults, buildDisplayItems) -- `aiGroupHelpers.ts` - AI group utility functions -- `displayItemBuilder.ts` - Display item construction -- `displaySummary.ts` - Display summary generation -- `formatters.ts` - Display formatting -- `groupTransformer.ts` - Chat item grouping -- `lastOutputDetector.ts` - Last output detection -- `modelExtractor.ts` - Model name extraction -- `pathDisplay.ts` - Path display formatting -- `pathUtils.ts` - Path utility functions -- `slashCommandExtractor.ts` - Slash command extraction -- `stringUtils.ts` - String utility functions -- `toolLinkingEngine.ts` - Tool call/result linking -- `toolRendering/` - Tool rendering helpers - - `toolContentChecks.ts` - Tool content validation - - `toolSummaryHelpers.ts` - Tool summary formatting - - `toolTokens.ts` - Tool token utilities - -## Hooks -- `useAutoScrollBottom` - Auto-scroll chat to bottom -- `useKeyboardShortcuts` - Keyboard shortcuts -- `useTabNavigationController` - Turn navigation with highlighting -- `useTabUI` - Per-tab UI state access -- `useTheme` - Dark/light theme toggle -- `useVisibleAIGroup` - Viewport-aware AI group tracking -- `useZoomFactor` - Zoom level management -- `navigation/utils.ts` - Navigation utility functions - -## Contexts -- `contexts/TabUIContext.tsx` - Per-tab UI state isolation -- `contexts/useTabUIContext.ts` - Context consumer hook - -## State Management -Zustand store with slices pattern: -- Each domain has data, selectedId, loading, error -- Actions grouped by domain -- Selectors for derived state - -## Virtual Scrolling -Use `@tanstack/react-virtual` for large lists (sessions, messages). diff --git a/src/renderer/components/CLAUDE.md b/src/renderer/components/CLAUDE.md deleted file mode 100644 index 99978beb..00000000 --- a/src/renderer/components/CLAUDE.md +++ /dev/null @@ -1,81 +0,0 @@ -# Components - -UI components organized by feature domain. - -## Structure -``` -components/ -├── chat/ # Session message display -│ ├── items/ # Individual message/tool items -│ │ ├── linkedTool/ # Tool call/result display helpers -│ │ ├── BaseItem # Base item wrapper -│ │ ├── baseItemHelpers # Base item utility functions -│ │ ├── ExecutionTrace # Execution trace display -│ │ ├── LinkedToolItem # Tool call with linked result -│ │ ├── MetricsPill # Metrics badge display -│ │ ├── SlashItem # Slash command display -│ │ ├── SubagentItem # Subagent execution display -│ │ ├── TeammateMessageItem # Team message cards -│ │ ├── ThinkingItem # Extended thinking display -│ │ └── TextItem # Text output display -│ ├── viewers/ # Content viewers (JSON, code, diff) -│ ├── SessionContextPanel/ # Visible context tracking panel -│ │ ├── components/ # Section wrappers (ClaudeMdFilesSection, ToolOutputsSection, UserMessagesSection, etc.) -│ │ ├── items/ # Per-injection item renderers (ClaudeMdItem, ToolOutputItem, UserMessageItem, etc.) -│ │ ├── DirectoryTree/ # CLAUDE.md directory navigation -│ │ ├── utils/ # Formatting helpers -│ │ ├── index.tsx # Main panel component -│ │ └── types.ts # SectionType constants, panel props -│ ├── AIChatGroup.tsx # AI response group display -│ ├── ChatHistory.tsx # Chat timeline container -│ ├── ChatHistoryEmptyState.tsx # Empty state display -│ ├── ChatHistoryItem.tsx # Individual history item -│ ├── ChatHistoryLoadingState.tsx # Loading state display -│ ├── CompactBoundary.tsx # Compaction event boundary marker -│ ├── ContextBadge.tsx # Per-turn context injection popover badge -│ ├── DisplayItemList.tsx # Display item list rendering -│ ├── LastOutputDisplay.tsx # Last output display -│ ├── SystemChatGroup.tsx # System message group display -│ ├── UserChatGroup.tsx # User message display -│ ├── markdownComponents.tsx # Custom markdown renderers -│ └── searchHighlightUtils.ts # Search highlight utilities -├── common/ # Shared UI primitives -│ ├── CopyButton # Copy to clipboard button -│ ├── CopyablePath # Clickable, copyable file path -│ ├── ErrorBoundary # React error boundary -│ ├── OngoingIndicator # Session in-progress indicator -│ ├── RepositoryDropdown # Repository selector dropdown -│ ├── TokenUsageDisplay # Token breakdown with context stats hover -│ └── WorktreeBadge # Git worktree badge -├── dashboard/ # Overview and listing pages -├── layout/ # App shell, sidebars, headers -├── notifications/ # Notification panels and badges -├── search/ # Search UI and results -├── settings/ # Settings pages and controls -│ ├── components/ # Reusable setting controls (SettingRow, SettingsToggle, etc.) -│ ├── hooks/ # Settings-specific hooks -│ ├── sections/ # Setting sections (General, Notifications, Advanced) -│ └── NotificationTriggerSettings/ # Trigger config UI -│ ├── components/ # Trigger form components -│ ├── hooks/ # Trigger form hooks -│ └── utils/ # Trigger utilities -└── sidebar/ # Project/session navigation -``` - -## Adding Components -1. Choose appropriate parent directory by feature -2. If used across features, place in `common/` -3. Use Tailwind with theme-aware CSS variables -4. Connect to store via `useStore()` hook if needed -5. Colocate related hooks/utils in same directory - -## Component Guidelines -- One component per file, PascalCase naming -- Use functional components with hooks -- Prefer composition over prop drilling -- Use `TabUIContext` for per-tab UI state - -## Virtual Scrolling -Use `@tanstack/react-virtual` for lists > 100 items: -- Session lists in sidebar -- Message lists in chat view diff --git a/src/renderer/store/CLAUDE.md b/src/renderer/store/CLAUDE.md deleted file mode 100644 index 640f470f..00000000 --- a/src/renderer/store/CLAUDE.md +++ /dev/null @@ -1,52 +0,0 @@ -# Store (Zustand) - -State management with slices pattern for domain organization. - -## Structure -- `index.ts` - Store creation, combines all slices -- `types.ts` - AppState type definition -- `slices/` - Individual domain slices -- `utils/` - Store utilities (`paneHelpers.ts`, `pathResolution.ts`) - -## Slices (12 total) -| Slice | Purpose | -|-------|---------| -| `projectSlice` | Projects list, selectedProjectId | -| `repositorySlice` | Repository grouping, worktrees | -| `sessionSlice` | Sessions list, pagination, selectedSessionId | -| `sessionDetailSlice` | Session detail, chunks, metrics | -| `subagentSlice` | Subagent data, selectedSubagentId | -| `conversationSlice` | Messages, conversation metadata | -| `tabSlice` | Tabs list, activeTabId, tab ordering | -| `tabUISlice` | Per-tab UI state (expansions, scroll) | -| `paneSlice` | Pane layout, split views | -| `uiSlice` | UI flags (sidebar visible, etc.) | -| `notificationSlice` | Notifications, unreadCount | -| `configSlice` | App config, triggers | - -## Slice Pattern -Each slice follows: -```typescript -data: T[] -selectedId: string | null -loading: boolean -error: string | null -``` - -## Key Pattern: Per-Tab UI Isolation -`tabUISlice` maintains independent UI state per tab using tabId: -- `expandedAIGroupIds`, `expandedDisplayItemIds`, `expandedSubagentTraceIds` -- Ensures expanding a group in tab A doesn't affect tab B - -## Store Initialization -Call `initializeNotificationListeners()` once in App.tsx useEffect: -- Subscribes to file change events -- Auto-refreshes sessions on new files -- Updates session detail on content change -- Uses `refreshSessionInPlace` to prevent flickering - -## Adding a Slice -1. Create `slices/{domain}Slice.ts` -2. Export `create{Domain}Slice` function -3. Add to store composition in `index.ts` -4. Update `AppState` type in `types.ts` diff --git a/src/shared/CLAUDE.md b/src/shared/CLAUDE.md deleted file mode 100644 index fdfcc0f6..00000000 --- a/src/shared/CLAUDE.md +++ /dev/null @@ -1,35 +0,0 @@ -# Shared - -Cross-process code used by main and renderer. - -## What Goes Here -- Types shared between processes -- Pure utility functions (no Node/DOM APIs) -- Constants used across processes - -## What Doesn't Go Here -- Node.js APIs → main/ -- DOM/React APIs → renderer/ -- Process-specific logic - -## Structure -- `types/` - Shared type definitions (`api.ts`, `notifications.ts`, `visualization.ts`) -- `utils/` - Pure utility functions - - `tokenFormatting.ts` - Token formatting and estimation (`estimateTokens`, `formatTokensCompact`) - - `modelParser.ts` - Model name/family parsing - - `teammateMessageParser.ts` - `` XML parsing - - `markdownTextSearch.ts` - Markdown-aware text search - - `contentSanitizer.ts` - Content sanitization - - `errorHandling.ts` - Error helpers - - `logger.ts` - Logging utility -- `constants/` - Shared constants - - `cache.ts` - Cache configuration - - `trafficLights.ts` - macOS traffic light constants - - `triggerColors.ts` - Trigger color palette - - `window.ts` - Window configuration - -## Import -```typescript -import { SomeType } from '@shared/types'; -import { estimateTokens } from '@shared/utils/tokenFormatting'; -```