Create Sindri V2 extensions for the Bash/Docker platform. Use this when authoring V2 extensions, understanding the V2 extension.yaml structure, validating against the V2 schema, or working with VisionFlow extensions. Covers the mise, apt, binary, npm, script, and hybrid install methods, as well as the capabilities system.
V2 extensions are YAML-driven, declarative configurations for the Bash/Docker-based Sindri platform.
| Resource | Path |
|----------|------|
| Extensions Directory | v2/docker/lib/extensions/ |
| Schema | v2/docker/lib/schemas/extension.schema.json |
| Registry | v2/docker/lib/registry.yaml |
| Categories | v2/docker/lib/categories.yaml |
| Profiles | v2/docker/lib/profiles.yaml |
| Extension Docs | docs/extensions/{NAME}.md |
| VisionFlow Docs | docs/extensions/vision-flow/VF-{NAME}.md |
# Valid V2 categories
- base # Core system components
- agile # Project management (Jira, Linear)
- language # Programming runtimes
- dev-tools # Development tools
- infrastructure # Cloud/container tools
- ai # AI/ML tools
- database # Database servers
- monitoring # Observability tools
- mobile # Mobile SDKs
- desktop # GUI environments
- utilities # General tools
v2/docker/lib/extensions/{name}/extension.yaml with required sectionsv2/docker/lib/registry.yaml./v2/cli/extension-manager validate {name}./v2/cli/extension-manager install {name}docs/extensions/{NAME}.mdv2/docs/EXTENSIONS.mdv2/docker/lib/extensions/{name}/
├── extension.yaml # Required: Main definition
├── mise.toml # Optional: mise configuration
├── scripts/ # Optional: Custom scripts
│ ├── install.sh
│ ├── uninstall.sh
│ └── validate.sh
└── templates/ # Optional: Config templates
└── config.template
metadata:
name: my-extension
version: 1.0.0
description: Brief description (10-200 chars)
category: dev-tools
dependencies: []
install:
method: mise
mise:
configFile: mise.toml
validate:
commands:
- name: mytool
versionFlag: --version
expectedPattern: "v\\d+\\.\\d+\\.\\d+"
install:
method: mise
mise:
configFile: mise.toml
reshimAfterInstall: true
install:
method: apt
apt:
repositories:
- name: docker
key: https://download.docker.com/linux/ubuntu/gpg
url: https://download.docker.com/linux/ubuntu
suite: jammy
component: stable
packages:
- docker-ce
- docker-ce-cli
install:
method: binary
binary:
url: https://github.com/org/repo/releases/download/v1.0.0/tool.tar.gz
extract: tar.gz # tar.gz, zip, or none
destination: ~/.local/bin/tool
install:
method: npm
npm:
packages:
- typescript
- eslint@8.0.0
global: true
install:
method: script
script:
path: scripts/install.sh
timeout: 300
install:
method: hybrid
hybrid:
steps:
- method: apt
apt:
packages: [build-essential]
- method: script
script:
path: scripts/install.sh
Most extensions don't need capabilities. Only use for extensions requiring:
claude-flow init)capabilities:
# Project initialization
project-init:
enabled: true
commands:
- command: "mytool init --force"
description: "Initialize mytool"
requiresAuth: anthropic # or: openai, github, none
conditional: false
state-markers:
- path: ".mytool"
type: directory
description: "Config directory"
validation:
command: "mytool --version"
expectedPattern: "^\\d+\\.\\d+"
# Authentication
auth:
provider: anthropic
required: false
methods: [api-key, cli-auth]
envVars: [ANTHROPIC_API_KEY]
validator:
command: "claude --version"
expectedExitCode: 0
features:
- name: agent-spawn
requiresApiKey: false
description: "CLI-based features"
# Lifecycle hooks
hooks:
pre-install:
command: "echo 'Preparing...'"
description: "Pre-install checks"
post-install:
command: "mytool --version"
description: "Verify installation"
# MCP server
mcp:
enabled: true
server:
command: "npx"
args: ["-y", "@mytool/mcp", "start"]
env:
MYTOOL_MCP_MODE: "1"
tools:
- name: "mytool-action"
description: "Perform action"
Add to v2/docker/lib/registry.yaml:
extensions:
my-extension:
category: dev-tools
description: Short description
dependencies: [nodejs]
protected: false
# Validate single extension
./v2/cli/extension-manager validate my-extension
# Validate all extensions
./v2/cli/extension-manager validate-all
# Check extension info
./v2/cli/extension-manager info my-extension
# Test installation
./v2/cli/extension-manager install my-extension
# Check status
./v2/cli/extension-manager status my-extension
# v2/docker/lib/extensions/nodejs/extension.yaml
metadata:
name: nodejs
version: 1.0.0
description: Node.js LTS via mise
category: language
install:
method: mise
mise:
configFile: mise.toml
validate:
commands:
- name: node
expectedPattern: "v\\d+\\.\\d+\\.\\d+"
- name: npm
bom:
tools:
- name: node
version: dynamic
source: mise
type: runtime
license: MIT
# Extensions like claude-flow-v2, agentic-qe, spec-kit
metadata:
name: ai-tool
version: 1.0.0
description: AI-powered tool
category: ai
dependencies: [nodejs]
install:
method: mise
mise:
configFile: mise.toml
capabilities:
project-init:
enabled: true
commands:
- command: "ai-tool init"
description: "Initialize project"
requiresAuth: anthropic
state-markers:
- path: ".ai-tool"
type: directory
auth:
provider: anthropic
methods: [api-key, cli-auth]
mcp:
enabled: true
server:
command: "npx"
args: ["-y", "@ai-tool/mcp"]
tools:
- name: "ai-tool-action"
description: "Perform AI action"
VisionFlow extensions use the vf- prefix and are only available in V2:
v2/docker/lib/extensions/vf-{name}/
├── extension.yaml
└── ...
Document in: docs/extensions/vision-flow/VF-{NAME}.md
V2 supports 158+ shell aliases defined in extensions. These are configured in the configure.environment section with scope: bashrc.
All scripts must:
#!/usr/bin/env bash
set -euo pipefail
echo "Installing..."
# Commands here
echo "Done"
After creating an extension, update:
v2/docker/lib/registry.yamldocs/extensions/{NAME}.mdv2/docs/EXTENSIONS.mdv2/docker/lib/profiles.yaml| Issue | Solution | |-------|----------| | Schema validation fails | Check YAML syntax, verify required fields | | Dependencies not found | Add to registry.yaml first | | Install times out | Increase timeout in script section | | Validation fails | Check regex escaping in expectedPattern |
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer