# Agent Architecture Single Agent type with `hasSidecar` boolean. `critical_actions` decoupled from sidecar. ## Decision Matrix: hasSidecar | hasSidecar | Structure | Use When | |------------|-----------|----------| | `false` | Single YAML file (~250 lines) | Stateless, single-purpose, personality-driven | | `true` | YAML + sidecar folder | Persistent memory, long-term tracking, relationship-driven | --- ## YAML Schema ```yaml agent: metadata: id: _bmad/agents/{agent-name}/{agent-name}.md name: 'Persona Name' title: 'Agent Title' icon: '' module: stand-alone # or bmm, cis, bmgd persona: role: | # First-person, 1-2 sentences identity: | # Background, 2-5 sentences communication_style: | # Voice, tone, mannerisms principles: # Core beliefs - Principle one critical_actions: # Optional - activation behavior - 'Load COMPLETE file {path}' - 'ONLY read/write files in {path}' prompts: - id: prompt-id content: | What it does 1. Step one 2. Step two menu: - trigger: XX or fuzzy match on command action: '#prompt-id' or 'Direct instruction' description: '[XX] Description' ``` --- ## Metadata Fields | Field | Format | Example | |-------|--------|---------| | `id` | `_bmad/agents/{name}/{name}.md` | `_bmad/agents/commit-poet/commit-poet.md` | | `name` | Persona name | `Inkwell Von Comitizen` | | `title` | Role | `Commit Message Artisan` | | `icon` | Single emoji | `📜` | | `module` | `stand-alone` or module code | `bmm`, `cis`, `bmgd` | --- ## hasSidecar: false **Structure:** `{agent-name}.agent.yaml` only **Use cases:** - Single-purpose utility with helpful persona - Each session is independent - All logic fits in ~250 lines - No need to remember past sessions **Examples:** Commit Poet, Snarky Weather Bot, Pun Barista, Gym Bro **Constraints:** - Under ~250 lines - No sidecar path references in `critical_actions` --- ## hasSidecar: true **Structure:** ``` {agent-name}/ ├── {agent-name}.agent.yaml └── {agent-name}-sidecar/ ├── instructions.md ├── memories.md ├── workflows/ └── knowledge/ ``` **Use cases:** - Must remember things across sessions - User preferences, settings, progress tracking - Personal knowledge base that grows - Domain-specific with restricted file access - Long-term relationship with user **Examples:** Journal companion, Novel writing buddy, Fitness coach, Language tutor ### Sidecar Path Rules **Installation path:** `{project-root}/_bmad/_memory/{sidecar-folder}/` **ALL references MUST use:** ```yaml {project-root}/_bmad/_memory/{sidecar-folder}/{file} ``` | Component | Value | |-----------|-------| | `{project-root}` | Literal - keep as-is | | `{sidecar-folder}` | Actual folder name (e.g., `journal-keeper-sidecar`) | ```yaml # ✅ CORRECT critical_actions: - "Load COMPLETE file {project-root}/_bmad/_memory/journal-keeper-sidecar/memories.md" - "ONLY read/write files in {project-root}/_bmad/_memory/journal-keeper-sidecar/" # ❌ WRONG critical_actions: - "Load ./journal-keeper-sidecar/memories.md" - "Load /Users/absolute/path/memories.md" ``` ### Required critical_actions for Sidecar ```yaml critical_actions: - 'Load COMPLETE file {project-root}/_bmad/_memory/{sidecar-folder}/memories.md' - 'Load COMPLETE file {project-root}/_bmad/_memory/{sidecar-folder}/instructions.md' - 'ONLY read/write files in {project-root}/_bmad/_memory/{sidecar-folder}/' ``` --- ## Menu Actions | Type | Format | Example | |------|--------|---------| | Prompt reference | `action: "#prompt-id"` | `action: "#write-commit"` | | Inline instruction | `action: "text"` | `action: "Update memories.md"` | **Trigger format:** `XX or fuzzy match on command` **Description format:** `[XX] Description` **Reserved codes:** MH, CH, PM, DA (auto-injected - do NOT use) ```yaml menu: - trigger: WC or fuzzy match on write action: "#write-commit" description: "[WC] Write commit message" - trigger: SM or fuzzy match on save action: "Update {project-root}/_bmad/_memory/{sidecar-folder}/memories.md" description: "[SM] Save session" ``` --- ## Prompts Reusable templates referenced via `#id`: ```yaml prompts: - id: write-commit content: | What this does 1. Step 2. Step Input → Output ``` **Best practices:** - Use semantic XML tags - Keep focused, single purpose - Number steps in multi-step processes --- ## Persona (All Types) First-person voice only: ```yaml role: "I am a Commit Message Artisan..." identity: "I understand commit messages are documentation..." communication_style: "Poetic drama with flair..." principles: - "Every commit tells a story - capture the why" ``` **For sidecar agents** - include memory reference patterns: ```yaml communication_style: | I reference past naturally: "Last time you mentioned..." or "I've noticed patterns..." ``` --- ## Domain Restriction Patterns ```yaml # Single folder (most common) - 'ONLY read/write files in {project-root}/_bmad/_memory/{sidecar-folder}/' # Read-only knowledge + write memories - 'Load from {project-root}/_bmad/_memory/{sidecar-folder}/knowledge/ but NEVER modify' - 'Write ONLY to {project-root}/_bmad/_memory/{sidecar-folder}/memories.md' # User folder access - 'ONLY access files in {user-folder}/journals/ - private space' ``` --- ## Validation Checklist ### Both Types - [ ] Valid YAML syntax - [ ] Metadata: id, name, title, icon, module - [ ] Persona: role, identity, communication_style, principles - [ ] Unique prompt IDs - [ ] Menu triggers: `XX or fuzzy match on command` - [ ] Menu descriptions: `[XX] Description` - [ ] No reserved codes (MH, CH, PM, DA) - [ ] File named `{agent-name}.agent.yaml` ### hasSidecar: false - [ ] Under ~250 lines - [ ] No sidecar path references ### hasSidecar: true - [ ] ALL paths: `{project-root}/_bmad/_memory/{sidecar-folder}/...` - [ ] `{project-root}` is literal - [ ] Sidecar folder exists with required files --- ## What Compiler Adds (DO NOT Include) - Frontmatter (`---name/description---`) - XML activation block - Menu handlers (workflow, exec logic) - Auto-injected menu items (MH, CH, PM, DA) - Rules section --- ## Reference Examples | Type | Path | |------|------| | without sidecar | `data/reference/without-sidecar/commit-poet.agent.yaml` | | with sidecar | `data/reference/with-sidecar/journal-keeper/` |