dongduni-agent-hub 0.2.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 (39) hide show
  1. dongduni_agent_hub-0.2.0/LICENSE +21 -0
  2. dongduni_agent_hub-0.2.0/PKG-INFO +155 -0
  3. dongduni_agent_hub-0.2.0/README.md +131 -0
  4. dongduni_agent_hub-0.2.0/agent_hub/__init__.py +3 -0
  5. dongduni_agent_hub-0.2.0/agent_hub/__main__.py +3 -0
  6. dongduni_agent_hub-0.2.0/agent_hub/board/index.html +1461 -0
  7. dongduni_agent_hub-0.2.0/agent_hub/cli.py +922 -0
  8. dongduni_agent_hub-0.2.0/agent_hub/config.py +280 -0
  9. dongduni_agent_hub-0.2.0/agent_hub/discover.py +257 -0
  10. dongduni_agent_hub-0.2.0/agent_hub/engine.py +506 -0
  11. dongduni_agent_hub-0.2.0/agent_hub/guide/SETUP.md +101 -0
  12. dongduni_agent_hub-0.2.0/agent_hub/guide/deploy/aws.md +50 -0
  13. dongduni_agent_hub-0.2.0/agent_hub/guide/deploy/cloudflare.md +53 -0
  14. dongduni_agent_hub-0.2.0/agent_hub/guide/deploy/lan.md +26 -0
  15. dongduni_agent_hub-0.2.0/agent_hub/guide/deploy/tailscale.md +21 -0
  16. dongduni_agent_hub-0.2.0/agent_hub/install.py +162 -0
  17. dongduni_agent_hub-0.2.0/agent_hub/notify.py +65 -0
  18. dongduni_agent_hub-0.2.0/agent_hub/procs.py +103 -0
  19. dongduni_agent_hub-0.2.0/agent_hub/runtimes.py +392 -0
  20. dongduni_agent_hub-0.2.0/agent_hub/store.py +669 -0
  21. dongduni_agent_hub-0.2.0/agent_hub/templates/PROTOCOL.md +63 -0
  22. dongduni_agent_hub-0.2.0/agent_hub/templates/lanes/hub.md +38 -0
  23. dongduni_agent_hub-0.2.0/agent_hub/templates/lanes/infra.md +26 -0
  24. dongduni_agent_hub-0.2.0/agent_hub/templates/lanes/team.md +14 -0
  25. dongduni_agent_hub-0.2.0/agent_hub/web.py +404 -0
  26. dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/PKG-INFO +155 -0
  27. dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/SOURCES.txt +37 -0
  28. dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/dependency_links.txt +1 -0
  29. dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/entry_points.txt +2 -0
  30. dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/top_level.txt +1 -0
  31. dongduni_agent_hub-0.2.0/pyproject.toml +42 -0
  32. dongduni_agent_hub-0.2.0/setup.cfg +4 -0
  33. dongduni_agent_hub-0.2.0/tests/test_cli.py +137 -0
  34. dongduni_agent_hub-0.2.0/tests/test_discover.py +89 -0
  35. dongduni_agent_hub-0.2.0/tests/test_engine.py +266 -0
  36. dongduni_agent_hub-0.2.0/tests/test_procs.py +77 -0
  37. dongduni_agent_hub-0.2.0/tests/test_runtimes.py +219 -0
  38. dongduni_agent_hub-0.2.0/tests/test_store.py +125 -0
  39. dongduni_agent_hub-0.2.0/tests/test_web.py +218 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 John Shin
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.
@@ -0,0 +1,155 @@
1
+ Metadata-Version: 2.4
2
+ Name: dongduni-agent-hub
3
+ Version: 0.2.0
4
+ Summary: A control tower and phone-friendly review board for teams of AI coding agents (OpenCode, Claude Code, Codex).
5
+ Author: John Shin
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/twglhk/dongduni-agent-hub
8
+ Project-URL: Issues, https://github.com/twglhk/dongduni-agent-hub/issues
9
+ Keywords: ai,agents,claude-code,opencode,codex,orchestration,review-board
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: MacOS
15
+ Classifier: Operating System :: Microsoft :: Windows
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Topic :: Software Development
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Dynamic: license-file
24
+
25
+ # dongduni-agent-hub
26
+
27
+ **Stop typing to every agent. Set the goal; the hub runs the lanes.**
28
+
29
+ How long will you keep five terminals open, re-explaining context to each agent session, spawning subagents by hand, and digging through scrollback to find out who finished what? agent-hub turns that around. You write down what you want done and in which order. One always-on **hub** agent plans it with you, hands the work to agent sessions it controls (**lanes**: OpenCode, Claude Code or Codex, mixed freely), checks what comes back, and reports to a review board on your phone. You only step in for the calls that need a human.
30
+
31
+ ![Without agent-hub: you type to every terminal and keep the state in your head. With agent-hub: you set and rank goals on a board; the hub assigns work to lanes and reports back.](docs/images/why.svg)
32
+
33
+ ## What you get
34
+
35
+ - **Goals, not prompts.** Add as many goals as you like, rank them, pause or drop them. The board shows which goal the team is on now and how far each one is (its achievement rate is the share of its agreed steps that are done).
36
+ - **A hub that runs the team.** It agrees a plan with you, splits it into tasks, starts a fresh agent session per task (up to `max_lanes` at once), nudges stalled lanes, reviews results against the real output, and decides what is inside the approved scope.
37
+ - **Lanes that work on their own.** Each lane is your agent as you configured it, with your instruction files, skills, MCP servers, hooks and subagents. It reports `done`, `blocked` or posts a decision; it never waits in chat.
38
+ - **A board instead of chat.** Decisions with options, reviews of artifacts (images, video, text inline), memos to the hub or to infra, history. Built for a phone; translated into English, 한국어, 日本語, 中文 and Español.
39
+ - **Your setup, your rules.** Lane instructions, runtimes, models, agents, permissions, notifications, auth and hosting are plain files you (or the infra lane) edit. The tower in the middle is a small Python loop with no LLM in it.
40
+
41
+ ![The loop: you set goals, the hub plans them with you, tasks go to lanes, lanes work and report, the hub reviews and asks you only what needs a human.](docs/images/how.svg)
42
+
43
+ <p align="center">
44
+ <img src="docs/images/board-goals.png" width="300" alt="The board's Hub tab: ranked goals with progress, the goal in progress marked Now">
45
+ &nbsp;&nbsp;
46
+ <img src="docs/images/board-decide.png" width="300" alt="A decision on the board: options, recommendation, Decide button">
47
+ </p>
48
+
49
+ ## Install
50
+
51
+ One package for Windows, macOS and Linux: [`dongduni-agent-hub`](https://pypi.org/project/dongduni-agent-hub/) on PyPI. It needs Python 3.10+ and nothing else, and installs one command, **`dah`**.
52
+
53
+ ```sh
54
+ uv tool install dongduni-agent-hub # recommended: uv brings its own Python if you have none
55
+ pipx install dongduni-agent-hub # or, if you use pipx
56
+ ```
57
+
58
+ No uv yet? It is one line: `curl -LsSf https://astral.sh/uv/install.sh | sh` (macOS, Linux) or `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"` (Windows). Check with `dah -h`; upgrade with `uv tool upgrade dongduni-agent-hub`.
59
+
60
+ Only for one project, without touching your user: `uv venv .tower/venv && uv pip install --python .tower/venv dongduni-agent-hub`, then run `.tower/venv/bin/dah` (`.tower\venv\Scripts\dah` on Windows).
61
+
62
+ ## Set it up: ask your agent
63
+
64
+ Setup is agent-driven, because every team keeps its agents, docs and servers somewhere different. Open your coding agent in your workspace and say one of:
65
+
66
+ > Install dongduni-agent-hub in this project.
67
+
68
+ > Install dongduni-agent-hub globally.
69
+
70
+ **In this project**: the agent follows the setup playbook (`dah guide`): it surveys how you work (`dah discover`: agent CLIs, their configs, MCP servers, skills, where your knowledge lives, hosting tools), asks you a handful of questions (which agents run the hub and infra, board language, where your team's memory lives, how your phone should reach the board), writes `.tower/` with lane instructions tailored to your workspace, starts the tower, adds your first goals, and checks the whole loop end to end.
71
+
72
+ **Globally**: the agent installs the `dah` command for your user and runs `dah skill install`, which adds an `agent-hub-setup` skill (Claude Code) and command (OpenCode, Codex) to your agents after showing you the diff. From then on, "set up agent-hub here" works in any workspace.
73
+
74
+ If your agent cannot find the playbook, point it at [agent_hub/guide/SETUP.md](agent_hub/guide/SETUP.md).
75
+
76
+ ### By hand
77
+
78
+ ```sh
79
+ cd ~/my-workspace
80
+ dah init --name "My Team" --lang en --hub claude --infra claude # writes .tower/, picks free ports
81
+ dah start # tower + board, URL printed
82
+ dah goal add "Launch the public beta" --detail "sign-up open, onboarding under 2 minutes"
83
+ dah status
84
+ ```
85
+
86
+ ## One board, every project
87
+
88
+ Each workspace has its own tower, state and board port. `dah init` registers it on this machine (`dah workspaces` lists them), and every board can switch to the others from its title: other workspaces are served under `/w/<name>/`. Expose one board and you reach all your projects from the phone; a workspace that only trusts local visitors stays hidden behind a board that signs people in.
89
+
90
+ ## Reach the board from your phone
91
+
92
+ The board listens on `127.0.0.1` by default. `dah guide <name>` prints each path:
93
+
94
+ | situation | path |
95
+ | --- | --- |
96
+ | phone on the same Wi-Fi, trying it out | `dah guide lan`: listen on the network, token sign-in |
97
+ | Tailscale on the machine and the phone | `dah guide tailscale`: `tailscale serve`, identity from Tailscale |
98
+ | a domain on Cloudflare | `dah guide cloudflare`: Tunnel + Access (email code, Google, GitHub, Okta …) |
99
+ | agents on a server | `dah guide aws`: EC2 with one of the above, or an ALB with OIDC |
100
+
101
+ Push notifications (ntfy, Slack, desktop) tell you when something needs you.
102
+
103
+ ## Concepts
104
+
105
+ | | |
106
+ | --- | --- |
107
+ | **goal** | an outcome you want, ranked against the others. The first active goal is what the team works on now. The hub agrees its steps with you; progress is the share of steps done. Add, rank, pause, finish and drop goals on the board or with `dah goal`. |
108
+ | **hub** | the always-on lane. Turns goals and requests into tasks, reviews results, decides inside approved scope, escalates the rest to people. |
109
+ | **lane** | a role with its own session: `hub`, `infra`, and any team lanes you add (`dah lane add docs --runtime codex`). A lane is not a new agent: it is a role file (`.tower/lanes/<lane>.md`, edit freely) put on the agent you already use, with your hooks, skills and plugins. Every lane also gets a `/dah-<lane>` shortcut so you can open the role by hand in Claude Code, OpenCode or Codex. |
110
+ | **task** | a brief the hub gives a team lane, usually for one step of a goal. Each task runs in a fresh session; the tower closes it when the lane wraps. |
111
+ | **item** | something a human or the hub must decide: a `decision` with options or a `review` of an artifact. |
112
+ | **memo** | what people write on the board: to the `hub` (the work, priorities) or to `infra` (the system: lanes, models, access). Each gets a reply on the board. |
113
+ | **infra** | the lane that maintains the tower itself: adds lanes, changes models, sets up access, one memo per fresh session. |
114
+
115
+ **Memory is yours.** agent-hub keeps the board's history (goals, decisions, reports, memos) and nothing else. Where your team keeps decisions and notes (a memory MCP, a wiki, a docs folder) is your choice: setup writes it into the lane instructions, and lanes record there the way you normally do.
116
+
117
+ The working rules every lane follows are in [`templates/PROTOCOL.md`](agent_hub/templates/PROTOCOL.md).
118
+
119
+ ## Runtimes
120
+
121
+ | runtime | how the tower drives it | live `ask` to the board |
122
+ | --- | --- | --- |
123
+ | `opencode` | `opencode serve --port P` per lane, HTTP API. You can also run `opencode --port P` yourself and watch the TUI; the tower then uses it and never kills it. | yes |
124
+ | `claude` | `claude -p --session-id` to start, `claude -p --resume` for each prompt | no (lanes post items instead) |
125
+ | `codex` | `codex exec --json` to start, `codex exec resume` for each prompt | no |
126
+
127
+ Each lane runs your agent as you configured it. When a role needs its own prompt, model or tool limits, point the lane at one of your existing agents (`dah lane add review --runtime claude --agent code-reviewer`, or `"agent"` in `tower.json`: an OpenCode agent name or a Claude `--agent`); `"model"` picks a model, `"args"` passes anything else (Codex: `["--profile", NAME]`). Lanes run unattended, so by default Claude runs with `bypassPermissions` and Codex without its sandbox; `dah init --safe` writes sandboxed arguments instead.
128
+
129
+ ## Language
130
+
131
+ `--lang` takes any language code: agents write everything people read on the board in that language. The board's buttons and labels come in English, Korean, Japanese, Chinese and Spanish; each viewer can switch them from the board's header.
132
+
133
+ ## Teams
134
+
135
+ `auth.mode` in `.tower/tower.json`:
136
+
137
+ - `local` (default): the board listens on 127.0.0.1 only; whoever can reach it is the owner.
138
+ - `header`: a proxy authenticates people and passes an identity header (Cloudflare Access, Tailscale Serve, an AWS ALB with OIDC). Only trusted from the local proxy. `dah member add ana --ident ana@company.com` turns it into an allow-list.
139
+ - `token`: `dah member add ana --token` prints a sign-in token for the board.
140
+
141
+ Every decision records who made it, and the hub can route an item to one person (`dah escalate ID --to ana`).
142
+
143
+ ## Development
144
+
145
+ ```sh
146
+ git clone https://github.com/twglhk/dongduni-agent-hub && cd dongduni-agent-hub
147
+ python3 -m unittest discover -s tests -t .
148
+ bin/dah -h # runs from the clone without installing
149
+ ```
150
+
151
+ Pushing a tag `vX.Y.Z` tests on Linux, macOS and Windows and publishes to PyPI. Tests drive the adapters against stand-in CLIs and a stand-in OpenCode server; no model is called. See [AGENTS.md](AGENTS.md) for the layout and rules.
152
+
153
+ ## License
154
+
155
+ MIT
@@ -0,0 +1,131 @@
1
+ # dongduni-agent-hub
2
+
3
+ **Stop typing to every agent. Set the goal; the hub runs the lanes.**
4
+
5
+ How long will you keep five terminals open, re-explaining context to each agent session, spawning subagents by hand, and digging through scrollback to find out who finished what? agent-hub turns that around. You write down what you want done and in which order. One always-on **hub** agent plans it with you, hands the work to agent sessions it controls (**lanes**: OpenCode, Claude Code or Codex, mixed freely), checks what comes back, and reports to a review board on your phone. You only step in for the calls that need a human.
6
+
7
+ ![Without agent-hub: you type to every terminal and keep the state in your head. With agent-hub: you set and rank goals on a board; the hub assigns work to lanes and reports back.](docs/images/why.svg)
8
+
9
+ ## What you get
10
+
11
+ - **Goals, not prompts.** Add as many goals as you like, rank them, pause or drop them. The board shows which goal the team is on now and how far each one is (its achievement rate is the share of its agreed steps that are done).
12
+ - **A hub that runs the team.** It agrees a plan with you, splits it into tasks, starts a fresh agent session per task (up to `max_lanes` at once), nudges stalled lanes, reviews results against the real output, and decides what is inside the approved scope.
13
+ - **Lanes that work on their own.** Each lane is your agent as you configured it, with your instruction files, skills, MCP servers, hooks and subagents. It reports `done`, `blocked` or posts a decision; it never waits in chat.
14
+ - **A board instead of chat.** Decisions with options, reviews of artifacts (images, video, text inline), memos to the hub or to infra, history. Built for a phone; translated into English, 한국어, 日本語, 中文 and Español.
15
+ - **Your setup, your rules.** Lane instructions, runtimes, models, agents, permissions, notifications, auth and hosting are plain files you (or the infra lane) edit. The tower in the middle is a small Python loop with no LLM in it.
16
+
17
+ ![The loop: you set goals, the hub plans them with you, tasks go to lanes, lanes work and report, the hub reviews and asks you only what needs a human.](docs/images/how.svg)
18
+
19
+ <p align="center">
20
+ <img src="docs/images/board-goals.png" width="300" alt="The board's Hub tab: ranked goals with progress, the goal in progress marked Now">
21
+ &nbsp;&nbsp;
22
+ <img src="docs/images/board-decide.png" width="300" alt="A decision on the board: options, recommendation, Decide button">
23
+ </p>
24
+
25
+ ## Install
26
+
27
+ One package for Windows, macOS and Linux: [`dongduni-agent-hub`](https://pypi.org/project/dongduni-agent-hub/) on PyPI. It needs Python 3.10+ and nothing else, and installs one command, **`dah`**.
28
+
29
+ ```sh
30
+ uv tool install dongduni-agent-hub # recommended: uv brings its own Python if you have none
31
+ pipx install dongduni-agent-hub # or, if you use pipx
32
+ ```
33
+
34
+ No uv yet? It is one line: `curl -LsSf https://astral.sh/uv/install.sh | sh` (macOS, Linux) or `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"` (Windows). Check with `dah -h`; upgrade with `uv tool upgrade dongduni-agent-hub`.
35
+
36
+ Only for one project, without touching your user: `uv venv .tower/venv && uv pip install --python .tower/venv dongduni-agent-hub`, then run `.tower/venv/bin/dah` (`.tower\venv\Scripts\dah` on Windows).
37
+
38
+ ## Set it up: ask your agent
39
+
40
+ Setup is agent-driven, because every team keeps its agents, docs and servers somewhere different. Open your coding agent in your workspace and say one of:
41
+
42
+ > Install dongduni-agent-hub in this project.
43
+
44
+ > Install dongduni-agent-hub globally.
45
+
46
+ **In this project**: the agent follows the setup playbook (`dah guide`): it surveys how you work (`dah discover`: agent CLIs, their configs, MCP servers, skills, where your knowledge lives, hosting tools), asks you a handful of questions (which agents run the hub and infra, board language, where your team's memory lives, how your phone should reach the board), writes `.tower/` with lane instructions tailored to your workspace, starts the tower, adds your first goals, and checks the whole loop end to end.
47
+
48
+ **Globally**: the agent installs the `dah` command for your user and runs `dah skill install`, which adds an `agent-hub-setup` skill (Claude Code) and command (OpenCode, Codex) to your agents after showing you the diff. From then on, "set up agent-hub here" works in any workspace.
49
+
50
+ If your agent cannot find the playbook, point it at [agent_hub/guide/SETUP.md](agent_hub/guide/SETUP.md).
51
+
52
+ ### By hand
53
+
54
+ ```sh
55
+ cd ~/my-workspace
56
+ dah init --name "My Team" --lang en --hub claude --infra claude # writes .tower/, picks free ports
57
+ dah start # tower + board, URL printed
58
+ dah goal add "Launch the public beta" --detail "sign-up open, onboarding under 2 minutes"
59
+ dah status
60
+ ```
61
+
62
+ ## One board, every project
63
+
64
+ Each workspace has its own tower, state and board port. `dah init` registers it on this machine (`dah workspaces` lists them), and every board can switch to the others from its title: other workspaces are served under `/w/<name>/`. Expose one board and you reach all your projects from the phone; a workspace that only trusts local visitors stays hidden behind a board that signs people in.
65
+
66
+ ## Reach the board from your phone
67
+
68
+ The board listens on `127.0.0.1` by default. `dah guide <name>` prints each path:
69
+
70
+ | situation | path |
71
+ | --- | --- |
72
+ | phone on the same Wi-Fi, trying it out | `dah guide lan`: listen on the network, token sign-in |
73
+ | Tailscale on the machine and the phone | `dah guide tailscale`: `tailscale serve`, identity from Tailscale |
74
+ | a domain on Cloudflare | `dah guide cloudflare`: Tunnel + Access (email code, Google, GitHub, Okta …) |
75
+ | agents on a server | `dah guide aws`: EC2 with one of the above, or an ALB with OIDC |
76
+
77
+ Push notifications (ntfy, Slack, desktop) tell you when something needs you.
78
+
79
+ ## Concepts
80
+
81
+ | | |
82
+ | --- | --- |
83
+ | **goal** | an outcome you want, ranked against the others. The first active goal is what the team works on now. The hub agrees its steps with you; progress is the share of steps done. Add, rank, pause, finish and drop goals on the board or with `dah goal`. |
84
+ | **hub** | the always-on lane. Turns goals and requests into tasks, reviews results, decides inside approved scope, escalates the rest to people. |
85
+ | **lane** | a role with its own session: `hub`, `infra`, and any team lanes you add (`dah lane add docs --runtime codex`). A lane is not a new agent: it is a role file (`.tower/lanes/<lane>.md`, edit freely) put on the agent you already use, with your hooks, skills and plugins. Every lane also gets a `/dah-<lane>` shortcut so you can open the role by hand in Claude Code, OpenCode or Codex. |
86
+ | **task** | a brief the hub gives a team lane, usually for one step of a goal. Each task runs in a fresh session; the tower closes it when the lane wraps. |
87
+ | **item** | something a human or the hub must decide: a `decision` with options or a `review` of an artifact. |
88
+ | **memo** | what people write on the board: to the `hub` (the work, priorities) or to `infra` (the system: lanes, models, access). Each gets a reply on the board. |
89
+ | **infra** | the lane that maintains the tower itself: adds lanes, changes models, sets up access, one memo per fresh session. |
90
+
91
+ **Memory is yours.** agent-hub keeps the board's history (goals, decisions, reports, memos) and nothing else. Where your team keeps decisions and notes (a memory MCP, a wiki, a docs folder) is your choice: setup writes it into the lane instructions, and lanes record there the way you normally do.
92
+
93
+ The working rules every lane follows are in [`templates/PROTOCOL.md`](agent_hub/templates/PROTOCOL.md).
94
+
95
+ ## Runtimes
96
+
97
+ | runtime | how the tower drives it | live `ask` to the board |
98
+ | --- | --- | --- |
99
+ | `opencode` | `opencode serve --port P` per lane, HTTP API. You can also run `opencode --port P` yourself and watch the TUI; the tower then uses it and never kills it. | yes |
100
+ | `claude` | `claude -p --session-id` to start, `claude -p --resume` for each prompt | no (lanes post items instead) |
101
+ | `codex` | `codex exec --json` to start, `codex exec resume` for each prompt | no |
102
+
103
+ Each lane runs your agent as you configured it. When a role needs its own prompt, model or tool limits, point the lane at one of your existing agents (`dah lane add review --runtime claude --agent code-reviewer`, or `"agent"` in `tower.json`: an OpenCode agent name or a Claude `--agent`); `"model"` picks a model, `"args"` passes anything else (Codex: `["--profile", NAME]`). Lanes run unattended, so by default Claude runs with `bypassPermissions` and Codex without its sandbox; `dah init --safe` writes sandboxed arguments instead.
104
+
105
+ ## Language
106
+
107
+ `--lang` takes any language code: agents write everything people read on the board in that language. The board's buttons and labels come in English, Korean, Japanese, Chinese and Spanish; each viewer can switch them from the board's header.
108
+
109
+ ## Teams
110
+
111
+ `auth.mode` in `.tower/tower.json`:
112
+
113
+ - `local` (default): the board listens on 127.0.0.1 only; whoever can reach it is the owner.
114
+ - `header`: a proxy authenticates people and passes an identity header (Cloudflare Access, Tailscale Serve, an AWS ALB with OIDC). Only trusted from the local proxy. `dah member add ana --ident ana@company.com` turns it into an allow-list.
115
+ - `token`: `dah member add ana --token` prints a sign-in token for the board.
116
+
117
+ Every decision records who made it, and the hub can route an item to one person (`dah escalate ID --to ana`).
118
+
119
+ ## Development
120
+
121
+ ```sh
122
+ git clone https://github.com/twglhk/dongduni-agent-hub && cd dongduni-agent-hub
123
+ python3 -m unittest discover -s tests -t .
124
+ bin/dah -h # runs from the clone without installing
125
+ ```
126
+
127
+ Pushing a tag `vX.Y.Z` tests on Linux, macOS and Windows and publishes to PyPI. Tests drive the adapters against stand-in CLIs and a stand-in OpenCode server; no model is called. See [AGENTS.md](AGENTS.md) for the layout and rules.
128
+
129
+ ## License
130
+
131
+ MIT
@@ -0,0 +1,3 @@
1
+ """agent-hub: a control tower and review board for teams of AI coding agents."""
2
+
3
+ __version__ = "0.2.0"
@@ -0,0 +1,3 @@
1
+ from agent_hub.cli import main
2
+
3
+ main()