Configuration updates: - Added .env.example template for environment variables - Updated README.md with better setup instructions (.env usage) - Enhanced .claude/settings.local.json with additional Bash permissions - Added .claude/CLAUDE.md framework documentation Spec cleanup: - Removed obsolete spec files (language_selection, mistral_extensible, template, theme_customization) - Consolidated app_spec.txt (Claude Clone example) - Added app_spec_model.txt as reference template - Added app_spec_library_rag_types_docs.txt - Added coding_prompt_library.md Framework improvements: - Updated agent.py, autonomous_agent_demo.py, client.py with minor fixes - Enhanced dockerize_my_project.py - Updated prompts (initializer, initializer_bis) with better guidance - Added docker-compose.my_project.yml example This commit consolidates improvements made during development sessions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
8.0 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Overview
This is an autonomous coding agent framework that uses Claude Agent SDK with Linear integration for project management. The framework enables long-running autonomous development sessions where agents create complete applications from XML specifications.
Key Architecture: Two-agent pattern (Initializer + Coding Agent) with Linear as the single source of truth for project state and progress tracking.
Common Commands
Running the Agent
# Fresh project initialization
python autonomous_agent_demo.py --project-dir ./my_project
# Continue existing project
python autonomous_agent_demo.py --project-dir ./my_project
# Add new features to existing project (Initializer Bis)
python autonomous_agent_demo.py --project-dir ./my_project --new-spec app_spec_theme_customization.txt
# Limit iterations for testing
python autonomous_agent_demo.py --project-dir ./my_project --max-iterations 3
Testing
# Run security hook tests
python test_security.py
# Test mypy type checking (for library projects)
mypy path/to/module.py
Environment Setup
# Generate Claude Code OAuth token
claude setup-token
# Install dependencies
pip install -r requirements.txt
High-Level Architecture
Core Agent Flow
-
First Run (Initializer Agent):
- Reads
prompts/app_spec.txtspecification - Creates Linear project and ~50 issues (one per
<feature_X>tag) - Creates META issue for session tracking
- Initializes project structure with
init.sh - Writes
.linear_project.jsonmarker file
- Reads
-
Subsequent Runs (Coding Agent):
- Queries Linear for highest-priority Todo issue
- Updates issue status to "In Progress"
- Implements feature using SDK tools
- Tests implementation (Puppeteer for web apps, pytest/mypy for libraries)
- Adds comment to Linear issue with implementation notes
- Marks issue as "Done"
- Updates META issue with session summary
-
Initializer Bis (Add Features):
- Triggered by
--new-specflag on existing projects - Reads new spec file from
prompts/ - Creates additional Linear issues for new features
- Updates existing project without re-initializing
- Triggered by
Key Design Patterns
Session Handoff via Linear: Agents don't use local state files for coordination. All session context, implementation notes, and progress tracking happens through Linear issues and comments. This provides:
- Real-time visibility in Linear workspace
- Persistent history across sessions
- Easy debugging via issue comments
Defense-in-Depth Security (see security.py and client.py):
- OS-level sandbox for bash command isolation
- Filesystem restrictions (operations limited to project directory)
- Bash command allowlist with pre-tool-use hooks
- Explicit MCP tool permissions
Project Type Detection (agent.py:is_library_project):
- Detects library/type-safety projects vs full-stack web apps
- Uses different coding prompts (
coding_prompt_library.mdvscoding_prompt.md) - Keywords: "type safety", "docstrings", "mypy", "library rag"
Module Responsibilities
autonomous_agent_demo.py: Entry point, argument parsing, environment validationagent.py: Core agent loop, session orchestration, project type detectionclient.py: Claude SDK client configuration, MCP server setup (Linear + Puppeteer)security.py: Bash command validation with allowlist, pre-tool-use hooksprompts.py: Prompt loading utilities, spec file copyingprogress.py: Progress tracking via.linear_project.jsonmarkerlinear_config.py: Linear API configuration constants
MCP Servers
Linear (HTTP transport at mcp.linear.app/mcp):
- Project/team management
- Issue CRUD operations
- Comments and status updates
- Requires
LINEAR_API_KEYin.env
Puppeteer (stdio transport):
- Browser automation for UI testing
- Navigate, screenshot, click, fill, evaluate
- Used by web app projects, not library projects
Application Specification Format
Specifications use XML format in prompts/app_spec.txt:
<project_specification>
<project_name>Your App Name</project_name>
<overview>Detailed description...</overview>
<technology_stack>
<frontend>...</frontend>
<backend>...</backend>
</technology_stack>
<core_features>
<feature_1>
<title>Feature title</title>
<description>Detailed description</description>
<priority>1-4 (1=urgent, 4=low)</priority>
<category>frontend|backend|auth|etc</category>
<test_steps>
1. Step one
2. Step two
</test_steps>
</feature_1>
<!-- More features... -->
</core_features>
</project_specification>
Important: Each <feature_X> tag becomes a separate Linear issue. The initializer creates exactly one issue per feature tag.
Environment Configuration
All configuration via .env file (copy from .env.example):
CLAUDE_CODE_OAUTH_TOKEN='your-oauth-token' # From: claude setup-token
LINEAR_API_KEY='lin_api_xxxxx' # From: linear.app/settings/api
LINEAR_TEAM_ID='team-id' # Optional, agent prompts if missing
Security Model
Allowed Commands (security.py:ALLOWED_COMMANDS)
File operations: ls, cat, head, tail, wc, grep, cp, mkdir, chmod
Development: npm, node, python, python3, mypy, pytest
Version control: git
Process management: ps, lsof, sleep, pkill
Scripts: init.sh
Additional Validation
pkill: Only allowed for dev processes (node, npm, vite, next)chmod: Only+xmode permitted (making scripts executable)init.sh: Must be./init.shor end with/init.sh
Adding New Commands
Edit security.py:ALLOWED_COMMANDS and optionally add validation logic to bash_security_hook.
Generated Project Structure
After initialization, projects contain:
my_project/
├── .linear_project.json # Linear state marker (project_id, total_issues, meta_issue_id)
├── .claude_settings.json # Security settings (auto-generated)
├── app_spec.txt # Original specification (copied from prompts/)
├── init.sh # Environment setup script (executable)
└── [generated code] # Application files created by agent
Creating New Applications
- Create
prompts/app_spec.txtwith your XML specification - Use existing spec files as templates (see
prompts/app_spec.txtfor Claude Clone example) - Run:
python autonomous_agent_demo.py --project-dir ./new_app - Monitor progress in Linear workspace
See GUIDE_NEW_APP.md for detailed guide (French).
Prompt Templates
Located in prompts/:
initializer_prompt.md: First session prompt (creates Linear project/issues)initializer_bis_prompt.md: Add features prompt (extends existing project)coding_prompt.md: Standard coding session (web apps with Puppeteer testing)coding_prompt_library.md: Library coding session (focuses on types/docs, uses pytest/mypy)
The framework automatically selects the appropriate prompt based on session type and project detection.
Important Implementation Notes
Linear Integration
- All work tracked as Linear issues, not local files
- Session handoff via Linear comments on META issue
- Status workflow: Todo → In Progress → Done
- Early termination: Agent stops when detecting "feature-complete" in responses
Auto-Continue Behavior
Agent auto-continues with 3-second delay between sessions (agent.py:AUTO_CONTINUE_DELAY_SECONDS). Stops when:
--max-iterationslimit reached- Response contains "feature-complete" or "all issues completed"
- Fatal error occurs
Project Directory Handling
Relative paths automatically placed under generations/ directory unless absolute path provided.
Model Selection
Default: claude-opus-4-5-20251101 (Opus 4.5 for best coding performance)
Override with: --model claude-sonnet-4-5-20250929