extension-creator
Use in Creator mode, when asked to write, change, fix or install a Pithagoras extension (a tool for the agent, a page, a panel, a route): the loop of copying the template, editing it, installing it with extension_install, reading extension_status and calling the new tool, and the rules a made extens…
Install / Use
npx skills add thecodacus/pithagoras --skill extension-creatorInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
Content & MediaSupported Platforms
Tags
Our assessment of extension-creator
extension-creator scores 77/100 on our quality scale, 1062nd of 1,185 Content & Media skills we index.
Its SKILL.md is 8.7 KB long, well organised into 8 sections with 3 code examples: a thorough specification that gives an agent plenty to work with.
It has no GitHub stars yet, so there is no community track record; judge it on its content.
Maintenance, license and trust
- The repository was last updated today, so extension-creator is actively maintained.
- No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
- Its trust signals score 80/100, with 2 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
extension-creator compared with similar skills
All 4 of these similar skills score higher than extension-creator; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| extension-creator (this skill)by thecodacus | 77 | 0 | today | SKILL.md |
| siyuanby siyuan-note | 100 | 46.9k | today | MCP Server |
| algorithmic-artby anthropics | 100 | 177.9k | 34d ago | SKILL.md |
| pptxby anthropics | 100 | 177.9k | 34d ago | SKILL.md |
| designby nextlevelbuilder | 100 | 137.2k | 11d ago | SKILL.md |
Frequently asked questions
- How do I install extension-creator?
- Run
npx skills add thecodacus/pithagoras --skill extension-creator. The install tabs above show the steps for each supported agent. - Which AI agents does extension-creator work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is extension-creator safe to use?
- It declares no license and scores 80/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is extension-creator still maintained?
- The repository was last updated today, so extension-creator is actively maintained.
Skill content
View source on GitHubname: "extension-creator" description: "Use in Creator mode, when asked to write, change, fix or install a Pithagoras extension (a tool for the agent, a page, a panel, a route): the loop of copying the template, editing it, installing it with extension_install, reading extension_status and calling the new tool, and the rules a made extension follows."
Writing a Pithagoras extension in Creator mode
An extension is a pi package that also brings something to the portal: tools
for the agent, routes on the server, pages and panels in the browser. In this
chat you write one in a folder of your own, install it with
extension_install, and call its tools from your next step. Nothing restarts.
The folder this file is in holds template/, a working extension in plain
JavaScript, and reference/, the full guide and the API's types.
The loop
-
Copy the template into this chat's folder, and give it its own name:
mkdir -p extensions && cp -r <the folder this SKILL.md is in>/template extensions/<name>Then change
nameinextensions/<name>/package.json, and the tool's name,my_extension_echo, inserver.js. -
Edit it:
server.jsfor tools and routes,web/client.jsandweb/client.cssfor what is drawn. -
Install it:
extension_install { path: "extensions/<name>" }. A copy of the folder is taken and installed; your folder stays yours to change. -
Read what the install says of the server half.
server.running: false, afailureor acrashmeans it does not work yet: callextension_status { name: "<name>" }for its lines, and fix the code. -
Call its tool from your next step. Where a subagent of this chat works in the background, the tools come once this run ends.
-
Change something, and install again: nothing reloads by itself. Each install loads every half again, at its new revision.
extension_status with no name lists what was made in Creator mode;
extension_remove { name } uninstalls one and deletes its copy. Every install
and removal is in Settings → Audit, and the person can switch an extension off
or remove it in Settings → Extensions. One they switched off stays off when you
install it again.
package.json
{
"name": "<name>",
"version": "0.1.0",
"type": "module",
"keywords": ["pi-package"],
"pi": {},
"pithagoras": { "client": "./web/client.js", "style": "./web/client.css", "server": "./server.js", "isolated": true }
}
- One name, without a scope: letters, digits,
-,_and.. It is what everything goes by: its routes are at/api/x/<name>/…, its pages at/x/<name>/<id>. A name that an extension of the portal has, or that another installed package has, is refused. "pi": {}, always, and nothing in it that runs code: nopi.extensions, and no folderextensions/at the package's top (pi would load that as a pi half). A pi half runs in every chat's pi inside the portal, where your extension's own process does not reach. Give tools through the server half instead (below)."type": "module", as the template has it.- The browser half in a folder of its own (
web/): the portal serves that whole folder to whoever is signed in, and a module at the package's root is not loaded. - The template's licence is Apache-2.0; the person may change it.
- Links in your folder are left out of the copy, not followed. Install
packages with
npm installin the folder (npm copies them; pnpm links them), and the copy takesnode_moduleswith it. At most 64 MB, 10,000 files, 32 folders deep and 2,000 entries in one folder (node_modulesincluded) are copied.
Which half does what
| Half | Runs | For |
| --- | --- | --- |
| Server half (server.js) | Once, for all chats, in a process of its own | Tools (chats.extend), routes, what must be there when no chat is running |
| Browser half (web/client.js) | In each page signed in to the portal | Everything drawn: a tool call's card, a page, a panel |
A tool belongs in the server half: it is registered in every chat's pi from there, and it shares what the routes know.
The server half
Its default export is called with portal; it may return a function that
stops it. The members you will use most:
| portal. | |
| --- | --- |
| chats.extend((pi, chat) => …) | Tools for every chat's pi: pi.registerTool({ … }) |
| router | An Express router: routes at /api/x/<name>/…, behind the portal's login |
| http.json() | The body parser for a route that takes JSON |
| chats.send(chatId, data), chats.onOpen(fn) | To the pages open on a chat, heard there with portal.server.on |
| chats.get(id), chats.list(), chats.folder(id) | A chat, the chats, the folder a chat works in |
| files.list, read, write, open… | A chat's folder, read and changed with the portal's checks: never fs on a chat's folder |
| dataDir() | A folder of the extension's own, for what it keeps |
| log(text) | A line in its log, which extension_status shows |
A tool:
pi.registerTool({
name: "<name>_<verb>",
label: "What it does",
description: "What the model reads to decide when to call it.",
parameters: { type: "object", properties: { q: { type: "string" } }, required: ["q"] },
guard: { outside: true },
async execute(_id, params) {
return { content: [{ type: "text", text: "…" }], details: { /* for its card */ } };
},
});
- Parameters are JSON schema.
guardsays what it does:outside: truefor a tool that returns what it read from the outside world (a page, a feed, an API), so that it is held as data and not as instructions;actsfor one that changes things ("persist","publish","upload","write-to-path"…), which the guard then holds after a suspected prompt injection.offByDefault: truekeeps it off in every chat until somebody switches it on in Settings → Tools. Without it, it is on in every chat.- Never one of pi's own tool names (
bash,read,write,edit,grep,find,ls…), nor another tool's: start its name with the extension's.
Its own process
Every extension made here runs its server half in a process of its own, so it has less than one in the portal's process:
- In
chats.extend,pihasregisterTool,on,registerCommand,sendMessageandsendUserMessage, and nothing else. Register while the factory runs (five seconds at most), not later. execute, a handler and a command are given noctx.renderCallandrenderResultare left out, and any other function in a tool's definition is refused.- No
provideand novoice.requiresandextensions.useonly of an extension in the portal's process, such as the portal's own: nothing can build on a half in a process of its own, another made extension included. - It has 15 seconds to start. Keep synchronous work under 10 seconds and its heap under 512 MB: past either (or 1 GB of memory, on Linux) its process is ended, as its crash.
A crash (a throw nothing catches, a rejection nobody hears, process.exit(),
a loop that never ends) ends its process. A call of its tool that was running
answers at once with the crash and its last lines, and it stays off until it
is installed again: fix it, and install it again.
The browser half
Plain JavaScript, made with the portal's React and no JSX, so nothing needs building:
export default function (portal) {
const { React, ui } = portal;
const h = React.createElement;
portal.slots.register("chat.tool", { id: "card", tool: "<name>_<verb>", component: ({ call, card }) => call.status === "done" ? h("p", null, call.output) : card });
}
- Slots:
chat.tool(a call of its tool, in place of the portal's card),nav.page(a page in the sidebar),chat.panel(a panel beside the conversation),settings.page(its page in Settings),chat.composer.above,chat.header.action. portal.chats.use(chatId, pick): a hook, the chat as the page has it.portal.api.json(portal.api.url("/route")): its server half's routes.portal.server.on((chatId, data) => …): whatchats.sendsays.- Colours are the portal's variables:
rgb(var(--fg)),--fg-muted,--fg-faint,--line,--accent,--raised,--danger… Give class names a prefix of the extension's, in its own stylesheet. No Tailwind classes: the page has only those the portal itself uses, and they change with it. uihas the portal's own parts:ui.LoadFailed,ui.Empty,ui.RowsSkeleton,ui.confirm,ui.classes.
Where to look next
reference/extension-ui.md, the whole guide (about 160 KB: grep it by its headings,##and###).reference/server.d.ts: everything the server half'sportalhas.reference/index.d.ts: the browser half'sportal, and every slot./app/extensions/kanban/src: a full extension, written in TypeScript.
Related Skills
siyuan
46.9kAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
pptx
177.9kUse this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an em…
design
137.2kComprehensive design skill: brand identity, design tokens, UI styling, logo generation (55 styles, Gemini, Atlas Cloud, or MuAPI AI), corporate identity program (50 deliverables, CIP mockups), HTML presentations (Chart.js), banner design (22 styles, social/ads/web/print), icon design (15 styles, SVG…
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
