atn-manage
Use when plugins, or the files, skills, agents, MCP servers or rules of the installed or another plugin, need to be listed, created, changed or deleted, when an external plugin is to be imported into a plugin or updated, or when a plugin is to be taken from, updated from or published to the plugin library.
Manage the project's plugins and everything inside one of them — its files, skills, agents, MCP servers and rules; the installed plugin unless the request names another — by listing, creating, changing and deleting them on the Athenode server. It also imports external plugins (third-party plugin packages from a GitHub or GitLab repository or a local folder) into a plugin and updates them, and works with the plugin library: browsing its entries, adding one as a new plugin, merging one into a plugin, updating a plugin added from the library, and publishing, re-publishing, editing and unpublishing the project's own entries, including whether an entry is shown on the public website.
Arguments
- A request (optional, free text): what to list, create, change or delete. Without it, ask what to manage as an open question.
Scope
- A project holds several plugins; exactly one is installed in this local project. The plugin tools (
plugins_list,plugins_create,plugins_clone,plugins_update,plugins_delete,plugins_pull_preview,plugins_pull) act on any plugin of the project. - Every other tool acts on one plugin's content: its file tree (
plugins_files_*), skills (skills_*), agents (agents_*), MCP servers (mcp_servers_*) and rules (rules_get,rules_update). WithoutpluginIdthat is the installed plugin; withpluginIdit is any other plugin of the project. - Work on the installed plugin unless the request names another one. Resolve a named plugin to its id with
plugins_listand pass that id aspluginIdin every call of the operation, the reads included; if the name matches no plugin or several, show the plugins and ask. - A change to a plugin that is not installed is stored on the server only: no local file is regenerated and the result has no
installandregenerationparts. It reaches a project when that plugin is installed there, or on the nextnpx @athenode/cli initwhere it already is. - The plugin library tools (
library_*) name their plugin withplugin— its exact name, or its id together withpluginById— and never withpluginId.pluginis always required and the installed plugin is never assumed: take the name fromplugins_list, and ask when the request does not say which plugin is meant. A library entry is its exact name, or its id together withbyId. - The pull tools (
plugins_pull_preview,plugins_pull) name the plugin that receives the content withpluginin the same way, and the plugin the content is taken from withsource— its exact name, or its id together withsourceById. Both are always required and both are plugins of this project. - The external plugin tools (
plugins_external_*) name their plugin withpluginandpluginByIdin the same way.pluginis required to update an external plugin; an import without it creates a new plugin, andplugins_external_sourceswithout it lists the installed plugin's sources. - Installing a different plugin is done by the user in a terminal, never by you:
npx @athenode/cli init --plugin <id or slug>in the project root.initthen prints, under "Still to do in your tools", what each of the user's AI tools needs before it uses the plugin; that step differs by tool, so point the user at those lines and name no step of your own. - Everything is stored on the Athenode server. Never create or edit the generated files in the local repository (skill, agent, rules and MCP config files): the write tools regenerate them, and a manual edit is overwritten by the next regeneration. Read local files only to take content the user wants to store in the plugin.
Flow
- Understand the request. Split it into operations from "## Operations". If it is ambiguous about the object or the action, ask before writing anything.
- Read the current state each operation depends on, with the list or get tool of its group, and resolve every name the user gave against it. If nothing matches, show the existing names and ask which one was meant; never guess between similar names.
- Confirm destructive and public operations. These tools act immediately and without confirmation, so ask the user first, one question per case:
- Deletions — one question listing exactly what will be removed — for:
plugins_delete,plugins_files_delete,skills_remove,agents_remove,mcp_servers_remove,rules_updatewith an empty text, andlibrary_unpublish(the entry and all its versions leave the library; plugins already added from it keep working and stop receiving updates). Add the matching warning from "## Safeguards". A request that already names the exact object and the delete action still gets this question once; several deletions of one request are confirmed together. - Publishing (
library_publish, a new entry and a new version alike): first call it withoutconfirmPublic, which publishes nothing and returns what would be published. Show the user the entry's name, description, category, the version note and the counts of what it holds, and say what the one consent covers. Every signed-in Athenode user will see the whole plugin — agents, skills with their files, rules, MCP servers and files, thesettings/files included. The entry is also shown on the public Athenode website: its name, description and category and the full content of its agents, skills with their bundle files, rules and plugin files become visible to anyone on the open web without an account and may be indexed by search engines; MCP server configuration is public too and installable withnpx @athenode/cli use <slug>, and after public display is turned off withlibrary_editthe entry can stay on the public site for up to a day and longer in search engines' caches. When the preview sayspublicDisplayBanned: true, say instead that public display is unavailable for the entry and it is published to the in-app library only. PassconfirmPublic: trueonly after a yes to that one question; it is the whole consent, andlibrary_publishtakes nopublicDisplay. - Public display (
publicDisplay: trueonlibrary_edit, for an entry whose public display was turned off): ask a question about the open web, and only when the user asked for public display. Say that the entry's name, description and category and the full content of its agents, skills with their bundle files, rules and plugin files become visible to anyone on the open web without an account and may be indexed by search engines, that MCP server configuration is public too and installable withnpx @athenode/cli use <slug>, and that after it is turned off the entry can stay on the public site for up to a day and longer in search engines' caches. PasspublicDisplay: truewithconfirmPublic: trueonly after a yes to that question.publicDisplay: falseneeds no question. - Replacements: a
library_merge,library_update,plugins_pull,plugins_external_importorplugins_external_updatewhosedecisionsreplace or remove any item or replace the rules. List exactly which skills, agents, MCP servers, files and rules will be replaced or removed, and say that there is no undo and no backup. A merge, update, pull or import withoutdecisionsadds what is new, replaces nothing and needs no question.
- Deletions — one question listing exactly what will be removed — for:
- Apply the operations one call at a time, in the order the user gave. If a call fails, stop the remaining operations that depend on it, keep going with the independent ones and report the error text.
- Check the result. After a write to the installed plugin, which regenerates it, read the
regenerationandinstallparts of the result: reportmissingEnvVars, and when the tool returned an error although the change was saved, say that the server holds the change and the local files are stale untilnpx @athenode/cli initis re-run. What brings the change into use differs by AI tool and by whether the tool has the plugin as a plugin package or as files, so take it from the result and never from memory: pass on the "Still to do in your tools" lines ofregeneration.textand theregeneration.reloadHintas they are, for the tools they name. Only a "to use the … plugin" line, a "Restart the tool or reload its window" line and areloadHintsay how a change comes into use; a line about trusting the project folder or approving the MCP servers does not. For every tool of the install that the result names no such step for, and so for every tool when the result has no lines at all, say that the tool reads the change at its next start at the latest: a running session is restarted. - Give the report (see "## Report").
Operations
Every tool outside "### Plugins", "### External plugins" and "### Plugin library" also takes the optional pluginId (see "## Scope"); the tables leave it out.
Plugins
| Request | Tool | Notes |
|---|---|---|
| List the plugins | plugins_list |
Show name, slug, id and description, and mark the installed one and the project's own copy of the standard plugin. For a plugin added from the library, libraryOrigin names its entry and version and says whether an update is available. |
| Create an empty plugin | plugins_create (name, optional description and slug) |
It has no skills, agents, rules, files or MCP servers, and is not installed. Without slug the server derives one from the name. |
| Create a plugin from an existing one | plugins_clone (source, name, optional slug) |
Copies the source with its content; the installed plugin is not changed. Prefer this when the user wants a variant of a plugin they already have. |
| Rename a plugin or change its description or slug | plugins_update (target, name, description and/or slug) |
The slug is the name of the plugin package and the prefix of its commands: a changed slug renames both, and the local install follows at the next npx @athenode/cli init. |
| Delete a plugin | plugins_delete (target) |
See "## Safeguards". |
| Pull another plugin of this project into a plugin | plugins_pull_preview, then plugins_pull (source, plugin) |
Copies skills, agents, MCP servers, files and rules of source into plugin, all of them or the ones the user picks. Always preview first and show the new, conflicting and identical items and the state of the rules. Pass the user's choices as decisions, built from the preview; without decisions everything new is added, nothing is replaced and the rules are kept. |
source and target are plugin names; pass byId: true with an id when two plugins share a name. A slug is refused, writing nothing, with code plugin_slug_conflict (another plugin of the project has it), plugin_slug_forbidden, plugin_slug_locked or plugin_slug_invalid; show the code and ask for another slug. After creating or cloning a plugin, tell the user how to install it (see "## Scope") if they want to work in it.
For a pull, source and plugin are named as "## Scope" says (sourceById, pluginById), and:
decisionshas the preview's shape:sourceFingerprintandfingerprintfrom the preview, per kind (skills,agents,mcpServers,files) the listsaddandreplace, andrulesaskeep,appendorreplace. Appended rules go under a heading with the source plugin's name. A replacement needsconfirmReplace: trueand the confirmation of step 3 of "## Flow".- A pull with
decisionsis refused when either plugin changed since the preview. Repeat the preview, show the user what is different and apply with the new values; never retry with the old ones. - A pull into the installed plugin regenerates the local files (see step 5 of "## Flow"); into any other plugin it changes the server only.
- A pull is a one-time copy: the pulled items are independent of the source, nothing about the source is recorded and there is no update later. To take later changes of the source, pull again.
- Only a plugin of this project can be the source. Pulling from a plugin of another project exists only in the web app; for a library entry use the tools of "### Plugin library"; for a third-party plugin package use those of "### External plugins".
External plugins
An external plugin is a third-party plugin package — an Agent Plugin (plugin.json), a Claude Code plugin (.claude-plugin/plugin.json), a marketplace or a plugins/* folder — taken from a public GitHub or GitLab repository URL or from a local folder. Its skills, agents, MCP servers and root AGENTS.md (as the rules) are imported into a plugin of the project; hooks, commands and the like are listed as ignored.
| Request | Tool | Notes |
|---|---|---|
| Import an external plugin | plugins_external_import_preview, then plugins_external_import (source, optional pick, plugin, slug, name) |
Always preview first. When the package offers several plugins (candidates), ask which one and pass it as pick. Show what the picked one brings, its licence and attribution, the warnings and the ignored parts. Without plugin the import creates a new plugin with the proposed slug and name; with plugin it merges into that plugin, and the preview's merge part lists the new, conflicting and identical items. A preview expires after an hour. |
| List what a plugin was imported from | plugins_external_sources (optional plugin) |
The URL and revision or the uploaded zip, the external plugin's name, licence class and the items it owns. |
| Update an external plugin | plugins_external_update_preview, then plugins_external_update (pluginSource, plugin, path for an uploaded one) |
pluginSource is the id or name from plugins_external_sources. Show the items to add, those that change, those unchanged and those the new version no longer has; without decisions every new item is added and nothing is replaced or removed. |
decisionshas the preview's shape, with itspreviewId,sourceFingerprintandfingerprint; replacing or removing an item needsconfirmReplace: trueand the confirmation of step 3 of "## Flow". Alibrary_merge_staleerror means the plugin changed since the preview: repeat it.- A local folder is resolved against the project root and uploaded as a zip, without
.git,node_modulesand links. Import only a folder the user named. - An import or update into the installed plugin regenerates the local files (see step 5 of "## Flow").
Files of a plugin
| Request | Tool | Notes |
|---|---|---|
| Browse the file tree | plugins_files_list (optional path) |
Lists one directory level; walk the directories the request needs. |
| Read a file | plugins_files_get (path) |
|
| Create a file or directory | plugins_files_create (path, content, optional summary; dir: true for a directory) |
Missing parent directories are created. Give every file a one-line summary saying when an agent should read it. |
| Change a file | plugins_files_update (path, content and/or summary) |
Replaces the whole content: read the file first, change it and send the full text. Directories cannot be updated. |
| Move or rename a file | plugins_files_get, plugins_files_create at the new path, then plugins_files_delete of the old path |
Delete the old path only after the create succeeded. |
| Delete a file or directory | plugins_files_delete (path; recursive: true for a non-empty directory) |
List a non-empty directory first and show what goes with it. |
Content is passed inline and limited to 50000 characters per file; split a longer document into several files. Files are plain Markdown that agents and skills load at runtime, so write them as instructions for an agent, in English.
Skills and agents of a plugin
| Request | Tool | Notes |
|---|---|---|
| List | skills_list / agents_list |
Only what is attached to the plugin, not the whole catalog. |
| Create | skills_create / agents_create (name, description, prompt, optional metadata) |
description is required. |
| Change | skills_update / agents_update (identifier, any of description, prompt, metadata, rename) |
Omitted fields and unlisted metadata are kept. prompt replaces the whole body: start from the current body in the list result. |
| Remove | skills_remove / agents_remove (identifier) |
Detaches it from the plugin; for the installed plugin, also removes its generated files. |
nameis lowercase words joined with-.descriptionis one sentence starting with "Use when", since the coding assistant decides from it when to load the skill or delegate to the agent.- Write a skill's
promptas: a first line stating its purpose, then## Arguments(if it takes any),## Flowwith numbered steps, and## Report. Write an agent'spromptas a role statement, the steps it follows and the format of what it returns. metadatakeys are either common fields or<target>.<field>for one coding assistant (claudecode.allowed-tools,claudecode.argument-hint,claudecode.modeland the like). Set only what the user asked for or the skill needs; tool names differ per target, so never copy one target's tool list to another.- A skill or agent created or renamed in the installed plugin is not available to the coding assistant at once: what brings it into use is the step of step 5 of "## Flow". Say so.
MCP servers of a plugin
| Request | Tool | Notes |
|---|---|---|
| List | mcp_servers_list |
|
| Create | mcp_servers_create (name, transport, then command, args, env for stdio, or url, headers for http / sse) |
Ask for the transport and its fields if the request doesn't give them. |
| Change | mcp_servers_update (identifier, the fields to change) |
A given args, env or headers replaces the whole value: read the server first and resend every entry that must stay. Switching the transport drops the old transport's fields. |
| Remove | mcp_servers_remove (identifier) |
For the installed plugin, also removes its entries from the local MCP config files. |
- Secrets never go into a server definition: the plugin is shared with everyone who installs it. Write tokens and keys as
${VAR}references inenv,headers,argsorurl, and tell the user which variables to export. If the user pastes a literal secret, replace it with a${VAR}reference and say so. Publishing is stricter:library_publishis refused while any MCP server of the plugin, or one inline in an agent's metadata, holds a literalenvorheadersvalue, whatever its name; replace each one with a${VAR}reference and publish again. - A server created or changed in the installed plugin connects only after the step of step 5 of "## Flow".
Rules of a plugin
| Request | Tool | Notes |
|---|---|---|
| Read the rules | rules_get |
|
| Change the rules | rules_get, then rules_update (content) |
Replaces the whole text: change the current text and send it in full. The content is literal. |
Plugin library
The plugin library has two levels of visibility: every signed-in Athenode user sees every entry with its whole content, and the open web sees an entry while its public display is on, which every publish turns on and library_edit turns off, and then its name, description and category and the full content of its agents, skills with their bundle files, rules and plugin files; MCP server configuration is public too and installable with npx @athenode/cli use <slug>. Each table row leaves out entry (with byId) and plugin (with pluginById), described in "## Scope"; the other parameters are in the tool descriptions.
| Request | Tool | Notes |
|---|---|---|
| Browse or search the library | library_list |
Takes a search text (query), a category and a page size (limit), and has no sort order of its own; pass nextCursor back as cursor, with the same query and category, for the next page. Show name, version, publisher and counts. |
| Show one entry | library_get |
Its metadata, version log and the lists of its items, without their texts. |
| Read one item of an entry | library_item |
An agent, skill, skill file, MCP server, file or the rules text. Use it to show the user what an entry holds before they add it or choose a replacement. |
| Add an entry as a new plugin | library_add |
Creates a new plugin on the server only: the installed plugin and the local files do not change. If the project already has a plugin of that name (plugin_name_conflict), offer the suggested free name. |
| Merge an entry into a plugin | library_merge_preview, then library_merge |
Always preview first and show the new, conflicting and identical items and the state of the rules. Pass the user's choices as decisions, built from the preview; without decisions everything new is added, nothing is replaced and the rules are kept. |
| Update a plugin added from the library | library_update_preview, then library_update |
Only for a plugin that was added as a whole from the library and has a newer version available (see plugins_list). The same preview and choices as a merge. |
| Publish a plugin, or a new version of it | library_publish |
One tool for both: a plugin that already has an entry gets the next version, with an optional note. Every publish also turns the entry's public display on, unless an administrator made it unavailable for the entry; confirmPublic: true is the one consent to both, and the tool takes no publicDisplay. A first publish beyond the plan's library entry limit (3 entries on the Free plan) is refused; new versions are not limited. Needs the confirmation of step 3 of "## Flow". |
| Change an entry's name, description, category or public display | library_edit |
Creates no new version. publicDisplay: true needs confirmPublic: true and the confirmation of step 3 of "## Flow"; publicDisplay: false needs neither. |
| Unpublish an entry | library_unpublish |
Confirm first (step 3 of "## Flow"). |
- A merge or update with
decisionsis refused when the plugin or the entry changed since the preview. Repeat the preview, show the user what is different and apply with the new values; never retry with the old ones. - A merge or update into the installed plugin regenerates the local files (see step 5 of "## Flow"); into any other plugin it changes the server only.
- A plugin added with
library_addcarries the publisher'ssettings/files. After the user installs it, suggest theatn-settingsskill to make them fit this project. - Likes and skipping a version exist only in the web app.
Safeguards
Name the consequence in the confirmation question whenever one of these applies:
- The installed plugin (
plugins_delete): this project loses its skills, agents, rules and MCP servers on the next regeneration. Suggest installing another plugin first. - The
athenodeMCP server (mcp_servers_remove, or an update of its command or arguments): every tool this and every other Athenode skill uses comes from it; without it nothing works in a project that has the plugin installed untilnpx @athenode/cli initis re-run on a plugin that has it. - The
settings/files (plugins_files_delete, or an update of a## Parametersor## Rulessection): the specification skills load them. Change parameters and rules by invoking theatn-settingsskill instead; here, edit only their## Customsections, keeping the other sections byte-for-byte. - The built-in skills and agents (
atn-apply,atn-decompose,atn-mindmap,atn-settings,atn-manage,atn-todo-enqueue,atn-todo-dequeue, and thespec-*andtodo-*agents): they invoke each other by name, so removing or renaming one breaks the others. A changed built-in skill or agent no longer receives Athenode's updates. - The
MCP,Settings,QuestionsandLanguagesections of the rules: every Athenode agent and skill relies on them; keep them when changing the rules unless the user explicitly asks to drop them. The same holds for a merge or update that replaces the rules. - Publishing (
library_publish): the whole plugin becomes visible to every signed-in Athenode user and stays so until the entry is unpublished. Publish only the plugin the user named, never one you chose, and never to get around a limit or a refusal. The check for literalenvandheadersvalues is the only one made for the user: command arguments, URLs, rules, files and the texts of skills and agents are theirs to review. - Public display (
library_publish,library_edit): it puts the entry's details and the full content of its agents, skills with their bundle files, rules and plugin files on the open web. Publishing always turns it on, so never publish without the user's yes to the publishing question of step 3, which names the open web. Withlibrary_editturn it on only when the user asked for it for that entry, never on your own judgment. If the server refuses because public display is unavailable for the entry, report that and do not retry; turning it off still works. - A replaced built-in skill, agent or
settings/file (library_merge,library_update,plugins_pull,plugins_external_import,plugins_external_update): the consequences of the bullets above apply to it as to a manual change.
Without a user to ask, perform no destructive operation, no publishing and no merge or update that replaces anything, and report each as skipped. A plugins_pull, plugins_external_import or plugins_external_update that replaces or removes anything is such a merge. The same holds for turning public display on: without a user to ask, never pass publicDisplay: true to library_edit.
Report
- Every operation performed, with the object's name (and id for plugins) and what changed; listings as a compact table. Name the plugin whenever it is not the installed one.
- Every operation skipped, declined or failed, with the reason or the error text.
- What the user has to do next: the step of step 5 of "## Flow", per tool, for new or renamed skills, agents and MCP servers of the installed plugin; export the environment variables a server references; run
npx @athenode/cli init --plugin <id or slug>to install a new plugin — one created here, imported or added from the library — or one changed here that is not installed. - After a publish, the entry's name and version; after a merge, update or import, what was added, replaced and removed.
SKILL.md
SKILL.md holds the skill's instructions; it is edited on the Instructions tab.
Frontmatter written into each target's SKILL.md.
Common
No fields set for this target.