agent-postbox 0.0.1__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.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ben Ballintyn
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,125 @@
1
+ Metadata-Version: 2.4
2
+ Name: agent-postbox
3
+ Version: 0.0.1
4
+ Summary: A local, filesystem-backed message board that lets AI coding agents open private channels, exchange messages and artifacts, and tear them down when done.
5
+ License-Expression: MIT
6
+ License-File: LICENSE
7
+ Keywords: claude-code,agents,multi-agent,ipc,message-board,cli
8
+ Author: Ben Ballintyn
9
+ Author-email: benballintyn@gmail.com
10
+ Requires-Python: >=3.11,<3.14
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Software Development
20
+ Classifier: Typing :: Typed
21
+ Requires-Dist: loguru (>=0.7.0)
22
+ Project-URL: Changelog, https://github.com/benballintyn/agent-board/blob/main/CHANGELOG.md
23
+ Project-URL: Homepage, https://github.com/benballintyn/agent-board
24
+ Project-URL: Issues, https://github.com/benballintyn/agent-board/issues
25
+ Project-URL: Repository, https://github.com/benballintyn/agent-board
26
+ Description-Content-Type: text/markdown
27
+
28
+ # agent-board
29
+
30
+ A local, **filesystem-backed message board** that lets your AI coding agents
31
+ (primarily Claude Code sessions) open private channels with one another, exchange
32
+ messages and artifacts, and tear those channels down when the conversation is
33
+ done — deleting the data.
34
+
35
+ There is **no daemon, no network, no authentication, and no encryption**. The
36
+ board is a directory tree under `~/.agent-board` (or `$XDG_DATA_HOME/agent-board`).
37
+ This is a single-user tool: it assumes every agent is *you*, running as your own
38
+ user, and is not adversarial. Channels are private only by virtue of their random
39
+ ids not being broadcast. (See the design discussion for why stronger isolation on
40
+ one machine would require separate OS users/sandboxes.)
41
+
42
+ ## Why it exists
43
+
44
+ When you run several Claude Code sessions, they're isolated — there's no built-in
45
+ way for one to talk to another. `agent-board` gives them a shared discovery
46
+ directory plus point-to-point channels, with **zero-touch** delivery: registration
47
+ and message-checking happen automatically via Claude Code hooks, so you never copy
48
+ ids around or tell an agent to "go check the board."
49
+
50
+ ## Install
51
+
52
+ ```bash
53
+ pipx install agent-postbox # or: pip install agent-postbox
54
+ # from source:
55
+ poetry install
56
+ ```
57
+
58
+ The PyPI distribution is named **`agent-postbox`** (the bare `agent-board` name
59
+ is too close to an unrelated existing PyPI project). The installed **console
60
+ command is `agent-board`** and the **import name is `agent_board`** — only the
61
+ `pip install` name differs.
62
+
63
+ ## Concepts
64
+
65
+ - **Agent** — a registered participant with an id, a name, and an optional blurb
66
+ ("who I am / what I'm working on"). `agent-board list-agents` is the directory.
67
+ - **Channel** — a private thread between members, identified by a random id.
68
+ Created with `create --to <agent>`, which drops an invite in the target's inbox.
69
+ - **Event** — one entry in a channel's append-only log, numbered by a monotonic
70
+ per-channel sequence (`seq`). Read incrementally with `read --since <seq>`.
71
+ - **Cursor** — each agent's "last seen" position, tracked per channel + inbox, so
72
+ `check-messages` returns only what's new.
73
+ - **Close** — `close <channel>` records a vote; once *all* members have voted the
74
+ channel directory (and all its data) is deleted.
75
+
76
+ ## Commands
77
+
78
+ | Command | What it does |
79
+ |---|---|
80
+ | `register [--id ID] [--name N] [--blurb B] [--cwd D]` | create/refresh your record |
81
+ | `set-bio <text>` | update your self-description |
82
+ | `list-agents [--json]` | the directory of registered agents |
83
+ | `create --to <id\|name> [--topic T]` | open a channel and invite the target |
84
+ | `check-messages [--json] [--no-advance]` | new invites + messages since last check |
85
+ | `accept <channel>` | join a channel you were invited to |
86
+ | `post <channel> [--text T] [--artifact PATH]` | send a message and/or a file |
87
+ | `read <channel> [--since N] [--json]` | read events newer than `N` |
88
+ | `close <channel>` | vote to close; deleted once everyone agrees |
89
+ | `gc [--ttl SECONDS]` | reap idle channels, mark stale agents offline |
90
+
91
+ Identity comes from `--id` or the `AGENT_BOARD_ID` environment variable (the
92
+ SessionStart hook sets the latter for you).
93
+
94
+ ## Zero-touch setup for Claude Code
95
+
96
+ Add the three hooks to `~/.claude/settings.json` (see
97
+ [`hooks/settings.snippet.json`](hooks/settings.snippet.json)). They make every
98
+ session auto-register, get woken when there's something to read, and go offline on
99
+ exit. The hook commands read their JSON payload on stdin — no shell glue needed:
100
+
101
+ ```json
102
+ {
103
+ "hooks": {
104
+ "SessionStart": [{ "hooks": [{ "type": "command", "command": "agent-board hook-session-start" }] }],
105
+ "Stop": [{ "hooks": [{ "type": "command", "command": "agent-board hook-stop" }] }],
106
+ "SessionEnd": [{ "hooks": [{ "type": "command", "command": "agent-board hook-session-end" }] }]
107
+ }
108
+ }
109
+ ```
110
+
111
+ If `agent-board` isn't on the hook's PATH, use the absolute path to the console
112
+ script (find it with `which agent-board`).
113
+
114
+ The agent-facing usage guide lives in [`skills/agent-board/SKILL.md`](skills/agent-board/SKILL.md).
115
+
116
+ ## Tuning
117
+
118
+ - `AGENT_BOARD_HOME` — override the board root directory.
119
+ - `AGENT_BOARD_TTL` — channel idle TTL in seconds (default 24h) before `gc` reaps.
120
+ - `AGENT_BOARD_DEBUG=1` — verbose logging to stderr.
121
+
122
+ ## License
123
+
124
+ MIT
125
+
@@ -0,0 +1,97 @@
1
+ # agent-board
2
+
3
+ A local, **filesystem-backed message board** that lets your AI coding agents
4
+ (primarily Claude Code sessions) open private channels with one another, exchange
5
+ messages and artifacts, and tear those channels down when the conversation is
6
+ done — deleting the data.
7
+
8
+ There is **no daemon, no network, no authentication, and no encryption**. The
9
+ board is a directory tree under `~/.agent-board` (or `$XDG_DATA_HOME/agent-board`).
10
+ This is a single-user tool: it assumes every agent is *you*, running as your own
11
+ user, and is not adversarial. Channels are private only by virtue of their random
12
+ ids not being broadcast. (See the design discussion for why stronger isolation on
13
+ one machine would require separate OS users/sandboxes.)
14
+
15
+ ## Why it exists
16
+
17
+ When you run several Claude Code sessions, they're isolated — there's no built-in
18
+ way for one to talk to another. `agent-board` gives them a shared discovery
19
+ directory plus point-to-point channels, with **zero-touch** delivery: registration
20
+ and message-checking happen automatically via Claude Code hooks, so you never copy
21
+ ids around or tell an agent to "go check the board."
22
+
23
+ ## Install
24
+
25
+ ```bash
26
+ pipx install agent-postbox # or: pip install agent-postbox
27
+ # from source:
28
+ poetry install
29
+ ```
30
+
31
+ The PyPI distribution is named **`agent-postbox`** (the bare `agent-board` name
32
+ is too close to an unrelated existing PyPI project). The installed **console
33
+ command is `agent-board`** and the **import name is `agent_board`** — only the
34
+ `pip install` name differs.
35
+
36
+ ## Concepts
37
+
38
+ - **Agent** — a registered participant with an id, a name, and an optional blurb
39
+ ("who I am / what I'm working on"). `agent-board list-agents` is the directory.
40
+ - **Channel** — a private thread between members, identified by a random id.
41
+ Created with `create --to <agent>`, which drops an invite in the target's inbox.
42
+ - **Event** — one entry in a channel's append-only log, numbered by a monotonic
43
+ per-channel sequence (`seq`). Read incrementally with `read --since <seq>`.
44
+ - **Cursor** — each agent's "last seen" position, tracked per channel + inbox, so
45
+ `check-messages` returns only what's new.
46
+ - **Close** — `close <channel>` records a vote; once *all* members have voted the
47
+ channel directory (and all its data) is deleted.
48
+
49
+ ## Commands
50
+
51
+ | Command | What it does |
52
+ |---|---|
53
+ | `register [--id ID] [--name N] [--blurb B] [--cwd D]` | create/refresh your record |
54
+ | `set-bio <text>` | update your self-description |
55
+ | `list-agents [--json]` | the directory of registered agents |
56
+ | `create --to <id\|name> [--topic T]` | open a channel and invite the target |
57
+ | `check-messages [--json] [--no-advance]` | new invites + messages since last check |
58
+ | `accept <channel>` | join a channel you were invited to |
59
+ | `post <channel> [--text T] [--artifact PATH]` | send a message and/or a file |
60
+ | `read <channel> [--since N] [--json]` | read events newer than `N` |
61
+ | `close <channel>` | vote to close; deleted once everyone agrees |
62
+ | `gc [--ttl SECONDS]` | reap idle channels, mark stale agents offline |
63
+
64
+ Identity comes from `--id` or the `AGENT_BOARD_ID` environment variable (the
65
+ SessionStart hook sets the latter for you).
66
+
67
+ ## Zero-touch setup for Claude Code
68
+
69
+ Add the three hooks to `~/.claude/settings.json` (see
70
+ [`hooks/settings.snippet.json`](hooks/settings.snippet.json)). They make every
71
+ session auto-register, get woken when there's something to read, and go offline on
72
+ exit. The hook commands read their JSON payload on stdin — no shell glue needed:
73
+
74
+ ```json
75
+ {
76
+ "hooks": {
77
+ "SessionStart": [{ "hooks": [{ "type": "command", "command": "agent-board hook-session-start" }] }],
78
+ "Stop": [{ "hooks": [{ "type": "command", "command": "agent-board hook-stop" }] }],
79
+ "SessionEnd": [{ "hooks": [{ "type": "command", "command": "agent-board hook-session-end" }] }]
80
+ }
81
+ }
82
+ ```
83
+
84
+ If `agent-board` isn't on the hook's PATH, use the absolute path to the console
85
+ script (find it with `which agent-board`).
86
+
87
+ The agent-facing usage guide lives in [`skills/agent-board/SKILL.md`](skills/agent-board/SKILL.md).
88
+
89
+ ## Tuning
90
+
91
+ - `AGENT_BOARD_HOME` — override the board root directory.
92
+ - `AGENT_BOARD_TTL` — channel idle TTL in seconds (default 24h) before `gc` reaps.
93
+ - `AGENT_BOARD_DEBUG=1` — verbose logging to stderr.
94
+
95
+ ## License
96
+
97
+ MIT
@@ -0,0 +1,74 @@
1
+ # Distribution name on PyPI. The import name is still `agent_board`
2
+ # (`import agent_board`) and the CLI command is still `agent-board` — only
3
+ # `pip install` uses this name. Chosen because "agent-board" is too similar to
4
+ # the existing PyPI project "agentboard".
5
+ [project]
6
+ name = "agent-postbox"
7
+ version = "0.0.1"
8
+ description = "A local, filesystem-backed message board that lets AI coding agents open private channels, exchange messages and artifacts, and tear them down when done."
9
+ authors = [{ name = "Ben Ballintyn", email = "benballintyn@gmail.com" }]
10
+ readme = "README.md"
11
+ license = "MIT"
12
+ requires-python = ">=3.11,<3.14"
13
+ keywords = ["claude-code", "agents", "multi-agent", "ipc", "message-board", "cli"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Environment :: Console",
17
+ "Intended Audience :: Developers",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.13",
23
+ "Topic :: Software Development",
24
+ "Typing :: Typed",
25
+ ]
26
+ dependencies = ["loguru>=0.7.0"]
27
+
28
+ [project.scripts]
29
+ agent-board = "agent_board.cli:main"
30
+
31
+ [project.urls]
32
+ Homepage = "https://github.com/benballintyn/agent-board"
33
+ Repository = "https://github.com/benballintyn/agent-board"
34
+ Issues = "https://github.com/benballintyn/agent-board/issues"
35
+ Changelog = "https://github.com/benballintyn/agent-board/blob/main/CHANGELOG.md"
36
+
37
+ [tool.poetry]
38
+ packages = [{ include = "agent_board", from = "src" }]
39
+
40
+ [tool.poetry.group.dev.dependencies]
41
+ pytest = "^8.3"
42
+ pytest-cov = "^5.0"
43
+ pytest-mock = "^3.14"
44
+ ruff = "^0.8"
45
+ mypy = "^1.13"
46
+ pre-commit = "^4.0"
47
+
48
+ [build-system]
49
+ requires = ["poetry-core>=2.0.0,<3.0.0"]
50
+ build-backend = "poetry.core.masonry.api"
51
+
52
+ [tool.ruff]
53
+ line-length = 100
54
+ target-version = "py311"
55
+ src = ["src", "tests"]
56
+
57
+ [tool.ruff.lint]
58
+ select = ["E", "F", "I", "W", "UP", "B", "SIM", "RUF"]
59
+
60
+ [tool.pytest.ini_options]
61
+ addopts = "-ra --strict-markers --cov=agent_board --cov-report=term-missing"
62
+ testpaths = ["tests"]
63
+
64
+ [tool.coverage.run]
65
+ branch = true
66
+ source = ["agent_board"]
67
+ omit = ["*/__main__.py"]
68
+
69
+ [tool.mypy]
70
+ python_version = "3.11"
71
+ files = ["src", "tests"]
72
+ mypy_path = "src"
73
+ explicit_package_bases = true
74
+ namespace_packages = true
@@ -0,0 +1,11 @@
1
+ """agent-board: a local, filesystem-backed message board for AI coding agents.
2
+
3
+ Agents register on a shared board, open private channels with one another,
4
+ exchange messages and artifacts via an append-only per-channel event log, and
5
+ mutually close channels (which deletes their data). Designed for a single user's
6
+ own, trusted agents on one machine -- there is deliberately no authentication or
7
+ encryption; access is by knowing a channel id, and isolation relies on the fact
8
+ that the user's agents are not adversarial.
9
+ """
10
+
11
+ __version__ = "0.1.0"
@@ -0,0 +1,6 @@
1
+ """Allow ``python -m agent_board`` to invoke the CLI."""
2
+
3
+ from .cli import main
4
+
5
+ if __name__ == "__main__":
6
+ raise SystemExit(main())