Files
AgentHub/client/src/i18n/locales/en/ccConfig.json
T
nntrivi2001 8546748759 chore: maintenance — dependency majors, rename step 4, member Claude config, OpenAPI coverage
Dependencies
- Security: body-parser and multer DoS advisories fixed (npm audit: 0).
- Server: Express 5 (query parser kept "extended", req.body defaults to {},
  SPA catch-all /{*splat}, send-file helper restores Express 4's dot-folder
  rule for sendFile/download, alerts ack route without inline regex),
  better-sqlite3 13, js-yaml 5 (server/lib/yaml.js keeps js-yaml 4's default
  schema), uuid dropped for crypto.randomUUID, node-pty beta.18, multer 2.5.
- Client: React 19, xterm 6 (WebGL renderer replaces the removed canvas one,
  DOM fallback on context loss; Alt+arrow word moves re-mapped), lucide-react 1,
  TypeScript 7, i18next/react-i18next/codemirror minors.

Workspace rename step 4
- `agenthub lanes` and `--lane` exit 1 with "renamed: use …"; client api.ts,
  the CLI and the MCP server call /api/workspaces; /api/lanes stays mounted.

Server mode (S3): members manage their own Claude Code config
- server/lib/cc-target.js resolves whose config a /cc-config request touches
  and gates the router by allowlist; /profiles* and /plugins/update-all stay
  admin-only. Member writes go through write-as, CLI calls through sudo as the
  member (never -y), reads through openSafe; cc_config_changed reaches only
  its owner. Not verified live on an S3 install yet.

Other
- Chat: an HTML file is an artifact only when written whole and not a project
  page (index.html, or under src/, public/, templates/, …).
