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.
Files changed (234) hide show
  1. context_garden-0.3.1/.gitignore +9 -0
  2. context_garden-0.3.1/LICENSE +21 -0
  3. context_garden-0.3.1/PKG-INFO +338 -0
  4. context_garden-0.3.1/README.md +296 -0
  5. context_garden-0.3.1/pyproject.toml +80 -0
  6. context_garden-0.3.1/src/garden/__init__.py +3 -0
  7. context_garden-0.3.1/src/garden/__main__.py +8 -0
  8. context_garden-0.3.1/src/garden/branch_cleanup.py +239 -0
  9. context_garden-0.3.1/src/garden/brief.py +715 -0
  10. context_garden-0.3.1/src/garden/browser.py +89 -0
  11. context_garden-0.3.1/src/garden/canary.py +320 -0
  12. context_garden-0.3.1/src/garden/canonical.py +124 -0
  13. context_garden-0.3.1/src/garden/charts.py +312 -0
  14. context_garden-0.3.1/src/garden/checkrun.py +130 -0
  15. context_garden-0.3.1/src/garden/checks.py +396 -0
  16. context_garden-0.3.1/src/garden/ci_status.py +237 -0
  17. context_garden-0.3.1/src/garden/cli/__init__.py +28 -0
  18. context_garden-0.3.1/src/garden/cli/common.py +120 -0
  19. context_garden-0.3.1/src/garden/cli/costs.py +84 -0
  20. context_garden-0.3.1/src/garden/cli/diagnostics.py +700 -0
  21. context_garden-0.3.1/src/garden/cli/hosts.py +176 -0
  22. context_garden-0.3.1/src/garden/cli/loop.py +1151 -0
  23. context_garden-0.3.1/src/garden/cli/operator.py +98 -0
  24. context_garden-0.3.1/src/garden/cli/planning.py +440 -0
  25. context_garden-0.3.1/src/garden/cli/release.py +33 -0
  26. context_garden-0.3.1/src/garden/cli/scaffold.py +263 -0
  27. context_garden-0.3.1/src/garden/cli/stabilization.py +130 -0
  28. context_garden-0.3.1/src/garden/cli/state.py +493 -0
  29. context_garden-0.3.1/src/garden/cli/views.py +385 -0
  30. context_garden-0.3.1/src/garden/config.py +1102 -0
  31. context_garden-0.3.1/src/garden/configuration.py +343 -0
  32. context_garden-0.3.1/src/garden/costs.py +205 -0
  33. context_garden-0.3.1/src/garden/credential_stream.py +25 -0
  34. context_garden-0.3.1/src/garden/criteria.py +273 -0
  35. context_garden-0.3.1/src/garden/deepdives.py +115 -0
  36. context_garden-0.3.1/src/garden/events.py +875 -0
  37. context_garden-0.3.1/src/garden/friction.py +257 -0
  38. context_garden-0.3.1/src/garden/github.py +1411 -0
  39. context_garden-0.3.1/src/garden/gitops.py +870 -0
  40. context_garden-0.3.1/src/garden/graph.py +323 -0
  41. context_garden-0.3.1/src/garden/harness.py +626 -0
  42. context_garden-0.3.1/src/garden/host_identity.py +107 -0
  43. context_garden-0.3.1/src/garden/hosts/__init__.py +69 -0
  44. context_garden-0.3.1/src/garden/hosts/command.py +280 -0
  45. context_garden-0.3.1/src/garden/hosts/config.py +31 -0
  46. context_garden-0.3.1/src/garden/hosts/core.py +981 -0
  47. context_garden-0.3.1/src/garden/hosts/deadline.py +66 -0
  48. context_garden-0.3.1/src/garden/hosts/deadline_scheduler.py +261 -0
  49. context_garden-0.3.1/src/garden/hosts/drain.py +65 -0
  50. context_garden-0.3.1/src/garden/hosts/ec2.py +548 -0
  51. context_garden-0.3.1/src/garden/hosts/enrollment.py +747 -0
  52. context_garden-0.3.1/src/garden/hosts/enrollment_clients.py +297 -0
  53. context_garden-0.3.1/src/garden/hosts/fake.py +84 -0
  54. context_garden-0.3.1/src/garden/hosts/locking.py +5 -0
  55. context_garden-0.3.1/src/garden/hosts/models.py +169 -0
  56. context_garden-0.3.1/src/garden/hosts/provider.py +66 -0
  57. context_garden-0.3.1/src/garden/hosts/registry.py +78 -0
  58. context_garden-0.3.1/src/garden/hosts/scale.py +512 -0
  59. context_garden-0.3.1/src/garden/inbox.py +1052 -0
  60. context_garden-0.3.1/src/garden/interaction_replay.py +179 -0
  61. context_garden-0.3.1/src/garden/kickoff.py +303 -0
  62. context_garden-0.3.1/src/garden/locking.py +67 -0
  63. context_garden-0.3.1/src/garden/managed_worker.py +161 -0
  64. context_garden-0.3.1/src/garden/model.py +517 -0
  65. context_garden-0.3.1/src/garden/notification_adapters.py +286 -0
  66. context_garden-0.3.1/src/garden/notify.py +172 -0
  67. context_garden-0.3.1/src/garden/now1.py +956 -0
  68. context_garden-0.3.1/src/garden/observe.py +370 -0
  69. context_garden-0.3.1/src/garden/onboard.py +727 -0
  70. context_garden-0.3.1/src/garden/openrouter_adapter.py +201 -0
  71. context_garden-0.3.1/src/garden/operator_spend.py +351 -0
  72. context_garden-0.3.1/src/garden/outcomes.py +442 -0
  73. context_garden-0.3.1/src/garden/personas.py +427 -0
  74. context_garden-0.3.1/src/garden/planner.py +353 -0
  75. context_garden-0.3.1/src/garden/plants.py +290 -0
  76. context_garden-0.3.1/src/garden/platefetch.py +214 -0
  77. context_garden-0.3.1/src/garden/preflight.py +184 -0
  78. context_garden-0.3.1/src/garden/proctree.py +236 -0
  79. context_garden-0.3.1/src/garden/profiles.py +78 -0
  80. context_garden-0.3.1/src/garden/qa/__init__.py +273 -0
  81. context_garden-0.3.1/src/garden/qa/flows.py +370 -0
  82. context_garden-0.3.1/src/garden/qa/sandbox.py +434 -0
  83. context_garden-0.3.1/src/garden/qa/worker.py +113 -0
  84. context_garden-0.3.1/src/garden/reference_snapshot.py +52 -0
  85. context_garden-0.3.1/src/garden/release.py +155 -0
  86. context_garden-0.3.1/src/garden/remote_worker.py +1298 -0
  87. context_garden-0.3.1/src/garden/resource_reclaim.py +94 -0
  88. context_garden-0.3.1/src/garden/retro.py +652 -0
  89. context_garden-0.3.1/src/garden/review.py +920 -0
  90. context_garden-0.3.1/src/garden/run_supervisor.py +948 -0
  91. context_garden-0.3.1/src/garden/runner/__init__.py +108 -0
  92. context_garden-0.3.1/src/garden/runner/base.py +522 -0
  93. context_garden-0.3.1/src/garden/runner/local.py +424 -0
  94. context_garden-0.3.1/src/garden/runner/manual.py +47 -0
  95. context_garden-0.3.1/src/garden/runner/remote.py +62 -0
  96. context_garden-0.3.1/src/garden/runner/ssh.py +394 -0
  97. context_garden-0.3.1/src/garden/runs.py +1841 -0
  98. context_garden-0.3.1/src/garden/sandbox.py +239 -0
  99. context_garden-0.3.1/src/garden/scaffold.py +581 -0
  100. context_garden-0.3.1/src/garden/scheduler/__init__.py +1023 -0
  101. context_garden-0.3.1/src/garden/scheduler/aux.py +198 -0
  102. context_garden-0.3.1/src/garden/scheduler/browser.py +95 -0
  103. context_garden-0.3.1/src/garden/scheduler/budget.py +359 -0
  104. context_garden-0.3.1/src/garden/scheduler/checkruns.py +1041 -0
  105. context_garden-0.3.1/src/garden/scheduler/cleanup.py +516 -0
  106. context_garden-0.3.1/src/garden/scheduler/discovered.py +305 -0
  107. context_garden-0.3.1/src/garden/scheduler/dispatch.py +945 -0
  108. context_garden-0.3.1/src/garden/scheduler/edits.py +191 -0
  109. context_garden-0.3.1/src/garden/scheduler/feedback.py +49 -0
  110. context_garden-0.3.1/src/garden/scheduler/fence.py +1039 -0
  111. context_garden-0.3.1/src/garden/scheduler/human.py +1624 -0
  112. context_garden-0.3.1/src/garden/scheduler/kickoff.py +284 -0
  113. context_garden-0.3.1/src/garden/scheduler/persona.py +322 -0
  114. context_garden-0.3.1/src/garden/scheduler/poll.py +1037 -0
  115. context_garden-0.3.1/src/garden/scheduler/queue.py +68 -0
  116. context_garden-0.3.1/src/garden/scheduler/quota.py +145 -0
  117. context_garden-0.3.1/src/garden/scheduler/reap.py +1492 -0
  118. context_garden-0.3.1/src/garden/scheduler/rebase.py +613 -0
  119. context_garden-0.3.1/src/garden/scheduler/report.py +51 -0
  120. context_garden-0.3.1/src/garden/scheduler/resources.py +548 -0
  121. context_garden-0.3.1/src/garden/scheduler/retro.py +1557 -0
  122. context_garden-0.3.1/src/garden/scheduler/review.py +1638 -0
  123. context_garden-0.3.1/src/garden/scheduler/scope.py +81 -0
  124. context_garden-0.3.1/src/garden/scheduler/selection.py +23 -0
  125. context_garden-0.3.1/src/garden/scheduler/snapshot.py +92 -0
  126. context_garden-0.3.1/src/garden/scheduler/state.py +484 -0
  127. context_garden-0.3.1/src/garden/scheduler/trials.py +460 -0
  128. context_garden-0.3.1/src/garden/scheduler/upgrades.py +248 -0
  129. context_garden-0.3.1/src/garden/scheduler_health.py +144 -0
  130. context_garden-0.3.1/src/garden/source_control.py +181 -0
  131. context_garden-0.3.1/src/garden/stabilization.py +419 -0
  132. context_garden-0.3.1/src/garden/storage.py +127 -0
  133. context_garden-0.3.1/src/garden/storage_cleanup.py +204 -0
  134. context_garden-0.3.1/src/garden/store.py +586 -0
  135. context_garden-0.3.1/src/garden/suggestions.py +217 -0
  136. context_garden-0.3.1/src/garden/system_resources.py +106 -0
  137. context_garden-0.3.1/src/garden/trials.py +195 -0
  138. context_garden-0.3.1/src/garden/tui/__init__.py +0 -0
  139. context_garden-0.3.1/src/garden/tui/app.py +563 -0
  140. context_garden-0.3.1/src/garden/upgrade.py +104 -0
  141. context_garden-0.3.1/src/garden/validation.py +253 -0
  142. context_garden-0.3.1/src/garden/walkthrough.py +1116 -0
  143. context_garden-0.3.1/src/garden/web/access.py +76 -0
  144. context_garden-0.3.1/src/garden/web/actions/__init__.py +41 -0
  145. context_garden-0.3.1/src/garden/web/actions/configuration.py +110 -0
  146. context_garden-0.3.1/src/garden/web/actions/control.py +173 -0
  147. context_garden-0.3.1/src/garden/web/actions/decisions.py +31 -0
  148. context_garden-0.3.1/src/garden/web/actions/friction.py +52 -0
  149. context_garden-0.3.1/src/garden/web/actions/phases.py +296 -0
  150. context_garden-0.3.1/src/garden/web/actions/tasks.py +552 -0
  151. context_garden-0.3.1/src/garden/web/app.py +210 -0
  152. context_garden-0.3.1/src/garden/web/artifacts.py +68 -0
  153. context_garden-0.3.1/src/garden/web/common.py +702 -0
  154. context_garden-0.3.1/src/garden/web/pages/__init__.py +29 -0
  155. context_garden-0.3.1/src/garden/web/pages/api.py +780 -0
  156. context_garden-0.3.1/src/garden/web/pages/board.py +30 -0
  157. context_garden-0.3.1/src/garden/web/pages/config.py +136 -0
  158. context_garden-0.3.1/src/garden/web/pages/costs.py +127 -0
  159. context_garden-0.3.1/src/garden/web/pages/design.py +167 -0
  160. context_garden-0.3.1/src/garden/web/pages/events.py +25 -0
  161. context_garden-0.3.1/src/garden/web/pages/inbox.py +148 -0
  162. context_garden-0.3.1/src/garden/web/pages/now1.py +171 -0
  163. context_garden-0.3.1/src/garden/web/pages/phase.py +315 -0
  164. context_garden-0.3.1/src/garden/web/pages/runs.py +146 -0
  165. context_garden-0.3.1/src/garden/web/pages/task.py +431 -0
  166. context_garden-0.3.1/src/garden/web/pages/trellis.py +39 -0
  167. context_garden-0.3.1/src/garden/web/pages/trials.py +29 -0
  168. context_garden-0.3.1/src/garden/web/static/mock/now-2.html +382 -0
  169. context_garden-0.3.1/src/garden/web/static/plates/README.md +15 -0
  170. context_garden-0.3.1/src/garden/web/static/plates/SOURCES.md +22 -0
  171. context_garden-0.3.1/src/garden/web/static/plates/adonis-thumb.webp +0 -0
  172. context_garden-0.3.1/src/garden/web/static/plates/adonis.webp +0 -0
  173. context_garden-0.3.1/src/garden/web/static/plates/bramble-thumb.webp +0 -0
  174. context_garden-0.3.1/src/garden/web/static/plates/bramble.webp +0 -0
  175. context_garden-0.3.1/src/garden/web/static/plates/daphne-thumb.webp +0 -0
  176. context_garden-0.3.1/src/garden/web/static/plates/daphne.webp +0 -0
  177. context_garden-0.3.1/src/garden/web/static/plates/fern-thumb.webp +0 -0
  178. context_garden-0.3.1/src/garden/web/static/plates/fern.webp +0 -0
  179. context_garden-0.3.1/src/garden/web/static/plates/foxglove-thumb.webp +0 -0
  180. context_garden-0.3.1/src/garden/web/static/plates/foxglove.webp +0 -0
  181. context_garden-0.3.1/src/garden/web/static/plates/orchid-thumb.webp +0 -0
  182. context_garden-0.3.1/src/garden/web/static/plates/orchid.webp +0 -0
  183. context_garden-0.3.1/src/garden/web/static/plates/pea-thumb.webp +0 -0
  184. context_garden-0.3.1/src/garden/web/static/plates/pea.webp +0 -0
  185. context_garden-0.3.1/src/garden/web/static/plates/peony-thumb.webp +0 -0
  186. context_garden-0.3.1/src/garden/web/static/plates/peony.webp +0 -0
  187. context_garden-0.3.1/src/garden/web/static/plates/poppy-thumb.webp +0 -0
  188. context_garden-0.3.1/src/garden/web/static/plates/poppy.webp +0 -0
  189. context_garden-0.3.1/src/garden/web/static/plates/quince-thumb.webp +0 -0
  190. context_garden-0.3.1/src/garden/web/static/plates/quince.webp +0 -0
  191. context_garden-0.3.1/src/garden/web/static/plates/snapdragon-thumb.webp +0 -0
  192. context_garden-0.3.1/src/garden/web/static/plates/snapdragon.webp +0 -0
  193. context_garden-0.3.1/src/garden/web/static/plates/thistle-thumb.webp +0 -0
  194. context_garden-0.3.1/src/garden/web/static/plates/thistle.webp +0 -0
  195. context_garden-0.3.1/src/garden/web/templates/_backlog.html +35 -0
  196. context_garden-0.3.1/src/garden/web/templates/_board.html +48 -0
  197. context_garden-0.3.1/src/garden/web/templates/_cost_comparisons.html +21 -0
  198. context_garden-0.3.1/src/garden/web/templates/_decision_card.html +43 -0
  199. context_garden-0.3.1/src/garden/web/templates/_kickoff.html +16 -0
  200. context_garden-0.3.1/src/garden/web/templates/_now1_head.html +5 -0
  201. context_garden-0.3.1/src/garden/web/templates/_now1_macros.html +104 -0
  202. context_garden-0.3.1/src/garden/web/templates/_now1_next.html +30 -0
  203. context_garden-0.3.1/src/garden/web/templates/_now1_now.html +14 -0
  204. context_garden-0.3.1/src/garden/web/templates/_now1_period.html +39 -0
  205. context_garden-0.3.1/src/garden/web/templates/_now1_strip.html +1 -0
  206. context_garden-0.3.1/src/garden/web/templates/_now1_where.html +16 -0
  207. context_garden-0.3.1/src/garden/web/templates/_prs.html +22 -0
  208. context_garden-0.3.1/src/garden/web/templates/_retro_verdict.html +17 -0
  209. context_garden-0.3.1/src/garden/web/templates/_runs.html +14 -0
  210. context_garden-0.3.1/src/garden/web/templates/_stdout.html +99 -0
  211. context_garden-0.3.1/src/garden/web/templates/base.html +858 -0
  212. context_garden-0.3.1/src/garden/web/templates/board.html +109 -0
  213. context_garden-0.3.1/src/garden/web/templates/config.html +333 -0
  214. context_garden-0.3.1/src/garden/web/templates/costs.html +131 -0
  215. context_garden-0.3.1/src/garden/web/templates/design.html +6 -0
  216. context_garden-0.3.1/src/garden/web/templates/doc.html +9 -0
  217. context_garden-0.3.1/src/garden/web/templates/error.html +5 -0
  218. context_garden-0.3.1/src/garden/web/templates/events.html +30 -0
  219. context_garden-0.3.1/src/garden/web/templates/herbarium.html +29 -0
  220. context_garden-0.3.1/src/garden/web/templates/inbox.html +187 -0
  221. context_garden-0.3.1/src/garden/web/templates/now1.html +475 -0
  222. context_garden-0.3.1/src/garden/web/templates/now_workers.html +77 -0
  223. context_garden-0.3.1/src/garden/web/templates/phase.html +113 -0
  224. context_garden-0.3.1/src/garden/web/templates/phase_closed.html +82 -0
  225. context_garden-0.3.1/src/garden/web/templates/phase_retro.html +45 -0
  226. context_garden-0.3.1/src/garden/web/templates/run.html +84 -0
  227. context_garden-0.3.1/src/garden/web/templates/runs.html +30 -0
  228. context_garden-0.3.1/src/garden/web/templates/task.html +251 -0
  229. context_garden-0.3.1/src/garden/web/templates/trellis.html +36 -0
  230. context_garden-0.3.1/src/garden/web/templates/trials.html +23 -0
  231. context_garden-0.3.1/src/garden/web/trust.py +274 -0
  232. context_garden-0.3.1/src/garden/worker_diagnostics.py +151 -0
  233. context_garden-0.3.1/src/garden/workers.py +241 -0
  234. context_garden-0.3.1/src/garden/workload_identity.py +362 -0
