refactor!: rebrand CCAM to AgentHub

Clean break, no compatibility alias. Renames the product name, the CLI
binary (`ccam` -> `agenthub`), the env var prefix (`CCAM_` ->
`AGENTHUB_`), the Prometheus metric namespace (`ccam_*` ->
`agenthub_*`), the tmux session prefix (`ccam-lane-<id>` ->
`agenthub-lane-<id>`), the per-repo runtime profile directory
(`.ccam/profile` -> `.agenthub/profile`), the lanes state root
(`~/.claude/ccam-lanes` -> `~/.claude/agenthub-lanes`), the bundled
plugins (`plugins/ccam*` -> `plugins/agenthub*`) and their slash
commands (`/ccam-doctor` -> `/agenthub-doctor`, `/ccam:*` ->
`/agenthub:*`).

Because there is no alias, an existing install has to be updated by
hand: rename its `.ccam/profile` directory and any `CCAM_*` variables,
and reinstall the plugin under its new name.

Two other name families are deliberately left alone here, since they are
not just strings: the `Claude-Code-Monitor` repository/marketplace name,
and the `agent-dashboard` npm package plus its `~/.claude/agent-dashboard`
runtime directory, which holds the live database and needs a migration
rather than a rename.

Verified: server 1406/1406, client 459/459, `grep -i ccam` clean across
tracked files, `openapi.yaml` regenerated (95 paths, unchanged count).
This commit is contained in:
2026-09-07 12:09:15 +07:00
parent ae9b3dbcd5
commit 17d56d0e01
345 changed files with 2705 additions and 2727 deletions
+24 -91
View File
@@ -1654,8 +1654,8 @@ components:
properties:
format:
type: string
description: Bundle format marker (always "ccam-export" for exports from this version).
example: ccam-export
description: Bundle format marker (always "agenthub-export" for exports from this version).
example: agenthub-export
version:
type: integer
description: Bundle schema version.
@@ -1890,91 +1890,38 @@ components:
type: string
description: First 320 characters of the markdown body (after frontmatter).
example: Review backend route and hook logic for regressions...
CcConfigPluginItem:
type: object
description: One named artifact a plugin contributes - a skill, subagent, slash command or output style.
required:
- name
- description
- file
properties:
name:
type: string
description: Frontmatter `name` when the file declares one (that is what Claude Code addresses it by), else the filename without its .md extension.
example: ship-feature-lane
description:
type: string
nullable: true
description: Frontmatter `description`, or null when the file declares none.
example: Autonomous end-to-end feature pipeline for ONE CCAM lane.
file:
type: string
description: Absolute path of the backing markdown file (SKILL.md for a skill).
example: /Users/son/.claude/plugins/cache/sg/ccam/skills/ship-feature-lane/SKILL.md
CcConfigPluginContributions:
type: object
nullable: true
description: Counts of artifacts a plugin contributes, the same surfaces listed by name under `items`, plus its parsed .claude-plugin/plugin.json. Null when the plugin's installPath does not exist on disk.
description: Counts of artifacts a plugin contributes, plus its parsed .claude-plugin/plugin.json. Null when the plugin's installPath does not exist on disk.
required:
- skills
- agents
- commands
- outputStyles
- hooks
- items
- pluginJson
properties:
skills:
type: integer
description: Number of skills the plugin contributes; always equals `items.skills.length`.
description: Number of skill directories (containing SKILL.md) under the plugin.
example: 3
agents:
type: integer
description: Number of subagents the plugin contributes; always equals `items.agents.length`.
description: Number of .md agent files under the plugin.
example: 2
commands:
type: integer
description: Number of slash commands the plugin contributes; always equals `items.commands.length`.
description: Number of .md command files under the plugin.
example: 5
outputStyles:
type: integer
description: Number of output styles the plugin contributes; always equals `items.outputStyles.length`.
description: Number of .md output-style files under the plugin.
example: 0
hooks:
type: integer
description: Number of files under the plugin's hooks/ directory. Has no `items` list - a plugin's hooks are matcher/command pairs declared inline in plugin.json, not named artifacts.
description: Number of files under the plugin's hooks/ directory.
example: 1
items:
type: object
description: >-
The contributed artifacts by name, so a client can show WHICH skills,
subagents, commands and output styles a plugin ships. Each surface
covers both the conventional directory (`skills/`, `agents/`,
`commands/`, `output-styles/`) and any path plugin.json declares for
that key; a declared path escaping the plugin's own install directory
is ignored.
required:
- skills
- agents
- commands
- outputStyles
properties:
skills:
type: array
items:
$ref: '#/components/schemas/CcConfigPluginItem'
agents:
type: array
items:
$ref: '#/components/schemas/CcConfigPluginItem'
commands:
type: array
items:
$ref: '#/components/schemas/CcConfigPluginItem'
outputStyles:
type: array
items:
$ref: '#/components/schemas/CcConfigPluginItem'
pluginJson:
type: object
nullable: true
@@ -5021,12 +4968,12 @@ paths:
schema:
type: string
example: |
# HELP ccam_up 1 when the dashboard API is serving this scrape.
# TYPE ccam_up gauge
ccam_up 1
# HELP ccam_sessions Number of sessions by lifecycle status.
# TYPE ccam_sessions gauge
ccam_sessions{status="active"} 3
# HELP agenthub_up 1 when the dashboard API is serving this scrape.
# TYPE agenthub_up gauge
agenthub_up 1
# HELP agenthub_sessions Number of sessions by lifecycle status.
# TYPE agenthub_sessions gauge
agenthub_sessions{status="active"} 3
/api/analytics:
get:
tags:
@@ -5900,7 +5847,7 @@ paths:
tags:
- Settings
summary: Export all dashboard data as JSON
description: 'Exports the entire dataset as a single versioned JSON document — all sessions, agents, events, token_usage rows, workflows, dashboard_runs, alert_rules, and model_pricing — stamped with `format: "ccam-export"`, `version`, and `exported_at`. Served with a `Content-Disposition: attachment` header (filename `agent-monitor-export-YYYY-MM-DD.json`) so browsers download it. Use it to back up before a destructive operation (clear-data / cleanup with purge_days) or to migrate/consolidate data across machines — the bundle is re-importable via POST /api/settings/import. Read-only; nothing is modified.'
description: 'Exports the entire dataset as a single versioned JSON document — all sessions, agents, events, token_usage rows, workflows, dashboard_runs, alert_rules, and model_pricing — stamped with `format: "agenthub-export"`, `version`, and `exported_at`. Served with a `Content-Disposition: attachment` header (filename `agent-monitor-export-YYYY-MM-DD.json`) so browsers download it. Use it to back up before a destructive operation (clear-data / cleanup with purge_days) or to migrate/consolidate data across machines — the bundle is re-importable via POST /api/settings/import. Read-only; nothing is modified.'
operationId: exportData
responses:
'200':
@@ -5910,7 +5857,7 @@ paths:
schema:
$ref: '#/components/schemas/ExportResponse'
example:
format: ccam-export
format: agenthub-export
version: 1
exported_at: '2026-06-26T01:12:44.913Z'
sessions:
@@ -7564,25 +7511,11 @@ paths:
installPathExists: true
enabled: true
contributes:
skills: 2
agents: 1
commands: 0
skills: 3
agents: 2
commands: 5
outputStyles: 0
hooks: 1
items:
skills:
- name: brainstorming
description: Explores intent and design before implementation.
file: /Users/son/.claude/plugins/superpowers/skills/brainstorming/SKILL.md
- name: writing-plans
description: Turns a spec into a step-by-step implementation plan.
file: /Users/son/.claude/plugins/superpowers/skills/writing-plans/SKILL.md
agents:
- name: code-reviewer
description: Reviews a diff for correctness regressions.
file: /Users/son/.claude/plugins/superpowers/agents/code-reviewer.md
commands: []
outputStyles: []
pluginJson:
name: superpowers
version: 1.2.0
@@ -8921,7 +8854,7 @@ paths:
tags:
- Lanes
summary: A lane's own application stack
description: Slot, ports, per-service liveness, log paths and the last boot error. Recomputed on every call from pid files and port probes rather than cached, because a process can die to OOM or a stray kill without telling anyone. Read-only, so no same-origin guard. Kept out of GET /api/lanes because it opens a socket per declared port and stats every pid file. A lane whose repository declares no .ccam/profile returns available:false with HTTP 200 — most lanes never run a stack, which is a normal state, not a fault.
description: Slot, ports, per-service liveness, log paths and the last boot error. Recomputed on every call from pid files and port probes rather than cached, because a process can die to OOM or a stray kill without telling anyone. Read-only, so no same-origin guard. Kept out of GET /api/lanes because it opens a socket per declared port and stats every pid file. A lane whose repository declares no .agenthub/profile returns available:false with HTTP 200 — most lanes never run a stack, which is a normal state, not a fault.
operationId: getLaneRuntime
parameters:
- name: id
@@ -8962,7 +8895,7 @@ paths:
'202':
description: Accepted; the boot runs in the background.
'400':
description: ENOPROFILE — no .ccam/profile, with the paths searched.
description: ENOPROFILE — no .agenthub/profile, with the paths searched.
'403':
description: The browser request was not same-origin/loopback.
'404':
@@ -9896,7 +9829,7 @@ paths:
tags:
- Settings
summary: Restore (import) a previously exported data bundle
description: 'Restores a bundle produced by GET /api/settings/export. Supply it either as `multipart/form-data` with a single `file` field (browser upload) or as a JSON body `{ "path": "<absolute path>" }` (the server reads the file from disk — used by the `ccam import-data` CLI, and it also sidesteps the global 1 MB JSON body cap for large bundles). The restore is idempotent and NON-DESTRUCTIVE: it is session-atomic, so a session already present (matched by its UUID) is skipped whole together with its agents/events/token_usage/workflows, and independent config rows (dashboard_runs, alert_rules, model_pricing) are inserted only when absent. Nothing existing is overwritten — ideal for consolidating several machines into one dashboard. The response reports per-table counts.'
description: 'Restores a bundle produced by GET /api/settings/export. Supply it either as `multipart/form-data` with a single `file` field (browser upload) or as a JSON body `{ "path": "<absolute path>" }` (the server reads the file from disk — used by the `agenthub import-data` CLI, and it also sidesteps the global 1 MB JSON body cap for large bundles). The restore is idempotent and NON-DESTRUCTIVE: it is session-atomic, so a session already present (matched by its UUID) is skipped whole together with its agents/events/token_usage/workflows, and independent config rows (dashboard_runs, alert_rules, model_pricing) are inserted only when absent. Nothing existing is overwritten — ideal for consolidating several machines into one dashboard. The response reports per-table counts.'
operationId: importData
requestBody:
required: true
@@ -9919,7 +9852,7 @@ paths:
type: string
description: Absolute path (server-side) to an export .json file. `~` is expanded.
example:
path: /Users/you/ccam-export-2026-06-26.json
path: /Users/you/agenthub-export-2026-06-26.json
responses:
'200':
description: Per-table restore counts
@@ -9930,7 +9863,7 @@ paths:
example:
ok: true
source: agent-monitor-export-2026-06-26.json
format: ccam-export
format: agenthub-export
sessions_imported: 42
sessions_skipped: 3
agents: 96