Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 54 additions & 50 deletions .factory/library/architecture.md
Original file line number Diff line number Diff line change
@@ -1,67 +1,71 @@
# Architecture

Architectural decisions, patterns discovered, and design principles.
Architectural decisions, patterns discovered, and conventions.

**What belongs here:** Architectural patterns, data flow, component organization, design decisions.
**What belongs here:** Architectural patterns, component relationships, design decisions.

---

## iOS App Architecture
## iOS App Structure

### Pattern: MVVM-like with Shared Service
- `SyncService` is the shared `@MainActor ObservableObject` injected via `.environmentObject()`
- Views own local `@State` for UI concerns
- Views call into `SyncService` for remote operations and data fetching
- Data flow: `SyncService` → `DatabaseService` (SQLite) → `localStateRevision` increment → SwiftUI reactivity via `.task(id: syncService.localStateRevision)`

### File Structure
```
ADE/
apps/ios/ADE/
├── App/
│ ├── ADEApp.swift # App entry point, UIKit theme config
│ └── ContentView.swift # Root TabView, Settings tab, design system components
├── Views/
│ ├── LanesTabView.swift # ~3,706 lines - complete
│ ├── FilesTabView.swift # ~500 lines - baseline
│ ├── WorkTabView.swift # ~300 lines - baseline
│ └── PRsTabView.swift # ~500 lines - baseline
│ ├── ADEApp.swift # @main entry, scene setup
│ └── ContentView.swift # TabView with 5 tabs: Lanes, Files, Work, PRs, Settings
├── Models/
│ └── RemoteModels.swift # ~700 lines - all domain models
│ └── RemoteModels.swift # All data models for WebSocket communication
├── Services/
│ ├── Database.swift # ~1,949 lines - SQLite + cr-sqlite sync
│ ├── KeychainService.swift # ~50 lines - token persistence
│ └── SyncService.swift # ~1,781 lines - WebSocket + Bonjour + RPC
└── Resources/
└── DatabaseBootstrap.sql # ~2,260 lines - full schema
│ ├── SyncService.swift # WebSocket client, all API calls to desktop
│ ├── Database.swift # CRSQLite local database
│ └── KeychainService.swift # Secure credential storage
├── Views/
│ ├── Components/
│ │ ├── ADEDesignSystem.swift # Glass morphism, semantic colors, motion system
│ │ └── FilesCodeSupport.swift # Syntax highlighting (13 languages), language detection
│ ├── Files/
│ │ ├── FilesTabView.swift # Root tab: workspace picker, navigation shell
│ │ ├── FileTreeView.swift # Directory screen, tree rows, breadcrumbs
│ │ ├── FileTreeViewModel.swift # Tree state, expand/collapse, child loading
│ │ ├── FileOperationsHelper.swift # Shared types, path helpers, validation
│ │ ├── FileSearchView.swift # Search sheet UI, result rows
│ │ ├── FileSearchViewModel.swift # Debounced quick-open and text search
│ │ ├── FileViewerView.swift # File editor/viewer screen
│ │ ├── FileViewerViewModel.swift # Load, save, diff, find/replace state
│ │ ├── FileViewerChromeViews.swift # Header, mode control, info sheet
│ │ ├── FileViewerCodeEditorView.swift # UITextView code editor with gutter
│ │ ├── FileViewerHelpers.swift # Pure functions: line numbers, find/replace
│ │ └── FileViewerRenderingViews.swift # Binary preview, syntax view, diff, image
│ ├── LanesTabView.swift
│ ├── PRsTabView.swift
│ └── WorkTabView.swift
├── Resources/
│ └── DatabaseBootstrap.sql
├── Assets.xcassets
└── Info.plist
```

### Database
- Direct SQLite3 C API (no ORM)
- cr-sqlite change tracking with custom triggers (insert/update/delete)
- Bidirectional changeset sync via WebSocket
- Site ID management (persistent 128-bit random)
- Full bootstrap SQL schema (~2,260 lines) mirroring desktop
## Communication Architecture

The iOS app communicates with the desktop over WebSocket using a typed envelope protocol:

1. **file_request / file_response** — File operations (listTree, readFile, writeText, createFile, createDirectory, rename, deletePath, quickOpen, searchText)
2. **command / command_ack / command_result** — Git operations and atomic writes

