Skip to content

Commit f68f392

Browse files
committed
reorg files & dirs
1 parent ad8196c commit f68f392

9 files changed

Lines changed: 84 additions & 65 deletions

AS2/AS2/AS2App.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
//
2-
// AS2App.swift
3-
// AS2
4-
//
5-
// Created by Chad Parker on 8/31/25.
6-
//
7-
81
import SwiftUI
92

103
@main

AS2/AS2/Core/AppInstance.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import Cocoa
2+
import Foundation
3+
4+
struct AppInstance {
5+
let app: NSRunningApplication
6+
let strategy: EditorStrategy
7+
var windowInspector: WindowInspector?
8+
9+
var displayName: String {
10+
strategy.displayName
11+
}
12+
13+
var processId: pid_t {
14+
app.processIdentifier
15+
}
16+
}
Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,6 @@ import Cocoa
22
import Foundation
33
import ApplicationServices
44

5-
protocol WindowInspector: AnyObject {
6-
var documentURL: URL? { get }
7-
var workspaceURL: URL? { get }
8-
var projectURL: URL? { get }
9-
var isMainWorkWindow: Bool { get }
10-
11-
func refresh()
12-
}
13-
14-
protocol EditorStrategy {
15-
var displayName: String { get }
16-
var bundleIdentifier: String { get }
17-
18-
func shouldMonitor(_ app: NSRunningApplication) -> Bool
19-
func createWindowInspector(processId: pid_t, windowElement: AXUIElement) -> WindowInspector?
20-
}
21-
22-
struct AppInstance {
23-
let app: NSRunningApplication
24-
let strategy: EditorStrategy
25-
var windowInspector: WindowInspector?
26-
27-
var displayName: String {
28-
strategy.displayName
29-
}
30-
31-
var processId: pid_t {
32-
app.processIdentifier
33-
}
34-
}
35-
365
@MainActor
376
class AppMonitor: ObservableObject {
387
@Published var monitoredApps: [String: AppInstance] = [:]
@@ -91,15 +60,19 @@ class AppMonitor: ObservableObject {
9160
object: nil,
9261
queue: .main
9362
) { [weak self] notification in
94-
self?.handleApplicationActivated(notification)
63+
Task { @MainActor in
64+
self?.handleApplicationActivated(notification)
65+
}
9566
}
9667

9768
NotificationCenter.default.addObserver(
9869
forName: NSWorkspace.didTerminateApplicationNotification,
9970
object: nil,
10071
queue: .main
10172
) { [weak self] notification in
102-
self?.handleApplicationTerminated(notification)
73+
Task { @MainActor in
74+
self?.handleApplicationTerminated(notification)
75+
}
10376
}
10477
}
10578

AS2/AS2/Core/Protocols.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import Cocoa
2+
import Foundation
3+
import ApplicationServices
4+
5+
protocol WindowInspector: AnyObject {
6+
var documentURL: URL? { get }
7+
var workspaceURL: URL? { get }
8+
var projectURL: URL? { get }
9+
var isMainWorkWindow: Bool { get }
10+
11+
func refresh()
12+
}
13+
14+
protocol EditorStrategy {
15+
var displayName: String { get }
16+
var bundleIdentifier: String { get }
17+
18+
func shouldMonitor(_ app: NSRunningApplication) -> Bool
19+
func createWindowInspector(processId: pid_t, windowElement: AXUIElement) -> WindowInspector?
20+
}
Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import Cocoa
22
import Foundation
33
import ApplicationServices
44

