Context
The architecture & security review identified several low-severity findings. None are urgent, but worth addressing over time.
Code quality
- Force unwrap in ContentView.swift:448 —
sorted.first! / sorted.last! in cycleWorkstream is safe (guarded by !sorted.isEmpty) but non-obvious. Add a comment or refactor to optional chaining.
- AppleScript string interpolation in SettingsView.swift:342-346 — CLI installation uses string construction rather than argument arrays. Properly escaped, but worth noting if the scope expands.
- Silent error suppression — Some
try? patterns in GitOperations.run make it impossible to distinguish "tool not found" from "command failed". Consider Result types for richer error context.
- Large files —
ProjectSidebar.swift (839 lines) and TerminalContainerView.swift (865 lines) could benefit from sub-component extraction if they continue to grow.
Testing
- No integration tests — No end-to-end tests for the project creation → workstream → terminal flow.
- Surface lifecycle tests — Partially covered by
BrowserViewTests (TerminalSurfaceCache), but TerminalView event handling and Ghostty surface lifecycle remain untested.
Documentation
- Document unsandboxed status — The app intentionally runs without sandbox for filesystem/terminal access. This rationale should be in user-facing security documentation.
Context
The architecture & security review identified several low-severity findings. None are urgent, but worth addressing over time.
Code quality
sorted.first!/sorted.last!incycleWorkstreamis safe (guarded by!sorted.isEmpty) but non-obvious. Add a comment or refactor to optional chaining.try?patterns inGitOperations.runmake it impossible to distinguish "tool not found" from "command failed". ConsiderResulttypes for richer error context.ProjectSidebar.swift(839 lines) andTerminalContainerView.swift(865 lines) could benefit from sub-component extraction if they continue to grow.Testing
BrowserViewTests(TerminalSurfaceCache), but TerminalView event handling and Ghostty surface lifecycle remain untested.Documentation