Install any skill in seconds. Free to start, no credit card required.
Get Started Free →open-gsd/create-gsd-extension
Create, debug, and iterate on GSD extensions (TypeScript modules adding tools, commands, event hooks, custom UI, and providers).
Passed 20 of 22 test cases with the skill, and 8 of 22 without it.
and 21 more in the full report
14 fixed6 passed either way0 still failing2 broke
Tokens, turns and time describe resource use, not a dollar price.
This benchmark measured an earlier version of the skill.
A newer attempt on gemini-3.6-flash on 10/11/2026 did not produce a publishable comparison (not comparable). The snapshot above is the previously measured run.
One of 14 test cases the skill fixed. Same model, same prompt, with and without the skill.
I am creating a distributable GSD extension module. Besides the main TypeScript entry file, what manifest file is required, and what key field must list all capabilities provided by the extension?
| Checked | Without skill | With skill |
|---|---|---|
| The extension configuration uses extension-manifest.json. | Missed | Passed |
| The manifest file includes a provides field listing extension capabilities. | 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. |
test cases passed, vs 8 / 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.