diff --git a/HubKit/Sources/ClaudeHubApp/main.swift b/HubKit/Sources/ClaudeHubApp/main.swift index ee7325b..5b46851 100644 --- a/HubKit/Sources/ClaudeHubApp/main.swift +++ b/HubKit/Sources/ClaudeHubApp/main.swift @@ -6,7 +6,7 @@ import HubProjects import HubUI import SwiftUI -// Claude Hub —— 本地 AI 编程 agent 的调度中心。 +// Vibe Foreman —— 本地 AI 编程 agent 的调度中心。 // // 这个 target 刻意做得很薄:只负责启动 NSApplication、装配灵动岛和主窗口、 // 挂托盘图标。所有逻辑都在 HubKit 的各个库里,那些库可以 `swift test`,这里不行。 @@ -266,7 +266,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) item.button?.image = NSImage( systemSymbolName: "circle.hexagongrid.fill", - accessibilityDescription: "Claude Hub" + accessibilityDescription: "Vibe Foreman" ) let menu = NSMenu() @@ -282,7 +282,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { ).target = self menu.addItem(.separator()) menu.addItem( - withTitle: "退出 Claude Hub", action: #selector(quit), keyEquivalent: "q" + withTitle: "退出 Vibe Foreman", action: #selector(quit), keyEquivalent: "q" ).target = self item.menu = menu statusItem = item @@ -337,7 +337,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { backing: .buffered, defer: false ) - window.title = "Claude Hub" + window.title = "Vibe Foreman" window.titlebarAppearsTransparent = true window.contentView = NSHostingView(rootView: root) window.center() diff --git a/HubKit/Sources/HubIPC/HookEvent.swift b/HubKit/Sources/HubIPC/HookEvent.swift index dc0393d..97042ee 100644 --- a/HubKit/Sources/HubIPC/HookEvent.swift +++ b/HubKit/Sources/HubIPC/HookEvent.swift @@ -200,7 +200,7 @@ public struct HookDecision: Codable, Sendable { "hookSpecificOutput": [ "hookEventName": "PreToolUse", "permissionDecision": verdict.rawValue, - "permissionDecisionReason": reason ?? "被 Claude Hub 拦截", + "permissionDecisionReason": reason ?? "被 Vibe Foreman 拦截", ], ] guard let data = try? JSONSerialization.data(withJSONObject: output) else { return nil } diff --git a/HubKit/Sources/HubIPC/HubSocketServer.swift b/HubKit/Sources/HubIPC/HubSocketServer.swift index 5c006a3..d0eecb8 100644 --- a/HubKit/Sources/HubIPC/HubSocketServer.swift +++ b/HubKit/Sources/HubIPC/HubSocketServer.swift @@ -32,7 +32,7 @@ public final class HubSocketServer: @unchecked Sendable { public func start() throws { // 客户端可能在我们回写决策之前就关掉连接(不等应答的 hook、 // 被 Ctrl-C 掉的 hubctl、旧版二进制)。不忽略 SIGPIPE 的话, - // 那一次 write 会**直接杀掉 Claude Hub** —— 不是报错,是进程没了。 + // 那一次 write 会**直接杀掉 Vibe Foreman** —— 不是报错,是进程没了。 UnixSocket.ignoreSIGPIPEProcessWide() let fd = try UnixSocket.listen(at: path) @@ -56,7 +56,7 @@ public final class HubSocketServer: @unchecked Sendable { let clientFd = accept(listenFd, nil, nil) guard clientFd >= 0 else { return } // 客户端可能在我们回写之前就关掉连接(不等应答的 hook、被 Ctrl-C 掉的 - // hubctl)。不关掉 SIGPIPE 的话那一次 write 会**直接杀掉 Claude Hub**。 + // hubctl)。不关掉 SIGPIPE 的话那一次 write 会**直接杀掉 Vibe Foreman**。 UnixSocket.suppressSIGPIPE(fd: clientFd) workQueue.async { [handler] in diff --git a/HubKit/Sources/HubIPC/UnixSocket.swift b/HubKit/Sources/HubIPC/UnixSocket.swift index 17278fa..abf5f1a 100644 --- a/HubKit/Sources/HubIPC/UnixSocket.swift +++ b/HubKit/Sources/HubIPC/UnixSocket.swift @@ -142,7 +142,7 @@ enum UnixSocket { /// /// 这不是理论风险,是实测撞到的:Stop 改成需要应答之后,服务端会给 stop /// 回写决策;而不等应答的客户端(旧版 hubctl、被 Ctrl-C 掉的 hook) - /// 早就把连接关了。于是每一次这样的收工都会**杀掉 Claude Hub**。 + /// 早就把连接关了。于是每一次这样的收工都会**杀掉 Vibe Foreman**。 /// 测试套件是直接崩在 signal 13 上才暴露的。 /// /// 用 per-socket 的 `SO_NOSIGPIPE` 而不是全局 `signal(SIGPIPE, SIG_IGN)`: diff --git a/HubKit/Sources/HubProbe/AcceptanceAuditor.swift b/HubKit/Sources/HubProbe/AcceptanceAuditor.swift index 3be63ef..75a0493 100644 --- a/HubKit/Sources/HubProbe/AcceptanceAuditor.swift +++ b/HubKit/Sources/HubProbe/AcceptanceAuditor.swift @@ -202,9 +202,9 @@ public actor AcceptanceAuditor { \(summary) - + \(touchedBlock) - + <代码改动> \(patch) diff --git a/HubKit/Sources/HubUI/AcceptancePane.swift b/HubKit/Sources/HubUI/AcceptancePane.swift index 5777cd6..337718b 100644 --- a/HubKit/Sources/HubUI/AcceptancePane.swift +++ b/HubKit/Sources/HubUI/AcceptancePane.swift @@ -108,7 +108,7 @@ struct AcceptancePane: View { ContentUnavailableView( currentPath.map { "\(label(for: $0)) 还没有清单" } ?? "还没有项目", systemImage: "checklist", - description: Text("在下面手动加一条,或等 Claude Hub 从你的需求里自动拆出来") + description: Text("在下面手动加一条,或等 Vibe Foreman 从你的需求里自动拆出来") ) .frame(maxHeight: .infinity) } else { @@ -356,7 +356,7 @@ struct AcceptancePane: View { let lines = pending.prefix(8).map { "- \($0.text)" }.joined(separator: "\n") let more = pending.count > 8 ? "\n(另有 \(pending.count - 8) 项)" : "" let text = """ - 【Claude Hub】你自己列的 todo 里这几项还没做完,逐条确认一下现在的状态: + 【Vibe Foreman】你自己列的 todo 里这几项还没做完,逐条确认一下现在的状态: \(lines)\(more) """ let reply = self.reply diff --git a/HubKit/Sources/HubUI/AcceptanceStore.swift b/HubKit/Sources/HubUI/AcceptanceStore.swift index 514a47f..e12aa19 100644 --- a/HubKit/Sources/HubUI/AcceptanceStore.swift +++ b/HubKit/Sources/HubUI/AcceptanceStore.swift @@ -408,7 +408,7 @@ public final class AcceptanceStore { } return """ - 【Claude Hub 验收守望】以下要点来自**用户的原始需求和已批准的计划**,\ + 【Vibe Foreman 验收守望】以下要点来自**用户的原始需求和已批准的计划**,\ 不是你自己列的 todo。逐条核对,给结论和证据。 \(lines.joined(separator: "\n")) diff --git a/HubKit/Sources/HubUI/AgentPromptModel.swift b/HubKit/Sources/HubUI/AgentPromptModel.swift index de5958a..f9bfca0 100644 --- a/HubKit/Sources/HubUI/AgentPromptModel.swift +++ b/HubKit/Sources/HubUI/AgentPromptModel.swift @@ -82,7 +82,7 @@ public final class AgentPromptCoordinator { id: request.id, decision: HookDecision( verdict: .deny, - reason: "用户已在 Claude Hub 上选择:\(option.label)。请按这个选择继续,不要重复提问。" + reason: "用户已在 Vibe Foreman 上选择:\(option.label)。请按这个选择继续,不要重复提问。" ) ) } @@ -94,7 +94,7 @@ public final class AgentPromptCoordinator { id: request.id, decision: HookDecision( verdict: .deny, - reason: "用户已在 Claude Hub 上作答 —— \(joined)。请按这些选择继续,不要重复提问。" + reason: "用户已在 Vibe Foreman 上作答 —— \(joined)。请按这些选择继续,不要重复提问。" ) ) } @@ -113,7 +113,7 @@ public final class AgentPromptCoordinator { id: request.id, decision: HookDecision( verdict: .deny, - reason: "用户在 Claude Hub 上驳回了这份计划,请调整后重新提出。" + reason: "用户在 Vibe Foreman 上驳回了这份计划,请调整后重新提出。" ) ) } diff --git a/HubKit/Sources/HubUI/ApprovalModel.swift b/HubKit/Sources/HubUI/ApprovalModel.swift index 0cef931..78924fe 100644 --- a/HubKit/Sources/HubUI/ApprovalModel.swift +++ b/HubKit/Sources/HubUI/ApprovalModel.swift @@ -171,7 +171,7 @@ public final class ApprovalCoordinator { guard !Task.isCancelled else { return } await self?.resolve( id: request.id, - decision: HookDecision(verdict: .deny, reason: "Claude Hub:60 秒未响应,已自动拒绝"), + decision: HookDecision(verdict: .deny, reason: "Vibe Foreman:60 秒未响应,已自动拒绝"), verdictLabel: "timeout" ) } @@ -195,7 +195,7 @@ public final class ApprovalCoordinator { public func deny(_ request: ApprovalRequest) { resolve( id: request.id, - decision: HookDecision(verdict: .deny, reason: "用户在 Claude Hub 上拒绝了这次操作"), + decision: HookDecision(verdict: .deny, reason: "用户在 Vibe Foreman 上拒绝了这次操作"), verdictLabel: "deny" ) } diff --git a/HubKit/Sources/HubUI/DemoFixtures.swift b/HubKit/Sources/HubUI/DemoFixtures.swift index df8a314..c6336cf 100644 --- a/HubKit/Sources/HubUI/DemoFixtures.swift +++ b/HubKit/Sources/HubUI/DemoFixtures.swift @@ -14,7 +14,7 @@ import HubProjects /// /// 用法: /// -/// HUB_DEMO=1 HUB_ISLAND_STATE=hover "/Applications/Claude Hub.app/Contents/MacOS/ClaudeHub" +/// HUB_DEMO=1 HUB_ISLAND_STATE=hover "/Applications/Vibe Foreman.app/Contents/MacOS/ClaudeHub" /// /// 实现上是往临时目录写一批 `sessions/.json` 再让 reader 指过去, /// 而不是在 store 里塞假数据 —— 这样**走的是和生产完全一样的解析路径**, diff --git a/HubKit/Sources/HubUI/HookCoordinator.swift b/HubKit/Sources/HubUI/HookCoordinator.swift index 1aa0890..59822d2 100644 --- a/HubKit/Sources/HubUI/HookCoordinator.swift +++ b/HubKit/Sources/HubUI/HookCoordinator.swift @@ -630,7 +630,7 @@ public final class HookCoordinator { // 用户决策超时长,但比 hubctl 的读超时短。 if semaphore.wait(timeout: .now() + HookTimeouts.serverBridge) == .timedOut { HubLog.ipc.error("审批桥接超时,按拒绝处理") - return HookDecision(verdict: .deny, reason: "Claude Hub 审批超时") + return HookDecision(verdict: .deny, reason: "Vibe Foreman 审批超时") } HubLog.ipc.notice("用户决策:\(result.verdict.rawValue, privacy: .public)") return result diff --git a/HubKit/Sources/HubUI/IslandPanel.swift b/HubKit/Sources/HubUI/IslandPanel.swift index 86e7c4d..776c97e 100644 --- a/HubKit/Sources/HubUI/IslandPanel.swift +++ b/HubKit/Sources/HubUI/IslandPanel.swift @@ -4,7 +4,7 @@ import SwiftUI /// 承载灵动岛的窗口。 /// /// 几个设置都不是可选项: -/// - `.borderless` + `.nonactivatingPanel`:点岛不该把 Claude Hub 变成前台 app, +/// - `.borderless` + `.nonactivatingPanel`:点岛不该把 Vibe Foreman 变成前台 app, /// 否则用户点一下就丢了当前 app 的焦点。 /// - `level = .statusBar`(25):压过 `.mainMenu`(24),这样岛能盖在菜单栏之上。 /// - `.fullScreenAuxiliary`:别的 app 全屏时岛依然可见 —— 你在全屏 IDE 里写代码时 diff --git a/HubKit/Sources/HubUI/IslandRootView.swift b/HubKit/Sources/HubUI/IslandRootView.swift index 5d6cc38..1173e72 100644 --- a/HubKit/Sources/HubUI/IslandRootView.swift +++ b/HubKit/Sources/HubUI/IslandRootView.swift @@ -946,7 +946,7 @@ struct ExpandedContent: View { private var header: some View { HStack(spacing: 8) { - Text("Claude Hub") + Text("Vibe Foreman") .font(IslandTheme.label(13, .semibold)) .foregroundStyle(.white) Text("\(store.sessions.count) 会话") diff --git a/HubKit/Sources/HubUI/MainWindow.swift b/HubKit/Sources/HubUI/MainWindow.swift index 5d131cc..e96239e 100644 --- a/HubKit/Sources/HubUI/MainWindow.swift +++ b/HubKit/Sources/HubUI/MainWindow.swift @@ -921,14 +921,14 @@ struct SettingsPane: View { .font(.system(size: 14, weight: .semibold)) Text(""" - 关掉时 Claude Hub 一条命令都不会执行。打开后也仍有两道限制:\ + 关掉时 Vibe Foreman 一条命令都不会执行。打开后也仍有两道限制:\ 只放行构建/测试类命令(`swift test`、`npm run`、`bash scripts/*` 等),\ 含 shell 元字符的一律拒绝;而且**每条命令首次执行前要你在验收页点「允许」**。 """) .font(.system(size: 11)) .foregroundStyle(.secondary) - Text("这是 Claude Hub 唯一会在你机器上执行命令的功能。") + Text("这是 Vibe Foreman 唯一会在你机器上执行命令的功能。") .font(.system(size: 11, weight: .medium)) .foregroundStyle( verifierSettings.enabled ? IslandTheme.waiting : Color.secondary.opacity(0.6) @@ -974,7 +974,7 @@ struct SettingsPane: View { } } - Text("计数从 Claude Hub 启动时开始。刚装完 hook 的话,新开一个会话才会亮。") + Text("计数从 Vibe Foreman 启动时开始。刚装完 hook 的话,新开一个会话才会亮。") .font(.system(size: 11)) .foregroundStyle(.tertiary) .padding(.top, 2) diff --git a/HubKit/Sources/HubUI/NotificationCenter.swift b/HubKit/Sources/HubUI/NotificationCenter.swift index 1b58b1b..f2fcd6c 100644 --- a/HubKit/Sources/HubUI/NotificationCenter.swift +++ b/HubKit/Sources/HubUI/NotificationCenter.swift @@ -92,7 +92,7 @@ public final class HubNotificationCenter: NSObject, UNUserNotificationCenterDele /// app 在前台时也要显示横幅。 /// - /// Claude Hub 是 `.accessory` 类型,本来就不"在前台",但用户点开主窗口时 + /// Vibe Foreman 是 `.accessory` 类型,本来就不"在前台",但用户点开主窗口时 /// 它会变成活跃 app,这时通知照样得显示 —— 用户要的是知道别的会话怎么样了。 public nonisolated func userNotificationCenter( _ center: UNUserNotificationCenter, diff --git a/HubKit/Sources/HubUI/TerminalReply.swift b/HubKit/Sources/HubUI/TerminalReply.swift index f4ae060..986fd4d 100644 --- a/HubKit/Sources/HubUI/TerminalReply.swift +++ b/HubKit/Sources/HubUI/TerminalReply.swift @@ -311,7 +311,7 @@ public struct TerminalReply { // MARK: - 留痕 /// 护栏⑤。和审批日志放在一起 —— 两者是同一类东西: - /// "Claude Hub 替我做了什么不可逆的事"。 + /// "Vibe Foreman 替我做了什么不可逆的事"。 nonisolated static func log(text: String, sessionId: String, target: String) { HubLog.jump.notice( """ diff --git a/HubKit/Sources/hubctl/main.swift b/HubKit/Sources/hubctl/main.swift index 5b6a4f9..bd718a4 100644 --- a/HubKit/Sources/hubctl/main.swift +++ b/HubKit/Sources/hubctl/main.swift @@ -189,7 +189,7 @@ private func runHook(_ name: String) -> Int32 { // 它认为这次操作值得拦截,只是决策环节出了问题。这种情况必须拒绝 —— // 拒绝可恢复(Claude 会告诉用户并可重试),放行不可逆。 emitDecision( - HookDecision(verdict: .deny, reason: "Claude Hub 未能完成审批,已保守拒绝") + HookDecision(verdict: .deny, reason: "Vibe Foreman 未能完成审批,已保守拒绝") ) case .acknowledged: @@ -205,10 +205,10 @@ private func runDoctor() -> Int32 { print("socket 文件存在:\(FileManager.default.fileExists(atPath: path) ? "是" : "否")") if HubSocketClient.isHubRunning() { - print("连接测试:✓ Claude Hub 正在运行") + print("连接测试:✓ Vibe Foreman 正在运行") return 0 } - print("连接测试:✗ 连不上(Claude Hub 没运行,hook 会全部放行)") + print("连接测试:✗ 连不上(Vibe Foreman 没运行,hook 会全部放行)") return 1 }