feat: Claude Code Monitor — lanes, pipelines and a merged workspace
Internal SmartGift build of a Claude Code monitoring dashboard. Lanes: a durable unit of parallel agent work, one per working directory, tracked across session restarts. Managed lanes are git worktrees the dashboard provisions and can reset or remove behind a three-check destroy guard and a counted preflight; adopted lanes are directories you already own and are never destroyable. Pipelines: a lane moves through pipeline stages. A stage the agent declares with evidence renders green; a stage inferred from the tool-event stream renders dashed amber and never counts as done. Detection is forward-only within a 30-minute window, and never writes the declared stage. Workspace: one page at /run with a lane grid, the selected lane's pipeline, and a full Claude console behind a disclosure.
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
{
|
||||
"actions": {
|
||||
"newRun": "New run",
|
||||
"send": "Send",
|
||||
"sending": "Sending…",
|
||||
"start": "Run",
|
||||
"starting": "Starting…",
|
||||
"stop": "Stop",
|
||||
"stopping": "Stopping…",
|
||||
"viewSession": "View session"
|
||||
},
|
||||
"autocomplete": {
|
||||
"fileHint": "Type @ to reference a file",
|
||||
"groupBuiltin": "Built-in (CLI only - won't run from here)",
|
||||
"groupFiles": "Files in cwd",
|
||||
"groupProject": "Project commands",
|
||||
"groupUser": "User commands",
|
||||
"noMatches": "No matches",
|
||||
"slashHint": "Type / for slash commands"
|
||||
},
|
||||
"binary": {
|
||||
"found": "Using {{path}}",
|
||||
"missing": "The `claude` CLI isn't on your PATH. Install Claude Code or set PATH so the dashboard can spawn it."
|
||||
},
|
||||
"concurrency": {
|
||||
"active_one": "{{count}} run already in flight",
|
||||
"active_other": "{{count}} runs already in flight",
|
||||
"atCap": "Concurrency cap reached ({{max}}). Stop one of the running runs to start a new one.",
|
||||
"viewActive": "View active runs"
|
||||
},
|
||||
"empty": {
|
||||
"body": "Type a prompt and click Run. Output streams here as the model thinks, calls tools, and answers.",
|
||||
"title": "Nothing yet"
|
||||
},
|
||||
"errors": {
|
||||
"attachFailed": "Couldn't attach to run: {{message}}",
|
||||
"cwdRequired": "Working directory required to start a run",
|
||||
"killFailed": "Couldn't stop: {{message}}",
|
||||
"laneCreateFailed": "Failed to create lane: {{message}}",
|
||||
"noLaneSelected": "No lane selected or could not create one",
|
||||
"noRunIdReturned": "No run_id returned from lane start",
|
||||
"runStartedButNotAttached": "Run is live but couldn't attach to console: {{message}}",
|
||||
"sendFailed": "Couldn't send: {{message}}",
|
||||
"startFailed": "Couldn't start run: {{message}}"
|
||||
},
|
||||
"events": {
|
||||
"claude": "Claude",
|
||||
"collapse": "Collapse",
|
||||
"expand": "Expand",
|
||||
"system": "System",
|
||||
"thinking": "Thinking",
|
||||
"tool": "Tool",
|
||||
"toolResult": "Tool result",
|
||||
"you": "You"
|
||||
},
|
||||
"fields": {
|
||||
"cwd": "Working directory",
|
||||
"cwdGroups": {
|
||||
"dashboard": "Dashboard server",
|
||||
"home": "Home",
|
||||
"recent": "Recent - used by Claude Code"
|
||||
},
|
||||
"cwdHint": "Absolute path. Defaults to the dashboard's own cwd.",
|
||||
"cwdNoMatches": "No matches. Type an absolute path to use it directly.",
|
||||
"cwdPlaceholder": "Type to search or paste an absolute path…",
|
||||
"effort": "Thinking effort",
|
||||
"model": "Model",
|
||||
"modelCustom": "Custom…",
|
||||
"modelCustomPlaceholder": "model id (e.g. claude-opus-4-7-20260101)",
|
||||
"modelInheritLabel": "Inherit from settings",
|
||||
"permissionAcceptEdits": "acceptEdits (recommended)",
|
||||
"permissionBypass": "bypassPermissions (DANGER - allows everything without asking)",
|
||||
"permissionDefault": "default (interactive prompts - sessions may hang headlessly)",
|
||||
"permissionMode": "Permission mode",
|
||||
"permissionPlan": "plan (read-only planning)",
|
||||
"prompt": "Prompt",
|
||||
"promptPlaceholder": "Ask Claude anything…"
|
||||
},
|
||||
"footer": {
|
||||
"cost": "Cost",
|
||||
"duration": "Duration",
|
||||
"exitCode": "Exit code",
|
||||
"sessionId": "Session ID",
|
||||
"turns": "Turns"
|
||||
},
|
||||
"hint": {
|
||||
"headlessExplain": "Headless mode is best for scripted tasks where you know exactly what you want. The session can't ask follow-up questions and will hang on permission prompts unless you stay in acceptEdits.",
|
||||
"permissionWarning": "bypassPermissions allows ALL tool invocations without confirming. Only use for trusted prompts.",
|
||||
"shortcut": "Cmd+Enter / Ctrl+Enter to send"
|
||||
},
|
||||
"limitations": {
|
||||
"dismiss": "Got it"
|
||||
},
|
||||
"mode": {
|
||||
"conversation": "Conversation",
|
||||
"conversationHint": "Multi-turn - keep typing follow-ups while the agent works.",
|
||||
"headless": "One-shot",
|
||||
"headlessHint": "Single prompt, single response. Stdin closes after spawn.",
|
||||
"label": "Mode"
|
||||
},
|
||||
"resume": {
|
||||
"clear": "Clear selection",
|
||||
"freshHint": "Start a fresh Claude Code session.",
|
||||
"freshOption": "New session",
|
||||
"label": "Source session",
|
||||
"noSessions": "No sessions found.",
|
||||
"originalCwd": "Original cwd",
|
||||
"pickSession": "Pick a session…",
|
||||
"preview": "Last activity",
|
||||
"resumeHint": "Pick a session from your history and continue the conversation. Cwd is locked to the original.",
|
||||
"resumeOption": "Resume existing session",
|
||||
"search": "Search by ID, cwd, or status…",
|
||||
"selectedBadge": "Resuming"
|
||||
},
|
||||
"runs": {
|
||||
"allSessionsLink": "See all Claude Code sessions →",
|
||||
"attached": "Attached to existing run",
|
||||
"scopeNote": "Only shows runs you started from this dashboard.",
|
||||
"started": "Started {{when}}",
|
||||
"switcher": "Active runs",
|
||||
"switcherEmpty": "No active runs",
|
||||
"viewActive": "View active run",
|
||||
"viewActive_other": "{{count}} active runs",
|
||||
"viewLabel": "View"
|
||||
},
|
||||
"status": {
|
||||
"abandoned": "Abandoned",
|
||||
"completed": "Completed",
|
||||
"error": "Error",
|
||||
"idle": "Idle",
|
||||
"killed": "Killed",
|
||||
"running": "Running",
|
||||
"spawning": "Spawning…"
|
||||
},
|
||||
"statusHeader": {
|
||||
"cwd": "Cwd",
|
||||
"duration": "Elapsed",
|
||||
"effort": "Effort",
|
||||
"envelopes": "Events",
|
||||
"model": "Model",
|
||||
"permissionMode": "Mode",
|
||||
"session": "Session"
|
||||
},
|
||||
"subtitle": "Spin up a Claude Code session right inside the dashboard. Live streaming output, multi-turn conversation, and the same hooks-driven analytics as your terminal sessions.",
|
||||
"title": "Run Claude",
|
||||
"tokens": {
|
||||
"cacheRead": "Cache hit",
|
||||
"cost": "Cost",
|
||||
"input": "Input",
|
||||
"label": "Context",
|
||||
"output": "Output"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user