Guide users through creating Sindri extensions...
Recent Addition (Jan 2026): Sindri now supports an optional capabilities system for advanced extensions:
project-init)auth)hooks)mcp)Most extensions don't need capabilities - they're only for extensions that extend project management functionality (like Claude Flow, Agentic QE, Spec-Kit). Regular extensions (nodejs, python, docker) work exactly as before.
For reliable extension creation with all documentation updates, use these commands:
| Command | Purpose |
|---|---|
/extension/new <name> [source] |
Create new extension with complete documentation workflow |
/extension/update-docs <name> |
Update documentation for existing extension |
Example:
/extension/new mdflow https://github.com/johnlindquist/mdflow
/extension/update-docs nodejs
These commands enforce the complete workflow including all required documentation updates.
This skill guides you through creating declarative YAML extensions for Sindri. Extensions are YAML files, not bash scripts - all configuration is driven by declarative YAML definitions.
IMPORTANT: After creating any extension, you must update the relevant documentation.
| Type | Path | Purpose |
|---|---|---|
| Schema | v2/docker/lib/schemas/extension.schema.json |
Extension validation schema |
| Registry | v2/docker/lib/registry.yaml |
Master extension registry |
| Profiles | v2/docker/lib/profiles.yaml |
Extension profile definitions |
| Categories | v2/docker/lib/categories.yaml |
Category definitions |
| Extension Docs | docs/extensions/{NAME}.md |
Individual extension documentation |
| Catalog | v2/docs/EXTENSIONS.md |
Overview of all extensions |
| Authoring Guide | v2/docs/EXTENSION_AUTHORING.md |
Detailed authoring reference |
| Slides | docs/slides/extensions.html |
Visual presentation |
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}v2/docker/lib/extensions/{extension-name}/
├── extension.yaml # Required: Main definition
├── scripts/ # Optional: Custom scripts
│ ├── install.sh # Custom installation
│ ├── uninstall.sh # Custom removal
│ └── validate.sh # Custom validation
├── templates/ # Optional: Config templates
│ └── config.template
└── mise.toml # Optional: mise configuration
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+"
Extensions consist of required sections (metadata, install, validate) and optional sections (requirements, configure, remove, upgrade, bom, capabilities).
IMPORTANT: Capabilities are OPTIONAL - Most extensions (nodejs, python, docker, etc.) don't need capabilities. Only extensions requiring project initialization, authentication, lifecycle hooks, or MCP integration need the capabilities section.
metadata:
name: extension-name # lowercase with hyphens
version: 1.0.0 # semantic versioning
description: What it does # 10-200 characters
category: dev-tools # see categories below
author: Your Name # optional
homepage: https://... # optional
dependencies: # other extensions needed
- nodejs
- python
Valid Categories:
base - Core system componentslanguage - Programming runtimes (Node.js, Python, etc.)dev-tools - Development tools (linters, formatters)infrastructure - Cloud/container tools (Docker, K8s, Terraform)ai - AI/ML tools and frameworksagile - Project management tools (Jira, Linear)database - Database serversmonitoring - Observability toolsmobile - Mobile SDKsdesktop - GUI environmentsutilities - General toolsrequirements:
domains: # Network access needed
- api.github.com
- registry.npmjs.org
diskSpace: 500 # MB required
secrets: # Credentials needed
- GITHUB_TOKEN
Choose ONE installation method:
mise (recommended for language tools):
install:
method: mise
mise:
configFile: mise.toml # Reference to mise config
reshim: true # Rebuild shims after install
apt (system packages):
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
binary (direct download):
install:
method: binary
binary:
url: https://github.com/org/repo/releases/download/v1.0.0/tool-linux-amd64.tar.gz
extract: tar.gz # tar.gz, zip, or none
destination: ~/.local/bin/tool
npm (Node.js packages):
install:
method: npm
npm:
packages:
- typescript
- eslint
global: true
script (custom installation):
install:
method: script
script:
path: scripts/install.sh
timeout: 300 # seconds (default: 300)
hybrid (multiple methods):
install:
method: hybrid
hybrid:
steps:
- method: apt
apt:
packages: [build-essential]
- method: script
script:
path: scripts/install.sh
configure:
templates:
- source: templates/config.template
destination: ~/.config/tool/config.yaml
mode: overwrite # overwrite|append|merge|skip-if-exists
environment:
- key: TOOL_HOME
value: $HOME/.tool
scope: bashrc # bashrc|profile|session
validate:
commands:
- name: tool-name
versionFlag: --version
expectedPattern: "\\d+\\.\\d+\\.\\d+"
mise:
tools:
- node
- python
minToolCount: 2
script:
path: scripts/validate.sh
timeout: 60
remove:
confirmation: true
mise:
removeConfig: true
tools: [node, python]
apt:
packages: [package-name]
purge: false
script:
path: scripts/uninstall.sh
paths:
- ~/.config/tool
- ~/.local/share/tool
upgrade:
strategy: automatic # automatic|manual|none
mise:
upgradeAll: true
apt:
packages: [package-name]
updateFirst: true
script:
path: scripts/upgrade.sh
bom:
tools:
- name: node
version: dynamic # or specific version
source: mise
type: runtime
license: MIT
homepage: https://nodejs.org
Use capabilities when your extension needs:
claude-flow init, spec-kit init)Most extensions don't need capabilities. Only use this for extensions that extend project management functionality.
capabilities:
# Project initialization (optional)
project-init:
enabled: true
commands:
- command: "mytool init --force"
description: "Initialize mytool project"
requiresAuth: anthropic # or: openai, github, none
conditional: false # true = only run if condition met
state-markers:
- path: ".mytool"
type: directory
description: "Mytool configuration directory"
- path: ".mytool/config.json"
type: file
description: "Mytool config file"
validation:
command: "mytool --version"
expectedPattern: "^\\d+\\.\\d+\\.\\d+"
expectedExitCode: 0
# Authentication (optional)
auth:
provider: anthropic # or: openai, github, custom
required: false # true = block installation without auth
methods:
- api-key # API key in environment variable
- cli-auth # CLI authentication (e.g., Max/Pro plan)
envVars:
- ANTHROPIC_API_KEY
validator:
command: "claude --version"
expectedExitCode: 0
features:
- name: agent-spawn
requiresApiKey: false
description: "CLI-based features"
- name: api-integration
requiresApiKey: true
description: "Direct API features"
# Lifecycle hooks (optional)
hooks:
pre-install:
command: "echo 'Preparing installation...'"
description: "Pre-installation checks"
post-install:
command: "mytool --version"
description: "Verify installation"
pre-project-init:
command: "mytool doctor --check"
description: "Pre-init health check"
post-project-init:
command: "echo 'Project initialized'"
description: "Post-init notification"
# MCP server registration (optional)
mcp:
enabled: true
server:
command: "npx"
args:
- "-y"
- "@mytool/mcp-server"
- "start"
env:
MYTOOL_MCP_MODE: "1"
tools:
- name: "mytool-action"
description: "Perform mytool action"
- name: "mytool-query"
description: "Query mytool data"
# Feature configuration (optional, V3+ extensions)
features:
core:
daemon_autostart: true
unified_config: true
advanced:
plugin_system: true
security_scanning: false
Capability Guidelines:
conditional: true for optional setup stepsfeatures array)After creating your extension, add it 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
Best for: Node.js, Python, Go, Rust, Ruby
method: mise with a mise.toml config fileBest for: TypeScript, ESLint, Prettier
nodejs extensionmethod: npm with global packagesBest for: GitHub releases, standalone binaries
method: binary with GitHub release URLBest for: Desktop environments, multi-step installs
method: hybrid with ordered stepsBest for: Claude Flow, Agentic QE, Spec-Kit
.claude/, .agentic-qe/, .github/spec.json)claude-flow-v3, spec-kit, agentic-qeCurrent Extensions Using Capabilities:
| Extension | project-init | auth | hooks | mcp | Notes |
|---|---|---|---|---|---|
| claude-flow-v2 | ✓ | anthropic | ✓ | ✓ | Stable, 158+ aliases |
| claude-flow-v3 | ✓ | anthropic | ✓ | ✓ | Alpha, 10x performance, 15 tools |
| agentic-qe | ✓ | anthropic | ✓ | ✓ | AI-powered testing |
| spec-kit | ✓ | none | ✓ | - | GitHub spec documentation |
| agentic-flow | ✓ | anthropic | ✓ | ✓ | Multi-agent workflows |
All scripts must:
#!/usr/bin/env bashset -euo pipefail$HOME, $WORKSPACE environment variablesExample:
#!/usr/bin/env bash
set -euo pipefail
echo "Installing my-tool..."
# Installation commands here
echo "my-tool installed successfully"
| Issue | Solution |
|---|---|
| Schema validation fails | Check YAML syntax, verify required fields |
| Dependencies not found | Add missing extensions to registry.yaml |
| Install times out | Increase timeout in script section |
| Validation fails | Check expectedPattern regex escaping |
| Permission denied | Scripts must be executable |
CRITICAL: After creating or modifying an extension, you MUST complete these documentation updates:
Registry Entry - Add to v2/docker/lib/registry.yaml
extensions:
my-extension:
category: dev-tools
description: Short description
dependencies: []
Extension Documentation - Create docs/extensions/{NAME}.md
NODEJS.md, AI-TOOLKIT.md)docs/extensions/vision-flow/VF-{NAME}.md Extension Catalog - Update v2/docs/EXTENSIONS.md
Profiles - If adding extension to profiles:
v2/docker/lib/profiles.yamlv2/docs/EXTENSIONS.mdCategories - If adding new category:
v2/docker/lib/categories.yamlv2/docker/lib/schemas/extension.schema.json (category enum)v2/docs/EXTENSIONS.mdSchema - If adding new extension fields:
v2/docker/lib/schemas/extension.schema.jsondocs/SCHEMA.mdREFERENCE.md in this skillSlides - If extension is notable/featured:
docs/slides/extensions.htmldocs/extensions/vision-flow/README.mddocs/extensions/vision-flow/CAPABILITY-CATALOG.md# Validate YAML files
pnpm validate:yaml
# Lint markdown
pnpm lint:md
# Validate extension
./v2/cli/extension-manager validate {name}
When creating docs/extensions/{NAME}.md, use this template:
# {Extension Name}
{Brief description of what the extension provides.}
## Overview
{More detailed explanation of the extension's purpose and capabilities.}
## Installation
\`\`\`bash
extension-manager install {name}
\`\`\`
## What Gets Installed
- {Tool 1} - {purpose}
- {Tool 2} - {purpose}
## Configuration
{Any configuration options or environment variables.}
## Usage
{Usage examples.}
## Dependencies
{List any extension dependencies.}
## Requirements
- **Disk Space:** {X} MB
- **Network:** {domains accessed}
- **Secrets:** {optional secrets}
## Related Extensions
- {Related extension 1}
- {Related extension 2}
v2/docker/lib/schemas/extension.schema.jsonv2/docker/lib/registry.yamlv2/docker/lib/categories.yamlv2/docker/lib/profiles.yamlv2/docker/lib/extensions/*/extension.yamlFor detailed field reference, see REFERENCE.md. For complete examples, see EXAMPLES.md.
Tip: Use Glob and Grep tools to discover current documentation files dynamically:
# Find all extension docs
ls docs/extensions/*.md
# Find VisionFlow docs
ls docs/extensions/vision-flow/*.md