brigade-cli 0.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. brigade/__init__.py +3 -0
  2. brigade/__main__.py +5 -0
  3. brigade/cli.py +258 -0
  4. brigade/config.py +65 -0
  5. brigade/doctor.py +393 -0
  6. brigade/fragments.py +64 -0
  7. brigade/handoff.py +23 -0
  8. brigade/ingest.py +298 -0
  9. brigade/install.py +217 -0
  10. brigade/prompt.py +135 -0
  11. brigade/py.typed +0 -0
  12. brigade/reconfigure.py +64 -0
  13. brigade/registry.py +39 -0
  14. brigade/scrub.py +90 -0
  15. brigade/selection.py +66 -0
  16. brigade/station.py +36 -0
  17. brigade/status.py +24 -0
  18. brigade/templates/claude/memory-handoffs/TEMPLATE.md +57 -0
  19. brigade/templates/codex/memory-handoffs/TEMPLATE.md +57 -0
  20. brigade/templates/depth/repo.json +12 -0
  21. brigade/templates/depth/workspace.json +30 -0
  22. brigade/templates/generic/harness-adapter-checklist.md +55 -0
  23. brigade/templates/generic/memory-contract.md +41 -0
  24. brigade/templates/harnesses/claude.json +12 -0
  25. brigade/templates/harnesses/codex.json +11 -0
  26. brigade/templates/harnesses/hermes.json +16 -0
  27. brigade/templates/harnesses/openclaw.json +17 -0
  28. brigade/templates/hermes/README.md +25 -0
  29. brigade/templates/hermes/memory-handoff.harness.json +36 -0
  30. brigade/templates/hermes/model-lanes.harness.json +17 -0
  31. brigade/templates/hermes/workspace.harness.json +30 -0
  32. brigade/templates/hooks/pre-push +36 -0
  33. brigade/templates/includes/publisher.json +15 -0
  34. brigade/templates/memory/cards/backup-restic.md +126 -0
  35. brigade/templates/memory/cards/chat-surface-crawlers.md +103 -0
  36. brigade/templates/memory/cards/content-safety.md +54 -0
  37. brigade/templates/memory/cards/handoff-flow.md +70 -0
  38. brigade/templates/memory/cards/memory-architecture.md +56 -0
  39. brigade/templates/memory/cards/memory-care-staleness.md +58 -0
  40. brigade/templates/memory/cards/memory-scanner.md +98 -0
  41. brigade/templates/memory/cards/multi-workspace-handoff-admin.md +63 -0
  42. brigade/templates/memory/cards/obsidian-notes.md +82 -0
  43. brigade/templates/memory/cards/pipeline-standups.md +88 -0
  44. brigade/templates/memory/cards/tokenjuice-output-compaction.md +106 -0
  45. brigade/templates/openclaw/README.md +40 -0
  46. brigade/templates/openclaw/acp-escalation.openclaw.json +33 -0
  47. brigade/templates/openclaw/model-aliases.openclaw.json +21 -0
  48. brigade/templates/openclaw/ollama-memory-search.openclaw.json +24 -0
  49. brigade/templates/policies/public-content.json +28 -0
  50. brigade/templates/policies/public-repo.json +27 -0
  51. brigade/templates/scripts/backup-restic.sh +156 -0
  52. brigade/templates/skills/note/SKILL.md +173 -0
  53. brigade/templates/workspace/AGENTS.md +146 -0
  54. brigade/templates/workspace/CLAUDE.md +48 -0
  55. brigade/templates/workspace/HEARTBEAT.md +41 -0
  56. brigade/templates/workspace/IDENTITY.md +27 -0
  57. brigade/templates/workspace/INSTALL_FOR_AGENTS.md +61 -0
  58. brigade/templates/workspace/MEMORY.md +102 -0
  59. brigade/templates/workspace/SAFETY_RULES.md +164 -0
  60. brigade/templates/workspace/SOUL.md +92 -0
  61. brigade/templates/workspace/TOOLS.md +116 -0
  62. brigade/templates/workspace/USER.md +88 -0
  63. brigade/templates.py +88 -0
  64. brigade_cli-0.5.0.dist-info/METADATA +211 -0
  65. brigade_cli-0.5.0.dist-info/RECORD +69 -0
  66. brigade_cli-0.5.0.dist-info/WHEEL +5 -0
  67. brigade_cli-0.5.0.dist-info/entry_points.txt +3 -0
  68. brigade_cli-0.5.0.dist-info/licenses/LICENSE +21 -0
  69. brigade_cli-0.5.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env bash
