Skills
Browse and install
The registry is a flat catalog. Every skill is a single .xgs.js file you can read before you install it.
Browsing
Skills live at /skills and are searchable by free-text query. Listings sort by popular (downloads + ratings), recent, or highest rated. Each card carries:
- The skill
@nameand its kebab-case slug. - Its
@namespace— a JS identifier that determines the install location:window.xgoose.skills[<namespace>]. - The first line of the
@description(a single sentence is best). - Download count and a star average from reviews.
Click a card to land on /skill/?slug=<slug> — the detail page — for the full @description README, the canonical source, per-function summaries, the version history, and reviews.
The install flow
Every detail page has an Install in xgoose button. It is just a normal anchor that points at the canonical source URL:
https://api.xgoose.org/skills/<slug>.xgs.jsThe xgoose extension registers a content script on *.xgs.js URLs. When you click the button:
- The browser navigates to the source URL.
- The extension's install-banner content script intercepts the navigation and redirects the tab to its own bundled
install.html. - The install page parses the
// ==XGooseSkill==header and lists every function the skill exposes (name, signature, summary, and which one is theprimary?entry point). - You confirm. The extension calls
saveUserSkillwith the parsed header + bundled IIFE; the skill becomes available underwindow.xgoose.skills.<namespace>and is added to the agent's tool list whenever the page matches.
We use .xgs.js instead of .user.js on purpose, so a Tampermonkey install doesn't hijack the navigation before xgoose can. Browsers without the extension installed just see the raw script text — that's the expected fallback, and you can save the file by hand from there.
What the install banner shows
- The parsed header fields:
@name,@namespace,@version,@author,@match/@include, optional@detect. - The Markdown body from
@description(rendered). - The function table: every
defineSkill().functionsentry with its summary and Zod-derived JSON schema, generated by calling__describe__()on the bundle in the publisher's browser at publish time.
Treat the function table as the source of truth before you click confirm — skills run with the same privileges as the page they target.
Versioning and re-installs
Each skill carries a strict semver @version. When the publisher pushes a new build, the registry:
- Stores a new version row alongside the previous ones — history is never overwritten.
- Updates the
latest_version_idon the parent skill so the canonical.xgs.jsURL always points at the most recent build. - If the publisher forgets to bump
@version, the patch component is auto-bumped (same-owner only; cross-owner duplicate slug stays a 403). The response carries bothsubmitted_versionandversion.
On re-install the extension compares versions and either prompts you to accept the upgrade or proceeds silently if you opted into auto-updates for that slug. Source for every historical version stays downloadable from the detail page.
Ratings and reviews
Once you've installed a skill, the detail page unlocks a Leave a review form: 1–5 stars plus an optional short comment. Reviews are public and tied to your account; you can edit your own. Skill authors can't delete reviews on their own listings — only the registry admin can, and only for clear spam.
Ownership and removal
- Slug ownership is locked to the first publisher.
- The owner can publish new versions at any time.
- Hard-deletes happen only via admin moderation (e.g. takedown for malicious code). If a skill you own no longer makes sense to host, publish a final version with a tombstone
@descriptionand stop updating — existing installs keep working, new users see the notice.