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.
- dongduni_agent_hub-0.2.0/LICENSE +21 -0
- dongduni_agent_hub-0.2.0/PKG-INFO +155 -0
- dongduni_agent_hub-0.2.0/README.md +131 -0
- dongduni_agent_hub-0.2.0/agent_hub/__init__.py +3 -0
- dongduni_agent_hub-0.2.0/agent_hub/__main__.py +3 -0
- dongduni_agent_hub-0.2.0/agent_hub/board/index.html +1461 -0
- dongduni_agent_hub-0.2.0/agent_hub/cli.py +922 -0
- dongduni_agent_hub-0.2.0/agent_hub/config.py +280 -0
- dongduni_agent_hub-0.2.0/agent_hub/discover.py +257 -0
- dongduni_agent_hub-0.2.0/agent_hub/engine.py +506 -0
- dongduni_agent_hub-0.2.0/agent_hub/guide/SETUP.md +101 -0
- dongduni_agent_hub-0.2.0/agent_hub/guide/deploy/aws.md +50 -0
- dongduni_agent_hub-0.2.0/agent_hub/guide/deploy/cloudflare.md +53 -0
- dongduni_agent_hub-0.2.0/agent_hub/guide/deploy/lan.md +26 -0
- dongduni_agent_hub-0.2.0/agent_hub/guide/deploy/tailscale.md +21 -0
- dongduni_agent_hub-0.2.0/agent_hub/install.py +162 -0
- dongduni_agent_hub-0.2.0/agent_hub/notify.py +65 -0
- dongduni_agent_hub-0.2.0/agent_hub/procs.py +103 -0
- dongduni_agent_hub-0.2.0/agent_hub/runtimes.py +392 -0
- dongduni_agent_hub-0.2.0/agent_hub/store.py +669 -0
- dongduni_agent_hub-0.2.0/agent_hub/templates/PROTOCOL.md +63 -0
- dongduni_agent_hub-0.2.0/agent_hub/templates/lanes/hub.md +38 -0
- dongduni_agent_hub-0.2.0/agent_hub/templates/lanes/infra.md +26 -0
- dongduni_agent_hub-0.2.0/agent_hub/templates/lanes/team.md +14 -0
- dongduni_agent_hub-0.2.0/agent_hub/web.py +404 -0
- dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/PKG-INFO +155 -0
- dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/SOURCES.txt +37 -0
- dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/dependency_links.txt +1 -0
- dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/entry_points.txt +2 -0
- dongduni_agent_hub-0.2.0/dongduni_agent_hub.egg-info/top_level.txt +1 -0
- dongduni_agent_hub-0.2.0/pyproject.toml +42 -0
- dongduni_agent_hub-0.2.0/setup.cfg +4 -0
- dongduni_agent_hub-0.2.0/tests/test_cli.py +137 -0
- dongduni_agent_hub-0.2.0/tests/test_discover.py +89 -0
- dongduni_agent_hub-0.2.0/tests/test_engine.py +266 -0
- dongduni_agent_hub-0.2.0/tests/test_procs.py +77 -0
- dongduni_agent_hub-0.2.0/tests/test_runtimes.py +219 -0
- dongduni_agent_hub-0.2.0/tests/test_store.py +125 -0
- 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
|
+

|
|
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
|
+

|
|
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
|
+
|
|
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
|
+

|
|
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
|
+

|
|
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
|
+
|
|
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
|