Importing currently means having the skill on disk already: bun scripts/import.ts /path/to/skills (README.md:225) walks local directories. There is no way to import from a URL, and no import route in the HTTP API or UI.
That is an awkward gap for a self-hosted library, because the natural way to share a skill is to link a repo or a folder in one. Pasting a GitHub URL is the obvious entry point.
What it could accept
- A repo:
https://github.com/owner/repo
- A folder inside one:
https://github.com/owner/repo/tree/main/skills/my-skill
- Ideally a single file:
https://github.com/owner/repo/blob/main/my-skill/SKILL.md
Things worth deciding up front
- Private repos. A public-only fetch needs no credentials. Private support means asking for a token and storing it encrypted — the same scheme already used for the Jev key and Executor credentials (
src/server/secret-storage.ts).
SKILL.md at the root. The existing import requires SKILL.md in each skill directory (scripts/import.ts:42), so a fetched folder should be validated the same way rather than inventing a second rule.
- Frontmatter
name must match the id. inspectSkillPackage enforces frontmatter.name === id (src/skill-manifest.ts:190). A URL import needs a clear policy on which one wins, or a clear error.
- Integrity and limits. Portability limits are 512 files / 16 MiB (
src/skill-manifest.ts:106-109). A fetch should enforce those before writing, not after.
- No code execution. Skillbox never runs uploaded code, and a URL import should keep that property: fetch bytes, verify, publish. No installs, no build steps.
- Path safety. Reuse the existing
safePath / validPath checks so a crafted archive or repo cannot traverse out of the skill directory.
- Secret scanning.
scripts/import.ts:105-114 already quarantines recognizable secret patterns as a heuristic. A URL import should run the same check — it matters more here, since the source is arbitrary and remote.
- Pinning. A URL import resolves to a moving branch. Recording the resolved commit SHA with the revision would make the import reproducible.
Why this is worth doing
It turns the library from "skills I already have locally" into "skills I can pull from anywhere," which is the main reason to run a shared library at all. It also pairs well with the existing export format (skillbox-export/v1), so a repo could be a published library that others import directly.
Happy to prototype this if it would help.
Importing currently means having the skill on disk already:
bun scripts/import.ts /path/to/skills(README.md:225) walks local directories. There is no way to import from a URL, and no import route in the HTTP API or UI.That is an awkward gap for a self-hosted library, because the natural way to share a skill is to link a repo or a folder in one. Pasting a GitHub URL is the obvious entry point.
What it could accept
https://github.com/owner/repohttps://github.com/owner/repo/tree/main/skills/my-skillhttps://github.com/owner/repo/blob/main/my-skill/SKILL.mdThings worth deciding up front
src/server/secret-storage.ts).SKILL.mdat the root. The existing import requiresSKILL.mdin each skill directory (scripts/import.ts:42), so a fetched folder should be validated the same way rather than inventing a second rule.namemust match the id.inspectSkillPackageenforcesfrontmatter.name === id(src/skill-manifest.ts:190). A URL import needs a clear policy on which one wins, or a clear error.src/skill-manifest.ts:106-109). A fetch should enforce those before writing, not after.safePath/validPathchecks so a crafted archive or repo cannot traverse out of the skill directory.scripts/import.ts:105-114already quarantines recognizable secret patterns as a heuristic. A URL import should run the same check — it matters more here, since the source is arbitrary and remote.Why this is worth doing
It turns the library from "skills I already have locally" into "skills I can pull from anywhere," which is the main reason to run a shared library at all. It also pairs well with the existing export format (
skillbox-export/v1), so a repo could be a published library that others import directly.Happy to prototype this if it would help.