Install any skill in seconds. Free to start, no credit card required.
Get Started Free →gsd-build/create-gsd-extension
Create, debug, and iterate on GSD extensions (TypeScript modules that add tools, commands, event hooks, custom UI, and providers to GSD).
Passed 20 of 22 test cases with the skill, and 7 of 22 without it.
and 19 more in the full report
14 fixed6 passed either way1 still failing1 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 14 test cases the skill fixed. Same model, same prompt, with and without the skill.
What file name must be created in an extension directory to document its exported features, and what top-level manifest field indexes registered tools and commands?
| Checked | Without skill | With skill |
|---|---|---|
| Identifies extension-manifest.json as the required manifest file name. | Missed | Passed |
| Specifies that registered features must be listed under the provides property. | Missed | Passed |
The instructions your model reads when the skill loads.
<essential_principles>
Extensions are TypeScript modules that hook into GSD's runtime (built on pi). They export a default function receiving ExtensionAPI and use it to subscribe to events, register tools/commands/shortcuts, and interact with the session.
GSD extension paths (community/user-installed extensions):
~/.pi/agent/extensions/*.ts or ~/.pi/agent/extensions/*/index.ts.gsd/extensions/*.ts or .gsd/extensions/*/index.tsNote: ~/.gsd/agent/extensions/ is reserved for bundled extensions synced from the gsd-pi package. Community extensions placed there are silently ignored by the loader.
The three primitives:
pi.on("event", handler)). Can block tool calls, modify messages, inject context.pi.registerTool()). LLM calls them autonomously.pi.registerCommand()). Users type /mycommand.Non-negotiable rules:
StringEnum from @gsd/pi-ai for string enum params (NOT Type.Union/Type.Literal — breaks Google's API)truncateHead/truncateTail from @gsd/pi-coding-agent)details for branching supportsignal?.aborted in long-running tool executionspi.exec() not child_process for shell commandsctx.hasUI before dialog methods (non-interactive modes exist)waitForIdle, newSession, fork, navigateTree, reload) are ONLY available in command handlers — they deadlock in event handlersrender() must not exceed width — use truncateToWidth()@ from path params in custom tools (some models add it)Available imports:
| Package | Purpose |
|---|---|
@gsd/pi-coding-agent | ExtensionAPI, ExtensionContext, Theme, event types, tool utilities, DynamicBorder, BorderedLoader, CustomEditor, highlightCode |
@sinclair/typebox | Type.Object, Type.String, Type.Number, Type.Optional, Type.Boolean, Type.Array |
@gsd/pi-ai | StringEnum (required for string enums), Type re-export |
@gsd/pi-tui | Text, Box, Container, Spacer, Markdown, SelectList, Input, matchesKey, Key, truncateToWidth, visibleWidth |
| Node.js built-ins | node:fs, node:path, node:child_process, etc. |
</essential_principles>
test cases passed, vs 7 / 22 without
Published skills whose descriptions closely match this one, with their headline benchmark lift.
More skills from the same source and nearby in the registry, with their headline benchmark lift.