agent-parley 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.
- agent_parley-0.1.0/.agents/plugins/marketplace.json +20 -0
- agent_parley-0.1.0/.claude-plugin/marketplace.json +16 -0
- agent_parley-0.1.0/.gitignore +8 -0
- agent_parley-0.1.0/CHANGELOG.md +28 -0
- agent_parley-0.1.0/CODE_OF_CONDUCT.md +18 -0
- agent_parley-0.1.0/CONTRIBUTING.md +128 -0
- agent_parley-0.1.0/LICENSE +21 -0
- agent_parley-0.1.0/Makefile +37 -0
- agent_parley-0.1.0/PKG-INFO +267 -0
- agent_parley-0.1.0/README.md +248 -0
- agent_parley-0.1.0/SECURITY.md +26 -0
- agent_parley-0.1.0/agent_parley/__init__.py +1 -0
- agent_parley-0.1.0/agent_parley/__main__.py +6 -0
- agent_parley-0.1.0/agent_parley/checkpoints.py +858 -0
- agent_parley-0.1.0/agent_parley/cli.py +1455 -0
- agent_parley-0.1.0/agent_parley/dashboard.py +375 -0
- agent_parley-0.1.0/agent_parley/issues.py +223 -0
- agent_parley-0.1.0/agent_parley/process.py +77 -0
- agent_parley-0.1.0/agent_parley/roster.py +448 -0
- agent_parley-0.1.0/agent_parley/server.py +360 -0
- agent_parley-0.1.0/agent_parley/state.py +69 -0
- agent_parley-0.1.0/agent_parley/store.py +644 -0
- agent_parley-0.1.0/docs/architecture.md +245 -0
- agent_parley-0.1.0/docs/assets/agent-parley.png +0 -0
- agent_parley-0.1.0/docs/assets/agent-parley.svg +23 -0
- agent_parley-0.1.0/docs/assets/screenshot-coordination.svg +26 -0
- agent_parley-0.1.0/docs/assets/screenshot-hooks.svg +45 -0
- agent_parley-0.1.0/docs/assets/screenshot-issues.svg +11 -0
- agent_parley-0.1.0/docs/assets/screenshot-status.svg +39 -0
- agent_parley-0.1.0/docs/assets/screenshot-top.svg +21 -0
- agent_parley-0.1.0/docs/catalog-submission.md +225 -0
- agent_parley-0.1.0/docs/operations.md +301 -0
- agent_parley-0.1.0/docs/release-overview.md +28 -0
- agent_parley-0.1.0/plugins/README.md +47 -0
- agent_parley-0.1.0/plugins/agent-parley/.claude-plugin/plugin.json +11 -0
- agent_parley-0.1.0/plugins/agent-parley/.codex-plugin/plugin.json +19 -0
- agent_parley-0.1.0/plugins/agent-parley/skills/coordinate/SKILL.md +70 -0
- agent_parley-0.1.0/pyproject.toml +70 -0
- agent_parley-0.1.0/scripts/__init__.py +1 -0
- agent_parley-0.1.0/scripts/benchmark.py +62 -0
- agent_parley-0.1.0/scripts/check_policy.py +147 -0
- agent_parley-0.1.0/scripts/check_pr_hygiene.py +136 -0
- agent_parley-0.1.0/scripts/release_artifacts.py +127 -0
- agent_parley-0.1.0/tests/conftest.py +50 -0
- agent_parley-0.1.0/tests/test_bridge.py +1564 -0
- agent_parley-0.1.0/tests/test_contribution_policy.py +31 -0
- agent_parley-0.1.0/tests/test_engine.py +491 -0
- agent_parley-0.1.0/tests/test_pr_hygiene.py +52 -0
- agent_parley-0.1.0/tests/test_release_artifacts.py +41 -0
- agent_parley-0.1.0/uv.lock +1169 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-parley-local",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "Agent Parley Local"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "agent-parley",
|
|
9
|
+
"source": {
|
|
10
|
+
"source": "local",
|
|
11
|
+
"path": "./plugins/agent-parley"
|
|
12
|
+
},
|
|
13
|
+
"policy": {
|
|
14
|
+
"installation": "AVAILABLE",
|
|
15
|
+
"authentication": "ON_INSTALL"
|
|
16
|
+
},
|
|
17
|
+
"category": "Productivity"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-parley-local",
|
|
3
|
+
"description": "Coordination plugins for running several coding agents side by side in separate Git worktrees.",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "Suneel Kaushik S",
|
|
6
|
+
"email": "suneel944@gmail.com"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "agent-parley",
|
|
11
|
+
"source": "./plugins/agent-parley",
|
|
12
|
+
"description": "Shared issue ownership and handoffs across coding agents.",
|
|
13
|
+
"version": "0.1.0"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.1.0](https://github.com/suneel944/agent-parley/compare/v0.0.1...v0.1.0) (2026-09-09)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* rename the project to agent-parley and restart at 0.0.1 ([#20](https://github.com/suneel944/agent-parley/issues/20))
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* complete the first release with issue dependencies and automated publishing ([#26](https://github.com/suneel944/agent-parley/issues/26)) ([9158d61](https://github.com/suneel944/agent-parley/commit/9158d61f1b8a269461744cb10b92b6b788233cfd))
|
|
13
|
+
* rename the project to agent-parley and restart at 0.0.1 ([#20](https://github.com/suneel944/agent-parley/issues/20)) ([8a7dcc0](https://github.com/suneel944/agent-parley/commit/8a7dcc08d387560bc23a5ebdb101275f99887c28))
|
|
14
|
+
* support any participant roster and record enforcement history ([#18](https://github.com/suneel944/agent-parley/issues/18)) ([fba4428](https://github.com/suneel944/agent-parley/commit/fba4428a7310f9c0d67bcfe8b90f54e5d8a66d11))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug fixes
|
|
18
|
+
|
|
19
|
+
* grant the release caller the identity permission it delegates ([#22](https://github.com/suneel944/agent-parley/issues/22)) ([8ea3e03](https://github.com/suneel944/agent-parley/commit/8ea3e030368bc777c1aac9ab78defea8b180d63f))
|
|
20
|
+
|
|
21
|
+
## [0.0.1] - 2026-09-10
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- First release of Agent Parley: a coordination launcher that runs several
|
|
26
|
+
native coding-agent CLIs in separate Git worktrees under one Linux user, with
|
|
27
|
+
shared issue ownership, explicit handoffs, advisory file reservations, bounded
|
|
28
|
+
peer messaging, native lifecycle hooks and a live dashboard.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Code of conduct
|
|
2
|
+
|
|
3
|
+
Treat contributors and users with respect. Critique code and ideas with concrete
|
|
4
|
+
evidence. Welcome questions and corrections, and give people room to learn.
|
|
5
|
+
|
|
6
|
+
Harassment, threats, discriminatory abuse, sexualized conduct, and publishing
|
|
7
|
+
someone's private information without consent are not acceptable. These rules
|
|
8
|
+
apply to this project's issues, pull requests, discussions, and other community
|
|
9
|
+
spaces, including conduct while representing the project elsewhere.
|
|
10
|
+
|
|
11
|
+
Report concerns privately to suneel944@gmail.com. Include links or relevant
|
|
12
|
+
context without republishing private information. The maintainer will review
|
|
13
|
+
reports discreetly, consider the impact and context, and may issue a warning,
|
|
14
|
+
remove content, restrict participation, or ban an account. Retaliation against
|
|
15
|
+
someone who reports a concern is not acceptable.
|
|
16
|
+
|
|
17
|
+
If you disagree with a moderation decision, request reconsideration privately
|
|
18
|
+
with any missing context. Maintainers are expected to follow these rules too.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Coding standard
|
|
4
|
+
|
|
5
|
+
Use the [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html)
|
|
6
|
+
as the Python review baseline. Automated checks cover a subset of that guide;
|
|
7
|
+
passing lint is not a claim of complete style or correctness compliance.
|
|
8
|
+
|
|
9
|
+
- Use four-space indentation, an 80-character target, descriptive snake_case
|
|
10
|
+
functions and variables, and CapWords classes. Let Ruff handle formatting.
|
|
11
|
+
- Document public modules, classes, and functions. Use Google-style `Args`,
|
|
12
|
+
`Returns`, `Yields`, and `Raises` sections where callers need the contract.
|
|
13
|
+
- Annotate production function parameters and return values. Prefer explicit
|
|
14
|
+
keyword parameters over unstructured option dictionaries.
|
|
15
|
+
- Group standard-library, third-party, and local imports. Use absolute package
|
|
16
|
+
paths. Prefer module-qualified references when introducing new dependencies.
|
|
17
|
+
- Keep functions focused. Separate CLI orchestration, issue transitions,
|
|
18
|
+
checkpoint observation, and persistence. Prefer the standard library and
|
|
19
|
+
existing helpers before adding a dependency or abstraction.
|
|
20
|
+
- Runtime imports must remain within Python's standard library and this package.
|
|
21
|
+
Development tools do not belong in installed runtime dependencies.
|
|
22
|
+
- Put contracts and rationale in docstrings and focused documentation, not inline
|
|
23
|
+
Python comments. The policy gate checks every production and script function,
|
|
24
|
+
including private helpers. Descriptive test names document scenarios.
|
|
25
|
+
- Validate operational input with real conditionals, not assertions. Catch
|
|
26
|
+
expected failures at the appropriate boundary and preserve diagnostic context.
|
|
27
|
+
- Close files and sockets with context managers. Pass subprocess arguments as
|
|
28
|
+
lists; never interpolate user input into a shell. Make exit-code handling explicit.
|
|
29
|
+
|
|
30
|
+
This project uses Ruff rather than the guide's Pylint recommendation. Ruff enforces
|
|
31
|
+
Google-style docstrings, import ordering, annotations on production function
|
|
32
|
+
boundaries, and selected bug and Pylint-derived diagnostics. Pytest tests use
|
|
33
|
+
descriptive names and dynamically injected fixtures, so documentation and fixture
|
|
34
|
+
annotation rules are excluded there. Existing directly imported classes and
|
|
35
|
+
helpers are retained; this is an explicit deviation from Google's module-only
|
|
36
|
+
import preference. Do not describe the repository as Google-certified.
|
|
37
|
+
|
|
38
|
+
## Coordination invariants
|
|
39
|
+
|
|
40
|
+
- Resolve all linked worktrees to one common Git repository identity.
|
|
41
|
+
- Serialize issue mutations under the existing operation lock and publish state
|
|
42
|
+
atomically. Do not introduce timeout-based ownership takeover.
|
|
43
|
+
- Require the current offer ID and named recipient for handoff acceptance.
|
|
44
|
+
- Treat file reservations as advisory and peer messages as untrusted data.
|
|
45
|
+
- Preserve native authentication, approvals, and permission decisions.
|
|
46
|
+
- Keep credentials and runtime state outside target source trees. Preserve work
|
|
47
|
+
on failures, process exits, and restarts.
|
|
48
|
+
- Distinguish observed activity, attempted delivery, explicit acknowledgement,
|
|
49
|
+
reported verification, and independently verified completion.
|
|
50
|
+
|
|
51
|
+
## Verification and review
|
|
52
|
+
|
|
53
|
+
Install the local hooks after cloning:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
uv sync --locked
|
|
57
|
+
uv run --locked pre-commit install
|
|
58
|
+
uv run --locked pre-commit run --all-files
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`.pre-commit-config.yaml` runs Ruff lint/format checks, type checking and the
|
|
62
|
+
repository policy gate using locked tools. It does not rewrite files on commit.
|
|
63
|
+
CI runs the complete gate independently of local hook installation.
|
|
64
|
+
|
|
65
|
+
Open a focused issue before proposing a substantial behavior change. Branch from
|
|
66
|
+
current `main`, keep commits reviewable, and use the PR template. Explain the
|
|
67
|
+
problem, final behavior, exact verification, and compatibility risks. Every PR
|
|
68
|
+
must pass the required checks and resolve review conversations. Protected `main`
|
|
69
|
+
requires a PR and rejects force pushes and deletion. CI, secret scanning,
|
|
70
|
+
PR hygiene, current-base checks and resolved conversations apply to everyone,
|
|
71
|
+
including administrators, without exemptions.
|
|
72
|
+
|
|
73
|
+
A separate ruleset requires independent approval. While the repository has one
|
|
74
|
+
maintainer, `@suneel944` has a named exception to that review-only ruleset when
|
|
75
|
+
merging a PR. It does not exempt the account from any required check or permit
|
|
76
|
+
direct pushes. Revisit the review exception when additional maintainers join.
|
|
77
|
+
|
|
78
|
+
Use Conventional Commit PR titles, such as `fix: preserve pending messages` or
|
|
79
|
+
`ci: validate release metadata`; squash merges retain that title for automated
|
|
80
|
+
changelogs. Assign an owner, add a change-type label, and reference an existing
|
|
81
|
+
local issue with `Refs #N` or a closing keyword. Match linked issue milestones
|
|
82
|
+
when present. Release PRs always require a milestone. Bot-generated descriptions
|
|
83
|
+
retain their native format, but ownership and issue rules still apply.
|
|
84
|
+
|
|
85
|
+
Contribution text must omit generator credits, assistant attribution, robot
|
|
86
|
+
signatures, and assistant coauthor trailers. This applies to tracked files,
|
|
87
|
+
commit messages, PRs, issues, and comments, including closed items. Keep required
|
|
88
|
+
license notices and factual product documentation intact. Repository policy and
|
|
89
|
+
PR hygiene checks enforce the textual attribution boundary.
|
|
90
|
+
|
|
91
|
+
Release Please prepares a version and changelog PR after merges to `main`.
|
|
92
|
+
Package, plugin, marketplace and lockfile versions move together. The generated
|
|
93
|
+
PR gets an owner, release issue and milestone, and explicitly dispatched checks
|
|
94
|
+
because GitHub's workflow token does not trigger workflows on its own PR writes.
|
|
95
|
+
Review and merge it through the normal protected-branch gate. Publication creates
|
|
96
|
+
a draft, runs `make check` and the history secret scan, attaches release bundles,
|
|
97
|
+
downloads and verifies their checksums, then publishes. Failed publication keeps
|
|
98
|
+
the release draft; rerun Release with its existing tag to retry. Published assets
|
|
99
|
+
are never overwritten. The release workflow can also publish a manually pushed
|
|
100
|
+
version tag, provided its commit belongs to `main` history.
|
|
101
|
+
|
|
102
|
+
Contributions are accepted under the repository's MIT license. Submit only work
|
|
103
|
+
you have the right to contribute. Follow CODE_OF_CONDUCT.md and report security
|
|
104
|
+
issues using SECURITY.md rather than public issue templates.
|
|
105
|
+
|
|
106
|
+
Run focused checks while editing. Before submitting implementation changes, run:
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
make check
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
CI runs the same locked dependency, lint, formatting, typing, policy, build, and
|
|
113
|
+
test gate. A separate secret scan examines Git history. Actions are pinned to
|
|
114
|
+
commit IDs and receive read-only permissions unless release publication needs
|
|
115
|
+
write access. Dependency updates are proposed through Dependabot PRs.
|
|
116
|
+
Do not weaken
|
|
117
|
+
checks to make a change pass. Explain any narrowly justified rule exception.
|
|
118
|
+
Tests should exercise behavior, especially concurrency, persistence, cancellation,
|
|
119
|
+
and permission boundaries. Distinguish real MCP transport tests from native model
|
|
120
|
+
behavior; the latter requires an explicit two-terminal trial.
|
|
121
|
+
|
|
122
|
+
Update the README and architecture diagrams when responsibilities or flows change.
|
|
123
|
+
Keep runtime code in the top-level `agent_parley/` package. `make build` must
|
|
124
|
+
produce an installable wheel and a source archive containing both native plugin
|
|
125
|
+
manifests and the shared skill. The installed-package test uses a temporary tool
|
|
126
|
+
environment outside the checkout to catch accidental source-tree imports.
|
|
127
|
+
Keep changes scoped and review the final diff for accidental credentials, runtime
|
|
128
|
+
artifacts, and unrelated edits. Publish the commands actually run and their results.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Suneel Kaushik S
|
|
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
|
|
13
|
+
all 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
|
|
21
|
+
THE SOFTWARE.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
.PHONY: install install-dev install-system build check release-artifacts benchmark
|
|
2
|
+
install:
|
|
3
|
+
@set -eu; \
|
|
4
|
+
bridge_requirements=$$(mktemp); \
|
|
5
|
+
trap 'rm -f "$$bridge_requirements"' EXIT; \
|
|
6
|
+
uv export --locked --no-dev --no-emit-project --no-hashes > "$$bridge_requirements"; \
|
|
7
|
+
uv tool install --python 3.12 . --with-requirements "$$bridge_requirements"
|
|
8
|
+
|
|
9
|
+
install-dev:
|
|
10
|
+
@set -eu; \
|
|
11
|
+
bridge_requirements=$$(mktemp); \
|
|
12
|
+
trap 'rm -f "$$bridge_requirements"' EXIT; \
|
|
13
|
+
uv export --locked --no-dev --no-emit-project --no-hashes > "$$bridge_requirements"; \
|
|
14
|
+
uv tool install --python 3.12 --editable . --with-requirements "$$bridge_requirements"
|
|
15
|
+
|
|
16
|
+
install-system:
|
|
17
|
+
@test "$$(id -u)" -eq 0 || { echo 'Run sudo env "PATH=$$PATH" make install-system'; exit 1; }
|
|
18
|
+
UV_TOOL_DIR=/opt/agent-parley/tools UV_TOOL_BIN_DIR=/usr/local/bin \
|
|
19
|
+
UV_PYTHON_INSTALL_DIR=/opt/agent-parley/python $(MAKE) install
|
|
20
|
+
|
|
21
|
+
build:
|
|
22
|
+
uv build --no-sources
|
|
23
|
+
|
|
24
|
+
release-artifacts: build
|
|
25
|
+
uv run --locked python scripts/release_artifacts.py
|
|
26
|
+
|
|
27
|
+
benchmark:
|
|
28
|
+
uv run --locked python scripts/benchmark.py
|
|
29
|
+
|
|
30
|
+
check:
|
|
31
|
+
uv sync --locked
|
|
32
|
+
uv run --locked ruff check .
|
|
33
|
+
uv run --locked ruff format --check .
|
|
34
|
+
uv run --locked mypy
|
|
35
|
+
uv run --locked python scripts/check_policy.py
|
|
36
|
+
$(MAKE) build
|
|
37
|
+
uv run --locked pytest -q
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: agent-parley
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Run several coding agents in isolated worktrees with shared coordination.
|
|
5
|
+
Project-URL: Repository, https://github.com/suneel944/agent-parley
|
|
6
|
+
Project-URL: Issues, https://github.com/suneel944/agent-parley/issues
|
|
7
|
+
Author-email: Suneel Kaushik S <suneel944@gmail.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: agents,claude-code,codex,coordination,git-worktree,mcp
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
17
|
+
Requires-Python: >=3.12
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<img src="https://cdn.jsdelivr.net/gh/suneel944/agent-parley@main/docs/assets/agent-parley.png" width="560" alt="Agent Parley — separate work, shared context">
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
<p align="center">
|
|
25
|
+
<strong>Separate worktrees. Shared context. One screen.</strong>
|
|
26
|
+
</p>
|
|
27
|
+
|
|
28
|
+
<p align="center">
|
|
29
|
+
Run several coding agents at once and know who owns what.<br>
|
|
30
|
+
Every claim, handoff and refusal is recorded, attributed and visible.
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
<p align="center">
|
|
34
|
+
<a href="https://github.com/suneel944/agent-parley/releases"><img src="https://img.shields.io/github/v/release/suneel944/agent-parley?style=flat&color=blue" alt="Release"></a>
|
|
35
|
+
<a href="#install"><img src="https://img.shields.io/badge/runtime_dependencies-0-brightgreen?style=flat" alt="Zero runtime dependencies"></a>
|
|
36
|
+
<a href="#install"><img src="https://img.shields.io/badge/python-3.12%2B-blue?style=flat" alt="Python 3.12+"></a>
|
|
37
|
+
<a href="#providers-and-accounts"><img src="https://img.shields.io/badge/native_CLIs-claude_%2B_codex-orange?style=flat" alt="claude and codex"></a>
|
|
38
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=flat" alt="MIT license"></a>
|
|
39
|
+
</p>
|
|
40
|
+
|
|
41
|
+
<p align="center">
|
|
42
|
+
<a href="#see-it">See it</a> ·
|
|
43
|
+
<a href="#install">Install</a> ·
|
|
44
|
+
<a href="#run-it">Run</a> ·
|
|
45
|
+
<a href="#what-it-enforces">Enforce</a> ·
|
|
46
|
+
<a href="#watch-one-provider">Filter</a> ·
|
|
47
|
+
<a href="#providers-and-accounts">Providers</a> ·
|
|
48
|
+
<a href="docs/architecture.md">Docs</a> ·
|
|
49
|
+
<a href="#what-it-does-not-do">Limits</a>
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## See it
|
|
55
|
+
|
|
56
|
+
Launch a lane, see who owns what, watch every lane at once, narrow to one
|
|
57
|
+
provider, and watch a hook refuse a branch switch inside an assigned lane.
|
|
58
|
+
|
|
59
|
+
<p align="center">
|
|
60
|
+
<img src="https://cdn.jsdelivr.net/gh/suneel944/agent-parley@main/docs/assets/screenshot-top.svg" width="900" alt="agent-parley top showing three lanes with issues, mail, leases, denials and served calls">
|
|
61
|
+
</p>
|
|
62
|
+
|
|
63
|
+
One screen for every lane: session state, branch drift, issues owned, handoffs
|
|
64
|
+
pending, unread mail, held reservations, delivered context, and what enforcement
|
|
65
|
+
denied. Read-only, no model call, `q` quits.
|
|
66
|
+
|
|
67
|
+
Every frame on this page is real command output from a demo project. Only the
|
|
68
|
+
state and project paths are shortened.
|
|
69
|
+
|
|
70
|
+
## Install
|
|
71
|
+
|
|
72
|
+
Linux with pidfd support, Git, and [uv](https://docs.astral.sh/uv/). No clone.
|
|
73
|
+
The wheel needs no third-party runtime packages.
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
uv tool install agent-parley
|
|
77
|
+
# to track the default branch instead:
|
|
78
|
+
# uv tool install git+https://github.com/suneel944/agent-parley
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Then add the plugin to whichever CLI you drive. One marketplace serves both.
|
|
82
|
+
|
|
83
|
+
```sh
|
|
84
|
+
claude plugin marketplace add suneel944/agent-parley
|
|
85
|
+
claude plugin install agent-parley@agent-parley-local
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
codex plugin marketplace add suneel944/agent-parley
|
|
90
|
+
codex plugin add agent-parley@agent-parley-local
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
The plugin carries the shared `coordinate` skill, so an agent can read
|
|
94
|
+
coordination state, claim an issue and hand work off in its own words. It is deliberately
|
|
95
|
+
skill-only: the launcher supplies MCP configuration and lifecycle hooks per
|
|
96
|
+
session, and it is also what creates the worktrees and runs the coordination
|
|
97
|
+
service. The plugin alone gives an agent the skill and nothing to coordinate
|
|
98
|
+
through.
|
|
99
|
+
|
|
100
|
+
For a pinned, checksummed install, take a wheel from
|
|
101
|
+
[Releases](https://github.com/suneel944/agent-parley/releases) instead.
|
|
102
|
+
|
|
103
|
+
## Run it
|
|
104
|
+
|
|
105
|
+
From a committed, clean checkout, one terminal per agent:
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
# Terminal 1
|
|
109
|
+
agent-parley run claude
|
|
110
|
+
|
|
111
|
+
# Terminal 2
|
|
112
|
+
agent-parley run codex
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
That is the whole setup. The first run registers the repository, creates that
|
|
116
|
+
participant's worktree and branch, starts the coordination service, and hands
|
|
117
|
+
you the native CLI. Prompt it exactly as you always do.
|
|
118
|
+
|
|
119
|
+
A new name creates its own lane, so a second account of the same provider, or
|
|
120
|
+
another provider, is one more terminal:
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
agent-parley credentials add account-2 --config-home ~/.claude-account-2
|
|
124
|
+
agent-parley run claude-2 --provider claude --credentials account-2
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Then watch the work:
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
agent-parley status # ownership, activity and reported results
|
|
131
|
+
agent-parley top # every lane live, including what enforcement denied
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
When a lane's work is ready, integrate it from the base checkout:
|
|
135
|
+
|
|
136
|
+
```sh
|
|
137
|
+
agent-parley participant merge claude-2
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
It always records a merge commit, refuses on a running session, a dirty tree or
|
|
141
|
+
a drifted lane, and leaves a conflict in place for you to resolve. It never
|
|
142
|
+
resets, cleans, stashes or force-switches.
|
|
143
|
+
|
|
144
|
+
## What it enforces
|
|
145
|
+
|
|
146
|
+
**Ownership changes only through explicit claims and accepted handoffs.** No
|
|
147
|
+
timeout and no process exit moves an issue. `agent-parley status` reports who
|
|
148
|
+
owns what, which handoff is waiting on an offer ID, and any lane that left its
|
|
149
|
+
assigned branch. An owner can record that one issue waits on another with
|
|
150
|
+
`agent-parley issue block 42 --on 17`; the listing then names who holds the
|
|
151
|
+
blocking issue, and every lane sees the change at its next checkpoint. A
|
|
152
|
+
recorded dependency informs, it does not gate.
|
|
153
|
+
|
|
154
|
+
<p align="center">
|
|
155
|
+
<img src="https://cdn.jsdelivr.net/gh/suneel944/agent-parley@main/docs/assets/screenshot-status.svg" width="880" alt="agent-parley status listing issue owners, a pending handoff, and a lane on the wrong branch">
|
|
156
|
+
</p>
|
|
157
|
+
|
|
158
|
+
<p align="center">
|
|
159
|
+
<img src="https://cdn.jsdelivr.net/gh/suneel944/agent-parley@main/docs/assets/screenshot-issues.svg" width="880" alt="agent-parley issue list showing an issue that waits on another, the participant holding it, and a pending handoff with its offer ID">
|
|
160
|
+
</p>
|
|
161
|
+
|
|
162
|
+
**Native hooks decide before the tool runs.** They block branch changes inside
|
|
163
|
+
an assigned lane, catch drift after any bypass, and deliver short updates only
|
|
164
|
+
when coordination state actually changes. Each notice is capped at 1,536 UTF-8
|
|
165
|
+
bytes; an unchanged checkpoint adds no context at all.
|
|
166
|
+
|
|
167
|
+
<p align="center">
|
|
168
|
+
<img src="https://cdn.jsdelivr.net/gh/suneel944/agent-parley@main/docs/assets/screenshot-hooks.svg" width="820" alt="Two hook denials with their reasons, and the bounded briefing a session start receives">
|
|
169
|
+
</p>
|
|
170
|
+
|
|
171
|
+
**Seven scoped MCP tools carry the coordination.** Conflicting reservations
|
|
172
|
+
grant nothing and name the blocking owner with that owner's declared reason.
|
|
173
|
+
Sends need an idempotency key, so a retry returns the original message instead
|
|
174
|
+
of a duplicate. Fetching an inbox never marks a message read.
|
|
175
|
+
|
|
176
|
+
<p align="center">
|
|
177
|
+
<img src="https://cdn.jsdelivr.net/gh/suneel944/agent-parley@main/docs/assets/screenshot-coordination.svg" width="880" alt="A granted reservation, a denied one naming the blocking owner, a deduplicated send, and an inbox page">
|
|
178
|
+
</p>
|
|
179
|
+
|
|
180
|
+
Enforcement is recorded, not discarded. Every hook decision carries an
|
|
181
|
+
enumerated reason and lands in that participant's event log; every served call
|
|
182
|
+
is recorded inside the transaction that carried its effect. That is why `top`
|
|
183
|
+
can show what was denied, to whom, and how often.
|
|
184
|
+
|
|
185
|
+
That history is bounded, and it can leave the state directory. A lane keeps two
|
|
186
|
+
event files and discards records older than fourteen days, so `top` reports
|
|
187
|
+
recent enforcement rather than the whole project. `--since` narrows any count
|
|
188
|
+
to a window, and `events export` writes the retained records as JSON Lines you
|
|
189
|
+
can keep for as long as you need:
|
|
190
|
+
|
|
191
|
+
```sh
|
|
192
|
+
agent-parley top --since 6h
|
|
193
|
+
agent-parley events export --since 7d --output enforcement.jsonl
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Watch one provider
|
|
197
|
+
|
|
198
|
+
With a dozen lanes open, the whole table is rarely what you want. `--provider`
|
|
199
|
+
narrows the view to the participants driven by one provider, and the header
|
|
200
|
+
counts only the rows it shows:
|
|
201
|
+
|
|
202
|
+
```sh
|
|
203
|
+
agent-parley top --provider codex
|
|
204
|
+
agent-parley top --provider claude --provider codex
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Providers and accounts
|
|
208
|
+
|
|
209
|
+
A provider states which native CLI drives a participant and how that CLI reaches
|
|
210
|
+
a model. Every provider drives one of two adapters, which is why two plugin
|
|
211
|
+
installations cover all of them:
|
|
212
|
+
|
|
213
|
+
| Provider | Native CLI it drives | Plugin that carries `coordinate` |
|
|
214
|
+
| --- | --- | --- |
|
|
215
|
+
| `claude` | `claude` | Claude Code |
|
|
216
|
+
| `codex` | `codex` | Codex |
|
|
217
|
+
| `deepseek`, `kimi`, `grok` | `claude` or `codex`, vendor endpoint | that adapter's plugin |
|
|
218
|
+
| your own, via `agent-parley provider add` | the adapter you name | that adapter's plugin |
|
|
219
|
+
|
|
220
|
+
`claude` and `codex` work out of the box. The `deepseek`, `kimi` and `grok`
|
|
221
|
+
presets carry no endpoint, so their base URL and key must be exported in the
|
|
222
|
+
launching shell; the launcher refuses to start when a required variable is unset
|
|
223
|
+
rather than falling back to another account. Coordination state records variable
|
|
224
|
+
names and config directories, never credential values.
|
|
225
|
+
|
|
226
|
+
Credential profiles point a provider's config-home variable at a separate
|
|
227
|
+
directory, so one provider can run under several logins. Up to 32 participants
|
|
228
|
+
per project.
|
|
229
|
+
|
|
230
|
+
## How it fits together
|
|
231
|
+
|
|
232
|
+
```mermaid
|
|
233
|
+
flowchart TD
|
|
234
|
+
Repo[Your repository] --> Launcher[Agent Parley launcher]
|
|
235
|
+
Launcher --> Claude[Participant · own worktree]
|
|
236
|
+
Launcher --> Codex[Participant · own worktree]
|
|
237
|
+
Claude <-->|Seven scoped MCP tools| Server[Local coordination service]
|
|
238
|
+
Codex <-->|Seven scoped MCP tools| Server
|
|
239
|
+
Server --> DB[(SQLite WAL · mail and reservations)]
|
|
240
|
+
Claude --> Claims[Atomic issue claims and handoffs]
|
|
241
|
+
Codex --> Claims
|
|
242
|
+
DB --> Hooks[Native checkpoints · bounded updates]
|
|
243
|
+
Claims --> Hooks
|
|
244
|
+
Hooks -.-> Claude
|
|
245
|
+
Hooks -.-> Codex
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
The coordination engine is built in-house with Python's standard library. It has
|
|
249
|
+
no runtime dependencies and makes no model calls. Your existing logins and
|
|
250
|
+
permission settings still apply.
|
|
251
|
+
|
|
252
|
+
## What it does not do
|
|
253
|
+
|
|
254
|
+
Worktrees and reservations are coordination boundaries, not OS sandboxes. Agent
|
|
255
|
+
Bridge does not merge branches, approve commands, or wake idle agents. Reported
|
|
256
|
+
`ready` is ready for review, not verified completion. Token usage still depends
|
|
257
|
+
on the native agents; the bridge reports injected bytes rather than claiming a
|
|
258
|
+
token-saving percentage.
|
|
259
|
+
|
|
260
|
+
## Contributing
|
|
261
|
+
|
|
262
|
+
Run `make check` before opening a PR. It checks formatting, lint, typing,
|
|
263
|
+
documentation rules, package builds, and behavior tests.
|
|
264
|
+
|
|
265
|
+
[Contributing](CONTRIBUTING.md) · [Architecture](docs/architecture.md) ·
|
|
266
|
+
[Operations](docs/operations.md) · [Security](SECURITY.md) ·
|
|
267
|
+
[Code of Conduct](CODE_OF_CONDUCT.md) · [MIT license](LICENSE)
|