brigade-cli 0.8.0__tar.gz → 0.8.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- brigade_cli-0.8.1/PKG-INFO +745 -0
- brigade_cli-0.8.1/README.md +716 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/pyproject.toml +9 -4
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/__init__.py +1 -1
- brigade_cli-0.8.1/src/brigade/budgets_cmd.py +84 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/center_cmd.py +41 -7
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/cli.py +1026 -4
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/daily_cmd.py +352 -26
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/doctor.py +48 -22
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/handoff_cmd.py +505 -2
- brigade_cli-0.8.1/src/brigade/hermes_adapter.py +97 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/ingest.py +40 -7
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/install.py +17 -8
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/learn_cmd.py +423 -4
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/managed.py +94 -2
- brigade_cli-0.8.1/src/brigade/notifications_cmd.py +510 -0
- brigade_cli-0.8.1/src/brigade/operator_cmd.py +2992 -0
- brigade_cli-0.8.1/src/brigade/pantry_cmd.py +274 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/phases_cmd.py +12 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/prompt.py +2 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/registry.py +15 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/release_cmd.py +11 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/repos_cmd.py +134 -2
- brigade_cli-0.8.1/src/brigade/research/__init__.py +1 -0
- brigade_cli-0.8.1/src/brigade/research/config.py +31 -0
- brigade_cli-0.8.1/src/brigade/research/engine.py +198 -0
- brigade_cli-0.8.1/src/brigade/research/extract.py +57 -0
- brigade_cli-0.8.1/src/brigade/research/handoff.py +58 -0
- brigade_cli-0.8.1/src/brigade/research/llm.py +50 -0
- brigade_cli-0.8.1/src/brigade/research/registry.py +88 -0
- brigade_cli-0.8.1/src/brigade/research/report.py +72 -0
- brigade_cli-0.8.1/src/brigade/research/sources/__init__.py +1 -0
- brigade_cli-0.8.1/src/brigade/research/sources/cli.py +102 -0
- brigade_cli-0.8.1/src/brigade/research/sources/local.py +85 -0
- brigade_cli-0.8.1/src/brigade/research/sources/web.py +79 -0
- brigade_cli-0.8.1/src/brigade/research/types.py +48 -0
- brigade_cli-0.8.1/src/brigade/research_cmd.py +756 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/roadmap_cmd.py +145 -71
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/roster.py +34 -54
- brigade_cli-0.8.1/src/brigade/runbook_cmd.py +368 -0
- brigade_cli-0.8.1/src/brigade/scrub.py +290 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/security_cmd.py +455 -27
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/selection.py +9 -1
- brigade_cli-0.8.1/src/brigade/skills_cmd.py +1778 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/depth/repo.json +2 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/handoff/handoff-sources.example.json +3 -1
- brigade_cli-0.8.1/src/brigade/templates/handoff/openclaw-ingest-receipt.example.json +32 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/harnesses/hermes.json +7 -4
- brigade_cli-0.8.1/src/brigade/templates/harnesses/opencode.json +11 -0
- brigade_cli-0.8.1/src/brigade/templates/hermes/README.md +47 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/hermes/memory-handoff.harness.json +2 -2
- brigade_cli-0.8.1/src/brigade/templates/hermes/memory-handoffs/TEMPLATE.md +64 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/hermes/workspace.harness.json +1 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/includes/publisher.json +1 -0
- brigade_cli-0.8.1/src/brigade/templates/opencode/memory-handoffs/TEMPLATE.md +64 -0
- brigade_cli-0.8.1/src/brigade/templates/policies/personal.json +28 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/AGENTS.md +27 -2
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/SAFETY_RULES.md +1 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/tools_cmd.py +626 -16
- brigade_cli-0.8.1/src/brigade/untrusted.py +102 -0
- brigade_cli-0.8.1/src/brigade/untrusted_cmd.py +78 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/work_cmd.py +897 -12
- brigade_cli-0.8.1/src/brigade_cli.egg-info/PKG-INFO +745 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade_cli.egg-info/SOURCES.txt +46 -0
- brigade_cli-0.8.1/src/brigade_cli.egg-info/requires.txt +6 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_budgets.py +20 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_doctor.py +43 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_fragments.py +9 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_gitignore.py +30 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_handoff_cmd.py +448 -1
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_ingest.py +111 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_init.py +3 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_install.py +36 -0
- brigade_cli-0.8.1/tests/test_managed.py +155 -0
- brigade_cli-0.8.1/tests/test_notifications_cmd.py +196 -0
- brigade_cli-0.8.1/tests/test_operator_cmd.py +1198 -0
- brigade_cli-0.8.1/tests/test_pantry_cmd.py +94 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase101_cmd.py +101 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase165_cmd.py +32 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase36_cmd.py +178 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase37_cmd.py +41 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase38_cmd.py +3 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_prompt.py +3 -2
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_registry.py +9 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_repos_cmd.py +39 -0
- brigade_cli-0.8.1/tests/test_research_cli_sources.py +20 -0
- brigade_cli-0.8.1/tests/test_research_cmd.py +311 -0
- brigade_cli-0.8.1/tests/test_research_config.py +23 -0
- brigade_cli-0.8.1/tests/test_research_engine.py +59 -0
- brigade_cli-0.8.1/tests/test_research_extract.py +33 -0
- brigade_cli-0.8.1/tests/test_research_handoff.py +21 -0
- brigade_cli-0.8.1/tests/test_research_llm.py +34 -0
- brigade_cli-0.8.1/tests/test_research_local_sources.py +23 -0
- brigade_cli-0.8.1/tests/test_research_registry.py +27 -0
- brigade_cli-0.8.1/tests/test_research_report.py +22 -0
- brigade_cli-0.8.1/tests/test_research_types.py +12 -0
- brigade_cli-0.8.1/tests/test_research_web.py +30 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_roadmap_cmd.py +37 -4
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_roster.py +56 -1
- brigade_cli-0.8.1/tests/test_runbook_cmd.py +115 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_scrub.py +52 -2
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_security_cmd.py +224 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_selection.py +15 -1
- brigade_cli-0.8.1/tests/test_skills_cmd.py +347 -0
- brigade_cli-0.8.1/tests/test_untrusted.py +103 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_work_cmd.py +1224 -4
- brigade_cli-0.8.0/PKG-INFO +0 -1235
- brigade_cli-0.8.0/README.md +0 -1212
- brigade_cli-0.8.0/src/brigade/scrub.py +0 -90
- brigade_cli-0.8.0/src/brigade/templates/hermes/README.md +0 -25
- brigade_cli-0.8.0/src/brigade_cli.egg-info/PKG-INFO +0 -1235
- brigade_cli-0.8.0/src/brigade_cli.egg-info/requires.txt +0 -3
- brigade_cli-0.8.0/tests/test_managed.py +0 -57
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/LICENSE +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/MANIFEST.in +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/QUICKSTART.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/setup.cfg +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/__main__.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/aboyeur.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/add.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/agents.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/budgets.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/chat_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/config.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/context_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/dogfood_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/fragments.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/handoff.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/memory_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/proc.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/projects_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/py.typed +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/reconfigure.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/roster_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/runs_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/station.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/status.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/claude/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/codex/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/depth/workspace.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/generic/harness-adapter-checklist.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/generic/memory-contract.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/harnesses/claude.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/harnesses/codex.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/harnesses/openclaw.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/hermes/model-lanes.harness.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/hooks/pre-push +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/backup-restic.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/chat-surface-crawlers.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/content-safety.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/handoff-flow.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/memory-architecture.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/memory-care-staleness.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/memory-scanner.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/multi-workspace-handoff-admin.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/obsidian-notes.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/pipeline-standups.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/cards/tokenjuice-output-compaction.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/chat-memory-sweep.example.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/memory/memory-care.example.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/openclaw/README.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/openclaw/acp-escalation.openclaw.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/openclaw/memory-sweep-cron.openclaw.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/openclaw/model-aliases.openclaw.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/openclaw/ollama-memory-search.openclaw.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/policies/public-content.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/policies/public-repo.json +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/scripts/backup-restic.sh +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/skills/note/SKILL.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/CLAUDE.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/HEARTBEAT.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/IDENTITY.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/INSTALL_FOR_AGENTS.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/MEMORY.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/SOUL.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/TOOLS.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/USER.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/rules/acceptance-driven-work.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates/workspace/rules/issue-tdd-loop.md +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/templates.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade/toml_compat.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade_cli.egg-info/dependency_links.txt +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade_cli.egg-info/entry_points.txt +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/src/brigade_cli.egg-info/top_level.txt +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_aboyeur.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_add.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_agents.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_cli_alias.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_config.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_dogfood_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_handoff.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_memory_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_neutrality.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase100_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase39_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase40_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase41_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase42_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase43_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase44_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase45_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase46_50_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase51_55_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase56_60_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase96_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase97_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase98_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_phase99_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_privacy_regression.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_proc.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_reconfigure.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_release_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_roster_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_run_cli.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_runs_cmd.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_station.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_status.py +0 -0
- {brigade_cli-0.8.0 → brigade_cli-0.8.1}/tests/test_toml_compat.py +0 -0
|
@@ -0,0 +1,745 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: brigade-cli
|
|
3
|
+
Version: 0.8.1
|
|
4
|
+
Summary: AI agent memory, handoffs, and local guardrails for Codex, Claude Code, OpenCode, Hermes, and OpenClaw.
|
|
5
|
+
Author-email: Solomon Neas <srneas@gmail.com>
|
|
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/solomonneas/solos-cookbook
|
|
10
|
+
Project-URL: OpenClaw, https://github.com/solomonneas/openclaw
|
|
11
|
+
Project-URL: ContentGuard, https://github.com/solomonneas/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
|
+
Provides-Extra: research
|
|
27
|
+
Requires-Dist: playwright>=1.40; extra == "research"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
<p align="center">
|
|
31
|
+
<img src="docs/assets/brigade-social-preview.jpg" alt="Brigade" width="900">
|
|
32
|
+
</p>
|
|
33
|
+
|
|
34
|
+
<h1 align="center">Brigade CLI</h1>
|
|
35
|
+
|
|
36
|
+
<p align="center">
|
|
37
|
+
<strong>AI agent memory, handoffs, and local guardrails for Codex, Claude Code, OpenCode, Hermes, and OpenClaw.</strong>
|
|
38
|
+
</p>
|
|
39
|
+
|
|
40
|
+
<p align="center">
|
|
41
|
+
<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">
|
|
42
|
+
<img src="https://img.shields.io/pypi/v/brigade-cli?style=for-the-badge&label=pypi" alt="PyPI version">
|
|
43
|
+
<img src="https://img.shields.io/badge/python-3.10%2B-blue?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.10+">
|
|
44
|
+
<img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="MIT license">
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
Brigade is a local-first operator CLI for AI agent workspaces. Local-first means local data on the operator-controlled machine first, before any external service; that machine can be a laptop, workstation, or VPS. The public GitHub repo is [`escoffier-labs/brigade`](https://github.com/escoffier-labs/brigade), the PyPI package is [`brigade-cli`](https://pypi.org/project/brigade-cli/), and the command is `brigade`.
|
|
48
|
+
|
|
49
|
+
Brigade helps AI agent tools work from the same memory without turning that memory into a junk drawer.
|
|
50
|
+
|
|
51
|
+
## Mise En Place
|
|
52
|
+
|
|
53
|
+
Mise en place, pronounced "Meez", means everything is in its place before the work starts.
|
|
54
|
+
|
|
55
|
+
In a kitchen, that is the chef's first job: prep the station, label the ingredients, sharpen the tools, and make sure service does not depend on hunting for basics mid-rush. For agents, it is the same job: rules, memory, handoff inboxes, tools, guards, receipts, and verification paths set up before the session gets expensive.
|
|
56
|
+
|
|
57
|
+
This is the most important part of Brigade. The chef owns the station, and every agent working in it should leave the setup clearer, safer, and easier for the next agent to use.
|
|
58
|
+
|
|
59
|
+
## Current Status
|
|
60
|
+
|
|
61
|
+
Brigade is usable now for real first-run workflows. The tested path is installing the CLI, running `operator quickstart` in a repo or operator workspace, checking `operator doctor --profile local-operator`, writing memory handoffs, projecting portable skills and tools, and using the local security scanner.
|
|
62
|
+
|
|
63
|
+
Quickstart keeps the first run scoped to the harnesses you select: a `--harnesses codex` setup watches the Codex handoff inbox, writes a local bootstrap handoff-ingest log, and leaves unwired side harnesses quiet until you add them.
|
|
64
|
+
|
|
65
|
+
It is still early-stage and being actively fleshed out. The current focus is hardening the first-run path, roadmap and command drift checks, daily operator loop, and local evidence closeouts. Expect sharp edges around advanced workflows, new harness adapters, repo-fleet evidence, and release-candidate evidence. If you hit a broken workflow, confusing command, missing adapter, or setup issue, open a GitHub issue in [`escoffier-labs/brigade`](https://github.com/escoffier-labs/brigade/issues) and I will get it addressed as soon as I can.
|
|
66
|
+
|
|
67
|
+
Want an agent to set this up for you? Point it at this repository. The root [`AGENTS.md`](AGENTS.md) tells agents how to install Brigade, verify with doctor, adapt your existing homegrown workflow instead of replacing it, keep local generated folders out of commits, and stop before any remote or destructive action. The fuller walkthrough is in [`docs/agent-assisted-setup.md`](docs/agent-assisted-setup.md).
|
|
68
|
+
|
|
69
|
+
Good first install:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
pipx install brigade-cli
|
|
73
|
+
brigade operator quickstart --target ./my-repo --harnesses codex
|
|
74
|
+
brigade operator doctor --target ./my-repo --profile local-operator
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
For an OpenClaw or Hermes workspace instead of a code repo:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
mkdir -p ~/agent-workspace
|
|
81
|
+
brigade operator quickstart --target ~/agent-workspace --depth workspace --harnesses openclaw,hermes --owner openclaw
|
|
82
|
+
brigade operator doctor --target ~/agent-workspace --profile local-operator
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
For multiple agent surfaces:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
brigade operator quickstart --target ./my-repo --harnesses codex,claude,opencode
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
If you use [OpenClaw](https://github.com/solomonneas/openclaw), [Hermes](https://github.com/NousResearch/hermes-agent), [Codex](https://github.com/openai/codex), Claude Code, [OpenCode](https://github.com/opencode-ai/opencode), or a mix of them, Brigade gives those tools a shared local pattern:
|
|
92
|
+
|
|
93
|
+
1. agents write handoff notes
|
|
94
|
+
2. the memory ingester scans, lints, and routes them
|
|
95
|
+
3. safe targeted notes become durable memory
|
|
96
|
+
4. ambiguous or risky notes wait for review
|
|
97
|
+
5. future sessions start with better context
|
|
98
|
+
|
|
99
|
+
It is intentionally local. Brigade writes files and review queues on the operator-controlled machine. It does not run a background service, publish releases, push to GitHub, send notifications, or rewrite permanent memory unless you explicitly run the command that does it.
|
|
100
|
+
|
|
101
|
+
## Stack At A Glance
|
|
102
|
+
|
|
103
|
+
```mermaid
|
|
104
|
+
flowchart TB
|
|
105
|
+
OWNER["<b>OpenClaw / Hermes</b><br/><i>canonical memory owner</i>"]
|
|
106
|
+
MEMORY["<b>Durable memory</b><br/>MEMORY.md · cards · project context"]
|
|
107
|
+
BRIGADE["<b>Brigade CLI</b><br/><i>local wiring · receipts · review queues</i>"]
|
|
108
|
+
STATE["<b>.brigade/</b><br/>local config · scans · reports · closeouts"]
|
|
109
|
+
|
|
110
|
+
OWNER -->|maintains| MEMORY
|
|
111
|
+
BRIGADE -->|records| STATE
|
|
112
|
+
BRIGADE -->|prepares reviewed handoffs for| OWNER
|
|
113
|
+
|
|
114
|
+
subgraph WRITERS [" writer harnesses "]
|
|
115
|
+
CODEX["<b>Codex CLI</b><br/>handoff writer"]
|
|
116
|
+
CLAUDE["<b>Claude Code</b><br/>handoff writer"]
|
|
117
|
+
OPEN["<b>OpenCode</b><br/>handoff writer"]
|
|
118
|
+
HERMES["<b>Hermes</b><br/>writer or owner"]
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
CODEX & CLAUDE & OPEN & HERMES == handoff drafts ==> BRIGADE
|
|
122
|
+
MEMORY -. context .-> CODEX & CLAUDE & OPEN & HERMES
|
|
123
|
+
|
|
124
|
+
subgraph LOCAL [" local operator lanes "]
|
|
125
|
+
WORK["work sessions<br/>tasks · plans · verification"]
|
|
126
|
+
SCAN["scanners<br/>security · chat · repo health"]
|
|
127
|
+
RELEASE["release evidence<br/>candidates · smoke · waivers"]
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
BRIGADE --> WORK
|
|
131
|
+
BRIGADE --> SCAN
|
|
132
|
+
BRIGADE --> RELEASE
|
|
133
|
+
|
|
134
|
+
classDef owner fill:#ef4444,stroke:#b91c1c,color:#fff;
|
|
135
|
+
classDef brigade fill:#2563eb,stroke:#1d4ed8,color:#fff;
|
|
136
|
+
classDef state fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
137
|
+
classDef lane fill:#f1f5f9,stroke:#94a3b8,color:#334155;
|
|
138
|
+
class OWNER owner;
|
|
139
|
+
class BRIGADE brigade;
|
|
140
|
+
class MEMORY,STATE state;
|
|
141
|
+
class WORK,SCAN,RELEASE,CODEX,CLAUDE,OPEN,HERMES lane;
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
> Brigade was extracted from the [**solos-cookbook**](https://github.com/solomonneas/solos-cookbook), a documented 24/7 multi-agent stack running in production. If you want the full picture of how Brigade fits into a real setup, start there, and a star helps other people find it.
|
|
145
|
+
>
|
|
146
|
+
> [](https://github.com/solomonneas/solos-cookbook)
|
|
147
|
+
|
|
148
|
+
## Project Identity
|
|
149
|
+
|
|
150
|
+
- GitHub: [`escoffier-labs/brigade`](https://github.com/escoffier-labs/brigade)
|
|
151
|
+
- Website: [`brigade.tools`](https://brigade.tools)
|
|
152
|
+
- Cookbook: [`solomonneas/solos-cookbook`](https://github.com/solomonneas/solos-cookbook), the real-world multi-agent stack Brigade grew out of
|
|
153
|
+
- PyPI package: [`brigade-cli`](https://pypi.org/project/brigade-cli/)
|
|
154
|
+
- CLI command: `brigade`
|
|
155
|
+
- Core search terms: AI agent memory, agent handoffs, Codex memory, Claude Code memory, OpenCode handoffs, local-first agent workflow, AGENTS.md, agent guardrails
|
|
156
|
+
|
|
157
|
+
## Why This Exists
|
|
158
|
+
|
|
159
|
+
Agent tools are getting good enough that people use more than one of them. That creates a boring but important problem: each tool learns a little bit, but the learning is scattered.
|
|
160
|
+
|
|
161
|
+
Brigade gives the setup a home base.
|
|
162
|
+
|
|
163
|
+
- OpenClaw or Hermes can be the main memory owner.
|
|
164
|
+
- Codex, Claude Code, OpenCode, and Hermes can write handoff notes.
|
|
165
|
+
- You can inspect and lint those notes before saving them.
|
|
166
|
+
- Local receipts show what happened during work, scans, and reviews.
|
|
167
|
+
- Risky actions stay manual.
|
|
168
|
+
|
|
169
|
+
The goal is not to make a giant automation machine. The goal is to make agent memory understandable, reviewable, and portable across harnesses.
|
|
170
|
+
|
|
171
|
+
## Start Small
|
|
172
|
+
|
|
173
|
+
Install:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
pipx install brigade-cli
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Set up a repo:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
brigade operator quickstart --target ./my-repo --harnesses codex
|
|
183
|
+
brigade operator doctor --target ./my-repo --profile local-operator
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Set up an agent workspace:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
brigade operator quickstart --target ~/agent-workspace --depth workspace --harnesses openclaw,hermes --owner openclaw
|
|
190
|
+
brigade operator doctor --target ~/agent-workspace --profile local-operator
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Use `--dry-run` first if you want to preview the local files Brigade will write. To wire more than one agent surface, pass a comma-separated list such as `--harnesses codex,claude,opencode`.
|
|
194
|
+
|
|
195
|
+
If you already have a homegrown setup with scripts, handoff folders, crons, or process managers, use the adoption loop before changing it:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
brigade operator adopt plan --target ~/agent-workspace --json
|
|
199
|
+
brigade operator adopt capture --target ~/agent-workspace --json
|
|
200
|
+
brigade operator adopt import-issues --target ~/agent-workspace --json
|
|
201
|
+
brigade operator migration status --target ~/agent-workspace --json
|
|
202
|
+
brigade operator migration doctor --target ~/agent-workspace --json
|
|
203
|
+
brigade operator migration consolidate --target ~/agent-workspace --surface shell_crontab --review-status needs-owner
|
|
204
|
+
brigade operator surfaces capture --target ~/agent-workspace --json
|
|
205
|
+
brigade operator surfaces doctor --target ~/agent-workspace --json
|
|
206
|
+
brigade operator surfaces review --target ~/agent-workspace --surface shell_crontab --status external-ok --all --reason reviewed-external-ownership
|
|
207
|
+
brigade operator surfaces reviews --target ~/agent-workspace --json
|
|
208
|
+
brigade operator surfaces import-issues --target ~/agent-workspace --json
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
`adopt plan` is read-only. `adopt capture` writes a redacted local snapshot under `.brigade/operator/adoption/`. `adopt import-issues` routes adoption gaps into the normal work inbox so the migration shows up in `work brief` and the daily loop. `operator migration status/doctor/import-issues/consolidate` rolls adoption state, surface review state, and pending migration work into one replacement-progress view, then lets a reviewed rollup supersede tiny record-level imports. `operator surfaces capture/list/doctor/review/reviews/import-issues` keeps a separate redacted registry for shell crontab, OpenClaw cron, and PM2 coverage under `.brigade/operator/surfaces/`. Scheduler and process surfaces are reported as counts, status totals, ordinal labels, review decisions, and fingerprints, not raw scheduler lines, job names, process names, command paths, host details, or environment values.
|
|
212
|
+
|
|
213
|
+
For a fuller first-run walkthrough and troubleshooting checklist, see [`docs/new-user-quickstart.md`](docs/new-user-quickstart.md). If quickstart fails, use the Quickstart setup problem issue form and include the redacted `issue_report` from `brigade operator quickstart --json`.
|
|
214
|
+
|
|
215
|
+
Write a handoff note:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
brigade handoff draft \
|
|
219
|
+
--target ./my-repo \
|
|
220
|
+
--inbox codex \
|
|
221
|
+
--title "What changed" \
|
|
222
|
+
--summary "Short note future agents should know." \
|
|
223
|
+
--content "### What changed
|
|
224
|
+
|
|
225
|
+
Put the durable note here."
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Then run your memory owner's ingester. Safe targeted notes can be filed into long-term memory; ambiguous or risky notes stay visible for review.
|
|
229
|
+
|
|
230
|
+
That is the simplest useful version of Brigade: shared handoffs, local review, durable memory.
|
|
231
|
+
|
|
232
|
+
## How Memory Handoffs Work
|
|
233
|
+
|
|
234
|
+
Each writer harness gets its own local inbox:
|
|
235
|
+
|
|
236
|
+
- `.codex/memory-handoffs/`
|
|
237
|
+
- `.claude/memory-handoffs/`
|
|
238
|
+
- `.opencode/memory-handoffs/`
|
|
239
|
+
- `.hermes/memory-handoffs/`
|
|
240
|
+
|
|
241
|
+
The memory owner, usually OpenClaw or Hermes, can ingest handoffs into the permanent memory files. Brigade keeps the handoff format consistent so different tools can contribute without each one inventing its own note style.
|
|
242
|
+
|
|
243
|
+
```mermaid
|
|
244
|
+
flowchart LR
|
|
245
|
+
subgraph WRITERS [" writer inboxes "]
|
|
246
|
+
C[".codex/memory-handoffs/"]
|
|
247
|
+
CL[".claude/memory-handoffs/"]
|
|
248
|
+
O[".opencode/memory-handoffs/"]
|
|
249
|
+
H[".hermes/memory-handoffs/"]
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
DRAFT["Brigade handoff draft<br/>lint · guard · route"]
|
|
253
|
+
REVIEW["operator review<br/>safe · ambiguous · risky"]
|
|
254
|
+
OWNER["OpenClaw / Hermes<br/>memory owner"]
|
|
255
|
+
MEM["durable memory<br/>cards · docs · learnings"]
|
|
256
|
+
|
|
257
|
+
C & CL & O & H --> DRAFT --> REVIEW
|
|
258
|
+
REVIEW -->|safe targeted note| OWNER --> MEM
|
|
259
|
+
REVIEW -->|needs judgment| INBOX["review inbox"]
|
|
260
|
+
|
|
261
|
+
classDef local fill:#eff6ff,stroke:#2563eb,color:#1e3a8a;
|
|
262
|
+
classDef review fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
263
|
+
classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
|
|
264
|
+
class C,CL,O,H,DRAFT local;
|
|
265
|
+
class REVIEW,INBOX review;
|
|
266
|
+
class OWNER,MEM memory;
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
The important part is the boundary. The ingester should be conservative: safe card handoffs can become cards, targeted updates can append to the right file, and ambiguous material should be kicked back for review instead of trusted automatically.
|
|
270
|
+
|
|
271
|
+
### Card Promotion And MEMORY.md
|
|
272
|
+
|
|
273
|
+
Long-term memory has two layers. Knowledge cards under `memory/cards/` hold the detail: YAML frontmatter (`topic`, `category`, `tags`, `created`, `updated`) plus the durable facts. `MEMORY.md` is the index: one line per card, loaded at session start, never holding card content itself. When the ingester promotes a handoff, it creates or updates the card first, then adds or refreshes the one-line index entry. No-card handoffs append to the right document instead. Brigade records the receipt for every outcome but never edits `MEMORY.md` or cards itself; the memory owner does the writing.
|
|
274
|
+
|
|
275
|
+
```mermaid
|
|
276
|
+
flowchart LR
|
|
277
|
+
HANDOFF["reviewed handoff<br/>create-card · update-card · no-card"]
|
|
278
|
+
INGEST["memory ingester<br/>lint · guard · route"]
|
|
279
|
+
CARD["memory/cards/<name>.md<br/>frontmatter + durable facts"]
|
|
280
|
+
INDEX["MEMORY.md<br/>one-line index entry per card"]
|
|
281
|
+
DOCS["TOOLS.md · USER.md<br/>rules/ · .learnings/"]
|
|
282
|
+
RECEIPT["ingest receipt<br/>promoted · routed · skipped · failed"]
|
|
283
|
+
|
|
284
|
+
HANDOFF --> INGEST
|
|
285
|
+
INGEST -->|create-card / update-card| CARD --> INDEX
|
|
286
|
+
INGEST -->|no-card| DOCS
|
|
287
|
+
INGEST --> RECEIPT
|
|
288
|
+
|
|
289
|
+
classDef local fill:#eff6ff,stroke:#2563eb,color:#1e3a8a;
|
|
290
|
+
classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
|
|
291
|
+
classDef step fill:#f1f5f9,stroke:#64748b,color:#334155;
|
|
292
|
+
class HANDOFF,INGEST,RECEIPT local;
|
|
293
|
+
class CARD,INDEX,DOCS memory;
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Keeping Cards Fresh
|
|
297
|
+
|
|
298
|
+
Memory degrades. Cards go stale, lose their backing evidence, or get superseded. `brigade memory care scan` is a read-only sweep over the card roots that checks freshness metadata (`reviewed`, `fresh_until`, confidence, evidence) and flags stale, expired, undersourced, contradictory, orphaned, and oversized cards. Flagged cards land in a refresh queue that routes into the work inbox, so a card that needs review shows up in the daily plan instead of rotting quietly. Brigade never edits or deletes a card automatically: the operator either refreshes it with a new reviewed date or archives it and drops the index entry.
|
|
299
|
+
|
|
300
|
+
```mermaid
|
|
301
|
+
flowchart LR
|
|
302
|
+
CARDS["memory cards<br/>reviewed · fresh_until<br/>confidence · evidence"]
|
|
303
|
+
SCAN["memory care scan<br/>read-only"]
|
|
304
|
+
ISSUES["issues<br/>stale · expired · undersourced<br/>contradictory · orphaned · oversized"]
|
|
305
|
+
QUEUE["refresh queue"]
|
|
306
|
+
INBOX["work inbox<br/>daily plan candidates"]
|
|
307
|
+
OPERATOR["operator review"]
|
|
308
|
+
REFRESH["card refreshed<br/>reviewed date updated"]
|
|
309
|
+
ARCHIVE["card archived<br/>index entry removed"]
|
|
310
|
+
|
|
311
|
+
CARDS --> SCAN --> ISSUES --> QUEUE --> INBOX --> OPERATOR
|
|
312
|
+
OPERATOR -->|still true| REFRESH -. fresh again .-> CARDS
|
|
313
|
+
OPERATOR -->|no longer true| ARCHIVE
|
|
314
|
+
|
|
315
|
+
classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
|
|
316
|
+
classDef step fill:#f1f5f9,stroke:#64748b,color:#334155;
|
|
317
|
+
classDef gate fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
318
|
+
class CARDS,REFRESH memory;
|
|
319
|
+
class SCAN,ISSUES,QUEUE,INBOX step;
|
|
320
|
+
class OPERATOR,ARCHIVE gate;
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## The Local Loop
|
|
324
|
+
|
|
325
|
+
Brigade is built around a simple daily loop:
|
|
326
|
+
|
|
327
|
+
1. set up the repo or operator workspace
|
|
328
|
+
2. let agents work
|
|
329
|
+
3. run the memory ingester
|
|
330
|
+
4. review anything skipped, flagged, or ambiguous
|
|
331
|
+
5. save only the parts worth remembering
|
|
332
|
+
|
|
333
|
+
```mermaid
|
|
334
|
+
flowchart LR
|
|
335
|
+
SETUP["quickstart<br/>local files"]
|
|
336
|
+
WORK["agents work<br/>sessions & tasks"]
|
|
337
|
+
HANDOFF["handoffs<br/>draft & lint"]
|
|
338
|
+
REVIEW["operator review<br/>promote or defer"]
|
|
339
|
+
MEMORY["durable memory<br/>only what is worth keeping"]
|
|
340
|
+
RECEIPTS["receipts<br/>what happened"]
|
|
341
|
+
|
|
342
|
+
SETUP --> WORK --> HANDOFF --> REVIEW --> MEMORY
|
|
343
|
+
WORK --> RECEIPTS
|
|
344
|
+
REVIEW --> RECEIPTS
|
|
345
|
+
RECEIPTS -. better context .-> WORK
|
|
346
|
+
|
|
347
|
+
classDef step fill:#f1f5f9,stroke:#64748b,color:#334155;
|
|
348
|
+
classDef gate fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
349
|
+
classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
|
|
350
|
+
class SETUP,WORK,HANDOFF,RECEIPTS step;
|
|
351
|
+
class REVIEW gate;
|
|
352
|
+
class MEMORY memory;
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
This loop scales from one person using one repo or OpenClaw/Hermes workspace to a more serious operator setup with scanner inboxes, work receipts, release checks, and repo-fleet summaries. You do not need all of that on day one.
|
|
356
|
+
|
|
357
|
+
## What Brigade Can Handle
|
|
358
|
+
|
|
359
|
+
For memory:
|
|
360
|
+
|
|
361
|
+
- install shared memory files, rules, and handoff templates
|
|
362
|
+
- keep one canonical memory owner
|
|
363
|
+
- lint handoff drafts before ingest
|
|
364
|
+
- scan handoff drafts with Content Guard before they become durable memory
|
|
365
|
+
- track which local inboxes the ingestor should watch
|
|
366
|
+
- reconcile ingester receipts so skipped, failed, routed, and promoted notes stay visible
|
|
367
|
+
- support OpenClaw, Hermes, Codex, Claude Code, and OpenCode conventions
|
|
368
|
+
|
|
369
|
+
For local work:
|
|
370
|
+
|
|
371
|
+
- record work sessions and verification receipts
|
|
372
|
+
- collect scanner findings into reviewable inboxes
|
|
373
|
+
- keep release-readiness evidence local and explicit
|
|
374
|
+
- project shared tool docs into harness-specific folders
|
|
375
|
+
- summarize repo/operator state before a work session
|
|
376
|
+
|
|
377
|
+
For safety:
|
|
378
|
+
|
|
379
|
+
- run Content Guard before push, release review, or handoff ingest
|
|
380
|
+
- import Content Guard findings into the work inbox for review
|
|
381
|
+
- keep generated state ignored by default
|
|
382
|
+
- avoid publishing, pushing, or mutating remotes automatically
|
|
383
|
+
- keep notification sending opt-in
|
|
384
|
+
- make risky actions visible as operator decisions
|
|
385
|
+
|
|
386
|
+
## Ecosystem
|
|
387
|
+
|
|
388
|
+
Brigade is the local operator layer. It integrates with nearby tools instead of trying to absorb all of them.
|
|
389
|
+
|
|
390
|
+
```mermaid
|
|
391
|
+
flowchart TB
|
|
392
|
+
BRIGADE["Brigade<br/>local operator layer"]
|
|
393
|
+
|
|
394
|
+
subgraph MEMORY [" memory and handoffs "]
|
|
395
|
+
OPENCLAW["OpenClaw"]
|
|
396
|
+
HERMES["Hermes"]
|
|
397
|
+
MDOCTOR["memory-doctor"]
|
|
398
|
+
BDOCTOR["bootstrap-doctor"]
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
subgraph SAFETY [" safety and operations "]
|
|
402
|
+
GUARD["Content Guard"]
|
|
403
|
+
PANTRY["Agent Pantry"]
|
|
404
|
+
NOTIFY["agent-notify"]
|
|
405
|
+
TOKEN["tokenjuice"]
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
subgraph NATIVE [" native Brigade stations "]
|
|
409
|
+
REPOS["repo fleet"]
|
|
410
|
+
TOOLS["tool catalog"]
|
|
411
|
+
SECURITY["security scan"]
|
|
412
|
+
HANDOFFS["handoff promotion"]
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
BRIGADE --> MEMORY
|
|
416
|
+
BRIGADE --> SAFETY
|
|
417
|
+
BRIGADE --> NATIVE
|
|
418
|
+
|
|
419
|
+
classDef core fill:#2563eb,stroke:#1d4ed8,color:#fff;
|
|
420
|
+
classDef group fill:#f8fafc,stroke:#94a3b8,color:#334155;
|
|
421
|
+
class BRIGADE core;
|
|
422
|
+
class OPENCLAW,HERMES,MDOCTOR,BDOCTOR,GUARD,PANTRY,NOTIFY,TOKEN,REPOS,TOOLS,SECURITY,HANDOFFS group;
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
Memory and handoff tools:
|
|
426
|
+
|
|
427
|
+
- [OpenClaw](https://github.com/solomonneas/openclaw): personal AI assistant and memory owner.
|
|
428
|
+
- Hermes: local memory owner and handoff writer convention.
|
|
429
|
+
- [memory-doctor](https://github.com/escoffier-labs/memory-doctor): focused maintenance CLI for Claude Code / OpenClaw memory.
|
|
430
|
+
- [bootstrap-doctor](https://github.com/escoffier-labs/bootstrap-doctor): audits and trims oversized OpenClaw bootstrap files.
|
|
431
|
+
|
|
432
|
+
Safety and operations tools:
|
|
433
|
+
|
|
434
|
+
- [Content Guard](https://github.com/solomonneas/content-guard): policy-driven content scanning and publish checks.
|
|
435
|
+
- [Agent Pantry](https://github.com/escoffier-labs/agentpantry): encrypted browser session, cookie, and secret sync for agent machines.
|
|
436
|
+
- [agent-notify](https://github.com/solomonneas/agent-notify): optional notification hooks for long-running agent work.
|
|
437
|
+
- [tokenjuice](https://github.com/solomonneas/tokenjuice): output compaction for terminal-heavy agent workflows.
|
|
438
|
+
|
|
439
|
+
Brigade also has native local workflows for [repo fleet operations](docs/repo-fleet.md), [portable tool catalogs](docs/tool-catalog.md), [security scans](docs/security.md), and [handoff promotion](docs/handoff-promotion.md). The highlights are below.
|
|
440
|
+
|
|
441
|
+
## Repo Fleet
|
|
442
|
+
|
|
443
|
+
`brigade repos` watches a configured set of local repositories and turns their state into reviewable evidence: health scans, sweeps, reports, fleet actions, and release trains.
|
|
444
|
+
|
|
445
|
+
```mermaid
|
|
446
|
+
flowchart LR
|
|
447
|
+
CONFIG[".brigade/repos.toml<br/>configured local repos"]
|
|
448
|
+
SCAN["repos scan / sweep<br/>safe metadata only"]
|
|
449
|
+
REPORT["fleet report<br/>health evidence"]
|
|
450
|
+
ACTIONS["reviewed actions<br/>start · done · defer"]
|
|
451
|
+
RELEASE["release train<br/>manual checklist"]
|
|
452
|
+
|
|
453
|
+
CONFIG --> SCAN --> REPORT --> ACTIONS --> RELEASE
|
|
454
|
+
RELEASE -. no publish step .-> MANUAL["operator publishes manually"]
|
|
455
|
+
|
|
456
|
+
classDef local fill:#eff6ff,stroke:#2563eb,color:#1e3a8a;
|
|
457
|
+
classDef review fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
458
|
+
class CONFIG,SCAN,REPORT local;
|
|
459
|
+
class ACTIONS,RELEASE,MANUAL review;
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
- Repos live in a gitignored `.brigade/repos.toml`. Nothing is cloned, pushed, or mutated remotely.
|
|
463
|
+
- `brigade repos scan` and `brigade repos sweep` collect local health evidence.
|
|
464
|
+
- Reports become fleet actions you start, finish, defer, or dispatch by hand.
|
|
465
|
+
- Release trains gather readiness evidence and checklists without publishing anything.
|
|
466
|
+
|
|
467
|
+
Full command list in [Repo fleet](docs/repo-fleet.md).
|
|
468
|
+
|
|
469
|
+
## Tool Catalog
|
|
470
|
+
|
|
471
|
+
`brigade tools` describes local callable tools, slash commands, skills, scripts, and MCP configs across harnesses, then gates execution behind an approval queue. `brigade tools defaults` refreshes built-in portable tool entries while preserving custom repo tools.
|
|
472
|
+
|
|
473
|
+
```mermaid
|
|
474
|
+
flowchart LR
|
|
475
|
+
SOURCE["tools/<br/>tracked portable sources"]
|
|
476
|
+
CATALOG[".brigade/tools.toml<br/>catalog"]
|
|
477
|
+
PROJECT["sync-tools<br/>harness projections"]
|
|
478
|
+
APPROVAL["call plan / queue<br/>operator approval"]
|
|
479
|
+
RUN["run receipt<br/>logs · replay · checkpoints"]
|
|
480
|
+
|
|
481
|
+
SOURCE --> CATALOG --> PROJECT
|
|
482
|
+
CATALOG --> APPROVAL --> RUN
|
|
483
|
+
PROJECT -. local generated .-> HARNESSES[".codex · .claude<br/>.opencode · .mcp"]
|
|
484
|
+
|
|
485
|
+
classDef source fill:#ecfdf5,stroke:#059669,color:#064e3b;
|
|
486
|
+
classDef local fill:#eff6ff,stroke:#2563eb,color:#1e3a8a;
|
|
487
|
+
classDef gate fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
488
|
+
class SOURCE source;
|
|
489
|
+
class CATALOG,PROJECT,HARNESSES local;
|
|
490
|
+
class APPROVAL,RUN gate;
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
- Discovery is read-only: `list`, `search`, `describe`, `contracts`.
|
|
494
|
+
- Projections write reviewed harness-specific tool docs. There is no auto-sync.
|
|
495
|
+
- Script calls move through plan, queue, approve, run, with run receipts and replay.
|
|
496
|
+
- Runtimes are supervised explicitly. Brigade never auto-starts MCP servers or stores auth.
|
|
497
|
+
|
|
498
|
+
Details in [Tool catalog](docs/tool-catalog.md).
|
|
499
|
+
|
|
500
|
+
## Handoff Promotion
|
|
501
|
+
|
|
502
|
+
Reviewed scanner imports can be promoted into memory handoff drafts instead of being retyped by hand.
|
|
503
|
+
|
|
504
|
+
```mermaid
|
|
505
|
+
flowchart LR
|
|
506
|
+
IMPORT["work import<br/>decision · finding · command · incident"]
|
|
507
|
+
PLAN["plan-handoff<br/>preview target & blockers"]
|
|
508
|
+
PROMOTE["promote-handoff<br/>write draft"]
|
|
509
|
+
LINT["handoff lint<br/>format · route · guard"]
|
|
510
|
+
DRAFT["memory-handoffs/<br/>reviewed draft"]
|
|
511
|
+
OWNER["memory owner ingest<br/>outside Brigade"]
|
|
512
|
+
|
|
513
|
+
IMPORT --> PLAN --> PROMOTE --> LINT --> DRAFT --> OWNER
|
|
514
|
+
LINT -->|blocked| REPAIR["repair import"]
|
|
515
|
+
|
|
516
|
+
classDef import fill:#eff6ff,stroke:#2563eb,color:#1e3a8a;
|
|
517
|
+
classDef gate fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
518
|
+
classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
|
|
519
|
+
class IMPORT,PLAN,PROMOTE import;
|
|
520
|
+
class LINT,REPAIR gate;
|
|
521
|
+
class DRAFT,OWNER memory;
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
- Works for durable non-task imports: decisions, preferences, links, commands, findings, incidents.
|
|
525
|
+
- `brigade work import plan-handoff` previews the target and blockers, `promote-handoff` writes the draft and lints it.
|
|
526
|
+
- Drafts land in the normal handoff inbox. Canonical memory is never edited directly.
|
|
527
|
+
- Raw private chat fields are rejected and secret-looking values are redacted before the draft is written.
|
|
528
|
+
|
|
529
|
+
See [Handoff promotion](docs/handoff-promotion.md).
|
|
530
|
+
|
|
531
|
+
## Deep Research
|
|
532
|
+
|
|
533
|
+
`brigade research` turns a research question into a local report and a reviewed Memory Handoff. Trusted local files and configured CLI lanes are used first; browser or web sources are opt-in with `--web` and labeled as untrusted source material.
|
|
534
|
+
|
|
535
|
+
```mermaid
|
|
536
|
+
flowchart LR
|
|
537
|
+
QUESTION["research question"]
|
|
538
|
+
RUN["research run<br/>local-first · resumable"]
|
|
539
|
+
REPORT["report.html<br/>report.md"]
|
|
540
|
+
EXPORT["export-handoff<br/>explicit writer inbox"]
|
|
541
|
+
DRAFT["memory-handoffs/<br/>linted draft"]
|
|
542
|
+
MEMORY["memory owner ingest<br/>cards or learnings"]
|
|
543
|
+
|
|
544
|
+
QUESTION --> RUN --> REPORT
|
|
545
|
+
RUN --> EXPORT --> DRAFT --> MEMORY
|
|
546
|
+
EXPORT -. drift visible .-> REVIEW["work brief<br/>center reviews<br/>release evidence"]
|
|
547
|
+
|
|
548
|
+
classDef local fill:#eff6ff,stroke:#2563eb,color:#1e3a8a;
|
|
549
|
+
classDef review fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
550
|
+
classDef memory fill:#ecfdf5,stroke:#059669,color:#064e3b;
|
|
551
|
+
class QUESTION,RUN,REPORT local;
|
|
552
|
+
class EXPORT,REVIEW review;
|
|
553
|
+
class DRAFT,MEMORY memory;
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
```bash
|
|
557
|
+
brigade research run "what should we remember about this topic?" --corpus docs
|
|
558
|
+
brigade research export-handoff <run-id> --inbox codex
|
|
559
|
+
brigade research handoffs doctor
|
|
560
|
+
brigade research handoffs import-issues
|
|
561
|
+
brigade research show <run-id>
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
Exports are explicit and receipt-backed. Brigade records the source fingerprint for the handoff artifact, then warns when a completed research run has no export, a missing export path, or a stale export after the run artifact changes. The doctor is read-only; import routing creates reviewable work inbox items instead of exporting or ingesting memory automatically.
|
|
565
|
+
|
|
566
|
+
## Agent Pantry
|
|
567
|
+
|
|
568
|
+
The `pantry` station (alias `larder`) wires [Agent Pantry](https://github.com/escoffier-labs/agentpantry) into the same operator workflow: encrypted browser session, cookie, and secret sync between agent machines. The pantry is where the chef stores the cookies and the secret recipes.
|
|
569
|
+
|
|
570
|
+
- `brigade add pantry` installs agentpantry.
|
|
571
|
+
- `brigade pantry status` gives a pantry-specific health readout.
|
|
572
|
+
- `brigade pantry setup plan --role source|sink` previews or writes a reviewed setup plan.
|
|
573
|
+
- Pantry checks are advisory. An unwired install warns but never fails a workspace run.
|
|
574
|
+
|
|
575
|
+
## What Brigade Is Not
|
|
576
|
+
|
|
577
|
+
Brigade is not a hosted memory service, a daemon, or an automatic release bot.
|
|
578
|
+
|
|
579
|
+
It does not:
|
|
580
|
+
|
|
581
|
+
- run in the background
|
|
582
|
+
- install schedulers
|
|
583
|
+
- push to GitHub
|
|
584
|
+
- publish packages
|
|
585
|
+
- send notifications by default
|
|
586
|
+
- save every note automatically
|
|
587
|
+
- turn memory ingest into a silent background process
|
|
588
|
+
- skip review for ambiguous, risky, or failed notes
|
|
589
|
+
|
|
590
|
+
That pause is the point. Agent memory should be useful, not noisy.
|
|
591
|
+
|
|
592
|
+
## For OpenClaw Users
|
|
593
|
+
|
|
594
|
+
OpenClaw can be the memory owner. Brigade gives nearby tools a way to contribute checked handoffs back into that owner memory without forcing every tool to know OpenClaw internals.
|
|
595
|
+
|
|
596
|
+
```mermaid
|
|
597
|
+
flowchart LR
|
|
598
|
+
WRITERS["Codex · Claude · OpenCode<br/>writer inboxes"]
|
|
599
|
+
BRIGADE["Brigade<br/>draft · lint · source coverage"]
|
|
600
|
+
OPENCLAW["OpenClaw<br/>memory owner"]
|
|
601
|
+
MEMORY["canonical memory"]
|
|
602
|
+
RECEIPTS["ingest receipts<br/>promoted · skipped · failed"]
|
|
603
|
+
|
|
604
|
+
WRITERS --> BRIGADE --> OPENCLAW --> MEMORY
|
|
605
|
+
OPENCLAW --> RECEIPTS --> BRIGADE
|
|
606
|
+
|
|
607
|
+
classDef brigade fill:#2563eb,stroke:#1d4ed8,color:#fff;
|
|
608
|
+
classDef owner fill:#ef4444,stroke:#b91c1c,color:#fff;
|
|
609
|
+
classDef local fill:#f1f5f9,stroke:#94a3b8,color:#334155;
|
|
610
|
+
class BRIGADE brigade;
|
|
611
|
+
class OPENCLAW owner;
|
|
612
|
+
class WRITERS,MEMORY,RECEIPTS local;
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
A repo-adjacent setup is:
|
|
616
|
+
|
|
617
|
+
```bash
|
|
618
|
+
brigade init --target ./my-repo --depth repo --harnesses openclaw,codex,claude,opencode
|
|
619
|
+
brigade handoff sources init --target ./my-repo
|
|
620
|
+
brigade handoff doctor --target ./my-repo
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
An OpenClaw workspace setup does not need to be inside a code repo:
|
|
624
|
+
|
|
625
|
+
```bash
|
|
626
|
+
brigade init --target ~/agent-workspace --depth workspace --harnesses openclaw,hermes --owner openclaw
|
|
627
|
+
brigade handoff sources init --target ~/agent-workspace
|
|
628
|
+
brigade handoff doctor --target ~/agent-workspace
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
Then writer tools leave handoffs in their own inboxes, and the memory owner ingests the safe targeted notes while Brigade keeps receipts for promoted, routed, skipped, failed, malformed, and warning outcomes.
|
|
632
|
+
|
|
633
|
+
## For Hermes Users
|
|
634
|
+
|
|
635
|
+
Hermes now has a first-class Brigade handoff inbox:
|
|
636
|
+
|
|
637
|
+
```mermaid
|
|
638
|
+
flowchart LR
|
|
639
|
+
HERMES["Hermes"]
|
|
640
|
+
INBOX[".hermes/memory-handoffs/"]
|
|
641
|
+
FRAGMENTS[".brigade/hermes/<br/>adapter fragments"]
|
|
642
|
+
VERIFY["operator verify-harness"]
|
|
643
|
+
HANDOFFS["handoff list / lint"]
|
|
644
|
+
|
|
645
|
+
HERMES --> INBOX
|
|
646
|
+
HERMES --> FRAGMENTS
|
|
647
|
+
INBOX --> VERIFY
|
|
648
|
+
FRAGMENTS --> VERIFY
|
|
649
|
+
VERIFY --> HANDOFFS
|
|
650
|
+
|
|
651
|
+
classDef hermes fill:#7c3aed,stroke:#5b21b6,color:#fff;
|
|
652
|
+
classDef local fill:#f1f5f9,stroke:#94a3b8,color:#334155;
|
|
653
|
+
class HERMES hermes;
|
|
654
|
+
class INBOX,FRAGMENTS,VERIFY,HANDOFFS local;
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
```bash
|
|
658
|
+
brigade init --target . --depth workspace --harnesses hermes
|
|
659
|
+
brigade handoff sources init --target . --force
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
```bash
|
|
663
|
+
brigade handoff draft --target . --inbox hermes \
|
|
664
|
+
--title "Hermes note" \
|
|
665
|
+
--summary "Hermes can write a local Brigade handoff." \
|
|
666
|
+
--content "### Hermes note
|
|
667
|
+
|
|
668
|
+
Durable context goes here."
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
Check the local wiring with:
|
|
672
|
+
|
|
673
|
+
```bash
|
|
674
|
+
brigade operator verify-harness --harness hermes --target .
|
|
675
|
+
brigade handoff list --target .
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
The verifier checks both the `.hermes/memory-handoffs/` writer inbox and the `.brigade/hermes/` adapter fragments.
|
|
679
|
+
|
|
680
|
+
See [Hermes handoffs](docs/hermes-handoffs.md) for the current boundaries.
|
|
681
|
+
|
|
682
|
+
## Content Guard
|
|
683
|
+
|
|
684
|
+
Brigade handles the memory and operator workflow. Content Guard checks whether content is safe to publish or save.
|
|
685
|
+
|
|
686
|
+
```mermaid
|
|
687
|
+
flowchart LR
|
|
688
|
+
SCAN["security scan<br/>redacted findings"]
|
|
689
|
+
BUNDLE[".brigade/security/latest<br/>JSON · Markdown · SARIF"]
|
|
690
|
+
REVIEW["review / suppress<br/>accepted risk with reason"]
|
|
691
|
+
IMPORT["work import<br/>security follow-up"]
|
|
692
|
+
RELEASE["release readiness<br/>local blocker evidence"]
|
|
693
|
+
|
|
694
|
+
SCAN --> BUNDLE --> REVIEW
|
|
695
|
+
BUNDLE --> IMPORT
|
|
696
|
+
REVIEW --> RELEASE
|
|
697
|
+
IMPORT --> RELEASE
|
|
698
|
+
|
|
699
|
+
classDef scan fill:#fee2e2,stroke:#dc2626,color:#7f1d1d;
|
|
700
|
+
classDef local fill:#f1f5f9,stroke:#94a3b8,color:#334155;
|
|
701
|
+
classDef review fill:#fff7ed,stroke:#ea580c,color:#7c2d12;
|
|
702
|
+
class SCAN scan;
|
|
703
|
+
class BUNDLE,IMPORT,RELEASE local;
|
|
704
|
+
class REVIEW review;
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
Use it at three points:
|
|
708
|
+
|
|
709
|
+
- before memory ingest: `brigade handoff lint --content-guard`
|
|
710
|
+
- before publishing: `brigade scrub --policy public-repo`
|
|
711
|
+
- after findings appear: `brigade work import content-guard`
|
|
712
|
+
|
|
713
|
+
Policy names are intentionally plain:
|
|
714
|
+
|
|
715
|
+
- `personal`: local/internal working notes
|
|
716
|
+
- `public-repo`: code and docs before push
|
|
717
|
+
- `public-content`: stricter checks for blog, social, and site copy
|
|
718
|
+
|
|
719
|
+
`brigade operator doctor` and `brigade operator status` show whether Content Guard is installed, which policy is expected, which pre-push hook is active, and the latest local scan summary when available.
|
|
720
|
+
|
|
721
|
+
Brigade also ships a read-only local security scanner. `brigade security scan` produces redacted findings you can review, suppress with a reason, or import into the work inbox. See [Security and Content Guard](docs/security.md).
|
|
722
|
+
|
|
723
|
+
## Where The Detailed Docs Went
|
|
724
|
+
|
|
725
|
+
The full technical walkthrough still exists; it is just not the README anymore.
|
|
726
|
+
|
|
727
|
+
- [Technical guide](docs/technical-guide.md): the detailed command walkthrough.
|
|
728
|
+
- [Security and Content Guard](docs/security.md): scanner policies, handoff guards, and import flow.
|
|
729
|
+
- [Handoff promotion](docs/handoff-promotion.md): how notes move toward memory.
|
|
730
|
+
- [OpenClaw memory ingest checklist](docs/openclaw-memory-ingest-checklist.md): the ingest boundary and receipt checks for handoffs.
|
|
731
|
+
- [Hermes handoffs](docs/hermes-handoffs.md): Hermes writer inbox setup.
|
|
732
|
+
- [Repo fleet](docs/repo-fleet.md): local multi-repo health, actions, and release evidence.
|
|
733
|
+
- [Tool catalog](docs/tool-catalog.md): portable tools, projections, approvals, and run receipts.
|
|
734
|
+
- [Internal dogfood loop](docs/internal-dogfood.md): how this repo uses Brigade on itself.
|
|
735
|
+
- [Command inventory](docs/command-inventory.md): every public CLI command.
|
|
736
|
+
- [Roadmap](ROADMAP.md): current direction.
|
|
737
|
+
- [Roadmap archive](docs/roadmap-archive.md): completed or intentionally closed roadmap items.
|
|
738
|
+
|
|
739
|
+
## Tiny Glossary
|
|
740
|
+
|
|
741
|
+
- **Harness**: an agent tool such as OpenClaw, Hermes, Codex, Claude Code, or OpenCode.
|
|
742
|
+
- **Handoff**: a note an agent writes for later review.
|
|
743
|
+
- **Inbox**: the local folder where handoff notes wait.
|
|
744
|
+
- **Memory owner**: the place that keeps durable shared memory.
|
|
745
|
+
- **Operator**: the human deciding what gets saved, run, or published.
|