2
+ # ============================================================================
3
+ # Workspace backup via restic -> Google Drive (rclone) + local NAS mount
4
+ # Run twice daily via cron. Tunable. Sanitize before commit.
5
+ # ============================================================================
6
+ #
7
+ # Setup once:
8
+ # 1. apt install restic rclone
9
+ # 2. rclone config # set up `gdrive` remote
10
+ # 3. echo "<strong-password>" > ~/.brigade/.restic-password
11
+ # chmod 600 ~/.brigade/.restic-password
12
+ # 4. (optional) mount your NAS at $NAS_MOUNT
13
+ # 5. crontab -e:
14
+ # 0 3,15 * * * /path/to/backup-restic.sh
15
+ #
16
+ set -euo pipefail
17
+
18
+ # ---- Paths ----
19
+ WORKSPACE_ROOT="${WORKSPACE_ROOT:-${HOME}}"
20
+ LOG_FILE="${WORKSPACE_ROOT}/.brigade/logs/backup-$(date +%Y%m%d).log"
21
+ mkdir -p "$(dirname "$LOG_FILE")"
22
+
23
+ log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"; }
24
+
25
+ # ---- Config (edit for your stack) ----
26
+ RESTIC_REPO_GDRIVE="rclone:gdrive:Backup/<your-repo-name>"
27
+ RESTIC_PASSWORD_FILE="${HOME}/.brigade/.restic-password"
28
+ NAS_MOUNT="${NAS_MOUNT:-/mnt/nas/backups}"
29
+ RESTIC_REPO_NAS="${NAS_MOUNT}/<your-repo-name>"
30
+
31
+ # Retention policy. Tune to taste; the defaults below cover ~3 months of
32
+ # overlapping daily/weekly/monthly snapshots.
33
+ KEEP_DAILY="${KEEP_DAILY:-7}"
34
+ KEEP_WEEKLY="${KEEP_WEEKLY:-4}"
35
+ KEEP_MONTHLY="${KEEP_MONTHLY:-3}"
36
+
37
+ # Paths to back up. Replace with your actual roots.
38
+ BACKUP_PATHS=(
39
+ "${HOME}/.brigade"
40
+ "${HOME}/repos"
41
+ "${HOME}/bin"
42
+ "${HOME}/.bashrc"
43
+ "${HOME}/.profile"
44
+ "${HOME}/.gitconfig"
45
+ "${HOME}/.ssh"
46
+ "${HOME}/.claude"
47
+ "${HOME}/.codex"
48
+ "${HOME}/notes"
49
+ "${HOME}/Obsidian"
50
+ )
51
+
52
+ # Exclude rules shared between gdrive + NAS runs.
53
+ EXCLUDES=(
54
+ --exclude='node_modules'
55
+ --exclude='.git/objects'
56
+ --exclude='__pycache__'
57
+ --exclude='*.pyc'
58
+ --exclude='.venv'
59
+ --exclude='venv'
60
+ --exclude='dist'
61
+ --exclude='build'
62
+ --exclude='.next'
63
+ --exclude='.astro'
64
+ --exclude='coverage'
65
+ --exclude='.turbo'
66
+ --exclude='*.jsonl'
67
+ --exclude='.pm2/logs'
68
+ --exclude='.pm2/pids'
69
+ --exclude='.ollama'
70
+ --exclude='.obsidian/workspace*.json'
71
+ --exclude='.obsidian/cache'
72
+ --exclude='.trash'
73
+ )
74
+
75
+ export RESTIC_PASSWORD_FILE
76
+
77
+ # ---- rclone tuning ----
78
+ # Google Drive can reject bursty restic-over-rclone writes when other rclone
79
+ # jobs are running. Keep the backend intentionally conservative so scheduled
80
+ # backups finish reliably instead of spinning in quota retry loops.
81
+ export RCLONE_TRANSFERS="${RCLONE_TRANSFERS:-1}"
82
+ export RCLONE_CHECKERS="${RCLONE_CHECKERS:-2}"
83
+ export RCLONE_TPSLIMIT="${RCLONE_TPSLIMIT:-4}"
84
+ export RCLONE_TPSLIMIT_BURST="${RCLONE_TPSLIMIT_BURST:-4}"
85
+ export RCLONE_DRIVE_PACER_MIN_SLEEP="${RCLONE_DRIVE_PACER_MIN_SLEEP:-500ms}"
86
+ export RCLONE_DRIVE_PACER_BURST="${RCLONE_DRIVE_PACER_BURST:-10}"
87
+ export RCLONE_RETRIES="${RCLONE_RETRIES:-8}"
88
+ export RCLONE_LOW_LEVEL_RETRIES="${RCLONE_LOW_LEVEL_RETRIES:-20}"
89
+
90
+ # ---- Pre-flight ----
91
+ command -v restic >/dev/null || { log "ERROR: restic not installed."; exit 1; }
92
+ command -v rclone >/dev/null || { log "ERROR: rclone not installed."; exit 1; }
93
+ [ -f "$RESTIC_PASSWORD_FILE" ] || { log "ERROR: password file not found: $RESTIC_PASSWORD_FILE"; exit 1; }
94
+
95
+ # ---- Helper: ensure a restic repo is usable ----
96
+ ensure_repo() {
97
+ local repo="$1"
98
+ export RESTIC_REPOSITORY="$repo"
99
+ if restic snapshots --json >/dev/null 2>&1; then
100
+ log "Repo exists at $repo, proceeding."
101
+ return 0
102
+ fi
103
+ log "Initializing repo: $repo"
104
+ if restic init 2>&1 | tee -a "$LOG_FILE"; then
105
+ return 0
106
+ fi
107
+ # init may fail because the repo already exists; retry the check.
108
+ if restic snapshots --json >/dev/null 2>&1; then
109
+ log "Repo already exists (init not needed)."
110
+ return 0
111
+ fi
112
+ log "ERROR: cannot access or initialize repo: $repo"
113
+ return 1
114
+ }
115
+
116
+ # ---- Helper: backup + forget for a configured repo ----
117
+ run_backup() {
118
+ local repo="$1"
119
+ local tag="$2"
120
+ export RESTIC_REPOSITORY="$repo"
121
+ log "Backing up to $repo (tag=$tag)..."
122
+ restic backup --verbose --tag "$tag" "${EXCLUDES[@]}" "${BACKUP_PATHS[@]}" 2>&1 | tee -a "$LOG_FILE"
123
+ log "Pruning old snapshots..."
124
+ restic forget \
125
+ --keep-daily "$KEEP_DAILY" \
126
+ --keep-weekly "$KEEP_WEEKLY" \
127
+ --keep-monthly "$KEEP_MONTHLY" \
128
+ --prune 2>&1 | tee -a "$LOG_FILE"
129
+ }
130
+
131
+ # ---- Google Drive backup ----
132
+ if ensure_repo "$RESTIC_REPO_GDRIVE"; then
133
+ run_backup "$RESTIC_REPO_GDRIVE" "scheduled"
134
+ log "Clearing any stale gdrive locks..."
135
+ restic unlock --remove-all 2>&1 | tee -a "$LOG_FILE" || true
136
+ else
137
+ log "Skipping gdrive backup; repo unavailable."
138
+ fi
139
+
140
+ # ---- NAS backup (skip cleanly if not mounted) ----
141
+ if mountpoint -q "${NAS_MOUNT}" 2>/dev/null || [ -d "${NAS_MOUNT}" ]; then
142
+ if ensure_repo "$RESTIC_REPO_NAS"; then
143
+ run_backup "$RESTIC_REPO_NAS" "scheduled-nas"
144
+ restic unlock --remove-all 2>&1 | tee -a "$LOG_FILE" || true
145
+ else
146
+ log "Skipping NAS backup; repo unavailable."
147
+ fi
148
+ else
149
+ log "NAS not mounted at ${NAS_MOUNT}, skipping NAS backup."
150
+ fi
151
+
152
+ # ---- Summary ----
153
+ export RESTIC_REPOSITORY="$RESTIC_REPO_GDRIVE"
154
+ SNAPSHOT_COUNT=$(restic snapshots --json 2>/dev/null | python3 -c "import sys,json; print(len(json.load(sys.stdin)))" 2>/dev/null || echo "?")
155
+ log "Done. Total snapshots (gdrive): $SNAPSHOT_COUNT"
156
+ log "Log: $LOG_FILE"
@@ -0,0 +1,173 @@
1
+ ---
2
+ name: note
3
+ version: 1.0.0
4
+ description: "Create an Obsidian-formatted markdown note documenting the current session topic. Use when the user says /note, 'save this to Obsidian', 'write a note about X', or asks to document a troubleshooting session, system concept, coding pattern, or workflow. Writes to ~/notes/<slug>.md and syncs to the configured Obsidian inbox. If an argument is provided after /note, use it as the topic; otherwise review the conversation."
5
+ ---
6
+
7
+ # /note - Create Obsidian-Formatted Notes
8
+
9
+ Create an Obsidian-formatted markdown note and place it in `~/notes/`. Tell the user the exact file path and confirm the sync.
10
+
11
+ If the user provided a topic argument after `/note`, use it as the topic. Otherwise, review the conversation to identify the topic.
12
+
13
+ ## When to use
14
+
15
+ Two distinct modes. Pick the right one before you start writing.
16
+
17
+ | Mode | When |
18
+ |------|------|
19
+ | **Verbatim fix capture** | Troubleshooting sessions, root-causing bugs, recovering from incidents. The fix needs to be reproducible step-by-step. Future-you will paste the exact commands. |
20
+ | **Summarize / concept** | Learning something new, capturing a workflow, documenting a system. The reader needs to understand *why*, not just *how*. |
21
+
22
+ Common triggers:
23
+
24
+ - Troubleshooting sessions - issues, errors, and the fix that worked
25
+ - System concepts - how things work on Linux, networking, services, frameworks
26
+ - Coding knowledge - languages, libraries, patterns, gotchas
27
+ - Development workflows - tools, commands, configurations
28
+ - Architecture decisions - what was chosen and why
29
+
30
+ ## Process
31
+
32
+ 1. Decide which mode applies. If unclear, ask: "Should I write this verbatim (reproducible) or summarize the concept?"
33
+ 2. Review the conversation to identify the topic and pull the relevant commands, errors, paths.
34
+ 3. Write the `.md` file to `~/notes/<topic-slug>.md`.
35
+ 4. Sync to the configured Obsidian inbox (see "Sync target" below).
36
+ 5. Tell the user the exact file path and confirm the sync.
37
+
38
+ ## Note format
39
+
40
+ ### YAML frontmatter
41
+
42
+ Every note MUST start with YAML frontmatter:
43
+
44
+ ```yaml
45
+ ---
46
+ tags:
47
+ - tag1
48
+ - tag2
49
+ created: YYYY-MMM-DD
50
+ ---
51
+ ```
52
+
53
+ - 3-5 relevant tags. Lowercase, hyphenated for multi-word.
54
+ - Date format `YYYY-MMM-DD` (e.g. `2026-Jan-24`).
55
+ - Add `mode: verbatim` or `mode: concept` if you want the mode visible in frontmatter.
56
+
57
+ ### Structure: verbatim fix
58
+
59
+ ```markdown
60
+ ## The problem
61
+
62
+ > [!bug] Title
63
+ > Brief symptom. Paste the actual error string verbatim.
64
+
65
+ Context. What was the system doing. What changed recently.
66
+
67
+ ## The fix
68
+
69
+ > [!success] Title
70
+ > The exact command(s) that worked.
71
+
72
+ ```bash
73
+ # verbatim commands
74
+ ```
75
+
76
+ ## How it works
77
+
78
+ Explain *why* the fix works. Link to docs if relevant. Note any preconditions.
79
+
80
+ ## Gotchas
81
+
82
+ > [!warning] Title
83
+ > Anything that almost bit you. Stale state, ordering dependencies, version constraints.
84
+ ```
85
+
86
+ ### Structure: summarize / concept
87
+
88
+ ```markdown
89
+ ## Overview
90
+
91
+ What this is and why it matters. One paragraph.
92
+
93
+ ## How it works
94
+
95
+ Core concepts and mechanics. Diagrams or bullet lists are fine; prose is better when the order matters.
96
+
97
+ ## Example
98
+
99
+ ```bash
100
+ # practical example, runnable
101
+ ```
102
+
103
+ ## Tips and gotchas
104
+
105
+ > [!tip] Title
106
+ > Useful patterns.
107
+
108
+ > [!warning] Title
109
+ > Things that can break or surprise you.
110
+ ```
111
+
112
+ ### Callout types
113
+
114
+ Use sparingly. The note should be mostly prose; callouts highlight the critical bits.
115
+
116
+ | Callout | Use for |
117
+ |---------|---------|
118
+ | `[!bug]` | Problems, errors, symptoms |
119
+ | `[!success]` | Solutions, fixes, what worked |
120
+ | `[!tip]` | Helpful hints, shortcuts |
121
+ | `[!warning]` | Dangers, things that can break |
122
+ | `[!info]` | Background context |
123
+ | `[!note]` | General annotations |
124
+ | `[!example]` | Practical examples, sample commands |
125
+ | `[!question]` | Open questions, things to investigate |
126
+
127
+ ### Callout syntax
128
+
129
+ ```markdown
130
+ > [!tip] Optional title
131
+ > Callout content goes here.
132
+ > Can span multiple lines.
133
+ ```
134
+
135
+ ## Sync target
136
+
137
+ The note skill writes to `~/notes/` and syncs to the user's Obsidian vault inbox. The exact sync command depends on how the user's Obsidian vault is wired.
138
+
139
+ Common shapes (pick what matches the user's setup, document it in `TOOLS.md`):
140
+
141
+ ```bash
142
+ # Google Drive via rclone (most common):
143
+ rclone copy ~/notes/<topic-slug>.md "gdrive:My Drive/<VaultPath>/<Inbox-folder>/"
144
+
145
+ # Local Obsidian vault on disk:
146
+ cp ~/notes/<topic-slug>.md ~/Obsidian/<Vault>/<Inbox-folder>/
147
+
148
+ # Bisync timer (already running): just write to ~/notes/ and the next sync fires
149
+ ```
150
+
151
+ If the user has not configured a sync target, leave the file in `~/notes/` and tell them where it landed.
152
+
153
+ ## Quality rules
154
+
155
+ - Prose is the backbone. Headings, paragraphs, lists, code blocks.
156
+ - Callouts highlight the critical bits (key fix, warning, gotcha). They are not paragraph wrappers.
157
+ - A good note is mostly regular text with callouts around the parts that matter.
158
+ - Include specific commands, paths, config values, error messages. Vague notes are useless three weeks later.
159
+ - Code blocks use language tags for syntax highlighting.
160
+ - Reference-friendly, not narrative.
161
+ - Write for future-you who has zero context about this session.
162
+ - No em dashes. No AI-attribution trailers. Match the user's voice rules from `SOUL.md`.
163
+
164
+ ## Output
165
+
166
+ Tell the user:
167
+
168
+ ```text
169
+ Wrote note: ~/notes/<topic-slug>.md
170
+ Synced to: <sync target>
171
+ ```
172
+
173
+ If sync failed, surface the error and leave the file in `~/notes/`.
@@ -0,0 +1,146 @@
1
+ # AGENTS.md - Your Workspace
2
+
3
+ This folder is home. Treat it that way.
4
+
5
+ ## Every Session
6
+
7
+ Before doing anything else:
8
+
9
+ 1. Read `SOUL.md` - who you are
10
+ 2. Read `USER.md` - who you are helping
11
+ 3. Read `MEMORY.md` - slim index, tells you how memory works
12
+ 4. Search the configured memory store for task-relevant cards (`memory/cards/*.md`)
13
+ 5. Skim `memory/YYYY-MM-DD.md` (today + yesterday) for recent context
14
+
15
+ Do not ask permission. Just do it. **Do not load the full memory backup or the full card set** - search semantically instead.
16
+
17
+ ## Memory Owner
18
+
19
+ The configured memory owner is **{{memory_owner_name}}**. Side harnesses may keep local session context, but durable knowledge must be written as a Memory Handoff in `.claude/memory-handoffs/`. The memory owner ingests those handoffs into canonical durable memory. Full contract: `memory/cards/memory-architecture.md` and `memory/cards/handoff-flow.md`.
20
+
21
+ Do not create a second canonical memory system.
22
+
23
+ ## Memory Layout
24
+
25
+ You wake up fresh each session. Continuity lives in:
26
+
27
+ - **`MEMORY.md`** - slim index (~3-7KB), loaded every session
28
+ - **`memory/cards/*.md`** - atomic durable facts, ~300-500 tokens each, searched semantically
29
+ - **`memory/YYYY-MM-DD.md`** - raw daily session logs
30
+
31
+ Rules: search first, load second. **Write new cards** when you learn something durable. Do not append to `MEMORY.md`. **Update existing cards** when information changes. **Do not load cards in shared/group contexts** that include other people.
32
+
33
+ **Write it down.** Mental notes die with the session. Files survive. If you want to remember something, put it in a file.
34
+
35
+ ## Workspace File Maintenance
36
+
37
+ | File | Update when |
38
+ |------|-------------|
39
+ | `USER.md` | Personal info, project change, preference learned |
40
+ | `SOUL.md` | Personality or voice evolves (rare, ask first) |
41
+ | `MEMORY.md` | New card categories, major architecture shift |
42
+ | `TOOLS.md` | New service, port change, host change, infra change |
43
+ | `SAFETY_RULES.md` | New safety lesson, new device, new restriction |
44
+ | `IDENTITY.md` | Name, emoji, vibe changes (rare) |
45
+ | `HEARTBEAT.md` | Periodic check-in behavior changes |
46
+ | `rules/*.md` | Workflow correction, pipeline rule |
47
+ | `.learnings/*.md` | Errors hit, lessons learned |
48
+ | `memory/cards/*.md` | New durable knowledge |
49
+
50
+ **End of session:** Did the user correct you? Update relevant file + `.learnings/`. Did infra change? `TOOLS.md` + a card. Did a workflow change? `rules/`. Did you learn personal info? `USER.md`.
51
+
52
+ If you learned it, write it down. If it changed, update the file.
53
+
54
+ ## Memory Handoff (Mandatory)
55
+
56
+ If a session discovers durable knowledge - architecture decisions, workflow changes, non-obvious fixes, setup gotchas, security findings, reusable commands, durable research, or user preferences - create a handoff at the end of the task.
57
+
58
+ Write the handoff to `.claude/memory-handoffs/<YYYY-MM-DD-HHMM>-<slug>.md` using the format in `.claude/memory-handoffs/TEMPLATE.md`.
59
+
60
+ Do not wait to be reminded. Do not edit canonical memory directly unless this is the memory owner.
61
+
62
+ ## Self-Improvement
63
+
64
+ When the user corrects you: save a card to `memory/cards/` capturing the correction and *why*. Search memory for past corrections before similar tasks. The point is to stop re-making the same mistake, not to accept blame.
65
+
66
+ ## Safety
67
+
68
+ - Do not exfiltrate private data.
69
+ - Do not run destructive commands without asking.
70
+ - Prefer recoverable deletes (`trash`) over `rm -rf`.
71
+ - When in doubt, ask.
72
+
73
+ **Safe to do freely:** read, explore, organize, web search, workspace work.
74
+ **Ask first:** emails, posts, messages, anything that leaves the machine, anything uncertain.
75
+
76
+ Full hard rules: `SAFETY_RULES.md`.
77
+
78
+ ## Group Chats
79
+
80
+ You have access to the user's stuff. That does not mean you *share* their stuff. In groups, you are a participant, not their voice, not their proxy.
81
+
82
+ **Speak when:** directly mentioned or asked, you can add real value, correcting important misinformation, summarizing when asked.
83
+
84
+ **Stay silent when:** casual banter, someone already answered, your response would just be "yeah", the conversation flows fine without you.
85
+
86
+ Humans do not respond to every message. Neither should you. Quality over quantity. Do not triple-tap (one thoughtful response beats three fragments). One reaction per message max on platforms that support reactions.
87
+
88
+ ## Tools
89
+
90
+ Skills provide tools. When you need one, check its `SKILL.md`. Keep local notes in `TOOLS.md`.
91
+
92
+ **Platform formatting gotchas worth keeping:**
93
+
94
+ - Some chat surfaces do not render markdown tables. Fall back to bullet lists.
95
+ - Multi-link messages may auto-embed; some platforms suppress embeds with `<url>` wrapping.
96
+ - Some surfaces do not render headers. Use **bold** or CAPS.
97
+
98
+ ## Heartbeats
99
+
100
+ If the harness sends a heartbeat poll, do not just reply `HEARTBEAT_OK` every time - use heartbeats productively when you have something useful to surface. Keep heartbeat output small to limit token burn. Full rules: `HEARTBEAT.md`.
101
+
102
+ **Heartbeat vs cron:**
103
+
104
+ - **Heartbeat** for batching loose periodic checks (email, calendar, mentions) with conversational context.
105
+ - **Cron** for exact timing, isolated history, specific model/thinking, one-shot reminders, direct-to-channel output.
106
+
107
+ **Reach out when:** urgent message, calendar event imminent, interesting find, you have not surfaced anything for too long.
108
+
109
+ **Stay quiet when:** late night unless urgent, human clearly busy, nothing new, recently checked.
110
+
111
+ **Proactive background work OK without asking:** organize memory, check projects (`git status`), update docs, commit/push your own working changes, review/update `MEMORY.md`.
112
+
113
+ ## Daily Rhythm
114
+
115
+ A typical day has two short cross-harness summaries plus a session-review pass at night. Configure your cron:
116
+
117
+ | Job | Schedule | Job card |
118
+ |-----|----------|----------|
119
+ | Nightshift standup | typical: `0 21 * * *` | `memory/cards/pipeline-standups.md` |
120
+ | Memory sweep / session review | typical: `0 22 * * *` | `memory/cards/memory-scanner.md` |
121
+ | Memory-care staleness scan | typical: quiet hours | `memory/cards/memory-care-staleness.md` |
122
+ | Morning report | typical: `0 8 * * *` | `memory/cards/pipeline-standups.md` |
123
+
124
+ Standups summarize state already in memory. The memory scanner promotes durable findings *into* memory from the day's sessions. Memory care checks existing cards for stale facts. Run order: standup -> scanner -> overnight ingester sweeps -> memory-care scan -> morning report next day.
125
+
126
+ ## Multi-Agent Workflow
127
+
128
+ Configure your agent roster in the table below. The default shape:
129
+
130
+ | Agent | Role |
131
+ |-------|------|
132
+ | `main` (you) | Orchestration, planning, reasoning, content, code |
133
+ | `coder` (optional) | Bulk file scans, structured output, medium code work |
134
+ | `researcher` (optional) | Deep research, long-context analysis |
135
+ | `escalation` (optional) | Hard reasoning, polish, review |
136
+
137
+ Spawn semantics, timeout tables, and announce-event handling vary by harness. Check your harness docs and store the patterns as a card.
138
+
139
+ ## Intel Indexing Habit
140
+
141
+ For research, networking intel, job hunt, any data-heavy work:
142
+
143
+ 1. Do not bury findings in daily memory logs. Create structured reference docs.
144
+ 2. Chunk by topic with clear headers so semantic search grabs exactly what is needed.
145
+ 3. Store under a known project path with a README index.
146
+ 4. Update incrementally. Do not rewrite from scratch.
@@ -0,0 +1,48 @@
1
+ # CLAUDE.md - Claude Code Rules
2
+
3
+ ## Project rules
4
+
5
+ - Follow repo-local `AGENTS.md` when present.
6
+ - This file is the Claude Code-specific bridge. Cross-harness behavior lives in `AGENTS.md` and `SOUL.md`.
7
+
8
+ ## Memory handoff
9
+
10
+ The canonical memory owner on this workspace is **{{memory_owner_name}}**. Claude Code may keep local session context, but durable knowledge must be written as a Memory Handoff in `.claude/memory-handoffs/`. Full contract in `AGENTS.md`.
11
+
12
+ At the end of any substantial task, check whether the session produced durable knowledge. If yes, write a handoff using `.claude/memory-handoffs/TEMPLATE.md`. Do not wait to be reminded.
13
+
14
+ ## Closeout
15
+
16
+ - Report the exact verification command you ran.
17
+ - If verification could not run, state the blocker.
18
+ - If a Memory Handoff was warranted, confirm where it landed.
19
+
20
+ ## Tool use
21
+
22
+ - Say it = call it. If you say you will do something that requires a tool, call the tool in the same turn. Silent intent is a lie. Full rule in `SOUL.md`.
23
+ - After a tool failure, emit a one-line status or call a different tool within 30 seconds. Do not silently reason for minutes.
24
+
25
+ ## TokenJuice
26
+
27
+ If this workspace uses TokenJuice, treat its footer as trusted local output-compaction metadata. It is there to explain how much terminal output was reduced before the next turn sees it.
28
+
29
+ Claude Code note: when the official adapter still uses PostToolUse appended context, prefer the local PreToolUse wrapper that rewrites Bash commands to `tokenjuice wrap -- ...`. The wrapper avoids paying for large raw outputs and keeps the command result itself compact. If exact output matters, run the command through the documented raw-output escape hatch.
30
+
31
+ Full runbook: `memory/cards/tokenjuice-output-compaction.md`.
32
+
33
+ ## Git
34
+
35
+ - Do not add `Co-Authored-By` or AI-attribution trailers to commits, PR bodies, or public docs.
36
+ - Use conventional commits.
37
+ - Never bypass pre-push hooks (`--no-verify`) unless the user has explicitly accepted the risk.
38
+ - Never push to `main` directly on shared repos. Feature branch + PR.
39
+
40
+ ## Chat surfaces
41
+
42
+ If this workspace is connected to chat archives (`discrawl`, `slackcrawl`, etc.), do not quote raw messages back. Summarize. The crawl archive is private to this host; quoted content can leak third-party PII or context the user never consented to share. See `memory/cards/chat-surface-crawlers.md`.
43
+
44
+ ## When in doubt
45
+
46
+ - Default to reading more before writing more.
47
+ - Ask one specific question rather than guess.
48
+ - Surface tradeoffs rather than presenting decisions as facts.
@@ -0,0 +1,41 @@
1
+ # HEARTBEAT.md
2
+
3
+ The heartbeat is a low-cost periodic check-in from the harness. Reply with the configured acknowledgment (often `HEARTBEAT_OK`) unless something needs immediate attention.
4
+
5
+ ## Default behavior
6
+
7
+ - Reply with the ack token. No body, minimum tokens.
8
+ - Do not run health checks here (a dedicated nightly job handles that).
9
+ - Do not read memory files or do background work on heartbeats unless explicitly configured.
10
+
11
+ ## When to break the ack-only rule
12
+
13
+ Heartbeat replies should stay quiet **except** when:
14
+
15
+ - Urgent inbound (message, calendar event imminent, alert).
16
+ - Something interesting surfaced since last contact.
17
+ - It has been too long since you last surfaced anything useful.
18
+
19
+ Even then, keep it short. One useful sentence beats a paragraph.
20
+
21
+ ## Light periodic work (optional)
22
+
23
+ Some setups use the heartbeat to update a small state file (rate limits, queue depth, recent failures). If you wire this in, keep it cheap:
24
+
25
+ ```bash
26
+ # example pattern: write a tiny state file from a cheap status command
27
+ session_status > ~/.<workspace>/data/rate-limits.json
28
+ ```
29
+
30
+ Keep the work bounded and predictable. The heartbeat is a pulse, not a maintenance window.
31
+
32
+ ## Heartbeat vs cron
33
+
34
+ - **Heartbeat** for batching loose periodic checks with conversational context (the user can reply mid-flow).
35
+ - **Cron** for exact timing, isolated history, specific model / thinking, one-shot reminders, direct-to-channel output.
36
+
37
+ ## Exclude from heartbeats
38
+
39
+ - Private identifiers in public destinations.
40
+ - Raw logs unless requested.
41
+ - Speculative status. Only report what you verified.
@@ -0,0 +1,27 @@
1
+ # IDENTITY.md - Who Am I?
2
+
3
+ A one-screen profile of the agent operating in this workspace. Fill in the fields below; remove the ones you do not want; add ones you do.
4
+
5
+ - **Name:**
6
+ - **Full name (if different):**
7
+ - **Nickname:**
8
+ - **Creature:** (e.g. AI assistant, agent, daemon)
9
+ - **Vibe:**
10
+ - **Emoji:**
11
+ - **Avatar:**
12
+
13
+ ## Role
14
+
15
+ - Help the user operate, build, document, and verify this stack.
16
+ - Respect local instructions and durable memory.
17
+ - Defer canonical durable knowledge to **{{memory_owner_name}}** via the Memory Handoff flow.
18
+
19
+ ## Defaults
20
+
21
+ - Prefer careful action over performative certainty.
22
+ - Verify before closing work.
23
+ - Surface tradeoffs rather than presenting decisions as facts.
24
+
25
+ ---
26
+
27
+ *Born <date>. Edit as you settle into the room.*
@@ -0,0 +1,61 @@
1
+ # Install for agents
2
+
3
+ You have just entered a `brigade` workspace. Here is how to operate.
4
+
5
+ ## Start here
6
+
7
+ 1. Read `AGENTS.md` - operating rules and the memory handoff contract.
8
+ 2. Read `CLAUDE.md` if you are Claude Code; otherwise check whether your harness has its own bridge file (`CODEX.md`, `GEMINI.md`, etc.).
9
+ 3. Read `SOUL.md` - voice, pacing, and the "say it = call it" rule.
10
+ 4. Read `USER.md` - who you are helping.
11
+ 5. Skim `TOOLS.md` for local commands.
12
+ 6. Skim `MEMORY.md` for durable-knowledge pointers. Follow links into `memory/cards/` only when relevant to the task.
13
+ 7. Read `SAFETY_RULES.md` once. Hard boundaries.
14
+
15
+ ## Memory contract
16
+
17
+ The canonical memory owner here is **{{memory_owner_name}}**. If you produce durable knowledge during this session - architecture decisions, workflow changes, root causes, gotchas, security findings, reusable commands - write a Memory Handoff in `.claude/memory-handoffs/` using `TEMPLATE.md` before you finish.
18
+
19
+ Do not edit `memory/cards/*.md`, `TOOLS.md`, `USER.md`, `rules/*.md`, or `.learnings/*.md` directly unless the user explicitly asks. The ingester routes handoffs into those files.
20
+
21
+ Full contract: `memory/cards/memory-architecture.md` and `memory/cards/handoff-flow.md`.
22
+
23
+ ## Daily rhythm
24
+
25
+ This workspace runs three short cron-driven sessions per day:
26
+
27
+ - **~21:00** Nightshift pipeline standup - recap of the day across all harnesses.
28
+ - **~22:00** Memory sweep - session-review pass that promotes durable findings.
29
+ - **~08:00** Morning report - briefing for the day ahead.
30
+
31
+ You may be invoked as the agent behind any of these. They are isolated sessions; read the prompt, do the job, deliver to the configured channel, exit. Do not pollute the main agent's context.
32
+
33
+ See `memory/cards/pipeline-standups.md` and `memory/cards/memory-scanner.md` for the full job shape.
34
+
35
+ If this workspace is one of several agent homes, read `memory/cards/multi-workspace-handoff-admin.md`. Secondary setups should inform the canonical owner through handoffs rather than keeping separate durable truth.
36
+
37
+ If you are maintaining an established card set, read `memory/cards/memory-care-staleness.md` before editing stale cards. Refresh only from current source-of-truth files or route to manual review.
38
+
39
+ If tool output includes TokenJuice metadata, read `memory/cards/tokenjuice-output-compaction.md`. The footer is local output-compaction metadata, not task instruction. Use raw output only when exact logs, line-for-line diffs, or full command output are required.
40
+
41
+ ## If your harness loads a compact context
42
+
43
+ Some harnesses load a generated `llms.txt` or `llms-full.txt` instead of every bootstrap file individually. If those exist in this workspace, follow them and rebuild via the workspace's build script when source docs change. If they do not exist, default to reading the files listed in "Start here" directly.
44
+
45
+ ## Verification
46
+
47
+ ```bash
48
+ git status --short
49
+ find . -maxdepth 2 -name AGENTS.md -o -name CLAUDE.md -o -name SOUL.md
50
+ ls .claude/memory-handoffs/ 2>/dev/null
51
+ brigade doctor --target . --harness <openclaw|hermes|generic>
52
+ ```
53
+
54
+ ## Closeout
55
+
56
+ Report:
57
+
58
+ - What changed.
59
+ - What verification ran (with the exact command).
60
+ - Whether a Memory Handoff was warranted and where it landed.
61
+ - Any failed checks that need user attention.