70 lines
2.7 KiB
Swift
70 lines
2.7 KiB
Swift
import Foundation
|
|
|
|
extension OnboardingView {
|
|
func loadWorkspaceDefaults() {
|
|
guard self.workspacePath.isEmpty else { return }
|
|
let configured = ClawdisConfigFile.agentWorkspace()
|
|
let url = AgentWorkspace.resolveWorkspaceURL(from: configured)
|
|
self.workspacePath = AgentWorkspace.displayPath(for: url)
|
|
self.refreshBootstrapStatus()
|
|
}
|
|
|
|
func ensureDefaultWorkspace() {
|
|
guard self.state.connectionMode == .local else { return }
|
|
let configured = ClawdisConfigFile.agentWorkspace()
|
|
let url = AgentWorkspace.resolveWorkspaceURL(from: configured)
|
|
switch AgentWorkspace.bootstrapSafety(for: url) {
|
|
case .safe:
|
|
do {
|
|
_ = try AgentWorkspace.bootstrap(workspaceURL: url)
|
|
if (configured ?? "").trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
|
|
ClawdisConfigFile.setAgentWorkspace(AgentWorkspace.displayPath(for: url))
|
|
}
|
|
} catch {
|
|
self.workspaceStatus = "Failed to create workspace: \(error.localizedDescription)"
|
|
}
|
|
case let .unsafe(reason):
|
|
self.workspaceStatus = "Workspace not touched: \(reason)"
|
|
}
|
|
self.refreshBootstrapStatus()
|
|
}
|
|
|
|
func refreshBootstrapStatus() {
|
|
let url = AgentWorkspace.resolveWorkspaceURL(from: self.workspacePath)
|
|
self.needsBootstrap = AgentWorkspace.needsBootstrap(workspaceURL: url)
|
|
if self.needsBootstrap {
|
|
self.didAutoKickoff = false
|
|
}
|
|
}
|
|
|
|
var workspaceBootstrapCommand: String {
|
|
let template = AgentWorkspace.defaultTemplate().trimmingCharacters(in: .whitespacesAndNewlines)
|
|
return """
|
|
mkdir -p ~/.clawdis/workspace
|
|
cat > ~/.clawdis/workspace/AGENTS.md <<'EOF'
|
|
\(template)
|
|
EOF
|
|
"""
|
|
}
|
|
|
|
func applyWorkspace() async {
|
|
guard !self.workspaceApplying else { return }
|
|
self.workspaceApplying = true
|
|
defer { self.workspaceApplying = false }
|
|
|
|
do {
|
|
let url = AgentWorkspace.resolveWorkspaceURL(from: self.workspacePath)
|
|
if case let .unsafe(reason) = AgentWorkspace.bootstrapSafety(for: url) {
|
|
self.workspaceStatus = "Workspace not created: \(reason)"
|
|
return
|
|
}
|
|
_ = try AgentWorkspace.bootstrap(workspaceURL: url)
|
|
self.workspacePath = AgentWorkspace.displayPath(for: url)
|
|
self.workspaceStatus = "Workspace ready at \(self.workspacePath)"
|
|
self.refreshBootstrapStatus()
|
|
} catch {
|
|
self.workspaceStatus = "Failed to create workspace: \(error.localizedDescription)"
|
|
}
|
|
}
|
|
}
|