Current as of 2026-05-30 after the source-layout refactor, Context Builder discovery cleanup, provider extraction, post-native-tree cleanup guardrail pass, provider-neutral workflow prompt catalog cleanup, and upstream Tree-sitter grammar migration. This document is contributor-facing: use it to decide where new source, tests, fixtures, diagnostics, shared protocol code, and guardrail checks belong.
Sources/
RepoPrompt/
Support/ # Obj-C bridging header / bridging-header-sensitive support path used by Package.swift
App/ # lifecycle, launch/configuration, commands, composition wiring, app notifications, root app views/view models
Notifications/
Sparkle/
ViewModels/
Views/
Features/
AgentMode/ # Agent Mode UI, models, view models, onboarding, recommendations, and shared agent runtime ownership
Runtime/Providers/ # provider/runtime enum and provider factory shared by Context Builder, Agent Mode, MCP, and recommendations
History/ # cross-workspace session history scanner, MCP tool service (history.list_sessions / search / time / get_session)
Chat/ # chat/oracle models, services, diff state, view models, and views
CodeMap/ # code-map extraction feature code and FileAPI model
ContextBuilder/ # Context Builder product UI/runtime, view models, settings, prompts, budget defaults, and response-type mapping
Diagnostics/ # app-integrated benchmark/debug/stress/diagnostic surfaces
Prompt/ # prompt UI, copy/prompt models, packaging, accounting, compact selected-files components, and view models
Search/ # product search adapters/models backed by WorkspaceContext search; no retired SearchFileTreeViewModel layer
Settings/ # settings models, view models, and views
WorkspaceFiles/ # workspace root shell, selection, and file-list projection view models; no native tree visualization
Workspaces/ # workspace manager UI and view models
Infrastructure/
AI/ # AI provider/model/prompt/query substrate
Prompts/Workflows/ # provider-neutral RepoPrompt workflow prompt catalog and renderers
Concurrency/ # cross-cutting async primitives
Diffing/ # diff parsing/application/generation substrate
FileSystem/ # filesystem seams/services
MCP/ # app-side MCP infrastructure, app-local MCP helpers, and MCP view model adapters
Networking/ # HTTP and decoding substrate
Persistence/ # shared persistence helpers such as preset file storage
Process/ # process/CLI launch substrate
Regex/ # reusable regex adapters/toolkit
Security/ # keychain, signing, and secure storage
SyntaxParsing/ # syntax parsing and tree-sitter query infrastructure
UI/ # reusable UI components, text/markdown/tooltip/mention substrate, UI services
Utilities/ # narrow generic utilities/extensions
VCS/ # git/VCS substrate
WorkspaceContext/ # context store, indexing, path lookup, slices, search, token accounting
ThirdParty/ # vendored SwiftPCRE2 wrapper
RepoPromptShared/
MCP/ # shared app/CLI MCP control protocol definitions
RepoPromptMCP/ # MCP CLI implementation
RepoPromptC/ # C support target
CSwiftPCRE2/ # C PCRE2 target
TreeSitterScannerSupport/ # narrow exact-snapshot JavaScript/Python scanner ABI fallback
Tests/
RepoPromptTests/ # XCTest tests, support, and fixtures
The legacy top-level layer buckets under Sources/RepoPrompt have been pruned and must not be recreated:
ModelsNotificationsServicesSharedUtilsViewModelsViewsFeatures/SynthaxParsingFeatures/Benchmark
The old native file-tree visualization is no longer a live product surface. Do not add back AgentFileTreeBottomPanelView, FileTreeViewWrapper, FileTreeViewController, NativeFileTree, or SearchFileTreeViewModel source paths/symbols.
“File tree” remains valid when it refers to compatibility or textual context contracts, including the MCP get_file_tree tool, tool result cards, API/persisted symbols such as FileTreeOption, historical plans, and prompt/context output such as <file_map> / project structure maps. Contributor-facing UI and docs should prefer “project structure map” when describing generated textual context so it is not confused with the removed native UI.
The old IDE-era Prompt selected-files panel is also removed. Do not add back PresetBottomBar, SelectedFilesContentView, SelectedFilesPanelViewModel, or the Prompt-owned copy/chat preset picker helpers. The live compact selected-files UI remains SelectedFilesGrid plus FilePreviewPopover, and the Settings chat preset picker lives under Features/Settings.
- New product-flow code goes under
Sources/RepoPrompt/Features/<FeatureName>. - New app lifecycle, launch/configuration, command, root view/view-model, notification-name, and composition-root wiring goes under
Sources/RepoPrompt/App. - Keep bridging-header-sensitive support under
Sources/RepoPrompt/SupportunlessPackage.swiftis updated in the same change. - New cross-cutting service/platform code goes under
Sources/RepoPrompt/Infrastructure/<Area>. - Provider-neutral workflow prompt catalog metadata and renderers go under
Sources/RepoPrompt/Infrastructure/AI/Prompts/Workflows/; do not add new workflow prompts under provider-specific command names or bundledAppResources/Services/AI/Promptsmirrors. - New reusable SwiftUI components, text/markdown helpers, and UI services should prefer a narrow feature owner first; otherwise use
Sources/RepoPrompt/Infrastructure/UI/<Area>. - New generic extensions/helpers should prefer a narrow feature or infrastructure owner first; otherwise use
Sources/RepoPrompt/Infrastructure/Utilities. - New app-visible diagnostic surfaces go under
Sources/RepoPrompt/Features/Diagnosticsand must have a documented purpose and entry point. - New app/CLI protocol definitions shared by both executables go under
Sources/RepoPromptShared. - MCP filesystem/product/build-flavor identity and external-client event wire DTOs are single-sourced under
Sources/RepoPromptShared/MCP; app/helper targets may keep only local compile-flavor selection and app-only presentation behavior. - New app-local MCP/socket/routing helpers go under
Sources/RepoPrompt/Infrastructure/MCP, notSources/RepoPrompt/Shared. - New CLI-only implementation code goes under
Sources/RepoPromptMCP. - New test doubles, fixtures, parser inputs, sample projects, benchmark-only fixture data, and XCTest-only helpers go under
Tests/RepoPromptTests, not the app target. - Do not create directories named
Tests,TestSupport, orFixturesunderSources/RepoPrompt. - Do not put parser fixtures or sample parser inputs under
Sources/RepoPrompt/Infrastructure/SyntaxParsing; keep only production parser/query code there. - Keep
App/WindowState.swiftinAppuntil there is a separate composition-root refactor; physical moves must preserve initialization order.
Exceptions must be explicit, narrow, and documented here before they become precedent.
These files are intentionally compiled as app-integrated diagnostics and live under Sources/RepoPrompt/Features/Diagnostics:
Features/Diagnostics/Benchmark: the Settings-visible Repo Bench surface, including benchmark core, settings UI/view model, run store, reporting, and local rankings. If Repo Bench needs a headless/CI runner, create a separate executable-target plan rather than hiding target churn in this layout cleanup.Features/Diagnostics/AgentMode: debug-only Agent Mode performance instrumentation and text-derivation diagnostics.Features/Diagnostics/AgentMode/Stress: debug-only Agent chat stress launch configuration, harness, overlay panel, and stress support extensions onAgentModeViewModel, launched with-RP_AGENT_CHAT_STRESSandRP_AGENT_STRESS_*environment variables.Features/Diagnostics/MCP: hidden DEBUG MCP diagnostics, transport diagnostics, Sparkle diagnostics, and memory sampling exposed through__repoprompt_debug_diagnostics/ legacy debug transport tools.Features/Diagnostics/Prompt: DEBUG prompt/token recount event forwarding, selection signatures, and selected-path watchdog state surfaced through restore performance diagnostics.Features/Diagnostics/CodeMap: DEBUG CodeMap initial-root-load timing wrappers surfaced through restore performance diagnostics.Features/Diagnostics/App: app-wide font-scale metrics, workspace/window restore performance logging, and DEBUG root-load trace correlation (WorkspaceRootLoadDiagnostics) surfaced through restore/workspace loading diagnostics.
App/AppLaunchConfiguration.swiftremains inAppbecause it owns process arguments/environment interpretation for launch behavior. It still routes DEBUG-only Agent chat stress settings, but harness-specific configuration lives underFeatures/Diagnostics/AgentMode/Stress.App/WindowState.swiftremains the composition root and continues to instantiate/pause the DEBUG-onlyAgentChatStressHarness. This is wiring only; harness implementation lives under Diagnostics.Infrastructure/Security/EphemeralSecureKeyValueStore.swiftremains with security storage code, not Diagnostics, because it is a required debug-app secure-storage backend rather than a fixture or visible diagnostic harness. It is#if DEBUG, in-memory only, and preserves existing debug behavior for ad-hoc/ephemeral secure storage.
Sources/TreeSitterScannerSupportis an internal C linker compatibility target, not a restored local grammar target. It contains byte-for-byte exact-snapshot copies of the upstream JavaScript and Pythonscanner.cimplementations plus their requiredtree_sitterhelper headers. It does not contain parser copies, grammar definitions, queries, or CE-authored scanner code.- Clean coordinated SwiftPM root graphs compile the exact-pinned upstream JavaScript and Python parser objects but omit their scanner objects, leaving unresolved external-scanner ABI symbols.
TreeSitterScannerSupportsupplies only those missing symbols while CE continues linking the upstream package products. - The tracked checksum manifest at
ThirdPartyLicenses/tree-sitter/scanner-support.sha256protects the copied snapshots from drift. Do not expand this target, restore the seven retired local grammar directories, or replace the target with transient.build/checkoutsmutation. Remove the target, guardrails, checksums, and this exception together only after validated upstream revisions or SwiftPM behavior compile the scanners directly from the dependency products in a clean graph.
No top-level Sources/RepoPrompt/Notifications exception remains; app-wide notification-name extensions now live under Sources/RepoPrompt/App/Notifications.
The generated Xcode workspace lives under .build/xcode and is not part of the
source layout or a second target graph. Package.swift continues to own source,
target, dependency, and test-resource membership. Edit the generator and
workflow wrapper under Scripts, then regenerate; never edit or track generated
workspace files. See xcode-workspace.md.
Run the source-layout guardrails before or after source-layout-sensitive changes:
make guardrails
# or
./Scripts/source_layout_guardrails.shThe guardrail script verifies:
- old top-level layer buckets are absent or contain no files;
- no
Tests,TestSupport, orFixturesdirectories exist underSources/RepoPrompt; MCPControlMessages.swiftandMCPFilesystemIdentity.swiftexist only underSources/RepoPromptShared/MCP, and theMCPExternalClientEventwire DTO is declared only there;- parser fixtures/sample inputs do not live under app syntax parsing source;
- the narrow
TreeSitterScannerSupportcompatibility target has exactly its approved JavaScript/Python scanner snapshots and helper headers, matches curated checksums, remains wired inPackage.swift, preserves the seven migrated grammar pins/products inPackage.swiftandPackage.resolved, and keeps the seven retired local grammar directories absent; - Agent/MCP runtime code does not depend on
WorkspaceFilesViewModel,FileViewModel, orFolderViewModel; - removed native-tree/search artifact paths are not tracked again;
- removed native-tree/search/eager-loading symbols such as
AgentFileTreeBottomPanelView,FileTreeViewWrapper,FileTreeViewController,NativeFileTree,SearchFileTreeViewModel,RootDescendantMaterialization,legacyMaterializedRootKeys,legacyMaterializeDescendantsRecursively, andlegacyEagerare not referenced from app source; - removed Prompt UI cleanup artifacts (
PresetBottomBar.swift,SelectedFileView.swift,SelectedFilesPanelViewModel.swift) and unique stale symbols (PresetBottomBar,SelectedFilesContentView,SelectedFilesPanelViewModel,PresetTwoPanePopover_Copy,CopyPresetPreviewView,PresetTwoPanePopover_Chat) are not referenced from app source; App/WindowState.swiftdoes not reintroduce scopedsearchViewModelwiring;WorkspaceFilesViewModel.swiftdoes not reintroduce the removedloadContentsRecursivelyeager-loading seam.
MCPControlMessages.swift,MCPFilesystemIdentity.swift, and theMCPExternalClientEventwire DTO now have one source of truth inSources/RepoPromptShared/MCP; the app and CLI targets depend onRepoPromptShared.- The old production dependency on a test-named filesystem seam was renamed to
FileSystemProviding; test doubles/support live under tests. - The dead Dart parser fixture under app source was removed rather than retained as production code.
- Workspace, Agent Mode, MCP infrastructure, workspace context/files, Prompt, Context Builder, Chat, Search, Settings, Code Map, and syntax parsing were moved toward the hybrid feature/infrastructure layout.
- Benchmark, debug, and stress harnesses were classified as app-integrated diagnostics or documented wiring exceptions.
- The old top-level layer buckets were pruned as part of Work Item 11.
- The native file-tree visualization, IDE-era search view-model layer, and eager root materialization seams were removed. Textual project structure maps and MCP
get_file_treeoutput remain supported compatibility surfaces. - The Claude-compatible Agent Mode provider family was extracted into the
RepoPromptClaudeCompatibleProviderpackage product underPackages/RepoPromptAgentProviders/; seedocs/architecture/provider-plugins.mdfor the bridge/adapter layout and rules for adding new providers. - Workflow prompt generation now lives in the provider-neutral catalog under
Sources/RepoPrompt/Infrastructure/AI/Prompts/Workflows/; the old provider-specificClaudeCodeCommandssurface and duplicated bundled prompt mirror underAppResources/Services/AI/Prompts/should not be restored.
Run the smallest focused validation that covers your change, then broaden as needed:
make dev-swift-build PRODUCT=RepoPrompt
make dev-swift-build PRODUCT=repoprompt-mcp
make dev-test FILTER=CodexIntegrationConfigurationTests
make dev-test FILTER=WorkspaceFileContextStoreTests
make dev-test
make guardrails
make doctor
make dev-build
make dev-testUse make run only when it is safe to stop any existing RepoPrompt instance and launch the debug app.