Extensions
Writing an extension
An extension is a small JSON manifest with two responsibilities: detect a project type and describe where its commands come from.
Shape
{
"id": "deno",
"name": "Deno",
"detectors": [
{ "files": ["deno.json", "deno.jsonc"] }
],
"commandSources": [
{ "type": "static", "commands": [
{ "key": "dev", "label": "dev", "command": "deno task dev", "kind": "dev" },
{ "key": "test", "label": "test", "command": "deno test", "kind": "test" }
]}
]
}
Detectors
A folder matches when one of the detectors matches — typically by the presence
of specific files (exact filenames). That’s how package.json → Node,
composer.json → PHP, deno.json → Deno, and so on.
Command sources
Two providers:
scriptsFile— read named scripts from a file, e.g. thescriptsobject of apackage.jsonorcomposer.json. Great when the project already lists its commands.static— a fixed list of commands you spell out (as above).
The authoritative JSON Schema and a contributing guide live in the
extensions repo — validate your
manifest against
schema.json before publishing.
Test it
Host the manifest anywhere (a raw file URL works) and install it from a URL to try it locally before submitting it to the registry.