Multi-agent orchestration toolkit for the Aura Protocol. Provides CLI tools for launching Claude agents in isolated worktrees and tmux sessions, role-based slash commands, and a Home Manager module for declarative distribution.
aura-plugins solves two problems in multi-agent Claude workflows:
-
Isolation. Parallel agents editing the same repo need separate working trees and branches to avoid conflicts.
aura-swarmcreates per-epic git worktrees with automatic Beads context gathering. -
Coordination. Agents need structured roles (architect, supervisor, worker, reviewer) with different toolsets and instructions. Both CLI tools inject role-specific system prompts from
skills/*/SKILL.mdfiles.
All inter-agent coordination flows through Beads task status and comments — there is no separate messaging system.
# 1. Add the aura-plugins marketplace
claude plugin marketplace add dayvidpham/aura-plugins
# 2. Install the aura plugin (user-wide)
claude plugin install aura@aura-plugins
# Or install for a specific project only
claude plugin install aura@aura-plugins --scope project
# Validate (optional)
claude plugin validate /path/to/aura-pluginsAfter installing, restart Claude Code. Skills are auto-discovered and invocable as /aura:<skill-name> (e.g. /aura:epoch, /aura:user-request).
# Update to latest
claude plugin update aura@aura-plugins
# Local development (from a checkout, no install needed)
claude plugin marketplace add /path/to/aura-plugins
claude plugin install aura@aura-pluginsOpenCode natively reads skills/*/SKILL.md. Clone into your project's .claude/ or configure via OpenCode's plugin system.
Add as a flake input:
# flake.nix
{
inputs.aura-plugins.url = "github:dayvidpham/aura-plugins";
}Then reference the packages:
# In your system or home-manager config:
aura-plugins.packages.${system}.aura-swarm # unified agent orchestration
aura-plugins.packages.${system}.aura-parallel # deprecated wrapper
aura-plugins.packages.${system}.default # all toolsThe flake exports a Home Manager module that syncs commands, agents, and
protocol docs into ~/.claude/:
# home.nix
{
imports = [ aura-plugins.homeManagerModules.aura-config-sync ];
CUSTOM.programs.aura-config-sync = {
packages.enable = true; # install CLI tools
commands.enable = true; # install slash commands
commands.roles = { # toggle per-role
architect = true;
supervisor = true;
worker = true;
reviewer = true;
epoch = true;
};
# commands.enableAll = true; # shorthand for all roles
agents.enable = true; # install custom agents
protocol.enable = false; # install skills/protocol/ docs (off by default)
};
}Core commands (aura:status, aura:impl:*, aura:user:*) are always installed when
commands.enable = true, regardless of role selection.
Both scripts are standalone Python 3.10+ with no external dependencies:
git clone https://github.com/dayvidpham/aura-plugins
cd aura-plugins
chmod +x bin/aura-swarm bin/aura-release
# Add bin/ to PATH or symlink into a PATH directoryBoth tools check for these on startup and exit with an error if any are missing:
| Tool | Purpose |
|---|---|
git |
Worktree and branch management |
tmux |
Agent session hosting |
bd |
Beads issue tracking |
claude |
Claude CLI (agent runtime) |
Python 3.10+ (stdlib only, no pip dependencies).
Creates an isolated git worktree for a Beads epic, gathers task context from the dependency graph, and launches a single Claude instance in a tmux session. The agent uses Claude's Agent Teams internally to spawn workers on sub-branches.
main
└── epic/<epic-id> aura-swarm creates this branch + worktree
├── agent/<task-id-1> Claude Agent Teams creates sub-branches
├── agent/<task-id-2>
└── agent/<task-id-3>
aura-swarm <subcommand> [options]Creates (or reuses) a worktree, discovers tasks and URD from the Beads dependency graph, builds a context-rich prompt, and launches Claude in a detached tmux session.
aura-swarm start --epic <epic-id> [options] [task-id ...]| Option | Default | Description |
|---|---|---|
--epic |
(required) | Beads epic ID |
--role |
supervisor |
Agent role: architect, supervisor, reviewer, worker |
--model |
sonnet |
Model: sonnet, opus, haiku |
--skill |
— | Skill to invoke at start (e.g. aura:supervisor) |
--prompt-addon |
— | Extra instructions appended to the auto-generated prompt |
--permission-mode |
acceptEdits |
default, acceptEdits, bypassPermissions, plan |
--urd |
(auto-discovered) | Explicit URD task ID (overrides graph walk) |
--restart |
false |
Kill existing session and start fresh |
--worktree-dir |
worktree |
Root directory for worktrees (relative to repo) |
--dry-run |
false |
Preview prompt and commands without launching |
task-id ... |
(auto-discovered) | Explicit task IDs (overrides dependency walk) |
Task discovery. When no explicit task IDs are given, aura-swarm walks the
epic's Beads dependency graph two levels deep, classifying each task as a
blocker (must finish first) or dependent (downstream work). The discovered
tasks are formatted into a markdown table in the generated prompt.
URD discovery. The User Requirements Document is identified by the
aura:user:reqs label or a [aura:user:reqs] title prefix. If --urd is not
set, the script searches the epic's first- and second-level dependencies.
Examples:
# Typical: launch a supervisor for an epic, let it discover tasks from Beads
aura-swarm start --epic aura-dyu --model sonnet
# Use opus for complex architectural work
aura-swarm start --epic aura-dyu --role architect --model opus
# Explicitly pass tasks instead of auto-discovery
aura-swarm start --epic aura-dyu impl-001 impl-002 impl-003
# Preview what would be launched (inspect the generated prompt)
aura-swarm start --epic aura-dyu --dry-run
# Restart a stuck session
aura-swarm start --epic aura-dyu --restartaura-swarm statusPrints a table of all tracked sessions for the current repository:
epic-id tmux session alive? worktree branch # tasks
aura-dyu epic-dyu--a3d5 yes worktree/aura-dyu epic/aura-dyu 3
aura-swarm attach <epic-id>Replaces the current process with tmux attach -t <session>. Detach with
Ctrl-b d as usual.
aura-swarm stop <epic-id>
aura-swarm stop <epic-id> --dry-runKills the tmux session and removes the session record. The worktree and branch are preserved for inspection or manual cleanup.
aura-swarm merge <epic-id>
aura-swarm merge <epic-id> --dry-runRuns git merge epic/<epic-id> --no-ff from the repository root. Fails if the
worktree has uncommitted changes. On merge conflict, automatically aborts the
merge and lists conflicting files.
aura-swarm review --epic <epic-id>
aura-swarm review --epic <epic-id> --dry-runGenerates a markdown review document at docs/review-<epic-id>.md containing
the epic description, task breakdown, diff stats against main, and a review
checklist. Also creates a Beads task labeled [REVIEW] for tracking.
# Clean up a specific epic
aura-swarm cleanup <epic-id>
# Remove all merged epic branches
aura-swarm cleanup --done
# Interactive removal of all worktrees (prompts for confirmation)
aura-swarm cleanup --all
# Force removal even if worktree is dirty
aura-swarm cleanup <epic-id> --force
# Preview what would be removed
aura-swarm cleanup <epic-id> --dry-runKills any live tmux session, removes the worktree (git worktree remove),
deletes the branch, and cleans up the session record. Skips dirty worktrees
unless --force is set.
Session state persists in ~/.aura/swarm/<repo-hash>/sessions.json, where
<repo-hash> is the first 16 characters of the SHA-256 of the repository root
path. Each entry records:
| Field | Example |
|---|---|
epic_id |
aura-dyu |
epic_branch |
epic/aura-dyu |
worktree |
/home/user/repo/worktree/aura-dyu |
tmux_session |
epic-dyu--a3d5 |
started_at |
2026-02-18T14:30:00 |
model |
sonnet |
task_ids |
["impl-001", "impl-002"] |
Stale sessions (record exists but tmux is dead) are detected automatically and
can be overwritten with --restart.
Prompt files. The generated prompt is written to
~/.local/share/aura/aura-swarm/prompts/<repo-hash>-<timestamp>-prompt.md before
launch. The tmux command references this file via $(cat ...) shell expansion
rather than embedding the prompt inline, avoiding tmux's command length limit.
Role instructions (from skills/<role>/SKILL.md) are referenced by
their original path. Prompt files persist as an audit trail.
Format: epic-<suffix>--<hex4>, where <suffix> is extracted from the epic ID
(e.g. aura-dyu → dyu) and <hex4> is a random 4-character hex token
for uniqueness. Retries up to 5 times on collision.
Bumps the version across all manifest files, auto-generates a changelog from git history, commits the changes, and creates an annotated git tag.
aura-release <major|minor|patch> [options]
aura-release --check| Argument | Description |
|---|---|
major |
Bump major version (0.2.3 → 1.0.0) |
minor |
Bump minor version (0.2.3 → 0.3.0) |
patch |
Bump patch version (0.2.3 → 0.2.4) |
--check |
Validate version consistency across files and exit |
--dry-run |
Preview changes without writing files |
--sync |
Align all files to pyproject.toml version before bumping |
--no-changelog |
Skip CHANGELOG.md generation |
--no-commit |
Skip git commit |
--no-tag |
Skip git tag creation |
aura-release keeps these files in sync:
| File | Field(s) updated |
|---|---|
pyproject.toml |
[project].version (source of truth) |
.claude-plugin/plugin.json |
.version |
.claude-plugin/marketplace.json |
.metadata.version and .plugins[].version where name == "aura" |
The agentfilter plugin entry in marketplace.json is never modified.
Before making any changes, aura-release verifies:
- Not on a detached HEAD (must be on a branch)
- Working tree is clean (tracked files outside
.beads/have no uncommitted changes) - All version files are consistent (or
--syncis used to fix drift)
Generates entries in Keep a Changelog format, grouping commits by conventional commit prefix:
| Prefix | Changelog section |
|---|---|
feat |
Added |
fix |
Fixed |
refactor, perf |
Changed |
docs |
Documentation |
| everything else | Other |
On first release (no prior tags), all commits are included.
If any step fails after files have been modified, all changes are rolled back
via git checkout. The commit and tag are only created after all file writes
succeed.
# Check version consistency (detects drift between files)
aura-release --check
# Preview a patch release (no changes made)
aura-release patch --dry-run
# Fix version drift and bump patch
aura-release patch --sync
# Bump minor version
aura-release minor
# Bump without changelog or tag (files only)
aura-release patch --no-changelog --no-tag --no-commit
# After release, push manually:
git push && git push --tags| Code | Meaning |
|---|---|
| 0 | Success (or --check with consistent versions) |
| 1 | --check found version drift |
| 2 | Pre-flight failure or runtime error |
The intree mode (--swarm-mode intree) launches agents in-place without
creating worktrees. It replaces the deprecated aura-parallel command.
aura-swarm start --swarm-mode intree --role <role> -n <count> --prompt <text> [options]See aura-swarm start --help for the full list of options. Key intree-specific
flags:
| Flag | Description |
|---|---|
--prompt / --prompt-file |
Required for intree mode |
--task-id |
Beads task IDs (1:1 distribution across agents) |
--skill |
Skill to invoke at session start |
-n |
Number of parallel agents |
# Launch a supervisor to coordinate an epic
aura-swarm start --swarm-mode intree --role supervisor -n 1 \
--prompt "Read ratified plan aura-xyz and decompose into vertical slices"
# Distribute 3 tasks across 3 workers
aura-swarm start --swarm-mode intree --role worker -n 3 \
--task-id impl-001 --task-id impl-002 --task-id impl-003 \
--prompt "Implement your assigned vertical slice"
# Dry run
aura-swarm start --swarm-mode intree --role supervisor -n 1 \
--prompt "Coordinate implementation" --dry-runaura-parallel is deprecated and delegates to aura-swarm start --swarm-mode intree.
All existing aura-parallel commands continue to work but print a deprecation warning.
Both tools integrate with Beads for task tracking and inter-agent coordination.
aura-swarm start queries the epic's dependency graph via bd show <id> --json
to:
- Discover tasks — walks
dependencies(blockers) anddependents(downstream) two levels deep - Find the URD — searches for tasks labeled
aura:user:reqsin the dependency chain - Build context — formats task details into a markdown table embedded in the agent's prompt
The generated prompt includes bd show <id> commands for each discovered task,
so the launched agent can retrieve full details at runtime.
Agents coordinate exclusively through Beads — there is no dedicated messaging API:
# Assignment
bd update <task-id> --assignee=<worker>
# Status updates
bd update <task-id> --status=in_progress
bd update <task-id> --notes="Blocked on missing type definition"
# Comments (visible to all agents reading the task)
bd comments add <task-id> "Layer 1 complete, proceeding to Layer 2"
bd comments add <task-id> "VOTE: ACCEPT - End-user alignment verified"
# Completion
bd close <task-id>
# Dependency chaining
bd dep add <parent-id> --blocked-by <child-id>The --blocked-by target is always what must finish first. Work flows
bottom-up; closure flows top-down:
REQUEST ← stays open longest
└── blocked by URE
└── blocked by PROPOSAL
└── blocked by IMPL_PLAN
└── blocked by SLICE ← leaf work, closes first
# Correct: REQUEST stays open until URE finishes
bd dep add request-id --blocked-by ure-id
# Wrong: inverts the relationship
bd dep add ure-id --blocked-by request-id| Scenario | Tool | Why |
|---|---|---|
| Epic with multiple slices | aura-swarm start |
Needs isolated worktree + automatic task discovery |
| New supervisor/architect for planning | aura-swarm start --swarm-mode intree |
Long-running, needs its own tmux session |
| Plan review (3 reviewers) | general-purpose subagents |
Short-lived, results collected in-session |
| Code review (3 reviewers) | general-purpose subagents |
Short-lived, results collected in-session |
| Ad-hoc research or exploration | Task tool (Explore agent) | Quick, no orchestration needed |
Rule of thumb: if the agent needs its own persistent tmux session and
long-running context, use aura-swarm start. If the agent is
short-lived and you need to collect its result, use general-purpose subagents
(Task tool) or TeamCreate.
There are three ways to launch an Aura agent, and each loads role instructions differently:
| Launch method | Role instruction loading | When to use |
|---|---|---|
aura-swarm start |
Injected automatically via --append-system-prompt from skills/<role>/SKILL.md |
Long-running agents needing tmux sessions |
| Task tool subagent | Agent invokes /aura:<role> skill (Skill tool) as its first action |
Short-lived in-session agents (reviewers, research) |
| TeamCreate | Same as Task tool — each teammate invokes the relevant skill | Coordinated multi-agent work within a session |
Skills are not subagent types.
/aura:reviewer,/aura:worker, etc. are Skills — they load role-specific instructions fromskills/*/SKILL.mdinto the agent's context via the Skill tool. They are NOT valid values for the Task tool'ssubagent_typeparameter. Always usesubagent_type: "general-purpose"when spawning agents via the Task tool, then instruct the agent to invoke the appropriate/aura:*skill.
# Correct: general-purpose subagent invokes skill to load role
Task(
subagent_type: "general-purpose",
prompt: "Invoke /aura:reviewer to load your role. Then review PROPOSAL-1..."
)
# Wrong: "reviewer" is not a valid subagent_type
Task(subagent_type: "reviewer", prompt: "Review PROPOSAL-1...")
The skills/protocol/ directory contains the reusable Aura Protocol specification.
These files are designed to be copied or symlinked into any project using the
protocol.
| File | Purpose |
|---|---|
skills/protocol/README.md |
Protocol entry point and quick-start guide |
skills/protocol/CLAUDE.md |
Core agent directive: philosophy, constraints, roles |
skills/protocol/CONSTRAINTS.md |
Coding standards, checklists, naming conventions |
skills/protocol/PROCESS.md |
Step-by-step workflow execution (single source of truth) |
skills/protocol/AGENTS.md |
Role taxonomy: phases, tools, handoffs per agent |
skills/protocol/SKILLS.md |
Command reference: all /aura:* skills by phase |
skills/protocol/UAT_TEMPLATE.md |
User Acceptance Test structured output template |
skills/protocol/UAT_EXAMPLE.md |
Worked UAT example |
skills/protocol/schema.xml |
Canonical protocol schema (BCNF): entities, relationships, mappings |
Phase 1: REQUEST (classify → research || explore)
Phase 2: ELICIT (URE survey) → URD (single source of truth)
Phase 3: PROPOSAL-N (architect proposes)
Phase 4: PROPOSAL-N-REVIEW-{axis}-{round} (3 reviewers: A/B/C, ACCEPT/REVISE)
↺ revise → PROPOSAL-N+1 if any REVISE
Phase 5: Plan UAT (user acceptance test)
Phase 6: Ratification (old proposals marked aura:superseded)
Phase 7: Handoff (architect → supervisor)
Phase 8: IMPL_PLAN (supervisor decomposes into vertical slices)
Phase 9: SLICE-N (parallel workers, each owns one production code path)
Within each slice: Types (L1) → Tests (L2, fail expected) → Impl (L3, tests pass)
Phase 10: Code review (3 reviewers, severity tree: BLOCKER/IMPORTANT/MINOR)
Phase 11: Implementation UAT
Phase 12: Landing (commit, push, hand off)
Each skills/*/SKILL.md file defines a Skill that can be invoked via the
Skill tool as /aura:<skill-name>. When invoked, the skill's SKILL.md content
is loaded into the agent's context, providing role-specific instructions,
workflows, and constraints.
Skills serve two purposes depending on the launch method:
- CLI tool (
aura-swarm): Role instructions are injected automatically via--append-system-prompt. The--skillflag can invoke an additional skill at startup. - Task tool subagents: The agent must invoke the skill itself (e.g.
/aura:reviewer) as its first action to load role instructions.
These top-level role skills load the full agent persona (workflow, constraints, voting procedures, etc.):
| Skill | Description |
|---|---|
/aura:architect |
Specification writer and implementation designer |
/aura:supervisor |
Task coordinator, spawns workers, manages execution |
/aura:worker |
Vertical slice implementer (full production code path) |
/aura:reviewer |
End-user alignment reviewer for plans and code |
/aura:epoch |
Master orchestrator for full 12-phase workflow |
| Skill | Phase | Description |
|---|---|---|
/aura:architect-propose-plan |
3 | Create PROPOSAL-N task |
/aura:architect-request-review |
4 | Spawn 3 axis-specific reviewers |
/aura:architect-ratify |
6 | Ratify proposal (label aura:p6-plan:s6-ratify) |
/aura:architect-handoff |
7 | Hand off to supervisor |
| Skill | Phase | Description |
|---|---|---|
/aura:supervisor-plan-tasks |
8 | Decompose plan into slices |
/aura:supervisor-spawn-worker |
9 | Launch workers for slices |
/aura:supervisor-track-progress |
9-10 | Monitor layer completion |
/aura:supervisor-commit |
9-10 | Atomic commit per layer |
| Skill | Description |
|---|---|
/aura:worker-implement |
Implement assigned vertical slice |
/aura:worker-complete |
Signal task completion |
/aura:worker-blocked |
Report blocker to supervisor |
| Skill | Description |
|---|---|
/aura:reviewer-review-plan |
Evaluate proposal against 6 criteria |
/aura:reviewer-review-code |
Review implementation slices |
/aura:reviewer-comment |
Leave structured feedback via Beads |
/aura:reviewer-vote |
Cast ACCEPT or REVISE vote |
| Skill | Description |
|---|---|
/aura:status |
Project status and monitoring |
/aura:impl-slice |
Vertical slice assignment and tracking |
/aura:impl-review |
Code review across all implementation slices |
/aura:user-request |
Capture user feature request (Phase 1) |
/aura:user-elicit |
User requirements elicitation survey (Phase 2) |
/aura:user-uat |
User acceptance testing (Phase 5/11) |
aura-plugins/
├── .claude-plugin/ Plugin manifests
│ ├── marketplace.json
│ └── plugin.json
├── bin/ Operational tooling (add to PATH)
│ ├── aura-parallel Deprecated wrapper → aura-swarm start --swarm-mode intree
│ ├── aura-release Version bump, changelog, and git tag
│ └── aura-swarm Unified agent orchestration (worktree + intree modes)
├── skills/ Plugin skills (SKILL.md per directory)
│ ├── architect/ Architect orchestrator
│ ├── epoch/ Master orchestrator
│ ├── protocol/ Reusable protocol documentation
│ │ ├── PROCESS.md Workflow execution (single source of truth)
│ │ ├── CLAUDE.md Core agent directive
│ │ ├── CONSTRAINTS.md Coding standards and checklists
│ │ ├── AGENTS.md Role taxonomy
│ │ ├── SKILLS.md Skill reference by phase
│ │ ├── schema.xml Canonical protocol schema
│ │ └── ... Templates, examples, migration docs
│ ├── reviewer/ Reviewer orchestrator
│ ├── supervisor/ Supervisor orchestrator
│ ├── worker/ Worker orchestrator
│ └── .../ 35+ role-specific skills
├── flake.nix Nix packaging + Home Manager module entry
├── nix/hm-module.nix Home Manager module implementation
├── pyproject.toml Python project metadata
├── scripts/ Python packages
│ ├── aura_protocol/ Protocol engine (types, state machine, constraints, workflow)
│ │ ├── types.py Typed enums (StrEnum), frozen dataclass specs, canonical dicts
│ │ ├── state_machine.py 12-phase EpochStateMachine with consensus/blocker gates
│ │ ├── constraints.py RuntimeConstraintChecker — all 26 C-* validators
│ │ ├── context_injection.py Role/phase context builders + prompt renderers
│ │ ├── schema_parser.py XML → Python spec parser (SchemaParseError)
│ │ ├── gen_schema.py Python → schema.xml generator (diff mode)
│ │ ├── gen_skills.py SKILL.md header generator (Jinja2, diff mode)
│ │ ├── gen_types.py Bootstrap codegen for types.py
│ │ ├── audit_activities.py Temporal search attribute definitions
│ │ ├── workflow.py Temporal workflow wrapper (signals, queries, search attributes)
│ │ ├── interfaces.py Protocol interfaces (runtime_checkable) + A2A content types
│ │ └── __init__.py Public API re-exports
│ └── validate_schema.py 3-layer schema.xml validation (structural, referential, semantic)
├── tests/ Test suite (1370+ tests)
│ ├── test_aura_types.py Enum completeness, frozen dataclass immutability, dict coverage
│ ├── test_schema_types_sync.py Field-level Python ↔ schema.xml sync verification
│ ├── test_state_machine.py State machine transitions, consensus gates, blocker gates
│ ├── test_constraints.py All 26 C-* runtime validators (BDD-style, class-per-constraint)
│ ├── test_workflow.py Temporal sandbox: signals, queries, search attributes
│ ├── test_interfaces.py Protocol satisfaction, A2A types, ModelId parsing
│ ├── test_validate_schema.py CLI validation, schema mutation testing
│ ├── test_gen_skills.py SKILL.md generator: marker parsing, rendering, init mode
│ └── conftest.py Shared fixtures (_advance_to, _make_state, sm, sm_at_p4)
├── agents/ Custom agent definitions
│ └── tester.md BDD test writer agent
├── AGENTS.md Agent orchestration guide
└── README.md
The aura_protocol Python package provides a machine-executable implementation
of the 12-phase Aura protocol. It is the programmatic backbone that enforces
workflow state transitions, constraint validation, and Temporal-backed durable
execution.
| Version | Scope | Status |
|---|---|---|
| v1 (v0.4.3) | State machine + Temporal workflow + 26 C-* constraint validators | Done |
| v2 | Schema-driven code generation + runtime context injection | Done |
| v3 | Full Temporal workflow engine (phases as workflows, handoffs as signals) | Future |
types.py (enums, specs, canonical dicts)
│
├─→ state_machine.py (EpochStateMachine — pure Python, no Temporal dep)
│ │
│ └─→ workflow.py (Temporal wrapper: signals, queries, search attributes)
│
├─→ constraints.py (RuntimeConstraintChecker — all 23 C-* validators)
│
└─→ interfaces.py (Protocol interfaces for cross-project integration)
Key design decisions:
- All spec types are frozen dataclasses (immutable, hashable, safe for Temporal serialization)
- All enums are
strEnums (JSON/Temporal serialization compatible) - State machine is pure Python — Temporal wrapper is a thin layer on top
- Constraint validators use DI (accept optional specs dicts for testing)
- Integration interfaces use
typing.Protocol(structural subtyping, no inheritance required)
# Run full test suite (1370+ tests)
uv run pytest tests/ --tb=short -q
# Run specific module
uv run pytest tests/test_state_machine.py -v
# Run schema validation
PYTHONPATH=scripts uv run python scripts/validate_schema.py skills/protocol/schema.xmlRole SKILL.md files (supervisor, worker, reviewer, architect) have a
generated header section delimited by <!-- BEGIN GENERATED FROM aura schema -->
/ <!-- END GENERATED FROM aura schema --> markers. After changing
types.py, context_injection.py, or skills/templates/skill_header.j2:
# Regenerate all role SKILL.md headers (prints diff, writes in-place)
PYTHONPATH=scripts uv run python -m aura_protocol.gen_skills
# Regenerate schema.xml from types.py (prints diff, writes in-place)
PYTHONPATH=scripts uv run python -m aura_protocol.gen_schemaHand-authored body content (below the END marker) is preserved on every run.
# Verify Nix flake evaluates cleanly
nix flake check --no-build 2>&1
# Build packages
nix build .#aura-swarm --no-link
# Test CLI help output
nix run .#aura-swarm -- --help
# Check version consistency across manifests
bin/aura-release --check
# Run protocol engine tests
uv run pytest tests/ --tb=short -qMIT