brigade-cli 0.12.0__tar.gz → 0.14.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 (347) hide show
  1. brigade_cli-0.14.0/PKG-INFO +316 -0
  2. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/QUICKSTART.md +2 -2
  3. brigade_cli-0.14.0/README.md +285 -0
  4. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/pyproject.toml +4 -3
  5. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/__init__.py +1 -1
  6. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/__init__.py +4 -0
  7. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/_common.py +2 -2
  8. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/hermes_fragments.py +1 -1
  9. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/init.py +10 -0
  10. brigade_cli-0.14.0/src/brigade/cli/mcp.py +136 -0
  11. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/operator.py +26 -0
  12. brigade_cli-0.14.0/src/brigade/cli/outcome.py +111 -0
  13. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/context_cmd.py +68 -1
  14. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/doctor.py +26 -2
  15. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/fragments.py +1 -1
  16. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/install.py +40 -3
  17. brigade_cli-0.14.0/src/brigade/mcp_adapters.py +717 -0
  18. brigade_cli-0.14.0/src/brigade/mcp_cmd.py +596 -0
  19. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/__init__.py +2 -0
  20. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/lifecycle.py +106 -0
  21. brigade_cli-0.14.0/src/brigade/outcome.py +179 -0
  22. brigade_cli-0.14.0/src/brigade/outcome_cmd.py +380 -0
  23. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/prompt.py +1 -1
  24. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/registry.py +8 -1
  25. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/runbook_cmd.py +64 -14
  26. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/skills_cmd.py +69 -0
  27. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/depth/workspace.json +1 -0
  28. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/generic/memory-contract.md +1 -1
  29. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/hermes.json +3 -3
  30. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/README.md +3 -3
  31. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/memory-handoff.harness.json +3 -3
  32. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/model-lanes.harness.json +3 -3
  33. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/workspace.harness.json +4 -4
  34. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/chat-memory-sweep.example.json +1 -1
  35. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/memory-care.example.json +1 -1
  36. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/policies/personal.json +1 -1
  37. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/policies/public-content.json +1 -1
  38. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/policies/public-repo.json +1 -1
  39. brigade_cli-0.14.0/src/brigade/templates/skills/brigade-work/SKILL.md +57 -0
  40. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/AGENTS.md +12 -23
  41. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/CLAUDE.md +4 -0
  42. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/INSTALL_FOR_AGENTS.md +11 -0
  43. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/toml_compat.py +21 -1
  44. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/tools_cmd.py +1 -1
  45. brigade_cli-0.14.0/src/brigade_cli.egg-info/PKG-INFO +316 -0
  46. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/SOURCES.txt +15 -0
  47. brigade_cli-0.14.0/tests/test_context_cmd.py +83 -0
  48. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_doctor.py +1 -1
  49. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_fragments.py +1 -1
  50. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_init.py +31 -1
  51. brigade_cli-0.14.0/tests/test_mcp_adapters.py +236 -0
  52. brigade_cli-0.14.0/tests/test_mcp_cmd.py +250 -0
  53. brigade_cli-0.14.0/tests/test_mcp_integration.py +143 -0
  54. brigade_cli-0.14.0/tests/test_mcp_user_scope.py +109 -0
  55. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_operator_cmd.py +28 -0
  56. brigade_cli-0.14.0/tests/test_outcome.py +164 -0
  57. brigade_cli-0.14.0/tests/test_outcome_cmd.py +260 -0
  58. brigade_cli-0.14.0/tests/test_outcome_execute.py +78 -0
  59. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_runbook_cmd.py +99 -6
  60. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_skills_cmd.py +45 -1
  61. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_toml_compat.py +14 -0
  62. brigade_cli-0.12.0/PKG-INFO +0 -212
  63. brigade_cli-0.12.0/README.md +0 -182
  64. brigade_cli-0.12.0/src/brigade_cli.egg-info/PKG-INFO +0 -212
  65. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/LICENSE +0 -0
  66. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/MANIFEST.in +0 -0
  67. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/setup.cfg +0 -0
  68. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/__main__.py +0 -0
  69. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/aboyeur.py +0 -0
  70. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/actionqueue.py +0 -0
  71. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/add.py +0 -0
  72. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/agents.py +0 -0
  73. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/budgets.py +0 -0
  74. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/budgets_cmd.py +0 -0
  75. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/center_cmd.py +0 -0
  76. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/chat_cmd.py +0 -0
  77. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/add.py +0 -0
  78. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/budgets.py +0 -0
  79. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/center.py +0 -0
  80. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/chat.py +0 -0
  81. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/completions.py +0 -0
  82. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/context.py +0 -0
  83. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/daily.py +0 -0
  84. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/doctor.py +0 -0
  85. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/dogfood.py +0 -0
  86. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/friction.py +0 -0
  87. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/handoff.py +0 -0
  88. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/handoff_template.py +0 -0
  89. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/ingest.py +0 -0
  90. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/learn.py +0 -0
  91. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/memory.py +0 -0
  92. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/notifications.py +0 -0
  93. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/openclaw_fragments.py +0 -0
  94. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/pantry.py +0 -0
  95. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/projects.py +0 -0
  96. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/reconfigure.py +0 -0
  97. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/release.py +0 -0
  98. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/repos.py +0 -0
  99. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/research.py +0 -0
  100. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/roadmap.py +0 -0
  101. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/roster.py +0 -0
  102. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/run.py +0 -0
  103. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/runbook.py +0 -0
  104. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/runs.py +0 -0
  105. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/scrub.py +0 -0
  106. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/security.py +0 -0
  107. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/skills.py +0 -0
  108. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/status.py +0 -0
  109. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/tools.py +0 -0
  110. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/untrusted.py +0 -0
  111. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/cli/work.py +0 -0
  112. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/completions.py +0 -0
  113. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/config.py +0 -0
  114. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/daily_cmd.py +0 -0
  115. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/dogfood_cmd.py +0 -0
  116. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/friction_cmd.py +0 -0
  117. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/handoff.py +0 -0
  118. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/handoff_cmd.py +0 -0
  119. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/hermes_adapter.py +0 -0
  120. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/ingest.py +0 -0
  121. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/learn_cmd.py +0 -0
  122. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/localio.py +0 -0
  123. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/managed.py +0 -0
  124. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/mcp_server.py +0 -0
  125. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/memory_cmd.py +0 -0
  126. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/notifications_cmd.py +0 -0
  127. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/adoption.py +0 -0
  128. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/guide.py +0 -0
  129. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/health.py +0 -0
  130. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/migration.py +0 -0
  131. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/surfaces.py +0 -0
  132. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/pantry_cmd.py +0 -0
  133. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/phases_cmd.py +0 -0
  134. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/proc.py +0 -0
  135. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/projects_cmd.py +0 -0
  136. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/py.typed +0 -0
  137. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/reconfigure.py +0 -0
  138. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/release_cmd.py +0 -0
  139. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/reportstore.py +0 -0
  140. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/repos_cmd.py +0 -0
  141. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/__init__.py +0 -0
  142. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/config.py +0 -0
  143. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/engine.py +0 -0
  144. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/extract.py +0 -0
  145. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/handoff.py +0 -0
  146. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/llm.py +0 -0
  147. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/registry.py +0 -0
  148. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/report.py +0 -0
  149. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/sources/__init__.py +0 -0
  150. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/sources/cli.py +0 -0
  151. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/sources/local.py +0 -0
  152. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/sources/web.py +0 -0
  153. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research/types.py +0 -0
  154. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/research_cmd.py +0 -0
  155. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/roadmap_cmd.py +0 -0
  156. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/roster.py +0 -0
  157. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/roster_cmd.py +0 -0
  158. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/runguard.py +0 -0
  159. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/runs_cmd.py +0 -0
  160. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/scrub.py +0 -0
  161. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/security_cmd.py +0 -0
  162. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/selection.py +0 -0
  163. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/station.py +0 -0
  164. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/status.py +0 -0
  165. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/adal/memory-handoffs/TEMPLATE.md +0 -0
  166. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/aider/memory-handoffs/TEMPLATE.md +0 -0
  167. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/amp/memory-handoffs/TEMPLATE.md +0 -0
  168. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/antigravity/memory-handoffs/TEMPLATE.md +0 -0
  169. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/claude/memory-handoffs/TEMPLATE.md +0 -0
  170. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/codex/memory-handoffs/TEMPLATE.md +0 -0
  171. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/continue/memory-handoffs/TEMPLATE.md +0 -0
  172. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/copilot/memory-handoffs/TEMPLATE.md +0 -0
  173. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/crush/memory-handoffs/TEMPLATE.md +0 -0
  174. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/cursor/memory-handoffs/TEMPLATE.md +0 -0
  175. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/depth/repo.json +0 -0
  176. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/generic/harness-adapter-checklist.md +0 -0
  177. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/goose/memory-handoffs/TEMPLATE.md +0 -0
  178. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/grok/memory-handoffs/TEMPLATE.md +0 -0
  179. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/handoff/handoff-sources.example.json +0 -0
  180. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/handoff/openclaw-ingest-receipt.example.json +0 -0
  181. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/adal.json +0 -0
  182. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/aider.json +0 -0
  183. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/amp.json +0 -0
  184. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/antigravity.json +0 -0
  185. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/claude.json +0 -0
  186. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/codex.json +0 -0
  187. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/continue.json +0 -0
  188. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/copilot.json +0 -0
  189. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/crush.json +0 -0
  190. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/cursor.json +0 -0
  191. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/goose.json +0 -0
  192. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/grok.json +0 -0
  193. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/kimi.json +0 -0
  194. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/openclaw.json +0 -0
  195. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/opencode.json +0 -0
  196. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/openhands.json +0 -0
  197. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/pi.json +0 -0
  198. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/qwen.json +0 -0
  199. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/memory-handoffs/TEMPLATE.md +0 -0
  200. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/hooks/pre-push +0 -0
  201. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/includes/publisher.json +0 -0
  202. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/kimi/memory-handoffs/TEMPLATE.md +0 -0
  203. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/backup-restic.md +0 -0
  204. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/chat-surface-crawlers.md +0 -0
  205. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/content-safety.md +0 -0
  206. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/handoff-flow.md +0 -0
  207. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/memory-architecture.md +0 -0
  208. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/memory-care-staleness.md +0 -0
  209. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/memory-scanner.md +0 -0
  210. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/multi-workspace-handoff-admin.md +0 -0
  211. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/obsidian-notes.md +0 -0
  212. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/pipeline-standups.md +0 -0
  213. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/tokenjuice-output-compaction.md +0 -0
  214. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/README.md +0 -0
  215. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/acp-escalation.openclaw.json +0 -0
  216. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/memory-sweep-cron.openclaw.json +0 -0
  217. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/model-aliases.openclaw.json +0 -0
  218. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/ollama-memory-search.openclaw.json +0 -0
  219. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/opencode/memory-handoffs/TEMPLATE.md +0 -0
  220. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/openhands/memory-handoffs/TEMPLATE.md +0 -0
  221. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/pi/memory-handoffs/TEMPLATE.md +0 -0
  222. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/qwen/memory-handoffs/TEMPLATE.md +0 -0
  223. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/scripts/backup-restic.sh +0 -0
  224. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/skills/note/SKILL.md +0 -0
  225. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/HEARTBEAT.md +0 -0
  226. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/IDENTITY.md +0 -0
  227. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/MEMORY.md +0 -0
  228. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/SAFETY_RULES.md +0 -0
  229. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/SOUL.md +0 -0
  230. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/TOOLS.md +0 -0
  231. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/USER.md +0 -0
  232. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/rules/acceptance-driven-work.md +0 -0
  233. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/rules/issue-tdd-loop.md +0 -0
  234. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/templates.py +0 -0
  235. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/untrusted.py +0 -0
  236. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/untrusted_cmd.py +0 -0
  237. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/__init__.py +0 -0
  238. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/backup.py +0 -0
  239. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/config.py +0 -0
  240. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/constants.py +0 -0
  241. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/helpers.py +0 -0
  242. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/imports.py +0 -0
  243. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/ledger.py +0 -0
  244. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/reviews.py +0 -0
  245. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/scanners.py +0 -0
  246. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/services.py +0 -0
  247. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/session.py +0 -0
  248. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/sweeps.py +0 -0
  249. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/verification.py +0 -0
  250. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/dependency_links.txt +0 -0
  251. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/entry_points.txt +0 -0
  252. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/requires.txt +0 -0
  253. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/top_level.txt +0 -0
  254. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_aboyeur.py +0 -0
  255. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_actionqueue.py +0 -0
  256. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_add.py +0 -0
  257. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_agents.py +0 -0
  258. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_budgets.py +0 -0
  259. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_cli_alias.py +0 -0
  260. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_cli_help.py +0 -0
  261. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_completions.py +0 -0
  262. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_config.py +0 -0
  263. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_dogfood_cmd.py +0 -0
  264. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_friction_cmd.py +0 -0
  265. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_gitignore.py +0 -0
  266. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_handoff.py +0 -0
  267. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_handoff_cmd.py +0 -0
  268. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_ingest.py +0 -0
  269. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_install.py +0 -0
  270. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_localio.py +0 -0
  271. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_managed.py +0 -0
  272. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_mcp_server.py +0 -0
  273. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_memory_cmd.py +0 -0
  274. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_memory_search_mcp.py +0 -0
  275. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_neutrality.py +0 -0
  276. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_notifications_cmd.py +0 -0
  277. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_operator_checkup.py +0 -0
  278. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_pantry_cmd.py +0 -0
  279. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_parity_backlog.py +0 -0
  280. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase100_cmd.py +0 -0
  281. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase101_cmd.py +0 -0
  282. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase165_cmd.py +0 -0
  283. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase36_cmd.py +0 -0
  284. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase37_cmd.py +0 -0
  285. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase38_cmd.py +0 -0
  286. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase39_cmd.py +0 -0
  287. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase40_cmd.py +0 -0
  288. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase41_cmd.py +0 -0
  289. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase42_cmd.py +0 -0
  290. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase43_cmd.py +0 -0
  291. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase44_cmd.py +0 -0
  292. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase45_cmd.py +0 -0
  293. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase46_50_cmd.py +0 -0
  294. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase51_55_cmd.py +0 -0
  295. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase56_60_cmd.py +0 -0
  296. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase96_cmd.py +0 -0
  297. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase97_cmd.py +0 -0
  298. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase98_cmd.py +0 -0
  299. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_phase99_cmd.py +0 -0
  300. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_pre_push_hook.py +0 -0
  301. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_privacy_regression.py +0 -0
  302. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_proc.py +0 -0
  303. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_prompt.py +0 -0
  304. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_read_only_enforcement.py +0 -0
  305. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_reconfigure.py +0 -0
  306. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_registry.py +0 -0
  307. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_release_cmd.py +0 -0
  308. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_reportstore.py +0 -0
  309. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_repos_cmd.py +0 -0
  310. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_cli_sources.py +0 -0
  311. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_cmd.py +0 -0
  312. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_config.py +0 -0
  313. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_engine.py +0 -0
  314. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_extract.py +0 -0
  315. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_handoff.py +0 -0
  316. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_llm.py +0 -0
  317. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_local_sources.py +0 -0
  318. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_registry.py +0 -0
  319. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_report.py +0 -0
  320. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_types.py +0 -0
  321. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_research_web.py +0 -0
  322. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_roadmap_cmd.py +0 -0
  323. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_roster.py +0 -0
  324. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_roster_cmd.py +0 -0
  325. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_run_cli.py +0 -0
  326. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_runbook_import.py +0 -0
  327. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_runguard.py +0 -0
  328. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_runs_cmd.py +0 -0
  329. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_scrub.py +0 -0
  330. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_security_cmd.py +0 -0
  331. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_security_diff.py +0 -0
  332. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_selection.py +0 -0
  333. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_station.py +0 -0
  334. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_status.py +0 -0
  335. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_subprocess_guards.py +0 -0
  336. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_untrusted.py +0 -0
  337. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_untrusted_cmd.py +0 -0
  338. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_backup.py +0 -0
  339. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_facade.py +0 -0
  340. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_imports.py +0 -0
  341. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_ledger.py +0 -0
  342. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_reviews.py +0 -0
  343. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_scanners.py +0 -0
  344. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_services.py +0 -0
  345. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_session.py +0 -0
  346. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_sweeps.py +0 -0
  347. {brigade_cli-0.12.0 → brigade_cli-0.14.0}/tests/test_work_cmd_verification.py +0 -0
