Skip to content
Draft
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
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
6 changes: 3 additions & 3 deletions apps/macos/Sources/OpenClaw/CockpitData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions apps/macos/Sources/OpenClaw/CockpitWindow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion docs/cockpit/FAST-TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 12 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
26 changes: 13 additions & 13 deletions src/cli/code-cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,24 +37,24 @@ function runCodeCommand(action: () => Promise<void>) {
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`,
)
Expand Down Expand Up @@ -82,18 +82,18 @@ 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 () => {
await codeSummaryCommand({ json: Boolean(opts.json) }, defaultRuntime);
});
});

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("<title>", "Task title")
.option("--repo <path>", "Repository root for the task")
.option("--goal <text>", "Goal or acceptance target")
Expand All @@ -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)
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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")
Expand Down
10 changes: 5 additions & 5 deletions src/code-cockpit/tui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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();
Expand All @@ -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.`,
Expand Down
Loading