64017c6ca5
Run console:
- Picking a pipeline no longer pre-writes anything into the prompt box
(`promptPrefill` in `LaneConsolePane.tsx` is gone — it wrote the driving
slash command on a claude lane and a stage checklist on a codex one).
Whatever sits in that box is sent as a real prompt the moment the run
starts, so the box is the user's alone now.
- Resuming a session sends NO prompt at all (`handleStart` in `RunSetup.tsx`):
the resumed session carries its own transcript, and leftover text in the box
fired an extra turn into it.
Notifications:
- `client/src/lib/notify.ts` is now the ONE sender, used by both
`useNotifications` and Settings' test button, and it reports where the
notification landed: `POST /api/push/send` answering `{native:false,pushed:0}`
means it went NOWHERE, so the client falls back to a local notification
instead of counting the 200 as delivered.
- A notification carries the lane that raised it (`/workspace?lane=<id>`), and
Workspace selects that lane on arrival.
Profiles:
- `server/lib/cc-profiles.js` reads and writes the macOS login Keychain item
`Claude Code-credentials`, where the `claude` CLI actually keeps
`claudeAiOauth` on darwin — a switch used to rewrite a file nothing reads.
The file stays the fallback, is kept in step only when it already exists, and
`AGENTHUB_CC_KEYCHAIN=0` pins it (tests set it).
Tests: npm run test:server (1820 pass), client vitest (553 pass).
154 lines
8.7 KiB
JSON
154 lines
8.7 KiB
JSON
{
|
||
"action.clear": "clear state",
|
||
"action.forget": "Delete lane",
|
||
"action.purge": "delete history",
|
||
"action.reset": "reset worktree",
|
||
"action.start": "start",
|
||
"action.stop": "stop",
|
||
"actionError": "Lane action failed: {{message}}",
|
||
"actionErrorUnknown": "Unknown error",
|
||
"actions.agentsInstall": "Install agents",
|
||
"actions.agentsInstallResult": "Installed: {{files}}",
|
||
"actions.busy": "…",
|
||
"actions.mcpSync": "Sync MCP",
|
||
"actions.mcpSyncResult": "Synced: {{servers}}",
|
||
"actions.syncCheck": "Check dev sync",
|
||
"actions.syncCheckClean": "DEV_DELTA: {{count}} file(s), overlap: {{overlap}}",
|
||
"actions.syncCheckCollision": "Migration collision: {{file}} → rename to {{suggestion}}",
|
||
"actions.tools": "Tools",
|
||
"add": "Add lane",
|
||
"addLane": "Create a lane from a working directory",
|
||
"addLaneBaseLabel": "Branch to fork from",
|
||
"addLaneBranchHint": "Must be a valid, not-yet-existing git branch name.",
|
||
"addLaneBranchLabel": "New branch name",
|
||
"addLaneBranchPlaceholder": "feat/my-feature",
|
||
"addLaneNoBranches": "This repo has no commits yet — the worktree will start empty.",
|
||
"addLaneNotARepo": "Not a git repository (or no read access) yet.",
|
||
"addLanePipelineHint": "Which stages this lane's map shows. Pick the one the skill driving it declares against — nothing else in this UI changes it later.",
|
||
"addLanePipelineLabel": "Pipeline template",
|
||
"addLaneProvisionFailed": "Worktree provisioning failed or timed out — the lane exists but auto-setup was skipped. Check the lane's git facts, then run agents/mcp setup manually.",
|
||
"addLaneRepoHint": "An existing git repo. The dashboard creates a new worktree for the lane, not a folder you pick.",
|
||
"addLaneRepoHintAdopt": "An existing directory. The dashboard tracks it as-is — no worktree, no new branch.",
|
||
"addLaneRepoLabel": "Source repository",
|
||
"addLaneRepoLabelAdopt": "Directory",
|
||
"addLaneRouterCustom": "AI Router",
|
||
"addLaneRouterEmptyHint": "No router profile saved yet — add one under Settings › AI Router.",
|
||
"addLaneRouterHint": "Native talks to the vendor's own API. An AI Router profile is written into this lane's own config when it is created.",
|
||
"addLaneRouterLabel": "Model endpoint",
|
||
"addLaneRouterLoading": "Loading router profiles…",
|
||
"addLaneRouterNative": "Native",
|
||
"addLaneRouterProfileLabel": "Router profile",
|
||
"addLaneSetupAgents": "Agents",
|
||
"addLaneSetupClose": "Close",
|
||
"addLaneSetupMcp": "MCP servers",
|
||
"addLaneSetupProfile": "Profile",
|
||
"addLaneSetupRouter": "Model endpoint",
|
||
"addLaneSetupTitle": "Setup",
|
||
"addLaneTitleLabel": "Title",
|
||
"addLaneTitlePlaceholder": "Optional",
|
||
"addLaneToolClaude": "Claude Code",
|
||
"addLaneToolCodex": "Codex",
|
||
"addLaneToolHint": "Which CLI drives this lane. Cannot be changed later.",
|
||
"addLaneWriteDocsHint": "On creation, opens the lane's terminal and runs /sg-all:sg-md-writing there: creates CLAUDE.md/AGENTS.md if missing, or updates them concisely if they already exist.",
|
||
"addLaneWriteDocsLabel": "Create/update readme file",
|
||
"autoStage": "auto: {{stage}}",
|
||
"browse.button": "Browse",
|
||
"browse.empty": "This folder is empty.",
|
||
"browse.select": "Select this folder",
|
||
"browse.title": "Browse for a folder",
|
||
"confirmRemoveCancel": "Cancel",
|
||
"confirmRemoveConfirm": "Remove",
|
||
"confirmRemoveMessage": "This action cannot be undone.",
|
||
"confirmRemoveTitle": "Remove lane?",
|
||
"countDead": "dead",
|
||
"countNeedsYou": "need you",
|
||
"countRunning": "running",
|
||
"countTotal": "lanes",
|
||
"destructive.blocked.adopted": "This is an adopted directory and cannot be changed by a worktree action.",
|
||
"destructive.blocked.missing": "The lane directory is missing, so this action cannot continue.",
|
||
"destructive.blocked.unreadable": "The lane directory cannot be read as a Git worktree, so this action cannot continue.",
|
||
"destructive.cancel": "Cancel",
|
||
"destructive.count.bytesEstimate": "Estimated space freed",
|
||
"destructive.count.dirty": "Modified files",
|
||
"destructive.count.events": "Events",
|
||
"destructive.count.head": "HEAD",
|
||
"destructive.count.sessions": "Sessions",
|
||
"destructive.count.tokenRows": "Token rows",
|
||
"destructive.count.unpushed": "Unpushed commits",
|
||
"destructive.count.untracked": "Untracked files",
|
||
"destructive.force": "I understand these unpushed commits will be discarded.",
|
||
"destructive.loading": "Loading current facts…",
|
||
"destructive.notice.activeSessionSkipped": "One or more sessions in this lane are still active and will be kept, not purged.",
|
||
"destructive.notice.adopted": "This lane points at a directory you own. Only the dashboard's record of it is dropped — the directory and its files are left untouched.",
|
||
"destructive.notice.missing": "The lane directory is already gone. Deleting the lane drops the dashboard's record only; nothing on disk and no Git record is touched.",
|
||
"destructive.notice.unreadable": "The lane directory cannot be read as a Git worktree. That changes nothing here: only the dashboard's record is deleted, the directory is never touched.",
|
||
"destructive.purge.confirm": "Purge history",
|
||
"destructive.purge.message": "Approve the current counts before deleting stored session history.",
|
||
"destructive.purge.title": "Purge lane history?",
|
||
"destructive.remove.confirm": "Delete lane record",
|
||
"destructive.remove.message": "Only the dashboard's record of this lane is deleted. Its working tree, its branch and its database are left exactly as they are — delete them yourself if you want them gone.",
|
||
"destructive.remove.title": "Delete lane record?",
|
||
"destructive.reset.confirm": "Reset worktree",
|
||
"destructive.reset.message": "Approve the current counts before resetting this worktree.",
|
||
"destructive.reset.survives": "Gitignored files such as node_modules and .env are kept; untracked files are deleted.",
|
||
"destructive.reset.title": "Reset managed worktree?",
|
||
"destructive.warning.no-remote": "No Git remote is configured, so nothing here is backed up remotely. You can still proceed.",
|
||
"emptyState": "No lanes yet. Create one from a working directory:",
|
||
"features.archived": "archived",
|
||
"features.live": "Live",
|
||
"features.viewingArchived": "Viewing archived feature \"{{slug}}\" — the lane keeps running; this is a read-only snapshot.",
|
||
"git.filesHeading_one": "{{count}} file changed",
|
||
"git.filesHeading_other": "{{count}} files changed",
|
||
"git.filesMore_one": "… and {{count}} more file",
|
||
"git.filesMore_other": "… and {{count}} more files",
|
||
"git.noDelta": "new",
|
||
"git.uncommitted": "{{dirty}} modified · {{untracked}} untracked",
|
||
"kind.adopted": "adopted",
|
||
"kind.managed": "managed",
|
||
"laneDetail.hide": "Hide details",
|
||
"laneDetail.show": "Lane details",
|
||
"locks.held_one": "{{count}} lock held",
|
||
"locks.held_other": "{{count}} locks held",
|
||
"mode.repo": "Repo",
|
||
"mode.repoHint": "Adopt this directory as a lane, as-is — no worktree, no new branch.",
|
||
"mode.worktree": "Worktree",
|
||
"mode.worktreeHint": "Provision a new git worktree + branch from a source repo.",
|
||
"moreActions": "More actions",
|
||
"pipelinePicker.label": "Pipeline template",
|
||
"pipelinePicker.stageMismatch": "Stage \"{{stage}}\" matches no node in \"{{pipeline}}\" — declare one of: {{nodes}}",
|
||
"preflightError": "Could not load the current lane facts.",
|
||
"preflightErrorWithMessage": "Could not load the current lane facts: {{message}}",
|
||
"proof.ticketReport": "Task report",
|
||
"renameLabel": "Rename this lane",
|
||
"reorderHint": "Drag to reorder · Alt+←/→",
|
||
"router.applied": "Applied.",
|
||
"router.appliedRestart": "Applied, but the session running in this lane still uses the old models — restart it to take effect.",
|
||
"router.label": "Model",
|
||
"router.restart": "Restart",
|
||
"router.restarted": "Session restarted with the new router.",
|
||
"runtime.boot": "▶ up",
|
||
"runtime.busy.down": "stopping…",
|
||
"runtime.busy.up": "booting…",
|
||
"runtime.down": "down",
|
||
"runtime.healthy": "healthy",
|
||
"runtime.partial": "partial",
|
||
"runtime.slot": "slot {{slot}}",
|
||
"runtime.steppedAsideTitle": "Stepped aside from {{expected}}, which was already in use",
|
||
"runtime.stop": "■ down",
|
||
"runtime.toggleTitle": "Boot or stop this lane's own application stack (separate from its Claude run)",
|
||
"splitView.emptyPane": "No lane selected for this pane.",
|
||
"splitView.paneCount": "{{count}} pane",
|
||
"splitView.paneLaneLabel": "Pane lane selector",
|
||
"splitView.pickLane": "Pick a lane",
|
||
"stageUndeclared": "not declared",
|
||
"status.failed": "failed",
|
||
"status.idle": "idle",
|
||
"status.provisioning": "provisioning",
|
||
"status.running": "running",
|
||
"statusDead": "DEAD",
|
||
"title": "Lanes",
|
||
"tooltipStart": "Spawn a conversation-mode run with no initial prompt; driven from CLI or via message",
|
||
"worktrees.heading_one": "{{count}} worktree",
|
||
"worktrees.heading_other": "{{count}} worktrees"
|
||
}
|