brigade-cli 0.11.0__tar.gz → 0.13.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/PKG-INFO +96 -49
  2. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/QUICKSTART.md +2 -2
  3. brigade_cli-0.13.0/README.md +228 -0
  4. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/pyproject.toml +1 -1
  5. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/__init__.py +1 -1
  6. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/agents.py +34 -0
  7. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/__init__.py +6 -0
  8. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/_common.py +6 -3
  9. brigade_cli-0.13.0/src/brigade/cli/completions.py +17 -0
  10. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/doctor.py +2 -1
  11. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/friction.py +10 -0
  12. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/hermes_fragments.py +1 -1
  13. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/init.py +10 -0
  14. brigade_cli-0.13.0/src/brigade/cli/mcp.py +136 -0
  15. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/memory.py +19 -0
  16. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/operator.py +41 -0
  17. brigade_cli-0.13.0/src/brigade/cli/outcome.py +111 -0
  18. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/projects.py +5 -0
  19. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/repos.py +6 -1
  20. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/run.py +43 -0
  21. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/runbook.py +16 -1
  22. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/scrub.py +11 -1
  23. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/security.py +30 -2
  24. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/skills.py +12 -0
  25. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/status.py +2 -1
  26. brigade_cli-0.13.0/src/brigade/completions.py +91 -0
  27. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/context_cmd.py +68 -1
  28. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/doctor.py +141 -26
  29. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/fragments.py +1 -1
  30. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/friction_cmd.py +27 -0
  31. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/install.py +54 -11
  32. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/localio.py +24 -3
  33. brigade_cli-0.13.0/src/brigade/mcp_adapters.py +717 -0
  34. brigade_cli-0.13.0/src/brigade/mcp_cmd.py +596 -0
  35. brigade_cli-0.13.0/src/brigade/mcp_server.py +96 -0
  36. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/memory_cmd.py +199 -1
  37. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/__init__.py +6 -0
  38. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/lifecycle.py +185 -2
  39. brigade_cli-0.13.0/src/brigade/outcome.py +179 -0
  40. brigade_cli-0.13.0/src/brigade/outcome_cmd.py +380 -0
  41. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/projects_cmd.py +15 -0
  42. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/prompt.py +1 -1
  43. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/registry.py +8 -1
  44. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/repos_cmd.py +78 -2
  45. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/runbook_cmd.py +115 -17
  46. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/scrub.py +63 -3
  47. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/security_cmd.py +103 -2
  48. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/skills_cmd.py +124 -82
  49. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/status.py +25 -4
  50. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/depth/workspace.json +1 -1
  51. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/generic/memory-contract.md +1 -1
  52. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/hermes.json +3 -3
  53. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/README.md +3 -3
  54. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/memory-handoff.harness.json +3 -3
  55. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/model-lanes.harness.json +3 -3
  56. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/workspace.harness.json +4 -4
  57. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/hooks/pre-push +15 -1
  58. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/chat-memory-sweep.example.json +1 -1
  59. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/memory-care.example.json +1 -1
  60. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/policies/personal.json +1 -1
  61. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/policies/public-content.json +1 -1
  62. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/policies/public-repo.json +1 -1
  63. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/AGENTS.md +9 -0
  64. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/toml_compat.py +21 -1
  65. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/tools_cmd.py +1 -1
  66. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/helpers.py +14 -7
  67. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/PKG-INFO +96 -49
  68. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/SOURCES.txt +28 -0
  69. brigade_cli-0.13.0/tests/test_completions.py +46 -0
  70. brigade_cli-0.13.0/tests/test_context_cmd.py +83 -0
  71. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_doctor.py +105 -2
  72. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_fragments.py +1 -1
  73. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_init.py +57 -1
  74. brigade_cli-0.13.0/tests/test_localio.py +38 -0
  75. brigade_cli-0.13.0/tests/test_mcp_adapters.py +236 -0
  76. brigade_cli-0.13.0/tests/test_mcp_cmd.py +250 -0
  77. brigade_cli-0.13.0/tests/test_mcp_integration.py +143 -0
  78. brigade_cli-0.13.0/tests/test_mcp_server.py +60 -0
  79. brigade_cli-0.13.0/tests/test_mcp_user_scope.py +109 -0
  80. brigade_cli-0.13.0/tests/test_memory_search_mcp.py +89 -0
  81. brigade_cli-0.13.0/tests/test_operator_checkup.py +72 -0
  82. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_operator_cmd.py +28 -0
  83. brigade_cli-0.13.0/tests/test_outcome.py +164 -0
  84. brigade_cli-0.13.0/tests/test_outcome_cmd.py +260 -0
  85. brigade_cli-0.13.0/tests/test_outcome_execute.py +78 -0
  86. brigade_cli-0.13.0/tests/test_parity_backlog.py +92 -0
  87. brigade_cli-0.13.0/tests/test_pre_push_hook.py +30 -0
  88. brigade_cli-0.13.0/tests/test_read_only_enforcement.py +47 -0
  89. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_repos_cmd.py +41 -1
  90. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_runbook_cmd.py +99 -6
  91. brigade_cli-0.13.0/tests/test_runbook_import.py +48 -0
  92. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_security_cmd.py +2 -2
  93. brigade_cli-0.13.0/tests/test_security_diff.py +62 -0
  94. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_skills_cmd.py +45 -1
  95. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_status.py +17 -0
  96. brigade_cli-0.13.0/tests/test_subprocess_guards.py +51 -0
  97. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_toml_compat.py +14 -0
  98. brigade_cli-0.11.0/README.md +0 -181
  99. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/LICENSE +0 -0
  100. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/MANIFEST.in +0 -0
  101. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/setup.cfg +0 -0
  102. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/__main__.py +0 -0
  103. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/aboyeur.py +0 -0
  104. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/actionqueue.py +0 -0
  105. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/add.py +0 -0
  106. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/budgets.py +0 -0
  107. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/budgets_cmd.py +0 -0
  108. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/center_cmd.py +0 -0
  109. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/chat_cmd.py +0 -0
  110. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/add.py +0 -0
  111. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/budgets.py +0 -0
  112. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/center.py +0 -0
  113. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/chat.py +0 -0
  114. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/context.py +0 -0
  115. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/daily.py +0 -0
  116. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/dogfood.py +0 -0
  117. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/handoff.py +0 -0
  118. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/handoff_template.py +0 -0
  119. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/ingest.py +0 -0
  120. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/learn.py +0 -0
  121. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/notifications.py +0 -0
  122. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/openclaw_fragments.py +0 -0
  123. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/pantry.py +0 -0
  124. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/reconfigure.py +0 -0
  125. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/release.py +0 -0
  126. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/research.py +0 -0
  127. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/roadmap.py +0 -0
  128. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/roster.py +0 -0
  129. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/runs.py +0 -0
  130. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/tools.py +0 -0
  131. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/untrusted.py +0 -0
  132. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/cli/work.py +0 -0
  133. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/config.py +0 -0
  134. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/daily_cmd.py +0 -0
  135. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/dogfood_cmd.py +0 -0
  136. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/handoff.py +0 -0
  137. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/handoff_cmd.py +0 -0
  138. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/hermes_adapter.py +0 -0
  139. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/ingest.py +0 -0
  140. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/learn_cmd.py +0 -0
  141. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/managed.py +0 -0
  142. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/notifications_cmd.py +0 -0
  143. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/adoption.py +0 -0
  144. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/guide.py +0 -0
  145. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/health.py +0 -0
  146. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/migration.py +0 -0
  147. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/surfaces.py +0 -0
  148. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/pantry_cmd.py +0 -0
  149. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/phases_cmd.py +0 -0
  150. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/proc.py +0 -0
  151. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/py.typed +0 -0
  152. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/reconfigure.py +0 -0
  153. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/release_cmd.py +0 -0
  154. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/reportstore.py +0 -0
  155. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/__init__.py +0 -0
  156. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/config.py +0 -0
  157. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/engine.py +0 -0
  158. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/extract.py +0 -0
  159. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/handoff.py +0 -0
  160. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/llm.py +0 -0
  161. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/registry.py +0 -0
  162. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/report.py +0 -0
  163. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/sources/__init__.py +0 -0
  164. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/sources/cli.py +0 -0
  165. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/sources/local.py +0 -0
  166. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/sources/web.py +0 -0
  167. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research/types.py +0 -0
  168. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/research_cmd.py +0 -0
  169. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/roadmap_cmd.py +0 -0
  170. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/roster.py +0 -0
  171. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/roster_cmd.py +0 -0
  172. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/runguard.py +0 -0
  173. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/runs_cmd.py +0 -0
  174. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/selection.py +0 -0
  175. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/station.py +0 -0
  176. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/adal/memory-handoffs/TEMPLATE.md +0 -0
  177. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/aider/memory-handoffs/TEMPLATE.md +0 -0
  178. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/amp/memory-handoffs/TEMPLATE.md +0 -0
  179. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/antigravity/memory-handoffs/TEMPLATE.md +0 -0
  180. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/claude/memory-handoffs/TEMPLATE.md +0 -0
  181. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/codex/memory-handoffs/TEMPLATE.md +0 -0
  182. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/continue/memory-handoffs/TEMPLATE.md +0 -0
  183. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/copilot/memory-handoffs/TEMPLATE.md +0 -0
  184. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/crush/memory-handoffs/TEMPLATE.md +0 -0
  185. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/cursor/memory-handoffs/TEMPLATE.md +0 -0
  186. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/depth/repo.json +0 -0
  187. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/generic/harness-adapter-checklist.md +0 -0
  188. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/goose/memory-handoffs/TEMPLATE.md +0 -0
  189. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/grok/memory-handoffs/TEMPLATE.md +0 -0
  190. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/handoff/handoff-sources.example.json +0 -0
  191. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/handoff/openclaw-ingest-receipt.example.json +0 -0
  192. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/adal.json +0 -0
  193. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/aider.json +0 -0
  194. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/amp.json +0 -0
  195. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/antigravity.json +0 -0
  196. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/claude.json +0 -0
  197. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/codex.json +0 -0
  198. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/continue.json +0 -0
  199. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/copilot.json +0 -0
  200. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/crush.json +0 -0
  201. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/cursor.json +0 -0
  202. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/goose.json +0 -0
  203. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/grok.json +0 -0
  204. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/kimi.json +0 -0
  205. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/openclaw.json +0 -0
  206. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/opencode.json +0 -0
  207. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/openhands.json +0 -0
  208. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/pi.json +0 -0
  209. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/qwen.json +0 -0
  210. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/memory-handoffs/TEMPLATE.md +0 -0
  211. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/includes/publisher.json +0 -0
  212. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/kimi/memory-handoffs/TEMPLATE.md +0 -0
  213. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/backup-restic.md +0 -0
  214. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/chat-surface-crawlers.md +0 -0
  215. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/content-safety.md +0 -0
  216. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/handoff-flow.md +0 -0
  217. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/memory-architecture.md +0 -0
  218. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/memory-care-staleness.md +0 -0
  219. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/memory-scanner.md +0 -0
  220. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/multi-workspace-handoff-admin.md +0 -0
  221. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/obsidian-notes.md +0 -0
  222. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/pipeline-standups.md +0 -0
  223. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/tokenjuice-output-compaction.md +0 -0
  224. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/README.md +0 -0
  225. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/acp-escalation.openclaw.json +0 -0
  226. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/memory-sweep-cron.openclaw.json +0 -0
  227. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/model-aliases.openclaw.json +0 -0
  228. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/ollama-memory-search.openclaw.json +0 -0
  229. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/opencode/memory-handoffs/TEMPLATE.md +0 -0
  230. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/openhands/memory-handoffs/TEMPLATE.md +0 -0
  231. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/pi/memory-handoffs/TEMPLATE.md +0 -0
  232. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/qwen/memory-handoffs/TEMPLATE.md +0 -0
  233. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/scripts/backup-restic.sh +0 -0
  234. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/skills/note/SKILL.md +0 -0
  235. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/CLAUDE.md +0 -0
  236. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/HEARTBEAT.md +0 -0
  237. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/IDENTITY.md +0 -0
  238. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/INSTALL_FOR_AGENTS.md +0 -0
  239. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/MEMORY.md +0 -0
  240. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/SAFETY_RULES.md +0 -0
  241. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/SOUL.md +0 -0
  242. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/TOOLS.md +0 -0
  243. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/USER.md +0 -0
  244. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/rules/acceptance-driven-work.md +0 -0
  245. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/rules/issue-tdd-loop.md +0 -0
  246. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/templates.py +0 -0
  247. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/untrusted.py +0 -0
  248. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/untrusted_cmd.py +0 -0
  249. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/__init__.py +0 -0
  250. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/backup.py +0 -0
  251. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/config.py +0 -0
  252. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/constants.py +0 -0
  253. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/imports.py +0 -0
  254. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/ledger.py +0 -0
  255. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/reviews.py +0 -0
  256. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/scanners.py +0 -0
  257. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/services.py +0 -0
  258. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/session.py +0 -0
  259. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/sweeps.py +0 -0
  260. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/verification.py +0 -0
  261. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/dependency_links.txt +0 -0
  262. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/entry_points.txt +0 -0
  263. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/requires.txt +0 -0
  264. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/top_level.txt +0 -0
  265. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_aboyeur.py +0 -0
  266. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_actionqueue.py +0 -0
  267. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_add.py +0 -0
  268. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_agents.py +0 -0
  269. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_budgets.py +0 -0
  270. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_cli_alias.py +0 -0
  271. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_cli_help.py +0 -0
  272. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_config.py +0 -0
  273. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_dogfood_cmd.py +0 -0
  274. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_friction_cmd.py +0 -0
  275. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_gitignore.py +0 -0
  276. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_handoff.py +0 -0
  277. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_handoff_cmd.py +0 -0
  278. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_ingest.py +0 -0
  279. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_install.py +0 -0
  280. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_managed.py +0 -0
  281. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_memory_cmd.py +0 -0
  282. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_neutrality.py +0 -0
  283. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_notifications_cmd.py +0 -0
  284. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_pantry_cmd.py +0 -0
  285. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase100_cmd.py +0 -0
  286. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase101_cmd.py +0 -0
  287. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase165_cmd.py +0 -0
  288. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase36_cmd.py +0 -0
  289. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase37_cmd.py +0 -0
  290. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase38_cmd.py +0 -0
  291. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase39_cmd.py +0 -0
  292. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase40_cmd.py +0 -0
  293. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase41_cmd.py +0 -0
  294. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase42_cmd.py +0 -0
  295. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase43_cmd.py +0 -0
  296. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase44_cmd.py +0 -0
  297. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase45_cmd.py +0 -0
  298. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase46_50_cmd.py +0 -0
  299. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase51_55_cmd.py +0 -0
  300. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase56_60_cmd.py +0 -0
  301. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase96_cmd.py +0 -0
  302. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase97_cmd.py +0 -0
  303. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase98_cmd.py +0 -0
  304. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_phase99_cmd.py +0 -0
  305. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_privacy_regression.py +0 -0
  306. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_proc.py +0 -0
  307. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_prompt.py +0 -0
  308. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_reconfigure.py +0 -0
  309. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_registry.py +0 -0
  310. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_release_cmd.py +0 -0
  311. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_reportstore.py +0 -0
  312. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_cli_sources.py +0 -0
  313. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_cmd.py +0 -0
  314. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_config.py +0 -0
  315. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_engine.py +0 -0
  316. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_extract.py +0 -0
  317. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_handoff.py +0 -0
  318. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_llm.py +0 -0
  319. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_local_sources.py +0 -0
  320. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_registry.py +0 -0
  321. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_report.py +0 -0
  322. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_types.py +0 -0
  323. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_research_web.py +0 -0
  324. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_roadmap_cmd.py +0 -0
  325. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_roster.py +0 -0
  326. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_roster_cmd.py +0 -0
  327. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_run_cli.py +0 -0
  328. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_runguard.py +0 -0
  329. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_runs_cmd.py +0 -0
  330. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_scrub.py +0 -0
  331. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_selection.py +0 -0
  332. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_station.py +0 -0
  333. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_untrusted.py +0 -0
  334. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_untrusted_cmd.py +0 -0
  335. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_backup.py +0 -0
  336. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_facade.py +0 -0
  337. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_imports.py +0 -0
  338. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_ledger.py +0 -0
  339. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_reviews.py +0 -0
  340. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_scanners.py +0 -0
  341. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_services.py +0 -0
  342. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_session.py +0 -0
  343. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_sweeps.py +0 -0
  344. {brigade_cli-0.11.0 → brigade_cli-0.13.0}/tests/test_work_cmd_verification.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brigade-cli
