Skillware is an Operating System for Agentic Capabilities. It decouples intelligence (the model) from capability (the tool): you install know-how instead of redefining it for every host.
Every registry skill is a folder of roles implemented by fixed filenames. The README Mission summarizes the core roles; the full reference is below. Filenames stay unchanged.
CAPABILITY (what the host unlocks)
├── Contract manifest.yaml
├── Effect skill.py (+ effect modules in the same folder)
└── Directive instructions.md
REGISTRY (required to merge)
├── Assurance test_skill.py
└── Presentation card.json
OPTIONAL ASSETS
├── Corpus kb/, data/, bundled knowledge files
└── Reference schemas/, maps, in-bundle spec fixtures
FRAMEWORK (outside the bundle folder)
└── Interface SkillLoader model adapters (to_gemini_tool, …)
| Role | v0 file(s) | What it answers |
|---|---|---|
| Contract | manifest.yaml |
What is this skill? Typed I/O, constitution, issuer, requirements |
| Effect | skill.py |
What runs deterministically when invoked? (BaseSkill.execute()) |
| Directive | instructions.md |
How should the host use this capability? When, how to read outputs, limits |
| Assurance | test_skill.py |
Does Effect honor Contract? (offline bundle tests; CI / skillware test) |
| Presentation | card.json |
Catalog and UI card metadata; issuer must match Contract when present |
| Corpus | kb/, data/, … |
Static knowledge Effect reads (not fetched at runtime) |
| Reference | schemas/, maps |
Machine-readable adjuncts to Contract (validators, terminology) |
| Interface | skillware/core/loader.py |
Adapters that expose Contract to a host API |
Effect modules — co-located Python imported by skill.py (for example workflow.py, budget.py). Part of Effect implementation, not separate bundle roles.
Corpus tooling — offline scripts under the bundle (for example maintenance/) that refresh Corpus data. Not loaded by execute().
Constitution vs directive — hard limits and registry identity live in Contract (manifest.yaml). Operational playbook for the host lives in Directive (instructions.md). Both constrain behavior; different consumers.
Presentation — card.json is part of the standard registry bundle (every skill under skills/ ships one). CI validates issuer parity and UI schema keys when a card is present; see CONTRIBUTING.
Skillware relies on a strict, modular layout. Capabilities live under skills/ grouped by domain (see Skill categories):
Skillware/
├── skills/
│ └── category/ # Domain boundary (e.g., 'finance')
│ └── skill_name/ # A self-contained capability bundle
│ ├── manifest.yaml # Contract
│ ├── skill.py # Effect (entry)
│ ├── instructions.md # Directive
│ ├── card.json # Presentation
│ ├── test_skill.py # Assurance
│ ├── kb/ or data/ # Corpus (optional)
│ └── schemas/ # Reference (optional)
└── skillware/
└── core/
├── base_skill.py # Effect interface (`BaseSkill`)
├── env.py # API key and secret loading
└── loader.py # Interface: loader and model adapters
flowchart LR
Registry[Registry] -->|Load| Loader[SkillLoader]
Loader -->|Adapt| Host["Any Host"]
A skill is a folder on disk. The loader reads Contract and Directive, exposes Interface adapters, and your host runs the loop. See How it works and Agent Loops.
When you run SkillLoader.load_skill("category/skill_name"):
flowchart LR
ID[category/name] --> FIND[resolve]
FIND --> PACK[bundle]
PACK --> ADAPT[adapt]
The loader resolves category/skill_name against configured skill roots (run skillware paths and skillware config show for the live order). Bundled registry skills remain available after pip install skillware even without a local skills/ tree.
- Dynamically imports
skill.pyand discovers the singleBaseSkillsubclass asbundle["class"]. - Parses
manifest.yaml(includingissuerfor attribution). - Reads
instructions.mdandcard.json.
For provenance tiers and operator security, see Skill trust model.
Every model expects a different tool-schema shape. The Interface layer transmutes Contract into host formats:
SkillLoader.to_gemini_tool(skill)— GeminiFunctionDeclarationSkillLoader.to_claude_tool(skill)— Claude tools + JSON SchemaSkillLoader.to_openai_tool(skill)— OpenAI Chat Completions toolsSkillLoader.to_deepseek_tool(skill)— DeepSeek-compatible toolsSkillLoader.to_ollama_prompt(skill)— textual tool block for Ollama loops
Multiple skills: use SkillContext instead of loading each skill separately — merge_system(), tools(provider), ollama_prompt, and execute() on one session. Single-skill load_skill() is unchanged.
Pass instructions.md (Directive) into the host system prompt. The model learns when to invoke the skill, how to read outputs, and operational limits — not a replacement host persona.
- User Query: "Should this agent loop stop — we're at 95k tokens?"
- Host reads Directive: The model sees injected
instructions.mdand selectsmonitoring/token_limiter. - Tool Call: The model emits a structured tool call via Interface adapters.
- Framework Execution: Your script may call
skill.validate_params(...)beforeexecute()(recommended in production loops). - Effect runs:
skill.pyevaluates the budget and returns structured JSON. - Synthesis: The model receives the result and explains the next step to the user.
Skillware is designed to be the "Standard Library" for all agents.
| Platform | Integration Strategy |
|---|---|
| Google Gemini | Native google-genai support. Automatic type mapping. |
| Anthropic Claude | Native anthropic support. XML/JSON handling. |
| Ollama | Native ollama Python client support. Fully local JSON handling. |
| OpenAI GPT | to_openai_tool(); Chat Completions tool calling. |
| DeepSeek | to_deepseek_tool(); separate adapter, OpenAI-compatible client. |
| Local LLaMA | (Planned) GBNF Grammar generation from manifests. |
Next Steps:
- Read the Vision (story, roadmap, and where we are today)
- Explore the Skill Library
- Browse the Runnable Examples Index
- View the Changelog for release history
- Read How to Contribute (skills, docs, framework, and bugs)
- If you are a contributing agent, follow the Agent Contribution Workflow