coprogrammer 0.2.0a2__tar.gz → 0.3.0a2__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.
- coprogrammer-0.3.0a2/PKG-INFO +210 -0
- coprogrammer-0.3.0a2/README.md +169 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/pyproject.toml +2 -2
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/__init__.py +1 -1
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/skills/coprogrammer-active-sync/SKILL.md +39 -2
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/templates/handoff.md +8 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/cli.py +13 -1
- coprogrammer-0.3.0a2/src/coprogrammer/evidence.py +161 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/manager_store.py +21 -4
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/mcp_server.py +7 -0
- coprogrammer-0.3.0a2/src/coprogrammer/onboarding.py +181 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/setup.py +15 -7
- coprogrammer-0.3.0a2/src/coprogrammer/workflow.py +191 -0
- coprogrammer-0.3.0a2/src/coprogrammer/workflow_cli.py +93 -0
- coprogrammer-0.3.0a2/src/coprogrammer/workflow_mcp.py +49 -0
- coprogrammer-0.3.0a2/src/coprogrammer/workspace.py +256 -0
- coprogrammer-0.3.0a2/src/coprogrammer.egg-info/PKG-INFO +210 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer.egg-info/SOURCES.txt +9 -1
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_manager_store.py +88 -0
- coprogrammer-0.3.0a2/tests/test_onboarding.py +201 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_setup.py +34 -0
- coprogrammer-0.3.0a2/tests/test_workspace_workflow.py +372 -0
- coprogrammer-0.2.0a2/PKG-INFO +0 -383
- coprogrammer-0.2.0a2/README.md +0 -342
- coprogrammer-0.2.0a2/src/coprogrammer.egg-info/PKG-INFO +0 -383
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/LICENSE +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/setup.cfg +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/__main__.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/skills/coprogrammer-integration-plan/SKILL.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/skills/coprogrammer-pr-digest-review/SKILL.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/skills/coprogrammer-project-covenant/SKILL.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/skills/coprogrammer-project-setup/SKILL.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/skills/coprogrammer-task-brief/SKILL.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/templates/AGENTS.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/templates/CLAUDE.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/templates/COORDINATION.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/templates/copilot-instructions.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/assets/templates/task-brief.md +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/briefing.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/channels.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/collaboration.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/collaboration_cli.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/collaboration_mcp.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/demo.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/integrations.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/knowledge.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/knowledge_mcp.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/providers.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/review.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/review_summary.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/scheduler.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/scheduler_cli.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer/scheduler_mcp.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer.egg-info/dependency_links.txt +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer.egg-info/entry_points.txt +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/src/coprogrammer.egg-info/top_level.txt +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_briefing.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_channels.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_cli.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_collaboration.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_collaboration_processes.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_demo.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_integrations.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_knowledge.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_knowledge_mcp.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_manager_performance.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_mcp_robustness.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_plugin_package.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_providers.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_review.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_review_summary.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_review_summary_cli.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_scheduler.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_scheduling_integration.py +0 -0
- {coprogrammer-0.2.0a2 → coprogrammer-0.3.0a2}/tests/test_upgrade_cli.py +0 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: coprogrammer
|
|
3
|
+
Version: 0.3.0a2
|
|
4
|
+
Summary: Shared tasks, file boundaries and handoffs for coding agents.
|
|
5
|
+
Author: Qiu Guanzong
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Qiu Guanzong
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: Homepage, https://github.com/QIU-Guanzong/CoProgrammer
|
|
29
|
+
Project-URL: Repository, https://github.com/QIU-Guanzong/CoProgrammer
|
|
30
|
+
Project-URL: Issues, https://github.com/QIU-Guanzong/CoProgrammer/issues
|
|
31
|
+
Keywords: ai,software-development,multi-agent,merge,code-review
|
|
32
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
33
|
+
Classifier: Intended Audience :: Developers
|
|
34
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
35
|
+
Classifier: Programming Language :: Python :: 3
|
|
36
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
37
|
+
Requires-Python: >=3.10
|
|
38
|
+
Description-Content-Type: text/markdown
|
|
39
|
+
License-File: LICENSE
|
|
40
|
+
Dynamic: license-file
|
|
41
|
+
|
|
42
|
+
# CoProgrammer
|
|
43
|
+
|
|
44
|
+
**Teamwork for coding agents.**
|
|
45
|
+
|
|
46
|
+
Shared tasks, file boundaries and durable handoffs for **Codex, Claude Code and
|
|
47
|
+
GitHub Copilot** working in the same Git repository.
|
|
48
|
+
|
|
49
|
+
[](https://github.com/QIU-Guanzong/CoProgrammer/actions/workflows/ci.yml)
|
|
50
|
+
[](LICENSE)
|
|
51
|
+
|
|
52
|
+
[简体中文](README.zh-CN.md) · [Try it](#try-the-preview) ·
|
|
53
|
+
[Two-window walkthrough](docs/GETTING_STARTED.md) ·
|
|
54
|
+
[Connect your client](docs/knowledge/README.md) · [Releases](https://github.com/QIU-Guanzong/CoProgrammer/releases)
|
|
55
|
+
|
|
56
|
+
## The problem
|
|
57
|
+
|
|
58
|
+
Codex is changing an API. Claude is updating its callers. Both need to know who
|
|
59
|
+
owns the files, when the upstream task is finished, and what happened before a
|
|
60
|
+
window restarted. Separate Git branches keep edits apart; the collaboration
|
|
61
|
+
still needs shared state.
|
|
62
|
+
|
|
63
|
+
CoProgrammer records **who owns a task, which paths it covers, what blocks it,
|
|
64
|
+
and what the next window needs to know**. Your coding tools write the code;
|
|
65
|
+
CoProgrammer coordinates their work through a local CLI and MCP server.
|
|
66
|
+
|
|
67
|
+
| Without a shared record | With CoProgrammer |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| Two windows try to claim overlapping work | Atomic task claims check owners, worktrees and path leases. |
|
|
70
|
+
| A worker starts before an upstream task finishes | Dependencies keep the task blocked until its prerequisite is done. |
|
|
71
|
+
| A handoff disappears in a terminal | Messages and explicit receipts persist across restarts. |
|
|
72
|
+
| A passing test refers to yesterday's files | Check receipts detect changed content, command, runtime or age. |
|
|
73
|
+
| Another computer has a different checkout | A portable handoff compares package version, HEAD, base and file content. |
|
|
74
|
+
|
|
75
|
+
## Try the preview
|
|
76
|
+
|
|
77
|
+
Requires **Python 3.10+** and **Git 2.36+**. Use an active Python virtual environment.
|
|
78
|
+
There are no runtime Python dependencies or model keys needed for the demo.
|
|
79
|
+
|
|
80
|
+
```sh
|
|
81
|
+
python -m pip install --pre --upgrade coprogrammer
|
|
82
|
+
coprogrammer demo
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The demo creates two real Git worktrees, runs task claims, dependency and overlap
|
|
86
|
+
checks, sends a handoff, acknowledges it and completes the tasks. It checks each
|
|
87
|
+
result and cleans up the temporary project. No coding client or model is launched.
|
|
88
|
+
|
|
89
|
+
An excerpt from an actual run:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
[passed] Create two Git worktrees: Two branches share one repository and one Manager event log.
|
|
93
|
+
[passed] Block unfinished dependencies: Claude cannot claim documentation until the API task is finished.
|
|
94
|
+
[passed] Reject overlapping work: A different worktree cannot claim src/api.py while Codex holds src/**.
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
[What the demo checks →](docs/DEMO.md)
|
|
98
|
+
|
|
99
|
+
## Use it in your project
|
|
100
|
+
|
|
101
|
+
The `start` and `status` entry points require **0.3.0a2+**. Start in a committed Git
|
|
102
|
+
checkout on a named branch. Each coding window should use its own Git worktree.
|
|
103
|
+
Add `.coprogrammer/` to your project's `.gitignore` to keep local runtime state
|
|
104
|
+
out of commits.
|
|
105
|
+
|
|
106
|
+
```sh
|
|
107
|
+
# In the worktree used by Codex
|
|
108
|
+
coprogrammer start --client codex --session codex-api --task api-v2
|
|
109
|
+
coprogrammer status --session codex-api
|
|
110
|
+
|
|
111
|
+
# In the separate worktree used by Claude Code
|
|
112
|
+
coprogrammer start --client claude --session claude-ui --task api-v2
|
|
113
|
+
coprogrammer status --session claude-ui
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`start` registers this window and previews client setup. It does not launch a
|
|
117
|
+
coding tool or install configuration. Add `--dry-run` to preview registration;
|
|
118
|
+
use `--resume` to explicitly refresh the same registered window after a break.
|
|
119
|
+
Status reads never refresh sessions. Default session freshness lasts five minutes.
|
|
120
|
+
|
|
121
|
+
In the Codex worktree, create a scoped task and inspect the next action:
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
coprogrammer manager task create --session codex-api --id api-v2 --title 'Update the API' --pattern 'src/api/**' --client codex
|
|
125
|
+
coprogrammer status --session codex-api
|
|
126
|
+
coprogrammer manager task claim --session codex-api --id api-v2
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Claims return an ownership token. Use it with the existing guard and finish
|
|
130
|
+
commands; the [two-window walkthrough](docs/GETTING_STARTED.md) covers dependency
|
|
131
|
+
setup, messages, receipts and completion. Status distinguishes repository-wide
|
|
132
|
+
readiness from work eligible for the selected window.
|
|
133
|
+
|
|
134
|
+
### Connect Codex, Claude Code or Copilot
|
|
135
|
+
|
|
136
|
+
Preview the project-local Skills, Markdown guidance and MCP configuration:
|
|
137
|
+
|
|
138
|
+
```sh
|
|
139
|
+
coprogrammer setup --client codex --include-content
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Review the output, then explicitly create missing files:
|
|
143
|
+
|
|
144
|
+
```sh
|
|
145
|
+
coprogrammer setup --client codex --apply
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Use `claude` or `copilot` for those clients. Existing project instructions are
|
|
149
|
+
preserved; differing Skills or MCP configuration are reported as conflicts.
|
|
150
|
+
Reload the client and follow its normal project/MCP trust flow. Generated
|
|
151
|
+
configuration alone does not establish a connection.
|
|
152
|
+
|
|
153
|
+
MCP exposes the same local workflows. `workspace_status` provides the combined
|
|
154
|
+
status view; `task_dispatch` previews eligible tasks. The packaged plugin
|
|
155
|
+
contains six Skills, and the CLI serves twelve read-only Markdown resources.
|
|
156
|
+
[Client setup](docs/knowledge/README.md) · [Plugin installation](docs/PLUGIN_QUICKSTART.md)
|
|
157
|
+
|
|
158
|
+
## What else can it do?
|
|
159
|
+
|
|
160
|
+
| Need | Entry point |
|
|
161
|
+
| --- | --- |
|
|
162
|
+
| Inspect work and blockers | `coprogrammer status`; [status guide](docs/GETTING_STARTED.md) |
|
|
163
|
+
| Send and acknowledge handoffs | `manager message`; [communication guide](docs/AGENT_RUNTIME_INTEROP.md) |
|
|
164
|
+
| Check file scope before edits | `manager task guard`; [scheduling guide](docs/MULTI_PLATFORM_QUICKSTART.md) |
|
|
165
|
+
| Detect stale test results | `check run` / `check verify`; [check receipts](docs/VALIDATION_EVIDENCE.md) |
|
|
166
|
+
| Continue on another computer | `manager handoff` / `workspace compare`; [portable handoffs](docs/WORKSPACE_HANDOFF.md) |
|
|
167
|
+
| Review a branch for integration | `digest` / `integration-plan`; [CLI reference](docs/GETTING_STARTED.md#prepare-a-pr) |
|
|
168
|
+
| Request a second opinion | Explicit Claude, GLM or DeepSeek review; [multi-platform guide](docs/MULTI_PLATFORM_QUICKSTART.md) |
|
|
169
|
+
|
|
170
|
+
## How it fits
|
|
171
|
+
|
|
172
|
+
Use CoProgrammer when you already run coding agents and need shared ownership,
|
|
173
|
+
communication and review evidence across their worktrees. It complements your
|
|
174
|
+
existing coding tools and GitHub review process.
|
|
175
|
+
|
|
176
|
+
[gstack](https://github.com/garrytan/gstack) provides opinionated development and
|
|
177
|
+
review workflows; [Beads](https://github.com/gastownhall/beads) provides persistent
|
|
178
|
+
agent work tracking; [Gas Town](https://github.com/gastownhall/gastown) manages
|
|
179
|
+
multi-agent workspaces and orchestration. CoProgrammer focuses on local task
|
|
180
|
+
ownership, path coordination, durable handoffs and inspectable integration
|
|
181
|
+
artifacts through a small Python CLI/MCP package.
|
|
182
|
+
[Comparison and design choices →](docs/research/onboarding-2026-10-12.md)
|
|
183
|
+
|
|
184
|
+
Local worktrees share a Manager. Independent clones have separate Managers:
|
|
185
|
+
portable handoffs compare context and do not transfer a global lease. Path
|
|
186
|
+
leases are cooperative checks, not filesystem permissions. Check records are
|
|
187
|
+
unauthenticated local evidence. PR approval and merging follow your project's
|
|
188
|
+
normal rules. The demo does not establish native client or live provider connectivity.
|
|
189
|
+
|
|
190
|
+
## Contribute or get help
|
|
191
|
+
|
|
192
|
+
[Report a reproducible problem](https://github.com/QIU-Guanzong/CoProgrammer/issues) ·
|
|
193
|
+
[Propose an integration](https://github.com/QIU-Guanzong/CoProgrammer/discussions) ·
|
|
194
|
+
[Contributor guide](CONTRIBUTING.md)
|
|
195
|
+
|
|
196
|
+
Good first contributions include a small client setup example, a clearer error
|
|
197
|
+
message or a regression for a real worktree conflict. Include the command,
|
|
198
|
+
version, expected result and actual result; remove private code and credentials.
|
|
199
|
+
If CoProgrammer helps your team, a star helps others discover it.
|
|
200
|
+
|
|
201
|
+
For source development:
|
|
202
|
+
|
|
203
|
+
```sh
|
|
204
|
+
git clone https://github.com/QIU-Guanzong/CoProgrammer.git
|
|
205
|
+
cd CoProgrammer
|
|
206
|
+
python -m pip install -e .
|
|
207
|
+
python -m unittest discover -s tests
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
[MIT license](LICENSE). Preview software; feedback and concrete bug reports are welcome.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# CoProgrammer
|
|
2
|
+
|
|
3
|
+
**Teamwork for coding agents.**
|
|
4
|
+
|
|
5
|
+
Shared tasks, file boundaries and durable handoffs for **Codex, Claude Code and
|
|
6
|
+
GitHub Copilot** working in the same Git repository.
|
|
7
|
+
|
|
8
|
+
[](https://github.com/QIU-Guanzong/CoProgrammer/actions/workflows/ci.yml)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
|
|
11
|
+
[简体中文](README.zh-CN.md) · [Try it](#try-the-preview) ·
|
|
12
|
+
[Two-window walkthrough](docs/GETTING_STARTED.md) ·
|
|
13
|
+
[Connect your client](docs/knowledge/README.md) · [Releases](https://github.com/QIU-Guanzong/CoProgrammer/releases)
|
|
14
|
+
|
|
15
|
+
## The problem
|
|
16
|
+
|
|
17
|
+
Codex is changing an API. Claude is updating its callers. Both need to know who
|
|
18
|
+
owns the files, when the upstream task is finished, and what happened before a
|
|
19
|
+
window restarted. Separate Git branches keep edits apart; the collaboration
|
|
20
|
+
still needs shared state.
|
|
21
|
+
|
|
22
|
+
CoProgrammer records **who owns a task, which paths it covers, what blocks it,
|
|
23
|
+
and what the next window needs to know**. Your coding tools write the code;
|
|
24
|
+
CoProgrammer coordinates their work through a local CLI and MCP server.
|
|
25
|
+
|
|
26
|
+
| Without a shared record | With CoProgrammer |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| Two windows try to claim overlapping work | Atomic task claims check owners, worktrees and path leases. |
|
|
29
|
+
| A worker starts before an upstream task finishes | Dependencies keep the task blocked until its prerequisite is done. |
|
|
30
|
+
| A handoff disappears in a terminal | Messages and explicit receipts persist across restarts. |
|
|
31
|
+
| A passing test refers to yesterday's files | Check receipts detect changed content, command, runtime or age. |
|
|
32
|
+
| Another computer has a different checkout | A portable handoff compares package version, HEAD, base and file content. |
|
|
33
|
+
|
|
34
|
+
## Try the preview
|
|
35
|
+
|
|
36
|
+
Requires **Python 3.10+** and **Git 2.36+**. Use an active Python virtual environment.
|
|
37
|
+
There are no runtime Python dependencies or model keys needed for the demo.
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
python -m pip install --pre --upgrade coprogrammer
|
|
41
|
+
coprogrammer demo
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The demo creates two real Git worktrees, runs task claims, dependency and overlap
|
|
45
|
+
checks, sends a handoff, acknowledges it and completes the tasks. It checks each
|
|
46
|
+
result and cleans up the temporary project. No coding client or model is launched.
|
|
47
|
+
|
|
48
|
+
An excerpt from an actual run:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
[passed] Create two Git worktrees: Two branches share one repository and one Manager event log.
|
|
52
|
+
[passed] Block unfinished dependencies: Claude cannot claim documentation until the API task is finished.
|
|
53
|
+
[passed] Reject overlapping work: A different worktree cannot claim src/api.py while Codex holds src/**.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
[What the demo checks →](docs/DEMO.md)
|
|
57
|
+
|
|
58
|
+
## Use it in your project
|
|
59
|
+
|
|
60
|
+
The `start` and `status` entry points require **0.3.0a2+**. Start in a committed Git
|
|
61
|
+
checkout on a named branch. Each coding window should use its own Git worktree.
|
|
62
|
+
Add `.coprogrammer/` to your project's `.gitignore` to keep local runtime state
|
|
63
|
+
out of commits.
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
# In the worktree used by Codex
|
|
67
|
+
coprogrammer start --client codex --session codex-api --task api-v2
|
|
68
|
+
coprogrammer status --session codex-api
|
|
69
|
+
|
|
70
|
+
# In the separate worktree used by Claude Code
|
|
71
|
+
coprogrammer start --client claude --session claude-ui --task api-v2
|
|
72
|
+
coprogrammer status --session claude-ui
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`start` registers this window and previews client setup. It does not launch a
|
|
76
|
+
coding tool or install configuration. Add `--dry-run` to preview registration;
|
|
77
|
+
use `--resume` to explicitly refresh the same registered window after a break.
|
|
78
|
+
Status reads never refresh sessions. Default session freshness lasts five minutes.
|
|
79
|
+
|
|
80
|
+
In the Codex worktree, create a scoped task and inspect the next action:
|
|
81
|
+
|
|
82
|
+
```sh
|
|
83
|
+
coprogrammer manager task create --session codex-api --id api-v2 --title 'Update the API' --pattern 'src/api/**' --client codex
|
|
84
|
+
coprogrammer status --session codex-api
|
|
85
|
+
coprogrammer manager task claim --session codex-api --id api-v2
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Claims return an ownership token. Use it with the existing guard and finish
|
|
89
|
+
commands; the [two-window walkthrough](docs/GETTING_STARTED.md) covers dependency
|
|
90
|
+
setup, messages, receipts and completion. Status distinguishes repository-wide
|
|
91
|
+
readiness from work eligible for the selected window.
|
|
92
|
+
|
|
93
|
+
### Connect Codex, Claude Code or Copilot
|
|
94
|
+
|
|
95
|
+
Preview the project-local Skills, Markdown guidance and MCP configuration:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
coprogrammer setup --client codex --include-content
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Review the output, then explicitly create missing files:
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
coprogrammer setup --client codex --apply
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Use `claude` or `copilot` for those clients. Existing project instructions are
|
|
108
|
+
preserved; differing Skills or MCP configuration are reported as conflicts.
|
|
109
|
+
Reload the client and follow its normal project/MCP trust flow. Generated
|
|
110
|
+
configuration alone does not establish a connection.
|
|
111
|
+
|
|
112
|
+
MCP exposes the same local workflows. `workspace_status` provides the combined
|
|
113
|
+
status view; `task_dispatch` previews eligible tasks. The packaged plugin
|
|
114
|
+
contains six Skills, and the CLI serves twelve read-only Markdown resources.
|
|
115
|
+
[Client setup](docs/knowledge/README.md) · [Plugin installation](docs/PLUGIN_QUICKSTART.md)
|
|
116
|
+
|
|
117
|
+
## What else can it do?
|
|
118
|
+
|
|
119
|
+
| Need | Entry point |
|
|
120
|
+
| --- | --- |
|
|
121
|
+
| Inspect work and blockers | `coprogrammer status`; [status guide](docs/GETTING_STARTED.md) |
|
|
122
|
+
| Send and acknowledge handoffs | `manager message`; [communication guide](docs/AGENT_RUNTIME_INTEROP.md) |
|
|
123
|
+
| Check file scope before edits | `manager task guard`; [scheduling guide](docs/MULTI_PLATFORM_QUICKSTART.md) |
|
|
124
|
+
| Detect stale test results | `check run` / `check verify`; [check receipts](docs/VALIDATION_EVIDENCE.md) |
|
|
125
|
+
| Continue on another computer | `manager handoff` / `workspace compare`; [portable handoffs](docs/WORKSPACE_HANDOFF.md) |
|
|
126
|
+
| Review a branch for integration | `digest` / `integration-plan`; [CLI reference](docs/GETTING_STARTED.md#prepare-a-pr) |
|
|
127
|
+
| Request a second opinion | Explicit Claude, GLM or DeepSeek review; [multi-platform guide](docs/MULTI_PLATFORM_QUICKSTART.md) |
|
|
128
|
+
|
|
129
|
+
## How it fits
|
|
130
|
+
|
|
131
|
+
Use CoProgrammer when you already run coding agents and need shared ownership,
|
|
132
|
+
communication and review evidence across their worktrees. It complements your
|
|
133
|
+
existing coding tools and GitHub review process.
|
|
134
|
+
|
|
135
|
+
[gstack](https://github.com/garrytan/gstack) provides opinionated development and
|
|
136
|
+
review workflows; [Beads](https://github.com/gastownhall/beads) provides persistent
|
|
137
|
+
agent work tracking; [Gas Town](https://github.com/gastownhall/gastown) manages
|
|
138
|
+
multi-agent workspaces and orchestration. CoProgrammer focuses on local task
|
|
139
|
+
ownership, path coordination, durable handoffs and inspectable integration
|
|
140
|
+
artifacts through a small Python CLI/MCP package.
|
|
141
|
+
[Comparison and design choices →](docs/research/onboarding-2026-10-12.md)
|
|
142
|
+
|
|
143
|
+
Local worktrees share a Manager. Independent clones have separate Managers:
|
|
144
|
+
portable handoffs compare context and do not transfer a global lease. Path
|
|
145
|
+
leases are cooperative checks, not filesystem permissions. Check records are
|
|
146
|
+
unauthenticated local evidence. PR approval and merging follow your project's
|
|
147
|
+
normal rules. The demo does not establish native client or live provider connectivity.
|
|
148
|
+
|
|
149
|
+
## Contribute or get help
|
|
150
|
+
|
|
151
|
+
[Report a reproducible problem](https://github.com/QIU-Guanzong/CoProgrammer/issues) ·
|
|
152
|
+
[Propose an integration](https://github.com/QIU-Guanzong/CoProgrammer/discussions) ·
|
|
153
|
+
[Contributor guide](CONTRIBUTING.md)
|
|
154
|
+
|
|
155
|
+
Good first contributions include a small client setup example, a clearer error
|
|
156
|
+
message or a regression for a real worktree conflict. Include the command,
|
|
157
|
+
version, expected result and actual result; remove private code and credentials.
|
|
158
|
+
If CoProgrammer helps your team, a star helps others discover it.
|
|
159
|
+
|
|
160
|
+
For source development:
|
|
161
|
+
|
|
162
|
+
```sh
|
|
163
|
+
git clone https://github.com/QIU-Guanzong/CoProgrammer.git
|
|
164
|
+
cd CoProgrammer
|
|
165
|
+
python -m pip install -e .
|
|
166
|
+
python -m unittest discover -s tests
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
[MIT license](LICENSE). Preview software; feedback and concrete bug reports are welcome.
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "coprogrammer"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "
|
|
7
|
+
version = "0.3.0a2"
|
|
8
|
+
description = "Shared tasks, file boundaries and handoffs for coding agents."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
11
11
|
license = { file = "LICENSE" }
|
|
@@ -14,10 +14,24 @@ that does not require a live Manager read or write.
|
|
|
14
14
|
Use this workflow during coding when several agents, branches, or worktrees may
|
|
15
15
|
touch overlapping code or shared contracts.
|
|
16
16
|
|
|
17
|
+
## Quick entry points
|
|
18
|
+
|
|
19
|
+
With CLI 0.3.0a2+, inspect the current checkout using `coprogrammer status`.
|
|
20
|
+
For a registered window, use `coprogrammer status --session <window-id>` to
|
|
21
|
+
see work eligible for that client and worktree. Read-only status never pulses,
|
|
22
|
+
claims or acknowledges a message. MCP clients can call `workspace_status`.
|
|
23
|
+
|
|
24
|
+
To register a new window, preview `coprogrammer start --client <client> --session
|
|
25
|
+
<window-id> --task <task> --dry-run`, then run without `--dry-run` when authorized.
|
|
26
|
+
For the same existing window, explicitly add `--resume`; blocked/closed or
|
|
27
|
+
mismatched windows require reconciliation. Start never installs client files
|
|
28
|
+
or launches an agent. Keep the existing preview-first setup workflow.
|
|
29
|
+
|
|
17
30
|
## Workflow
|
|
18
31
|
|
|
19
|
-
For cross-window work,
|
|
20
|
-
|
|
32
|
+
For cross-window work, check `coprogrammer --version` in each environment.
|
|
33
|
+
Use CoProgrammer 0.3+ for dispatch previews, content-bound checks and portable
|
|
34
|
+
handoffs; existing session/claim/message commands remain available. Keep one session ID per window, even when several
|
|
21
35
|
windows use the same client. Register once in that window's working tree; resume
|
|
22
36
|
with `pulse`, not another registration:
|
|
23
37
|
|
|
@@ -33,6 +47,8 @@ The inbox snapshot still includes unacknowledged messages after cursor advanceme
|
|
|
33
47
|
`freshness` measures explicit pulses, not process liveness; reads do not keep a
|
|
34
48
|
session alive. Git worktrees share Manager state; independent clones do not.
|
|
35
49
|
|
|
50
|
+
Preview eligible work with `coprogrammer manager dispatch --session <window-id>`.
|
|
51
|
+
This read does not claim or pulse; claim always rechecks constraints atomically.
|
|
36
52
|
For queued work, create scoped tasks with `manager task create`, optional
|
|
37
53
|
`--depends-on` and `--client` eligibility. Use `manager task claim` to atomically
|
|
38
54
|
claim a task and its path lease; preserve the returned `claim_id`. Do not request
|
|
@@ -53,6 +69,27 @@ they do not intercept writes or replace code review. Use a named Git branch,
|
|
|
53
69
|
not detached HEAD. Pulse before the session becomes stale and renew claims
|
|
54
70
|
before expiry; sync does neither.
|
|
55
71
|
|
|
72
|
+
Record explicit noninteractive checks with content-bound receipts before reporting
|
|
73
|
+
validation. Use an ignored directory or output outside the checkout:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
coprogrammer check run --label tests --output .coprogrammer/checks/tests.json \
|
|
77
|
+
-- python -m unittest discover -s tests
|
|
78
|
+
coprogrammer check verify --artifact .coprogrammer/checks/tests.json \
|
|
79
|
+
-- python -m unittest discover -s tests
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
A failed, changed, expired or missing record cannot establish a current pass.
|
|
83
|
+
Ignored files and external inputs are outside the fingerprint; receipts do not
|
|
84
|
+
authenticate the worker. MCP `check_verify` never runs a command.
|
|
85
|
+
|
|
86
|
+
For another computer, reconcile and stop the source worker, commit intended
|
|
87
|
+
changes, and export `manager handoff --session <window-id> --task <task-id>
|
|
88
|
+
--base origin/main --check <receipt>` as JSON to an ignored/external path. The
|
|
89
|
+
receiver uses `workspace compare <bundle>` after an explicit Git fetch/checkout.
|
|
90
|
+
Context alignment transfers no ownership: rerun local checks and acquire a local
|
|
91
|
+
claim. Independent clones keep independent Managers; never copy tokens or logs.
|
|
92
|
+
|
|
56
93
|
Report completed work and actual validation with `manager task finish --summary
|
|
57
94
|
<result>`; use `task release` with a summary to requeue unfinished work. Both
|
|
58
95
|
require `--session`, `--id` and `--claim`. Completion is self-reported and does
|
|
@@ -23,3 +23,11 @@ action. Include any files that need reconciliation before another worker edits.
|
|
|
23
23
|
State whether the task was finished, released or still claimed, and whether
|
|
24
24
|
message receipt is pending. A handoff does not transfer a lease; the recipient
|
|
25
25
|
must sync and acquire their own task claim before editing.
|
|
26
|
+
|
|
27
|
+
## Portable context (CoProgrammer 0.3+)
|
|
28
|
+
|
|
29
|
+
Record `coprogrammer --version`, source HEAD/base, dirty state and content-bound
|
|
30
|
+
check statuses. Export `manager handoff` as JSON to an ignored/external path;
|
|
31
|
+
inspect it with `workspace compare` on the receiving machine. Confirm the source
|
|
32
|
+
worker stopped, run receiving-machine checks and acquire a local claim.
|
|
33
|
+
Context alignment does not transfer ownership between independent Managers.
|
|
@@ -401,12 +401,18 @@ def utc_now() -> str:
|
|
|
401
401
|
|
|
402
402
|
|
|
403
403
|
def run_git(args: list[str], cwd: Path) -> str:
|
|
404
|
+
# A caller's Git redirection must never move a requested project operation
|
|
405
|
+
# into another window's repository or index.
|
|
406
|
+
env = {key: value for key, value in os.environ.items() if not key.startswith("GIT_")}
|
|
407
|
+
env.update(GIT_OPTIONAL_LOCKS="0", GIT_TERMINAL_PROMPT="0")
|
|
404
408
|
result = subprocess.run(
|
|
405
409
|
["git", *args],
|
|
406
410
|
cwd=cwd,
|
|
407
411
|
check=False,
|
|
408
412
|
text=True,
|
|
413
|
+
encoding="utf-8",
|
|
409
414
|
capture_output=True,
|
|
415
|
+
env=env,
|
|
410
416
|
)
|
|
411
417
|
if result.returncode != 0:
|
|
412
418
|
raise RuntimeError(result.stderr.strip() or "git command failed")
|
|
@@ -1782,9 +1788,13 @@ def command_manager_briefing(args: argparse.Namespace) -> int:
|
|
|
1782
1788
|
def build_parser() -> argparse.ArgumentParser:
|
|
1783
1789
|
parser = argparse.ArgumentParser(
|
|
1784
1790
|
prog="coprogrammer",
|
|
1785
|
-
description="
|
|
1791
|
+
description="Shared tasks, file boundaries and handoffs for coding agents. Start with 'coprogrammer demo'.",
|
|
1786
1792
|
)
|
|
1787
1793
|
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
1794
|
+
from . import __version__
|
|
1795
|
+
parser.add_argument("--version", action="version", version=__version__)
|
|
1796
|
+
from .onboarding import add_parsers as add_onboarding_parsers
|
|
1797
|
+
add_onboarding_parsers(subparsers)
|
|
1788
1798
|
|
|
1789
1799
|
demo = subparsers.add_parser("demo", help="Run a real offline coordination demo in temporary Git worktrees.")
|
|
1790
1800
|
demo.add_argument("--json", action="store_true")
|
|
@@ -1961,6 +1971,8 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1961
1971
|
add_parsers(manager_subparsers)
|
|
1962
1972
|
from .scheduler_cli import add_parsers as add_task_parsers
|
|
1963
1973
|
add_task_parsers(manager_subparsers)
|
|
1974
|
+
from .workflow_cli import add_parsers as add_workflow_parsers
|
|
1975
|
+
add_workflow_parsers(subparsers, manager_subparsers)
|
|
1964
1976
|
|
|
1965
1977
|
briefing = manager_subparsers.add_parser("briefing", help="Summarize ready work, blockers and next actions.")
|
|
1966
1978
|
briefing.add_argument("--cwd", default=".")
|