Skip to content

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

go get github.com/plexusone/omniskill@v0.8.0

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
  • CommandTool wrapper 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-sdk to v1.6.1
  • Bump github.com/grokify/mogo to v0.74.5

Contributors

  • John Wang
  • Claude Opus 4.5