brigade-cli 0.13.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.
- {brigade_cli-0.13.0/src/brigade_cli.egg-info → brigade_cli-0.14.0}/PKG-INFO +86 -28
- brigade_cli-0.13.0/PKG-INFO → brigade_cli-0.14.0/README.md +82 -55
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/pyproject.toml +4 -3
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/__init__.py +1 -1
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/init.py +10 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/install.py +35 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/depth/workspace.json +1 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/memory-handoff.harness.json +1 -1
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/model-lanes.harness.json +1 -1
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/workspace.harness.json +1 -1
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/chat-memory-sweep.example.json +1 -1
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/memory-care.example.json +1 -1
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/policies/personal.json +1 -1
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/policies/public-content.json +1 -1
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/policies/public-repo.json +1 -1
- brigade_cli-0.14.0/src/brigade/templates/skills/brigade-work/SKILL.md +57 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/AGENTS.md +12 -23
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/CLAUDE.md +4 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/INSTALL_FOR_AGENTS.md +11 -0
- brigade_cli-0.13.0/README.md → brigade_cli-0.14.0/src/brigade_cli.egg-info/PKG-INFO +113 -25
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/SOURCES.txt +1 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_init.py +30 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/LICENSE +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/MANIFEST.in +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/QUICKSTART.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/setup.cfg +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/__main__.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/aboyeur.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/actionqueue.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/add.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/agents.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/budgets.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/budgets_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/center_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/chat_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/__init__.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/_common.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/add.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/budgets.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/center.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/chat.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/completions.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/context.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/daily.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/doctor.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/dogfood.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/friction.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/handoff.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/handoff_template.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/hermes_fragments.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/ingest.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/learn.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/mcp.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/memory.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/notifications.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/openclaw_fragments.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/operator.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/outcome.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/pantry.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/projects.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/reconfigure.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/release.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/repos.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/research.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/roadmap.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/roster.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/run.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/runbook.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/runs.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/scrub.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/security.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/skills.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/status.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/tools.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/untrusted.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/cli/work.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/completions.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/config.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/context_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/daily_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/doctor.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/dogfood_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/fragments.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/friction_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/handoff.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/handoff_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/hermes_adapter.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/ingest.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/learn_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/localio.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/managed.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/mcp_adapters.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/mcp_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/mcp_server.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/memory_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/notifications_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/__init__.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/adoption.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/guide.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/health.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/lifecycle.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/migration.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/operator_cmd/surfaces.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/outcome.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/outcome_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/pantry_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/phases_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/proc.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/projects_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/prompt.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/py.typed +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/reconfigure.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/registry.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/release_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/reportstore.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/repos_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/__init__.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/config.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/engine.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/extract.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/handoff.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/llm.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/registry.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/report.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/sources/__init__.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/sources/cli.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/sources/local.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/sources/web.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research/types.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/research_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/roadmap_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/roster.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/roster_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/runbook_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/runguard.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/runs_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/scrub.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/security_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/selection.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/skills_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/station.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/status.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/adal/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/aider/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/amp/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/antigravity/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/claude/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/codex/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/continue/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/copilot/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/crush/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/cursor/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/depth/repo.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/generic/harness-adapter-checklist.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/generic/memory-contract.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/goose/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/grok/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/handoff/handoff-sources.example.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/handoff/openclaw-ingest-receipt.example.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/adal.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/aider.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/amp.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/antigravity.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/claude.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/codex.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/continue.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/copilot.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/crush.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/cursor.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/goose.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/grok.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/hermes.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/kimi.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/openclaw.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/opencode.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/openhands.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/pi.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/harnesses/qwen.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/README.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/hooks/pre-push +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/includes/publisher.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/kimi/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/backup-restic.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/chat-surface-crawlers.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/content-safety.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/handoff-flow.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/memory-architecture.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/memory-care-staleness.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/memory-scanner.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/multi-workspace-handoff-admin.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/obsidian-notes.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/pipeline-standups.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/cards/tokenjuice-output-compaction.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/README.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/acp-escalation.openclaw.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/memory-sweep-cron.openclaw.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/model-aliases.openclaw.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/openclaw/ollama-memory-search.openclaw.json +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/opencode/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/openhands/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/pi/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/qwen/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/scripts/backup-restic.sh +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/skills/note/SKILL.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/HEARTBEAT.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/IDENTITY.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/MEMORY.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/SAFETY_RULES.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/SOUL.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/TOOLS.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/USER.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/rules/acceptance-driven-work.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/workspace/rules/issue-tdd-loop.md +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/toml_compat.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/tools_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/untrusted.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/untrusted_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/__init__.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/backup.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/config.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/constants.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/helpers.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/imports.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/ledger.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/reviews.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/scanners.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/services.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/session.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/sweeps.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/work_cmd/verification.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/dependency_links.txt +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/entry_points.txt +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/requires.txt +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade_cli.egg-info/top_level.txt +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_aboyeur.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_actionqueue.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_add.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_agents.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_budgets.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_cli_alias.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_cli_help.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_completions.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_config.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_context_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_doctor.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_dogfood_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_fragments.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_friction_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_gitignore.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_handoff.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_handoff_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_ingest.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_install.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_localio.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_managed.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_mcp_adapters.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_mcp_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_mcp_integration.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_mcp_server.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_mcp_user_scope.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_memory_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_memory_search_mcp.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_neutrality.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_notifications_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_operator_checkup.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_operator_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_outcome.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_outcome_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_outcome_execute.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_pantry_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_parity_backlog.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase100_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase101_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase165_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase36_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase37_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase38_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase39_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase40_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase41_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase42_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase43_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase44_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase45_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase46_50_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase51_55_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase56_60_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase96_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase97_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase98_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_phase99_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_pre_push_hook.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_privacy_regression.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_proc.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_prompt.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_read_only_enforcement.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_reconfigure.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_registry.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_release_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_reportstore.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_repos_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_cli_sources.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_config.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_engine.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_extract.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_handoff.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_llm.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_local_sources.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_registry.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_report.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_types.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_research_web.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_roadmap_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_roster.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_roster_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_run_cli.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_runbook_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_runbook_import.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_runguard.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_runs_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_scrub.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_security_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_security_diff.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_selection.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_skills_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_station.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_status.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_subprocess_guards.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_toml_compat.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_untrusted.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_untrusted_cmd.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_backup.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_facade.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_imports.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_ledger.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_reviews.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_scanners.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_services.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_session.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_sweeps.py +0 -0
- {brigade_cli-0.13.0 → brigade_cli-0.14.0}/tests/test_work_cmd_verification.py +0 -0
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: brigade-cli
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
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
5
|
Author-email: Solomon Neas <me@solomonneas.dev>
|
|
6
6
|
License: MIT
|
|
7
7
|
Project-URL: Homepage, https://brigade.tools
|
|
8
|
+
Project-URL: Documentation, https://brigade.tools/docs
|
|
8
9
|
Project-URL: Repository, https://github.com/escoffier-labs/brigade
|
|
9
10
|
Project-URL: Cookbook, https://github.com/escoffier-labs/solos-cookbook
|
|
10
11
|
Project-URL: OpenClaw, https://github.com/solomonneas/openclaw
|
|
11
12
|
Project-URL: ContentGuard, https://github.com/escoffier-labs/content-guard
|
|
12
13
|
Project-URL: AgentPantry, https://github.com/escoffier-labs/agentpantry
|
|
13
14
|
Project-URL: Issues, https://github.com/escoffier-labs/brigade/issues
|
|
14
|
-
Keywords: agents,ai-agents,agent-memory,agent-handoffs,ai-memory,openclaw,claude-code,codex,opencode,memory,bootstrap,brigade,brigade-cli,operator,local-first,guardrails,agents-md
|
|
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
|
|
15
16
|
Classifier: Development Status :: 3 - Alpha
|
|
16
17
|
Classifier: License :: OSI Approved :: MIT License
|
|
17
18
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -29,15 +30,19 @@ Requires-Dist: playwright>=1.40; extra == "research"
|
|
|
29
30
|
Dynamic: license-file
|
|
30
31
|
|
|
31
32
|
<p align="center">
|
|
32
|
-
<img src="docs/assets/brigade-social-preview.jpg" alt="Brigade" width="900">
|
|
33
|
+
<img src="docs/assets/brigade-social-preview.jpg" alt="Brigade banner" width="900">
|
|
33
34
|
</p>
|
|
34
35
|
|
|
35
|
-
<h1 align="center">Brigade
|
|
36
|
+
<h1 align="center">Brigade</h1>
|
|
36
37
|
|
|
37
38
|
<p align="center">
|
|
38
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>
|
|
39
40
|
</p>
|
|
40
41
|
|
|
42
|
+
<p align="center">
|
|
43
|
+
<a href="https://brigade.tools">Website</a> · <a href="https://brigade.tools/docs">Docs</a> · <a href="#try-it-in-60-seconds">Quickstart</a>
|
|
44
|
+
</p>
|
|
45
|
+
|
|
41
46
|
<p align="center">
|
|
42
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">
|
|
43
48
|
<img src="https://img.shields.io/pypi/v/brigade-cli?style=for-the-badge&label=pypi" alt="PyPI version">
|
|
@@ -47,10 +52,39 @@ Dynamic: license-file
|
|
|
47
52
|
|
|
48
53
|
Your agents run loops. Brigade keeps the receipts.
|
|
49
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
|
+
|
|
50
61
|
## What it does
|
|
51
62
|
|
|
52
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.
|
|
53
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
|
+
|
|
54
88
|
## Try it in 60 seconds
|
|
55
89
|
|
|
56
90
|
```bash
|
|
@@ -62,6 +96,17 @@ brigade operator doctor --target ./my-repo --profile local-operator # verify
|
|
|
62
96
|
|
|
63
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).
|
|
64
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
|
+
|
|
65
110
|
## One MCP catalog, synced into every tool
|
|
66
111
|
|
|
67
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.
|
|
@@ -75,6 +120,22 @@ brigade mcp sync # dry-run: show the diff for every tool
|
|
|
75
120
|
brigade mcp sync --write # merge into each tool's config
|
|
76
121
|
```
|
|
77
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
|
+
|
|
78
139
|
One catalog (`.brigade/mcp.json`), six native targets:
|
|
79
140
|
|
|
80
141
|
| Tool | File it writes |
|
|
@@ -192,12 +253,22 @@ The full tour of every station lives in [docs/overview.md](docs/overview.md).
|
|
|
192
253
|
|
|
193
254
|
## Why not something else?
|
|
194
255
|
|
|
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.
|
|
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.
|
|
196
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.
|
|
197
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.
|
|
198
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.
|
|
199
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.
|
|
200
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
|
+
|
|
201
272
|
## What Brigade is not
|
|
202
273
|
|
|
203
274
|
Brigade is not a hosted memory service, a daemon, or an automatic release bot.
|
|
@@ -213,31 +284,14 @@ It does not:
|
|
|
213
284
|
|
|
214
285
|
That pause is the point. Agent memory should be useful, not noisy.
|
|
215
286
|
|
|
216
|
-
|
|
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.
|
|
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.
|
|
238
288
|
|
|
239
289
|
## Why I built this
|
|
240
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
|
+
|
|
241
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).
|
|
242
296
|
|
|
243
297
|
## Docs
|
|
@@ -253,6 +307,10 @@ I run an always-on OpenClaw agent next to daily Codex and Claude Code sessions.
|
|
|
253
307
|
- [Maintainers](MAINTAINERS.md), [Governance](GOVERNANCE.md), [Security](SECURITY.md), and [Contributing](CONTRIBUTING.md).
|
|
254
308
|
- [Roadmap](ROADMAP.md) and [roadmap archive](docs/roadmap-archive.md).
|
|
255
309
|
|
|
310
|
+
## License
|
|
311
|
+
|
|
312
|
+
MIT. See [LICENSE](LICENSE).
|
|
313
|
+
|
|
256
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.
|
|
257
315
|
|
|
258
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.
|
|
@@ -1,43 +1,17 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: brigade-cli
|
|
3
|
-
Version: 0.13.0
|
|
4
|
-
Summary: AI agent memory, handoffs, and local guardrails for Codex, Claude Code, OpenCode, Hermes, and OpenClaw.
|
|
5
|
-
Author-email: Solomon Neas <me@solomonneas.dev>
|
|
6
|
-
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://brigade.tools
|
|
8
|
-
Project-URL: Repository, https://github.com/escoffier-labs/brigade
|
|
9
|
-
Project-URL: Cookbook, https://github.com/escoffier-labs/solos-cookbook
|
|
10
|
-
Project-URL: OpenClaw, https://github.com/solomonneas/openclaw
|
|
11
|
-
Project-URL: ContentGuard, https://github.com/escoffier-labs/content-guard
|
|
12
|
-
Project-URL: AgentPantry, https://github.com/escoffier-labs/agentpantry
|
|
13
|
-
Project-URL: Issues, https://github.com/escoffier-labs/brigade/issues
|
|
14
|
-
Keywords: agents,ai-agents,agent-memory,agent-handoffs,ai-memory,openclaw,claude-code,codex,opencode,memory,bootstrap,brigade,brigade-cli,operator,local-first,guardrails,agents-md
|
|
15
|
-
Classifier: Development Status :: 3 - Alpha
|
|
16
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
-
Classifier: Programming Language :: Python :: 3
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
-
Requires-Python: >=3.10
|
|
22
|
-
Description-Content-Type: text/markdown
|
|
23
|
-
License-File: LICENSE
|
|
24
|
-
Provides-Extra: dev
|
|
25
|
-
Requires-Dist: pytest>=7; extra == "dev"
|
|
26
|
-
Requires-Dist: ruff>=0.15; extra == "dev"
|
|
27
|
-
Provides-Extra: research
|
|
28
|
-
Requires-Dist: playwright>=1.40; extra == "research"
|
|
29
|
-
Dynamic: license-file
|
|
30
|
-
|
|
31
1
|
<p align="center">
|
|
32
|
-
<img src="docs/assets/brigade-social-preview.jpg" alt="Brigade" width="900">
|
|
2
|
+
<img src="docs/assets/brigade-social-preview.jpg" alt="Brigade banner" width="900">
|
|
33
3
|
</p>
|
|
34
4
|
|
|
35
|
-
<h1 align="center">Brigade
|
|
5
|
+
<h1 align="center">Brigade</h1>
|
|
36
6
|
|
|
37
7
|
<p align="center">
|
|
38
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>
|
|
39
9
|
</p>
|
|
40
10
|
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://brigade.tools">Website</a> · <a href="https://brigade.tools/docs">Docs</a> · <a href="#try-it-in-60-seconds">Quickstart</a>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
41
15
|
<p align="center">
|
|
42
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">
|
|
43
17
|
<img src="https://img.shields.io/pypi/v/brigade-cli?style=for-the-badge&label=pypi" alt="PyPI version">
|
|
@@ -47,10 +21,39 @@ Dynamic: license-file
|
|
|
47
21
|
|
|
48
22
|
Your agents run loops. Brigade keeps the receipts.
|
|
49
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
|
+
|
|
50
30
|
## What it does
|
|
51
31
|
|
|
52
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.
|
|
53
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
|
+
|
|
54
57
|
## Try it in 60 seconds
|
|
55
58
|
|
|
56
59
|
```bash
|
|
@@ -62,6 +65,17 @@ brigade operator doctor --target ./my-repo --profile local-operator # verify
|
|
|
62
65
|
|
|
63
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).
|
|
64
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
|
+
|
|
65
79
|
## One MCP catalog, synced into every tool
|
|
66
80
|
|
|
67
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.
|
|
@@ -75,6 +89,22 @@ brigade mcp sync # dry-run: show the diff for every tool
|
|
|
75
89
|
brigade mcp sync --write # merge into each tool's config
|
|
76
90
|
```
|
|
77
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
|
+
|
|
78
108
|
One catalog (`.brigade/mcp.json`), six native targets:
|
|
79
109
|
|
|
80
110
|
| Tool | File it writes |
|
|
@@ -192,12 +222,22 @@ The full tour of every station lives in [docs/overview.md](docs/overview.md).
|
|
|
192
222
|
|
|
193
223
|
## Why not something else?
|
|
194
224
|
|
|
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.
|
|
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.
|
|
196
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.
|
|
197
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.
|
|
198
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.
|
|
199
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.
|
|
200
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
|
+
|
|
201
241
|
## What Brigade is not
|
|
202
242
|
|
|
203
243
|
Brigade is not a hosted memory service, a daemon, or an automatic release bot.
|
|
@@ -213,31 +253,14 @@ It does not:
|
|
|
213
253
|
|
|
214
254
|
That pause is the point. Agent memory should be useful, not noisy.
|
|
215
255
|
|
|
216
|
-
|
|
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.
|
|
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.
|
|
238
257
|
|
|
239
258
|
## Why I built this
|
|
240
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
|
+
|
|
241
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).
|
|
242
265
|
|
|
243
266
|
## Docs
|
|
@@ -253,6 +276,10 @@ I run an always-on OpenClaw agent next to daily Codex and Claude Code sessions.
|
|
|
253
276
|
- [Maintainers](MAINTAINERS.md), [Governance](GOVERNANCE.md), [Security](SECURITY.md), and [Contributing](CONTRIBUTING.md).
|
|
254
277
|
- [Roadmap](ROADMAP.md) and [roadmap archive](docs/roadmap-archive.md).
|
|
255
278
|
|
|
279
|
+
## License
|
|
280
|
+
|
|
281
|
+
MIT. See [LICENSE](LICENSE).
|
|
282
|
+
|
|
256
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.
|
|
257
284
|
|
|
258
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.
|
|
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "brigade-cli"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "
|
|
7
|
+
version = "0.14.0"
|
|
8
|
+
description = "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."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
11
11
|
license = { text = "MIT" }
|
|
12
12
|
authors = [{ name = "Solomon Neas", email = "me@solomonneas.dev" }] # content-guard: allow email
|
|
13
|
-
keywords = ["agents", "ai-agents", "agent-memory", "agent-handoffs", "ai-memory", "openclaw", "claude-code", "codex", "opencode", "memory", "bootstrap", "brigade", "brigade-cli", "operator", "local-first", "guardrails", "agents-md"]
|
|
13
|
+
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"]
|
|
14
14
|
classifiers = [
|
|
15
15
|
"Development Status :: 3 - Alpha",
|
|
16
16
|
"License :: OSI Approved :: MIT License",
|
|
@@ -27,6 +27,7 @@ research = ["playwright>=1.40"]
|
|
|
27
27
|
|
|
28
28
|
[project.urls]
|
|
29
29
|
Homepage = "https://brigade.tools"
|
|
30
|
+
Documentation = "https://brigade.tools/docs"
|
|
30
31
|
Repository = "https://github.com/escoffier-labs/brigade"
|
|
31
32
|
Cookbook = "https://github.com/escoffier-labs/solos-cookbook"
|
|
32
33
|
OpenClaw = "https://github.com/solomonneas/openclaw"
|
|
@@ -24,6 +24,14 @@ def register(sub: argparse._SubParsersAction) -> None:
|
|
|
24
24
|
default=True,
|
|
25
25
|
help="Do not create or update the target's .gitignore.",
|
|
26
26
|
)
|
|
27
|
+
p_init.add_argument(
|
|
28
|
+
"--no-wire",
|
|
29
|
+
dest="wire_skills",
|
|
30
|
+
action="store_false",
|
|
31
|
+
default=True,
|
|
32
|
+
help="Do not install the brigade-work skill into harness skill dirs "
|
|
33
|
+
"(leaves Brigade installed but not wired into the agent's work loop).",
|
|
34
|
+
)
|
|
27
35
|
p_init.add_argument(
|
|
28
36
|
"--git-exclude",
|
|
29
37
|
action="store_true",
|
|
@@ -89,6 +97,7 @@ def dispatch(args) -> int:
|
|
|
89
97
|
allow_home=getattr(args, "allow_home", False),
|
|
90
98
|
use_git_exclude=getattr(args, "git_exclude", False),
|
|
91
99
|
update_gitignore=getattr(args, "update_gitignore", True),
|
|
100
|
+
wire_skills=getattr(args, "wire_skills", True),
|
|
92
101
|
)
|
|
93
102
|
|
|
94
103
|
# No selection flags: interactive prompt.
|
|
@@ -109,4 +118,5 @@ def dispatch(args) -> int:
|
|
|
109
118
|
allow_home=getattr(args, "allow_home", False),
|
|
110
119
|
use_git_exclude=getattr(args, "git_exclude", False),
|
|
111
120
|
update_gitignore=getattr(args, "update_gitignore", True),
|
|
121
|
+
wire_skills=getattr(args, "wire_skills", True),
|
|
112
122
|
)
|
|
@@ -275,6 +275,7 @@ def install_selection(
|
|
|
275
275
|
allow_home: bool = False,
|
|
276
276
|
use_git_exclude: bool = False,
|
|
277
277
|
update_gitignore: bool = True,
|
|
278
|
+
wire_skills: bool = True,
|
|
278
279
|
) -> int:
|
|
279
280
|
"""Install a Selection into `target`. Returns process exit code."""
|
|
280
281
|
selection.validate()
|
|
@@ -353,6 +354,28 @@ def install_selection(
|
|
|
353
354
|
# Persist config.json.
|
|
354
355
|
write_config(target, Config(version=1, selection=selection))
|
|
355
356
|
|
|
357
|
+
# Wire the brigade-work skill into each harness's skills directory so agents
|
|
358
|
+
# actually USE Brigade (run verifications through it, capture outcomes) instead
|
|
359
|
+
# of leaving it installed-but-dormant. Skipped with --no-wire.
|
|
360
|
+
wired_harnesses: list[str] = []
|
|
361
|
+
if wire_skills:
|
|
362
|
+
from .skills_cmd import HARNESS_ADAPTERS
|
|
363
|
+
|
|
364
|
+
skill_src = root / "skills" / "brigade-work" / "SKILL.md"
|
|
365
|
+
if skill_src.is_file():
|
|
366
|
+
for h in selection.harnesses:
|
|
367
|
+
adapter = HARNESS_ADAPTERS.get(h)
|
|
368
|
+
if not adapter:
|
|
369
|
+
continue
|
|
370
|
+
rel = str(adapter.get("install_path", "")).format(skill_id="brigade-work")
|
|
371
|
+
if not rel.startswith("."):
|
|
372
|
+
# user-scoped/absolute adapters (e.g. hermes): use `brigade skills install`.
|
|
373
|
+
continue
|
|
374
|
+
dst = target / rel / "SKILL.md"
|
|
375
|
+
dst.parent.mkdir(parents=True, exist_ok=True)
|
|
376
|
+
dst.write_text(skill_src.read_text())
|
|
377
|
+
wired_harnesses.append(h)
|
|
378
|
+
|
|
356
379
|
if update_gitignore:
|
|
357
380
|
result = apply_gitignore(target, selection, use_git_exclude=use_git_exclude)
|
|
358
381
|
print(f"brigade: gitignore {result}")
|
|
@@ -364,6 +387,18 @@ def install_selection(
|
|
|
364
387
|
f"brigade: installed depth={selection.depth} harnesses={','.join(selection.harnesses) or '(none)'} -> {target}"
|
|
365
388
|
)
|
|
366
389
|
print(f"brigade: memory owner -> {owner_label}")
|
|
390
|
+
if wired_harnesses:
|
|
391
|
+
print()
|
|
392
|
+
print(
|
|
393
|
+
f"brigade: wired the `brigade-work` skill into {', '.join(wired_harnesses)} "
|
|
394
|
+
"so your agent USES Brigade, not just installs it."
|
|
395
|
+
)
|
|
396
|
+
print("Agent: each work session, follow the `brigade-work` skill -")
|
|
397
|
+
print(" 1. `brigade work brief --target .` (see pending work)")
|
|
398
|
+
print(' 2. `brigade work verify run --target . --command "<test>"` (verify THROUGH brigade, not raw)')
|
|
399
|
+
print(" 3. `brigade outcome capture <skill-or-card-id> --run-id latest` (record the result)")
|
|
400
|
+
print(" 4. write a Memory Handoff at the end.")
|
|
401
|
+
print(' If `brigade outcome rank` ever says "ranking: none", work is not flowing through Brigade.')
|
|
367
402
|
if "hermes" in selection.harnesses:
|
|
368
403
|
print(
|
|
369
404
|
"brigade: the hermes adapter is validated against a real Hermes install "
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
{"src": "memory/memory-care.example.json", "dst": ".brigade/memory-care.example.json"},
|
|
24
24
|
{"src": "memory/chat-memory-sweep.example.json", "dst": ".brigade/chat-memory-sweep.example.json"},
|
|
25
25
|
{"src": "skills/note/SKILL.md", "dst": "skills/note/SKILL.md"},
|
|
26
|
+
{"src": "skills/brigade-work/SKILL.md", "dst": "skills/brigade-work/SKILL.md"},
|
|
26
27
|
{"src": "scripts/backup-restic.sh", "dst": "scripts/backup-restic.sh", "mode": "0755"}
|
|
27
28
|
],
|
|
28
29
|
"dirs": [
|
{brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/memory-handoff.harness.json
RENAMED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"Describes the handoff inbox + routing targets that Hermes should treat",
|
|
6
6
|
"as the canonical memory contract."
|
|
7
7
|
],
|
|
8
|
-
"_brigade_version": "0.
|
|
8
|
+
"_brigade_version": "0.14.0",
|
|
9
9
|
"_brigade_status": "validated",
|
|
10
10
|
"memory_handoff": {
|
|
11
11
|
"inbox_dir": ".hermes/memory-handoffs",
|
{brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/hermes/model-lanes.harness.json
RENAMED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"Suggested model lane names. Same shape as the OpenClaw alias map so",
|
|
6
6
|
"knowledge cards and runbooks can talk about lanes without naming providers."
|
|
7
7
|
],
|
|
8
|
-
"_brigade_version": "0.
|
|
8
|
+
"_brigade_version": "0.14.0",
|
|
9
9
|
"_brigade_status": "validated",
|
|
10
10
|
"model_lanes": {
|
|
11
11
|
"main": "<provider/main-model-id>",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_brigade_version": "0.
|
|
2
|
+
"_brigade_version": "0.14.0",
|
|
3
3
|
"_description": "Example output contract for a nightly chat/session memory sweep. Keep raw chat transcripts in crawler archives; this file contains summaries and local source locators only.",
|
|
4
4
|
"generated_at": "2026-05-26T22:09:00-04:00",
|
|
5
5
|
"window": {
|
{brigade_cli-0.13.0 → brigade_cli-0.14.0}/src/brigade/templates/memory/memory-care.example.json
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_brigade_version": "0.
|
|
2
|
+
"_brigade_version": "0.14.0",
|
|
3
3
|
"_description": "Example config for a local memory-care scanner. Brigade does not run this scanner for you; it validates the output with `brigade doctor`.",
|
|
4
4
|
"cards_glob": "memory/cards/*.md",
|
|
5
5
|
"decay_dir": ".brigade/memory-care/decay",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"It blocks secrets and attribution trailers, while warning on personal or infrastructure-like context.",
|
|
5
5
|
"Use via: brigade handoff lint --content-guard --guard-policy personal"
|
|
6
6
|
],
|
|
7
|
-
"_brigade_version": "0.
|
|
7
|
+
"_brigade_version": "0.14.0",
|
|
8
8
|
"categories": {
|
|
9
9
|
"secret": "block",
|
|
10
10
|
"private-network": "warn",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"Used by brigade pre-push hook and `brigade scrub`.",
|
|
5
5
|
"Override by pointing CONTENT_GUARD_POLICY at your own copy of this file."
|
|
6
6
|
],
|
|
7
|
-
"_brigade_version": "0.
|
|
7
|
+
"_brigade_version": "0.14.0",
|
|
8
8
|
"categories": {
|
|
9
9
|
"secret": "block",
|
|
10
10
|
"private-network": "block",
|