This commit is contained in:
Mark Gregory
2026-10-16 21:34:30 +01:00
parent 2aedde9fe2
commit 773191f206
39 changed files with 324 additions and 252 deletions
+39 -2
View File
@@ -8,10 +8,12 @@ struct WorkbenchReplacementApp: App {
WindowGroup("Workbench Replacement") { WindowGroup("Workbench Replacement") {
WorkbenchLaunchView() WorkbenchLaunchView()
.environmentObject(model) .environmentObject(model)
.frame(minWidth: 1000, minHeight: 650) .frame(minWidth: 800, minHeight: 520)
} }
.defaultSize(width: 1200, height: 800)
.windowResizability(.contentSize)
.commands { .commands {
CommandGroup(replacing: .newItem) {} WorkbenchFileCommands(model: model)
} }
@@ -390,3 +392,38 @@ struct WorkbenchSplashView: View {
.frame(width: 90) .frame(width: 90)
} }
} }
// MARK: - Workbench File Menu
struct WorkbenchFileCommands: Commands {
@ObservedObject var model: DatabaseModel
var body: some Commands {
CommandGroup(replacing: .newItem) {
Button("New Query Tab") {
model.newQueryTab()
}
.keyboardShortcut("t", modifiers: .command)
}
CommandGroup(after: .newItem) {
Button("Open SQL Script…") {
model.openSQLScript()
}
.keyboardShortcut("o", modifiers: .command)
Divider()
Button("Save SQL Script") {
model.saveSQLScript()
}
.keyboardShortcut("s", modifiers: .command)
Button("Save SQL Script As…") {
model.saveSQLScript(asNewFile: true)
}
.keyboardShortcut("s", modifiers: [.command, .shift])
}
}
}
+138
View File
@@ -1,4 +1,5 @@
import Foundation import Foundation
import AppKit
import Security import Security
struct ConnectionProfile: Identifiable, Codable, Hashable { struct ConnectionProfile: Identifiable, Codable, Hashable {
@@ -39,10 +40,40 @@ enum PasswordStore {
} }
} }
struct WorkbenchQueryTab: Identifiable {
let id: UUID
var title: String
var sql: String
var result: QueryResult
var fileURL: URL?
init(
id: UUID = UUID(),
title: String,
sql: String = "",
result: QueryResult = QueryResult(),
fileURL: URL? = nil
) {
self.id = id
self.title = title
self.sql = sql
self.result = result
self.fileURL = fileURL
}
}
@MainActor @MainActor
final class DatabaseModel: ObservableObject { final class DatabaseModel: ObservableObject {
@Published var profiles: [ConnectionProfile] = [] @Published var profiles: [ConnectionProfile] = []
@Published var selectedID: UUID? @Published var selectedID: UUID?
@Published var queryTabs: [WorkbenchQueryTab] = [
WorkbenchQueryTab(
title: "Query 1",
sql: "SELECT VERSION() AS server_version;"
)
]
@Published var activeQueryID: UUID?
@Published var sql = "SELECT VERSION() AS server_version;" @Published var sql = "SELECT VERSION() AS server_version;"
@Published var result = QueryResult() @Published var result = QueryResult()
@Published var databases: [String] = [] @Published var databases: [String] = []
@@ -58,7 +89,109 @@ final class DatabaseModel: ObservableObject {
let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded } let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded }
if profiles.isEmpty { profiles = [ConnectionProfile()] } if profiles.isEmpty { profiles = [ConnectionProfile()] }
selectedID = profiles.first?.id selectedID = profiles.first?.id
activeQueryID = queryTabs.first?.id
} }
func newQueryTab() {
saveActiveQuery()
let tab = WorkbenchQueryTab(
title: "Query \\(queryTabs.count + 1)"
)
queryTabs.append(tab)
activeQueryID = tab.id
sql = tab.sql
result = tab.result
}
func saveActiveQuery() {
guard let id = activeQueryID,
let index = queryTabs.firstIndex(where: { $0.id == id })
else { return }
queryTabs[index].sql = sql
queryTabs[index].result = result
}
func activateQuery(_ id: UUID) {
saveActiveQuery()
guard let tab = queryTabs.first(where: { $0.id == id })
else { return }
activeQueryID = tab.id
sql = tab.sql
result = tab.result
}
func closeQuery(_ id: UUID) {
saveActiveQuery()
queryTabs.removeAll { $0.id == id }
if queryTabs.isEmpty {
let tab = WorkbenchQueryTab(title: "Query 1")
queryTabs.append(tab)
}
if activeQueryID == id {
activeQueryID = nil
activateQuery(queryTabs[0].id)
}
}
func openSQLScript() {
let panel = NSOpenPanel()
panel.allowedContentTypes = [.plainText]
panel.allowsOtherFileTypes = true
panel.canChooseDirectories = false
guard panel.runModal() == .OK,
let url = panel.url,
let contents = try? String(contentsOf: url, encoding: .utf8)
else { return }
saveActiveQuery()
let tab = WorkbenchQueryTab(
title: url.lastPathComponent,
sql: contents,
fileURL: url
)
queryTabs.append(tab)
activateQuery(tab.id)
status = "Opened \\(url.lastPathComponent)"
}
func saveSQLScript(asNewFile: Bool = false) {
saveActiveQuery()
guard let id = activeQueryID,
let index = queryTabs.firstIndex(where: { $0.id == id })
else { return }
var destination = asNewFile ? nil : queryTabs[index].fileURL
if destination == nil {
let panel = NSSavePanel()
panel.nameFieldStringValue = "query.sql"
panel.canCreateDirectories = true
guard panel.runModal() == .OK else { return }
destination = panel.url
}
guard let url = destination else { return }
do {
try sql.write(to: url, atomically: true, encoding: .utf8)
queryTabs[index].fileURL = url
queryTabs[index].title = url.lastPathComponent
status = "Saved \\(url.lastPathComponent)"
} catch {
status = "Save failed: \\(error.localizedDescription)"
}
}
var selected: ConnectionProfile? { profiles.first { $0.id == selectedID } } var selected: ConnectionProfile? { profiles.first { $0.id == selectedID } }
func save(_ profile: ConnectionProfile, password: String) { func save(_ profile: ConnectionProfile, password: String) {
if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile } if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile }
@@ -178,6 +311,11 @@ final class DatabaseModel: ObservableObject {
status = "Connected to \(profile.name)" status = "Connected to \(profile.name)"
} else { } else {
result = parsed result = parsed
if let id = activeQueryID,
let index = queryTabs.firstIndex(where: { $0.id == id }) {
queryTabs[index].sql = sql
queryTabs[index].result = parsed
}
status = "Query completed (\(parsed.rows.count) rows)" status = "Query completed (\(parsed.rows.count) rows)"
} }
} catch { } catch {
+53 -21
View File
@@ -44,18 +44,18 @@ struct MainView: View {
HSplitView { HSplitView {
navigator navigator
.frame( .frame(
minWidth: 210, minWidth: 180,
idealWidth: 265, idealWidth: 250,
maxWidth: 420 maxWidth: 420
) )
workspace workspace
.frame(minWidth: 600) .frame(minWidth: 480)
} }
statusBar statusBar
} }
.frame(minWidth: 1100, minHeight: 720) .frame(minWidth: 800, minHeight: 520)
.preferredColorScheme( .preferredColorScheme(
UserDefaults.standard.string( UserDefaults.standard.string(
forKey: "preferences.appearance" forKey: "preferences.appearance"
@@ -83,7 +83,7 @@ struct MainView: View {
Text("MySQL Workbench") Text("MySQL Workbench")
.font(.system(size: 15, weight: .semibold)) .font(.system(size: 15, weight: .semibold))
.foregroundStyle(.black) .foregroundStyle(.primary)
Rectangle() Rectangle()
.fill(WB.border) .fill(WB.border)
@@ -152,7 +152,7 @@ struct MainView: View {
Text(title) Text(title)
.font(.system(size: 10)) .font(.system(size: 10))
} }
.foregroundStyle(.black) .foregroundStyle(.primary)
.frame(minWidth: 65) .frame(minWidth: 65)
} }
.buttonStyle(.plain) .buttonStyle(.plain)
@@ -455,32 +455,64 @@ struct MainView: View {
VSplitView { VSplitView {
sqlEditor sqlEditor
.frame(minHeight: 230) .frame(minHeight: 150)
bottomWorkspace bottomWorkspace
.frame(minHeight: 230) .frame(minHeight: 150)
} }
} }
} }
private var queryTabBar: some View { private var queryTabBar: some View {
HStack(spacing: 0) { HStack(spacing: 0) {
HStack(spacing: 8) { ScrollView(.horizontal) {
Image(systemName: "doc.text") HStack(spacing: 2) {
.foregroundStyle(.blue) ForEach(model.queryTabs) { tab in
HStack(spacing: 8) {
Button {
model.activateQuery(tab.id)
} label: {
Label(tab.title, systemImage: "doc.text")
.lineLimit(1)
}
.buttonStyle(.plain)
Text("Query 1") Button {
.font(.system(size: 12, weight: .semibold)) model.closeQuery(tab.id)
} label: {
Image(systemName: "xmark") Image(systemName: "xmark")
.font(.system(size: 9)) .font(.system(size: 9))
.foregroundStyle(.secondary) }
.buttonStyle(.plain)
}
.font(.system(size: 12))
.padding(.horizontal, 10)
.frame(height: 30)
.background(
model.activeQueryID == tab.id
? Color(nsColor: .textBackgroundColor)
: Color.clear
)
.clipShape(
UnevenRoundedRectangle(
topLeadingRadius: 5,
topTrailingRadius: 5
)
)
}
}
} }
.padding(.horizontal, 10) .scrollIndicators(.hidden)
.frame(height: 29)
.background(Color(nsColor: .textBackgroundColor))
Spacer() Button {
model.newQueryTab()
} label: {
Image(systemName: "plus")
}
.buttonStyle(.borderless)
.padding(.horizontal, 10)
.help("New Query Tab")
} }
.background(WB.header) .background(WB.header)
} }
@@ -15,7 +15,7 @@
"key": "SQL Editor", "key": "SQL Editor",
"location": { "location": {
"startingColumn": 25, "startingColumn": 25,
"startingLine": 97 "startingLine": 99
} }
}, },
{ {
@@ -23,7 +23,7 @@
"key": "Query Execution", "key": "Query Execution",
"location": { "location": {
"startingColumn": 25, "startingColumn": 25,
"startingLine": 105 "startingLine": 107
} }
}, },
{ {
@@ -31,7 +31,7 @@
"key": "Result Grid", "key": "Result Grid",
"location": { "location": {
"startingColumn": 25, "startingColumn": 25,
"startingLine": 113 "startingLine": 115
} }
}, },
{ {
@@ -39,7 +39,7 @@
"key": "General", "key": "General",
"location": { "location": {
"startingColumn": 25, "startingColumn": 25,
"startingLine": 121 "startingLine": 123
} }
}, },
{ {
@@ -47,7 +47,7 @@
"key": "%lld pt", "key": "%lld pt",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 135 "startingLine": 137
} }
}, },
{ {
@@ -55,7 +55,7 @@
"key": "", "key": "",
"location": { "location": {
"startingColumn": 24, "startingColumn": 24,
"startingLine": 144 "startingLine": 146
} }
}, },
{ {
@@ -63,7 +63,7 @@
"key": "2 spaces", "key": "2 spaces",
"location": { "location": {
"startingColumn": 26, "startingColumn": 26,
"startingLine": 145 "startingLine": 147
} }
}, },
{ {
@@ -71,7 +71,7 @@
"key": "4 spaces", "key": "4 spaces",
"location": { "location": {
"startingColumn": 26, "startingColumn": 26,
"startingLine": 146 "startingLine": 148
} }
}, },
{ {
@@ -79,7 +79,7 @@
"key": "8 spaces", "key": "8 spaces",
"location": { "location": {
"startingColumn": 26, "startingColumn": 26,
"startingLine": 147 "startingLine": 149
} }
}, },
{ {
@@ -87,7 +87,7 @@
"key": "Automatically uppercase SQL keywords", "key": "Automatically uppercase SQL keywords",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 155 "startingLine": 157
} }
}, },
{ {
@@ -95,7 +95,7 @@
"key": "Show line numbers", "key": "Show line numbers",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 162 "startingLine": 164
} }
}, },
{ {
@@ -103,7 +103,7 @@
"key": "Controls the number of rows retrieved when opening a table from the schema navigator.", "key": "Controls the number of rows retrieved when opening a table from the schema navigator.",
"location": { "location": {
"startingColumn": 17, "startingColumn": 17,
"startingLine": 193 "startingLine": 195
} }
}, },
{ {
@@ -111,7 +111,7 @@
"key": "Examples", "key": "Examples",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 203 "startingLine": 205
} }
}, },
{ {
@@ -119,7 +119,7 @@
"key": "", "key": "",
"location": { "location": {
"startingColumn": 25, "startingColumn": 25,
"startingLine": 175 "startingLine": 177
} }
}, },
{ {
@@ -127,7 +127,7 @@
"key": "", "key": "",
"location": { "location": {
"startingColumn": 25, "startingColumn": 25,
"startingLine": 183 "startingLine": 185
} }
}, },
{ {
@@ -135,7 +135,7 @@
"key": "%lld px", "key": "%lld px",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 222 "startingLine": 224
} }
}, },
{ {
@@ -143,7 +143,7 @@
"key": "%lld px", "key": "%lld px",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 232 "startingLine": 234
} }
}, },
{ {
@@ -151,7 +151,7 @@
"key": "Alternating row colours", "key": "Alternating row colours",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 242 "startingLine": 244
} }
}, },
{ {
@@ -159,7 +159,7 @@
"key": "Automatically expand table folders", "key": "Automatically expand table folders",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 254 "startingLine": 256
} }
}, },
{ {
@@ -167,7 +167,7 @@
"key": "Workbench Replacement", "key": "Workbench Replacement",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 342 "startingLine": 344
} }
}, },
{ {
@@ -175,7 +175,7 @@
"key": "Modern MySQL Client for macOS", "key": "Modern MySQL Client for macOS",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 345 "startingLine": 347
} }
}, },
{ {
@@ -183,7 +183,39 @@
"key": "Starting Workbench Replacement…", "key": "Starting Workbench Replacement…",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 362 "startingLine": 364
}
},
{
"comment": "",
"key": "New Query Tab",
"location": {
"startingColumn": 20,
"startingLine": 404
}
},
{
"comment": "",
"key": "Open SQL Script…",
"location": {
"startingColumn": 20,
"startingLine": 411
}
},
{
"comment": "",
"key": "Save SQL Script",
"location": {
"startingColumn": 20,
"startingLine": 418
}
},
{
"comment": "",
"key": "Save SQL Script As…",
"location": {
"startingColumn": 20,
"startingLine": 423
} }
} }
] ]
@@ -68,10 +68,10 @@
}, },
{ {
"comment": "", "comment": "",
"key": "Query 1", "key": "New Query Tab",
"location": { "location": {
"startingColumn": 22, "startingColumn": 19,
"startingLine": 472 "startingLine": 515
} }
}, },
{ {
@@ -79,7 +79,7 @@
"key": "Default Schema:", "key": "Default Schema:",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 508 "startingLine": 540
} }
}, },
{ {
@@ -87,7 +87,7 @@
"key": "SQL Editor", "key": "SQL Editor",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 518 "startingLine": 550
} }
}, },
{ {
@@ -95,7 +95,7 @@
"key": "Execute SQL", "key": "Execute SQL",
"location": { "location": {
"startingColumn": 19, "startingColumn": 19,
"startingLine": 496 "startingLine": 528
} }
}, },
{ {
@@ -103,7 +103,7 @@
"key": "Format SQL", "key": "Format SQL",
"location": { "location": {
"startingColumn": 19, "startingColumn": 19,
"startingLine": 503 "startingLine": 535
} }
}, },
{ {
@@ -111,7 +111,7 @@
"key": "%lld", "key": "%lld",
"location": { "location": {
"startingColumn": 26, "startingColumn": 26,
"startingLine": 558 "startingLine": 590
} }
}, },
{ {
@@ -119,7 +119,7 @@
"key": "Result Grid", "key": "Result Grid",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 590 "startingLine": 622
} }
}, },
{ {
@@ -127,7 +127,7 @@
"key": "No query results", "key": "No query results",
"location": { "location": {
"startingColumn": 26, "startingColumn": 26,
"startingLine": 608 "startingLine": 640
} }
}, },
{ {
@@ -135,7 +135,7 @@
"key": "Action Output", "key": "Action Output",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 630 "startingLine": 662
} }
}, },
{ {
@@ -143,7 +143,7 @@
"key": "UTF-8", "key": "UTF-8",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 705 "startingLine": 737
} }
}, },
{ {
@@ -151,7 +151,7 @@
"key": "Connection Settings", "key": "Connection Settings",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 880 "startingLine": 912
} }
}, },
{ {
@@ -159,7 +159,7 @@
"key": "Connection Name", "key": "Connection Name",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 885 "startingLine": 917
} }
}, },
{ {
@@ -167,7 +167,7 @@
"key": "Hostname", "key": "Hostname",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 890 "startingLine": 922
} }
}, },
{ {
@@ -175,7 +175,7 @@
"key": "Port", "key": "Port",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 895 "startingLine": 927
} }
}, },
{ {
@@ -183,7 +183,7 @@
"key": "Username", "key": "Username",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 901 "startingLine": 933
} }
}, },
{ {
@@ -191,7 +191,7 @@
"key": "Password (macOS Keychain)", "key": "Password (macOS Keychain)",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 906 "startingLine": 938
} }
}, },
{ {
@@ -199,7 +199,7 @@
"key": "Default Schema", "key": "Default Schema",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 911 "startingLine": 943
} }
}, },
{ {
@@ -207,7 +207,7 @@
"key": "Cancel", "key": "Cancel",
"location": { "location": {
"startingColumn": 24, "startingColumn": 24,
"startingLine": 919 "startingLine": 951
} }
}, },
{ {
@@ -215,7 +215,7 @@
"key": "Save", "key": "Save",
"location": { "location": {
"startingColumn": 24, "startingColumn": 24,
"startingLine": 923 "startingLine": 955
} }
} }
] ]
@@ -1,3 +1,4 @@
01e80553e66def7e23d38bd3c911deaa 01e80553e66def7e23d38bd3c911deaa
fde3a409a1c7aaa1a5eda9dfaf1056e0 fde3a409a1c7aaa1a5eda9dfaf1056e0
1c438df96f25657d77b9e55a3fe47133 1c438df96f25657d77b9e55a3fe47133
120e9a8ae12faa2f3ba3b63c6df49ba3
@@ -1,3 +1,5 @@
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
@@ -10,8 +10,6 @@
<string>Workbench Replacement</string> <string>Workbench Replacement</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>WorkbenchReplacement</string> <string>WorkbenchReplacement</string>
<key>CFBundleIconFile</key>
<string>WorkbenchReplacement.icns</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>net.absdev.WorkbenchReplacement</string> <string>net.absdev.WorkbenchReplacement</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
@@ -19,19 +19,19 @@
<dict> <dict>
<key>cdhash</key> <key>cdhash</key>
<data> <data>
Ts5PCMroOdIOXrgimUvtGdRFzNg= 1TJJDc7LhSK1AHyUbPhKlUy9S8A=
</data> </data>
<key>requirement</key> <key>requirement</key>
<string>cdhash H"4ece4f08cae839d20e5eb822994bed19d445ccd8"</string> <string>identifier "WorkbenchReplacement.debug" and anchor apple generic and certificate leaf[subject.CN] = "Apple Development: Mark Gregory (FLBRJ3BYDD)" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */</string>
</dict> </dict>
<key>MacOS/__preview.dylib</key> <key>MacOS/__preview.dylib</key>
<dict> <dict>
<key>cdhash</key> <key>cdhash</key>
<data> <data>
dKXeHBcR4xL0+Si9Vpmkik2aSbI= eRYaNIE92/BHmGdKwbMscza9I3g=
</data> </data>
<key>requirement</key> <key>requirement</key>
<string>cdhash H"74a5de1c1711e312f4f928bd5699a48a4d9a49b2"</string> <string>identifier "__preview" and anchor apple generic and certificate leaf[subject.CN] = "Apple Development: Mark Gregory (FLBRJ3BYDD)" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */</string>
</dict> </dict>
<key>Resources/WorkbenchBrand.png</key> <key>Resources/WorkbenchBrand.png</key>
<dict> <dict>
+10 -178
View File
@@ -6,7 +6,7 @@
<integer>13</integer> <integer>13</integer>
<key>logs</key> <key>logs</key>
<dict> <dict>
<key>78BF6F7C-BE7A-47AA-9498-A54A28B82425</key> <key>5D8CEBC3-1273-4D6E-BDAB-8D198A9BCA61</key>
<dict> <dict>
<key>className</key> <key>className</key>
<string>IDECommandLineBuildLog</string> <string>IDECommandLineBuildLog</string>
@@ -15,7 +15,7 @@
<key>domainType</key> <key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string> <string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key> <key>fileName</key>
<string>78BF6F7C-BE7A-47AA-9498-A54A28B82425.xcactivitylog</string> <string>5D8CEBC3-1273-4D6E-BDAB-8D198A9BCA61.xcactivitylog</string>
<key>hasPrimaryLog</key> <key>hasPrimaryLog</key>
<true/> <true/>
<key>primaryObservable</key> <key>primaryObservable</key>
@@ -40,15 +40,15 @@
<key>signature</key> <key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string> <string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key> <key>timeStartedRecording</key>
<real>813861179.38466096</real> <real>813875595.87715495</real>
<key>timeStoppedRecording</key> <key>timeStoppedRecording</key>
<real>813861185.45915306</real> <real>813875606.38803506</real>
<key>title</key> <key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string> <string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key> <key>uniqueIdentifier</key>
<string>78BF6F7C-BE7A-47AA-9498-A54A28B82425</string> <string>5D8CEBC3-1273-4D6E-BDAB-8D198A9BCA61</string>
</dict> </dict>
<key>7E3E8A73-55F0-4794-BE1D-8EBED17516D6</key> <key>8EB6F71B-1109-492D-84B8-8C2FE5C14BB0</key>
<dict> <dict>
<key>className</key> <key>className</key>
<string>IDECommandLineBuildLog</string> <string>IDECommandLineBuildLog</string>
@@ -57,7 +57,7 @@
<key>domainType</key> <key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string> <string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key> <key>fileName</key>
<string>7E3E8A73-55F0-4794-BE1D-8EBED17516D6.xcactivitylog</string> <string>8EB6F71B-1109-492D-84B8-8C2FE5C14BB0.xcactivitylog</string>
<key>hasPrimaryLog</key> <key>hasPrimaryLog</key>
<true/> <true/>
<key>primaryObservable</key> <key>primaryObservable</key>
@@ -82,181 +82,13 @@
<key>signature</key> <key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string> <string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key> <key>timeStartedRecording</key>
<real>813861040.02156603</real> <real>813875432.68892801</real>
<key>timeStoppedRecording</key> <key>timeStoppedRecording</key>
<real>813861045.85164797</real> <real>813875443.71130598</real>
<key>title</key> <key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string> <string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key> <key>uniqueIdentifier</key>
<string>7E3E8A73-55F0-4794-BE1D-8EBED17516D6</string> <string>8EB6F71B-1109-492D-84B8-8C2FE5C14BB0</string>
</dict>
<key>81BE8778-FF76-42DF-8BEC-5179A17D2695</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
<key>documentTypeString</key>
<string>&lt;nil&gt;</string>
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>81BE8778-FF76-42DF-8BEC-5179A17D2695.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
<dict>
<key>highLevelStatus</key>
<string>S</string>
<key>totalNumberOfAnalyzerIssues</key>
<integer>0</integer>
<key>totalNumberOfErrors</key>
<integer>0</integer>
<key>totalNumberOfTestFailures</key>
<integer>0</integer>
<key>totalNumberOfWarnings</key>
<integer>0</integer>
</dict>
<key>schemeIdentifier-containerName</key>
<string>WorkbenchReplacement project</string>
<key>schemeIdentifier-schemeName</key>
<string>WorkbenchReplacement</string>
<key>schemeIdentifier-sharedScheme</key>
<integer>1</integer>
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813860932.82895195</real>
<key>timeStoppedRecording</key>
<real>813860938.50552499</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>81BE8778-FF76-42DF-8BEC-5179A17D2695</string>
</dict>
<key>B0859816-0F24-4E53-B015-2E939106D07B</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
<key>documentTypeString</key>
<string>&lt;nil&gt;</string>
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>B0859816-0F24-4E53-B015-2E939106D07B.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
<dict>
<key>highLevelStatus</key>
<string>S</string>
<key>totalNumberOfAnalyzerIssues</key>
<integer>0</integer>
<key>totalNumberOfErrors</key>
<integer>0</integer>
<key>totalNumberOfTestFailures</key>
<integer>0</integer>
<key>totalNumberOfWarnings</key>
<integer>0</integer>
</dict>
<key>schemeIdentifier-containerName</key>
<string>WorkbenchReplacement project</string>
<key>schemeIdentifier-schemeName</key>
<string>WorkbenchReplacement</string>
<key>schemeIdentifier-sharedScheme</key>
<integer>1</integer>
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813860864.44753695</real>
<key>timeStoppedRecording</key>
<real>813860865.80887902</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>B0859816-0F24-4E53-B015-2E939106D07B</string>
</dict>
<key>C19F0156-EDB1-455B-90E1-2893AA66ADDB</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
<key>documentTypeString</key>
<string>&lt;nil&gt;</string>
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>C19F0156-EDB1-455B-90E1-2893AA66ADDB.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
<dict>
<key>highLevelStatus</key>
<string>S</string>
<key>totalNumberOfAnalyzerIssues</key>
<integer>0</integer>
<key>totalNumberOfErrors</key>
<integer>0</integer>
<key>totalNumberOfTestFailures</key>
<integer>0</integer>
<key>totalNumberOfWarnings</key>
<integer>0</integer>
</dict>
<key>schemeIdentifier-containerName</key>
<string>WorkbenchReplacement project</string>
<key>schemeIdentifier-schemeName</key>
<string>WorkbenchReplacement</string>
<key>schemeIdentifier-sharedScheme</key>
<integer>1</integer>
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813860953.41163003</real>
<key>timeStoppedRecording</key>
<real>813860955.66303599</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>C19F0156-EDB1-455B-90E1-2893AA66ADDB</string>
</dict>
<key>E70DDCDB-1B87-4C30-B4F3-0CF1515A78F6</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
<key>documentTypeString</key>
<string>&lt;nil&gt;</string>
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>E70DDCDB-1B87-4C30-B4F3-0CF1515A78F6.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
<dict>
<key>highLevelStatus</key>
<string>S</string>
<key>totalNumberOfAnalyzerIssues</key>
<integer>0</integer>
<key>totalNumberOfErrors</key>
<integer>0</integer>
<key>totalNumberOfTestFailures</key>
<integer>0</integer>
<key>totalNumberOfWarnings</key>
<integer>0</integer>
</dict>
<key>schemeIdentifier-containerName</key>
<string>WorkbenchReplacement project</string>
<key>schemeIdentifier-schemeName</key>
<string>WorkbenchReplacement</string>
<key>schemeIdentifier-sharedScheme</key>
<integer>1</integer>
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813861120.32193995</real>
<key>timeStoppedRecording</key>
<real>813861120.77534199</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>E70DDCDB-1B87-4C30-B4F3-0CF1515A78F6</string>
</dict> </dict>
</dict> </dict>
</dict> </dict>
@@ -1 +1 @@
1792168379.781714: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex") 1792182796.251258: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex")
+1 -1
View File
@@ -3,7 +3,7 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>LastAccessedDate</key> <key>LastAccessedDate</key>
<date>2026-10-16T16:32:59Z</date> <date>2026-10-16T20:33:16Z</date>
<key>WorkspacePath</key> <key>WorkspacePath</key>
<string>/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj</string> <string>/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj</string>
</dict> </dict>