3
- Version: 0.11.0
3
+ Version: 0.13.0
4
4
  Summary: AI agent memory, handoffs, and local guardrails for Codex, Claude Code, OpenCode, Hermes, and OpenClaw.
5
5
  Author-email: Solomon Neas <me@solomonneas.dev>
6
6
  License: MIT
@@ -35,7 +35,7 @@ Dynamic: license-file
35
35
  <h1 align="center">Brigade CLI</h1>
36
36
 
37
37
  <p align="center">
38
- <strong>AI agent memory, handoffs, and local guardrails for Codex, Claude Code, OpenCode, and over a dozen other harnesses.</strong>
38
+ <strong>One canonical source for the MCP servers, tools, and memory your AI coding agents share, merged into each tool's native config with a review gate and a receipt for every change. Local files, no daemon, no lock-in.</strong>
39
39
  </p>
40
40
 
41
41
  <p align="center">
@@ -47,46 +47,72 @@ Dynamic: license-file
47
47
 
48
48
  Your agents run loops. Brigade keeps the receipts.
49
49
 
50
+ ## What it does
51
+
52
+ You run more than one agent CLI. Each one keeps its MCP servers in its own config file, its memory in its own silo, and writes to both without review. Brigade is the local layer that fixes that. You keep one canonical source for your MCP servers, your tool and skill catalog, and your memory, and Brigade merges each into the tools you actually use: MCP servers into each tool's native config, tools and skills projected into each harness, and one shared memory owned in one place. A review gate sits in front of anything that gets written, and every consequential change lands a receipt you can grep, diff, and roll back. No daemon, no hosted service, no vendor lock-in: it writes plain files in your repo when you run a command, and that is all it does.
53
+
50
54
  ## Try it in 60 seconds
