odd-org 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- odd_org-0.1.0/.github/dependabot.yml +13 -0
- odd_org-0.1.0/.github/workflows/ci.yml +64 -0
- odd_org-0.1.0/.gitignore +12 -0
- odd_org-0.1.0/CLAUDE.md +38 -0
- odd_org-0.1.0/LICENSE +21 -0
- odd_org-0.1.0/PKG-INFO +158 -0
- odd_org-0.1.0/README.md +130 -0
- odd_org-0.1.0/pyproject.toml +66 -0
- odd_org-0.1.0/requirements.lock +63 -0
- odd_org-0.1.0/src/odd/__init__.py +3 -0
- odd_org-0.1.0/src/odd/__main__.py +20 -0
- odd_org-0.1.0/src/odd/agent.py +394 -0
- odd_org-0.1.0/src/odd/backlog.py +117 -0
- odd_org-0.1.0/src/odd/cfo.py +675 -0
- odd_org-0.1.0/src/odd/cli/__init__.py +249 -0
- odd_org-0.1.0/src/odd/cli/config_cmds.py +398 -0
- odd_org-0.1.0/src/odd/cli/misc_cmds.py +134 -0
- odd_org-0.1.0/src/odd/cli/sprint_cmds.py +384 -0
- odd_org-0.1.0/src/odd/cli/team_cmds.py +261 -0
- odd_org-0.1.0/src/odd/cli/vacation_cmds.py +317 -0
- odd_org-0.1.0/src/odd/commands/__init__.py +1 -0
- odd_org-0.1.0/src/odd/commands/hire_cmd.py +154 -0
- odd_org-0.1.0/src/odd/commands/init_cmd.py +493 -0
- odd_org-0.1.0/src/odd/config.py +323 -0
- odd_org-0.1.0/src/odd/display.py +488 -0
- odd_org-0.1.0/src/odd/fallback/__init__.py +5 -0
- odd_org-0.1.0/src/odd/fallback/runner.py +427 -0
- odd_org-0.1.0/src/odd/git.py +743 -0
- odd_org-0.1.0/src/odd/health.py +253 -0
- odd_org-0.1.0/src/odd/labels.py +190 -0
- odd_org-0.1.0/src/odd/menu.py +258 -0
- odd_org-0.1.0/src/odd/middleware.py +267 -0
- odd_org-0.1.0/src/odd/models.py +550 -0
- odd_org-0.1.0/src/odd/parsers.py +537 -0
- odd_org-0.1.0/src/odd/processes.py +573 -0
- odd_org-0.1.0/src/odd/provider.py +143 -0
- odd_org-0.1.0/src/odd/providers/__init__.py +71 -0
- odd_org-0.1.0/src/odd/providers/anthropic.py +312 -0
- odd_org-0.1.0/src/odd/providers/openai_compat.py +389 -0
- odd_org-0.1.0/src/odd/providers/openwebui.py +48 -0
- odd_org-0.1.0/src/odd/review.py +275 -0
- odd_org-0.1.0/src/odd/roles.py +206 -0
- odd_org-0.1.0/src/odd/spinner.py +49 -0
- odd_org-0.1.0/src/odd/sprint/__init__.py +18 -0
- odd_org-0.1.0/src/odd/sprint/_console.py +21 -0
- odd_org-0.1.0/src/odd/sprint/briefing.py +136 -0
- odd_org-0.1.0/src/odd/sprint/engine.py +886 -0
- odd_org-0.1.0/src/odd/sprint/phase_runner.py +333 -0
- odd_org-0.1.0/src/odd/sprint/planner.py +297 -0
- odd_org-0.1.0/src/odd/sprint/tdd_gate.py +570 -0
- odd_org-0.1.0/src/odd/sprint/vacation_runner.py +516 -0
- odd_org-0.1.0/src/odd/sprint/wrapup.py +988 -0
- odd_org-0.1.0/src/odd/state.py +296 -0
- odd_org-0.1.0/src/odd/tools/__init__.py +48 -0
- odd_org-0.1.0/src/odd/tools/definitions.py +190 -0
- odd_org-0.1.0/src/odd/tools/execution.py +706 -0
- odd_org-0.1.0/src/odd/tools/isolation.py +242 -0
- odd_org-0.1.0/src/odd/tools/schemas.py +406 -0
- odd_org-0.1.0/src/odd/tracing.py +299 -0
- odd_org-0.1.0/src/odd/values.py +55 -0
- odd_org-0.1.0/tests/__init__.py +0 -0
- odd_org-0.1.0/tests/integration/__init__.py +0 -0
- odd_org-0.1.0/tests/integration/conftest.py +85 -0
- odd_org-0.1.0/tests/integration/test_real_agents.py +271 -0
- odd_org-0.1.0/tests/test_agent.py +759 -0
- odd_org-0.1.0/tests/test_backlog.py +179 -0
- odd_org-0.1.0/tests/test_cfo.py +360 -0
- odd_org-0.1.0/tests/test_cli.py +939 -0
- odd_org-0.1.0/tests/test_config.py +273 -0
- odd_org-0.1.0/tests/test_display.py +354 -0
- odd_org-0.1.0/tests/test_file_write_integration.py +479 -0
- odd_org-0.1.0/tests/test_git.py +417 -0
- odd_org-0.1.0/tests/test_health.py +127 -0
- odd_org-0.1.0/tests/test_isolation.py +232 -0
- odd_org-0.1.0/tests/test_labels.py +101 -0
- odd_org-0.1.0/tests/test_middleware.py +265 -0
- odd_org-0.1.0/tests/test_models.py +545 -0
- odd_org-0.1.0/tests/test_openai_compat.py +443 -0
- odd_org-0.1.0/tests/test_phase8_direct_engine.py +241 -0
- odd_org-0.1.0/tests/test_processes.py +573 -0
- odd_org-0.1.0/tests/test_provider_config.py +132 -0
- odd_org-0.1.0/tests/test_roles.py +285 -0
- odd_org-0.1.0/tests/test_spinner.py +170 -0
- odd_org-0.1.0/tests/test_sprint.py +1579 -0
- odd_org-0.1.0/tests/test_state.py +377 -0
- odd_org-0.1.0/tests/test_structured_outputs.py +583 -0
- odd_org-0.1.0/tests/test_tools.py +959 -0
- odd_org-0.1.0/tests/test_tracing.py +248 -0
- odd_org-0.1.0/tests/test_values.py +160 -0
- odd_org-0.1.0/tests/test_war_room_integration.py +459 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "pip"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
open-pull-requests-limit: 5
|
|
8
|
+
|
|
9
|
+
- package-ecosystem: "github-actions"
|
|
10
|
+
directory: "/"
|
|
11
|
+
schedule:
|
|
12
|
+
interval: "weekly"
|
|
13
|
+
open-pull-requests-limit: 5
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: |
|
|
26
|
+
python -m pip install --upgrade pip
|
|
27
|
+
pip install -r requirements.lock
|
|
28
|
+
pip install -e . --no-deps
|
|
29
|
+
pip install pytest pytest-cov
|
|
30
|
+
|
|
31
|
+
- name: Run tests with coverage
|
|
32
|
+
run: pytest --cov=odd --cov-report=term-missing --cov-report=xml
|
|
33
|
+
|
|
34
|
+
- name: Upload coverage to Codecov
|
|
35
|
+
if: matrix.python-version == '3.13'
|
|
36
|
+
uses: codecov/codecov-action@v4
|
|
37
|
+
with:
|
|
38
|
+
files: coverage.xml
|
|
39
|
+
fail_ci_if_error: false
|
|
40
|
+
env:
|
|
41
|
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
42
|
+
|
|
43
|
+
security:
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v4
|
|
47
|
+
|
|
48
|
+
- name: Set up Python
|
|
49
|
+
uses: actions/setup-python@v5
|
|
50
|
+
with:
|
|
51
|
+
python-version: "3.13"
|
|
52
|
+
|
|
53
|
+
- name: Install dependencies
|
|
54
|
+
run: |
|
|
55
|
+
python -m pip install --upgrade pip
|
|
56
|
+
pip install -r requirements.lock
|
|
57
|
+
pip install -e . --no-deps
|
|
58
|
+
pip install pip-audit bandit
|
|
59
|
+
|
|
60
|
+
- name: pip audit - CVE scanning
|
|
61
|
+
run: pip-audit
|
|
62
|
+
|
|
63
|
+
- name: Bandit - Python SAST
|
|
64
|
+
run: bandit -r src/odd/ -c pyproject.toml
|
odd_org-0.1.0/.gitignore
ADDED
odd_org-0.1.0/CLAUDE.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# ODD - Organization Driven Development
|
|
2
|
+
|
|
3
|
+
## What is this?
|
|
4
|
+
A Python CLI tool that lets you be the CEO of an AI software company. Agents organized like a real company (Lead Dev, QA, Recruiter, Secretary, Consultants) collaborate through agile processes to build software.
|
|
5
|
+
|
|
6
|
+
## Architecture
|
|
7
|
+
- `src/odd/` - Main package
|
|
8
|
+
- `cli.py` - Click CLI entry point (`odd init`, `odd sprint`, `odd standup`, `odd team`, `odd hire`, `odd status`)
|
|
9
|
+
- `agent.py` - Agent invocation engine. Each agent is a strictly isolated API call via a Provider.
|
|
10
|
+
- `provider.py` - Provider protocol (the abstraction boundary between ODD and LLM APIs)
|
|
11
|
+
- `providers/` - Provider implementations (anthropic.py is the default)
|
|
12
|
+
- `models.py` - Pydantic data models (Persona, Sprint, ProjectConfig, etc.)
|
|
13
|
+
- `roles.py` - Core team definitions + recruiter pipeline (JD → resume)
|
|
14
|
+
- `sprint.py` - Sprint lifecycle engine (plan → QA writes tests → implement → demo)
|
|
15
|
+
- `state.py` - `.odd/` directory state management
|
|
16
|
+
- `tools.py` - File/shell tools in neutral format; providers wrap for their wire format
|
|
17
|
+
|
|
18
|
+
## Key Design Principles
|
|
19
|
+
- **Strict agent isolation**: Each agent is a separate API call with its own system prompt built from persona files. NEVER share conversation history across personas.
|
|
20
|
+
- **Claude-default**: Anthropic is the default, best-tested provider. Other providers can plug in via the Provider protocol.
|
|
21
|
+
- **TDD as quality gate**: QA writes tests first, agents implement to pass them.
|
|
22
|
+
- **Scope-boxed sprints**: Sprint boundaries are CEO decision points, not time-based.
|
|
23
|
+
|
|
24
|
+
## Commands
|
|
25
|
+
```
|
|
26
|
+
pip install -e .
|
|
27
|
+
odd init # Boot the org, talk to lead dev
|
|
28
|
+
odd sprint # Start a sprint
|
|
29
|
+
odd standup # Run a team standup
|
|
30
|
+
odd team # Show team roster
|
|
31
|
+
odd hire "desc" # Hire a consultant
|
|
32
|
+
odd status # Project status
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Testing
|
|
36
|
+
```
|
|
37
|
+
pytest
|
|
38
|
+
```
|
odd_org-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Eric Smith
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
odd_org-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: odd-org
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Organization Driven Development - AI agents organized like a real software company
|
|
5
|
+
Project-URL: Repository, https://github.com/ThePoetCoder/odd
|
|
6
|
+
Project-URL: Issues, https://github.com/ThePoetCoder/odd/issues
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Keywords: agents,ai,anthropic,claude,cli,development,organization
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development
|
|
19
|
+
Classifier: Topic :: Software Development :: Testing
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: anthropic>=0.40.0
|
|
22
|
+
Requires-Dist: click>=8.1.0
|
|
23
|
+
Requires-Dist: pydantic>=2.0.0
|
|
24
|
+
Requires-Dist: rich>=13.0.0
|
|
25
|
+
Provides-Extra: openai-compat
|
|
26
|
+
Requires-Dist: requests>=2.28.0; extra == 'openai-compat'
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# ODD - Organization Driven Development; an Executable Metaphor
|
|
30
|
+
|
|
31
|
+
**We live in odd times**
|
|
32
|
+
|
|
33
|
+
## The Idea
|
|
34
|
+
|
|
35
|
+
You don't write code. You don't write specs. You run a company.
|
|
36
|
+
|
|
37
|
+
ODD organizes AI agents like a real software team:
|
|
38
|
+
* Lead Dev
|
|
39
|
+
* QA
|
|
40
|
+
* Recruiter
|
|
41
|
+
* Secretary
|
|
42
|
+
* CFO
|
|
43
|
+
* Specialist Consultants
|
|
44
|
+
|
|
45
|
+
They all collaborate through TDD and agile processes to build software. You provide vision and make decisions at sprint boundaries. They do everything else.
|
|
46
|
+
|
|
47
|
+
This is the next step up the abstraction ladder:
|
|
48
|
+
|
|
49
|
+
1. **You write code** to solve your problem
|
|
50
|
+
2. **You write specs** for an agent to code
|
|
51
|
+
3. **You direct a company of agents** and they spec, build, test, and ship.
|
|
52
|
+
|
|
53
|
+
## Why Organizational Patterns?
|
|
54
|
+
|
|
55
|
+
Sprints, standups, TDD, code review, retrospectives - these aren't just corporate rituals. They're coordination algorithms refined over decades of real software teams solving real problems. They evolved to handle communication overhead, context switching, uncertainty, and quality control.
|
|
56
|
+
|
|
57
|
+
AI agents have the same coordination problems. ODD applies the patterns that already work:
|
|
58
|
+
|
|
59
|
+
- **Strict agent isolation** - each team member is a separate API call with their own persona. No shared memory, no context bleed between roles. The same reason you don't want your QA engineer thinking like your developer.
|
|
60
|
+
- **TDD as quality gate** - QA writes tests *before* implementation. Tests passing is a more objective quality signal than code review alone, but you can add code review too.
|
|
61
|
+
- **Scope-boxed sprints** - agents work at inhuman speed, so sprints aren't time-boxed. They're batches of work between CEO decision points. You decide when the work is good enough to ship.
|
|
62
|
+
- **Consultants as perspectives** - hiring a consultant doesn't fill a capability gap (they're all Claude underneath). It adds a focused lens on a different slice of the problem. Diverse perspectives produce better work.
|
|
63
|
+
|
|
64
|
+
### Mechanical, Not Magical
|
|
65
|
+
|
|
66
|
+
Agents in ODD don't chat with each other. There are no multi-turn conversations between LLMs, no "Agent A said X so Agent B responds Y." That's theater.
|
|
67
|
+
|
|
68
|
+
Instead, coordination is almost entirely mechanical. Agents communicate through artifacts:
|
|
69
|
+
|
|
70
|
+
- **Git diffs** tell the next agent what changed
|
|
71
|
+
- **Test results** (pass/fail, stdout, tracebacks) are the feedback loop
|
|
72
|
+
- **Files on disk** are the shared state
|
|
73
|
+
|
|
74
|
+
Each agent gets a system prompt, the relevant files, and a task. It produces output. That output is evaluated mechanically (tests pass or they don't, diffs apply or they don't). The next agent gets the *result*, not a narrative. This is why organizational patterns work here, they were already designed to coordinate people who can't read each other's minds.
|
|
75
|
+
|
|
76
|
+
The one exception is adversarial code review. An anonymous reviewer scores the code at the end of a sprint, writes a review file, and your lead dev reads it and fixes issues, looping until the score clears the bar or you move on. Even here, agents don't converse; they pass artifacts through files.
|
|
77
|
+
|
|
78
|
+
## What It Looks Like
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
ODD - What would you like to do?
|
|
82
|
+
|
|
83
|
+
Work
|
|
84
|
+
1. Start a sprint
|
|
85
|
+
2. Go on vacation
|
|
86
|
+
3. Check project status
|
|
87
|
+
4. Run a standup
|
|
88
|
+
People
|
|
89
|
+
5. Talk to a team member
|
|
90
|
+
6. Run a retrospective
|
|
91
|
+
Research
|
|
92
|
+
7. Review the backlog
|
|
93
|
+
8. Research a topic (spike)
|
|
94
|
+
9. Get user feedback (beta test)
|
|
95
|
+
Organization
|
|
96
|
+
10. Set company values
|
|
97
|
+
11. Set budget
|
|
98
|
+
12. Manage the team (hire, fire, review)
|
|
99
|
+
|
|
100
|
+
13. Call it a day
|
|
101
|
+
|
|
102
|
+
CEO> _
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
You pick a number. You talk to your team in plain English. They write real code to real files. You watch it happen in the war room, a live grid showing every agent's status, output, and tool calls. Jump in with a CEO interrupt when you need to course-correct. Or just go on vacation and let them run.
|
|
106
|
+
|
|
107
|
+
## The Team
|
|
108
|
+
|
|
109
|
+
| Role | Name | What They Do |
|
|
110
|
+
|------|------|-------------|
|
|
111
|
+
| Lead Dev | Cody | Architecture, implementation, technical decisions |
|
|
112
|
+
| QA | Vera | Writes tests first, validates everything |
|
|
113
|
+
| Recruiter | Scout | Finds and hires specialist consultants |
|
|
114
|
+
| Secretary | Paige | Standup notes, onboarding docs, retro synthesis |
|
|
115
|
+
| CFO | Bill | Tracks token costs, enforces budgets (deterministic, not an LLM) |
|
|
116
|
+
|
|
117
|
+
Senior roles (Lead Dev, QA) default to Claude Opus. Other agents default to Sonnet. Bill isn't an agent, he's pure accounting logic. You configure model tiers per-role to control quality vs. cost; it's a management decision.
|
|
118
|
+
|
|
119
|
+
## Install
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
pip install odd-org
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
ODD calls the Anthropic API directly. Get an API key from the [Anthropic Console](https://console.anthropic.com/) and set it:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Then just:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
odd
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
That's it. The menu walks you through everything, including first-time setup.
|
|
138
|
+
|
|
139
|
+
## Related Research
|
|
140
|
+
|
|
141
|
+
This is currently far from where I envision it and there is still a lot of testing to do, but I believe I'm on the right track. I've been building this with Opus for a little more than a week and stumbled across a paper yesterday where now I might as well build it in public. CMU researchers published [Effective Strategies for Asynchronous Software Engineering Agents](https://arxiv.org/abs/2603.21489) ([code](https://github.com/JiayiGeng/CAID)), demonstrating that multi-agent coordination with centralized delegation, strict workspace isolation, and test-gated integration outperforms single-agent scaling by 14-27% on software engineering benchmarks.
|
|
142
|
+
|
|
143
|
+
ODD shares the same core architecture - a central coordinator delegating to isolated agents with TDD as the quality gate. The CAID findings reinforce the approach: agent isolation matters, delegation quality is the bottleneck, and throwing more iterations at a single agent hits a ceiling that structured teamwork breaks through. ODD extends this with specialized roles instead of identical workers, human-in-the-loop decision points at sprint boundaries, and persistent team identity across sessions.
|
|
144
|
+
|
|
145
|
+
## Development
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
git clone https://github.com/ThePoetCoder/ODD.git
|
|
149
|
+
cd odd
|
|
150
|
+
pip install -e .
|
|
151
|
+
pytest
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
For a full list of CLI subcommands, run `odd --help`.
|
|
155
|
+
|
|
156
|
+
## License
|
|
157
|
+
|
|
158
|
+
MIT
|
odd_org-0.1.0/README.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# ODD - Organization Driven Development; an Executable Metaphor
|
|
2
|
+
|
|
3
|
+
**We live in odd times**
|
|
4
|
+
|
|
5
|
+
## The Idea
|
|
6
|
+
|
|
7
|
+
You don't write code. You don't write specs. You run a company.
|
|
8
|
+
|
|
9
|
+
ODD organizes AI agents like a real software team:
|
|
10
|
+
* Lead Dev
|
|
11
|
+
* QA
|
|
12
|
+
* Recruiter
|
|
13
|
+
* Secretary
|
|
14
|
+
* CFO
|
|
15
|
+
* Specialist Consultants
|
|
16
|
+
|
|
17
|
+
They all collaborate through TDD and agile processes to build software. You provide vision and make decisions at sprint boundaries. They do everything else.
|
|
18
|
+
|
|
19
|
+
This is the next step up the abstraction ladder:
|
|
20
|
+
|
|
21
|
+
1. **You write code** to solve your problem
|
|
22
|
+
2. **You write specs** for an agent to code
|
|
23
|
+
3. **You direct a company of agents** and they spec, build, test, and ship.
|
|
24
|
+
|
|
25
|
+
## Why Organizational Patterns?
|
|
26
|
+
|
|
27
|
+
Sprints, standups, TDD, code review, retrospectives - these aren't just corporate rituals. They're coordination algorithms refined over decades of real software teams solving real problems. They evolved to handle communication overhead, context switching, uncertainty, and quality control.
|
|
28
|
+
|
|
29
|
+
AI agents have the same coordination problems. ODD applies the patterns that already work:
|
|
30
|
+
|
|
31
|
+
- **Strict agent isolation** - each team member is a separate API call with their own persona. No shared memory, no context bleed between roles. The same reason you don't want your QA engineer thinking like your developer.
|
|
32
|
+
- **TDD as quality gate** - QA writes tests *before* implementation. Tests passing is a more objective quality signal than code review alone, but you can add code review too.
|
|
33
|
+
- **Scope-boxed sprints** - agents work at inhuman speed, so sprints aren't time-boxed. They're batches of work between CEO decision points. You decide when the work is good enough to ship.
|
|
34
|
+
- **Consultants as perspectives** - hiring a consultant doesn't fill a capability gap (they're all Claude underneath). It adds a focused lens on a different slice of the problem. Diverse perspectives produce better work.
|
|
35
|
+
|
|
36
|
+
### Mechanical, Not Magical
|
|
37
|
+
|
|
38
|
+
Agents in ODD don't chat with each other. There are no multi-turn conversations between LLMs, no "Agent A said X so Agent B responds Y." That's theater.
|
|
39
|
+
|
|
40
|
+
Instead, coordination is almost entirely mechanical. Agents communicate through artifacts:
|
|
41
|
+
|
|
42
|
+
- **Git diffs** tell the next agent what changed
|
|
43
|
+
- **Test results** (pass/fail, stdout, tracebacks) are the feedback loop
|
|
44
|
+
- **Files on disk** are the shared state
|
|
45
|
+
|
|
46
|
+
Each agent gets a system prompt, the relevant files, and a task. It produces output. That output is evaluated mechanically (tests pass or they don't, diffs apply or they don't). The next agent gets the *result*, not a narrative. This is why organizational patterns work here, they were already designed to coordinate people who can't read each other's minds.
|
|
47
|
+
|
|
48
|
+
The one exception is adversarial code review. An anonymous reviewer scores the code at the end of a sprint, writes a review file, and your lead dev reads it and fixes issues, looping until the score clears the bar or you move on. Even here, agents don't converse; they pass artifacts through files.
|
|
49
|
+
|
|
50
|
+
## What It Looks Like
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
ODD - What would you like to do?
|
|
54
|
+
|
|
55
|
+
Work
|
|
56
|
+
1. Start a sprint
|
|
57
|
+
2. Go on vacation
|
|
58
|
+
3. Check project status
|
|
59
|
+
4. Run a standup
|
|
60
|
+
People
|
|
61
|
+
5. Talk to a team member
|
|
62
|
+
6. Run a retrospective
|
|
63
|
+
Research
|
|
64
|
+
7. Review the backlog
|
|
65
|
+
8. Research a topic (spike)
|
|
66
|
+
9. Get user feedback (beta test)
|
|
67
|
+
Organization
|
|
68
|
+
10. Set company values
|
|
69
|
+
11. Set budget
|
|
70
|
+
12. Manage the team (hire, fire, review)
|
|
71
|
+
|
|
72
|
+
13. Call it a day
|
|
73
|
+
|
|
74
|
+
CEO> _
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
You pick a number. You talk to your team in plain English. They write real code to real files. You watch it happen in the war room, a live grid showing every agent's status, output, and tool calls. Jump in with a CEO interrupt when you need to course-correct. Or just go on vacation and let them run.
|
|
78
|
+
|
|
79
|
+
## The Team
|
|
80
|
+
|
|
81
|
+
| Role | Name | What They Do |
|
|
82
|
+
|------|------|-------------|
|
|
83
|
+
| Lead Dev | Cody | Architecture, implementation, technical decisions |
|
|
84
|
+
| QA | Vera | Writes tests first, validates everything |
|
|
85
|
+
| Recruiter | Scout | Finds and hires specialist consultants |
|
|
86
|
+
| Secretary | Paige | Standup notes, onboarding docs, retro synthesis |
|
|
87
|
+
| CFO | Bill | Tracks token costs, enforces budgets (deterministic, not an LLM) |
|
|
88
|
+
|
|
89
|
+
Senior roles (Lead Dev, QA) default to Claude Opus. Other agents default to Sonnet. Bill isn't an agent, he's pure accounting logic. You configure model tiers per-role to control quality vs. cost; it's a management decision.
|
|
90
|
+
|
|
91
|
+
## Install
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pip install odd-org
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
ODD calls the Anthropic API directly. Get an API key from the [Anthropic Console](https://console.anthropic.com/) and set it:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Then just:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
odd
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
That's it. The menu walks you through everything, including first-time setup.
|
|
110
|
+
|
|
111
|
+
## Related Research
|
|
112
|
+
|
|
113
|
+
This is currently far from where I envision it and there is still a lot of testing to do, but I believe I'm on the right track. I've been building this with Opus for a little more than a week and stumbled across a paper yesterday where now I might as well build it in public. CMU researchers published [Effective Strategies for Asynchronous Software Engineering Agents](https://arxiv.org/abs/2603.21489) ([code](https://github.com/JiayiGeng/CAID)), demonstrating that multi-agent coordination with centralized delegation, strict workspace isolation, and test-gated integration outperforms single-agent scaling by 14-27% on software engineering benchmarks.
|
|
114
|
+
|
|
115
|
+
ODD shares the same core architecture - a central coordinator delegating to isolated agents with TDD as the quality gate. The CAID findings reinforce the approach: agent isolation matters, delegation quality is the bottleneck, and throwing more iterations at a single agent hits a ceiling that structured teamwork breaks through. ODD extends this with specialized roles instead of identical workers, human-in-the-loop decision points at sprint boundaries, and persistent team identity across sessions.
|
|
116
|
+
|
|
117
|
+
## Development
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
git clone https://github.com/ThePoetCoder/ODD.git
|
|
121
|
+
cd odd
|
|
122
|
+
pip install -e .
|
|
123
|
+
pytest
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
For a full list of CLI subcommands, run `odd --help`.
|
|
127
|
+
|
|
128
|
+
## License
|
|
129
|
+
|
|
130
|
+
MIT
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "odd-org"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Organization Driven Development - AI agents organized like a real software company"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
keywords = ["ai", "agents", "cli", "development", "organization", "claude", "anthropic"]
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 3 - Alpha",
|
|
15
|
+
"Environment :: Console",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"License :: OSI Approved :: MIT License",
|
|
18
|
+
"Programming Language :: Python :: 3",
|
|
19
|
+
"Programming Language :: Python :: 3.11",
|
|
20
|
+
"Programming Language :: Python :: 3.12",
|
|
21
|
+
"Programming Language :: Python :: 3.13",
|
|
22
|
+
"Topic :: Software Development",
|
|
23
|
+
"Topic :: Software Development :: Testing",
|
|
24
|
+
]
|
|
25
|
+
dependencies = [
|
|
26
|
+
"anthropic>=0.40.0",
|
|
27
|
+
"click>=8.1.0",
|
|
28
|
+
"rich>=13.0.0",
|
|
29
|
+
"pydantic>=2.0.0",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.optional-dependencies]
|
|
33
|
+
openai-compat = ["requests>=2.28.0"]
|
|
34
|
+
|
|
35
|
+
[project.urls]
|
|
36
|
+
Repository = "https://github.com/ThePoetCoder/odd"
|
|
37
|
+
Issues = "https://github.com/ThePoetCoder/odd/issues"
|
|
38
|
+
|
|
39
|
+
[project.scripts]
|
|
40
|
+
odd = "odd.cli:main"
|
|
41
|
+
|
|
42
|
+
[tool.hatch.build.targets.wheel]
|
|
43
|
+
packages = ["src/odd"]
|
|
44
|
+
|
|
45
|
+
[tool.bandit]
|
|
46
|
+
exclude_dirs = ["tests"]
|
|
47
|
+
skips = ["B404"] # import_subprocess is expected - we use subprocess intentionally
|
|
48
|
+
|
|
49
|
+
[tool.pytest.ini_options]
|
|
50
|
+
testpaths = ["tests"]
|
|
51
|
+
pythonpath = ["src"]
|
|
52
|
+
markers = [
|
|
53
|
+
"integration: tests that hit the real Anthropic API (use -m integration to run)",
|
|
54
|
+
]
|
|
55
|
+
addopts = "-m 'not integration'"
|
|
56
|
+
|
|
57
|
+
[tool.coverage.run]
|
|
58
|
+
source = ["src/odd"]
|
|
59
|
+
|
|
60
|
+
[tool.coverage.report]
|
|
61
|
+
exclude_lines = [
|
|
62
|
+
"pragma: no cover",
|
|
63
|
+
"if __name__ == .__main__.",
|
|
64
|
+
"if TYPE_CHECKING:",
|
|
65
|
+
]
|
|
66
|
+
show_missing = true
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file is autogenerated by pip-compile with Python 3.11
|
|
3
|
+
# by the following command:
|
|
4
|
+
#
|
|
5
|
+
# pip-compile --output-file=requirements.lock --strip-extras pyproject.toml
|
|
6
|
+
#
|
|
7
|
+
annotated-types==0.7.0
|
|
8
|
+
# via pydantic
|
|
9
|
+
anthropic==0.86.0
|
|
10
|
+
# via odd (pyproject.toml)
|
|
11
|
+
anyio==4.13.0
|
|
12
|
+
# via
|
|
13
|
+
# anthropic
|
|
14
|
+
# httpx
|
|
15
|
+
certifi==2026.2.25
|
|
16
|
+
# via
|
|
17
|
+
# httpcore
|
|
18
|
+
# httpx
|
|
19
|
+
click==8.3.1
|
|
20
|
+
# via odd (pyproject.toml)
|
|
21
|
+
colorama==0.4.6
|
|
22
|
+
# via click
|
|
23
|
+
distro==1.9.0
|
|
24
|
+
# via anthropic
|
|
25
|
+
docstring-parser==0.17.0
|
|
26
|
+
# via anthropic
|
|
27
|
+
h11==0.16.0
|
|
28
|
+
# via httpcore
|
|
29
|
+
httpcore==1.0.9
|
|
30
|
+
# via httpx
|
|
31
|
+
httpx==0.28.1
|
|
32
|
+
# via anthropic
|
|
33
|
+
idna==3.11
|
|
34
|
+
# via
|
|
35
|
+
# anyio
|
|
36
|
+
# httpx
|
|
37
|
+
jiter==0.13.0
|
|
38
|
+
# via anthropic
|
|
39
|
+
markdown-it-py==4.0.0
|
|
40
|
+
# via rich
|
|
41
|
+
mdurl==0.1.2
|
|
42
|
+
# via markdown-it-py
|
|
43
|
+
pydantic==2.12.5
|
|
44
|
+
# via
|
|
45
|
+
# anthropic
|
|
46
|
+
# odd (pyproject.toml)
|
|
47
|
+
pydantic-core==2.41.5
|
|
48
|
+
# via pydantic
|
|
49
|
+
pygments==2.19.2
|
|
50
|
+
# via rich
|
|
51
|
+
rich==14.3.3
|
|
52
|
+
# via odd (pyproject.toml)
|
|
53
|
+
sniffio==1.3.1
|
|
54
|
+
# via anthropic
|
|
55
|
+
typing-extensions==4.15.0
|
|
56
|
+
# via
|
|
57
|
+
# anthropic
|
|
58
|
+
# anyio
|
|
59
|
+
# pydantic
|
|
60
|
+
# pydantic-core
|
|
61
|
+
# typing-inspection
|
|
62
|
+
typing-inspection==0.4.2
|
|
63
|
+
# via pydantic
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Allow running as python -m odd."""
|
|
2
|
+
|
|
3
|
+
import random
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
from rich.console import Console
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _run() -> None:
|
|
10
|
+
from odd.cli import CLOSING_REMARKS, main
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
main()
|
|
14
|
+
except KeyboardInterrupt:
|
|
15
|
+
console = Console()
|
|
16
|
+
console.print(f"\n[bold yellow]{random.choice(CLOSING_REMARKS)}[/bold yellow]")
|
|
17
|
+
sys.exit(0)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
_run()
|