Remove obsolete CLAUDE.md documentation files from main, preload, renderer, and services directories to streamline project structure and eliminate outdated information.

This commit is contained in:
iliya 2026-03-02 23:16:48 +02:00
parent 9319189ff9
commit 34d2929a0b
10 changed files with 1 additions and 491 deletions

View file

@ -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`.

View file

@ -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.

View file

@ -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<T>` 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/`

View file

@ -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

View file

@ -97,7 +97,7 @@ async function collectNvmWindowsCandidates(): Promise<string[]> {
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}`)));
}

View file

@ -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<T>` wrapper pattern:
```typescript
interface IpcResult<T> {
success: boolean;
data?: T;
error?: string;
}
```
The `invokeIpcWithResult<T>()` 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

View file

@ -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).

View file

@ -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

View file

@ -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`

View file

@ -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` - `<teammate-message>` 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';
```