feat: forge work system — auto-install, multi-provider routing, cost dashboard, MCP tools#41
Conversation
…dashboard, MCP tools Stream 1 — Auto-install settings.json merge: - forge init now merges hooks, permissions, and statusline into ~/.claude/settings.json (idempotent, preserves existing entries) - --no-settings flag to skip the merge - Settings template loaded from global/settings.template.json Stream 2 — Multi-provider model routing: - New src/providers.js: Anthropic + OpenRouter built-in, custom endpoint support - forge config command (show / providers / provider / model subcommands) - forge route --apply writes the recommended model to settings.json - forge route --provider switches provider inline Stream 3 — Cost dashboard fixes: - Hook metrics recording: cortex_hook_main.js now records gate/route events to .forge/metrics.jsonl (best-effort, never blocks) - estimateSpendFromLogs() fallback reads Claude session logs when ccusage is unavailable, computes cost from token counts × model pricing - Dashboard shows real spend tile + per-model breakdown table - /api/spend endpoint added to dash server Stream 4 — MCP tool expansion (8 → 14 tools): - forge_cost: measured stage factors report - forge_dash_data: full dashboard JSON payload - forge_brain: project memory index - forge_ledger_query: natural language ledger search - forge_diagnose: doom-loop detection - forge_doctor: health check results All 452 tests pass (11 new provider tests + updated MCP tests). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019PXuKmJp92Gdo2FudNjSx2
There was a problem hiding this comment.
💡 Codex Review
Lines 146 to 149 in 7b96778
With any non-default provider selected, such as forge route "..." --provider openrouter --apply or after forge config provider openrouter, this still derives modelId from the global Anthropic MODELS table and writes the tier key (sonnet, haiku, etc.) to settings. The active provider mapping saved in .forge/providers.json is never read here, so OpenRouter/custom providers are silently ignored even though the CLI reports a model as applied.
Line 55 in 7b96778
If a user customizes only one model for a built-in provider, this shallow merge replaces the provider's entire models object. For example, overriding just OpenRouter's sonnet leaves haiku/opus missing, and resolveModel then falls back to raw Anthropic IDs for those tiers instead of the OpenRouter-prefixed defaults. Merge models separately so partial provider overrides do not break the remaining tiers.
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
What & why
The forge work system (substrate, guards, memory, routing) didn't auto-activate in Claude sessions, the cost dashboard was empty, model routing was advisory-only with no provider support, and most commands weren't accessible via MCP. This PR fixes all four gaps:
Stream 1 — Auto-install settings.json merge:
forge initnow merges hooks, permissions, and statusline into~/.claude/settings.jsonautomatically (idempotent, preserves existing entries). Adds--no-settingsflag to skip.Stream 2 — Multi-provider model routing: New
src/providers.jswith Anthropic + OpenRouter built-in and custom endpoint support.forge configcommand for provider management.forge route --applywrites the recommended model to settings.json.forge route --provider <name>switches provider inline.Stream 3 — Cost dashboard fixes: Hook metrics recording fills
.forge/metrics.jsonl(best-effort, never blocks).estimateSpendFromLogs()fallback reads Claude session logs when ccusage is unavailable. Dashboard shows real spend tile + per-model breakdown./api/spendendpoint added.Stream 4 — MCP tool expansion (8 → 14 tools):
forge_cost,forge_dash_data,forge_brain,forge_ledger_query,forge_diagnose,forge_doctor.Checklist
npm testpasses (Node 18/20/22) — 452 tests, 450 pass, 2 skipped, 0 failnpm run checkpasses (Biome lint + format)feat:/fix:/docs:…)CHANGELOG.mdupdated under## [Unreleased]forge substrate,forge impact, router/gate, or MCP substrate toolsRisk & rollback
.forge/providers.json). Metrics recording is best-effort (swallowed errors). MCP tools are additive.Extra checks (tick if applicable)
npm run typecheckpassesGenerated by Claude Code