5-
/// Specialized Xcode monitor with enhanced Xcode-specific features
65
class XcodeMonitor: AppMonitor {
76
@Published var xcodeInstances: [NSRunningApplication] = []
87
@Published var activeXcode: NSRunningApplication?
@@ -24,7 +23,6 @@ class XcodeMonitor: AppMonitor {
2423
}
2524

2625
private func setupXcodeSpecificMonitoring() {
27-
// Subscribe to parent's state changes and maintain Xcode-specific properties
2826
$monitoredApps
2927
.map { apps in apps.values.compactMap { $0.app.isXcode ? $0.app : nil } }
3028
.assign(to: &$xcodeInstances)
@@ -49,16 +47,8 @@ class XcodeMonitor: AppMonitor {
4947
.compactMap { $0?.windowInspector?.projectURL }
5048
.assign(to: &$currentProjectURL)
5149

52-
// Track last active Xcode
5350
$activeXcode
5451
.compactMap { $0 }
5552
.assign(to: &$lastActiveXcode)
5653
}
57-
58-
}
59-
60-
extension NSRunningApplication {
61-
var isXcode: Bool {
62-
bundleIdentifier == "com.apple.dt.Xcode"
63-
}
6454
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import ApplicationServices
2+
import AppKit
3+
import Foundation
4+
5+
struct XcodeStrategy: EditorStrategy {
6+
let displayName = "Xcode"
7+
let bundleIdentifier = "com.apple.dt.Xcode"
8+
9+
func shouldMonitor(_ app: NSRunningApplication) -> Bool {
10+
return app.bundleIdentifier == bundleIdentifier
11+
}
12+
13+
func createWindowInspector(processId: pid_t, windowElement: AXUIElement) -> WindowInspector? {
14+
return XcodeWindowInspector(processIdentifier: processId, windowElement: windowElement)
15+
}
16+
}

AS2/AS2/XcodeStrategy.swift renamed to AS2/AS2/Editors/Xcode/XcodeWindowInspector.swift

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class XcodeWindowInspector: WindowInspector {
104104
if FileManager.default.fileExists(atPath: gitURL.path, isDirectory: &gitIsDirectory) {
105105
if gitIsDirectory.boolValue {
106106
lastGitDirectoryURL = currentURL
107-
} else if let gitContent = try? String(contentsOf: gitURL) {
107+
} else if let gitContent = try? String(contentsOf: gitURL, encoding: .utf8) {
108108
if !gitContent.hasPrefix("gitdir: ../") && gitContent.contains("/.git/worktrees/") {
109109
lastGitDirectoryURL = currentURL
110110
}
@@ -126,17 +126,4 @@ class XcodeWindowInspector: WindowInspector {
126126
}
127127
return url
128128
}
129-
}
130-
131-
struct XcodeStrategy: EditorStrategy {
132-
let displayName = "Xcode"
133-
let bundleIdentifier = "com.apple.dt.Xcode"
134-
135-
func shouldMonitor(_ app: NSRunningApplication) -> Bool {
136-
return app.bundleIdentifier == bundleIdentifier
137-
}
138-
139-
func createWindowInspector(processId: pid_t, windowElement: AXUIElement) -> WindowInspector? {
140-
return XcodeWindowInspector(processIdentifier: processId, windowElement: windowElement)
141-
}
142-
}
129+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Cocoa
2+
3+
extension NSRunningApplication {
4+
var isXcode: Bool {
5+
bundleIdentifier == "com.apple.dt.Xcode"
6+
}
7+
}

AS2/docs/XCODE_MONITORING_PLAN.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,23 @@ Following the proven architecture of CopilotForXcode, this document outlines the
224224
- ✅ Maintained backward compatibility with existing UI
225225
- ✅ Foundation ready for future VSCode, Sublime Text, etc. strategies
226226

227+
### **🏗️ ARCHITECTURE RESTRUCTURE COMPLETED**:
228+
**Improved Project Organization for Better Maintainability**
229+
-**Core/**: Framework abstractions separated from implementations
230+
- `Protocols.swift`: EditorStrategy, WindowInspector protocols
231+
- `AppInstance.swift`: Shared data structures
232+
- `AppMonitor.swift`: Generic monitoring engine (clean, focused)
233+
-**Editors/Xcode/**: Complete Xcode implementation namespace
234+
- `XcodeStrategy.swift`: Clean 13-line strategy implementation
235+
- `XcodeWindowInspector.swift`: 129 lines of focused window analysis
236+
- `XcodeMonitor.swift`: Specialized monitor with Xcode-specific features
237+
-**Extensions/**: Shared utilities and extensions
238+
- `NSRunningApplication+Extensions.swift`: isXcode property
239+
-**Single Responsibility**: Each file has one clear, focused purpose
240+
-**Future-Proof**: Adding new editors (VS Code, JetBrains) is now trivial
241+
-**Zero Build Warnings**: Clean compilation with proper async/await patterns
242+
-**Better Testability**: Clear boundaries for unit testing each component
243+
227244
### **🚀 Phase 3 NEXT**: Advanced Window Analysis
228245
**Ready to implement**:
229246
1. Navigate AX element tree structure for editor areas

0 commit comments

Comments
 (0)