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") {
WorkbenchLaunchView()
.environmentObject(model)
.frame(minWidth: 1000, minHeight: 650)
.frame(minWidth: 800, minHeight: 520)
}
.defaultSize(width: 1200, height: 800)
.windowResizability(.contentSize)
.commands {
CommandGroup(replacing: .newItem) {}
WorkbenchFileCommands(model: model)
}
@@ -390,3 +392,38 @@ struct WorkbenchSplashView: View {
.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 AppKit
import Security
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
final class DatabaseModel: ObservableObject {
@Published var profiles: [ConnectionProfile] = []
@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 result = QueryResult()
@Published var databases: [String] = []
@@ -58,7 +89,109 @@ final class DatabaseModel: ObservableObject {
let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded }
if profiles.isEmpty { profiles = [ConnectionProfile()] }
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 } }
func save(_ profile: ConnectionProfile, password: String) {
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)"
} else {
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)"
}
} catch {
+53 -21
View File
@@ -44,18 +44,18 @@ struct MainView: View {
HSplitView {
navigator
.frame(
minWidth: 210,
idealWidth: 265,
minWidth: 180,
idealWidth: 250,
maxWidth: 420
)
workspace
.frame(minWidth: 600)
.frame(minWidth: 480)
}
statusBar
}
.frame(minWidth: 1100, minHeight: 720)
.frame(minWidth: 800, minHeight: 520)
.preferredColorScheme(
UserDefaults.standard.string(
forKey: "preferences.appearance"
@@ -83,7 +83,7 @@ struct MainView: View {
Text("MySQL Workbench")
.font(.system(size: 15, weight: .semibold))
.foregroundStyle(.black)
.foregroundStyle(.primary)
Rectangle()
.fill(WB.border)
@@ -152,7 +152,7 @@ struct MainView: View {
Text(title)
.font(.system(size: 10))
}
.foregroundStyle(.black)
.foregroundStyle(.primary)
.frame(minWidth: 65)
}
.buttonStyle(.plain)
@@ -455,32 +455,64 @@ struct MainView: View {
VSplitView {
sqlEditor
.frame(minHeight: 230)
.frame(minHeight: 150)
bottomWorkspace
.frame(minHeight: 230)
.frame(minHeight: 150)
}
}
}
private var queryTabBar: some View {
HStack(spacing: 0) {
HStack(spacing: 8) {
Image(systemName: "doc.text")
.foregroundStyle(.blue)
ScrollView(.horizontal) {
HStack(spacing: 2) {
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")
.font(.system(size: 12, weight: .semibold))
Image(systemName: "xmark")
.font(.system(size: 9))
.foregroundStyle(.secondary)
Button {
model.closeQuery(tab.id)
} label: {
Image(systemName: "xmark")
.font(.system(size: 9))
}
.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)
.frame(height: 29)
.background(Color(nsColor: .textBackgroundColor))
.scrollIndicators(.hidden)
Spacer()
Button {
model.newQueryTab()
} label: {
Image(systemName: "plus")
}
.buttonStyle(.borderless)
.padding(.horizontal, 10)
.help("New Query Tab")
}
.background(WB.header)
}
@@ -15,7 +15,7 @@
"key": "SQL Editor",
"location": {
"startingColumn": 25,
"startingLine": 97
"startingLine": 99
}
},
{
@@ -23,7 +23,7 @@
"key": "Query Execution",
"location": {
"startingColumn": 25,
"startingLine": 105
"startingLine": 107
}
},
{
@@ -31,7 +31,7 @@
"key": "Result Grid",
"location": {
"startingColumn": 25,
"startingLine": 113
"startingLine": 115
}
},
{
@@ -39,7 +39,7 @@
"key": "General",
"location": {
"startingColumn": 25,
"startingLine": 121
"startingLine": 123
}
},
{
@@ -47,7 +47,7 @@
"key": "%lld pt",
"location": {
"startingColumn": 21,
"startingLine": 135
"startingLine": 137
}
},
{
@@ -55,7 +55,7 @@
"key": "",
"location": {
"startingColumn": 24,
"startingLine": 144
"startingLine": 146
}
},
{
@@ -63,7 +63,7 @@
"key": "2 spaces",
"location": {
"startingColumn": 26,
"startingLine": 145
"startingLine": 147
}
},
{
@@ -71,7 +71,7 @@
"key": "4 spaces",
"location": {
"startingColumn": 26,
"startingLine": 146
"startingLine": 148
}
},
{
@@ -79,7 +79,7 @@
"key": "8 spaces",
"location": {
"startingColumn": 26,
"startingLine": 147
"startingLine": 149
}
},
{
@@ -87,7 +87,7 @@
"key": "Automatically uppercase SQL keywords",
"location": {
"startingColumn": 21,
"startingLine": 155
"startingLine": 157
}
},
{
@@ -95,7 +95,7 @@
"key": "Show line numbers",
"location": {
"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.",
"location": {
"startingColumn": 17,
"startingLine": 193
"startingLine": 195
}
},
{
@@ -111,7 +111,7 @@
"key": "Examples",
"location": {
"startingColumn": 18,
"startingLine": 203
"startingLine": 205
}
},
{
@@ -119,7 +119,7 @@
"key": "",
"location": {
"startingColumn": 25,
"startingLine": 175
"startingLine": 177
}
},
{
@@ -127,7 +127,7 @@
"key": "",
"location": {
"startingColumn": 25,
"startingLine": 183
"startingLine": 185
}
},
{
@@ -135,7 +135,7 @@
"key": "%lld px",
"location": {
"startingColumn": 21,
"startingLine": 222
"startingLine": 224
}
},
{
@@ -143,7 +143,7 @@
"key": "%lld px",
"location": {
"startingColumn": 21,
"startingLine": 232
"startingLine": 234
}
},
{
@@ -151,7 +151,7 @@
"key": "Alternating row colours",
"location": {
"startingColumn": 21,
"startingLine": 242
"startingLine": 244
}
},
{
@@ -159,7 +159,7 @@
"key": "Automatically expand table folders",
"location": {
"startingColumn": 21,
"startingLine": 254
"startingLine": 256
}
},
{
@@ -167,7 +167,7 @@
"key": "Workbench Replacement",
"location": {
"startingColumn": 18,
"startingLine": 342
"startingLine": 344
}
},
{
@@ -175,7 +175,7 @@
"key": "Modern MySQL Client for macOS",
"location": {
"startingColumn": 18,
"startingLine": 345
"startingLine": 347
}
},
{
@@ -183,7 +183,39 @@
"key": "Starting Workbench Replacement…",
"location": {
"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": "",
"key": "Query 1",
"key": "New Query Tab",
"location": {
"startingColumn": 22,
"startingLine": 472
"startingColumn": 19,
"startingLine": 515
}
},
{
@@ -79,7 +79,7 @@
"key": "Default Schema:",
"location": {
"startingColumn": 18,
"startingLine": 508
"startingLine": 540
}
},
{
@@ -87,7 +87,7 @@
"key": "SQL Editor",
"location": {
"startingColumn": 18,
"startingLine": 518
"startingLine": 550
}
},
{
@@ -95,7 +95,7 @@
"key": "Execute SQL",
"location": {
"startingColumn": 19,
"startingLine": 496
"startingLine": 528
}
},
{
@@ -103,7 +103,7 @@
"key": "Format SQL",
"location": {
"startingColumn": 19,
"startingLine": 503
"startingLine": 535
}
},
{
@@ -111,7 +111,7 @@
"key": "%lld",
"location": {
"startingColumn": 26,
"startingLine": 558
"startingLine": 590
}
},
{
@@ -119,7 +119,7 @@
"key": "Result Grid",
"location": {
"startingColumn": 22,
"startingLine": 590
"startingLine": 622
}
},
{
@@ -127,7 +127,7 @@
"key": "No query results",
"location": {
"startingColumn": 26,
"startingLine": 608
"startingLine": 640
}
},
{
@@ -135,7 +135,7 @@
"key": "Action Output",
"location": {
"startingColumn": 22,
"startingLine": 630
"startingLine": 662
}
},
{
@@ -143,7 +143,7 @@
"key": "UTF-8",
"location": {
"startingColumn": 18,
"startingLine": 705
"startingLine": 737
}
},
{
@@ -151,7 +151,7 @@
"key": "Connection Settings",
"location": {
"startingColumn": 18,
"startingLine": 880
"startingLine": 912
}
},
{
@@ -159,7 +159,7 @@
"key": "Connection Name",
"location": {
"startingColumn": 21,
"startingLine": 885
"startingLine": 917
}
},
{
@@ -167,7 +167,7 @@
"key": "Hostname",
"location": {
"startingColumn": 21,
"startingLine": 890
"startingLine": 922
}
},
{
@@ -175,7 +175,7 @@
"key": "Port",
"location": {
"startingColumn": 21,
"startingLine": 895
"startingLine": 927
}
},
{
@@ -183,7 +183,7 @@
"key": "Username",
"location": {
"startingColumn": 21,
"startingLine": 901
"startingLine": 933
}
},
{
@@ -191,7 +191,7 @@
"key": "Password (macOS Keychain)",
"location": {
"startingColumn": 21,
"startingLine": 906
"startingLine": 938
}
},
{
@@ -199,7 +199,7 @@
"key": "Default Schema",
"location": {
"startingColumn": 21,
"startingLine": 911
"startingLine": 943
}
},
{
@@ -207,7 +207,7 @@
"key": "Cancel",
"location": {
"startingColumn": 24,
"startingLine": 919
"startingLine": 951
}
},
{
@@ -215,7 +215,7 @@
"key": "Save",
"location": {
"startingColumn": 24,
"startingLine": 923
"startingLine": 955
}
}
]
@@ -1,3 +1,4 @@
01e80553e66def7e23d38bd3c911deaa
fde3a409a1c7aaa1a5eda9dfaf1056e0
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
@@ -10,8 +10,6 @@
<string>Workbench Replacement</string>
<key>CFBundleExecutable</key>
<string>WorkbenchReplacement</string>
<key>CFBundleIconFile</key>
<string>WorkbenchReplacement.icns</string>
<key>CFBundleIdentifier</key>
<string>net.absdev.WorkbenchReplacement</string>
<key>CFBundleInfoDictionaryVersion</key>
@@ -19,19 +19,19 @@
<dict>
<key>cdhash</key>
<data>
Ts5PCMroOdIOXrgimUvtGdRFzNg=
1TJJDc7LhSK1AHyUbPhKlUy9S8A=
</data>
<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>
<key>MacOS/__preview.dylib</key>
<dict>
<key>cdhash</key>
<data>
dKXeHBcR4xL0+Si9Vpmkik2aSbI=
eRYaNIE92/BHmGdKwbMscza9I3g=
</data>
<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>
<key>Resources/WorkbenchBrand.png</key>
<dict>
+10 -178
View File
@@ -6,7 +6,7 @@
<integer>13</integer>
<key>logs</key>
<dict>
<key>78BF6F7C-BE7A-47AA-9498-A54A28B82425</key>
<key>5D8CEBC3-1273-4D6E-BDAB-8D198A9BCA61</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
@@ -15,7 +15,7 @@
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>78BF6F7C-BE7A-47AA-9498-A54A28B82425.xcactivitylog</string>
<string>5D8CEBC3-1273-4D6E-BDAB-8D198A9BCA61.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
@@ -40,15 +40,15 @@
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813861179.38466096</real>
<real>813875595.87715495</real>
<key>timeStoppedRecording</key>
<real>813861185.45915306</real>
<real>813875606.38803506</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>78BF6F7C-BE7A-47AA-9498-A54A28B82425</string>
<string>5D8CEBC3-1273-4D6E-BDAB-8D198A9BCA61</string>
</dict>
<key>7E3E8A73-55F0-4794-BE1D-8EBED17516D6</key>
<key>8EB6F71B-1109-492D-84B8-8C2FE5C14BB0</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
@@ -57,7 +57,7 @@
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>7E3E8A73-55F0-4794-BE1D-8EBED17516D6.xcactivitylog</string>
<string>8EB6F71B-1109-492D-84B8-8C2FE5C14BB0.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
@@ -82,181 +82,13 @@
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813861040.02156603</real>
<real>813875432.68892801</real>
<key>timeStoppedRecording</key>
<real>813861045.85164797</real>
<real>813875443.71130598</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>7E3E8A73-55F0-4794-BE1D-8EBED17516D6</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>
<string>8EB6F71B-1109-492D-84B8-8C2FE5C14BB0</string>
</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">
<dict>
<key>LastAccessedDate</key>
<date>2026-10-16T16:32:59Z</date>
<date>2026-10-16T20:33:16Z</date>
<key>WorkspacePath</key>
<string>/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj</string>
</dict>