3.4 KiB
3.4 KiB
File context domain split
Refactor context/file.tsx into focused modules with unchanged API.
Summary
packages/app/src/context/file.tsx still combines path normalization, file-content caching/eviction, file-tree loading, watcher event handling, and file-view persistence orchestration. Recent refactoring extracted generic scoped-cache primitives to packages/app/src/utils/scoped-cache.ts, but most file-domain behavior remains in one module. This spec separates those concerns while preserving the existing useFile() interface.
Goals
- Keep
useFile()API stable for all callers. - Extract independent domains into dedicated modules.
- Improve readability and lower risk for future file-tree/perf changes.
- Preserve current caching and watcher semantics.
Non-goals
- No redesign of file tree UI.
- No change to backend file APIs.
- No simultaneous refactor of
components/file-tree.tsxin this workstream.
Parallel ownership (important)
This workstream owns:
packages/app/src/context/file.tsx- New files under
packages/app/src/context/file/** packages/app/src/utils/scoped-cache.ts(only when required for file-view cache extraction)
This workstream must not edit:
packages/app/src/context/global-sync.tsx(spec 12)packages/app/src/pages/session.tsx(spec 09)packages/app/src/components/prompt-input.tsx(spec 11)
Current state
- File size: ~751 LOC.
packages/app/src/utils/scoped-cache.tsnow exists as a shared cache primitive used by file view persistence.- Multiple domains in one module:
- path normalization/parsing
- LRU content memory management
- tree node/directory state management
- event-driven watcher invalidation
- per-session view cache bootstrapping
Proposed module split
Create packages/app/src/context/file/ modules such as:
path.ts- normalize/strip helpers.content-cache.ts- content LRU + byte caps.view-cache.ts- per-session file view persistence cache (building oncreateScopedCache).tree-store.ts- directory/node store and list/expand/collapse actions.watcher.ts- watcher event handling and invalidation routines.
file.tsx remains the provider entry that composes these modules.
Phased steps
- Extract path helper functions with no behavior changes.
- Extract content cache and eviction logic.
- Extract file-specific view-cache loading/pruning logic on top of
createScopedCache. - Extract tree-store list/refresh/toggle actions.
- Extract watcher update handler and wire cleanup.
- Keep
useFile()return shape unchanged.
Acceptance criteria
useFile()API remains backward compatible.context/file.tsxis reduced significantly (target: under 350 LOC).- Tree loading/refresh and content eviction behavior remain unchanged.
- Watcher-driven reload behavior still works for changed/added/deleted files.
Validation plan
- Typecheck:
bun run typecheck(frompackages/app). - Targeted e2e checks:
e2e/files/file-tree.spec.tse2e/files/file-viewer.spec.tse2e/files/file-open.spec.ts
- Manual checks:
- directory expand/collapse and refresh
- large file navigation and cache reuse
- watcher-driven updates in active file tabs
Handoff notes
- Keep tree/data stores colocated with their mutation helpers.
- Avoid changing persisted key names or cache key shapes in this pass.
- Save broader API cleanups for a follow-up once modules are stable.