module.exports = { name: '{{projectName}}', stack: { framework: { name: '{{framework}}', version: '{{frameworkVersion}}', variant: '{{frameworkVariant}}', }, packageManager: '{{packageManager}}', testing: { unit: '{{unitTest}}', e2e: '{{e2eTest}}', }, styling: '{{styling}}', }, commands: { dev: '{{devCommand}}', build: '{{buildCommand}}', test: '{{testCommand}}', lint: '{{lintCommand}}', typecheck: '{{typecheckCommand}}', }, paths: { root: '.ralph', prompts: '.ralph/prompts', guides: '.ralph/guides', specs: '.ralph/specs', scripts: '.ralph/scripts', learnings: '.ralph/LEARNINGS.md', agents: '.ralph/AGENTS.md', }, loop: { maxIterations: 10, maxE2eAttempts: 5, defaultModel: 'sonnet', // Claude implementation/e2e default planningModel: 'opus', // Claude planning/review default codexModel: 'gpt-5.3-codex', // Codex model default for codex phases codingCli: 'claude', // Implementation CLI: 'claude' | 'codex' reviewCli: 'claude', // Review CLI: 'claude' | 'codex' reviewMode: 'manual', // 'manual' = stop at PR, 'auto' = review (no merge), 'merge' = review + auto-merge claudePermissionMode: 'default', // Claude permission mode: default|auto|dontAsk|acceptEdits|plan|bypassPermissions codexSandbox: 'workspace-write', // Codex sandbox: read-only|workspace-write|danger-full-access codexApprovalPolicy: 'never', // Codex approvals: untrusted|on-failure|on-request|never disableMcpInAutomatedRuns: true, // Disable MCP servers when RALPH_AUTOMATED=1 }, };