Axinite now validates passive multi-file skill bundles when a skill is
installed from an HTTPS URL or catalogue download that resolves to a .skill
ZIP archive, or when a local .skill file is uploaded through the browser
Skills tab.
A valid bundle must contain exactly one shared top-level path prefix with
SKILL.md at <root>/SKILL.md. The installer also accepts optional
references/ and assets/ subdirectories under that same root.
The installer rejects bundles that contain unsupported top-level content, nested
SKILL.md files, scripts/ or bin/ directories, traversal paths, absolute
paths, special-file entries, duplicate normalized paths, oversized entries,
oversized archives, excessive file counts, invalid UTF-8 in SKILL.md or
references/, or executable payloads such as .sh, .py, .js, .ps1,
.bat, .cmd, .rb, or .pl.
Accepted bundles are extracted through a staged install path and only committed
into the installed-skills directory once validation and on-disk staging both
succeed. A failed bundle install should therefore leave no partial installed
skill tree behind. Bundle authors can rely on every documented entry under
SKILL.md, references/, and assets/ being preserved byte-for-byte after a
successful install.
The browser Skills tab accepts exactly one install source at a time: a
catalogue name or slug, an HTTPS SKILL.md or .skill URL, raw SKILL.md
content from an API client, or one uploaded .skill file. Ambiguous requests,
such as sending both a name and a URL, fail before any download or install
attempt. Malformed archives report explicit invalid_skill_bundle: ... errors
that describe the archive-shape problem.
When a bundled skill is active, the runtime injects the selected SKILL.md
body into the prompt and advertises stable bundle metadata. The model-facing
active-skill block includes this required metadata contract:
skill: required string. The stable skill identifier from the loaded skill model.root: required bundle-relative path string. The current value is.and it represents the logical root of the active skill bundle, not a host-local filesystem path.entry: required bundle-relative path string. The current entrypoint isSKILL.md.package: required string. The allowed values aresingle_fileandbundle.
Host-local filesystem paths are not exposed as model instructions. A dedicated
skill_read_file tool lets the model read allowed bundle-relative files
without access to the generic filesystem tools.
The skill_read_file input schema requires:
{
"skill": "deploy-docs",
"path": "references/usage.md"
}
The skill value must match the active skill identifier. The path value must
be one of SKILL.md, a file below references/, or a file below assets/.
Absolute paths, .., backslashes, nested SKILL.md files, and other roots are
rejected.
A successful text read returns inline UTF-8 content:
{
"skill": "deploy-docs",
"path": "references/usage.md",
"mime_type": "text/markdown",
"content": "# Usage\n..."
}
Binary assets and oversized files are not returned inline in this phase. They return a typed error with size, media type, and a stable fetch hint. Unknown skills, missing files, disallowed paths, invalid UTF-8, and I/O failures also return skill-scoped JSON error payloads rather than host-local paths.