51
55
 
52
56
  ```bash
53
57
  pipx install brigade-cli
58
+ pipx ensurepath # then open a new shell so `brigade` is on PATH
54
59
  brigade operator quickstart --target ./my-repo --harnesses codex # wire one repo
55
60
  brigade operator doctor --target ./my-repo --profile local-operator # verify
56
61
  ```
57
62
 
58
63
  That installs the CLI, wires memory, handoffs, and local guardrails into one repo for a single harness, and prints a readiness check. Nothing leaves your machine and no daemon is started. Add `--dry-run` to preview the file-by-file plan before anything is written. More harnesses, workspace setups, and the homegrown-adoption path are under [Install](#install).
59
64
 
60
- ## Why I built this
65
+ ## One MCP catalog, synced into every tool
66
+
67
+ Every agent tool reads its MCP servers from a different file in a different shape. The same servers wired across Claude Code, Cursor, Codex, VS Code, OpenCode, and Antigravity means hand-editing six configs and keeping them in sync forever. Brigade keeps one canonical catalog and merges it into each tool's native config for you.
68
+
69
+ ```bash
70
+ brigade mcp init # scaffold .brigade/mcp.json
71
+ brigade mcp add --name github --command npx \
72
+ --args "-y @modelcontextprotocol/server-github" \
73
+ --env GITHUB_TOKEN=ref:GITHUB_TOKEN
74
+ brigade mcp sync # dry-run: show the diff for every tool
75
+ brigade mcp sync --write # merge into each tool's config
76
+ ```
61
77
 
62
- I run an always-on OpenClaw agent next to daily Codex and Claude Code sessions, and I have since January. Every one of those tools wakes up empty. Whatever a session learned about my machine, my rules, or yesterday's dead ends scattered across tool-specific folders and died there.
78
+ One catalog (`.brigade/mcp.json`), six native targets:
63
79
 
64
- So I hand-rolled the fixes, one incident at a time: a slim `MEMORY.md` index pointing at small memory cards instead of one giant file, a handoff note format every harness could write, an ingest cron that filed the good notes into durable memory every 30 minutes, staleness checks so old cards stopped being trusted forever.
80
+ | Tool | File it writes |
81
+ |---|---|
82
+ | Claude Code | `.mcp.json` |
83
+ | Cursor | `.cursor/mcp.json` |
84
+ | Codex CLI | `.codex/config.toml` (merged surgically, other tables preserved) |
85
+ | VS Code | `.vscode/mcp.json` (secrets become `inputs[]`) |
86
+ | OpenCode | `opencode.json` |
87
+ | Antigravity | `~/.gemini/config/mcp_config.json` (user-scoped, `--user-scope`) |
65
88
 
66
- Two incidents shaped the design more than anything I planned. First, a nightly "dreaming" job that auto-promoted session fragments bloated `MEMORY.md` to 41KB, way past the 12KB bootstrap budget, so every session started with truncated memory and nobody noticed for weeks. Auto-promotion died that day. Everything goes through review now. Second, I found 195 handoff notes sitting unread across 35 repos because the ingester had a hardcoded three-repo allowlist and nothing warned about the coverage gap. Silence is the failure mode. Every part of Brigade that lints, warns, or writes a receipt exists because something once failed in silence.
89
+ It is dry-run by default and never runs from `doctor` or `brief`. It merges by server key, so servers you added by hand are never touched, and ones you edited are left alone unless you pass `--force`. Secrets are written as `${VAR}` references (or VS Code `${input:VAR}`), never inlined. Ownership is tracked in a gitignored sidecar, so re-syncing on a fresh clone does not spuriously conflict. Full behavior in [docs/mcp-sync.md](docs/mcp-sync.md).
67
90
 
68
- That system now runs 482 memory cards and survives daily multi-agent work. But explaining it to anyone meant: clone six repos, write these crons, keep your index slim, watch for staleness, and whatever you do, turn auto-promotion off. Brigade is that setup packaged as one installable CLI. The full production stack is documented in the [solos-cookbook](https://github.com/escoffier-labs/solos-cookbook) if you want to see where it came from.
91
+ Tools and skills get the same treatment: `brigade tools sync` projects one reviewed catalog into each harness's native format.
69
92
 
70
- ## The loop
93
+ > `brigade mcp` requires brigade 0.13.0 or newer (`pipx upgrade brigade-cli`).
71
94
 
72
- Writer harnesses leave handoff notes as they work. A memory owner (OpenClaw, Hermes, or just you) ingests the ones worth keeping. Brigade lints, guards, and routes everything in between, and every consequential action lands a receipt in a plain file you can grep, diff, and prune.
95
+ ## Shared memory, with a guard in front
96
+
97
+ Writer harnesses leave handoff notes as they work. Brigade lints, guards, and classifies each one, then files the safe, targeted notes into durable memory on its own. A memory owner (OpenClaw, Hermes, or just you) only steps in for the ambiguous few. Every consequential action lands a receipt in a plain file you can grep, diff, and prune.
73
98
 
74
99
  1. agents write handoff notes into their own local inboxes
75
- 2. Brigade lints and scans them before they can become memory
76
- 3. safe targeted notes get filed into durable memory by the owner
77
- 4. ambiguous or risky notes wait for your review
100
+ 2. Brigade lints and classifies each one before it can become memory
101
+ 3. safe, targeted notes file themselves into durable memory automatically
102
+ 4. only the ambiguous or risky few wait for your review
78
103
  5. future sessions start with better context, and receipts show what happened
79
104
 
80
105
  ```mermaid
81
106
  flowchart LR
82
107
  WRITERS["writer harnesses<br/>Codex · Claude Code · OpenCode · ..."]
83
- BRIGADE["Brigade<br/>lint · guard · route · receipts"]
84
- REVIEW["operator review<br/>safe · ambiguous · risky"]
108
+ BRIGADE["Brigade<br/>lint · guard · classify · receipts"]
85
109
  OWNER["memory owner<br/>OpenClaw / Hermes / you"]
86
110
  MEM["durable memory<br/>MEMORY.md index · memory cards"]
111
+ REVIEW["review inbox<br/>ambiguous · risky"]
87
112
 
88
- WRITERS -- handoff notes --> BRIGADE --> REVIEW
89
- REVIEW -- safe targeted notes --> OWNER --> MEM
113
+ WRITERS -- handoff notes --> BRIGADE --> OWNER
114
+ OWNER -- safe targeted, auto-filed --> MEM
115
+ OWNER -. ambiguous or risky .-> REVIEW
90
116
  MEM -. context .-> WRITERS
91
117
 
92
118
  classDef brigade fill:#2563eb,stroke:#1d4ed8,color:#fff;
@@ -97,38 +123,31 @@ flowchart LR
97
123
  class REVIEW gate;
98
124
  ```
99
125
 
100
- Memory has two layers: knowledge cards under `memory/cards/` hold the detail, and `MEMORY.md` stays a slim one-line-per-card index that loads every session. `brigade memory care scan` flags stale, contradictory, or undersourced cards for review instead of letting them rot. Brigade never edits canonical memory itself; the owner does the writing.
101
-
102
- It all runs on the machine you control: laptop, workstation, or VPS. Local by default, loud about the exceptions.
103
-
104
- ## Install
126
+ Memory has two layers: knowledge cards under `memory/cards/` hold the detail, and `MEMORY.md` stays a slim one-line-per-card index that loads every session. `brigade memory care scan` flags stale, contradictory, or undersourced cards for review instead of letting them rot. Brigade never edits canonical memory itself; the owner does the writing. It all runs on the machine you control: laptop, workstation, or VPS.
105
127
 
106
- ```bash
107
- pipx install brigade-cli
108
- brigade operator quickstart --target ./my-repo --harnesses codex
109
- brigade operator doctor --target ./my-repo --profile local-operator
110
- ```
128
+ ## Verified learning
111
129
 
112
- For an OpenClaw or Hermes workspace instead of a code repo:
130
+ Filing notes is the first loop. The second loop earns trust. Brigade can promote a learned skill on its own, but only when a real signal proves it helped, and it rolls one back the moment a signal says it broke. The model never grades its own work.
113
131
 
114
- ```bash
115
- brigade operator quickstart --target ~/agent-workspace --depth workspace --harnesses openclaw,hermes --owner openclaw
116
- ```
132
+ - `brigade outcome capture` records the result of a verify run (a real exit code, not an opinion) against the skill that produced it.
133
+ - `brigade outcome score` ranks each skill by a Wilson lower bound, so something that passed twice never outranks something vetted across twenty runs.
134
+ - `brigade outcome reconcile` is the gate. Dry-run by default; with `--apply` it installs a skill that earned it across your harnesses, or rolls a regressed one back to its last good version.
135
+ - `brigade outcome explain` prints the full signal trail behind any decision: which run produced each result, the threshold it crossed, and the reversible action taken.
117
136
 
118
- Use `--dry-run` first to preview the planned steps without writing anything; `brigade init --target ./my-repo --harnesses codex --dry-run` shows the full file-by-file list. Pass more harnesses as a comma-separated list. Quickstart only wires the harnesses you select and leaves the rest alone.
137
+ The whole ledger is plain JSON and markdown under `memory/outcome/`, tracked in git and readable without Brigade. Schedule `brigade outcome reconcile` in your own cron to run it hands-off; Brigade still installs no daemon.
119
138
 
120
- Write a handoff and check the wiring:
139
+ ## Sidecars
121
140
 
122
- ```bash
123
- brigade handoff draft --target ./my-repo --inbox codex \
124
- --title "What changed" \
125
- --summary "Short note future agents should know." \
126
- --content "The durable note itself goes here."
127
- brigade handoff lint --target ./my-repo
128
- brigade handoff doctor --target ./my-repo
129
- ```
141
+ Brigade is the hub. Each station wires an optional standalone tool, installed with `brigade add <station>` and health-checked by `brigade status` and `brigade doctor`. Every tool is its own repo, independently installable, with no library coupling back into Brigade.
130
142
 
131
- New here? Start with [QUICKSTART.md](QUICKSTART.md) for the five-minute install, then [docs/first-10-minutes.md](docs/first-10-minutes.md) for the guided first session. Already have a homegrown setup with scripts, crons, and handoff folders? Brigade has an adoption path that inventories what you have before changing anything: start with `brigade operator adopt plan` and see the [technical guide](docs/technical-guide.md). Want an agent to set this up for you? Point it at this repo; [AGENTS.md](AGENTS.md) tells it exactly what to do and where to stop.
143
+ | `brigade add` | Tool | What it does |
144
+ |---|---|---|
145
+ | `guard` | content-guard | scans handoffs and content for secrets and PII before anything leaves the machine |
146
+ | `tokens` | tokenjuice | tracks token spend across your harnesses and compacts noisy output |
147
+ | `memory` | memory-doctor, bootstrap-doctor | validates memory cards and bootstrap files for staleness and contradictions |
148
+ | `pantry` | agentpantry | syncs browser sessions and auth across an agent's machine |
149
+ | `search` | code-search | local semantic code search over your repos |
150
+ | `evidence` | miseledger | a local-first evidence ledger with receipts and source exporters |
132
151
 
133
152
  ## Harness support
134
153
 
@@ -156,18 +175,17 @@ Each writer gets its own local inbox; one canonical owner ingests. Brigade keeps
156
175
  | Hermes | `hermes` | `.hermes/memory-handoffs/` |
157
176
  | OpenClaw | `openclaw` | usually the memory owner, not a writer |
158
177
 
159
- All of them get handoff templates, ingest source coverage, and projected tools/skills. Per-harness details are in the [technical guide](docs/technical-guide.md).
178
+ All of them get handoff templates and ingest source coverage. Most also get projected tools and skills in their native format; the per-harness matrix is in the [technical guide](docs/technical-guide.md). Hermes is validated against a real install: handoffs land in `.hermes/memory-handoffs/`, and reviewed skills install into your Hermes store (`~/.hermes/skills`).
160
179
 
161
- ## Beyond memory
180
+ ## More
162
181
 
163
- The memory loop is the core. Around it, the same review-and-receipt pattern covers the rest of an operator's day, and you can ignore all of it until you need it:
182
+ The same review-and-receipt pattern covers the rest of an operator's day, and you can ignore all of it until you need it.
164
183
 
184
+ - **Cross-model runs**: `brigade run "<task>"` plans, dispatches, and synthesizes one bounded task across the agent CLIs in your roster, so an expensive model can think while cheaper ones do the grunt work. `--worktree` runs everything in a detached git checkout that comes back as a reviewable `changes.patch`.
165
185
  - **Daily loop**: `brigade work brief` shows pending work, imports, and warnings; `brigade daily status` keeps it bounded and cheap.
166
- - **Friction logs**: `brigade friction scan --days 30 --import-candidates` mines recent notes, handoffs, session artifacts, and optional local agent logs for reviewable workflow friction.
167
- - **Security**: `brigade security scan` is a local read-only scanner for agent workspaces (secrets, risky hooks, MCP configs, prompt-injection patterns); `brigade scrub` gates content before it leaves the machine.
168
- - **Tools and skills**: one reviewed catalog projected into every harness's native format, with approval gates for anything that executes.
186
+ - **Friction logs**: `brigade friction scan` mines recent notes, handoffs, and session artifacts for reviewable workflow friction.
187
+ - **Security and scrub**: `brigade security scan` is a local read-only scanner for agent workspaces; `brigade scrub` gates content before it leaves the machine.
169
188
  - **Research**: `brigade research run` turns a question into a cited local report and a reviewable memory handoff.
170
- - **Cross-model runs**: `brigade run "<task>"` plans, dispatches, and synthesizes one bounded task across the agent CLIs in your roster, so an expensive model can think while cheaper ones do the grunt work. Rosters pin a model per agent, plans can stage dependent workers, and `--worktree` runs everything in a detached git checkout that comes back as a reviewable `changes.patch`. A dirty-tree guard and a run lock keep agents away from your work in progress.
171
189
  - **Fleet and release**: health evidence across your local repos and release-readiness receipts, with no publish step.
172
190
 
173
191
  The full tour of every station lives in [docs/overview.md](docs/overview.md).
@@ -176,7 +194,8 @@ The full tour of every station lives in [docs/overview.md](docs/overview.md).
176
194
 
177
195
  - **mem0, Letta, and friends** are memory layers for apps you are building, usually behind an API or a server. Brigade is for the agent CLIs you already run, and it is file-first: your memory is markdown in your repo, reviewable in git, readable without Brigade.
178
196
  - **Native harness memory** (each tool's own auto-memory) is a per-tool silo. It does not cross harnesses, and it writes without review. Brigade gives every tool one shared format and one canonical owner, with a review gate in between.
179
- - **A plain CLAUDE.md / AGENTS.md** works great until it bloats past the context budget and goes stale. Brigade exists because mine hit 41KB. It keeps bootstrap files slim, moves detail into indexed cards, and flags staleness instead of trusting last month's facts forever.
197
+ - **Already running Hermes, or any self-improving agent?** Keep it. Brigade is not a replacement, it is the verification layer on top. A built-in learning loop grades its own work and keeps what it learns inside one tool. Brigade promotes a skill only when a real signal confirms it, keeps every learned skill as portable markdown in your git, and runs one loop across your whole fleet.
198
+ - **A plain CLAUDE.md / AGENTS.md** works great until it bloats past the context budget and goes stale. Brigade keeps bootstrap files slim, moves detail into indexed cards, and flags staleness instead of trusting last month's facts forever.
180
199
  - **A daemon or hosted service** would be simpler to demo and worse to trust. Brigade writes local files when you run a command, and that is all it does.
181
200
 
182
201
  ## What Brigade is not
@@ -194,11 +213,39 @@ It does not:
194
213
 
195
214
  That pause is the point. Agent memory should be useful, not noisy.
196
215
 
216
+ ## Install
217
+
218
+ `brigade operator quickstart` (in [Try it in 60 seconds](#try-it-in-60-seconds)) wires one code repo for one harness. For an OpenClaw or Hermes workspace instead:
219
+
220
+ ```bash
221
+ brigade operator quickstart --target ~/agent-workspace --depth workspace --harnesses openclaw,hermes --owner openclaw
222
+ ```
223
+
224
+ Use `--dry-run` first to preview the planned steps without writing anything. Pass more harnesses as a comma-separated list; quickstart only wires the harnesses you select and leaves the rest alone.
225
+
226
+ Write a handoff and check the wiring:
227
+
228
+ ```bash
229
+ brigade handoff draft --target ./my-repo --inbox codex \
230
+ --title "What changed" \
231
+ --summary "Short note future agents should know." \
232
+ --content "The durable note itself goes here."
233
+ brigade handoff lint --target ./my-repo
234
+ brigade handoff doctor --target ./my-repo
235
+ ```
236
+
237
+ New here? Start with [QUICKSTART.md](QUICKSTART.md) for the five-minute install, then [docs/first-10-minutes.md](docs/first-10-minutes.md) for the guided first session. Already have a homegrown setup with scripts, crons, and handoff folders? Brigade has an adoption path that inventories what you have before changing anything: start with `brigade operator adopt plan` and see the [technical guide](docs/technical-guide.md). Want an agent to set this up for you? Point it at this repo; [AGENTS.md](AGENTS.md) tells it exactly what to do and where to stop.
238
+
239
+ ## Why I built this
240
+
241
+ I run an always-on OpenClaw agent next to daily Codex and Claude Code sessions. Every one of those tools wakes up empty, and whatever a session learned scattered across tool-specific folders and died there. Two incidents shaped the design: a "dreaming" job that promoted raw session fragments straight into memory bloated `MEMORY.md` past the bootstrap budget, so every session started truncated and nobody noticed for weeks; and 195 handoff notes that sat unread across 35 repos because an ingester had a hardcoded allowlist and nothing warned about the gap. Silence is the failure mode. Every part of Brigade that lints, warns, or writes a receipt exists because something once failed in silence. The full production stack, now 482 cards across daily multi-agent work, is documented in the [solos-cookbook](https://github.com/escoffier-labs/solos-cookbook).
242
+
197
243
  ## Docs
198
244
 
199
245
  - [First 10 minutes](docs/first-10-minutes.md): shortest path from install to healthy setup.
200
246
  - [Overview](docs/overview.md): the full tour of every station and diagram.
201
247
  - [Technical guide](docs/technical-guide.md): the detailed command walkthrough.
248
+ - [MCP sync](docs/mcp-sync.md): the canonical catalog, supported tools, and merge rules.
202
249
  - [Security and Content Guard](docs/security.md): scanner policies, handoff guards, import flow.
203
250
  - [Handoff promotion](docs/handoff-promotion.md): how notes move toward memory.
204
251
  - [Repo fleet](docs/repo-fleet.md) and [Tool catalog](docs/tool-catalog.md).
@@ -59,7 +59,7 @@ Which harnesses do you use? (type numbers separated by space/comma to toggle, en
59
59
  [ ] 16. Amp
60
60
  [ ] 17. Crush
61
61
  [ ] 18. OpenClaw
62
- [ ] 19. Hermes (experimental)
62
+ [ ] 19. Hermes
63
63
 
64
64
  Depth? (type a number, enter for default)
65
65
  * 1. repo (handoff flow + publish guard)
@@ -108,7 +108,7 @@ brigade doctor: target /home/you/agent-kitchen
108
108
  ...
109
109
  ```
110
110
 
111
- A `[fail]` line means the install is incomplete; `[warn]` is informational; `[todo]` means the check needs your attention (e.g. Hermes is experimental).
111
+ A `[fail]` line means the install is incomplete; `[warn]` is informational; `[todo]` means the check needs your attention.
112
112
 
113
113
  ## Reconfiguring
114
114
 
@@ -0,0 +1,228 @@
1
+ <p align="center">
2
+ <img src="docs/assets/brigade-social-preview.jpg" alt="Brigade" width="900">
3
+ </p>
4
+
5
+ <h1 align="center">Brigade CLI</h1>
6
+
7
+ <p align="center">
8
+ <strong>One canonical source for the MCP servers, tools, and memory your AI coding agents share, merged into each tool's native config with a review gate and a receipt for every change. Local files, no daemon, no lock-in.</strong>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <img src="https://img.shields.io/github/actions/workflow/status/escoffier-labs/brigade/ci.yml?branch=main&style=for-the-badge&label=ci" alt="CI status">
13
+ <img src="https://img.shields.io/pypi/v/brigade-cli?style=for-the-badge&label=pypi" alt="PyPI version">
14
+ <img src="https://img.shields.io/badge/python-3.10%2B-blue?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.10+">
15
+ <img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="MIT license">
16
+ </p>
17
+
18
+ Your agents run loops. Brigade keeps the receipts.
19
+
20
+ ## What it does
21
+
22
+ You run more than one agent CLI. Each one keeps its MCP servers in its own config file, its memory in its own silo, and writes to both without review. Brigade is the local layer that fixes that. You keep one canonical source for your MCP servers, your tool and skill catalog, and your memory, and Brigade merges each into the tools you actually use: MCP servers into each tool's native config, tools and skills projected into each harness, and one shared memory owned in one place. A review gate sits in front of anything that gets written, and every consequential change lands a receipt you can grep, diff, and roll back. No daemon, no hosted service, no vendor lock-in: it writes plain files in your repo when you run a command, and that is all it does.
23
+
24
+ ## Try it in 60 seconds
25
+
26
+ ```bash
27
+ pipx install brigade-cli
28
+ pipx ensurepath # then open a new shell so `brigade` is on PATH
29
+ brigade operator quickstart --target ./my-repo --harnesses codex # wire one repo
30
+ brigade operator doctor --target ./my-repo --profile local-operator # verify
31
+ ```
32
+
33
+ That installs the CLI, wires memory, handoffs, and local guardrails into one repo for a single harness, and prints a readiness check. Nothing leaves your machine and no daemon is started. Add `--dry-run` to preview the file-by-file plan before anything is written. More harnesses, workspace setups, and the homegrown-adoption path are under [Install](#install).
34
+
35
+ ## One MCP catalog, synced into every tool
36
+
37
+ Every agent tool reads its MCP servers from a different file in a different shape. The same servers wired across Claude Code, Cursor, Codex, VS Code, OpenCode, and Antigravity means hand-editing six configs and keeping them in sync forever. Brigade keeps one canonical catalog and merges it into each tool's native config for you.
38
+
39
+ ```bash
40
+ brigade mcp init # scaffold .brigade/mcp.json
41
+ brigade mcp add --name github --command npx \
42
+ --args "-y @modelcontextprotocol/server-github" \
43
+ --env GITHUB_TOKEN=ref:GITHUB_TOKEN
44
+ brigade mcp sync # dry-run: show the diff for every tool
45
+ brigade mcp sync --write # merge into each tool's config
46
+ ```
47
+
48
+ One catalog (`.brigade/mcp.json`), six native targets:
49
+
50
+ | Tool | File it writes |
51
+ |---|---|
52
+ | Claude Code | `.mcp.json` |
53
+ | Cursor | `.cursor/mcp.json` |
54
+ | Codex CLI | `.codex/config.toml` (merged surgically, other tables preserved) |
55
+ | VS Code | `.vscode/mcp.json` (secrets become `inputs[]`) |
56
+ | OpenCode | `opencode.json` |
57
+ | Antigravity | `~/.gemini/config/mcp_config.json` (user-scoped, `--user-scope`) |
58
+
59
+ It is dry-run by default and never runs from `doctor` or `brief`. It merges by server key, so servers you added by hand are never touched, and ones you edited are left alone unless you pass `--force`. Secrets are written as `${VAR}` references (or VS Code `${input:VAR}`), never inlined. Ownership is tracked in a gitignored sidecar, so re-syncing on a fresh clone does not spuriously conflict. Full behavior in [docs/mcp-sync.md](docs/mcp-sync.md).
60
+
61
+ Tools and skills get the same treatment: `brigade tools sync` projects one reviewed catalog into each harness's native format.
62
+
63
+ > `brigade mcp` requires brigade 0.13.0 or newer (`pipx upgrade brigade-cli`).
64
+
65
+ ## Shared memory, with a guard in front
66
+
67
+ Writer harnesses leave handoff notes as they work. Brigade lints, guards, and classifies each one, then files the safe, targeted notes into durable memory on its own. A memory owner (OpenClaw, Hermes, or just you) only steps in for the ambiguous few. Every consequential action lands a receipt in a plain file you can grep, diff, and prune.
68
+
69
+ 1. agents write handoff notes into their own local inboxes
70
+ 2. Brigade lints and classifies each one before it can become memory
71
+ 3. safe, targeted notes file themselves into durable memory automatically
72
+ 4. only the ambiguous or risky few wait for your review
73
+ 5. future sessions start with better context, and receipts show what happened
74
+
75
+ ```mermaid
76
+ flowchart LR
77
+ WRITERS["writer harnesses<br/>Codex · Claude Code · OpenCode · ..."]
78
+ BRIGADE["Brigade<br/>lint · guard · classify · receipts"]
79
+ OWNER["memory owner<br/>OpenClaw / Hermes / you"]
80
+ MEM["durable memory<br/>MEMORY.md index · memory cards"]
81
+ REVIEW["review inbox<br/>ambiguous · risky"]
82
+
83
+ WRITERS -- handoff notes --> BRIGADE --> OWNER
84
+ OWNER -- safe targeted, auto-filed --> MEM
85
+ OWNER -. ambiguous or risky .-> REVIEW
86
+ MEM -. context .-> WRITERS
87
+
88
+ classDef brigade fill:#2563eb,stroke:#1d4ed8,color:#fff;
89
+ classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
90
+ classDef gate fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
91
+ class BRIGADE brigade;
92
+ class OWNER,MEM memory;
93
+ class REVIEW gate;
94
+ ```
95
+
96
+ Memory has two layers: knowledge cards under `memory/cards/` hold the detail, and `MEMORY.md` stays a slim one-line-per-card index that loads every session. `brigade memory care scan` flags stale, contradictory, or undersourced cards for review instead of letting them rot. Brigade never edits canonical memory itself; the owner does the writing. It all runs on the machine you control: laptop, workstation, or VPS.
97
+
98
+ ## Verified learning
99
+
100
+ Filing notes is the first loop. The second loop earns trust. Brigade can promote a learned skill on its own, but only when a real signal proves it helped, and it rolls one back the moment a signal says it broke. The model never grades its own work.
101
+
102
+ - `brigade outcome capture` records the result of a verify run (a real exit code, not an opinion) against the skill that produced it.
103
+ - `brigade outcome score` ranks each skill by a Wilson lower bound, so something that passed twice never outranks something vetted across twenty runs.
104
+ - `brigade outcome reconcile` is the gate. Dry-run by default; with `--apply` it installs a skill that earned it across your harnesses, or rolls a regressed one back to its last good version.
105
+ - `brigade outcome explain` prints the full signal trail behind any decision: which run produced each result, the threshold it crossed, and the reversible action taken.
106
+
107
+ The whole ledger is plain JSON and markdown under `memory/outcome/`, tracked in git and readable without Brigade. Schedule `brigade outcome reconcile` in your own cron to run it hands-off; Brigade still installs no daemon.
108
+
109
+ ## Sidecars
110
+
111
+ Brigade is the hub. Each station wires an optional standalone tool, installed with `brigade add <station>` and health-checked by `brigade status` and `brigade doctor`. Every tool is its own repo, independently installable, with no library coupling back into Brigade.
112
+
113
+ | `brigade add` | Tool | What it does |
114
+ |---|---|---|
115
+ | `guard` | content-guard | scans handoffs and content for secrets and PII before anything leaves the machine |
116
+ | `tokens` | tokenjuice | tracks token spend across your harnesses and compacts noisy output |
117
+ | `memory` | memory-doctor, bootstrap-doctor | validates memory cards and bootstrap files for staleness and contradictions |
118
+ | `pantry` | agentpantry | syncs browser sessions and auth across an agent's machine |
119
+ | `search` | code-search | local semantic code search over your repos |
120
+ | `evidence` | miseledger | a local-first evidence ledger with receipts and source exporters |
121
+
122
+ ## Harness support
123
+
124
+ Each writer gets its own local inbox; one canonical owner ingests. Brigade keeps the note format consistent so different tools can contribute without inventing their own styles.
125
+
126
+ | Writer | Harness id | Inbox |
127
+ |---|---|---|
128
+ | Codex CLI | `codex` | `.codex/memory-handoffs/` |
129
+ | Claude Code | `claude` | `.claude/memory-handoffs/` |
130
+ | OpenCode | `opencode` | `.opencode/memory-handoffs/` |
131
+ | Antigravity | `antigravity` | `.antigravity/memory-handoffs/` |
132
+ | Pi | `pi` | `.pi/memory-handoffs/` |
133
+ | Cursor | `cursor` | `.cursor/memory-handoffs/` |
134
+ | Aider | `aider` | `.aider/memory-handoffs/` |
135
+ | Goose | `goose` | `.goose/memory-handoffs/` |
136
+ | Continue | `continue` | `.continue/memory-handoffs/` |
137
+ | GitHub Copilot CLI | `copilot` | `.copilot/memory-handoffs/` |
138
+ | Qwen Code | `qwen` | `.qwen/memory-handoffs/` |
139
+ | Kimi Code | `kimi` | `.kimi/memory-handoffs/` |
140
+ | AdaL | `adal` | `.adal/memory-handoffs/` |
141
+ | OpenHands | `openhands` | `.openhands/memory-handoffs/` |
142
+ | Grok CLI | `grok` | `.grok/memory-handoffs/` |
143
+ | Amp | `amp` | `.amp/memory-handoffs/` |
144
+ | Crush | `crush` | `.crush/memory-handoffs/` |
145
+ | Hermes | `hermes` | `.hermes/memory-handoffs/` |
146
+ | OpenClaw | `openclaw` | usually the memory owner, not a writer |
147
+
148
+ All of them get handoff templates and ingest source coverage. Most also get projected tools and skills in their native format; the per-harness matrix is in the [technical guide](docs/technical-guide.md). Hermes is validated against a real install: handoffs land in `.hermes/memory-handoffs/`, and reviewed skills install into your Hermes store (`~/.hermes/skills`).
149
+
150
+ ## More
151
+
152
+ The same review-and-receipt pattern covers the rest of an operator's day, and you can ignore all of it until you need it.
153
+
154
+ - **Cross-model runs**: `brigade run "<task>"` plans, dispatches, and synthesizes one bounded task across the agent CLIs in your roster, so an expensive model can think while cheaper ones do the grunt work. `--worktree` runs everything in a detached git checkout that comes back as a reviewable `changes.patch`.
155
+ - **Daily loop**: `brigade work brief` shows pending work, imports, and warnings; `brigade daily status` keeps it bounded and cheap.
156
+ - **Friction logs**: `brigade friction scan` mines recent notes, handoffs, and session artifacts for reviewable workflow friction.
157
+ - **Security and scrub**: `brigade security scan` is a local read-only scanner for agent workspaces; `brigade scrub` gates content before it leaves the machine.
158
+ - **Research**: `brigade research run` turns a question into a cited local report and a reviewable memory handoff.
159
+ - **Fleet and release**: health evidence across your local repos and release-readiness receipts, with no publish step.
160
+
161
+ The full tour of every station lives in [docs/overview.md](docs/overview.md).
162
+
163
+ ## Why not something else?
164
+
165
+ - **mem0, Letta, and friends** are memory layers for apps you are building, usually behind an API or a server. Brigade is for the agent CLIs you already run, and it is file-first: your memory is markdown in your repo, reviewable in git, readable without Brigade.
166
+ - **Native harness memory** (each tool's own auto-memory) is a per-tool silo. It does not cross harnesses, and it writes without review. Brigade gives every tool one shared format and one canonical owner, with a review gate in between.
167
+ - **Already running Hermes, or any self-improving agent?** Keep it. Brigade is not a replacement, it is the verification layer on top. A built-in learning loop grades its own work and keeps what it learns inside one tool. Brigade promotes a skill only when a real signal confirms it, keeps every learned skill as portable markdown in your git, and runs one loop across your whole fleet.
168
+ - **A plain CLAUDE.md / AGENTS.md** works great until it bloats past the context budget and goes stale. Brigade keeps bootstrap files slim, moves detail into indexed cards, and flags staleness instead of trusting last month's facts forever.
169
+ - **A daemon or hosted service** would be simpler to demo and worse to trust. Brigade writes local files when you run a command, and that is all it does.
170
+
171
+ ## What Brigade is not
172
+
173
+ Brigade is not a hosted memory service, a daemon, or an automatic release bot.
174
+
175
+ It does not:
176
+
177
+ - run in the background or install schedulers
178
+ - push to GitHub or publish packages
179
+ - send notifications by default
180
+ - save every note automatically
181
+ - turn memory ingest into a silent background process
182
+ - skip review for ambiguous, risky, or failed notes
183
+
184
+ That pause is the point. Agent memory should be useful, not noisy.
185
+
186
+ ## Install
187
+
188
+ `brigade operator quickstart` (in [Try it in 60 seconds](#try-it-in-60-seconds)) wires one code repo for one harness. For an OpenClaw or Hermes workspace instead:
189
+
190
+ ```bash
191
+ brigade operator quickstart --target ~/agent-workspace --depth workspace --harnesses openclaw,hermes --owner openclaw
192
+ ```
193
+
194
+ Use `--dry-run` first to preview the planned steps without writing anything. Pass more harnesses as a comma-separated list; quickstart only wires the harnesses you select and leaves the rest alone.
195
+
196
+ Write a handoff and check the wiring:
197
+
198
+ ```bash
199
+ brigade handoff draft --target ./my-repo --inbox codex \
200
+ --title "What changed" \
201
+ --summary "Short note future agents should know." \
202
+ --content "The durable note itself goes here."
203
+ brigade handoff lint --target ./my-repo
204
+ brigade handoff doctor --target ./my-repo
205
+ ```
206
+
207
+ New here? Start with [QUICKSTART.md](QUICKSTART.md) for the five-minute install, then [docs/first-10-minutes.md](docs/first-10-minutes.md) for the guided first session. Already have a homegrown setup with scripts, crons, and handoff folders? Brigade has an adoption path that inventories what you have before changing anything: start with `brigade operator adopt plan` and see the [technical guide](docs/technical-guide.md). Want an agent to set this up for you? Point it at this repo; [AGENTS.md](AGENTS.md) tells it exactly what to do and where to stop.
208
+
209
+ ## Why I built this
210
+
211
+ I run an always-on OpenClaw agent next to daily Codex and Claude Code sessions. Every one of those tools wakes up empty, and whatever a session learned scattered across tool-specific folders and died there. Two incidents shaped the design: a "dreaming" job that promoted raw session fragments straight into memory bloated `MEMORY.md` past the bootstrap budget, so every session started truncated and nobody noticed for weeks; and 195 handoff notes that sat unread across 35 repos because an ingester had a hardcoded allowlist and nothing warned about the gap. Silence is the failure mode. Every part of Brigade that lints, warns, or writes a receipt exists because something once failed in silence. The full production stack, now 482 cards across daily multi-agent work, is documented in the [solos-cookbook](https://github.com/escoffier-labs/solos-cookbook).
212
+
213
+ ## Docs
214
+
215
+ - [First 10 minutes](docs/first-10-minutes.md): shortest path from install to healthy setup.
216
+ - [Overview](docs/overview.md): the full tour of every station and diagram.
217
+ - [Technical guide](docs/technical-guide.md): the detailed command walkthrough.
218
+ - [MCP sync](docs/mcp-sync.md): the canonical catalog, supported tools, and merge rules.
219
+ - [Security and Content Guard](docs/security.md): scanner policies, handoff guards, import flow.
220
+ - [Handoff promotion](docs/handoff-promotion.md): how notes move toward memory.
221
+ - [Repo fleet](docs/repo-fleet.md) and [Tool catalog](docs/tool-catalog.md).
222
+ - [Command inventory](docs/command-inventory.md): every public CLI command.
223
+ - [Maintainers](MAINTAINERS.md), [Governance](GOVERNANCE.md), [Security](SECURITY.md), and [Contributing](CONTRIBUTING.md).
224
+ - [Roadmap](ROADMAP.md) and [roadmap archive](docs/roadmap-archive.md).
225
+
226
+ Project identity: GitHub [`escoffier-labs/brigade`](https://github.com/escoffier-labs/brigade), website [brigade.tools](https://brigade.tools), PyPI [`brigade-cli`](https://pypi.org/project/brigade-cli/), command `brigade`. The name comes from the kitchen: a *brigade de cuisine* runs the line, and *mise en place* means the station is prepped before service. Set up the rules, memory, tools, and receipts before the session gets expensive.
227
+
228
+ It is early-stage and moving fast. If you hit a broken workflow, a confusing command, or a setup issue, [open an issue](https://github.com/escoffier-labs/brigade/issues) and I will get it fixed.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "brigade-cli"
7
- version = "0.11.0"
7
+ version = "0.13.0"
8
8
  description = "AI agent memory, handoffs, and local guardrails for Codex, Claude Code, OpenCode, Hermes, and OpenClaw."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,3 +1,3 @@
1
1
  """Brigade: local operator-system CLI for agent workspaces."""
2
2
 
3
- __version__ = "0.11.0"
3
+ __version__ = "0.13.0"
@@ -133,6 +133,40 @@ _ADAPTERS: dict[str, Callable[[str, bool, str | None], List[str]]] = {
133
133
  }
134
134
 
135
135
 
136
+ # How strongly each adapter enforces a read-only run:
137
+ # hard - a native sandbox or tool allowlist the model cannot escape
138
+ # soft - read-only is only a prompt instruction the model may ignore
139
+ # none - read_only is not applied to this CLI at all
140
+ # Brigade is "loud about exceptions", so `brigade run --read-only` warns when an
141
+ # assigned harness is soft or none rather than implying a guarantee it cannot make.
142
+ READ_ONLY_ENFORCEMENT: dict[str, str] = {
143
+ "codex": "hard",
144
+ "antigravity": "hard",
145
+ "pi": "hard",
146
+ "cursor": "hard",
147
+ "aider": "hard",
148
+ "continue": "hard",
149
+ "qwen": "hard",
150
+ "kimi": "hard",
151
+ "goose": "soft",
152
+ "copilot": "soft",
153
+ "adal": "soft",
154
+ "openhands": "soft",
155
+ "grok": "soft",
156
+ "amp": "soft",
157
+ "crush": "soft",
158
+ "claude": "none",
159
+ "opencode": "none",
160
+ }
161
+
162
+
163
+ def read_only_enforcement(cli_ref: str) -> str:
164
+ """Return how strongly cli_ref enforces read-only: 'hard', 'soft', or 'none'."""
165
+ if cli_ref.startswith(_OLLAMA_PREFIX):
166
+ return "none"
167
+ return READ_ONLY_ENFORCEMENT.get(cli_ref, "none")
168
+
169
+
136
170
  @dataclass(frozen=True)
137
171
  class AgentResult:
138
172
  text: str
@@ -47,6 +47,7 @@ from . import (
47
47
  context as _context_group,
48
48
  projects as _projects_group,
49
49
  learn as _learn_group,
50
+ outcome as _outcome_group,
50
51
  research as _research_group,
51
52
  center as _center_group,
52
53
  run as _run_group,
@@ -55,11 +56,13 @@ from . import (
55
56
  scrub as _scrub_group,
56
57
  security as _security_group,
57
58
  tools as _tools_group,
59
+ mcp as _mcp_group,
58
60
  handoff_template as _handoff_template_group,
59
61
  ingest as _ingest_group,
60
62
  openclaw_fragments as _openclaw_fragments_group,
61
63
  hermes_fragments as _hermes_fragments_group,
62
64
  reconfigure as _reconfigure_group,
65
+ completions as _completions_group,
63
66
  )
64
67
 
65
68
 
@@ -101,6 +104,7 @@ def _build_parser() -> argparse.ArgumentParser:
101
104
  _context_group.register(sub)
102
105
  _projects_group.register(sub)
103
106
  _learn_group.register(sub)
107
+ _outcome_group.register(sub)
104
108
  _research_group.register(sub)
105
109
  _center_group.register(sub)
106
110
  _run_group.register(sub)
@@ -110,11 +114,13 @@ def _build_parser() -> argparse.ArgumentParser:
110
114
  _scrub_group.register(sub)
111
115
  _security_group.register(sub)
112
116
  _tools_group.register(sub)
117
+ _mcp_group.register(sub)
113
118
  _handoff_template_group.register(sub)
114
119
  _ingest_group.register(sub)
115
120
  _openclaw_fragments_group.register(sub)
116
121
  _hermes_fragments_group.register(sub)
117
122
  _reconfigure_group.register(sub)
123
+ _completions_group.register(sub)
118
124
 
119
125
  parser.epilog = _grouped_epilog(sub)
120
126
  return parser
@@ -14,12 +14,15 @@ import argparse
14
14
  COMMAND_GROUPS: list[tuple[str, list[str]]] = [
15
15
  ("Core memory loop", ["init", "handoff", "handoff-template", "ingest", "memory", "doctor", "status"]),
16
16
  ("Daily operator loop", ["operator", "daily", "work", "friction", "center", "runbook", "budgets", "notifications"]),
17
- ("Stations and tools", ["add", "skills", "tools", "pantry", "roster", "run", "runs", "dogfood"]),
17
+ ("Stations and tools", ["add", "skills", "tools", "mcp", "pantry", "roster", "run", "runs", "dogfood"]),
18
18
  (
19
19
  "Review, security, and research",
20
- ["security", "scrub", "untrusted", "research", "learn", "chat", "context", "projects"],
20
+ ["security", "scrub", "untrusted", "research", "learn", "outcome", "chat", "context", "projects"],
21
+ ),
22
+ (
23
+ "Wiring and advanced",
24
+ ["release", "roadmap", "repos", "reconfigure", "completions", "openclaw-fragments", "hermes-fragments"],
21
25
  ),
22
- ("Wiring and advanced", ["release", "roadmap", "repos", "reconfigure", "openclaw-fragments", "hermes-fragments"]),
23
26
  ]
24
27
 
25
28
  _START_HERE = """Brigade: run your agent brigade. Operator-system CLI for agent workspaces.