This document tracks all customizations made to AutoCoder that deviate from the upstream repository. Reference this file before any updates to preserve these changes.
- UI Theme Customization
- Playwright Browser Configuration
- Research Agent (AutoCoder Plus)
- Research Agent UI Integration
- Git Branch Safety
- Smart Testing Mode
- Re-analyze Codebase for Existing Projects
- Stuck Agent Detection
- Update Checklist
The UI has been customized from the default neobrutalism style to a clean Twitter/Supabase-style design.
Design Changes:
- No shadows
- Thin borders (1px)
- Rounded corners (1.3rem base)
- Blue accent color (Twitter blue)
- Clean typography (Open Sans)
Purpose: Main theme override file that replaces neo design with clean Twitter style.
Key Changes:
- All
--shadow-neo-*variables set tonone - All status colors (
pending,progress,done) use Twitter blue - Rounded corners:
--radius-neo-lg: 1.3rem - Font: Open Sans
- Removed all transform effects on hover
- Dark mode with proper contrast
CSS Variables (Light Mode):
--color-neo-accent: oklch(0.6723 0.1606 244.9955); /* Twitter blue */
--color-neo-pending: oklch(0.6723 0.1606 244.9955);
--color-neo-progress: oklch(0.6723 0.1606 244.9955);
--color-neo-done: oklch(0.6723 0.1606 244.9955);CSS Variables (Dark Mode):
--color-neo-bg: oklch(0.08 0 0);
--color-neo-card: oklch(0.16 0.005 250);
--color-neo-border: oklch(0.30 0 0);How to preserve: This file should NOT be overwritten. It loads after globals.css and overrides it.
Purpose: Modified to support themeable kanban columns without inline styles.
Changes:
- colorMap changed from inline colors to CSS classes:
// BEFORE (original):
const colorMap = {
pending: 'var(--color-neo-pending)',
progress: 'var(--color-neo-progress)',
done: 'var(--color-neo-done)',
}
// AFTER (customized):
const colorMap = {
pending: 'kanban-header-pending',
progress: 'kanban-header-progress',
done: 'kanban-header-done',
}- Column div uses CSS class instead of inline style:
// BEFORE:
<div className="neo-card overflow-hidden" style={{ borderColor: colorMap[color] }}>
// AFTER:
<div className={`neo-card overflow-hidden kanban-column ${colorMap[color]}`}>- Header div simplified (removed duplicate color class):
// BEFORE:
<div className={`... ${colorMap[color]}`} style={{ backgroundColor: colorMap[color] }}>
// AFTER:
<div className="kanban-header px-4 py-3 border-b border-[var(--color-neo-border)]">- Title text color:
// BEFORE:
text-[var(--color-neo-text-on-bright)]
// AFTER:
text-[var(--color-neo-text)]Changed default Playwright settings for better performance:
- Default browser: Firefox (lower CPU usage)
- Default mode: Headless (saves resources)
Changes:
# BEFORE:
DEFAULT_PLAYWRIGHT_HEADLESS = False
# AFTER:
DEFAULT_PLAYWRIGHT_HEADLESS = True
DEFAULT_PLAYWRIGHT_BROWSER = "firefox"New function added:
def get_playwright_browser() -> str:
"""
Get the browser to use for Playwright.
Options: chrome, firefox, webkit, msedge
Firefox is recommended for lower CPU usage.
"""
return os.getenv("PLAYWRIGHT_BROWSER", DEFAULT_PLAYWRIGHT_BROWSER).lower()Playwright args updated:
playwright_args = [
"@playwright/mcp@latest",
"--viewport-size", "1280x720",
"--browser", browser, # NEW: configurable browser
]Updated documentation:
# PLAYWRIGHT_BROWSER: Which browser to use for testing
# - firefox: Lower CPU usage, recommended (default)
# - chrome: Google Chrome
# - webkit: Safari engine
# - msedge: Microsoft Edge
# PLAYWRIGHT_BROWSER=firefox
# PLAYWRIGHT_HEADLESS: Run browser without visible window
# - true: Browser runs in background, saves CPU (default)
# - false: Browser opens a visible window (useful for debugging)
# PLAYWRIGHT_HEADLESS=trueAdded a new Research Agent that analyzes existing codebases and generates documentation. This enables AutoCoder to work with existing projects, not just create new ones from scratch.
Workflow:
1. /gsd:map-codebase → Analyzes existing codebase
2. Output: .planning/codebase/*.md (STACK, ARCHITECTURE, STRUCTURE, CONVENTIONS, INTEGRATIONS)
3. /gsd-to-autocoder-spec → Converts to app_spec.txt
4. AutoCoder → Continues development on existing code
| File | Purpose |
|---|---|
mcp_server/research_mcp.py |
MCP server with 6 research tools |
api/research_database.py |
SQLAlchemy models for research state |
api/stack_detector.py |
Technology stack detection (70+ frameworks) |
api/pattern_analyzer.py |
Architecture pattern analysis |
api/convention_extractor.py |
Code convention extraction |
| File | Purpose |
|---|---|
.claude/commands/gsd-map-codebase.md |
Slash command for research |
.claude/skills/gsd-map-codebase/SKILL.md |
Skill definition |
.claude/templates/research_prompt.template.md |
Research agent prompt |
Added research MCP server configuration:
RESEARCH_MCP_TOOLS = [
"mcp__research__research_scan_files",
"mcp__research__research_detect_stack",
"mcp__research__research_add_finding",
"mcp__research__research_get_context",
"mcp__research__research_finalize",
"mcp__research__research_get_stats",
]
# In create_client():
if agent_type == "research":
mcp_servers = {
"research": {
"command": sys.executable,
"args": ["-m", "mcp_server.research_mcp"],
"env": {"PROJECT_DIR": str(project_dir.resolve())},
},
}Added research agent type handling:
elif agent_type == "research":
print("Running as RESEARCH agent (codebase analysis)")
prompt = get_research_prompt(project_dir)Fixed: Added agent_type=agent_type to create_client() call.
Added research prompt loading:
def get_research_prompt(project_dir: Path | None = None) -> str:
return load_prompt("research_prompt", project_dir)Added "research" to CLI arguments:
choices=["initializer", "coding", "testing", "research"]| File | Changes |
|---|---|
server/routers/agent.py |
Added /start-research, /research/status, /research/stop endpoints |
server/services/process_manager.py |
Added ResearchAgentProcessManager class and start_research() method |
server/websocket.py |
Added ResearchTracker class for real-time progress updates |
server/schemas.py |
Added ResearchStatus, WSResearchUpdateMessage schemas |
| Tool | Purpose |
|---|---|
research_scan_files(pattern, limit) |
Scan files matching glob pattern |
research_detect_stack() |
Auto-detect technology stack from manifests |
research_add_finding(document, section, content, source_files) |
Add finding to document |
research_get_context(document) |
Get current document state |
research_finalize() |
Write final markdown files |
research_get_stats() |
Get progress statistics |
{project}/.planning/
├── research.db # SQLite database (temporary)
└── codebase/
├── STACK.md # Languages, frameworks, dependencies
├── ARCHITECTURE.md # Patterns, layers, data flow
├── STRUCTURE.md # Directory layout
├── CONVENTIONS.md # Code style, naming
└── INTEGRATIONS.md # APIs, databases, services
CLI:
python autonomous_agent_demo.py --project-dir /path/to/project --agent-type researchClaude Code:
/gsd:map-codebase
After research completes:
/gsd-to-autocoder-spec
All changes are on branch: feature/research-agent
Added a complete UI flow for analyzing existing codebases directly from the browser. Users can now select a folder, watch the research progress in real-time, and view the generated documentation.
User Flow:
Landing Page → "Analyze Existing Codebase" (dropdown)
↓
Modal: Select folder + enter project name
↓
Progress View: Real-time updates via WebSocket
↓
Results View: Tabbed markdown documentation
↓
"Convert to AutoCoder Spec" → Continue to spec creation
| File | Purpose |
|---|---|
ui/src/components/research/AnalyzeCodebaseModal.tsx |
Folder selection modal with project naming |
ui/src/components/research/ResearchProgressView.tsx |
Real-time progress with 🔬 mascot and WebSocket |
ui/src/components/research/ResearchResultsView.tsx |
Tabbed view for 5 documentation files |
ui/src/components/research/MarkdownViewer.tsx |
Markdown rendering with syntax highlighting |
ui/src/components/research/index.ts |
Barrel exports |
Added "Analyze Existing Codebase" option:
// New dropdown menu item
<DropdownMenuItem onSelect={() => setShowAnalyzeModal(true)}>
<FolderSearch size={16} />
Analyze Existing Codebase
</DropdownMenuItem>
// Modal integration
<AnalyzeCodebaseModal
isOpen={showAnalyzeModal}
onClose={() => setShowAnalyzeModal(false)}
onStartAnalysis={(projectName, projectDir) => {
navigate(`/research/${projectName}`)
}}
/>Added research routes:
<Route path="/research/:projectName" element={<ResearchProgressView />} />
<Route path="/research/:projectName/results" element={<ResearchResultsView />} />Added BrowserRouter:
import { BrowserRouter } from 'react-router-dom'
<BrowserRouter>
<App />
</BrowserRouter>Added research_update message handling:
case 'research_update':
setState(prev => ({
...prev,
researchPhase: message.phase,
researchFilesScanned: message.files_scanned,
researchFindingsCount: message.findings_count,
researchLogs: [...prev.researchLogs, { message: message.message, timestamp: Date.now() }]
}))
breakAdded research types:
export type ResearchPhase = 'idle' | 'scanning' | 'analyzing' | 'documenting' | 'complete'
export interface ResearchDoc {
filename: string
content: string
}
export interface ResearchDocsResponse {
success: boolean
docs: ResearchDoc[]
generated_at: number
}
export interface ResearchProject {
name: string
dir: string
status: 'analyzing' | 'complete' | 'error'
phase: ResearchPhase
filesScanned: number
findingsCount: number
completedAt?: string
}Added GET /{name}/research-docs:
@router.get("/{name}/research-docs")
async def get_research_docs(name: str):
"""Get generated research documentation for a project."""
# Returns: { success, docs: [{filename, content}], generated_at }{
"react-router-dom": "^7.x",
"react-markdown": "^9.0.0",
"remark-gfm": "^4.0.0",
"react-syntax-highlighter": "^15.5.0"
}- Folder Browser: Reuses existing
FolderBrowsercomponent - Progress Display: Animated progress bar with phase indicators
- Research Mascot: 🔬 scientist robot with phase-based animations
- Terminal Output: Collapsible log viewer with timestamps
- Markdown Viewer: Syntax highlighting for 20+ languages, copy-to-clipboard
- Tab Navigation: 5 tabs for STACK, ARCHITECTURE, STRUCTURE, CONVENTIONS, INTEGRATIONS
- Theme Compatible: Works with all 5 themes (Twitter, Claude, Neo Brutalism, Retro Arcade, Aurora)
- Responsive Design: Mobile-friendly layout
- Branch Selection: Safety modal before coding starts (see Section 5)
Added branch selection step before AutoCoder starts coding on existing projects. This prevents accidental direct commits to main/master branches.
Flow:
Research Results → "Convert to Spec" → Branch Selection Modal → Coding
- Protected branch detection: main, master, develop, production marked with 🔒
- Warning on protected branches: Extra confirmation if user wants to work on main/master
- New branch suggestion: Suggests
autocoder/{project-name}pattern - Uncommitted changes warning: Alerts user but doesn't block
- Non-git repo handling: Allows continuing without git
File: server/routers/git.py
| Endpoint | Method | Purpose |
|---|---|---|
/{project}/git/branches |
GET | List all branches with protection info |
/{project}/git/checkout |
POST | Switch to existing branch |
/{project}/git/create-branch |
POST | Create new branch and switch |
File: ui/src/components/research/BranchSelectionModal.tsx
Features:
- Radio group with 3 options: Create new / Use existing / Continue current
- Branch name validation
- Loading states during git operations
- Error handling for edge cases
| File | Changes |
|---|---|
server/routers/git.py |
NEW - Git management endpoints |
server/routers/__init__.py |
Added git_router export |
server/main.py |
Registered git router |
ui/src/lib/api.ts |
Added listBranches, checkoutBranch, createBranch |
ui/src/lib/types.ts |
Added GitBranch, BranchListResponse, etc. |
ui/src/components/research/BranchSelectionModal.tsx |
NEW - Branch selection modal |
ui/src/components/research/ResearchResultsView.tsx |
Integrated branch modal |
ui/src/App.tsx |
Updated navigation after branch selection |
Added a Smart Testing Mode setting that controls when Playwright browser is used for testing. This reduces overhead by skipping browser automation for API/backend features that don't need it.
Modes:
| Mode | Description |
|---|---|
| Full | Always use Playwright browser for all features (default) |
| Smart | Use Playwright only for UI features, skip for API/backend features |
Note: YOLO mode (existing setting) disables all testing including Playwright.
The should_use_playwright() function in client.py checks the feature category:
# API/backend features → No Playwright
api_keywords = ["api", "backend", "database", "db", "server", "endpoint", "service"]
# UI features → Use Playwright
ui_keywords = ["ui", "frontend", "component", "page", "view", "screen", "button", "form"]
# Unknown category → Default to Playwright (safe)| File | Changes |
|---|---|
server/schemas.py |
Added VALID_TESTING_MODES, testing_mode field to schemas |
server/routers/settings.py |
Get/set testing_mode setting |
server/routers/agent.py |
Pass testing_mode to process manager |
server/services/process_manager.py |
Pass --testing-mode to agent subprocess |
parallel_orchestrator.py |
Propagate testing_mode to spawned agents |
autonomous_agent_demo.py |
Added --testing-mode CLI argument |
agent.py |
Lookup feature category for smart mode decisions |
client.py |
Added should_use_playwright() function |
| File | Changes |
|---|---|
ui/src/lib/types.ts |
Added testing_mode to Settings types |
ui/src/hooks/useProjects.ts |
Added testing_mode default value |
ui/src/components/SettingsModal.tsx |
Added Full/Smart toggle UI |
The Settings modal now includes a "Browser Testing" toggle:
- Compact button group (same style as Model selector)
- Shows description: "All features" or "UI features only"
- Disabled when YOLO mode is on (YOLO already skips all testing)
UI: Settings → Browser Testing → Full/Smart
CLI:
python autonomous_agent_demo.py --project-dir myapp --testing-mode smart- Playwright MCP server spawns a browser process (~100-300MB RAM per agent)
- Smart mode skips this for API features, reducing memory usage
- Full mode is safer but uses more resources
Added a Re-analyze Codebase button for existing projects in AutoCoder. This allows running the research agent on a project that's already registered, to update documentation when the codebase has evolved outside of AutoCoder (e.g., manual changes with Claude Code).
Problem solved: Previously, research/analyze was only available for onboarding NEW projects. If you modified an existing project outside of AutoCoder, there was no easy way to update the documentation.
Solution: Added a microscope button in the project header that triggers a re-analysis of the current project.
[Open Existing Project] → [🔬 Re-analyze Button in Header]
↓
Confirmation Modal (explains what will happen)
↓
Research Progress View (real-time updates)
↓
Results View (updated documentation)
↓
Optionally: Update app_spec.txt
| File | Purpose |
|---|---|
ui/src/components/research/ReanalyzeCodebaseModal.tsx |
Confirmation modal with project info and start button |
| File | Changes |
|---|---|
ui/src/components/research/index.ts |
Added export for ReanalyzeCodebaseModal |
ui/src/lib/api.ts |
Added getResearchStatus(), startResearchAgent(), stopResearchAgent() |
ui/src/App.tsx |
Added microscope button in header, modal state, navigation handler |
// ui/src/lib/api.ts
interface ResearchStatusResponse {
status: 'idle' | 'running' | 'complete' | 'error'
phase?: string
filesScanned?: number
findingsCount?: number
}
interface ResearchActionResponse {
success: boolean
message: string
}
// Get research agent status for a project
export async function getResearchStatus(projectName: string): Promise<ResearchStatusResponse>
// Start research agent for existing project
export async function startResearchAgent(projectName: string): Promise<ResearchActionResponse>
// Stop research agent
export async function stopResearchAgent(projectName: string): Promise<ResearchActionResponse>The Re-analyze button appears in the project header:
- Icon: Microscope (🔬)
- Location: Next to the Reset button (gear icon area)
- Visibility: Only when a project is selected AND agent is NOT running
- Tooltip: "Re-analyze Codebase"
The backend already supported this via existing endpoints in server/routers/agent.py:
GET /api/projects/{project_name}/agent/research/statusPOST /api/projects/{project_name}/agent/start-researchPOST /api/projects/{project_name}/agent/research/stop
No backend changes were needed.
Added activity-based stuck agent detection to the parallel orchestrator. Agents that hang without producing output are automatically detected and killed, preventing features from being stuck indefinitely.
Problem solved: Agents can sometimes hang (e.g., waiting indefinitely for API response) without crashing. Previously, these stuck agents would occupy a parallel slot forever, blocking progress.
Solution: Monitor agent output activity. If no output for 20 minutes, the agent is considered stuck and is automatically killed. The feature is then retried.
1. Agent starts → timestamp initialized
2. Agent outputs a line → timestamp updated
3. Every 5 seconds → check all agent timestamps
4. If no output for 20 minutes → kill agent, log warning
5. Agent completion handler → clears in_progress flag
6. Feature automatically retries on next loop iteration
| Constant | Value | Description |
|---|---|---|
AGENT_INACTIVITY_TIMEOUT |
1200 | Seconds of inactivity before killing (20 minutes) |
The timeout is set to 20 minutes because:
- Working agents produce continuous output (tool calls, code, thinking)
- Complex features can take 1-2 hours but always produce output
- 20 minutes of silence indicates the agent is stuck, not working
New constant:
AGENT_INACTIVITY_TIMEOUT = 1200 # 20 minutesNew tracking dictionary in __init__:
# Track last activity time per agent for stuck detection
self._last_activity: dict[int, float] = {}Activity tracking in _read_output:
# Update activity timestamp for stuck detection
if feature_id is not None:
with self._lock:
self._last_activity[activity_key] = time.time()New method _check_stuck_agents:
- Iterates through running coding and testing agents
- Compares current time vs last activity timestamp
- Kills agents exceeding
AGENT_INACTIVITY_TIMEOUT - Logs warnings to console and debug log
- Returns list of killed feature IDs
Main loop integration:
# Check for stuck agents (no output for AGENT_INACTIVITY_TIMEOUT)
stuck_features = self._check_stuck_agents()
if stuck_features:
debug_log.log("STUCK", f"Killed {len(stuck_features)} stuck agent(s)")Cleanup in _on_agent_complete:
# Clean up activity tracking
self._last_activity.pop(feature_id, None)Console warning:
WARNING: Feature #32 agent stuck - no output for 20 minutes. Killing...
Debug log (orchestrator_debug.log):
[STUCK] Killing stuck coding agent for feature #32
inactive_minutes: 20
pid: 26979
| Benefit | Description |
|---|---|
| Self-healing | Stuck agents are automatically recovered without manual intervention |
| No false positives | 20-minute timeout is long enough for legitimate slow operations |
| Low overhead | Just comparing timestamps, runs every 5 seconds |
| Full logging | All stuck agent events logged for debugging |
- Make timeout configurable via settings UI
- Add WebSocket notification when stuck agent is detected
- Track stuck agent frequency per feature (identify problematic features)
When updating AutoCoder from upstream, verify these items:
-
ui/src/styles/custom-theme.cssis preserved -
ui/src/components/KanbanColumn.tsxchanges are preserved - Test both light and dark modes
-
ui/src/components/research/AnalyzeCodebaseModal.tsx- Folder selection modal -
ui/src/components/research/ResearchProgressView.tsx- Progress display -
ui/src/components/research/ResearchResultsView.tsx- Results viewer -
ui/src/components/research/MarkdownViewer.tsx- Markdown renderer -
ui/src/components/research/index.ts- Barrel exports -
ui/src/App.tsx- Research routes preserved -
ui/src/main.tsx- BrowserRouter wrapper preserved -
ui/src/components/ProjectSelector.tsx- Analyze button preserved -
ui/src/hooks/useWebSocket.ts- research_update handling preserved -
ui/src/lib/types.ts- Research types preserved -
ui/src/components/research/BranchSelectionModal.tsx- Branch selector - Run
npm run buildinui/directory
-
server/routers/git.py- Git management endpoints -
server/routers/__init__.py- git_router export -
server/main.py- git router registration -
ui/src/lib/api.ts- Git API functions preserved -
ui/src/lib/types.ts- Git types preserved
-
client.py- Playwright browser/headless defaults preserved -
client.py- Research MCP server configuration preserved -
agent.py- Research agent type handling preserved -
prompts.py- Research prompt loading preserved -
.env.example- Documentation updates preserved
-
mcp_server/research_mcp.py- Research MCP server -
api/research_database.py- Research SQLAlchemy models -
api/stack_detector.py- Stack detection utility -
api/pattern_analyzer.py- Pattern analysis utility -
api/convention_extractor.py- Convention extraction utility -
.claude/templates/research_prompt.template.md- Research prompt -
.claude/commands/gsd-map-codebase.md- Slash command -
.claude/skills/gsd-map-codebase/SKILL.md- Skill definition -
server/routers/agent.py- Research endpoints -
server/services/process_manager.py- Research process manager -
server/websocket.py- Research progress tracking -
server/schemas.py- Research schemas
-
server/schemas.py- VALID_TESTING_MODES and testing_mode fields -
server/routers/settings.py- testing_mode get/set -
server/routers/agent.py- testing_mode passed to process manager -
server/services/process_manager.py- --testing-mode CLI arg -
parallel_orchestrator.py- testing_mode propagation -
autonomous_agent_demo.py- --testing-mode argument -
agent.py- feature category lookup for smart mode -
client.py- should_use_playwright() function -
ui/src/lib/types.ts- testing_mode in Settings -
ui/src/hooks/useProjects.ts- testing_mode default -
ui/src/components/SettingsModal.tsx- Browser Testing toggle
-
ui/src/components/research/ReanalyzeCodebaseModal.tsx- Confirmation modal -
ui/src/components/research/index.ts- ReanalyzeCodebaseModal export -
ui/src/lib/api.ts- Research API functions (getResearchStatus, startResearchAgent, stopResearchAgent) -
ui/src/App.tsx- Microscope button in header, showReanalyzeModal state
-
parallel_orchestrator.py- AGENT_INACTIVITY_TIMEOUT constant -
parallel_orchestrator.py- _last_activity dictionary in init -
parallel_orchestrator.py- Activity tracking in _read_output -
parallel_orchestrator.py- _check_stuck_agents method -
parallel_orchestrator.py- Stuck check in main loop -
parallel_orchestrator.py- Cleanup in _on_agent_complete
- Verify Playwright uses Firefox by default
- Check that browser runs headless by default
- Test research agent:
python autonomous_agent_demo.py --project-dir test --agent-type research - Test smart testing mode: Settings → Browser Testing → Smart
- Test stuck agent detection: Let agent run and verify stuck agents are killed after 20 min inactivity
rm ui/src/styles/custom-theme.css
git checkout ui/src/components/KanbanColumn.tsx
cd ui && npm run buildgit checkout client.py .env.example| File | Type | Change Description |
|---|---|---|
ui/src/styles/custom-theme.css |
UI | Twitter-style theme |
ui/src/components/KanbanColumn.tsx |
UI | Themeable kanban columns |
ui/src/main.tsx |
UI | BrowserRouter wrapper + custom theme import |
ui/src/App.tsx |
UI | Research routes |
ui/src/components/ProjectSelector.tsx |
UI | "Analyze Existing Codebase" button |
ui/src/components/research/AnalyzeCodebaseModal.tsx |
UI | Folder selection modal |
ui/src/components/research/ResearchProgressView.tsx |
UI | Real-time progress display |
ui/src/components/research/ResearchResultsView.tsx |
UI | Documentation viewer with tabs |
ui/src/components/research/MarkdownViewer.tsx |
UI | Markdown + syntax highlighting |
ui/src/components/research/index.ts |
UI | Barrel exports |
ui/src/components/research/BranchSelectionModal.tsx |
UI | Git branch selection modal |
ui/src/components/research/ReanalyzeCodebaseModal.tsx |
UI | Re-analyze confirmation modal |
ui/src/hooks/useWebSocket.ts |
UI | research_update message handling |
ui/src/lib/types.ts |
UI | Research + Git TypeScript types |
server/routers/git.py |
Server | Git branch management endpoints |
client.py |
Backend | Firefox + headless defaults, research MCP server |
agent.py |
Backend | Research agent type handling |
prompts.py |
Backend | Research prompt loading |
autonomous_agent_demo.py |
Backend | Research CLI argument |
mcp_server/research_mcp.py |
MCP | Research MCP server (6 tools) |
api/research_database.py |
API | Research SQLAlchemy models |
api/stack_detector.py |
API | Technology stack detection |
api/pattern_analyzer.py |
API | Architecture pattern analysis |
api/convention_extractor.py |
API | Code convention extraction |
server/routers/agent.py |
Server | Research REST endpoints |
server/routers/projects.py |
Server | GET /research-docs endpoint |
server/services/process_manager.py |
Server | Research process manager |
server/websocket.py |
Server | Research WebSocket tracking |
server/schemas.py |
Server | Research Pydantic schemas |
.claude/templates/research_prompt.template.md |
Prompt | Research agent prompt |
.claude/commands/gsd-map-codebase.md |
Command | /gsd:map-codebase |
.claude/skills/gsd-map-codebase/SKILL.md |
Skill | Research skill definition |
.env.example |
Config | Updated documentation |
parallel_orchestrator.py |
Backend | Stuck agent detection with 20-min inactivity timeout |
Date: February 2026 Features:
- Research Agent (AutoCoder Plus) - Analyze existing codebases
- Research Agent UI - Full browser-based flow for codebase analysis
- Re-analyze Codebase - Run research on existing projects to update documentation
- Git Branch Safety - Protected branch warnings, new branch creation before coding
- Smart Testing Mode - Skip Playwright for API features to reduce overhead
- Stuck Agent Detection - Auto-kill agents with no output for 20 minutes
- Twitter-style UI theme with custom theme override system
- Firefox + headless Playwright defaults
Branch: master