Writing Skills
A skill teaches FERAL a new capability — calling an API, transforming data, or controlling hardware. There are three ways to create one, depending on complexity.Option 1: JSON Manifest (any REST API)
Drop a JSON file in~/.feral/skills/. The Brain discovers it at startup and exposes the endpoints as agent tools.
Manifest Fields
Option 2: Python Plugin
For tools that need custom logic (not just HTTP calls), use the SDK’sFeralPlugin base class.
Plugin Lifecycle
Installing a Python Plugin
Place the module in~/.feral/plugins/ or install it as a Python package. The Brain discovers plugins that subclass FeralPlugin.
Option 3: WASM Skill (sandboxed)
For untrusted or third-party skills, FERAL can execute WebAssembly modules in a Wasmtime sandbox..wasm file alongside a manifest:
Self-Learning Skills
FERAL can auto-detect repeated patterns and generate skill manifests from usage history. When the agent notices it keeps performing the same multi-step sequence, it proposes a new skill. You can review and approve pending skills:What a failure looks like
The approval queue lives in memory and a brain restart empties it, so “approve” and “reject” both have a common failure: the id is no longer queued. Neither call reports that as a success.
Rejecting an id the brain does not have is an error, not an idempotent
no-op: the usual cause is a UI left open across a restart, and a green
tick there would say a draft was discarded when nothing was. Every
failure carries both a non-2xx status and an
error string, so a generic
client sees it without knowing this route’s body shape.
GET /skills follows the same rule: it answers 503 with an error when
the skill registry is not initialized, rather than an empty list that
reads as “no skills installed”.
Skill Marketplace
Browse and install community skills from the registry:preview verifies the
publisher’s signature and returns what the skill can reach plus a
single-use install_token, and install spends that token. A request
without a valid token is refused with 403, so nothing is installed
before its permissions have been served to whoever is deciding.
