Skip to content

Manifest Reference

The wave.yaml manifest is the single source of truth for Wave configuration.

Minimal Manifest

yaml
apiVersion: v1
kind: WaveManifest
metadata:
  name: my-project
adapters:
  claude:
    binary: claude
    mode: headless
personas:
  navigator:
    adapter: claude
    system_prompt_file: .wave/personas/navigator.md
runtime:
  workspace_root: /tmp/wave

Copy this to wave.yaml and run wave validate to verify.


Complete Example

yaml
apiVersion: v1
kind: WaveManifest
metadata:
  name: acme-backend
  description: "Backend API service"
  repo: https://github.com/acme/backend

adapters:
  claude:
    binary: claude
    mode: headless
    output_format: json
    project_files:
      - CLAUDE.md
    default_permissions:
      allowed_tools: ["Read", "Write", "Bash"]
      deny: []

personas:
  navigator:
    adapter: claude
    description: "Read-only codebase exploration"
    system_prompt_file: .wave/personas/navigator.md
    temperature: 0.1
    permissions:
      allowed_tools: ["Read", "Glob", "Grep"]
      deny: ["Write(*)", "Edit(*)"]

  craftsman:
    adapter: claude
    description: "Implementation and testing"
    system_prompt_file: .wave/personas/craftsman.md
    temperature: 0.7
    permissions:
      allowed_tools: ["Read", "Write", "Edit", "Bash"]
      deny: ["Bash(rm -rf /*)"]

  auditor:
    adapter: claude
    description: "Security and quality review"
    system_prompt_file: .wave/personas/auditor.md
    temperature: 0.1
    permissions:
      allowed_tools: ["Read", "Grep", "Bash(npm audit*)"]
      deny: ["Write(*)", "Edit(*)"]

runtime:
  workspace_root: /tmp/wave
  max_concurrent_workers: 5
  default_timeout_minutes: 30
  relay:
    token_threshold_percent: 80
    strategy: summarize_to_checkpoint
  audit:
    log_dir: .wave/traces/
    log_all_tool_calls: true

Top-Level Fields

FieldRequiredDescription
apiVersionyesSchema version (v1)
kindyesMust be WaveManifest
metadatayesProject identification
adaptersyesLLM CLI configurations
personasyesAgent configurations
runtimeyesExecution settings
skillsnoNamed skill configurations

Metadata

yaml
metadata:
  name: my-project
  description: "Project description"
  repo: https://github.com/org/repo
FieldRequiredDescription
nameyesProject identifier
descriptionnoHuman-readable description
reponoRepository URL

Adapters

An adapter wraps an LLM CLI for subprocess execution.

yaml
adapters:
  claude:
    binary: claude
    mode: headless
    output_format: json
    project_files:
      - CLAUDE.md
      - .claude/settings.json
    default_permissions:
      allowed_tools: ["Read", "Write"]
      deny: ["Bash(rm *)"]
FieldRequiredDefaultDescription
binaryyes-CLI binary name (must be on PATH)
modeyes-Execution mode (headless)
output_formatnojsonExpected output format
project_filesno[]Files to copy into workspaces
default_permissionsnoallow allDefault tool permissions

Personas

A persona defines an AI agent with specific permissions and behavior.

Read-Only Persona

yaml
personas:
  navigator:
    adapter: claude
    description: "Read-only codebase exploration"
    system_prompt_file: .wave/personas/navigator.md
    temperature: 0.1
    permissions:
      allowed_tools: ["Read", "Glob", "Grep"]
      deny: ["Write(*)", "Edit(*)", "Bash(*)"]

Full-Access Persona

yaml
personas:
  craftsman:
    adapter: claude
    description: "Implementation and testing"
    system_prompt_file: .wave/personas/craftsman.md
    temperature: 0.7
    permissions:
      allowed_tools: ["Read", "Write", "Edit", "Bash"]
      deny: ["Bash(rm -rf /*)"]

Persona Fields

FieldRequiredDefaultDescription
adapteryes-References adapter key
system_prompt_fileyes-Path to system prompt
descriptionno""Human-readable purpose
temperaturenoadapter defaultLLM temperature (0.0-1.0)
permissionsnoinherit adapterTool access control
hooksno{}Pre/post tool hooks

Temperature Guidelines

RangeUse Case
0.0-0.2Deterministic: analysis, auditing
0.3-0.5Balanced: specification, planning
0.6-0.8Creative: implementation

Permissions

Tool access control using glob patterns.

yaml
permissions:
  allowed_tools:
    - "Read"                # All Read calls
    - "Write(src/*.ts)"     # Write to TypeScript in src/
    - "Bash(npm test*)"     # Only npm test commands
  deny:
    - "Write(*.env)"        # Never write env files
    - "Bash(rm -rf *)"      # Block destructive commands

Evaluation order:

  1. Check deny - any match blocks the call
  2. Check allowed_tools - any match permits the call
  3. No match - blocked (implicit deny)

Common Patterns

PatternMatches
ReadAll Read calls
Write(*)All Write calls
Write(src/*.ts)Write to .ts files in src/
Bash(git *)Git commands only
Bash(npm test*)npm test commands
*All tool calls

Hooks

Execute shell commands at tool call boundaries.

yaml
personas:
  craftsman:
    adapter: claude
    system_prompt_file: .wave/personas/craftsman.md
    hooks:
      PreToolUse:
        - matcher: "Bash(git commit*)"
          command: ".wave/hooks/pre-commit-lint.sh"
      PostToolUse:
        - matcher: "Write(src/**)"
          command: "npm test --silent"

PreToolUse: Non-zero exit blocks the tool call.

PostToolUse: Informational only, does not block.


Runtime

Global execution settings.

yaml
runtime:
  workspace_root: /tmp/wave
  max_concurrent_workers: 5
  default_timeout_minutes: 30
  relay:
    token_threshold_percent: 80
    strategy: summarize_to_checkpoint
  audit:
    log_dir: .wave/traces/
    log_all_tool_calls: true
    log_all_file_operations: false
  meta_pipeline:
    max_depth: 2
    max_total_steps: 20
    timeout_minutes: 60

Runtime Fields

FieldDefaultDescription
workspace_root/tmp/waveWorkspace directory
max_concurrent_workers5Parallel matrix workers
default_timeout_minutes30Per-step timeout

Relay Settings

FieldDefaultDescription
token_threshold_percent80Context limit trigger
strategysummarize_to_checkpointCompaction strategy

Audit Settings

FieldDefaultDescription
log_dir.wave/traces/Audit log directory
log_all_tool_callsfalseLog every tool call
log_all_file_operationsfalseLog file operations

Meta-Pipeline Limits

FieldDefaultDescription
max_depth2Recursion limit
max_total_steps20Total steps across levels
max_total_tokens500000Token consumption limit
timeout_minutes60Hard timeout

Skills

Declare external skills with install, check, and provisioning commands.

yaml
skills:
  speckit:
    install: "npm install -g @anthropic/speckit"
    check: "speckit --version"
  golangci-lint:
    install: "go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"
    check: "golangci-lint --version"

Each skill is referenced by name from pipeline requires.skills blocks.


Validation

bash
wave validate

Output:

Validating wave.yaml...
  Adapters: 1 defined
  Personas: 3 defined
  Pipelines: 2 discovered

All validation checks passed.

Validation Checks

CheckSeverity
Adapter references validerror
System prompt files existerror
Hook scripts existerror
Binary on PATHwarning
Required fields presenterror
Value ranges validerror

Next Steps

Released under the MIT License.