diff --git a/CLAUDE.md b/CLAUDE.md index adba08ea..196b678e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -355,7 +355,7 @@ cascade projects trigger-set --agent splitting --event pm:label-add ## Claude Code Engine -CASCADE supports using Claude Code SDK as an alternative agent engine. Configure per-project via the CLI or dashboard: +CASCADE uses the Claude Code SDK as the default agent engine. Configure per-project via the CLI or dashboard: ```bash # Set Claude Code as the default engine for a project diff --git a/README.md b/README.md index c069d964..a69cdc81 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ For the full setup walkthrough — projects, credentials, webhooks, and triggers - **Dual-persona GitHub model** — Separate implementer and reviewer bot accounts to prevent feedback loops - **Web dashboard + CLI** — Monitor runs, manage projects, configure triggers - **Extensible trigger system** — Add new events without touching core logic -- **Pluggable agent engines** — `llmist` (default), `claude-code`, `codex`, and `opencode` built-in; easy to extend +- **Pluggable agent engines** — `claude-code` (default), `llmist`, `codex`, and `opencode` built-in; easy to extend - **Credential encryption** — AES-256-GCM encryption for all stored secrets - **Agent resilience** — Built-in rate limiting, exponential-backoff retry, and context compaction @@ -140,7 +140,7 @@ All project-level credentials (GitHub tokens, PM keys, LLM API keys) are stored **Trigger system** — Events from Trello, JIRA, and GitHub webhooks are matched against registered `TriggerHandler` instances. Triggers are configured per-project in the database. -**Agent engines** — Agents run through a shared execution lifecycle with a pluggable engine registry. Default engine is `llmist` (supports OpenRouter, Anthropic, OpenAI). Alternatives: `claude-code` (Claude Code SDK), `codex` (OpenAI Codex CLI), `opencode` (OpenCode server). +**Agent engines** — Agents run through a shared execution lifecycle with a pluggable engine registry. Default engine is `claude-code` (Anthropic Claude Code SDK). Alternatives: `llmist` (supports OpenRouter, Anthropic, OpenAI), `codex` (OpenAI Codex CLI), `opencode` (OpenCode server). **Credential management** — All secrets are stored in the `project_credentials` table, scoped to a project. Optional AES-256-GCM encryption via `CREDENTIAL_MASTER_KEY`. diff --git a/config/projects.json b/config/projects.json index fa2e10f5..7a32e990 100644 --- a/config/projects.json +++ b/config/projects.json @@ -56,7 +56,7 @@ "branchPrefix": "feature/", "agentEngine": { - "default": "llmist", + "default": "claude-code", "overrides": { "implementation": "claude-code", "respond-to-review": "claude-code", diff --git a/docs/getting-started.md b/docs/getting-started.md index 45804fd6..5064266b 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -135,7 +135,7 @@ node bin/cascade.js projects credentials-set my-project \ Which credentials you need depends on which agent engine you plan to use. You can always add more later. -#### LLMist engine (default) +#### LLMist engine LLMist supports OpenRouter, Anthropic, and OpenAI. Store the key for whichever provider you prefer: @@ -159,7 +159,7 @@ node bin/cascade.js projects credentials-set my-project \ --name "OpenAI" ``` -#### Claude Code engine +#### Claude Code engine (default) Requires either an Anthropic API key or a Claude Max subscription token: @@ -207,12 +207,12 @@ You can also manage all of this through the dashboard UI: **Projects** > select ## 7. Choose Agent Engine -Cascade supports multiple agent engines. The default is **LLMist** — change it if you want to use a different engine. +Cascade supports multiple agent engines. The default is **Claude Code** — change it if you want to use a different engine. | Engine | Description | |--------|-------------| -| `llmist` | LLMist SDK with Cascade gadgets (default) | -| `claude-code` | Anthropic Claude Code SDK | +| `claude-code` | Anthropic Claude Code SDK (default) | +| `llmist` | LLMist SDK with Cascade gadgets | | `codex` | OpenAI Codex CLI | | `opencode` | OpenCode headless agent | diff --git a/src/agents/registry.ts b/src/agents/registry.ts index d33f2f2c..34ec2b63 100644 --- a/src/agents/registry.ts +++ b/src/agents/registry.ts @@ -11,7 +11,7 @@ import { logger } from '../utils/logging.js'; * Engine resolution order: * 1. Project-level agent type override * 2. Project-level default engine - * 3. Fallback: 'llmist' + * 3. Fallback: 'claude-code' * * All engines — including llmist — go through the shared adapter * (executeWithEngine), which handles repo setup, lifecycle, progress diff --git a/src/backends/catalog.ts b/src/backends/catalog.ts index 8b1a5ba3..725f763b 100644 --- a/src/backends/catalog.ts +++ b/src/backends/catalog.ts @@ -172,8 +172,8 @@ export const OPENCODE_ENGINE_DEFINITION: AgentEngineDefinition = { }; export const DEFAULT_ENGINE_CATALOG: AgentEngineDefinition[] = [ - LLMIST_ENGINE_DEFINITION, CLAUDE_CODE_ENGINE_DEFINITION, + LLMIST_ENGINE_DEFINITION, CODEX_ENGINE_DEFINITION, OPENCODE_ENGINE_DEFINITION, ]; diff --git a/src/backends/resolution.ts b/src/backends/resolution.ts index ef6d853d..2b1170d5 100644 --- a/src/backends/resolution.ts +++ b/src/backends/resolution.ts @@ -1,6 +1,6 @@ import type { ProjectConfig } from '../types/index.js'; -export const DEFAULT_ENGINE = 'llmist'; +export const DEFAULT_ENGINE = 'claude-code'; /** * Resolve which engine name to use for a given agent type. @@ -8,7 +8,7 @@ export const DEFAULT_ENGINE = 'llmist'; * Resolution order (most specific wins): * 1. Project-level agent type override: project.agentEngine.overrides[agentType] * 2. Project-level default: project.agentEngine.default - * 3. Hardcoded fallback: DEFAULT_ENGINE ('llmist') + * 3. Hardcoded fallback: DEFAULT_ENGINE ('claude-code') */ export function resolveEngineName(agentType: string, project: ProjectConfig): string { return ( diff --git a/src/config/schema.ts b/src/config/schema.ts index 9ca7ccc1..bada8df7 100644 --- a/src/config/schema.ts +++ b/src/config/schema.ts @@ -8,7 +8,7 @@ export const PROJECT_DEFAULTS = { progressModel: 'openrouter:google/gemini-2.5-flash-lite', progressIntervalMinutes: 5, workItemBudgetUsd: 5, - agentEngine: 'llmist', + agentEngine: 'claude-code', } as const; const AgentEngineConfigSchema = z.object({ diff --git a/tests/unit/api/routers/projects.test.ts b/tests/unit/api/routers/projects.test.ts index a13d74b6..f46d22db 100644 --- a/tests/unit/api/routers/projects.test.ts +++ b/tests/unit/api/routers/projects.test.ts @@ -615,7 +615,7 @@ describe('projectsRouter', () => { expect(PROJECT_DEFAULTS.progressModel).toBe('openrouter:google/gemini-2.5-flash-lite'); expect(PROJECT_DEFAULTS.progressIntervalMinutes).toBe(5); expect(PROJECT_DEFAULTS.workItemBudgetUsd).toBe(5); - expect(PROJECT_DEFAULTS.agentEngine).toBe('llmist'); + expect(PROJECT_DEFAULTS.agentEngine).toBe('claude-code'); }); it('CLAUDE_CODE_SETTING_DEFAULTS match the resolver fallback values', () => { diff --git a/tests/unit/backends/catalog.test.ts b/tests/unit/backends/catalog.test.ts index 2ec13cc5..b71e0e6a 100644 --- a/tests/unit/backends/catalog.test.ts +++ b/tests/unit/backends/catalog.test.ts @@ -42,9 +42,9 @@ describe('DEFAULT_ENGINE_CATALOG', () => { } }); - it('is ordered: llmist, claude-code, codex, opencode', () => { - expect(DEFAULT_ENGINE_CATALOG[0].id).toBe('llmist'); - expect(DEFAULT_ENGINE_CATALOG[1].id).toBe('claude-code'); + it('is ordered: claude-code, llmist, codex, opencode', () => { + expect(DEFAULT_ENGINE_CATALOG[0].id).toBe('claude-code'); + expect(DEFAULT_ENGINE_CATALOG[1].id).toBe('llmist'); expect(DEFAULT_ENGINE_CATALOG[2].id).toBe('codex'); expect(DEFAULT_ENGINE_CATALOG[3].id).toBe('opencode'); }); diff --git a/tests/unit/backends/resolution.test.ts b/tests/unit/backends/resolution.test.ts index 954a1f15..0a80c2c9 100644 --- a/tests/unit/backends/resolution.test.ts +++ b/tests/unit/backends/resolution.test.ts @@ -29,14 +29,14 @@ describe('resolveEngineName', () => { expect(resolveEngineName('implementation', project)).toBe('custom-backend'); }); - it('returns "llmist" when no project config', () => { + it('returns "claude-code" when no project config', () => { const project = makeProject(); // no agentEngine - expect(resolveEngineName('implementation', project)).toBe('llmist'); + expect(resolveEngineName('implementation', project)).toBe('claude-code'); }); - it('returns "llmist" when nothing configured', () => { + it('returns "claude-code" when nothing configured', () => { const project = makeProject(); // no agentEngine - expect(resolveEngineName('implementation', project)).toBe('llmist'); + expect(resolveEngineName('implementation', project)).toBe('claude-code'); }); it('prioritizes override > project default > fallback', () => { diff --git a/tests/unit/cli/dashboard/agents/agents.test.ts b/tests/unit/cli/dashboard/agents/agents.test.ts index a6d87075..00f818ef 100644 --- a/tests/unit/cli/dashboard/agents/agents.test.ts +++ b/tests/unit/cli/dashboard/agents/agents.test.ts @@ -38,7 +38,7 @@ const sampleAgentConfig = { projectId: 'my-project', model: 'claude-sonnet-4-5-20250929', maxIterations: 50, - agentEngine: 'llmist', + agentEngine: 'claude-code', maxConcurrency: null, prompt: null, }; diff --git a/tests/unit/cli/dashboard/projects/projects.test.ts b/tests/unit/cli/dashboard/projects/projects.test.ts index b96273db..6b6013ce 100644 --- a/tests/unit/cli/dashboard/projects/projects.test.ts +++ b/tests/unit/cli/dashboard/projects/projects.test.ts @@ -45,7 +45,7 @@ const sampleProject = { baseBranch: 'main', branchPrefix: 'cascade/', model: 'claude-sonnet-4-5-20250929', - agentEngine: 'llmist', + agentEngine: 'claude-code', workItemBudgetUsd: '5.00', maxInFlightItems: 3, }; diff --git a/tests/unit/config/schema.test.ts b/tests/unit/config/schema.test.ts index 7cbbab1e..94b39564 100644 --- a/tests/unit/config/schema.test.ts +++ b/tests/unit/config/schema.test.ts @@ -154,7 +154,7 @@ describe.concurrent('ProjectConfigSchema', () => { expect(() => ProjectConfigSchema.parse(config)).toThrow('Unsupported engine settings'); }); - it('applies default "llmist" for agentEngine.default when object provided', () => { + it('applies default "claude-code" for agentEngine.default when object provided', () => { const config = { id: 'test', orgId: 'default', @@ -165,7 +165,7 @@ describe.concurrent('ProjectConfigSchema', () => { }; const result = ProjectConfigSchema.parse(config); - expect(result.agentEngine?.default).toBe('llmist'); + expect(result.agentEngine?.default).toBe('claude-code'); expect(result.agentEngine?.overrides).toEqual({}); }); @@ -260,7 +260,7 @@ describe.concurrent('validateConfig', () => { expect(() => validateConfig({ projects: [] })).toThrow(); }); - it('applies default "llmist" for project agentEngine.default', () => { + it('applies default "claude-code" for project agentEngine.default', () => { const config = { projects: [ { @@ -275,7 +275,7 @@ describe.concurrent('validateConfig', () => { }; const result = validateConfig(config); - expect(result.projects[0].agentEngine?.default).toBe('llmist'); + expect(result.projects[0].agentEngine?.default).toBe('claude-code'); }); it('accepts custom project agentEngine value', () => { diff --git a/tests/unit/db/repositories/configRepository.test.ts b/tests/unit/db/repositories/configRepository.test.ts index 15f43944..67f6141e 100644 --- a/tests/unit/db/repositories/configRepository.test.ts +++ b/tests/unit/db/repositories/configRepository.test.ts @@ -287,7 +287,7 @@ describe('configRepository', () => { const proj = config.projects[0]; expect(proj.agentEngine).toBeDefined(); - expect(proj.agentEngine?.default).toBe('llmist'); // Zod default + expect(proj.agentEngine?.default).toBe('claude-code'); // Zod default expect(proj.agentEngine?.overrides).toEqual({ implementation: 'claude-code', }); diff --git a/tools/resolve-config.ts b/tools/resolve-config.ts index 9802e710..d9620238 100644 --- a/tools/resolve-config.ts +++ b/tools/resolve-config.ts @@ -96,7 +96,7 @@ async function resolveEffectiveConfig( effectiveModel: projectAc?.model ?? projectRow.model ?? 'openrouter:google/gemini-3-flash-preview', effectiveMaxIterations: projectAc?.maxIterations ?? projectRow.maxIterations ?? 50, - effectiveEngine: projectAc?.agentEngine ?? projectRow.agentEngine ?? 'llmist', + effectiveEngine: projectAc?.agentEngine ?? projectRow.agentEngine ?? 'claude-code', projectOverrides: { model: projectRow.model, maxIterations: projectRow.maxIterations, diff --git a/web/src/components/projects/project-agent-configs.tsx b/web/src/components/projects/project-agent-configs.tsx index eca45136..82781dbc 100644 --- a/web/src/components/projects/project-agent-configs.tsx +++ b/web/src/components/projects/project-agent-configs.tsx @@ -198,7 +198,7 @@ function DefinitionAgentSection({ const effectiveEngine = engines.find((engine) => engine.id === effectiveEngineId); // Resolved inherited engine — project override or system default - const inheritedEngine = projectEngine ?? systemDefaults?.agentEngine ?? 'llmist'; + const inheritedEngine = projectEngine ?? systemDefaults?.agentEngine ?? 'claude-code'; // Per-field engine defaults for the EngineSettingsFields component const engineDefaults = systemDefaults && effectiveEngineId diff --git a/web/src/components/projects/projects-table.tsx b/web/src/components/projects/projects-table.tsx index cd00bfbe..eb9576be 100644 --- a/web/src/components/projects/projects-table.tsx +++ b/web/src/components/projects/projects-table.tsx @@ -109,7 +109,7 @@ export function ProjectsTable({ {project.baseBranch ?? 'main'} - {project.agentEngine ?? 'llmist'} + {project.agentEngine ?? 'claude-code'} {project.workItemBudgetUsd ? `$${project.workItemBudgetUsd}` : '-'}