diff --git a/README.md b/README.md index a04a13293..1ba5a65d2 100644 --- a/README.md +++ b/README.md @@ -40,21 +40,21 @@ openclaw onboard Arc has one runtime with two surfaces: -| Surface | Role | -| --- | --- | +| Surface | Role | +| ------------------- | ------------------------------------------------------ | | **Swift macOS app** | Flagship review workstation — diffs, queues, decisions | -| **VPS TUI** | Fast remote operator console — queue, inspect, unblock | +| **VPS TUI** | Fast remote operator console — queue, inspect, unblock | ### The Layer Model Arc only makes sense if the layers stay clean: -| Layer | Role | -| --- | --- | -| **Arc** | product, workflow, workstation, project cockpit | -| **OpenClaw** | runtime, gateway, worktrees, worker lifecycle, durable state | -| **Claude + Codex** | worker engines that do the coding work | -| **Obsidian** | planning, notes, specs, architecture, project memory | +| Layer | Role | +| ------------------ | ------------------------------------------------------------ | +| **Arc** | product, workflow, workstation, project cockpit | +| **OpenClaw** | runtime, gateway, worktrees, worker lifecycle, durable state | +| **Claude + Codex** | worker engines that do the coding work | +| **Obsidian** | planning, notes, specs, architecture, project memory | Obsidian should hold thinking. Arc should hold execution. diff --git a/apps/macos/Sources/OpenClaw/CockpitData.swift b/apps/macos/Sources/OpenClaw/CockpitData.swift index 50dc049f8..d280d2a34 100644 --- a/apps/macos/Sources/OpenClaw/CockpitData.swift +++ b/apps/macos/Sources/OpenClaw/CockpitData.swift @@ -79,17 +79,17 @@ struct CockpitGatewayStatus: Codable, Sendable, Equatable { } return "Workers are running off this Mac through the remote gateway." case (.remote, .connecting): - return "Cockpit is waiting for the remote gateway or tunnel so worker execution can stay off-machine." + return "Waiting for the remote gateway or tunnel so worker execution can stay off-machine." case (.remote, .unavailable): return "Reconnect the remote gateway to keep worker execution off your Mac." case (.local, .ready): return "Workers are running on this Mac. Switch to Remote mode to offload the runtime and reduce RAM usage." case (.local, .connecting): - return "Cockpit is waiting for the local gateway." + return "Waiting for the local gateway to start." case (.local, .unavailable): return "Start or reconnect the local gateway before running workers." case (.unconfigured, _): - return "Configure a local or remote gateway before using Cockpit." + return "Configure a local or remote gateway to start using Arc." } } } diff --git a/apps/macos/Sources/OpenClaw/CockpitWindow.swift b/apps/macos/Sources/OpenClaw/CockpitWindow.swift index 88f7769c0..834fcb1ae 100644 --- a/apps/macos/Sources/OpenClaw/CockpitWindow.swift +++ b/apps/macos/Sources/OpenClaw/CockpitWindow.swift @@ -12,7 +12,7 @@ struct CockpitWindow: View { VStack(alignment: .leading, spacing: 4) { Text("Arc") .font(.largeTitle.weight(.semibold)) - Text(self.store.snapshot?.storePath ?? "OpenClaw-powered operator workspace") + Text(self.store.snapshot?.storePath ?? "Your project workspace") .font(.caption) .foregroundStyle(.secondary) if let projectRoot = self.store.projectRootLabel { @@ -83,15 +83,15 @@ struct CockpitWindow: View { } else if self.store.isLoading { VStack { Spacer() - ProgressView("Loading cockpit…") + ProgressView("Loading workspace…") Spacer() } .frame(maxWidth: .infinity, maxHeight: .infinity) } else { ContentUnavailableView( - "No cockpit data yet", + "No project data yet", systemImage: "rectangle.3.group", - description: Text("Use Start Next Worker to import work from FAST-TODO after the gateway is ready.")) + description: Text("Press Start Next Worker to queue a task once the gateway is connected.")) } } .padding(20) @@ -283,7 +283,7 @@ private struct CockpitLaneSection: View { Text("Workers") .font(.title3.weight(.semibold)) if self.lanes.isEmpty { - sectionPlaceholder("No workers yet. Start the next worker to populate the cockpit.") + sectionPlaceholder("No workers yet. Press Start Next Worker to begin.") } else { LazyVGrid(columns: self.columns, alignment: .leading, spacing: 12) { ForEach(self.lanes) { lane in @@ -433,7 +433,7 @@ private struct CockpitSelectedWorkerSection: View { RoundedRectangle(cornerRadius: 12, style: .continuous) .fill(Color.primary.opacity(0.04))) } else { - sectionPlaceholder("Select a worker lane to inspect controls and logs.") + sectionPlaceholder("Select a worker to see details and logs.") } } .frame(maxWidth: .infinity, alignment: .leading) diff --git a/docs/cockpit/FAST-TODO.md b/docs/cockpit/FAST-TODO.md index 21ce5983c..93dc31a04 100644 --- a/docs/cockpit/FAST-TODO.md +++ b/docs/cockpit/FAST-TODO.md @@ -41,7 +41,7 @@ Arc becomes the default daily surface when these are all done: ## Not Now -- [ ] broad product polish for strangers +- [x] broad product polish for strangers - [ ] hosted-first architecture - [ ] generalized platform abstractions - [ ] multi-user shared cockpit state diff --git a/package.json b/package.json index 004c18435..3c7ff4979 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,18 @@ { "name": "openclaw", "version": "2026.3.14", - "description": "Multi-channel AI gateway with extensible messaging integrations", - "keywords": [], + "description": "A personal project cockpit with persistent AI workers, review queues, and async execution", + "keywords": [ + "agent", + "ai", + "arc", + "automation", + "claude", + "cockpit", + "code-review", + "codex", + "worker" + ], "homepage": "https://github.com/openclaw/openclaw#readme", "bugs": { "url": "https://github.com/openclaw/openclaw/issues" diff --git a/src/cli/code-cli.ts b/src/cli/code-cli.ts index b61941703..04c19c19f 100644 --- a/src/cli/code-cli.ts +++ b/src/cli/code-cli.ts @@ -37,24 +37,24 @@ function runCodeCommand(action: () => Promise) { export function registerCodeCli(program: Command) { const code = program .command("code") - .description("Run the coding cockpit for orchestrated local agent work") + .description("Manage tasks and workers for your software projects") .addHelpText( "after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([ - ["openclaw code", "Show the current coding cockpit summary."], + ["openclaw code", "Show the current project summary."], [ 'openclaw code task add "Build coding cockpit" --repo ~/openclaw', - "Create a task in the local orchestration queue.", + "Create a task in the project queue.", ], [ "openclaw code worker add --task task_1234 --name planner --worktree ~/openclaw/.worktrees/planner", - "Attach a worker lane to a task.", + "Attach a worker to a task.", ], ["openclaw code worker start worker_5678", "Start a gateway-owned Codex worker run."], [ 'openclaw code review add "Ready for diff review" --task task_1234 --worker worker_5678', - "Create a review request for the review lane.", + "Create a review request for a completed task.", ], ])}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/code", "docs.openclaw.ai/cli/code")}\n`, ) @@ -82,7 +82,7 @@ export function registerCodeCli(program: Command) { code .command("summary") - .description("Show the coding cockpit summary") + .description("Show the project summary") .option("--json", "Output JSON", false) .action(async (opts) => { await runCodeCommand(async () => { @@ -90,10 +90,10 @@ export function registerCodeCli(program: Command) { }); }); - const task = code.command("task").description("Manage coding cockpit tasks"); + const task = code.command("task").description("Manage project tasks"); task .command("add") - .description("Create a task in the coding cockpit queue") + .description("Create a task in the project queue") .argument("", "Task title") .option("--repo <path>", "Repository root for the task") .option("--goal <text>", "Goal or acceptance target") @@ -109,7 +109,7 @@ export function registerCodeCli(program: Command) { task .command("list") - .description("List tasks in the coding cockpit") + .description("List project tasks") .option("--status <status>", "Filter by task status") .option("--repo <path>", "Filter by repository root") .option("--json", "Output JSON", false) @@ -246,7 +246,7 @@ export function registerCodeCli(program: Command) { worker .command("show") - .description("Show a worker with gateway-owned runtime details") + .description("Show worker details and runtime state") .argument("<workerId>", "Worker identifier") .option("--json", "Output JSON", false) .action(async (workerId, opts) => { @@ -278,7 +278,7 @@ export function registerCodeCli(program: Command) { }); }); - const review = code.command("review").description("Manage review-lane requests"); + const review = code.command("review").description("Manage review requests"); review .command("add") .description("Create a review request") @@ -320,7 +320,7 @@ export function registerCodeCli(program: Command) { }); }); - const memory = code.command("memory").description("Capture and list operational memory"); + const memory = code.command("memory").description("Capture and list context snapshots"); memory .command("add") .description("Capture a context snapshot for a task or worker") @@ -349,7 +349,7 @@ export function registerCodeCli(program: Command) { }); }); - const decision = code.command("decision").description("Track operator and system decisions"); + const decision = code.command("decision").description("Track project decisions"); decision .command("add") .description("Append a decision log entry") diff --git a/src/code-cockpit/tui.ts b/src/code-cockpit/tui.ts index adf0b8d83..6defb5e80 100644 --- a/src/code-cockpit/tui.ts +++ b/src/code-cockpit/tui.ts @@ -280,7 +280,7 @@ class ArcDashboardView implements Component { `ARC OPERATOR CONSOLE · ${shortenHomePath(repoRoot)}`, ); const stats = [ - renderStatusChip("gw", gatewayStatus, pickHealthTone(gatewayStatus)), + renderStatusChip("gateway", gatewayStatus, pickHealthTone(gatewayStatus)), renderStatusChip("claude", claudeHealth, pickHealthTone(claudeHealth)), renderStatusChip("codex", codexHealth, pickHealthTone(codexHealth)), renderStatusChip( @@ -666,8 +666,8 @@ export async function runCodeCockpitTui(opts: CodeCockpitTuiOptions = {}) { root.addChild(footer); tui.addChild(root); tui.setFocus(dashboard); - header.setText(theme.dim("Local dashboard · remote Arc runtime")); - footer.setText(theme.dim("Arc stays live on the VPS after you quit this dashboard.")); + header.setText(theme.dim("Arc dashboard · reviewing remote runtime")); + footer.setText(theme.dim("Workers keep running after you quit this dashboard.")); const setFooter = (message: string) => { footer.setText(theme.dim(message)); @@ -718,7 +718,7 @@ export async function runCodeCockpitTui(opts: CodeCockpitTuiOptions = {}) { return await inFlightRefresh; } dashboard.setStatusMessage(message); - setFooter("Arc stays live on the VPS after you quit this dashboard."); + setFooter("Workers keep running after you quit this dashboard."); inFlightRefresh = (async () => { try { const nowMs = Date.now(); @@ -729,7 +729,7 @@ export async function runCodeCockpitTui(opts: CodeCockpitTuiOptions = {}) { lastHealthcheckAt = nowMs; } const snapshot = await loadDashboardSnapshot(repoRoot, cachedHealth); - header.setText(theme.dim("Local dashboard · remote Arc runtime")); + header.setText(theme.dim("Arc dashboard · reviewing remote runtime")); dashboard.setSnapshot(snapshot); dashboard.setStatusMessage( `Ready. ${snapshot.activeTasks.length} active tasks · ${snapshot.attentionItems.length} items need attention.`,