Release Notes - v0.8.0¶
Release Date: 2026-05-23
Overview¶
This release adds the loader/ and installer/ packages for loading SKILL.md markdown skills and managing their dependencies. It also introduces CommandTool for wrapping CLI commands as callable tools.
Installation¶
Requires Go 1.24+ and MCP Go SDK v1.6.1+.
Highlights¶
- New
loader/package for loading SKILL.md markdown skills - New
installer/package for managing skill dependencies CommandToolwrapper for exposing CLI commands as tools
What's New¶
Loader Package¶
The loader package provides a unified interface for loading skills from various formats:
import "github.com/plexusone/omniskill/loader"
// Load a SKILL.md file
skill, err := loader.LoadMarkdownSkill("path/to/SKILL.md")
// Discover all skills in a directory
skills, err := loader.DiscoverSkills("./skills")
// Unified loader with Go preference
ul := loader.NewUnifiedLoader()
ul.RegisterGo("weather", func() skill.Skill { return &WeatherSkill{} })
s, format, err := ul.Load("./skills/weather")
MarkdownSkill¶
Parses OpenClaw-format SKILL.md files with YAML frontmatter:
---
name: notcrawl
description: "Notion archive search"
metadata:
openclaw:
requires:
bins: [notcrawl]
install:
- kind: go
module: github.com/user/notcrawl@latest
---
# Usage
Search your archive:
```bash
notcrawl search "query"
The parser:
- Extracts metadata from YAML frontmatter
- Discovers commands from code blocks
- Generates tools with parameter extraction
- Verifies required binaries on init
#### UnifiedLoader
Loads skills from directories, preferring Go implementations when registered:
```go
loader := loader.NewUnifiedLoader()
// Register Go implementations
loader.RegisterGo("weather", NewWeatherSkill)
// Load - uses Go if registered, falls back to SKILL.md
skill, format, err := loader.Load("./skills/weather")
// Load all skills from directory
skills, err := loader.LoadAll("./skills")
Installer Package¶
The installer package handles skill dependencies:
import "github.com/plexusone/omniskill/installer"
// Install dependencies
mgr := installer.NewManager()
mgr.Install(ctx, []loader.InstallStep{
{Kind: "go", Module: "github.com/user/tool@latest"},
{Kind: "npm", Module: "some-cli"},
})
// Install from source
si := installer.NewSkillInstaller()
skill, err := si.Install(ctx, "github.com/user/skills/weather@v1.0.0")
Manager¶
Supports multiple package managers:
| Kind | Command |
|---|---|
go |
go install module |
npm |
npm install -g module |
pip |
pip install module |
docker |
docker pull module |
brew |
brew install module |
Features:
- Timeout handling with context
- Dry-run mode for testing
- Binary verification after install
- Custom installer registration
SkillInstaller¶
Installs skills from various sources:
si := installer.NewSkillInstaller()
// From git repository
skill, err := si.Install(ctx, "github.com/user/repo@v1.0.0")
// From git subdirectory
skill, err := si.Install(ctx, "github.com/user/repo/skills/weather")
// From local path (copy)
skill, err := si.Install(ctx, "./local/skill")
// From local path (symlink for development)
si.Symlink = true
skill, err := si.Install(ctx, "./local/skill")
CommandTool¶
Wraps CLI commands as Tool implementations:
import "github.com/plexusone/omniskill/skill"
tool := &skill.CommandTool{
ToolName: "search",
ToolDescription: "Search the archive",
Command: "notcrawl",
Args: []string{"search", "{{query}}"},
ToolParameters: map[string]skill.Parameter{
"query": {Type: "string", Required: true},
},
Timeout: 30 * time.Second,
}
// Call the tool
result, err := tool.Call(ctx, map[string]any{"query": "meeting notes"})
// Result contains stdout, stderr, exit code
cmdResult := result.(skill.CommandResult)
fmt.Println(cmdResult.Stdout)
Features:
- Parameter substitution via
{{paramName}}placeholders - Configurable timeout
- Environment variable support
- Working directory configuration
- Captures stdout, stderr, and exit code
Package Structure¶
github.com/plexusone/omniskill
├── skill/ # Core skill types
│ └── command.go # NEW: CommandTool
├── loader/ # NEW: Skill loaders
│ ├── types.go # Metadata types
│ ├── markdown.go # SKILL.md parser
│ └── loader.go # Unified loader
├── installer/ # NEW: Dependency management
│ ├── manager.go # Package manager support
│ └── source.go # Source parsing & installation
├── pack/ # Skill pack interface
├── registry/ # Skill registry
└── mcp/ # MCP integration
Use Cases¶
Loading Skills at Runtime¶
// Discover and load all skills
loader := loader.NewUnifiedLoader()
skills, err := loader.LoadAll("./skills")
reg := registry.New()
for _, s := range skills {
reg.Register(s)
}
reg.Init(ctx)
Installing Missing Dependencies¶
// Check and install missing binaries
skill, _ := loader.LoadMarkdownSkill("SKILL.md")
steps := skill.GetInstallSteps()
mgr := installer.NewManager()
mgr.InstallMissing(ctx, steps)
Development Workflow¶
// Symlink local skills for development
si := installer.NewSkillInstaller()
si.Symlink = true
si.Install(ctx, "../my-skills/weather")
Dependencies¶
- Bump
github.com/modelcontextprotocol/go-sdkto v1.6.1 - Bump
github.com/grokify/mogoto v0.74.5
Contributors¶
- John Wang
- Claude Opus 4.5