Agent Skills
Write the agent skills that match your Sovrium version into a project, refresh them after an upgrade without touching what you edited, and check them in CI.
Usage: sovrium skills [--output <dir>] [--target claude|agents|all] [--check] [--force]An AI editing your config is only as good as what it knows about Sovrium. Left alone, it guesses from whatever it read during training: option names from an older release, a web page instead of the manual for your version, a config that validates but was never looked at in a browser. Agent skills close that gap. Each one is a short SKILL.md your AI reads when a task matches it, plus a references/ folder it opens when it needs the detail.
The binary carries five of them:
| Skill | Use it for |
|---|---|
sovrium-app |
Any change to the config: the edit, validate, run, look, stop loop |
sovrium-data-model |
Tables, fields, field ids, relations |
sovrium-pages |
Pages, components, design |
sovrium-automations |
Triggers, actions, connections |
sovrium-seo-geo |
Metadata, sitemaps, languages, redirects, and how pages read to AI search |
Part of each references/ folder is generated from the binary's own option descriptions, so a catalogue of field types or components always describes the version you run.
What it writes
sovrium skills writes every skill into .claude/skills/<name>/ under the current directory — the SKILL.md and its references/ — and a .sovrium-skills.json beside them. --output <dir> writes under another project root instead.
The JSON file records, for every file it wrote, a SHA-256 of its bytes and the Sovrium version that wrote it. Commit it with the skills: it is how the next run knows which files are Sovrium's and which ones you changed. Each SKILL.md also names its version in its frontmatter, as metadata.product-version.
sovrium init writes the same skills when it scaffolds a project, whether from the default starter, a --template, a template repository or --from-url. It never overwrites a skill directory that is already there.
Refreshing after an upgrade
After installing a new Sovrium version, run the command again:
sovrium skillsFiles Sovrium wrote and you did not change are replaced with the new version's. A skill the new version no longer ships is removed, provided you did not edit it. A second run with nothing to do changes nothing.
Files you edited
A file whose bytes no longer match what Sovrium recorded is yours now, and the command refuses to overwrite it. It exits 1 and names each such file. You can:
- keep your version, and leave that file stale on purpose, or
- run
sovrium skills --forceto take Sovrium's version.--forcereplaces only files Sovrium wrote; a file you added inside a skill folder stays.
A skill directory with a Sovrium name that Sovrium never wrote — your own sovrium-app, say — is refused even with --force: without the record, nothing proves it is Sovrium's to replace. Skills with other names are never read or touched.
Symlinks
The command never writes, replaces or deletes anything through a symbolic link. If a skill folder, any file inside it, or .sovrium-skills.json is a link, it exits 1 naming the link and writes nothing, in any target. --force does not change that. Replace the link with a real file or folder, or remove it, then run the command again. sovrium init skips a skill whose folder is a link, says so, and writes the others.
The skills folder itself may be a link: pointing .claude/skills at .agents/skills to share one copy works, as long as the link resolves inside the project. A skills folder that leads outside the project is refused before anything is written.
Checking in CI
sovrium skills --check--check writes nothing. It exits 0 when every skill is current, and 1 when a file is missing, left over from an older version, or edited — listing each one. Run it in CI to catch a project whose skills fell behind the binary its pipeline pins.
Other agents: --target agents
Claude Code reads .claude/skills/, and so does Cursor. Codex, GitHub Copilot, Gemini CLI and OpenCode read .agents/skills/.
sovrium skills --target agents # .agents/skills/
sovrium skills --target all # both directoriesEach directory keeps its own .sovrium-skills.json, so each is refreshed and checked on its own. claude is the default.
As MCP prompts
Claude Desktop has no shell to run sovrium skills, and does not read skill folders from your project. When it is connected through sovrium mcp, the same skills are there as MCP prompts: pick one from the prompt menu, and its SKILL.md text is added to the conversation. A prompt carries the SKILL.md alone, not its references/. Your Config over MCP covers connecting a client.
What the skills are built on
The skills follow the Agent Skills format, and their advice is drawn from published sources: search-engine documentation for the SEO skill, public design and accessibility guidance for the pages skill, and published agent-skill collections for their structure. Each skill lists what it drew on, with the date and the licence, in its references/sources.md.
Behaviour
sovrium skills Writes the Binary's Agent Skills into a Project
sovrium skillswrites every embedded skill into.claude/skills/<name>/— itsSKILL.mdand everyreferences/*.md, never anevals/file — plus the.sovrium-skills.jsonmanifest- Every written
SKILL.mdopens with frontmatter whosenameequals its directory (at most 64 lowercase characters and hyphens), whosedescriptionis 1 to 1024 characters, and whosemetadata.product-versionequalssovrium --version - The manifest carries
format: sovrium-skills,schemaVersion: 1, the engine and the target, and lists every written file with a sha256 that matches its bytes on disk --output <dir>writes the skills and the manifest under<dir>and nothing under the current directory- A second run with nothing changed is a no-op: exit 0, and no file or manifest byte changes
- After an engine change, the files the person did not edit are replaced, and the frontmatter stamp and the manifest engine move to the running version
- A file the person edited is refused: exit 1, nothing written, and the message names the file and
--force --forceoverwrites an edited file the manifest lists, and leaves a file the manifest does not list untouched- A same-name skill directory the manifest does not own is refused even with
--force, and its files are left as they were - With no manifest, files already byte-equal to the embedded skills are adopted into a new manifest rather than refused
- A skill of another name in the same directory is never read, rewritten or removed
--checkwrites nothing and exits 1 listing each missing, stale and edited file, and exits 0 once the skills are current--target agentswrites.agents/skills/,--target allwrites both directories each with its own manifest, and an unknown target exits 1 naming the accepted values- A skill the binary no longer ships is removed when unedited, and kept and reported when edited
- A project that still holds
.claude/agents/app-editor.mdis told in one line that the skills supersede it, and the file is never deleted sovrium init, bare and with--template <slug>, writes the skills and the manifest add-only: an existing.claude/skills/<name>/is kept as it wassovrium init --from-urland a remoteowner/repotemplate write the skills the same waysovrium skills --helpprints the usage and exits 0 without writing, andsovrium --helplistsskills- The compiled binary writes skills and a manifest byte-identical to the from-source run, from a clean directory
sovrium-appnamessovrium docsfirst as the manual, and the published llms.txt index only for a client that cannot run commandssovrium-appgives a verification loop namingsovrium validate,sovrium start --watch, a browser MCP (Playwright MCP or Claude in Chrome) for visual and behavioural checks, an API check against/api/openapi.json, and a bounded number of passessovrium-data-modelsays an omitted fieldidis assigned by position, and tells the agent to give a new field the next unused idsovrium-appnamessovrium mcpwith--projecton one linesovrium-appgives the MCP write loop in order:_config_read_file,_config_write_filewithexpectedSha,_config_validate,_config_undosovrium-appsays config writing is off untilMCP_CONFIG_WRITE=1, and never calls the MCP surface read-only without that qualifier- Every
sovrium docs <address>cited in any written skill exits 0 on the same binary - Every generated reference file is byte-equal to a fresh
bun run build:skill-referencesrun - Every
references/<file>linked from aSKILL.mdexists and sits one level below thatSKILL.md - A symlink at or below
<target>/<skill>/, or at the manifest path — to a file or a directory, dangling or not — refuses the run before anything is written or deleted in any target: exit 1, and the message names the link --forcedoes not override the symlink refusal: the link's target is left untouched and nothing is writtensovrium initskips a skill whose directory name is a symlink and reports it, instead of throwing, and still writes the other skills- A
.claude/skillsroot that is a symlink resolving inside the project is written through; one resolving outside the project is refused before anything is written - Writing, refreshing, refusing, checking and targeting skills, from source (regression)
Last updated September 27, 2026
This documentation was written with AI, so errors or outdated content are possible. Sovrium is in beta. Contributions and corrections are welcome.