SDK
Workflows, agents, prompts, rules, and themes ship as extension packs: plain YAML and Markdown loaded by the app. These pages are the authoring guides. Engine contracts — Resolve algebra, prompt assembly, the host threat model — live in the product repository.
A pack is a directory in a git repo; a project override is a file committed under {repo}/.paintedwolf/.
What you can build
| Surface | You write | Guide |
|---|---|---|
| Your first pack | A workflow, a rule, and an inject — end to end in ten minutes | Build your first pack |
| Extension packs | A directory of units + extension.yaml, installable from a git URL | Extension packs |
| Custom workflows | workflow.yaml manifests — phases, gates, transitions | Custom workflows |
| Open Agent Rules | Portable guardrail YAML — typed conditions, declared effects | Open Agent Rules |
| Agents | Persona YAML with tool profiles as the capability ceiling | Agents |
| Prompts | Template overlays and lifecycle injects | Prompts |
| MCP & scanners | Typed result bindings; scanner rows stay in Settings | MCP & scanners |
| Themes | Colours for a closed token vocabulary, with a contrast floor | Themes |
| Reference | Directory map, CLI, schemas, stability | Reference |
| Host API | Local REST + SSE for sessions, extensions, MCP, and scanners | Host API |
Put pw on your PATH before the tutorial — see Command-line tool.
The three layers
Everything resolves in the same order, and the higher layer wins:
| Layer | Where | Scope |
|---|---|---|
| Bundled | shipped inside the app | The stock packs — always current with the app |
| Device | ~/.config/paintedwolf/ | Installed packs and desired state for every project on this machine |
| Project | {repo}/.paintedwolf/ | Committed with your code — the whole team gets the same behavior |
A project’s pack can add shared and additive units, and can disable or own shared units freely — but it cannot strip device enforcement, and some kinds never leave the device at all. The property table is on Extension packs → Unit kind properties.
Vocabulary tables on these pages are generated from the v1 engine. Packs declare host compatibility with compatibility.extension_api. See Reference for schemas and the stability contract.