brigade-cli 0.12.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.
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/PKG-INFO +87 -41
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/QUICKSTART.md +2 -2
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/README.md +86 -40
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/pyproject.toml +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/__init__.py +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/__init__.py +4 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/_common.py +2 -2
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/hermes_fragments.py +1 -1
- brigade_cli-0.13.0/src/brigade/cli/mcp.py +136 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/operator.py +26 -0
- brigade_cli-0.13.0/src/brigade/cli/outcome.py +111 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/context_cmd.py +68 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/doctor.py +26 -2
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/fragments.py +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/install.py +5 -3
- brigade_cli-0.13.0/src/brigade/mcp_adapters.py +717 -0
- brigade_cli-0.13.0/src/brigade/mcp_cmd.py +596 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/__init__.py +2 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/lifecycle.py +106 -0
- brigade_cli-0.13.0/src/brigade/outcome.py +179 -0
- brigade_cli-0.13.0/src/brigade/outcome_cmd.py +380 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/prompt.py +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/registry.py +8 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/runbook_cmd.py +64 -14
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/skills_cmd.py +69 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/generic/memory-contract.md +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/hermes.json +3 -3
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/README.md +3 -3
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/memory-handoff.harness.json +3 -3
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/model-lanes.harness.json +3 -3
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/workspace.harness.json +4 -4
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/chat-memory-sweep.example.json +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/memory-care.example.json +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/policies/personal.json +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/policies/public-content.json +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/policies/public-repo.json +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/toml_compat.py +21 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/tools_cmd.py +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/PKG-INFO +87 -41
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/SOURCES.txt +14 -0
- brigade_cli-0.13.0/tests/test_context_cmd.py +83 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_doctor.py +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_fragments.py +1 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_init.py +1 -1
- brigade_cli-0.13.0/tests/test_mcp_adapters.py +236 -0
- brigade_cli-0.13.0/tests/test_mcp_cmd.py +250 -0
- brigade_cli-0.13.0/tests/test_mcp_integration.py +143 -0
- brigade_cli-0.13.0/tests/test_mcp_user_scope.py +109 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_operator_cmd.py +28 -0
- brigade_cli-0.13.0/tests/test_outcome.py +164 -0
- brigade_cli-0.13.0/tests/test_outcome_cmd.py +260 -0
- brigade_cli-0.13.0/tests/test_outcome_execute.py +78 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_runbook_cmd.py +99 -6
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_skills_cmd.py +45 -1
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_toml_compat.py +14 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/LICENSE +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/MANIFEST.in +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/setup.cfg +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/__main__.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/aboyeur.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/actionqueue.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/add.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/agents.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/budgets.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/budgets_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/center_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/chat_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/add.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/budgets.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/center.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/chat.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/completions.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/context.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/daily.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/doctor.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/dogfood.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/friction.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/handoff.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/handoff_template.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/ingest.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/init.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/learn.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/memory.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/notifications.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/openclaw_fragments.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/pantry.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/projects.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/reconfigure.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/release.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/repos.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/research.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/roadmap.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/roster.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/run.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/runbook.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/runs.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/scrub.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/security.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/skills.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/status.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/tools.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/untrusted.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/cli/work.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/completions.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/config.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/daily_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/dogfood_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/friction_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/handoff.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/handoff_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/hermes_adapter.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/ingest.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/learn_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/localio.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/managed.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/mcp_server.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/memory_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/notifications_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/adoption.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/guide.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/health.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/migration.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/operator_cmd/surfaces.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/pantry_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/phases_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/proc.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/projects_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/py.typed +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/reconfigure.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/release_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/reportstore.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/repos_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/__init__.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/config.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/engine.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/extract.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/handoff.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/llm.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/registry.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/report.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/sources/__init__.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/sources/cli.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/sources/local.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/sources/web.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research/types.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/research_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/roadmap_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/roster.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/roster_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/runguard.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/runs_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/scrub.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/security_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/selection.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/station.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/status.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/adal/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/aider/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/amp/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/antigravity/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/claude/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/codex/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/continue/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/copilot/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/crush/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/cursor/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/depth/repo.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/depth/workspace.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/generic/harness-adapter-checklist.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/goose/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/grok/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/handoff/handoff-sources.example.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/handoff/openclaw-ingest-receipt.example.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/adal.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/aider.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/amp.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/antigravity.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/claude.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/codex.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/continue.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/copilot.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/crush.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/cursor.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/goose.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/grok.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/kimi.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/openclaw.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/opencode.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/openhands.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/pi.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/harnesses/qwen.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/hermes/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/hooks/pre-push +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/includes/publisher.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/kimi/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/backup-restic.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/chat-surface-crawlers.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/content-safety.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/handoff-flow.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/memory-architecture.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/memory-care-staleness.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/memory-scanner.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/multi-workspace-handoff-admin.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/obsidian-notes.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/pipeline-standups.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/memory/cards/tokenjuice-output-compaction.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/README.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/acp-escalation.openclaw.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/memory-sweep-cron.openclaw.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/model-aliases.openclaw.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/openclaw/ollama-memory-search.openclaw.json +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/opencode/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/openhands/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/pi/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/qwen/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/scripts/backup-restic.sh +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/skills/note/SKILL.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/AGENTS.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/CLAUDE.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/HEARTBEAT.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/IDENTITY.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/INSTALL_FOR_AGENTS.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/MEMORY.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/SAFETY_RULES.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/SOUL.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/TOOLS.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/USER.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/rules/acceptance-driven-work.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates/workspace/rules/issue-tdd-loop.md +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/templates.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/untrusted.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/untrusted_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/__init__.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/backup.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/config.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/constants.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/helpers.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/imports.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/ledger.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/reviews.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/scanners.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/services.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/session.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/sweeps.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade/work_cmd/verification.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/dependency_links.txt +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/entry_points.txt +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/requires.txt +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/src/brigade_cli.egg-info/top_level.txt +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_aboyeur.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_actionqueue.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_add.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_agents.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_budgets.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_cli_alias.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_cli_help.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_completions.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_config.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_dogfood_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_friction_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_gitignore.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_handoff.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_handoff_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_ingest.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_install.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_localio.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_managed.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_mcp_server.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_memory_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_memory_search_mcp.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_neutrality.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_notifications_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_operator_checkup.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_pantry_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_parity_backlog.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase100_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase101_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase165_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase36_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase37_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase38_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase39_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase40_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase41_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase42_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase43_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase44_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase45_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase46_50_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase51_55_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase56_60_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase96_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase97_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase98_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_phase99_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_pre_push_hook.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_privacy_regression.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_proc.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_prompt.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_read_only_enforcement.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_reconfigure.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_registry.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_release_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_reportstore.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_repos_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_cli_sources.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_config.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_engine.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_extract.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_handoff.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_llm.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_local_sources.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_registry.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_report.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_types.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_research_web.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_roadmap_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_roster.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_roster_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_run_cli.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_runbook_import.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_runguard.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_runs_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_scrub.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_security_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_security_diff.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_selection.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_station.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_status.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_subprocess_guards.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_untrusted.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_untrusted_cmd.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_backup.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_facade.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_imports.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_ledger.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_reviews.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_scanners.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_services.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_session.py +0 -0
- {brigade_cli-0.12.0 → brigade_cli-0.13.0}/tests/test_work_cmd_sweeps.py +0 -0
- {brigade_cli-0.12.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.
|
|
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>
|
|
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,27 +47,52 @@ 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
|
-
##
|
|
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
|
-
|
|
78
|
+
One catalog (`.brigade/mcp.json`), six native targets:
|
|
63
79
|
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
91
|
+
Tools and skills get the same treatment: `brigade tools sync` projects one reviewed catalog into each harness's native format.
|
|
69
92
|
|
|
70
|
-
|
|
93
|
+
> `brigade mcp` requires brigade 0.13.0 or newer (`pipx upgrade brigade-cli`).
|
|
94
|
+
|
|
95
|
+
## Shared memory, with a guard in front
|
|
71
96
|
|
|
72
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
|
|
|
@@ -98,38 +123,31 @@ flowchart LR
|
|
|
98
123
|
class REVIEW gate;
|
|
99
124
|
```
|
|
100
125
|
|
|
101
|
-
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.
|
|
102
|
-
|
|
103
|
-
It all runs on the machine you control: laptop, workstation, or VPS. Local by default, loud about the exceptions.
|
|
104
|
-
|
|
105
|
-
## 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.
|
|
106
127
|
|
|
107
|
-
|
|
108
|
-
pipx install brigade-cli
|
|
109
|
-
brigade operator quickstart --target ./my-repo --harnesses codex
|
|
110
|
-
brigade operator doctor --target ./my-repo --profile local-operator
|
|
111
|
-
```
|
|
128
|
+
## Verified learning
|
|
112
129
|
|
|
113
|
-
|
|
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.
|
|
114
131
|
|
|
115
|
-
|
|
116
|
-
brigade
|
|
117
|
-
|
|
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.
|
|
118
136
|
|
|
119
|
-
|
|
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.
|
|
120
138
|
|
|
121
|
-
|
|
139
|
+
## Sidecars
|
|
122
140
|
|
|
123
|
-
|
|
124
|
-
brigade handoff draft --target ./my-repo --inbox codex \
|
|
125
|
-
--title "What changed" \
|
|
126
|
-
--summary "Short note future agents should know." \
|
|
127
|
-
--content "The durable note itself goes here."
|
|
128
|
-
brigade handoff lint --target ./my-repo
|
|
129
|
-
brigade handoff doctor --target ./my-repo
|
|
130
|
-
```
|
|
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.
|
|
131
142
|
|
|
132
|
-
|
|
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 |
|
|
133
151
|
|
|
134
152
|
## Harness support
|
|
135
153
|
|
|
@@ -157,18 +175,17 @@ Each writer gets its own local inbox; one canonical owner ingests. Brigade keeps
|
|
|
157
175
|
| Hermes | `hermes` | `.hermes/memory-handoffs/` |
|
|
158
176
|
| OpenClaw | `openclaw` | usually the memory owner, not a writer |
|
|
159
177
|
|
|
160
|
-
All of them get handoff templates and ingest source coverage. Most also get projected tools and skills in their native format
|
|
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`).
|
|
161
179
|
|
|
162
|
-
##
|
|
180
|
+
## More
|
|
163
181
|
|
|
164
|
-
The
|
|
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.
|
|
165
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`.
|
|
166
185
|
- **Daily loop**: `brigade work brief` shows pending work, imports, and warnings; `brigade daily status` keeps it bounded and cheap.
|
|
167
|
-
- **Friction logs**: `brigade friction scan
|
|
168
|
-
- **Security**: `brigade security scan` is a local read-only scanner for agent workspaces
|
|
169
|
-
- **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.
|
|
170
188
|
- **Research**: `brigade research run` turns a question into a cited local report and a reviewable memory handoff.
|
|
171
|
-
- **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.
|
|
172
189
|
- **Fleet and release**: health evidence across your local repos and release-readiness receipts, with no publish step.
|
|
173
190
|
|
|
174
191
|
The full tour of every station lives in [docs/overview.md](docs/overview.md).
|
|
@@ -177,7 +194,8 @@ The full tour of every station lives in [docs/overview.md](docs/overview.md).
|
|
|
177
194
|
|
|
178
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.
|
|
179
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.
|
|
180
|
-
- **
|
|
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.
|
|
181
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.
|
|
182
200
|
|
|
183
201
|
## What Brigade is not
|
|
@@ -195,11 +213,39 @@ It does not:
|
|
|
195
213
|
|
|
196
214
|
That pause is the point. Agent memory should be useful, not noisy.
|
|
197
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
|
+
|
|
198
243
|
## Docs
|
|
199
244
|
|
|
200
245
|
- [First 10 minutes](docs/first-10-minutes.md): shortest path from install to healthy setup.
|
|
201
246
|
- [Overview](docs/overview.md): the full tour of every station and diagram.
|
|
202
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.
|
|
203
249
|
- [Security and Content Guard](docs/security.md): scanner policies, handoff guards, import flow.
|
|
204
250
|
- [Handoff promotion](docs/handoff-promotion.md): how notes move toward memory.
|
|
205
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
|
|
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
|
|
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
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<h1 align="center">Brigade CLI</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<strong>
|
|
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
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
@@ -17,27 +17,52 @@
|
|
|
17
17
|
|
|
18
18
|
Your agents run loops. Brigade keeps the receipts.
|
|
19
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
|
+
|
|
20
24
|
## Try it in 60 seconds
|
|
21
25
|
|
|
22
26
|
```bash
|
|
23
27
|
pipx install brigade-cli
|
|
28
|
+
pipx ensurepath # then open a new shell so `brigade` is on PATH
|
|
24
29
|
brigade operator quickstart --target ./my-repo --harnesses codex # wire one repo
|
|
25
30
|
brigade operator doctor --target ./my-repo --profile local-operator # verify
|
|
26
31
|
```
|
|
27
32
|
|
|
28
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).
|
|
29
34
|
|
|
30
|
-
##
|
|
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
|
+
```
|
|
31
47
|
|
|
32
|
-
|
|
48
|
+
One catalog (`.brigade/mcp.json`), six native targets:
|
|
33
49
|
|
|
34
|
-
|
|
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`) |
|
|
35
58
|
|
|
36
|
-
|
|
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).
|
|
37
60
|
|
|
38
|
-
|
|
61
|
+
Tools and skills get the same treatment: `brigade tools sync` projects one reviewed catalog into each harness's native format.
|
|
39
62
|
|
|
40
|
-
|
|
63
|
+
> `brigade mcp` requires brigade 0.13.0 or newer (`pipx upgrade brigade-cli`).
|
|
64
|
+
|
|
65
|
+
## Shared memory, with a guard in front
|
|
41
66
|
|
|
42
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.
|
|
43
68
|
|
|
@@ -68,38 +93,31 @@ flowchart LR
|
|
|
68
93
|
class REVIEW gate;
|
|
69
94
|
```
|
|
70
95
|
|
|
71
|
-
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.
|
|
72
|
-
|
|
73
|
-
It all runs on the machine you control: laptop, workstation, or VPS. Local by default, loud about the exceptions.
|
|
74
|
-
|
|
75
|
-
## Install
|
|
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.
|
|
76
97
|
|
|
77
|
-
|
|
78
|
-
pipx install brigade-cli
|
|
79
|
-
brigade operator quickstart --target ./my-repo --harnesses codex
|
|
80
|
-
brigade operator doctor --target ./my-repo --profile local-operator
|
|
81
|
-
```
|
|
98
|
+
## Verified learning
|
|
82
99
|
|
|
83
|
-
|
|
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.
|
|
84
101
|
|
|
85
|
-
|
|
86
|
-
brigade
|
|
87
|
-
|
|
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.
|
|
88
106
|
|
|
89
|
-
|
|
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.
|
|
90
108
|
|
|
91
|
-
|
|
109
|
+
## Sidecars
|
|
92
110
|
|
|
93
|
-
|
|
94
|
-
brigade handoff draft --target ./my-repo --inbox codex \
|
|
95
|
-
--title "What changed" \
|
|
96
|
-
--summary "Short note future agents should know." \
|
|
97
|
-
--content "The durable note itself goes here."
|
|
98
|
-
brigade handoff lint --target ./my-repo
|
|
99
|
-
brigade handoff doctor --target ./my-repo
|
|
100
|
-
```
|
|
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.
|
|
101
112
|
|
|
102
|
-
|
|
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 |
|
|
103
121
|
|
|
104
122
|
## Harness support
|
|
105
123
|
|
|
@@ -127,18 +145,17 @@ Each writer gets its own local inbox; one canonical owner ingests. Brigade keeps
|
|
|
127
145
|
| Hermes | `hermes` | `.hermes/memory-handoffs/` |
|
|
128
146
|
| OpenClaw | `openclaw` | usually the memory owner, not a writer |
|
|
129
147
|
|
|
130
|
-
All of them get handoff templates and ingest source coverage. Most also get projected tools and skills in their native format
|
|
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`).
|
|
131
149
|
|
|
132
|
-
##
|
|
150
|
+
## More
|
|
133
151
|
|
|
134
|
-
The
|
|
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.
|
|
135
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`.
|
|
136
155
|
- **Daily loop**: `brigade work brief` shows pending work, imports, and warnings; `brigade daily status` keeps it bounded and cheap.
|
|
137
|
-
- **Friction logs**: `brigade friction scan
|
|
138
|
-
- **Security**: `brigade security scan` is a local read-only scanner for agent workspaces
|
|
139
|
-
- **Tools and skills**: one reviewed catalog projected into every harness's native format, with approval gates for anything that executes.
|
|
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.
|
|
140
158
|
- **Research**: `brigade research run` turns a question into a cited local report and a reviewable memory handoff.
|
|
141
|
-
- **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.
|
|
142
159
|
- **Fleet and release**: health evidence across your local repos and release-readiness receipts, with no publish step.
|
|
143
160
|
|
|
144
161
|
The full tour of every station lives in [docs/overview.md](docs/overview.md).
|
|
@@ -147,7 +164,8 @@ The full tour of every station lives in [docs/overview.md](docs/overview.md).
|
|
|
147
164
|
|
|
148
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.
|
|
149
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.
|
|
150
|
-
- **
|
|
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.
|
|
151
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.
|
|
152
170
|
|
|
153
171
|
## What Brigade is not
|
|
@@ -165,11 +183,39 @@ It does not:
|
|
|
165
183
|
|
|
166
184
|
That pause is the point. Agent memory should be useful, not noisy.
|
|
167
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
|
+
|
|
168
213
|
## Docs
|
|
169
214
|
|
|
170
215
|
- [First 10 minutes](docs/first-10-minutes.md): shortest path from install to healthy setup.
|
|
171
216
|
- [Overview](docs/overview.md): the full tour of every station and diagram.
|
|
172
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.
|
|
173
219
|
- [Security and Content Guard](docs/security.md): scanner policies, handoff guards, import flow.
|
|
174
220
|
- [Handoff promotion](docs/handoff-promotion.md): how notes move toward memory.
|
|
175
221
|
- [Repo fleet](docs/repo-fleet.md) and [Tool catalog](docs/tool-catalog.md).
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "brigade-cli"
|
|
7
|
-
version = "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"
|
|
@@ -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,6 +56,7 @@ 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,
|
|
@@ -102,6 +104,7 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
102
104
|
_context_group.register(sub)
|
|
103
105
|
_projects_group.register(sub)
|
|
104
106
|
_learn_group.register(sub)
|
|
107
|
+
_outcome_group.register(sub)
|
|
105
108
|
_research_group.register(sub)
|
|
106
109
|
_center_group.register(sub)
|
|
107
110
|
_run_group.register(sub)
|
|
@@ -111,6 +114,7 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
111
114
|
_scrub_group.register(sub)
|
|
112
115
|
_security_group.register(sub)
|
|
113
116
|
_tools_group.register(sub)
|
|
117
|
+
_mcp_group.register(sub)
|
|
114
118
|
_handoff_template_group.register(sub)
|
|
115
119
|
_ingest_group.register(sub)
|
|
116
120
|
_openclaw_fragments_group.register(sub)
|
|
@@ -14,10 +14,10 @@ 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
21
|
),
|
|
22
22
|
(
|
|
23
23
|
"Wiring and advanced",
|
|
@@ -8,7 +8,7 @@ from pathlib import Path
|
|
|
8
8
|
|
|
9
9
|
def register(sub: argparse._SubParsersAction) -> None:
|
|
10
10
|
# hermes-fragments
|
|
11
|
-
p_hf = sub.add_parser("hermes-fragments", help="Write Hermes adapter fragments
|
|
11
|
+
p_hf = sub.add_parser("hermes-fragments", help="Write Hermes adapter fragments.")
|
|
12
12
|
p_hf.add_argument("--out", "-o", type=Path, required=True, help="Output directory.")
|
|
13
13
|
p_hf.set_defaults(func=dispatch)
|
|
14
14
|
|