@@ -0,0 +1,316 @@
1
+ Metadata-Version: 2.4
2
+ Name: brigade-cli
3
+ Version: 0.14.0
4
+ Summary: One local source for the MCP servers, tools, and memory your AI coding agents share (Codex, Claude Code, OpenCode, Hermes, OpenClaw), merged into each tool's native config with a review gate and a receipt for every change.
5
+ Author-email: Solomon Neas <me@solomonneas.dev>
6
+ License: MIT
7
+ Project-URL: Homepage, https://brigade.tools
8
+ Project-URL: Documentation, https://brigade.tools/docs
9
+ Project-URL: Repository, https://github.com/escoffier-labs/brigade
10
+ Project-URL: Cookbook, https://github.com/escoffier-labs/solos-cookbook
11
+ Project-URL: OpenClaw, https://github.com/solomonneas/openclaw
12
+ Project-URL: ContentGuard, https://github.com/escoffier-labs/content-guard
13
+ Project-URL: AgentPantry, https://github.com/escoffier-labs/agentpantry
14
+ Project-URL: Issues, https://github.com/escoffier-labs/brigade/issues
15
+ Keywords: agents,ai-agents,agent-memory,agent-handoffs,ai-memory,mcp,mcp-config,mcp-sync,model-context-protocol,openclaw,claude-code,codex,opencode,memory,bootstrap,brigade,brigade-cli,operator,local-first,guardrails,agents-md
16
+ Classifier: Development Status :: 3 - Alpha
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Provides-Extra: dev
26
+ Requires-Dist: pytest>=7; extra == "dev"
27
+ Requires-Dist: ruff>=0.15; extra == "dev"
28
+ Provides-Extra: research
29
+ Requires-Dist: playwright>=1.40; extra == "research"
30
+ Dynamic: license-file
31
+
32
+ <p align="center">
33
+ <img src="docs/assets/brigade-social-preview.jpg" alt="Brigade banner" width="900">
34
+ </p>
35
+
36
+ <h1 align="center">Brigade</h1>
37
+
38
+ <p align="center">
39
+ <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>
40
+ </p>
41
+
42
+ <p align="center">
43
+ <a href="https://brigade.tools">Website</a> &middot; <a href="https://brigade.tools/docs">Docs</a> &middot; <a href="#try-it-in-60-seconds">Quickstart</a>
44
+ </p>
45
+
46
+ <p align="center">
47
+ <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">
48
+ <img src="https://img.shields.io/pypi/v/brigade-cli?style=for-the-badge&label=pypi" alt="PyPI version">
49
+ <img src="https://img.shields.io/badge/python-3.10%2B-blue?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.10+">
50
+ <img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="MIT license">
51
+ </p>
52
+
53
+ Your agents run loops. Brigade keeps the receipts.
54
+
55
+ <p align="center">
56
+ <img src="docs/assets/quickstart.svg" alt="Recording: brigade operator quickstart wires a repo and brigade operator doctor reports ready, in seconds" width="760">
57
+ </p>
58
+
59
+ <p align="center"><em><code>brigade operator quickstart</code> wires a repo and <code>operator doctor</code> reports ready, in seconds.</em></p>
60
+
61
+ ## What it does
62
+
63
+ 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.
64
+
65
+ ## Install
66
+
67
+ `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:
68
+
69
+ ```bash
70
+ brigade operator quickstart --target ~/agent-workspace --depth workspace --harnesses openclaw,hermes --owner openclaw
71
+ ```
72
+
73
+ 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.
74
+
75
+ Write a handoff and check the wiring:
76
+
77
+ ```bash
78
+ brigade handoff draft --target ./my-repo --inbox codex \
79
+ --title "What changed" \
80
+ --summary "Short note future agents should know." \
81
+ --content "The durable note itself goes here."
82
+ brigade handoff lint --target ./my-repo
83
+ brigade handoff doctor --target ./my-repo
84
+ ```
85
+
86
+ 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.
87
+
88
+ ## Try it in 60 seconds
89
+
90
+ ```bash
91
+ pipx install brigade-cli
92
+ pipx ensurepath # then open a new shell so `brigade` is on PATH
93
+ brigade operator quickstart --target ./my-repo --harnesses codex # wire one repo
94
+ brigade operator doctor --target ./my-repo --profile local-operator # verify
95
+ ```
96
+
97
+ 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).
98
+
99
+ The run ends with a readiness verdict (the recording above shows the full report):
100
+
101
+ ```
102
+ operator doctor: ~/my-repo
103
+ profile: local-operator
104
+ ready: yes
105
+ blocking_issues: 0
106
+ next: brigade daily plan --target .
107
+ content_guard: installed hook=configured-hooks-path policy=public-repo
108
+ ```
109
+
110
+ ## One MCP catalog, synced into every tool
111
+
112
+ 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.
113
+
114
+ ```bash
115
+ brigade mcp init # scaffold .brigade/mcp.json
116
+ brigade mcp add --name github --command npx \
117
+ --args "-y @modelcontextprotocol/server-github" \
118
+ --env GITHUB_TOKEN=ref:GITHUB_TOKEN
119
+ brigade mcp sync # dry-run: show the diff for every tool
120
+ brigade mcp sync --write # merge into each tool's config
121
+ ```
122
+
123
+ Run `brigade mcp sync` and you get the per-tool plan, server by server, before a single file changes. Two servers in the catalog, projected across the harnesses wired in this repo:
124
+
125
+ ```
126
+ brigade mcp sync (dry-run): ~/my-repo
127
+ claude github missing -> create
128
+ claude sentry missing -> create
129
+ cursor github missing -> create
130
+ cursor sentry missing -> create
131
+ codex github missing -> create
132
+ codex sentry missing -> create
133
+ vscode github missing -> create
134
+ vscode sentry missing -> create
135
+ opencode github missing -> create
136
+ opencode sentry missing -> create
137
+ ```
138
+
139
+ One catalog (`.brigade/mcp.json`), six native targets:
140
+
141
+ | Tool | File it writes |
142
+ |---|---|
143
+ | Claude Code | `.mcp.json` |
144
+ | Cursor | `.cursor/mcp.json` |
145
+ | Codex CLI | `.codex/config.toml` (merged surgically, other tables preserved) |
146
+ | VS Code | `.vscode/mcp.json` (secrets become `inputs[]`) |
147
+ | OpenCode | `opencode.json` |
148
+ | Antigravity | `~/.gemini/config/mcp_config.json` (user-scoped, `--user-scope`) |
149
+
150
+ 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).
151
+
152
+ Tools and skills get the same treatment: `brigade tools sync` projects one reviewed catalog into each harness's native format.
153
+
154
+ > `brigade mcp` requires brigade 0.13.0 or newer (`pipx upgrade brigade-cli`).
155
+
156
+ ## Shared memory, with a guard in front
157
+
158
+ 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.
159
+
160
+ 1. agents write handoff notes into their own local inboxes
161
+ 2. Brigade lints and classifies each one before it can become memory
162
+ 3. safe, targeted notes file themselves into durable memory automatically
163
+ 4. only the ambiguous or risky few wait for your review
164
+ 5. future sessions start with better context, and receipts show what happened
165
+
166
+ ```mermaid
167
+ flowchart LR
168
+ WRITERS["writer harnesses<br/>Codex · Claude Code · OpenCode · ..."]
169
+ BRIGADE["Brigade<br/>lint · guard · classify · receipts"]
170
+ OWNER["memory owner<br/>OpenClaw / Hermes / you"]
171
+ MEM["durable memory<br/>MEMORY.md index · memory cards"]
172
+ REVIEW["review inbox<br/>ambiguous · risky"]
173
+
174
+ WRITERS -- handoff notes --> BRIGADE --> OWNER
175
+ OWNER -- safe targeted, auto-filed --> MEM
176
+ OWNER -. ambiguous or risky .-> REVIEW
177
+ MEM -. context .-> WRITERS
178
+
179
+ classDef brigade fill:#2563eb,stroke:#1d4ed8,color:#fff;
180
+ classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
181
+ classDef gate fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
182
+ class BRIGADE brigade;
183
+ class OWNER,MEM memory;
184
+ class REVIEW gate;
185
+ ```
186
+
187
+ 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.
188
+
189
+ ## Verified learning
190
+
191
+ 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.
192
+
193
+ - `brigade outcome capture` records the result of a verify run (a real exit code, not an opinion) against the skill that produced it.
194
+ - `brigade outcome score` ranks each skill by a Wilson lower bound, so something that passed twice never outranks something vetted across twenty runs.
195
+ - `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.
196
+ - `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.
197
+
198
+ 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.
199
+
200
+ ## Sidecars
201
+
202
+ 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.
203
+
204
+ | `brigade add` | Tool | What it does |
205
+ |---|---|---|
206
+ | `guard` | content-guard | scans handoffs and content for secrets and PII before anything leaves the machine |
207
+ | `tokens` | tokenjuice | tracks token spend across your harnesses and compacts noisy output |
208
+ | `memory` | memory-doctor, bootstrap-doctor | validates memory cards and bootstrap files for staleness and contradictions |
209
+ | `pantry` | agentpantry | syncs browser sessions and auth across an agent's machine |
210
+ | `search` | code-search | local semantic code search over your repos |
211
+ | `evidence` | miseledger | a local-first evidence ledger with receipts and source exporters |
212
+
213
+ ## Harness support
214
+
215
+ 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.
216
+
217
+ | Writer | Harness id | Inbox |
218
+ |---|---|---|
219
+ | Codex CLI | `codex` | `.codex/memory-handoffs/` |
220
+ | Claude Code | `claude` | `.claude/memory-handoffs/` |
221
+ | OpenCode | `opencode` | `.opencode/memory-handoffs/` |
222
+ | Antigravity | `antigravity` | `.antigravity/memory-handoffs/` |
223
+ | Pi | `pi` | `.pi/memory-handoffs/` |
224
+ | Cursor | `cursor` | `.cursor/memory-handoffs/` |
225
+ | Aider | `aider` | `.aider/memory-handoffs/` |
226
+ | Goose | `goose` | `.goose/memory-handoffs/` |
227
+ | Continue | `continue` | `.continue/memory-handoffs/` |
228
+ | GitHub Copilot CLI | `copilot` | `.copilot/memory-handoffs/` |
229
+ | Qwen Code | `qwen` | `.qwen/memory-handoffs/` |
230
+ | Kimi Code | `kimi` | `.kimi/memory-handoffs/` |
231
+ | AdaL | `adal` | `.adal/memory-handoffs/` |
232
+ | OpenHands | `openhands` | `.openhands/memory-handoffs/` |
233
+ | Grok CLI | `grok` | `.grok/memory-handoffs/` |
234
+ | Amp | `amp` | `.amp/memory-handoffs/` |
235
+ | Crush | `crush` | `.crush/memory-handoffs/` |
236
+ | Hermes | `hermes` | `.hermes/memory-handoffs/` |
237
+ | OpenClaw | `openclaw` | usually the memory owner, not a writer |
238
+
239
+ 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`).
240
+
241
+ ## More
242
+
243
+ 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.
244
+
245
+ - **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`.
246
+ - **Daily loop**: `brigade work brief` shows pending work, imports, and warnings; `brigade daily status` keeps it bounded and cheap.
247
+ - **Friction logs**: `brigade friction scan` mines recent notes, handoffs, and session artifacts for reviewable workflow friction.
248
+ - **Security and scrub**: `brigade security scan` is a local read-only scanner for agent workspaces; `brigade scrub` gates content before it leaves the machine.
249
+ - **Research**: `brigade research run` turns a question into a cited local report and a reviewable memory handoff.
250
+ - **Fleet and release**: health evidence across your local repos and release-readiness receipts, with no publish step.
251
+
252
+ The full tour of every station lives in [docs/overview.md](docs/overview.md).
253
+
254
+ ## Why not something else?
255
+
256
+ - **mem0, Letta, agentmemory, 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.
257
+ - **add-mcp, chezmoi, and config-sync scripts** move MCP or dotfiles around, but they sync one thing with no review gate and no receipt, and they do not touch memory or skills. Brigade keeps one canonical source for MCP servers, tools, skills, and memory together, shows the per-tool diff before any write, and leaves a receipt you can roll back.
258
+ - **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.
259
+ - **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.
260
+ - **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.
261
+ - **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.
262
+
263
+ At a glance, against the tools people reach for first:
264
+
265
+ | | Across harnesses | MCP, tools, and memory in one source | Review gate + receipts | Local files, no daemon |
266
+ |---|:---:|:---:|:---:|:---:|
267
+ | **Brigade** | yes | yes | yes | yes |
268
+ | mem0 / Letta / agentmemory | per-SDK | memory only | no | usually hosted or a server |
269
+ | add-mcp / chezmoi / config-sync | partial | MCP or dotfiles only | no | yes |
270
+ | Native harness memory | no | memory only | no | yes |
271
+
272
+ ## What Brigade is not
273
+
274
+ Brigade is not a hosted memory service, a daemon, or an automatic release bot.
275
+
276
+ It does not:
277
+
278
+ - run in the background or install schedulers
279
+ - push to GitHub or publish packages
280
+ - send notifications by default
281
+ - save every note automatically
282
+ - turn memory ingest into a silent background process
283
+ - skip review for ambiguous, risky, or failed notes
284
+
285
+ That pause is the point. Agent memory should be useful, not noisy.
286
+
287
+ And it is not the other projects that share the name. This Brigade is the AI-agent operator CLI, installed with `pipx install brigade-cli` from [`escoffier-labs/brigade`](https://github.com/escoffier-labs/brigade). It is not the CNCF/Microsoft **Brigade** for event-driven scripting on Kubernetes (archived in 2022), the Spinabot **Brigade** agent crew, or the 2017 `brigade` Python package that became Nornir. Same word, different tool.
288
+
289
+ ## Why I built this
290
+
291
+ <p align="center">
292
+ <img src="docs/assets/brigade-kitchen-scene.jpg" alt="The brigade at the pass" width="900">
293
+ </p>
294
+
295
+ 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).
296
+
297
+ ## Docs
298
+
299
+ - [First 10 minutes](docs/first-10-minutes.md): shortest path from install to healthy setup.
300
+ - [Overview](docs/overview.md): the full tour of every station and diagram.
301
+ - [Technical guide](docs/technical-guide.md): the detailed command walkthrough.
302
+ - [MCP sync](docs/mcp-sync.md): the canonical catalog, supported tools, and merge rules.
303
+ - [Security and Content Guard](docs/security.md): scanner policies, handoff guards, import flow.
304
+ - [Handoff promotion](docs/handoff-promotion.md): how notes move toward memory.
305
+ - [Repo fleet](docs/repo-fleet.md) and [Tool catalog](docs/tool-catalog.md).
306
+ - [Command inventory](docs/command-inventory.md): every public CLI command.
307
+ - [Maintainers](MAINTAINERS.md), [Governance](GOVERNANCE.md), [Security](SECURITY.md), and [Contributing](CONTRIBUTING.md).
308
+ - [Roadmap](ROADMAP.md) and [roadmap archive](docs/roadmap-archive.md).
309
+
310
+ ## License
311
+
312
+ MIT. See [LICENSE](LICENSE).
313
+
314
+ 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.
315
+
316
+ 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.
@@ -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,285 @@
1
+ <p align="center">
2
+ <img src="docs/assets/brigade-social-preview.jpg" alt="Brigade banner" width="900">
3
+ </p>
4
+
5
+ <h1 align="center">Brigade</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
+ <a href="https://brigade.tools">Website</a> &middot; <a href="https://brigade.tools/docs">Docs</a> &middot; <a href="#try-it-in-60-seconds">Quickstart</a>
13
+ </p>
14
+
15
+ <p align="center">
16
+ <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">
17
+ <img src="https://img.shields.io/pypi/v/brigade-cli?style=for-the-badge&label=pypi" alt="PyPI version">
18
+ <img src="https://img.shields.io/badge/python-3.10%2B-blue?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.10+">
19
+ <img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="MIT license">
20
+ </p>
21
+
22
+ Your agents run loops. Brigade keeps the receipts.
23
+
24
+ <p align="center">
25
+ <img src="docs/assets/quickstart.svg" alt="Recording: brigade operator quickstart wires a repo and brigade operator doctor reports ready, in seconds" width="760">
26
+ </p>
27
+
28
+ <p align="center"><em><code>brigade operator quickstart</code> wires a repo and <code>operator doctor</code> reports ready, in seconds.</em></p>
29
+
30
+ ## What it does
31
+
32
+ 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.
33
+
34
+ ## Install
35
+
36
+ `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:
37
+
38
+ ```bash
39
+ brigade operator quickstart --target ~/agent-workspace --depth workspace --harnesses openclaw,hermes --owner openclaw
40
+ ```
41
+
42
+ 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.
43
+
44
+ Write a handoff and check the wiring:
45
+
46
+ ```bash
47
+ brigade handoff draft --target ./my-repo --inbox codex \
48
+ --title "What changed" \
49
+ --summary "Short note future agents should know." \
50
+ --content "The durable note itself goes here."
51
+ brigade handoff lint --target ./my-repo
52
+ brigade handoff doctor --target ./my-repo
53
+ ```
54
+
55
+ 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.
56
+
57
+ ## Try it in 60 seconds
58
+
59
+ ```bash
60
+ pipx install brigade-cli
61
+ pipx ensurepath # then open a new shell so `brigade` is on PATH
62
+ brigade operator quickstart --target ./my-repo --harnesses codex # wire one repo
63
+ brigade operator doctor --target ./my-repo --profile local-operator # verify
64
+ ```
65
+
66
+ 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).
67
+
68
+ The run ends with a readiness verdict (the recording above shows the full report):
69
+
70
+ ```
71
+ operator doctor: ~/my-repo
72
+ profile: local-operator
73
+ ready: yes
74
+ blocking_issues: 0
75
+ next: brigade daily plan --target .
76
+ content_guard: installed hook=configured-hooks-path policy=public-repo
77
+ ```
78
+
79
+ ## One MCP catalog, synced into every tool
80
+
81
+ 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.
82
+
83
+ ```bash
84
+ brigade mcp init # scaffold .brigade/mcp.json
85
+ brigade mcp add --name github --command npx \
86
+ --args "-y @modelcontextprotocol/server-github" \
87
+ --env GITHUB_TOKEN=ref:GITHUB_TOKEN
88
+ brigade mcp sync # dry-run: show the diff for every tool
89
+ brigade mcp sync --write # merge into each tool's config
90
+ ```
91
+
92
+ Run `brigade mcp sync` and you get the per-tool plan, server by server, before a single file changes. Two servers in the catalog, projected across the harnesses wired in this repo:
93
+
94
+ ```
95
+ brigade mcp sync (dry-run): ~/my-repo
96
+ claude github missing -> create
97
+ claude sentry missing -> create
98
+ cursor github missing -> create
99
+ cursor sentry missing -> create
100
+ codex github missing -> create
101
+ codex sentry missing -> create
102
+ vscode github missing -> create
103
+ vscode sentry missing -> create
104
+ opencode github missing -> create
105
+ opencode sentry missing -> create
106
+ ```
107
+
108
+ One catalog (`.brigade/mcp.json`), six native targets:
109
+
110
+ | Tool | File it writes |
111
+ |---|---|
112
+ | Claude Code | `.mcp.json` |
113
+ | Cursor | `.cursor/mcp.json` |
114
+ | Codex CLI | `.codex/config.toml` (merged surgically, other tables preserved) |
115
+ | VS Code | `.vscode/mcp.json` (secrets become `inputs[]`) |
116
+ | OpenCode | `opencode.json` |
117
+ | Antigravity | `~/.gemini/config/mcp_config.json` (user-scoped, `--user-scope`) |
118
+
119
+ 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).
120
+
121
+ Tools and skills get the same treatment: `brigade tools sync` projects one reviewed catalog into each harness's native format.
122
+
123
+ > `brigade mcp` requires brigade 0.13.0 or newer (`pipx upgrade brigade-cli`).
124
+
125
+ ## Shared memory, with a guard in front
126
+
127
+ 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.
128
+
129
+ 1. agents write handoff notes into their own local inboxes
130
+ 2. Brigade lints and classifies each one before it can become memory
131
+ 3. safe, targeted notes file themselves into durable memory automatically
132
+ 4. only the ambiguous or risky few wait for your review
133
+ 5. future sessions start with better context, and receipts show what happened
134
+
135
+ ```mermaid
136
+ flowchart LR
137
+ WRITERS["writer harnesses<br/>Codex · Claude Code · OpenCode · ..."]
138
+ BRIGADE["Brigade<br/>lint · guard · classify · receipts"]
139
+ OWNER["memory owner<br/>OpenClaw / Hermes / you"]
140
+ MEM["durable memory<br/>MEMORY.md index · memory cards"]
141
+ REVIEW["review inbox<br/>ambiguous · risky"]
142
+
143
+ WRITERS -- handoff notes --> BRIGADE --> OWNER
144
+ OWNER -- safe targeted, auto-filed --> MEM
145
+ OWNER -. ambiguous or risky .-> REVIEW
146
+ MEM -. context .-> WRITERS
147
+
148
+ classDef brigade fill:#2563eb,stroke:#1d4ed8,color:#fff;
149
+ classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
150
+ classDef gate fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
151
+ class BRIGADE brigade;
152
+ class OWNER,MEM memory;
153
+ class REVIEW gate;
154
+ ```
155
+
156
+ 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.
157
+
158
+ ## Verified learning
159
+
160
+ 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.
161
+
162
+ - `brigade outcome capture` records the result of a verify run (a real exit code, not an opinion) against the skill that produced it.
163
+ - `brigade outcome score` ranks each skill by a Wilson lower bound, so something that passed twice never outranks something vetted across twenty runs.
164
+ - `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.
165
+ - `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.
166
+
167
+ 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.
168
+
169
+ ## Sidecars
170
+
171
+ 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.
172
+
173
+ | `brigade add` | Tool | What it does |
174
+ |---|---|---|
175
+ | `guard` | content-guard | scans handoffs and content for secrets and PII before anything leaves the machine |
176
+ | `tokens` | tokenjuice | tracks token spend across your harnesses and compacts noisy output |
177
+ | `memory` | memory-doctor, bootstrap-doctor | validates memory cards and bootstrap files for staleness and contradictions |
178
+ | `pantry` | agentpantry | syncs browser sessions and auth across an agent's machine |
179
+ | `search` | code-search | local semantic code search over your repos |
180
+ | `evidence` | miseledger | a local-first evidence ledger with receipts and source exporters |
181
+
182
+ ## Harness support
183
+
184
+ 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.
185
+
186
+ | Writer | Harness id | Inbox |
187
+ |---|---|---|
188
+ | Codex CLI | `codex` | `.codex/memory-handoffs/` |
189
+ | Claude Code | `claude` | `.claude/memory-handoffs/` |
190
+ | OpenCode | `opencode` | `.opencode/memory-handoffs/` |
191
+ | Antigravity | `antigravity` | `.antigravity/memory-handoffs/` |
192
+ | Pi | `pi` | `.pi/memory-handoffs/` |
193
+ | Cursor | `cursor` | `.cursor/memory-handoffs/` |
194
+ | Aider | `aider` | `.aider/memory-handoffs/` |
195
+ | Goose | `goose` | `.goose/memory-handoffs/` |
196
+ | Continue | `continue` | `.continue/memory-handoffs/` |
197
+ | GitHub Copilot CLI | `copilot` | `.copilot/memory-handoffs/` |
198
+ | Qwen Code | `qwen` | `.qwen/memory-handoffs/` |
199
+ | Kimi Code | `kimi` | `.kimi/memory-handoffs/` |
200
+ | AdaL | `adal` | `.adal/memory-handoffs/` |
201
+ | OpenHands | `openhands` | `.openhands/memory-handoffs/` |
202
+ | Grok CLI | `grok` | `.grok/memory-handoffs/` |
203
+ | Amp | `amp` | `.amp/memory-handoffs/` |
204
+ | Crush | `crush` | `.crush/memory-handoffs/` |
205
+ | Hermes | `hermes` | `.hermes/memory-handoffs/` |
206
+ | OpenClaw | `openclaw` | usually the memory owner, not a writer |
207
+
208
+ 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`).
209
+
210
+ ## More
211
+
212
+ 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.
213
+
214
+ - **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`.
215
+ - **Daily loop**: `brigade work brief` shows pending work, imports, and warnings; `brigade daily status` keeps it bounded and cheap.
216
+ - **Friction logs**: `brigade friction scan` mines recent notes, handoffs, and session artifacts for reviewable workflow friction.
217
+ - **Security and scrub**: `brigade security scan` is a local read-only scanner for agent workspaces; `brigade scrub` gates content before it leaves the machine.
218
+ - **Research**: `brigade research run` turns a question into a cited local report and a reviewable memory handoff.
219
+ - **Fleet and release**: health evidence across your local repos and release-readiness receipts, with no publish step.
220
+
221
+ The full tour of every station lives in [docs/overview.md](docs/overview.md).
222
+
223
+ ## Why not something else?
224
+
225
+ - **mem0, Letta, agentmemory, 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.
226
+ - **add-mcp, chezmoi, and config-sync scripts** move MCP or dotfiles around, but they sync one thing with no review gate and no receipt, and they do not touch memory or skills. Brigade keeps one canonical source for MCP servers, tools, skills, and memory together, shows the per-tool diff before any write, and leaves a receipt you can roll back.
227
+ - **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.
228
+ - **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.
229
+ - **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.
230
+ - **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.
231
+
232
+ At a glance, against the tools people reach for first:
233
+
234
+ | | Across harnesses | MCP, tools, and memory in one source | Review gate + receipts | Local files, no daemon |
235
+ |---|:---:|:---:|:---:|:---:|
236
+ | **Brigade** | yes | yes | yes | yes |
237
+ | mem0 / Letta / agentmemory | per-SDK | memory only | no | usually hosted or a server |
238
+ | add-mcp / chezmoi / config-sync | partial | MCP or dotfiles only | no | yes |
239
+ | Native harness memory | no | memory only | no | yes |
240
+
241
+ ## What Brigade is not
242
+
243
+ Brigade is not a hosted memory service, a daemon, or an automatic release bot.
244
+
245
+ It does not:
246
+
247
+ - run in the background or install schedulers
248
+ - push to GitHub or publish packages
249
+ - send notifications by default
250
+ - save every note automatically
251
+ - turn memory ingest into a silent background process
252
+ - skip review for ambiguous, risky, or failed notes
253
+
254
+ That pause is the point. Agent memory should be useful, not noisy.
255
+
256
+ And it is not the other projects that share the name. This Brigade is the AI-agent operator CLI, installed with `pipx install brigade-cli` from [`escoffier-labs/brigade`](https://github.com/escoffier-labs/brigade). It is not the CNCF/Microsoft **Brigade** for event-driven scripting on Kubernetes (archived in 2022), the Spinabot **Brigade** agent crew, or the 2017 `brigade` Python package that became Nornir. Same word, different tool.
257
+
258
+ ## Why I built this
259
+
260
+ <p align="center">
261
+ <img src="docs/assets/brigade-kitchen-scene.jpg" alt="The brigade at the pass" width="900">
262
+ </p>
263
+
264
+ 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).
265
+
266
+ ## Docs
267
+
268
+ - [First 10 minutes](docs/first-10-minutes.md): shortest path from install to healthy setup.
269
+ - [Overview](docs/overview.md): the full tour of every station and diagram.
270
+ - [Technical guide](docs/technical-guide.md): the detailed command walkthrough.
271
+ - [MCP sync](docs/mcp-sync.md): the canonical catalog, supported tools, and merge rules.
272
+ - [Security and Content Guard](docs/security.md): scanner policies, handoff guards, import flow.
273
+ - [Handoff promotion](docs/handoff-promotion.md): how notes move toward memory.
274
+ - [Repo fleet](docs/repo-fleet.md) and [Tool catalog](docs/tool-catalog.md).
275
+ - [Command inventory](docs/command-inventory.md): every public CLI command.
276
+ - [Maintainers](MAINTAINERS.md), [Governance](GOVERNANCE.md), [Security](SECURITY.md), and [Contributing](CONTRIBUTING.md).
277
+ - [Roadmap](ROADMAP.md) and [roadmap archive](docs/roadmap-archive.md).
278
+
279
+ ## License
280
+
281
+ MIT. See [LICENSE](LICENSE).
282
+
283
+ 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.
284
+
285
+ 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.