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
@@ -5,7 +5,7 @@
* A Claude Code Workflow-tool run (dynamic workflow / fleet of sub-agents)
* emits NO hooks, so in a headless `claude -p` run, a CI job, or an HPC/cluster
* compute node its per-run journal is never ingested live. Before this fix the
* CLI import path (`ccam import rescan` → importAllSessions, `ccam import path`
* CLI import path (`agenthub import rescan` → importAllSessions, `agenthub import path`
* → importFromDirectory) never called the workflow-journal ingest, so the
* nested inner-agent transcripts under
* `<sid>/subagents/workflows/<runId>/agent-*.jsonl` were imported with
@@ -28,7 +28,7 @@ const path = require("path");
// Scope the importer at a throwaway CLAUDE_HOME and DB before any server module
// loads — import-history captures PROJECTS_DIR from CLAUDE_HOME at require time.
const TMP_ROOT = fs.mkdtempSync(path.join(os.tmpdir(), `ccam-wf-link-${process.pid}-`));
const TMP_ROOT = fs.mkdtempSync(path.join(os.tmpdir(), `agenthub-wf-link-${process.pid}-`));
process.env.CLAUDE_HOME = TMP_ROOT;
process.env.DASHBOARD_DATA_DIR = path.join(TMP_ROOT, "data");
process.env.DASHBOARD_DB_PATH = path.join(TMP_ROOT, "dashboard.db");
@@ -148,7 +148,7 @@ after(() => {
});
describe("offline CLI import links Workflow-tool inner agents", () => {
it("importFromDirectory (ccam import path) links every inner agent to its run", async () => {
it("importFromDirectory (agenthub import path) links every inner agent to its run", async () => {
const SID = "aaaa1111-0000-4000-8000-000000000001";
const RUN = "wf_dirimport01";
const AGENTS = ["d1", "d2", "d3"];
@@ -171,7 +171,7 @@ describe("offline CLI import links Workflow-tool inner agents", () => {
);
});
it("importAllSessions (ccam import rescan) links every inner agent to its run", async () => {
it("importAllSessions (agenthub import rescan) links every inner agent to its run", async () => {
const SID = "bbbb2222-0000-4000-8000-000000000002";
const RUN = "wf_rescan02";
const AGENTS = ["r1", "r2", "r3", "r4"];