Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions apps/purepoint-macos/purepoint-macos/State/AppState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,13 @@ final class AppState {

switch selection {
case .agent(let id), .terminal(let id):
activeProjectRoot = projectState(forAgentId: id)?.projectRoot
if let root = projectState(forAgentId: id)?.projectRoot {
activeProjectRoot = root
}
case .worktree(let id):
activeProjectRoot = projectState(forWorktreeId: id)?.projectRoot
if let root = projectState(forWorktreeId: id)?.projectRoot {
activeProjectRoot = root
}
case .project(let root):
activeProjectRoot = root
case nil, .nav:
Expand Down
6 changes: 6 additions & 0 deletions apps/purepoint-macos/purepoint-macos/State/ProjectState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ final class ProjectState: Identifiable {
)
) { response in
if case .spawnResult(_, let agentId, _) = response {
if self.appState?.projectState(forRoot: self.projectRoot) != nil {
self.appState?.activeProjectRoot = self.projectRoot
}
self.appState?.pendingSelectAgentId = agentId
}
}
Expand Down Expand Up @@ -196,6 +199,9 @@ final class ProjectState: Identifiable {
func createWorktree(name: String?) {
sendDaemonRequest(.createWorktree(projectRoot: projectRoot, name: name)) { response in
if case .createWorktreeResult(let worktreeId) = response {
if self.appState?.projectState(forRoot: self.projectRoot) != nil {
self.appState?.activeProjectRoot = self.projectRoot
}
self.appState?.pendingSelectWorktreeId = worktreeId
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,26 @@ struct ActiveProjectRoutingTests {
#expect(state.activeSidebarSelection == .agent("a1"))
}

@Test func unknownWorktreeIdPreservesActiveProjectRoot() {
let state = AppState(service: StubWorkspaceService())
state.projects = [makeProject(root: "/a"), makeProject(root: "/b")]
state.activeProjectRoot = "/a"

state.updateActiveProject(for: .worktree("nonexistent"))

#expect(state.activeProjectRoot == "/a")
}

@Test func unknownAgentIdPreservesActiveProjectRoot() {
let state = AppState(service: StubWorkspaceService())
state.projects = [makeProject(root: "/a"), makeProject(root: "/b")]
state.activeProjectRoot = "/a"

state.updateActiveProject(for: .agent("nonexistent"))

#expect(state.activeProjectRoot == "/a")
}

@Test func worktreeAgentTerminalRoutesThroughWorktree() {
let state = AppState(service: StubWorkspaceService())
state.projects = [
Expand Down
Loading