@@ -0,0 +1,9 @@
1
+ .garden/
2
+ .venv/
3
+ __pycache__/
4
+ *.pyc
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ dist/
8
+ *.egg-info/
9
+ garden.local.yaml
@@ -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
+ [![Context Garden's development loop: tasks return through revision on the left while growing file nodes and code dependencies fill the graph on the right.](docs/screenshots/history-film.png)](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
+ ![The development loop: maintain principles, product context, goals, and specs; plan and approve; build and check; review and merge. Feedback drives revisions, and retrospectives inform the next phase.](docs/development-loop.svg)
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
+ ![Now showing parallel agent runs, progress excerpts, review work, and the last 24 hours of activity in the real development garden](docs/screenshots/now-light.png)
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
+ ![Example Inbox with a worker question, an answer field, and draft tasks to approve](docs/screenshots/inbox-light.png)
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
+ ![Live Board backlog showing tasks grouped by phase with priorities, state, and reorder controls](docs/screenshots/board-backlog-light.png)
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
+ ![Live Board columns showing draft, blocked, ready, running, and review work](docs/screenshots/board-columns-light.png)
98
+
99
+ **List:** read task titles, state, priority, difficulty, and PR links together.
100
+
101
+ ![Live Board list showing tasks by state in a single phase](docs/screenshots/board-list-light.png)
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
+ ![Now comparison charts showing cost per accepted task, first-pass approval, work-run cost, revision rounds, and median lead time by model and difficulty](docs/screenshots/now-outcomes-light.png)
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
+ ![Now heatmap comparing mean cost per run across activities, harnesses, and models, with totals and sample counts](docs/screenshots/now-run-costs-light.png)
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
+ ![Trellis showing dependencies across an example project's tasks](docs/screenshots/trellis-light.png)
127
+
128
+ ![Dark task page with a worker question, acceptance criteria, and recorded usage](docs/screenshots/task-dark.png)
129
+
130
+ ![Example phase page with progress, task status, and its specification](docs/screenshots/phase-light.png)
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).