All API calls go through `SyncService.swift` methods. Workers must NOT create new API calls — only use existing methods.

### Networking
- Raw `URLSessionWebSocketTask` — no third-party dependencies
- JSON envelopes with optional gzip compression (>4KB)
- Heartbeat ping/pong protocol
- Auto-reconnect with exponential backoff
- Bonjour (`NetServiceBrowser`) for LAN discovery
- Connection-scoped async work in `SyncService` must be tied to the active socket/session: store long-lived tasks so `disconnect()` and host switching can cancel them, and ignore stale send/receive callbacks unless they still belong to the current `socket`
## Key Data Models (RemoteModels.swift)

### Command Routing
- State-only operations: write locally → cr-sqlite syncs to host
- Execution operations: send command via WebSocket → host executes → state syncs back
- Offline command queue: persisted to UserDefaults, flushed on reconnect
- `FileTreeNode` — { name, path, type, hasChildren, children, changeStatus, size }
- `SyncFileBlob` — { path, size, mimeType, encoding, isBinary, content, languageId }
- `FilesWorkspace` — { id, kind, laneId, name, rootPath, isReadOnlyByDefault }
- `FilesQuickOpenItem` — { path, score }
- `FilesSearchTextMatch` — { path, line, column, preview }

### Key Model Types (RemoteModels.swift)
- `RemoteLane`, `RemoteLaneDetail`, `LaneStateSnapshot`
- `RemoteTerminalSession`, `SessionHistoryEntry`
- `PullRequestRow`, `PullRequestSnapshot`, `PRDetailPayload`
- `RemoteFileNode`, `RemoteSearchResult`
- `ChatMessage`, `ToolCallResult`
## Design System (ADEDesignSystem.swift)

### Adding New Swift Files
New .swift files MUST be added to the Xcode project by editing `ADE.xcodeproj/project.pbxproj`.
Both `PBXFileReference` and `PBXSourcesBuildPhase` sections need entries.
- iOS 26 liquid glass effects via `.glassEffect()` modifiers
- Semantic color tokens: `adeAccent`, `adeSecondaryText`, `adeBackground`, etc.
- Motion system with spring animations
- Glass card component for grouped content
- Workers should use these tokens, not hard-coded colors
10 changes: 6 additions & 4 deletions .factory/services.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
commands:
build: cd apps/ios && xcodebuild -project ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,id=2107A402-C2A7-4323-AF26-74A0AC406C44' -derivedDataPath /tmp/ade-build build
test: cd apps/ios && xcodebuild -project ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,id=2107A402-C2A7-4323-AF26-74A0AC406C44' -derivedDataPath /tmp/ade-build test
typecheck: cd apps/ios && xcodebuild -project ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,id=2107A402-C2A7-4323-AF26-74A0AC406C44' -derivedDataPath /tmp/ade-build build
lint: cd apps/ios && xcodebuild -project ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,id=2107A402-C2A7-4323-AF26-74A0AC406C44' -derivedDataPath /tmp/ade-build analyze
build: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -5
test: xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -40
Comment on lines +2 to +3
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Without pipefail (expected misleading exit=0):"
bash -lc 'false | tail -n 1; echo "exit=$?"'

echo "With pipefail (expected exit=1):"
bash -lc 'set -o pipefail; false | tail -n 1; echo "exit=$?"'

Repository: arul28/ADE

Length of output: 362


🏁 Script executed:

cd /tmp && find . -name "services.yaml" -o -name ".factory" -type d 2>/dev/null | head -20

Repository: arul28/ADE

Length of output: 36


🏁 Script executed:

git ls-files | grep -E "(\.factory|services\.yaml)" | head -20

Repository: arul28/ADE

Length of output: 746


🏁 Script executed:

cat -n .factory/services.yaml 2>/dev/null || echo "File not found"

Repository: arul28/ADE

Length of output: 867


🏁 Script executed:

rg "services.yaml" --type yaml --type json --type md -A 2 -B 2 | head -50

Repository: arul28/ADE

Length of output: 36


🏁 Script executed:

find . -name "*.sh" -o -name "Makefile" -o -name ".github" -type d | head -10

Repository: arul28/ADE

Length of output: 63


🏁 Script executed:

cat -n .factory/library/architecture.md | head -100

Repository: arul28/ADE

