context-garden 0.3.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.
- context_garden-0.3.1/.gitignore +9 -0
- context_garden-0.3.1/LICENSE +21 -0
- context_garden-0.3.1/PKG-INFO +338 -0
- context_garden-0.3.1/README.md +296 -0
- context_garden-0.3.1/pyproject.toml +80 -0
- context_garden-0.3.1/src/garden/__init__.py +3 -0
- context_garden-0.3.1/src/garden/__main__.py +8 -0
- context_garden-0.3.1/src/garden/branch_cleanup.py +239 -0
- context_garden-0.3.1/src/garden/brief.py +715 -0
- context_garden-0.3.1/src/garden/browser.py +89 -0
- context_garden-0.3.1/src/garden/canary.py +320 -0
- context_garden-0.3.1/src/garden/canonical.py +124 -0
- context_garden-0.3.1/src/garden/charts.py +312 -0
- context_garden-0.3.1/src/garden/checkrun.py +130 -0
- context_garden-0.3.1/src/garden/checks.py +396 -0
- context_garden-0.3.1/src/garden/ci_status.py +237 -0
- context_garden-0.3.1/src/garden/cli/__init__.py +28 -0
- context_garden-0.3.1/src/garden/cli/common.py +120 -0
- context_garden-0.3.1/src/garden/cli/costs.py +84 -0
- context_garden-0.3.1/src/garden/cli/diagnostics.py +700 -0
- context_garden-0.3.1/src/garden/cli/hosts.py +176 -0
- context_garden-0.3.1/src/garden/cli/loop.py +1151 -0
- context_garden-0.3.1/src/garden/cli/operator.py +98 -0
- context_garden-0.3.1/src/garden/cli/planning.py +440 -0
- context_garden-0.3.1/src/garden/cli/release.py +33 -0
- context_garden-0.3.1/src/garden/cli/scaffold.py +263 -0
- context_garden-0.3.1/src/garden/cli/stabilization.py +130 -0
- context_garden-0.3.1/src/garden/cli/state.py +493 -0
- context_garden-0.3.1/src/garden/cli/views.py +385 -0
- context_garden-0.3.1/src/garden/config.py +1102 -0
- context_garden-0.3.1/src/garden/configuration.py +343 -0
- context_garden-0.3.1/src/garden/costs.py +205 -0
- context_garden-0.3.1/src/garden/credential_stream.py +25 -0
- context_garden-0.3.1/src/garden/criteria.py +273 -0
- context_garden-0.3.1/src/garden/deepdives.py +115 -0
- context_garden-0.3.1/src/garden/events.py +875 -0
- context_garden-0.3.1/src/garden/friction.py +257 -0
- context_garden-0.3.1/src/garden/github.py +1411 -0
- context_garden-0.3.1/src/garden/gitops.py +870 -0
- context_garden-0.3.1/src/garden/graph.py +323 -0
- context_garden-0.3.1/src/garden/harness.py +626 -0
- context_garden-0.3.1/src/garden/host_identity.py +107 -0
- context_garden-0.3.1/src/garden/hosts/__init__.py +69 -0
- context_garden-0.3.1/src/garden/hosts/command.py +280 -0
- context_garden-0.3.1/src/garden/hosts/config.py +31 -0
- context_garden-0.3.1/src/garden/hosts/core.py +981 -0
- context_garden-0.3.1/src/garden/hosts/deadline.py +66 -0
- context_garden-0.3.1/src/garden/hosts/deadline_scheduler.py +261 -0
- context_garden-0.3.1/src/garden/hosts/drain.py +65 -0
- context_garden-0.3.1/src/garden/hosts/ec2.py +548 -0
- context_garden-0.3.1/src/garden/hosts/enrollment.py +747 -0
- context_garden-0.3.1/src/garden/hosts/enrollment_clients.py +297 -0
- context_garden-0.3.1/src/garden/hosts/fake.py +84 -0
- context_garden-0.3.1/src/garden/hosts/locking.py +5 -0
- context_garden-0.3.1/src/garden/hosts/models.py +169 -0
- context_garden-0.3.1/src/garden/hosts/provider.py +66 -0
- context_garden-0.3.1/src/garden/hosts/registry.py +78 -0
- context_garden-0.3.1/src/garden/hosts/scale.py +512 -0
- context_garden-0.3.1/src/garden/inbox.py +1052 -0
- context_garden-0.3.1/src/garden/interaction_replay.py +179 -0
- context_garden-0.3.1/src/garden/kickoff.py +303 -0
- context_garden-0.3.1/src/garden/locking.py +67 -0
- context_garden-0.3.1/src/garden/managed_worker.py +161 -0
- context_garden-0.3.1/src/garden/model.py +517 -0
- context_garden-0.3.1/src/garden/notification_adapters.py +286 -0
- context_garden-0.3.1/src/garden/notify.py +172 -0
- context_garden-0.3.1/src/garden/now1.py +956 -0
- context_garden-0.3.1/src/garden/observe.py +370 -0
- context_garden-0.3.1/src/garden/onboard.py +727 -0
- context_garden-0.3.1/src/garden/openrouter_adapter.py +201 -0
- context_garden-0.3.1/src/garden/operator_spend.py +351 -0
- context_garden-0.3.1/src/garden/outcomes.py +442 -0
- context_garden-0.3.1/src/garden/personas.py +427 -0
- context_garden-0.3.1/src/garden/planner.py +353 -0
- context_garden-0.3.1/src/garden/plants.py +290 -0
- context_garden-0.3.1/src/garden/platefetch.py +214 -0
- context_garden-0.3.1/src/garden/preflight.py +184 -0
- context_garden-0.3.1/src/garden/proctree.py +236 -0
- context_garden-0.3.1/src/garden/profiles.py +78 -0
- context_garden-0.3.1/src/garden/qa/__init__.py +273 -0
- context_garden-0.3.1/src/garden/qa/flows.py +370 -0
- context_garden-0.3.1/src/garden/qa/sandbox.py +434 -0
- context_garden-0.3.1/src/garden/qa/worker.py +113 -0
- context_garden-0.3.1/src/garden/reference_snapshot.py +52 -0
- context_garden-0.3.1/src/garden/release.py +155 -0
- context_garden-0.3.1/src/garden/remote_worker.py +1298 -0
- context_garden-0.3.1/src/garden/resource_reclaim.py +94 -0
- context_garden-0.3.1/src/garden/retro.py +652 -0
- context_garden-0.3.1/src/garden/review.py +920 -0
- context_garden-0.3.1/src/garden/run_supervisor.py +948 -0
- context_garden-0.3.1/src/garden/runner/__init__.py +108 -0
- context_garden-0.3.1/src/garden/runner/base.py +522 -0
- context_garden-0.3.1/src/garden/runner/local.py +424 -0
- context_garden-0.3.1/src/garden/runner/manual.py +47 -0
- context_garden-0.3.1/src/garden/runner/remote.py +62 -0
- context_garden-0.3.1/src/garden/runner/ssh.py +394 -0
- context_garden-0.3.1/src/garden/runs.py +1841 -0
- context_garden-0.3.1/src/garden/sandbox.py +239 -0
- context_garden-0.3.1/src/garden/scaffold.py +581 -0
- context_garden-0.3.1/src/garden/scheduler/__init__.py +1023 -0
- context_garden-0.3.1/src/garden/scheduler/aux.py +198 -0
- context_garden-0.3.1/src/garden/scheduler/browser.py +95 -0
- context_garden-0.3.1/src/garden/scheduler/budget.py +359 -0
- context_garden-0.3.1/src/garden/scheduler/checkruns.py +1041 -0
- context_garden-0.3.1/src/garden/scheduler/cleanup.py +516 -0
- context_garden-0.3.1/src/garden/scheduler/discovered.py +305 -0
- context_garden-0.3.1/src/garden/scheduler/dispatch.py +945 -0
- context_garden-0.3.1/src/garden/scheduler/edits.py +191 -0
- context_garden-0.3.1/src/garden/scheduler/feedback.py +49 -0
- context_garden-0.3.1/src/garden/scheduler/fence.py +1039 -0
- context_garden-0.3.1/src/garden/scheduler/human.py +1624 -0
- context_garden-0.3.1/src/garden/scheduler/kickoff.py +284 -0
- context_garden-0.3.1/src/garden/scheduler/persona.py +322 -0
- context_garden-0.3.1/src/garden/scheduler/poll.py +1037 -0
- context_garden-0.3.1/src/garden/scheduler/queue.py +68 -0
- context_garden-0.3.1/src/garden/scheduler/quota.py +145 -0
- context_garden-0.3.1/src/garden/scheduler/reap.py +1492 -0
- context_garden-0.3.1/src/garden/scheduler/rebase.py +613 -0
- context_garden-0.3.1/src/garden/scheduler/report.py +51 -0
- context_garden-0.3.1/src/garden/scheduler/resources.py +548 -0
- context_garden-0.3.1/src/garden/scheduler/retro.py +1557 -0
- context_garden-0.3.1/src/garden/scheduler/review.py +1638 -0
- context_garden-0.3.1/src/garden/scheduler/scope.py +81 -0
- context_garden-0.3.1/src/garden/scheduler/selection.py +23 -0
- context_garden-0.3.1/src/garden/scheduler/snapshot.py +92 -0
- context_garden-0.3.1/src/garden/scheduler/state.py +484 -0
- context_garden-0.3.1/src/garden/scheduler/trials.py +460 -0
- context_garden-0.3.1/src/garden/scheduler/upgrades.py +248 -0
- context_garden-0.3.1/src/garden/scheduler_health.py +144 -0
- context_garden-0.3.1/src/garden/source_control.py +181 -0
- context_garden-0.3.1/src/garden/stabilization.py +419 -0
- context_garden-0.3.1/src/garden/storage.py +127 -0
- context_garden-0.3.1/src/garden/storage_cleanup.py +204 -0
- context_garden-0.3.1/src/garden/store.py +586 -0
- context_garden-0.3.1/src/garden/suggestions.py +217 -0
- context_garden-0.3.1/src/garden/system_resources.py +106 -0
- context_garden-0.3.1/src/garden/trials.py +195 -0
- context_garden-0.3.1/src/garden/tui/__init__.py +0 -0
- context_garden-0.3.1/src/garden/tui/app.py +563 -0
- context_garden-0.3.1/src/garden/upgrade.py +104 -0
- context_garden-0.3.1/src/garden/validation.py +253 -0
- context_garden-0.3.1/src/garden/walkthrough.py +1116 -0
- context_garden-0.3.1/src/garden/web/access.py +76 -0
- context_garden-0.3.1/src/garden/web/actions/__init__.py +41 -0
- context_garden-0.3.1/src/garden/web/actions/configuration.py +110 -0
- context_garden-0.3.1/src/garden/web/actions/control.py +173 -0
- context_garden-0.3.1/src/garden/web/actions/decisions.py +31 -0
- context_garden-0.3.1/src/garden/web/actions/friction.py +52 -0
- context_garden-0.3.1/src/garden/web/actions/phases.py +296 -0
- context_garden-0.3.1/src/garden/web/actions/tasks.py +552 -0
- context_garden-0.3.1/src/garden/web/app.py +210 -0
- context_garden-0.3.1/src/garden/web/artifacts.py +68 -0
- context_garden-0.3.1/src/garden/web/common.py +702 -0
- context_garden-0.3.1/src/garden/web/pages/__init__.py +29 -0
- context_garden-0.3.1/src/garden/web/pages/api.py +780 -0
- context_garden-0.3.1/src/garden/web/pages/board.py +30 -0
- context_garden-0.3.1/src/garden/web/pages/config.py +136 -0
- context_garden-0.3.1/src/garden/web/pages/costs.py +127 -0
- context_garden-0.3.1/src/garden/web/pages/design.py +167 -0
- context_garden-0.3.1/src/garden/web/pages/events.py +25 -0
- context_garden-0.3.1/src/garden/web/pages/inbox.py +148 -0
- context_garden-0.3.1/src/garden/web/pages/now1.py +171 -0
- context_garden-0.3.1/src/garden/web/pages/phase.py +315 -0
- context_garden-0.3.1/src/garden/web/pages/runs.py +146 -0
- context_garden-0.3.1/src/garden/web/pages/task.py +431 -0
- context_garden-0.3.1/src/garden/web/pages/trellis.py +39 -0
- context_garden-0.3.1/src/garden/web/pages/trials.py +29 -0
- context_garden-0.3.1/src/garden/web/static/mock/now-2.html +382 -0
- context_garden-0.3.1/src/garden/web/static/plates/README.md +15 -0
- context_garden-0.3.1/src/garden/web/static/plates/SOURCES.md +22 -0
- context_garden-0.3.1/src/garden/web/static/plates/adonis-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/adonis.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/bramble-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/bramble.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/daphne-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/daphne.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/fern-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/fern.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/foxglove-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/foxglove.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/orchid-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/orchid.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/pea-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/pea.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/peony-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/peony.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/poppy-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/poppy.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/quince-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/quince.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/snapdragon-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/snapdragon.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/thistle-thumb.webp +0 -0
- context_garden-0.3.1/src/garden/web/static/plates/thistle.webp +0 -0
- context_garden-0.3.1/src/garden/web/templates/_backlog.html +35 -0
- context_garden-0.3.1/src/garden/web/templates/_board.html +48 -0
- context_garden-0.3.1/src/garden/web/templates/_cost_comparisons.html +21 -0
- context_garden-0.3.1/src/garden/web/templates/_decision_card.html +43 -0
- context_garden-0.3.1/src/garden/web/templates/_kickoff.html +16 -0
- context_garden-0.3.1/src/garden/web/templates/_now1_head.html +5 -0
- context_garden-0.3.1/src/garden/web/templates/_now1_macros.html +104 -0
- context_garden-0.3.1/src/garden/web/templates/_now1_next.html +30 -0
- context_garden-0.3.1/src/garden/web/templates/_now1_now.html +14 -0
- context_garden-0.3.1/src/garden/web/templates/_now1_period.html +39 -0
- context_garden-0.3.1/src/garden/web/templates/_now1_strip.html +1 -0
- context_garden-0.3.1/src/garden/web/templates/_now1_where.html +16 -0
- context_garden-0.3.1/src/garden/web/templates/_prs.html +22 -0
- context_garden-0.3.1/src/garden/web/templates/_retro_verdict.html +17 -0
- context_garden-0.3.1/src/garden/web/templates/_runs.html +14 -0
- context_garden-0.3.1/src/garden/web/templates/_stdout.html +99 -0
- context_garden-0.3.1/src/garden/web/templates/base.html +858 -0
- context_garden-0.3.1/src/garden/web/templates/board.html +109 -0
- context_garden-0.3.1/src/garden/web/templates/config.html +333 -0
- context_garden-0.3.1/src/garden/web/templates/costs.html +131 -0
- context_garden-0.3.1/src/garden/web/templates/design.html +6 -0
- context_garden-0.3.1/src/garden/web/templates/doc.html +9 -0
- context_garden-0.3.1/src/garden/web/templates/error.html +5 -0
- context_garden-0.3.1/src/garden/web/templates/events.html +30 -0
- context_garden-0.3.1/src/garden/web/templates/herbarium.html +29 -0
- context_garden-0.3.1/src/garden/web/templates/inbox.html +187 -0
- context_garden-0.3.1/src/garden/web/templates/now1.html +475 -0
- context_garden-0.3.1/src/garden/web/templates/now_workers.html +77 -0
- context_garden-0.3.1/src/garden/web/templates/phase.html +113 -0
- context_garden-0.3.1/src/garden/web/templates/phase_closed.html +82 -0
- context_garden-0.3.1/src/garden/web/templates/phase_retro.html +45 -0
- context_garden-0.3.1/src/garden/web/templates/run.html +84 -0
- context_garden-0.3.1/src/garden/web/templates/runs.html +30 -0
- context_garden-0.3.1/src/garden/web/templates/task.html +251 -0
- context_garden-0.3.1/src/garden/web/templates/trellis.html +36 -0
- context_garden-0.3.1/src/garden/web/templates/trials.html +23 -0
- context_garden-0.3.1/src/garden/web/trust.py +274 -0
- context_garden-0.3.1/src/garden/worker_diagnostics.py +151 -0
- context_garden-0.3.1/src/garden/workers.py +241 -0
- context_garden-0.3.1/src/garden/workload_identity.py +362 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Josh Marcus
|
|
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,338 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: context-garden
|
|
3
|
+
Version: 0.3.1
|
|
4
|
+
Summary: Drive agent development from a repository of context files: principles, products, phases, tasks.
|
|
5
|
+
Project-URL: Homepage, https://github.com/joshmarcus/context-garden
|
|
6
|
+
Project-URL: Documentation, https://github.com/joshmarcus/context-garden/tree/main/docs
|
|
7
|
+
Project-URL: Issues, https://github.com/joshmarcus/context-garden/issues
|
|
8
|
+
Project-URL: Source, https://github.com/joshmarcus/context-garden
|
|
9
|
+
Author: Josh Marcus
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Operating System :: MacOS
|
|
15
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: fastapi>=0.110
|
|
22
|
+
Requires-Dist: httpx>=0.27
|
|
23
|
+
Requires-Dist: jinja2>=3.1
|
|
24
|
+
Requires-Dist: markdown>=3.5
|
|
25
|
+
Requires-Dist: python-multipart>=0.0.9
|
|
26
|
+
Requires-Dist: pyyaml>=6.0
|
|
27
|
+
Requires-Dist: rich>=13.0
|
|
28
|
+
Requires-Dist: textual>=0.60
|
|
29
|
+
Requires-Dist: typer>=0.12
|
|
30
|
+
Requires-Dist: uvicorn>=0.29
|
|
31
|
+
Provides-Extra: aws
|
|
32
|
+
Requires-Dist: boto3>=1.34; extra == 'aws'
|
|
33
|
+
Provides-Extra: dev
|
|
34
|
+
Requires-Dist: pytest-timeout==2.4.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
36
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
37
|
+
Provides-Extra: plates
|
|
38
|
+
Requires-Dist: pillow>=10; extra == 'plates'
|
|
39
|
+
Provides-Extra: walkthrough
|
|
40
|
+
Requires-Dist: playwright>=1.40; extra == 'walkthrough'
|
|
41
|
+
Description-Content-Type: text/markdown
|
|
42
|
+
|
|
43
|
+
# context-garden
|
|
44
|
+
|
|
45
|
+
**Drive autonomous agent development by tending a context garden.** You maintain principles, product overviews, phase goals, and specs as Markdown; context-garden turns that context into plans, working code, and reviewed pull requests. As your project grows, you refine the documents that guide the agents, and the agents carry the work through implementation, checks, review, and revision. Your job is to shape the goals, make decisions, and choose what ships.
|
|
46
|
+
|
|
47
|
+
You can change the direction of the project in the same place you define it. Each worker gets a focused brief built from the shared context, and each phase leaves evidence you can use to improve the next one: what shipped, where agents got stuck, how reviewers responded, and what the work cost.
|
|
48
|
+
|
|
49
|
+
[](https://drive.google.com/file/d/146FxqsfkbsCL8AwFBRdbsInpjA0v0MQI/view?usp=sharing)
|
|
50
|
+
|
|
51
|
+
[Watch Context Garden build itself — one-minute video](https://drive.google.com/file/d/146FxqsfkbsCL8AwFBRdbsInpjA0v0MQI/view?usp=sharing) · [Reproduce the film](scripts/history-film/README.md)
|
|
52
|
+
|
|
53
|
+
[Features](#what-you-can-do) · [See it in action](#feature-tour) · [Ontology](ONTOLOGY.md) · [Getting started](docs/getting-started.md) · [Operating guide](docs/operations.md) · [Contributing](docs/contributing.md) · [All documentation](docs/README.md)
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
## What you can do
|
|
58
|
+
|
|
59
|
+
- **Keep context useful as the project changes.** Maintain principles, product overviews, goals, and specs in Git. Each worker's brief includes the shared context and its task's reading list, so the direction you set reaches the work being done.
|
|
60
|
+
- **Turn goals into coordinated work.** Plan a phase as tasks with acceptance criteria and dependencies. Run agents in parallel worktrees; stack related PRs and advance dependent tasks as changes merge.
|
|
61
|
+
- **Close the review loop.** Configured tests and lint gate PR creation. Automated reviewers check the task's criteria, and failed checks or review feedback drive bounded revisions. Add persona reviews for another perspective.
|
|
62
|
+
- **Handle decisions without losing the thread.** Answer a worker's question, approve scope, send a PR back, or recover a stopped task. The task keeps its brief, run output, review evidence, and history together.
|
|
63
|
+
- **Watch autonomous work as it happens.** Now shows runs in flight, progress excerpts, what is queued next, and where the phase stands. The Board gives you columns, a task list, and a backlog you can reorder across phases.
|
|
64
|
+
- **Compare models by the work they get accepted.** Inspect cost per accepted task, first-pass approval, revision rounds, and lead time by model and difficulty. Compare per-run costs, run model trials, set budgets, and account for delegated operator spend.
|
|
65
|
+
- **Use each phase to improve the next.** Retrospectives bring together outcomes, friction, costs, and persona reviews. They can propose follow-up work or identify blockers before a phase closes; you refine the context for what comes next.
|
|
66
|
+
- **Bring your existing project and tools.** Onboarding drafts context and a first phase from your repository. Use Claude Code, Codex, or a custom CLI harness with your project's setup, test, and lint commands; choose local, SSH, remote lease-based, or manual workers.
|
|
67
|
+
|
|
68
|
+
The scheduler itself uses **no model tokens**: it polls, orders tasks, collects results, and advances state in Python. Models do the planning, implementation, reviews, agent-assisted revisions, and retrospectives. A delegated operator session also uses tokens. Waiting for CI does not require an agent to sit in a chat polling it.
|
|
69
|
+
|
|
70
|
+
## Feature tour
|
|
71
|
+
|
|
72
|
+
### Watch the work move
|
|
73
|
+
|
|
74
|
+
**Now** is the live view of the loop: workers and reviewers in flight, progress from their output, the next tasks, and phase progress. Open a run to inspect its evidence. Below is the garden developing context-garden itself.
|
|
75
|
+
|
|
76
|
+

|
|
77
|
+
|
|
78
|
+
### Handle the decisions that need you
|
|
79
|
+
|
|
80
|
+
The **Inbox** brings worker questions, draft approvals, and PR triage together. Answer a question to resume the work, approve the next tasks, or send a draft PR back with feedback.
|
|
81
|
+
|
|
82
|
+

|
|
83
|
+
|
|
84
|
+
*This small example garden shows a worker asking about export behavior and two tasks awaiting approval.*
|
|
85
|
+
|
|
86
|
+
### Shape the plan across phases
|
|
87
|
+
|
|
88
|
+
The **Board** backlog puts upcoming work in phase order, with controls to change priority and move tasks between phases. Switch to columns for state or to the list for a compact view of tasks and PRs.
|
|
89
|
+
|
|
90
|
+

|
|
91
|
+
|
|
92
|
+
<details>
|
|
93
|
+
<summary>See the Board's columns and list views</summary>
|
|
94
|
+
|
|
95
|
+
**Columns:** scan the work by state, from draft and blocked through running and review. The board scrolls horizontally to show the remaining states.
|
|
96
|
+
|
|
97
|
+

|
|
98
|
+
|
|
99
|
+
**List:** read task titles, state, priority, difficulty, and PR links together.
|
|
100
|
+
|
|
101
|
+

|
|
102
|
+
|
|
103
|
+
</details>
|
|
104
|
+
|
|
105
|
+
### See which models work well for your tasks
|
|
106
|
+
|
|
107
|
+
The comparison charts lower down **Now** connect model choices to outcomes. Cost per accepted task, first-pass approval, revision rounds, and lead time are broken out by difficulty. Cells include sample counts; sparse results are marked so a small sample does not look like a reliable winner.
|
|
108
|
+
|
|
109
|
+

|
|
110
|
+
|
|
111
|
+
The per-run comparison separates work, revision, review, and other activities by harness and model. Use it alongside the outcome charts when tuning model assignments and the amount of review a task needs. The **Costs** page provides spending history and additional filters.
|
|
112
|
+
|
|
113
|
+

|
|
114
|
+
|
|
115
|
+
*These are snapshots of this project's development history over the selected 24-hour window, not controlled model benchmarks or estimates for your project.*
|
|
116
|
+
|
|
117
|
+
### Keep the context and decisions within reach
|
|
118
|
+
|
|
119
|
+
The **Trellis** makes dependencies visible. Task pages keep the brief, acceptance criteria, worker questions, and recorded usage together. Phase pages connect the work to goals and specs; closed phases remain available in the **Herbarium**.
|
|
120
|
+
|
|
121
|
+
<details>
|
|
122
|
+
<summary>Explore the Trellis, task page, and phase page</summary>
|
|
123
|
+
|
|
124
|
+
These three captures use the same fictional Fieldnotes project as the Inbox above to make the individual features easy to read.
|
|
125
|
+
|
|
126
|
+

|
|
127
|
+
|
|
128
|
+

|
|
129
|
+
|
|
130
|
+

|
|
131
|
+
|
|
132
|
+
</details>
|
|
133
|
+
|
|
134
|
+
## What you maintain
|
|
135
|
+
|
|
136
|
+
Your **garden** is a git repository of Markdown files. It holds the context and task history; each product points to its code repository. The garden driving this tool lives at [joshmarcus/garden](https://github.com/joshmarcus/garden).
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
my-garden/
|
|
140
|
+
garden.yaml # products, harnesses, capacity, checks
|
|
141
|
+
principles/00-index.md # shared rules included in every brief
|
|
142
|
+
widget/
|
|
143
|
+
product.md # product context and development conventions
|
|
144
|
+
phase-01/
|
|
145
|
+
goals.md # outcomes, scope, definition of done
|
|
146
|
+
specs/ # designs and requirements
|
|
147
|
+
tasks/ # task briefs and scheduler-managed state
|
|
148
|
+
.garden/ # local run records and working state (gitignored)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Edit and version the context in your usual editor. Use garden commands or the UI for task status changes.
|
|
152
|
+
|
|
153
|
+
## Install
|
|
154
|
+
|
|
155
|
+
You need **Python 3.11+**, **git**, a logged-in **Claude Code or Codex CLI**, and GitHub access through authenticated `gh` or `GITHUB_TOKEN`. Linux and macOS are supported; **on Windows, run garden inside WSL**. Your product repository needs a committed base branch, a GitHub remote you can push to, and a configured git author identity.
|
|
156
|
+
|
|
157
|
+
Install the released command and library from PyPI:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
python -m pip install context-garden
|
|
161
|
+
garden --help
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
The supported library surface currently consists of the documented modules under `garden`.
|
|
165
|
+
For example, task-document tools can parse and render the YAML frontmatter used by a garden:
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
from garden import __version__
|
|
169
|
+
from garden.model import join_frontmatter, split_frontmatter
|
|
170
|
+
|
|
171
|
+
document = join_frontmatter({"id": "CG-1", "status": "ready"}, "## Goal\n\nShip it.")
|
|
172
|
+
metadata, body = split_frontmatter(document)
|
|
173
|
+
print(__version__, metadata["id"], body.strip())
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Other modules are implementation details unless they are documented here or in the linked
|
|
177
|
+
guides. Source contributors can instead use an editable checkout:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
git clone https://github.com/joshmarcus/context-garden
|
|
181
|
+
cd context-garden
|
|
182
|
+
uv venv
|
|
183
|
+
uv pip install -e .
|
|
184
|
+
source .venv/bin/activate
|
|
185
|
+
garden --help
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Without uv, create the environment with `python3 -m venv .venv`, activate it, and run `python -m pip install -e .`. Keep that environment active when you move into your garden directory.
|
|
189
|
+
|
|
190
|
+
## Your first project
|
|
191
|
+
|
|
192
|
+
The steps below are a compact preview. The [getting-started guide](docs/getting-started.md)
|
|
193
|
+
adds platform notes, expected outcomes, command explanations, and setup recovery.
|
|
194
|
+
|
|
195
|
+
### 1. Create a garden and choose a harness
|
|
196
|
+
|
|
197
|
+
From the tool checkout, with its environment active:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
garden init ../my-garden --name my-garden
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
The default harness is Claude. To use Codex, set `harness: codex` in `../my-garden/garden.yaml` before onboarding. See [Codex setup](docs/codex.md) for authentication and model configuration.
|
|
204
|
+
|
|
205
|
+
Workers use a private HOME and a scrubbed environment. Saved harness credentials are copied into private directories for each dispatch. If your credentials live elsewhere, configure `worker_env.config_dirs`; individual approved tool files use `worker_env.config_files`. Keep secrets out of tracked YAML. See [worker environment and configuration](docs/architecture.md#configuration-and-environments).
|
|
206
|
+
|
|
207
|
+
### 2. Draft context from your repository
|
|
208
|
+
|
|
209
|
+
Replace the path below with your project's local checkout:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
garden onboard /absolute/path/to/widget --into ../my-garden
|
|
213
|
+
cd ../my-garden
|
|
214
|
+
git init
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Onboarding attempts GitHub discovery and calls the configured planner, so **this step uses a model**. It infers a product name and creates `phase-01` with draft tasks. The examples below assume that name is `widget`.
|
|
218
|
+
|
|
219
|
+
Read `widget/docs/onboarding.md` to see what was found, inferred, or left unresolved. Review `widget/product.md`, the principles, phase goals, and tasks. Correct the scope and the product's `setup.command`, `setup.test`, and `setup.lint` in `garden.yaml`. Onboarding does not install project dependencies or prove those commands work; validate them in a disposable checkout before approving work.
|
|
220
|
+
|
|
221
|
+
<details>
|
|
222
|
+
<summary>Prefer to write the context yourself?</summary>
|
|
223
|
+
|
|
224
|
+
After `garden init`, enter your garden and scaffold the product and phase:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
cd ../my-garden
|
|
228
|
+
garden new-product widget --repo /absolute/path/to/widget --base-branch main
|
|
229
|
+
garden new-phase widget phase-01
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Fill in `principles/00-index.md`, `widget/product.md`, `widget/phase-01/goals.md`, and the specs under `widget/phase-01/specs/`. Configure the product's setup, test, and lint commands, then run:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
garden plan widget/phase-01 --draft
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Planning attempts a kickoff review first if none exists. `--dry-run` prints the planning prompt without calling a model. The onboarding path already creates drafts; it does not need this extra planning call.
|
|
239
|
+
|
|
240
|
+
</details>
|
|
241
|
+
|
|
242
|
+
### 3. Review the plan before starting work
|
|
243
|
+
|
|
244
|
+
Merge these settings into the generated `garden.yaml`, keeping its product and harness configuration. They make approval explicit and start with one work slot and one review slot:
|
|
245
|
+
|
|
246
|
+
```yaml
|
|
247
|
+
max_parallel: 1
|
|
248
|
+
review_parallel: 1
|
|
249
|
+
plan:
|
|
250
|
+
auto_approve: false
|
|
251
|
+
discovered:
|
|
252
|
+
auto_approve_blocking: false
|
|
253
|
+
review:
|
|
254
|
+
enabled: true
|
|
255
|
+
github:
|
|
256
|
+
draft_pr: true
|
|
257
|
+
project_users: [] # additional PR authors to observe; the authenticated user is always included
|
|
258
|
+
automerge: false
|
|
259
|
+
# Tier pools may spread work across harness/model members.
|
|
260
|
+
models:
|
|
261
|
+
medium:
|
|
262
|
+
- {harness: claude, model: claude-sonnet-5, weight: 2}
|
|
263
|
+
- {harness: codex, model: gpt-5.6-terra, weight: 1}
|
|
264
|
+
dispatch: {spread: quota_aware} # round_robin | weighted | quota_aware
|
|
265
|
+
harnesses:
|
|
266
|
+
claude: {models: {easy: haiku, medium: sonnet, hard: opus}}
|
|
267
|
+
codex: {models: {easy: gpt-5.6-luna, medium: gpt-5.6-terra, hard: gpt-5.6-sol}}
|
|
268
|
+
checks:
|
|
269
|
+
pre_pr: [{name: tests, command: "pytest -q -x"}]
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
These are suggested first-run settings, not package defaults: planning and blocking discovered work otherwise default to automatic approval. `--draft` overrides that behavior for one planning call. A phase budget is optional: `garden budget widget/phase-01 50` pauses new dispatch at $50; it does not cancel work already running.
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
garden doctor
|
|
276
|
+
garden trellis
|
|
277
|
+
garden validate
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
`doctor` checks configuration, repositories, the graph, and worker logins. It sends a small harness prompt and executes a configured notification command, so it is not an offline check. Resolve its failures before continuing. `validate` checks the graph and reading lists; approval also rejects incomplete briefs. Use `garden brief ID --stats` to inspect a task's context size.
|
|
281
|
+
|
|
282
|
+
### 4. Approve work and follow the first PR
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
garden approve --all widget/phase-01
|
|
286
|
+
garden serve
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Use `garden approve ID` instead of `--all` to start with a single task. Open **http://127.0.0.1:8765**. `serve` starts the web UI **and the scheduler**: approved, unblocked work can now dispatch. For a look around before launching work, use `garden serve --no-watch` instead.
|
|
290
|
+
|
|
291
|
+
Follow the task's runs and evidence, answer any questions in the **Inbox**, and inspect the resulting draft PR and automated review. Mark it ready with the UI or `garden triage ID --ready`; send it back with `garden triage ID --changes "feedback"`. Once review and CI are satisfactory, merge on GitHub. The next poll records the merge and advances dependent work.
|
|
292
|
+
|
|
293
|
+
From another terminal with the same environment active, run `garden status`, `garden inbox`, or `garden observe --profile quiet`. `garden watch` runs the scheduler without the web UI; `garden tui` opens the terminal interface.
|
|
294
|
+
|
|
295
|
+
## Use the CLI
|
|
296
|
+
|
|
297
|
+
The CLI operates the same garden as the web UI and TUI. Inspect a plan, follow the workers, handle decisions, and compare outcomes from your terminal:
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
garden status
|
|
301
|
+
garden observe --profile quiet
|
|
302
|
+
garden inbox
|
|
303
|
+
garden brief WID-003 --stats
|
|
304
|
+
garden runs WID-003
|
|
305
|
+
garden costs --since 24h --by model
|
|
306
|
+
garden metrics widget/phase-01
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Run commands from your garden directory with the installed environment active. Replace `WID-003` and `widget/phase-01` with your task and phase. `garden watch` runs the scheduler on its own; `garden observe --follow` follows progress alongside an existing controller. `garden --help` lists the command groups.
|
|
310
|
+
Difficulty tiers route each task to a model, so cost follows difficulty. A top-level tier can instead be a pool of harness/model members: `round_robin` alternates, `weighted` repeats members by weight, and the default `quota_aware` behavior halves a member's share for `dispatch.quota_window_hours` after its usage-limit event, until its probe succeeds, while skipping a paused harness entirely. A task's `harness:` or `model:` remains a pin. `review.pool` accepts the same member list for alternating review accounts, and `garden trial -c tier:medium` expands a tier pool into contenders. `garden.<GARDEN_ENV>.yaml` and a gitignored `garden.local.yaml` layer on top for a work or per-machine setting; [examples/garden.work.yaml](examples/garden.work.yaml) shows ssh workers, a Jenkins log analyser and a product whose dependencies and tests are not Python.
|
|
311
|
+
|
|
312
|
+
The [CLI guide](docs/cli.md) walks through planning and approval, following runs, answering workers, reviewing PRs, recovering tasks, and exporting JSON for scripts.
|
|
313
|
+
|
|
314
|
+
## Keep the loop running
|
|
315
|
+
|
|
316
|
+
A dispatch pause still allows collection, checks, reviews, and merges. Installation maintenance uses a separate drain-and-resume protocol. Run one long-lived controller per garden and keep its UI on loopback or behind authenticated access.
|
|
317
|
+
|
|
318
|
+
The **Config** page shows effective settings and pending configuration changes.
|
|
319
|
+
|
|
320
|
+
The [operating guide](docs/operations.md) covers merge policy, capacity, remote workers, recovery, maintenance, configuration reloads, GitHub Enterprise, and operator handoffs. The [architecture guide](docs/architecture.md) explains the full behavior and configuration boundaries.
|
|
321
|
+
|
|
322
|
+
## Development and documentation
|
|
323
|
+
|
|
324
|
+
- [Documentation map](docs/README.md): the canonical path for each audience.
|
|
325
|
+
- [Getting started](docs/getting-started.md): installation through the first completed PR.
|
|
326
|
+
- [Contributor guide](docs/contributing.md): setup, repository structure, tests, and docs.
|
|
327
|
+
- [CLI guide](docs/cli.md): day-to-day commands, control modes, and scripting.
|
|
328
|
+
- [Design](docs/design.md): vocabulary and the development loop.
|
|
329
|
+
- [Architecture](docs/architecture.md): modules, state, scheduling, configuration, and merge policy.
|
|
330
|
+
- [Worker protocol](docs/worker-protocol.md): briefs, results, transports, and failure recovery.
|
|
331
|
+
- [Codex setup](docs/codex.md): harness configuration and interactive workflows.
|
|
332
|
+
- [Test suites](docs/test-suites.md) and [worker CI](docs/worker-ci.md): focused checks and the full regression gate.
|
|
333
|
+
- [Screenshot capture](docs/screenshots/README.md): reproduce this README's example garden and images.
|
|
334
|
+
|
|
335
|
+
For development, follow the [contributor guide](docs/contributing.md). Tests use fake
|
|
336
|
+
harnesses and spend no model tokens.
|
|
337
|
+
|
|
338
|
+
MIT licensed. See [LICENSE](LICENSE).
|