rebrand: rename AutoCoder to AutoForge across entire codebase

Complete project rebrand from AutoCoder to AutoForge, touching 62 files
across Python backend, FastAPI server, React UI, documentation, config,
and CI/CD.

Key changes:
- Rename autocoder_paths.py -> autoforge_paths.py with backward-compat
  migration from .autocoder/ -> .autoforge/ directories
- Update registry.py to migrate ~/.autocoder/ -> ~/.autoforge/ global
  config directory with fallback support
- Update security.py with fallback reads from legacy .autocoder/ paths
- Rename .claude/commands and skills from gsd-to-autocoder-spec to
  gsd-to-autoforge-spec
- Update all Python modules: client, prompts, progress, agent,
  orchestrator, server routers and services
- Update React UI: package.json name, index.html title, localStorage
  keys, all documentation sections, component references
- Update start scripts (bat/sh/py), examples, and .env.example
- Update CLAUDE.md and README.md with new branding and paths
- Update test files for new .autoforge/ directory structure
- Transfer git remote from leonvanzyl/autocoder to
  AutoForgeAI/autoforge

Backward compatibility preserved: legacy .autocoder/ directories are
auto-detected and migrated on next agent start. Config fallback chain
checks both new and old paths.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Auto
2026-02-04 12:02:06 +02:00
parent f6510b4dd8
commit c2ad993e75
63 changed files with 405 additions and 354 deletions

View File

@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AutoCoder</title>
<title>AutoForge</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Archivo+Black&family=Work+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&family=DM+Sans:wght@400;500;700&family=Space+Mono:wght@400;700&family=Outfit:wght@400;500;600;700&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">

18
ui/package-lock.json generated
View File

