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.
Files changed (90) hide show
  1. odd_org-0.1.0/.github/dependabot.yml +13 -0
  2. odd_org-0.1.0/.github/workflows/ci.yml +64 -0
  3. odd_org-0.1.0/.gitignore +12 -0
  4. odd_org-0.1.0/CLAUDE.md +38 -0
  5. odd_org-0.1.0/LICENSE +21 -0
  6. odd_org-0.1.0/PKG-INFO +158 -0
  7. odd_org-0.1.0/README.md +130 -0
  8. odd_org-0.1.0/pyproject.toml +66 -0
  9. odd_org-0.1.0/requirements.lock +63 -0
  10. odd_org-0.1.0/src/odd/__init__.py +3 -0
  11. odd_org-0.1.0/src/odd/__main__.py +20 -0
  12. odd_org-0.1.0/src/odd/agent.py +394 -0
  13. odd_org-0.1.0/src/odd/backlog.py +117 -0
  14. odd_org-0.1.0/src/odd/cfo.py +675 -0
  15. odd_org-0.1.0/src/odd/cli/__init__.py +249 -0
  16. odd_org-0.1.0/src/odd/cli/config_cmds.py +398 -0
  17. odd_org-0.1.0/src/odd/cli/misc_cmds.py +134 -0
  18. odd_org-0.1.0/src/odd/cli/sprint_cmds.py +384 -0
  19. odd_org-0.1.0/src/odd/cli/team_cmds.py +261 -0
  20. odd_org-0.1.0/src/odd/cli/vacation_cmds.py +317 -0
  21. odd_org-0.1.0/src/odd/commands/__init__.py +1 -0
  22. odd_org-0.1.0/src/odd/commands/hire_cmd.py +154 -0
  23. odd_org-0.1.0/src/odd/commands/init_cmd.py +493 -0
  24. odd_org-0.1.0/src/odd/config.py +323 -0
  25. odd_org-0.1.0/src/odd/display.py +488 -0
  26. odd_org-0.1.0/src/odd/fallback/__init__.py +5 -0
  27. odd_org-0.1.0/src/odd/fallback/runner.py +427 -0
  28. odd_org-0.1.0/src/odd/git.py +743 -0
  29. odd_org-0.1.0/src/odd/health.py +253 -0
  30. odd_org-0.1.0/src/odd/labels.py +190 -0
  31. odd_org-0.1.0/src/odd/menu.py +258 -0
  32. odd_org-0.1.0/src/odd/middleware.py +267 -0
  33. odd_org-0.1.0/src/odd/models.py +550 -0
  34. odd_org-0.1.0/src/odd/parsers.py +537 -0
  35. odd_org-0.1.0/src/odd/processes.py +573 -0
  36. odd_org-0.1.0/src/odd/provider.py +143 -0
  37. odd_org-0.1.0/src/odd/providers/__init__.py +71 -0
  38. odd_org-0.1.0/src/odd/providers/anthropic.py +312 -0
  39. odd_org-0.1.0/src/odd/providers/openai_compat.py +389 -0
  40. odd_org-0.1.0/src/odd/providers/openwebui.py +48 -0
  41. odd_org-0.1.0/src/odd/review.py +275 -0
  42. odd_org-0.1.0/src/odd/roles.py +206 -0
  43. odd_org-0.1.0/src/odd/spinner.py +49 -0
  44. odd_org-0.1.0/src/odd/sprint/__init__.py +18 -0
  45. odd_org-0.1.0/src/odd/sprint/_console.py +21 -0
  46. odd_org-0.1.0/src/odd/sprint/briefing.py +136 -0
  47. odd_org-0.1.0/src/odd/sprint/engine.py +886 -0
  48. odd_org-0.1.0/src/odd/sprint/phase_runner.py +333 -0
  49. odd_org-0.1.0/src/odd/sprint/planner.py +297 -0
  50. odd_org-0.1.0/src/odd/sprint/tdd_gate.py +570 -0
  51. odd_org-0.1.0/src/odd/sprint/vacation_runner.py +516 -0
  52. odd_org-0.1.0/src/odd/sprint/wrapup.py +988 -0
  53. odd_org-0.1.0/src/odd/state.py +296 -0
  54. odd_org-0.1.0/src/odd/tools/__init__.py +48 -0
  55. odd_org-0.1.0/src/odd/tools/definitions.py +190 -0
  56. odd_org-0.1.0/src/odd/tools/execution.py +706 -0
  57. odd_org-0.1.0/src/odd/tools/isolation.py +242 -0
  58. odd_org-0.1.0/src/odd/tools/schemas.py +406 -0
  59. odd_org-0.1.0/src/odd/tracing.py +299 -0
  60. odd_org-0.1.0/src/odd/values.py +55 -0
  61. odd_org-0.1.0/tests/__init__.py +0 -0
  62. odd_org-0.1.0/tests/integration/__init__.py +0 -0
  63. odd_org-0.1.0/tests/integration/conftest.py +85 -0
  64. odd_org-0.1.0/tests/integration/test_real_agents.py +271 -0
  65. odd_org-0.1.0/tests/test_agent.py +759 -0
  66. odd_org-0.1.0/tests/test_backlog.py +179 -0
  67. odd_org-0.1.0/tests/test_cfo.py +360 -0
  68. odd_org-0.1.0/tests/test_cli.py +939 -0
  69. odd_org-0.1.0/tests/test_config.py +273 -0
  70. odd_org-0.1.0/tests/test_display.py +354 -0
  71. odd_org-0.1.0/tests/test_file_write_integration.py +479 -0
  72. odd_org-0.1.0/tests/test_git.py +417 -0
  73. odd_org-0.1.0/tests/test_health.py +127 -0
  74. odd_org-0.1.0/tests/test_isolation.py +232 -0
  75. odd_org-0.1.0/tests/test_labels.py +101 -0
  76. odd_org-0.1.0/tests/test_middleware.py +265 -0
  77. odd_org-0.1.0/tests/test_models.py +545 -0
  78. odd_org-0.1.0/tests/test_openai_compat.py +443 -0
  79. odd_org-0.1.0/tests/test_phase8_direct_engine.py +241 -0
  80. odd_org-0.1.0/tests/test_processes.py +573 -0
  81. odd_org-0.1.0/tests/test_provider_config.py +132 -0
  82. odd_org-0.1.0/tests/test_roles.py +285 -0
  83. odd_org-0.1.0/tests/test_spinner.py +170 -0
  84. odd_org-0.1.0/tests/test_sprint.py +1579 -0
  85. odd_org-0.1.0/tests/test_state.py +377 -0
  86. odd_org-0.1.0/tests/test_structured_outputs.py +583 -0
  87. odd_org-0.1.0/tests/test_tools.py +959 -0
  88. odd_org-0.1.0/tests/test_tracing.py +248 -0
  89. odd_org-0.1.0/tests/test_values.py +160 -0
  90. 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
@@ -0,0 +1,12 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+ .eggs/
8
+ *.egg
9
+ .venv/
10
+ venv/
11
+ .env
12
+ .odd/
@@ -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
@@ -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,3 @@
1
+ """ODD - Organization Driven Development."""
2
+
3
+ __version__ = "0.1.0"
@@ -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()