- OpenAPI covers every /api route; openapi-coverage.test.js guards it.
- read-pool test keeps its event loop alive (its worker is unref'd).
- Docs: plan statuses, checklists, CLI.md, LANES.md, SERVER-MODE.md, API.md.
2026-10-26 14:22:41 +07:00

423 lines
21 KiB
JSON

{
"title": "Claude Config Explorer",
"subtitle": "Your Claude Code setup at a glance - plugins, skills, subagents, MCP servers, hooks, and settings.",
"own": {
"label": "Your Claude Code config — {{home}}",
"subtitle": "Only your own account's setup: every change here runs as your account and reaches only your own sessions."
},
"refresh": "Refresh",
"refreshing": "Refreshing…",
"lastUpdated": "Last updated {{time}}",
"loadError": "Failed to load: {{message}}",
"scope": {
"all": "All scopes",
"user": "User",
"project": "Project",
"projectLocal": "Project (local)",
"home": "Home",
"projectIs": "Project = {{path}}",
"projectInCache": "The dashboard runs from Claude Code's plugin cache, which is replaced on every plugin update — project files written there would be lost. Project scope is off."
},
"tabs": {
"overview": "Overview",
"skills": "Skills",
"agents": "Subagents",
"commands": "Slash commands",
"outputStyles": "Output styles",
"plugins": "Plugins",
"marketplaces": "Marketplaces",
"mcp": "MCP servers",
"hooks": "Hooks",
"keybindings": "Keybindings",
"settings": "Settings",
"memory": "Memory"
},
"overview": {
"rootsTitle": "Roots",
"claudeHome": "Your .claude",
"projectClaudeDir": "Project .claude",
"projectRoot": "Project root",
"claudeJson": "claude.json",
"summary": "Quick summary",
"user": "user",
"project": "project"
},
"common": {
"search": "Search by name…",
"clearSearch": "Clear search",
"empty": "Nothing here yet.",
"viewSource": "View source",
"close": "Close",
"copyPath": "Copy path",
"copyName": "Copy name",
"truncated": "(truncated for preview)",
"scopeLabel": "Scope",
"redactedNotice": "Values matching /token|secret|password|key|auth/i are redacted server-side.",
"preview": "Preview",
"raw": "Raw"
},
"agents": {
"name": "Name",
"tools": "Tools"
},
"plugins": {
"installedAt": "Installed",
"lastUpdated": "Updated",
"missing": "Install path missing",
"manifestMissing": "No installed_plugins.json found at {{path}}",
"enabled": "Enabled",
"disabled": "Disabled",
"contributes": "Contributes",
"skills_one": "{{count}} skill",
"skills_other": "{{count}} skills",
"agents_one": "{{count}} agent",
"agents_other": "{{count}} agents",
"commands_one": "{{count}} command",
"commands_other": "{{count}} commands",
"outputStyles_one": "{{count}} output style",
"outputStyles_other": "{{count}} output styles",
"hooks_one": "{{count}} hook script",
"hooks_other": "{{count}} hook scripts",
"author": "Author",
"homepage": "Homepage",
"license": "License"
},
"marketplaces": {
"manifest": "Known marketplaces manifest",
"noMarketplaces": "No marketplaces registered.",
"source": "Source",
"lastUpdated": "Last synced",
"pluginCount": "Plugins",
"owner": "Owner",
"addCmd": "claude plugin marketplace add <repo>"
},
"keybindings": {
"missing": "No keybindings.json found at {{path}}",
"context": "Context",
"key": "Key",
"action": "Action",
"docsLink": "View keybindings docs",
"contextPlaceholder": "Context (e.g. Global, Chat)",
"addContext": "Add context",
"removeContext": "Remove context",
"addBinding": "Add binding",
"removeBinding": "Remove binding",
"errContext": "Every context needs a name.",
"errDupContext": "Duplicate context: {{context}}",
"errEmpty": "Every binding in \"{{context}}\" needs both a key and an action.",
"errDupKey": "Duplicate key \"{{key}}\" in context \"{{context}}\"."
},
"statusline": {
"title": "Statusline",
"configured": "Configured statusline command",
"scripts": "Statusline scripts found in CLAUDE_HOME",
"noStatusline": "No statusline configured."
},
"hookScripts": {
"title": "~/.claude/hooks/ scripts",
"subtitle": "Helper scripts referenced by your hook commands. These run when settings.json `hooks.<event>.hooks[].command` invokes them."
},
"mcp": {
"userScope": "User-scoped servers",
"projectScope": "Project-scoped servers",
"name": "Name",
"scope": "Scope",
"scopeUser": "User",
"scopeLocal": "This project",
"command": "Command",
"args": "Args",
"env": "Env names",
"url": "URL",
"headers": "Header names",
"noServers": "No MCP servers found.",
"notRemovable": "Configured in settings.json — remove it there; no CLI scope addresses this entry."
},
"hooks": {
"noHooks": "No hooks configured.",
"matcher": "Matcher",
"command": "Command",
"type": "Type",
"timeout": "Timeout",
"fileMissing": "(no settings file at this scope)"
},
"settings": {
"fileMissing": "(no settings file at this scope)",
"structured": "Structured",
"rawJson": "Raw JSON"
},
"memory": {
"missing": "No CLAUDE.md found.",
"autoTitle": "Project memory store",
"autoSubtitle": "Per-project file-based memory under ~/.claude/projects/<project>/memory/ — a MEMORY.md index plus one file per remembered fact. Read-only here.",
"noMatches": "No memory files match your search.",
"indexFiles": "Index",
"jumpTo": "Jump to file",
"fileCount_one": "{{count}} file",
"fileCount_other": "{{count}} files",
"factFiles_one": "{{count}} fact",
"factFiles_other": "{{count}} facts",
"newFile": "New file",
"newFileTitle": "New memory file in {{project}}",
"namePlaceholder": "e.g. my_fact.md",
"nameHelp": "Filename ending in .md (.md is added if you omit it).",
"projectLabel": "Project",
"projectHelp": "Created in this project's memory dir."
},
"projectMemory": {
"newButton": "New project memory",
"title": "Create {{file}} for another project",
"dirLabel": "Project directory",
"dirHelp": "Absolute path to a project that already exists on this machine. {{file}} is created inside it; an existing one is never overwritten.",
"dirRequired": "A project directory is required",
"createButton": "Create",
"created": "Created {{path}}",
"template": "# Project memory\n\nWhat this project is, and anything an agent should know before touching it.\n\n## Stack\n\n## Conventions\n\n## Commands\n",
"contentLabel": "Content",
"cancel": "Cancel",
"saving": "Creating…",
"close": "Close"
},
"edit": {
"newButton": "New",
"editButton": "Edit",
"deleteButton": "Delete",
"save": "Save",
"cancel": "Cancel",
"saving": "Saving…",
"deleting": "Deleting…",
"newTitle": "Create new {{type}}",
"editTitle": "Edit {{name}}",
"namePlaceholder": "name (kebab-case, no spaces)",
"nameLabel": "Name",
"nameHelp": "Letters, digits, dot, dash, underscore. Max 64 chars.",
"contentLabel": "Content",
"scopePicker": "Scope",
"writeError": "Save failed: {{message}}",
"deleteError": "Delete failed: {{message}}",
"saveSuccess": "Saved · backup at {{path}}",
"saveSuccessNew": "Created.",
"deleteSuccess": "Deleted · backup at {{path}}",
"confirmDelete": "Delete this item?",
"confirmDeleteBody": "This will move the file (or skill folder, including bundled assets) to a timestamped backup before removing it. The backup lives outside the directories the CLI scans, so the entry will disappear from your CLI.",
"confirmDeletePath": "Path: {{path}}",
"confirmDeleteAction": "Yes, back up and delete",
"templates": {
"skills": "---\nname: my-skill\ndescription: One-line description (shown when Claude picks the skill)\n---\n\nBody - what the skill does, when to use it, examples.\n",
"agents": "---\nname: my-agent\ndescription: When to invoke this subagent\ntools: Read, Grep\nmodel: sonnet\n---\n\nSystem prompt for the subagent.\n",
"commands": "---\ndescription: One-line description shown in the slash menu\n---\n\nWhat /my-command does.\n",
"output-styles": "---\nname: my-style\ndescription: Output style description\n---\n\nStyle instructions.\n",
"memory": "# Project memory\n\nClaude reads this on session start.\n",
"auto-memory": "---\nname: my-fact\ndescription: One-line summary of the remembered fact\nmetadata:\n type: feedback\n---\n\nThe fact to remember.\n"
},
"nameRequired": "Enter a name first.",
"nameInvalid": "Use letters, digits, dot, dash or underscore (start with a letter or digit, max 64).",
"loadError": "Could not load the file: {{message}}. Saving is disabled so it cannot be overwritten.",
"truncatedReadOnly": "This file is larger than 256 KB and was only partly loaded, so it opens read-only. Edit it in your own editor.",
"changedOnDiskTitle": "File changed on disk",
"changedOnDiskBody": "Something else changed this file since you opened it. Saving now replaces that change with yours (a backup is still made).",
"overwrite": "Overwrite",
"unverifiedTitle": "Couldn't verify the file on disk",
"unverifiedBody": "The file could not be re-read to check whether something else changed it since you opened it. Save anyway? (A backup of the current file is still made.)",
"saveAnyway": "Save anyway"
},
"backups": {
"title": "Backups",
"empty": "No backups yet - every edit or delete creates a timestamped backup that lands here.",
"openButton": "Backups",
"subtitle": "Every save / delete in the editor writes a copy here first. Backup folders live outside the directories Claude Code scans, so they don't reappear as ghosts in your CLI.",
"restoreHint": "Restore by copying the backup back into place (the backup is kept):"
},
"profiles": {
"usageCheck": "Check quota",
"usageChecking": "Checking…",
"usageRefresh": "Refresh",
"usageRetry": "Try again",
"usageFiveHour": "5h",
"usageSevenDay": "7d",
"usageResets": "Resets {{time}}",
"usageHint": "Asks Anthropic what this account has spent. Refreshes this profile's stored login token to do it.",
"title": "Claude Code profiles",
"openButton": "Switch profile",
"subtitle": "A profile is one Anthropic account - its own quota. Switching swaps only the login (credentials + account identity); skills, subagents, memory, plugins, marketplaces, MCP servers and settings all stay exactly as they are.",
"warning": "Running Claude Code sessions follow a switch on their own: they pick up the new login within about 30 seconds.",
"mismatch": "The login in use belongs to {{owner}}, but Claude Code's config names {{config}}. Requests are billed to {{owner}}. Switch to the account you want to fix this.",
"activeLabel": "Logged in now",
"noActive": "No Claude account is logged in on this machine.",
"unsavedActive": "This account is not saved as a profile yet - save it, otherwise you cannot switch away without losing its credentials.",
"saveButton": "Save this account as a profile",
"saveSuccess": "Saved the account you are logged in as. Click its name to rename it.",
"empty": "No profiles saved yet - save the account you are logged in as to get started.",
"activeBadge": "active",
"switchButton": "Switch to",
"switching": "Switching…",
"switchSuccess": "Switched to profile \"{{name}}\". Start a new Claude Code session to pick it up.",
"deleteButton": "Delete profile",
"deleteSuccess": "Deleted profile \"{{name}}\".",
"savedAt": "Saved {{time}}",
"loginHint": "Add another account by logging in from a terminal first:",
"saving": "Saving…",
"renameLabel": "Profile name",
"renameHint": "Click to rename",
"rename": "Rename",
"renameSuccess": "Renamed to \"{{name}}\".",
"deleteConfirmTitle": "Delete profile “{{name}}”?",
"deleteConfirmBody": "This removes the saved login (OAuth credentials) for this account. To use it again you must run `claude auth login` and save it once more."
},
"explain": {
"hooks": {
"title": "Editing hooks writes settings.json",
"body": "Hooks live in the `hooks` block of the `settings.json` files Claude Code writes to constantly. Edit saves only the event you changed, backs the file up first, and leaves every other key alone — but a `claude` session already running keeps its old hooks until it restarts. Take care with the dashboard`s own ingestion entries (the `hook-handler.js` commands below).",
"howTo": "You can also edit them with:",
"cmd1": "claude config /hooks",
"cmd1Note": "Interactive hook editor inside Claude Code",
"cmd2": "$EDITOR ~/.claude/settings.json",
"cmd2Note": "Hand-edit the user-level hooks block",
"cmd3": "$EDITOR .claude/settings.json",
"cmd3Note": "Hand-edit the project-level hooks block"
},
"settings": {
"title": "Editing settings merges one key at a time",
"body": "These JSON files are rewritten by the live `claude` CLI on every model change, theme toggle, plugin enable, etc. Saving here re-reads the file and writes only the keys you changed (after a timestamped backup), so a concurrent CLI write loses nothing else — but a running session may not pick the change up until it restarts.",
"howTo": "You can also edit them with:",
"cmd1": "claude config set <key> <value>",
"cmd1Note": "Set an individual key safely",
"cmd2": "/config",
"cmd2Note": "Open the interactive config UI inside the CLI",
"cmd3": "$EDITOR ~/.claude/settings.json",
"cmd3Note": "Hand-edit (only when no `claude` process is running)"
},
"plugins": {
"title": "Plugins run through the `claude` CLI",
"body": "Plugins are bundles with their own registry — `installed_plugins.json` plus install paths under `plugins/cache/`. The buttons here run the matching `claude plugin …` command on this machine, so the registry stays consistent. Installing a plugin means running third-party code: only add marketplaces you trust.",
"install": "Install a plugin:",
"installCmd": "claude plugin install <marketplace>/<plugin>"
},
"mcp": {
"title": "MCP servers are managed by the CLI",
"body": "MCP server config lives inside `~/.claude.json`, the same file the live CLI writes to constantly. Concurrent writes from the dashboard would corrupt project state, so add/remove flow goes through Claude Code itself.",
"list": "List configured servers:",
"listCmd": "claude mcp list",
"add": "Add a server:"
},
"marketplaces": {
"title": "Marketplaces are where plugins come from",
"body": "A marketplace is a git repo (or local folder) with a `.claude-plugin/marketplace.json` listing the plugins it offers. Adding one registers it in `known_marketplaces.json` and clones it locally; its plugins then appear on the Plugins tab, ready to install. Removing one does not uninstall plugins you already installed from it."
}
},
"snippet": {
"copy": "Copy",
"copied": "Copied"
},
"updateAll": {
"title": "Update everything",
"help": "Refreshes every marketplace, then updates all installed plugins, then tells the Claude Code sessions this dashboard has open to pick up the changes. AgentHub itself goes last, because updating it restarts this dashboard.",
"button": "Update all",
"working": "Updating…",
"started": "Update-all started for {{count}} plugin(s).",
"failed": "Could not start the update.",
"reloadButton": "Reload sessions",
"reloaded": "Reload sent to {{count}} open session(s).",
"reloadedNone": "No open Claude Code session to reload.",
"reloadedCount": "— {{count}} session(s)",
"restartWarning": "Keep this tab open. If AgentHub itself is updated, the dashboard restarts at the end and this page reconnects on its own.",
"abandoned": "The previous batch stopped without finishing — most likely the machine restarted. Run it again.",
"bootstrapFailed": "The dashboard was stopped but did not come back: {{error}}. Run /agenthub-update to recover."
},
"manage": {
"installTitle": "Install a plugin",
"installPlaceholder": "owner/repo, https://… or plugin@marketplace",
"installButton": "Add",
"installHelp": "Paste a GitHub repo, URL or local path to register its marketplace, or type <plugin>@<marketplace> to install a plugin directly. Runs the `claude plugin` CLI on this machine.",
"install": "Install",
"installed": "Installed {{name}}.",
"availableTitle": "Available from your marketplaces",
"cliUnavailable": "Could not list available plugins: {{message}}",
"working": "Working…",
"enable": "Enable",
"enabled": "Enabled {{name}}.",
"disable": "Disable",
"disabled": "Disabled {{name}}.",
"update": "Update",
"updated": "Updated {{name}}.",
"uninstall": "Uninstall",
"confirmUninstall": "Click again to uninstall",
"uninstalled": "Uninstalled {{name}}.",
"remove": "Remove",
"confirmRemove": "Click again to remove",
"addMarketplaceTitle": "Add a marketplace",
"addMarketplacePlaceholder": "owner/repo, https://github.com/… or /absolute/path",
"addMarketplaceButton": "Add",
"addMarketplaceHelp": "Registers the marketplace with `claude plugin marketplace add`; its plugins then show up on the Plugins tab.",
"marketplaceAdded": "Added marketplace {{name}}.",
"marketplaceUpdated": "Updated marketplace {{name}}.",
"marketplaceRemoved": "Removed marketplace {{name}}.",
"addMcpTitle": "Add an MCP server",
"addMcpNamePlaceholder": "name",
"addMcpTransportStdio": "Command (stdio)",
"addMcpTransportHttp": "URL (http)",
"addMcpCommandPlaceholder": "npx -y @modelcontextprotocol/server-github",
"addMcpUrlPlaceholder": "https://mcp.example.com",
"addMcpButton": "Add",
"addMcpHelp": "Runs `claude mcp add`. \"This project\" scopes the server to the current checkout — the CLI's separate `project` scope (a shared `.mcp.json`) isn't offered here because this dashboard can't see servers stored there.",
"mcpAdded": "Added MCP server {{name}}.",
"mcpRemoved": "Removed MCP server {{name}}.",
"hookEvent": "Event name (e.g. PreToolUse)",
"hookAddEvent": "Add event",
"hookRemoveEvent": "Remove event",
"hookAddEntry": "Add hook",
"hookRemoveEntry": "Remove hook",
"hookBadEvent": "“{{event}}” is not a valid event name.",
"hookDupEvent": "Event {{event}} is listed twice.",
"hookEmptyCommand": "Every hook in {{event}} needs a command.",
"hooksSaved": "Hooks saved to {{file}}.",
"hookUneditable": "Left untouched (not in the editable shape): {{events}}",
"settingsKey": "Key",
"settingsKeyPlaceholder": "key or dotted.path",
"settingsValue": "Value (JSON)",
"settingsAddKey": "Add key",
"settingsRemoveKey": "Remove key",
"settingsEmptyKey": "A key name cannot be empty.",
"settingsDupKey": "Key {{key}} is listed twice.",
"settingsBadJson": "Value of {{key}} is not valid JSON.",
"settingsSaved": "Settings saved to {{file}}.",
"settingsHelp": "Values are JSON: \"opus\", true, 42, [\"a\"], {\"k\":1}. Only the keys you change are written; the rest of the file is left as-is.",
"settingsRedactedKeys": "Not editable here because their values are redacted: {{keys}}",
"hooksChangedBody": "These hooks changed on disk since you started editing. Saving writes your version of the events you edited; events added meanwhile are kept.",
"settingsChangedBody": "This settings file changed on disk since you started editing (the running CLI rewrites it). Saving writes the keys you changed; keys added meanwhile are kept.",
"settingsRedactedKey": "“{{key}}” holds redacted secrets and can't be edited here — saving it would replace the real values with what you typed. Edit it in the file itself.",
"hookReadOnlyEvent": "“{{event}}” already has hooks that can't be edited here (read-only) — a new row with that name would replace them. Use another event name, or edit the file itself."
},
"tabGroups": {
"content": "Content",
"extensions": "Extensions",
"config": "Config"
},
"currentConfig": {
"title": "Current configuration",
"setCount_one": "{{count}} option set · the rest use defaults",
"setCount_other": "{{count}} options set · the rest use defaults",
"default": "default",
"groups": {
"model": "Model & reasoning",
"output": "Output & display",
"session": "Session & input"
},
"keys": {
"model": "Model",
"effortLevel": "Effort level",
"alwaysThinkingEnabled": "Always thinking",
"outputStyle": "Output style",
"verbose": "Verbose output",
"theme": "Theme",
"language": "Language",
"spinnerTipsEnabled": "Spinner tips",
"autoScrollEnabled": "Auto-scroll",
"autoCompactEnabled": "Auto-compact",
"fileCheckpointingEnabled": "File checkpointing",
"editorMode": "Editor mode",
"preferredNotifChannel": "Notifications",
"awaySummaryEnabled": "Away summary"
}
}
}