@@ -1,11 +1,11 @@
{
"name": "autocoder",
"name": "autoforge",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "autocoder",
"name": "autoforge",
"version": "1.0.0",
"dependencies": {
"@radix-ui/react-checkbox": "^1.3.3",
@@ -81,7 +81,6 @@
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
@@ -2695,7 +2694,6 @@
"integrity": "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"undici-types": "~6.21.0"
}
@@ -2706,7 +2704,6 @@
"integrity": "sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==",
"devOptional": true,
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -2717,7 +2714,6 @@
"integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
"devOptional": true,
"license": "MIT",
"peer": true,
"peerDependencies": {
"@types/react": "^19.2.0"
}
@@ -2767,7 +2763,6 @@
"integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.51.0",
"@typescript-eslint/types": "8.51.0",
@@ -3072,7 +3067,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -3190,7 +3184,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -3403,7 +3396,6 @@
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"license": "ISC",
"peer": true,
"engines": {
"node": ">=12"
}
@@ -3595,7 +3587,6 @@
"integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -4579,7 +4570,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -4685,7 +4675,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
"integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -4695,7 +4684,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
"integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -5005,7 +4993,6 @@
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -5144,7 +5131,6 @@
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.27.0",
"fdir": "^6.5.0",

View File

@@ -1,5 +1,5 @@
{
"name": "autocoder",
"name": "autoforge",
"private": true,
"version": "1.0.0",
"type": "module",

View File

@@ -34,8 +34,8 @@ import { Button } from '@/components/ui/button'
import { Card, CardContent } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
const STORAGE_KEY = 'autocoder-selected-project'
const VIEW_MODE_KEY = 'autocoder-view-mode'
const STORAGE_KEY = 'autoforge-selected-project'
const VIEW_MODE_KEY = 'autoforge-view-mode'
// Bottom padding for main content when debug panel is collapsed (40px header + 8px margin)
const COLLAPSED_DEBUG_PANEL_CLEARANCE = 48
@@ -264,7 +264,7 @@ function App() {
<div className="flex items-center justify-between">
{/* Logo and Title */}
<h1 className="font-display text-2xl font-bold tracking-tight uppercase">
AutoCoder
AutoForge
</h1>
{/* Controls */}
@@ -376,7 +376,7 @@ function App() {
{!selectedProject ? (
<div className="text-center mt-12">
<h2 className="font-display text-2xl font-bold mb-2">
Welcome to AutoCoder
Welcome to AutoForge
</h2>
<p className="text-muted-foreground mb-4">
Select a project from the dropdown above or create a new one to get started.

View File

@@ -8,7 +8,7 @@ import { Card, CardContent } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
const ACTIVITY_COLLAPSED_KEY = 'autocoder-activity-collapsed'
const ACTIVITY_COLLAPSED_KEY = 'autoforge-activity-collapsed'
interface AgentMissionControlProps {
agents: ActiveAgent[]

View File

@@ -110,7 +110,7 @@ export function DocsPage() {
className="font-display text-xl font-bold tracking-tight uppercase text-foreground
hover:text-primary transition-colors"
>
AutoCoder
AutoForge
</a>
<Badge variant="secondary" className="text-xs font-medium">

View File

@@ -34,7 +34,7 @@ export const DOC_SECTIONS: DocSection[] = [
title: 'Getting Started',
icon: Rocket,
subsections: [
{ id: 'what-is-autocoder', title: 'What is AutoCoder?' },
{ id: 'what-is-autoforge', title: 'What is AutoForge?' },
{ id: 'quick-start', title: 'Quick Start' },
{ id: 'creating-a-project', title: 'Creating a New Project' },
{ id: 'existing-project', title: 'Adding to an Existing Project' },
@@ -60,7 +60,7 @@ export const DOC_SECTIONS: DocSection[] = [
title: 'Target Project Structure',
icon: FolderTree,
subsections: [
{ id: 'autocoder-directory', title: '.autocoder/ Directory Layout' },
{ id: 'autoforge-directory', title: '.autoforge/ Directory Layout' },
{ id: 'features-db', title: 'Features Database' },
{ id: 'prompts-directory', title: 'Prompts Directory' },
{ id: 'allowed-commands-yaml', title: 'Allowed Commands Config' },

View File

@@ -129,7 +129,7 @@ ANTHROPIC_DEFAULT_SONNET_MODEL=qwen3-coder`}</code></pre>
Environment Variables
</h3>
<p className="text-muted-foreground mb-3">
Key environment variables for configuring AutoCoder:
Key environment variables for configuring AutoForge:
</p>
<table className="w-full text-sm mt-3">
<thead>
@@ -193,7 +193,7 @@ ANTHROPIC_DEFAULT_SONNET_MODEL=qwen3-coder`}</code></pre>
Webhook Support
</h3>
<ul className="list-disc space-y-2 ml-4 text-muted-foreground">
<li>AutoCoder can send webhook notifications on feature completion</li>
<li>AutoForge can send webhook notifications on feature completion</li>
<li>Compatible with N8N and similar automation tools</li>
<li>Configure the webhook URL in project settings</li>
<li>
@@ -208,7 +208,7 @@ ANTHROPIC_DEFAULT_SONNET_MODEL=qwen3-coder`}</code></pre>
<ul className="list-disc space-y-2 ml-4 text-muted-foreground">
<li>
All projects are registered in{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autocoder/registry.db</span>{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autoforge/registry.db</span>{' '}
(SQLite)
</li>
<li>Maps project names to filesystem paths</li>

View File

@@ -15,7 +15,7 @@ export function AppSpecSetup() {
<p className="text-muted-foreground mb-3">
The app spec is an XML document that describes the application to be built. It lives at{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">
.autocoder/prompts/app_spec.txt
.autoforge/prompts/app_spec.txt
</span>{' '}
and tells the initializer agent what features to create. The spec defines your app&apos;s name,
description, tech stack, and the features that should be implemented.
@@ -56,7 +56,7 @@ export function AppSpecSetup() {
<li>
Create{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">
.autocoder/prompts/app_spec.txt
.autoforge/prompts/app_spec.txt
</span>{' '}
in your project directory
</li>
@@ -97,7 +97,7 @@ export function AppSpecSetup() {
<li>
Creates the feature database at{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">
.autocoder/features.db
.autoforge/features.db
</span>
</li>
</ul>

View File

@@ -98,7 +98,7 @@ export function AppearanceThemes() {
Themes Overview
</h3>
<p className="text-muted-foreground mb-4">
AutoCoder comes with 6 built-in themes. Each theme provides a complete visual identity including
AutoForge comes with 6 built-in themes. Each theme provides a complete visual identity including
colors, accents, and dark mode variants.
</p>
<div className="space-y-4">

View File

@@ -13,7 +13,7 @@ export function FAQ() {
Starting a New Project
</h3>
<p className="text-muted-foreground italic mb-2">
How do I use AutoCoder on a new project?
How do I use AutoForge on a new project?
</p>
<p className="text-muted-foreground">
From the UI, select &quot;Create New Project&quot; in the project dropdown. Choose a folder and
@@ -27,12 +27,12 @@ export function FAQ() {
Adding to Existing Project
</h3>
<p className="text-muted-foreground italic mb-2">
How do I add AutoCoder to an existing project?
How do I add AutoForge to an existing project?
</p>
<p className="text-muted-foreground">
Register the project folder through the UI project selector using &quot;Add Existing&quot;.
AutoCoder creates a{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">.autocoder/</span> directory
AutoForge creates a{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">.autoforge/</span> directory
alongside your existing code. Write an app spec describing what to build (new features), and the
agent works within your existing codebase.
</p>
@@ -60,7 +60,7 @@ export function FAQ() {
<p className="text-muted-foreground">
Create{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">
.autocoder/allowed_commands.yaml
.autoforge/allowed_commands.yaml
</span>{' '}
in your project with a list of allowed commands. Supports exact names, wildcards (e.g.,{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">swift*</span>), and local

View File

@@ -1,7 +1,7 @@
/**
* GettingStarted Documentation Section
*
* Covers what AutoCoder is, quick start commands,
* Covers what AutoForge is, quick start commands,
* creating and adding projects, and system requirements.
*/
@@ -10,12 +10,12 @@ import { Badge } from '@/components/ui/badge'
export function GettingStarted() {
return (
<div>
{/* What is AutoCoder? */}
<h3 id="what-is-autocoder" className="text-lg font-semibold text-foreground mt-8 mb-3">
What is AutoCoder?
{/* What is AutoForge? */}
<h3 id="what-is-autoforge" className="text-lg font-semibold text-foreground mt-8 mb-3">
What is AutoForge?
</h3>
<p className="text-muted-foreground mb-4">
AutoCoder is an autonomous coding agent system that builds complete applications over multiple
AutoForge is an autonomous coding agent system that builds complete applications over multiple
sessions using a two-agent pattern:
</p>
<ol className="list-decimal space-y-2 ml-4 text-muted-foreground">
@@ -38,7 +38,7 @@ export function GettingStarted() {
Quick Start
</h3>
<p className="text-muted-foreground mb-3">
Launch AutoCoder with a single command. The CLI menu lets you create or select a project,
Launch AutoForge with a single command. The CLI menu lets you create or select a project,
while the Web UI provides a full dashboard experience.
</p>
<div className="bg-muted rounded-lg p-4 font-mono text-sm">
@@ -76,12 +76,12 @@ start_ui.bat # Web UI
<ul className="list-disc space-y-2 ml-4 text-muted-foreground">
<li>Register the project folder via the UI project selector</li>
<li>
AutoCoder creates a{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">.autocoder/</span>{' '}
AutoForge creates a{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">.autoforge/</span>{' '}
directory inside your project
</li>
<li>
Existing code is preserved &mdash; AutoCoder adds its configuration alongside it
Existing code is preserved &mdash; AutoForge adds its configuration alongside it
</li>
<li>Write or generate an app spec describing what to build</li>
</ul>

View File

@@ -1,7 +1,7 @@
/**
* ProjectStructure Documentation Section
*
* Covers the .autocoder/ directory layout, features database,
* Covers the .autoforge/ directory layout, features database,
* prompts directory, allowed commands, CLAUDE.md convention,
* legacy migration, and Claude inheritance.
*/
@@ -9,18 +9,18 @@
export function ProjectStructure() {
return (
<div>
{/* .autocoder/ Directory Layout */}
<h3 id="autocoder-directory" className="text-lg font-semibold text-foreground mt-8 mb-3">
.autocoder/ Directory Layout
{/* .autoforge/ Directory Layout */}
<h3 id="autoforge-directory" className="text-lg font-semibold text-foreground mt-8 mb-3">
.autoforge/ Directory Layout
</h3>
<p className="text-muted-foreground mb-3">
Every AutoCoder project stores its configuration and runtime files in a{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">.autocoder/</span>{' '}
Every AutoForge project stores its configuration and runtime files in a{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">.autoforge/</span>{' '}
directory at the project root.
</p>
<div className="bg-muted rounded-lg p-4 font-mono text-sm">
<pre><code>{`your-project/
\u251C\u2500\u2500 .autocoder/
\u251C\u2500\u2500 .autoforge/
\u2502 \u251C\u2500\u2500 features.db # SQLite feature database
\u2502 \u251C\u2500\u2500 .agent.lock # Lock file (prevents multiple instances)
\u2502 \u251C\u2500\u2500 .gitignore # Ignores runtime files
@@ -41,7 +41,7 @@ export function ProjectStructure() {
<li>
SQLite database managed by SQLAlchemy, stored at{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">
.autocoder/features.db
.autoforge/features.db
</span>
</li>
<li>
@@ -96,7 +96,7 @@ export function ProjectStructure() {
<p className="text-muted-foreground mb-3">
The optional{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">
.autocoder/allowed_commands.yaml
.autoforge/allowed_commands.yaml
</span>{' '}
file lets you grant project-specific bash commands to the agent. This is useful when your
project requires tools beyond the default allowlist (e.g., language-specific compilers or
@@ -138,7 +138,7 @@ export function ProjectStructure() {
<ul className="list-disc space-y-2 ml-4 text-muted-foreground">
<li>
On the next agent start, these files are automatically migrated into{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">.autocoder/</span>
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">.autoforge/</span>
</li>
<li>Dual-path resolution ensures both old and new layouts work transparently</li>
<li>No manual migration is needed &mdash; it happens seamlessly</li>

View File

@@ -15,7 +15,7 @@ export function Scheduling() {
What Scheduling Does
</h3>
<p className="text-muted-foreground mb-4">
Scheduling automates agent runs at specific times. Set up a schedule and AutoCoder will automatically
Scheduling automates agent runs at specific times. Set up a schedule and AutoForge will automatically
start agents on your project &mdash; useful for overnight builds, periodic maintenance, or continuous
development.
</p>

View File

@@ -16,7 +16,7 @@ export function Security() {
Command Validation Overview
</h3>
<p className="text-muted-foreground mb-3">
AutoCoder uses a defense-in-depth approach for security. All three layers must pass before any
AutoForge uses a defense-in-depth approach for security. All three layers must pass before any
command is executed:
</p>
<ol className="list-decimal space-y-2 ml-4 text-muted-foreground">
@@ -49,12 +49,12 @@ export function Security() {
</li>
<li>
<strong className="text-foreground">Org Blocklist</strong>{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autocoder/config.yaml</span>{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autoforge/config.yaml</span>{' '}
&mdash; org-wide blocks, cannot be project-overridden
</li>
<li>
<strong className="text-foreground">Org Allowlist</strong>{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autocoder/config.yaml</span>{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autoforge/config.yaml</span>{' '}
&mdash; available to all projects
</li>
<li>
@@ -65,7 +65,7 @@ export function Security() {
<li>
<strong className="text-foreground">Project Allowlist</strong>{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">
.autocoder/allowed_commands.yaml
.autoforge/allowed_commands.yaml
</span>{' '}
&mdash; project-specific additions
</li>
@@ -120,12 +120,12 @@ export function Security() {
<p className="text-muted-foreground mb-3">
Each project can define additional allowed commands in{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">
.autocoder/allowed_commands.yaml
.autoforge/allowed_commands.yaml
</span>
:
</p>
<div className="bg-muted rounded-lg p-4 font-mono text-sm">
<pre><code>{`# .autocoder/allowed_commands.yaml
<pre><code>{`# .autoforge/allowed_commands.yaml
version: 1
commands:
# Exact command name
@@ -155,10 +155,10 @@ commands:
</h3>
<p className="text-muted-foreground mb-3">
System administrators can set org-wide policies in{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autocoder/config.yaml</span>:
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autoforge/config.yaml</span>:
</p>
<div className="bg-muted rounded-lg p-4 font-mono text-sm">
<pre><code>{`# ~/.autocoder/config.yaml
<pre><code>{`# ~/.autoforge/config.yaml
version: 1
# Commands available to ALL projects

View File

@@ -177,7 +177,7 @@ export function SettingsConfig() {
<ul className="list-disc space-y-2 ml-4 text-muted-foreground">
<li>
Global settings stored in SQLite registry at{' '}
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autocoder/registry.db</span>
<span className="bg-muted px-1.5 py-0.5 rounded text-sm font-mono">~/.autoforge/registry.db</span>
</li>
<li>Per-project settings (like default concurrency) stored in the project registry entry</li>
<li>UI settings (theme, dark mode) stored in browser localStorage</li>

View File

@@ -52,8 +52,8 @@ export const THEMES: ThemeOption[] = [
}
]
const THEME_STORAGE_KEY = 'autocoder-theme'
const DARK_MODE_STORAGE_KEY = 'autocoder-dark-mode'
const THEME_STORAGE_KEY = 'autoforge-theme'
const DARK_MODE_STORAGE_KEY = 'autoforge-dark-mode'
function getThemeClass(themeId: ThemeId): string {
switch (themeId) {