Length of output: 3795


🏁 Script executed:

rg "services" --type yaml -B 3 -A 3 | head -60

Repository: arul28/ADE

Length of output: 36


🏁 Script executed:

ls -la .factory/

Repository: arul28/ADE

Length of output: 344


🏁 Script executed:

cat .github/workflows/* 2>/dev/null | head -150

Repository: arul28/ADE

Length of output: 4525


🏁 Script executed:

find . -name "README*" -o -name "*.md" | xargs rg -l "services.yaml|\.factory|commands:" 2>/dev/null | head -10

Repository: arul28/ADE

Length of output: 36


🏁 Script executed:

cat README.md | head -100

Repository: arul28/ADE

Length of output: 4860


🏁 Script executed:

rg "commands:" -B 5 -A 5 --type yaml | head -80

Repository: arul28/ADE

Length of output: 36


🏁 Script executed:

rg "\.factory" --type md --type json --type ts --type js -B 2 -A 2 | head -100

Repository: arul28/ADE

Length of output: 36


🏁 Script executed:

find . -name "*.json" -o -name "*.config.*" | xargs rg "services" 2>/dev/null | head -40

Repository: arul28/ADE

Length of output: 482


🏁 Script executed:

rg "iPhone|iOS|xcodebuild" --type yaml --type json --type md -B 2 -A 2 | head -100

Repository: arul28/ADE

Length of output: 8383


🏁 Script executed:

find .factory -name "*.md" -o -name "*.json" | xargs cat 2>/dev/null | head -200

Repository: arul28/ADE

Length of output: 15783


🏁 Script executed:

rg "commands:" -B 10 -A 10 --type yaml

Repository: arul28/ADE

Length of output: 36


🏁 Script executed:

git log --oneline .factory/services.yaml 2>/dev/null | head -10

Repository: arul28/ADE

Length of output: 74


Preserve xcodebuild failure status when piping to tail.

Lines 2–3 pipe xcodebuild output to tail, which masks build and test failures by returning tail's exit code (0) instead of xcodebuild's. This can cause failed builds/tests to be marked as passing in CI.

Proposed fix
-  build: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -5
-  test: xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -40
+  build: bash -lc "set -o pipefail; xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -5"
+  test: bash -lc "set -o pipefail; xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -40"

Additionally, lines 2–5 hard-code the simulator device name iPhone 17 Pro Max. CI environments may not have this specific device available. Consider using a UUID-based destination or a variable to support flexible environments.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
build: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -5
test: xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -40
build: bash -lc "set -o pipefail; xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -5"
test: bash -lc "set -o pipefail; xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -40"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.factory/services.yaml around lines 2 - 3, Update the two service commands
("build: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE
-destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration
Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -5" and "test: xcodebuild test
-project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS
Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO
2>&1 | tail -40") so the xcodebuild exit status is preserved when piping: enable
bash pipefail or capture xcodebuild's exit code (e.g. use set -o pipefail or
inspect PIPESTATUS) and return that code after tail so CI fails on xcodebuild
errors; also replace the hard-coded destination device name with a configurable
destination (use an environment variable like IOS_DESTINATION or a simulator
UDID resolved dynamically via xcrun simctl) to avoid relying on "iPhone 17 Pro
Max" being present in CI.

build_full: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO
test_full: xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO
Comment on lines +2 to +5
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Verify available destinations for this scheme on the runner.
xcodebuild -project apps/ios/ADE.xcodeproj -scheme ADE -showdestinations | sed -n '1,220p'

# Verify whether the hard-coded name exists.
xcodebuild -project apps/ios/ADE.xcodeproj -scheme ADE -showdestinations | rg -n "iPhone 17 Pro Max" || true

Repository: arul28/ADE

Length of output: 104


🏁 Script executed:

# Check if the services.yaml file exists and examine its content
find . -name "services.yaml" -o -name "synthesis.json" | head -20

Repository: arul28/ADE

Length of output: 188


🏁 Script executed:

# If services.yaml exists, read it
if [ -f ".factory/services.yaml" ]; then
  echo "=== .factory/services.yaml ===" 
  cat -n ".factory/services.yaml"
else
  echo ".factory/services.yaml not found"
fi

Repository: arul28/ADE

Length of output: 898


🏁 Script executed:

# Check for synthesis.json file
if [ -f ".factory/validation/foundation/scrutiny/synthesis.json" ]; then
  echo "=== .factory/validation/foundation/scrutiny/synthesis.json ===" 
  cat -n ".factory/validation/foundation/scrutiny/synthesis.json" | head -80
else
  echo "synthesis.json not found"
fi

Repository: arul28/ADE

Length of output: 2277


Avoid hard-coding a simulator name that may not exist on CI images.

Lines 2–5 hard-code name=iPhone 17 Pro Max. If that device/runtime is unavailable, all iOS commands fail. The .factory/validation/foundation/scrutiny/synthesis.json shows a better pattern using ID-based destinations (e.g., id=2107A402-C2A7-4323-AF26-74A0AC406C44), which is more reliable across environments.

💡 Proposed fix
-  build: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -5
-  test: xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -40
-  build_full: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO
-  test_full: xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' -configuration Debug CODE_SIGNING_ALLOWED=NO
+  build: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination "${IOS_DESTINATION:-platform=iOS Simulator}" -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -5
+  test: xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination "${IOS_DESTINATION:-platform=iOS Simulator}" -configuration Debug CODE_SIGNING_ALLOWED=NO 2>&1 | tail -40
+  build_full: xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination "${IOS_DESTINATION:-platform=iOS Simulator}" -configuration Debug CODE_SIGNING_ALLOWED=NO
+  test_full: xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination "${IOS_DESTINATION:-platform=iOS Simulator}" -configuration Debug CODE_SIGNING_ALLOWED=NO
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.factory/services.yaml around lines 2 - 5, Replace the hard-coded simulator
name in the xcodebuild destination arguments used by the build, test,
build_full, and test_full targets: stop using "name=iPhone 17 Pro Max" and
instead reference a simulator by ID (e.g., "id=<SIMULATOR_UDID>") or a lookup
that resolves an available simulator UDID at runtime; update each destination
string to use "platform=iOS Simulator,id=..." (or a CI-friendly UDID variable)
so xcodebuild will run reliably on CI images that may not include that named
device.


services: {}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ __pycache__/
*.db

# Build outputs
build/
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Scope build/ ignore rule to repo root to avoid masking required desktop packaging assets.

On Line 21, build/ is recursive and will match nested paths like apps/desktop/build/. That conflicts with desktop packaging assets referenced in apps/desktop/package.json (icon/entitlements files). Please anchor this ignore to root (or explicitly unignore desktop assets).

Proposed fix
- build/
+ /build/
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
build/
/build/
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.gitignore at line 21, The recursive ignore rule "build/" currently matches
nested build directories (e.g., apps/desktop/build/) and hides desktop packaging
assets referenced by apps/desktop/package.json; update the .gitignore by scoping
the pattern to the repo root (change "build/" to "/build/") or alternatively add
explicit negation rules to unignore the desktop assets (e.g., add negation
entries for the specific icon/entitlements paths under apps/desktop) so the
desktop packaging files are not masked.

/apps/mcp-server/dist/
/apps/desktop/release/
/apps/desktop/dist/
Expand Down
56 changes: 54 additions & 2 deletions apps/ios/ADE.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,17 @@
60F4CDDB763C0A9F0E650B40 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EC445F22FD38F90C16343E /* Foundation.framework */; };
63A9C60B0E0F0E2707634B2E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8943C47805A871A4E4A4BF68 /* Assets.xcassets */; };
6BDC22C6450AF0B3CBDB2650 /* FilesTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EBFB65019F4C3F8A89428CE /* FilesTabView.swift */; };
7A1B2C3D4E5F60718293A4B5 /* FileViewerChromeViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1B2C3D4E5F60718293A4B4 /* FileViewerChromeViews.swift */; };
7B2C3D4E5F60718293A4B5C6 /* FileViewerCodeEditorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B2C3D4E5F60718293A4B5C5 /* FileViewerCodeEditorView.swift */; };
7C3D4E5F60718293A4B5C6D7 /* FileViewerHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3D4E5F60718293A4B5C6D6 /* FileViewerHelpers.swift */; };
7D4E5F60718293A4B5C6D7E8 /* FileViewerRenderingViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4E5F60718293A4B5C6D7E7 /* FileViewerRenderingViews.swift */; };
A1B2C3D4E5F60718A9B0C1D3 /* FileOperationsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3D4E5F60718A9B0C1D2 /* FileOperationsHelper.swift */; };
B2C3D4E5F6071829A0B1C2D4 /* FileTreeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2C3D4E5F6071829A0B1C2D3 /* FileTreeViewModel.swift */; };
C3D4E5F607182930B1C2D3E5 /* FileViewerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D4E5F607182930B1C2D3E4 /* FileViewerViewModel.swift */; };
D4E5F6071829304AC2D3E4F6 /* FileSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4E5F6071829304AC2D3E4F5 /* FileSearchViewModel.swift */; };
E5F60718293041B5D3E4F507 /* FileTreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5F60718293041B5D3E4F506 /* FileTreeView.swift */; };
F6071829304152C6E4F50618 /* FileViewerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6071829304152C6E4F50617 /* FileViewerView.swift */; };
07182930415263D7F5061729 /* FileSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07182930415263D7F5061728 /* FileSearchView.swift */; };
6E32ED1BF961DFEFCA12EF52 /* DatabaseBootstrap.sql in Resources */ = {isa = PBXBuildFile; fileRef = 2856F8D2F2D630DD985B870A /* DatabaseBootstrap.sql */; };
7B70BE6839672E5D2D006B28 /* ADETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C0DF7FEB4C2EB854BAC888 /* ADETests.swift */; };
889573D8A5ED468D3BD12894 /* PRsTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EE4D463D21266B62B422D11 /* PRsTabView.swift */; };
Expand All @@ -44,7 +55,18 @@
31EC445F22FD38F90C16343E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
483C5F1818BAE74B19B84617 /* RemoteModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RemoteModels.swift; path = ADE/Models/RemoteModels.swift; sourceTree = "<group>"; };
4A9E6135ED52117E41DE95F7 /* ADEDesignSystem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ADEDesignSystem.swift; path = ADE/Views/Components/ADEDesignSystem.swift; sourceTree = "<group>"; };
4EBFB65019F4C3F8A89428CE /* FilesTabView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FilesTabView.swift; path = ADE/Views/FilesTabView.swift; sourceTree = "<group>"; };
4EBFB65019F4C3F8A89428CE /* FilesTabView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FilesTabView.swift; path = ADE/Views/Files/FilesTabView.swift; sourceTree = "<group>"; };
7A1B2C3D4E5F60718293A4B4 /* FileViewerChromeViews.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileViewerChromeViews.swift; path = ADE/Views/Files/FileViewerChromeViews.swift; sourceTree = "<group>"; };
7B2C3D4E5F60718293A4B5C5 /* FileViewerCodeEditorView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileViewerCodeEditorView.swift; path = ADE/Views/Files/FileViewerCodeEditorView.swift; sourceTree = "<group>"; };
7C3D4E5F60718293A4B5C6D6 /* FileViewerHelpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileViewerHelpers.swift; path = ADE/Views/Files/FileViewerHelpers.swift; sourceTree = "<group>"; };
7D4E5F60718293A4B5C6D7E7 /* FileViewerRenderingViews.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileViewerRenderingViews.swift; path = ADE/Views/Files/FileViewerRenderingViews.swift; sourceTree = "<group>"; };
A1B2C3D4E5F60718A9B0C1D2 /* FileOperationsHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileOperationsHelper.swift; path = ADE/Views/Files/FileOperationsHelper.swift; sourceTree = "<group>"; };
B2C3D4E5F6071829A0B1C2D3 /* FileTreeViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileTreeViewModel.swift; path = ADE/Views/Files/FileTreeViewModel.swift; sourceTree = "<group>"; };
C3D4E5F607182930B1C2D3E4 /* FileViewerViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileViewerViewModel.swift; path = ADE/Views/Files/FileViewerViewModel.swift; sourceTree = "<group>"; };
D4E5F6071829304AC2D3E4F5 /* FileSearchViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileSearchViewModel.swift; path = ADE/Views/Files/FileSearchViewModel.swift; sourceTree = "<group>"; };
E5F60718293041B5D3E4F506 /* FileTreeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileTreeView.swift; path = ADE/Views/Files/FileTreeView.swift; sourceTree = "<group>"; };
F6071829304152C6E4F50617 /* FileViewerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileViewerView.swift; path = ADE/Views/Files/FileViewerView.swift; sourceTree = "<group>"; };
07182930415263D7F5061728 /* FileSearchView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileSearchView.swift; path = ADE/Views/Files/FileSearchView.swift; sourceTree = "<group>"; };
51942BAC0965C7D0CCE6E8B8 /* Database.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Database.swift; path = ADE/Services/Database.swift; sourceTree = "<group>"; };
5EE4D463D21266B62B422D11 /* PRsTabView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PRsTabView.swift; path = ADE/Views/PRsTabView.swift; sourceTree = "<group>"; };
66B5024B0A05F3D9754101F1 /* SyncService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SyncService.swift; path = ADE/Services/SyncService.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -91,14 +113,33 @@
isa = PBXGroup;
children = (
02B9E655310A24835B5CFC3B /* Components */,
4EBFB65019F4C3F8A89428CE /* FilesTabView.swift */,
1A2B3C4D5E6F708192A3B4C5 /* Files */,
9270CF8A67F3FA79089F39C1 /* LanesTabView.swift */,
5EE4D463D21266B62B422D11 /* PRsTabView.swift */,
0C6ECFA9D57E70E57A60E8AB /* WorkTabView.swift */,
);
name = Views;
sourceTree = "<group>";
};
1A2B3C4D5E6F708192A3B4C5 /* Files */ = {
isa = PBXGroup;
children = (
4EBFB65019F4C3F8A89428CE /* FilesTabView.swift */,
A1B2C3D4E5F60718A9B0C1D2 /* FileOperationsHelper.swift */,
B2C3D4E5F6071829A0B1C2D3 /* FileTreeViewModel.swift */,
C3D4E5F607182930B1C2D3E4 /* FileViewerViewModel.swift */,
D4E5F6071829304AC2D3E4F5 /* FileSearchViewModel.swift */,
E5F60718293041B5D3E4F506 /* FileTreeView.swift */,
F6071829304152C6E4F50617 /* FileViewerView.swift */,
07182930415263D7F5061728 /* FileSearchView.swift */,
7A1B2C3D4E5F60718293A4B4 /* FileViewerChromeViews.swift */,
7B2C3D4E5F60718293A4B5C5 /* FileViewerCodeEditorView.swift */,
7C3D4E5F60718293A4B5C6D6 /* FileViewerHelpers.swift */,
7D4E5F60718293A4B5C6D7E7 /* FileViewerRenderingViews.swift */,
);
name = Files;
sourceTree = "<group>";
};
10899CEEC539910EA438B7D9 /* Services */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -299,6 +340,17 @@
0375D32BA5870617FA1758C6 /* KeychainService.swift in Sources */,
28CFE3D489EA1B208D231519 /* SyncService.swift in Sources */,
6BDC22C6450AF0B3CBDB2650 /* FilesTabView.swift in Sources */,
7A1B2C3D4E5F60718293A4B5 /* FileViewerChromeViews.swift in Sources */,
7B2C3D4E5F60718293A4B5C6 /* FileViewerCodeEditorView.swift in Sources */,
7C3D4E5F60718293A4B5C6D7 /* FileViewerHelpers.swift in Sources */,
7D4E5F60718293A4B5C6D7E8 /* FileViewerRenderingViews.swift in Sources */,
A1B2C3D4E5F60718A9B0C1D3 /* FileOperationsHelper.swift in Sources */,
B2C3D4E5F6071829A0B1C2D4 /* FileTreeViewModel.swift in Sources */,
C3D4E5F607182930B1C2D3E5 /* FileViewerViewModel.swift in Sources */,
D4E5F6071829304AC2D3E4F6 /* FileSearchViewModel.swift in Sources */,
E5F60718293041B5D3E4F507 /* FileTreeView.swift in Sources */,
F6071829304152C6E4F50618 /* FileViewerView.swift in Sources */,
07182930415263D7F5061729 /* FileSearchView.swift in Sources */,
E689F42D41A500BB8CA233E4 /* LanesTabView.swift in Sources */,
889573D8A5ED468D3BD12894 /* PRsTabView.swift in Sources */,
56223CC3AF5A01B710CDC4CF /* WorkTabView.swift in Sources */,
Expand Down
Loading
Loading