Skill bundle installs

Updated Jul 27, 2026

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 is SKILL.md.
  • package: required string. The allowed values are single_file and bundle.

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.