A simple agentic framework for constructing software, doing research, and managing data using Claude Code.
This system provides a complete file-based orchestration system for managing Claude Code jobs:
- File-based messaging bus (inbox/outbox) with UUID correlation
- Orchestrator daemon for routing commands and creating jobs
- Queue managers for executing jobs across multiple compute machines
- Worker harness for running Claude Code jobs
- JSON schema validation for all data structures
- Complete job lifecycle management (queued → running → finished/failed)
# Clone the repository
git clone https://github.com/cshenry/AgenticOrchestrationSystem
cd AgenticOrchestrationSystem
# Install dependencies
pip install -r requirements.txt
# Install the package in development mode
pip install -e .The system uses Dropbox for file synchronization. Set up the AgentStore directory:
# The AgentStore directory structure is created automatically
# Default location: ~/Dropbox/AgentStore/
# Copy example config
cp config.example.yaml ~/Dropbox/AgentStore/config.yaml
# Edit config if needed
vim ~/Dropbox/AgentStore/config.yamlCreate a user file in ~/Dropbox/AgentStore/users/<username>.json:
{
"id": "yourusername",
"slack_username": "yourusername",
"name": "Your Name",
"email": "your.email@example.com",
"permissions": "admin"
}orchestrator login yourusernameCreate a project in ~/Dropbox/AgentStore/projects/YourProject/project.json:
{
"id": "YourProject",
"directory": "/path/to/your/project",
"git_repository": "https://github.com/you/yourproject",
"create_time": "2025-10-27T00:00:00Z",
"update_time": "2025-10-27T00:00:00Z",
"description": "Your project description",
"owner": "yourusername",
"collaborators": [],
"code_research_document": "/path/to/your/project/DOCS.md",
"default_queue": "poplar"
}Create a queue in ~/Dropbox/AgentStore/Queues/yourqueue/queue.json:
{
"config": {
"id": "yourqueue",
"worker_count": 5,
"claude_cli_path": "claude",
"rest_interval": 60,
"claude_default_args": ["-p"],
"max_job_runtime_seconds": 3600
},
"runtime": {
"process_id": null,
"active_jobs": 0,
"last_update": null,
"queued_jobs": 0
}
}Also create the job directories:
mkdir -p ~/Dropbox/AgentStore/Queues/yourqueue/Jobs/{queued_jobs,running_jobs,finished_jobs,failed_jobs}# Start orchestrator (in one terminal)
PYTHONPATH=. python3 -m src.orchestrator.orchestrator
# Start queue manager (in another terminal)
PYTHONPATH=. python3 -m src.queue_manager.queue_manager yourqueueOr use the CLI commands:
PYTHONPATH=. python3 -m src.cli.cli orchestrator-daemon start
PYTHONPATH=. python3 -m src.cli.cli queue-manager --queue yourqueue# Set current project
PYTHONPATH=. python3 -m src.cli.cli set-project YourProject
# Submit a code research job
PYTHONPATH=. python3 -m src.cli.cli research-code --project YourProjectlogin <username>- Set username for CLIset-project <project-id>- Set current projectset-prd <prd-id>- Set current PRD
list-users- List all userslist-projects- List all projectslist-prds [--project PROJECT]- List PRDslist-jobs [--status STATUS] [--project PROJECT]- List jobslist-queues- List all queues
view-user <user-id>- View user detailsview-project <project-id>- View project detailsview-prd <prd-id>- View PRD detailsview-job <job-id>- View job detailsview-queue <queue-name>- View queue status
research-code --project PROJECT [--queue QUEUE] [--follow SECONDS]- Research codebasecreate-prd --project PROJECT [--queue QUEUE]- Create PRDcreate-tasks --project PROJECT --prd PRD [--queue QUEUE]- Generate tasks from PRDimplement-tasks --project PROJECT --prd PRD [--queue QUEUE]- Implement taskscreate-environment --project PROJECT- Create venv using venvman
orchestrator-daemon {start|stop|status}- Control orchestrator daemonqueue-manager --queue QUEUE- Start queue manager
--format {json|text}- Output format (default: text)--verbose- Show debug output--follow SECONDS- Wait for response (for agent commands)
~/Dropbox/AgentStore/
├── config.yaml # Global configuration
├── messaging/
│ ├── inbox/ # Incoming messages
│ ├── processed_inbox/ # Processed messages
│ ├── outbox/ # Outgoing responses
│ └── processed_outbox/ # Sent responses
├── users/
│ └── <user-id>.json # User definitions
├── projects/
│ └── <project-name>/
│ ├── project.json # Project configuration
│ ├── queued_prds/ # Queued PRDs
│ ├── running_prds/ # Running PRDs
│ └── finished_prds/ # Completed PRDs
├── Queues/
│ └── <queue-name>/
│ ├── queue.json # Queue configuration
│ ├── log.out # Queue logs
│ └── Jobs/
│ ├── queued_jobs/ # Jobs waiting to run
│ ├── running_jobs/ # Currently running jobs
│ ├── finished_jobs/ # Completed jobs
│ └── failed_jobs/ # Failed jobs
├── JSONValidation/
│ ├── Schemas/ # JSON schemas
│ │ ├── user.schema.json
│ │ ├── message.schema.json
│ │ ├── project.schema.json
│ │ ├── prd.schema.json
│ │ ├── queue.schema.json
│ │ └── job.schema.json
│ └── errors.out # Validation errors
└── logs/
├── orchestrator.log # Orchestrator logs
├── queue-<queue>.log # Queue manager logs
└── events-YYYY-MM.jsonl # Event logs
- Orchestrator: Routes messages, creates jobs, handles job completion
- Queue Manager: Monitors jobs, starts workers, enforces limits
- Worker Harness: Executes Claude Code jobs, captures output
- CLI: User interface for all operations
- JSON Validator: Validates all data structures
- User submits command via CLI → writes message to inbox
- Orchestrator processes message → creates job in queue
- Queue Manager detects job → starts worker harness
- Worker Harness executes Claude → captures output
- Job moves to finished_jobs → Orchestrator handles completion
- Project/PRD updated with results
User → CLI → inbox → Orchestrator → outbox → CLI → User
↓
Job Creation
↓
Queue Manager → Worker Harness → Claude Code
↓
finished_jobs
↓
Orchestrator (completion handler)
# Run all tests
pytest tests/
# Run specific test file
pytest tests/test_validator.py
# Run with verbose output
pytest -v tests/The system includes test data:
- Test user:
chenry - Test project:
TestProject - Test queue:
poplar
src/
├── validator/ # JSON schema validation
│ ├── __init__.py
│ └── json_validator.py
├── common/ # Shared utilities
│ ├── __init__.py
│ ├── utils.py
│ └── config.py
├── cli/ # Command-line interface
│ ├── __init__.py
│ ├── cli.py
│ └── commands.py
├── orchestrator/ # Orchestrator daemon
│ ├── __init__.py
│ ├── orchestrator.py
│ ├── handlers.py
│ └── job_manager.py
├── queue_manager/ # Queue manager daemon
│ ├── __init__.py
│ └── queue_manager.py
└── worker/ # Worker harness
├── __init__.py
└── worker_harness.py
- Check if already running:
orchestrator orchestrator-daemon status - Check lock file:
~/Dropbox/AgentStore/.orchestrator.lock - Check logs:
~/Dropbox/AgentStore/logs/orchestrator.log
- Check queue manager is running
- Check queue.json runtime.active_jobs
- Check worker_count limit
- Check job files in queued_jobs directory
- Check logs:
~/Dropbox/AgentStore/logs/queue-<queue>.log
- Check job error in runtime.error field
- Verify Claude command exists in
~/.claude/commands/ - Check working directory exists
- Check logs for detailed error messages
- Verify user.json has correct permissions field
- Check file ownership in AgentStore directory
- Verify Dropbox sync is working
- Job priority and urgency
- Auto-retry failed jobs
- Schema migration tools
- Job cancellation
- More Claude commands
- Slack integration (v1.0)
- Multi-step workflows (v1.0)
- Web dashboard (v1.0)
PRD_Agentic_Framework_v0.5_FINAL.md- Complete Product Requirements DocumentInitialUserStory.md- Initial user story and requirementstasks/tasks-PRD_Agentic_Framework_v0.5_FINAL.md- Implementation task list
This is currently a personal project. For bugs or feature requests, please create an issue.
MIT