a6bd33bcff
Workspace sessions (docs/plans/desktop-parity, phases 1-5 and 7): - sessions.lane_id: a workspace lists only the sessions its panes held, stamped by bindRunSession (first writer wins, nested `claude -p` excluded); GET /api/sessions?lane=&archived= - session row state dot, double-click rename, archive (sessions.archived_at, hides only); the activity bar's duplicate Sessions tab removed - Fork beside Resume (--fork-session, Claude only), Ctrl/Cmd+click a live session opens it in a second pane, a diff line's comment is pasted into the workspace's last-focused pane (lib/panePaste.ts) dashboard_runs stability: - a pane's previous run is archived as <pane>@<started_at> instead of being overwritten by INSERT OR REPLACE - a run is flagged abandoned only once its tmux session is gone, at boot and on the run-heal beat (panes outlive a server restart) UI: - sidebar: no footer, language or theme block; small collapse button in the brand corner; version + update check in the connection details modal, a status-bar dot while a release is out; language in Settings -> General - one Switch component for every switch, the themed Checkbox for every checkbox (no native checkboxes) Also: AI Tools catalog trimmed to 10 built-ins (custom-file prompt modes tested through fixtures), and the workspace plans under docs/plans/ (the multi-user server plan lives in the AgentHub-Server repo).
4.3 KiB
4.3 KiB
Phase 0 — Call lanes "workspaces" in the UI and docs
One PR. No behaviour change, no identifier change. Every test that passed before passes after; only copy and snapshots differ.
Goal
The word a user reads changes: "Lane" → "Workspace", "Lanes" → "Workspaces", "Add lane" → "Add workspace", "lane strip" → "workspace list", and so on — in the dashboard UI (both languages), in the docs, in CLI help and output text, and in the plugin's skill/command prose.
What does NOT change
Everything that is an identifier stays exactly as it is:
- API paths and payload keys:
/api/lanes,{ lanes, counts },lane_id, … - WebSocket message types
lane/lanes. - CLI commands and flags:
agenthub lanes add|up|down|…,agenthub stage --lane 3. - Env vars:
AGENTHUB_LANE_ID,LANES_ROOT,LANE_DEAD_SEC, … - Error codes (
EBADLANE, …), tmux session namesagenthub-lane-<id>. - SQLite tables/columns (
lanes,lane_features,lane_stage_events). - Source file, component, hook, type and function names (
LaneCard.tsx,LaneChangesPanel,useLaneGitFacts,listLanes,Lanetype, …),data-testidvalues, localStorage keys, i18n namespace file namelanes.jsonand its keys.
Rationale: a rename of identifiers touches ~200 files and every running install's tmux panes, hooks and bookmarks, for no user-visible gain. The user-visible gain is the word, so only the word changes.
Where the word changes
| Surface | Action |
|---|---|
client/src/i18n/locales/en/*.json, …/vi/*.json |
Replace the English word in values (not keys): "Lane"→"Workspace", "lane"→"workspace", "Lanes"→"Workspaces", plural/possessive forms. Vietnamese values: "lane"/"làn" → "workspace" (the Vietnamese UI already uses the English loanword "Workspace" in nav.json; keep that). Check lanes.json, nav.json, settings.json (lanesSection.title = "Workspaces"), run.json, dashboard.json, kanban.json, errors.json, splash.json. |
| Hardcoded UI strings | grep -rn -i '\blanes\?\b' client/src --include=*.tsx — any string literal rendered to the user that escaped i18n is moved into i18n with the new word (do not leave it hardcoded). Code comments and identifiers are left alone. |
CLI output and help (bin/agenthub.js) |
Prose in console.log/console.error/usage strings: "lane" → "workspace" in the sentence, while the command names in those same sentences stay literal: e.g. no workspace owns <cwd> — create one with: agenthub lanes add --cwd <cwd>. |
| Docs | docs/LANES.md: keep the file name (it is linked from many places and from CLAUDE.md), retitle to "Workspaces (lanes)" and open with one paragraph: "A workspace — called a lane in the API, CLI, database and code — is …". Then use "workspace" in prose throughout, keeping every literal command/route/field as is. Same treatment in README.md, docs/API.md, docs/CLI.md, docs/DATABASE.md, docs/HOOKS.md, client/README.md, server/README.md, docs/PLUGINS.md. |
CLAUDE.md |
The "## Lanes" heading becomes "## Workspaces (lanes)"; the first bullet gains the one-sentence glossary above; every rule keeps its literal identifiers. Bump the sync marker. |
Plugin skills/commands (skills/*, plugins/agenthub/commands/*) |
Prose only. |
| Server-side user-facing text | Error message strings that reach the UI (e.g. "lane not found"): change the word, keep the code. Log lines may stay. |
Order of work
- i18n values (en, vi) + any escaped literals →
npm run test:client, review the snapshot diff (copy only), regenerate. - CLI strings →
npm run test:server(lanes-cli.test.jsasserts some output text; update those assertions). - Server error messages → server suite.
- Docs +
CLAUDE.md+ skills prose.
Acceptance
- Opening every page of the dashboard in EN and VI shows no "lane" (walk: Dashboard, Sessions, Workflows, Workspace incl. Add modal / destructive modals / Changes panel / run form, Settings incl. every tool tab).
agenthub lanes(no args) andagenthub helpprint "workspace" in prose andlanesas the command.git diff --statshows no renamed files, no changes toserver/routes/paths,client/src/lib/api.tsorclient/src/lib/types.ts.- Headers check, both suites, snapshots regenerated once.