Agent skill

Plugin Author

by WrongStack in WrongStack/WrongStack

A skill your agent uses when creating, reviewing, or refactoring a WrongStack plugin in packages/plugins/.

MITAuto-check passedDevelopment

Install Plugin Author

skills CLI
$ npx skills add WrongStack/WrongStack --skill plugin-author -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install WrongStack/WrongStack plugin-author --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/WrongStack/WrongStack.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/core/skills/plugin-author .claude/skills/plugin-author && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
plugin-author
GitHub stars
370
Token cost
~4.1k tokens
SKILL.md length
1,305 words
Files
1
Skills in repo
38
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when creating, reviewing, or refactoring a WrongStack plugin in packages/plugins/.

  • Works in 7 steps: State at module scope → Idempotent setup → Teardown releases resources → …
  • Refactoring a WrongStack plugin in packages/plugins/
  • SKILL.md covers Overview, Rules, The Plugin interface and H1 audit pattern, plus 11 more sections
  • Calls pnpm

What it does

Plugin Author is an agent skill from WrongStack/WrongStack. Use this skill when creating, reviewing, or refactoring a WrongStack plugin in packages/plugins/. Covers the Plugin interface, tool registration, config schema, the H1 audit pattern (teardown + health), PluginAPI extension for host data, and the entry-point registration steps (package.json and index.ts). Triggers: user says "new plugin", "add a plugin", "plugin teardown", "plugin health", "register a tool", "PluginAPI extension".

Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Refactoring. It works with npm and Git. The repository describes itself as: An AI coding agent that reads your code, edits files, runs commands, and reasons through bugs — across a terminal REPL, a full-screen TUI, and a browser UI, while you keep your… The licence is MIT.

When your agent uses it

  • Refactoring a WrongStack plugin in packages/plugins/
  • Tasks that involve Refactoring

Example prompts

  • “new plugin”
  • “add a plugin”
  • “plugin teardown”
  • “/plugin-author”

Requirements

  • Node.js

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. State at module scope
  2. Idempotent setup
  3. Teardown releases resources
  4. Health reports per-session visibility
  5. src/index.ts — named re-export
  6. package.json — subpath export
  7. packages/cli/src/wiring/plugins.ts — built-in factory

What it can do on your machine

Read from SKILL.md and the folder at commit 57f6018. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Plugin Author loads about 4.1k tokens when it runs. Until then it costs about 112 tokens; SKILL.md has 1,305 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~112
When it runs · the whole SKILL.md, loaded when a task matches
~4.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from WrongStack/WrongStack at commit 57f6018, republished under its MIT licence (© WrongStack). 1,305 words, ~4,146 tokens.

Download SKILL.mdSave it as .claude/skills/plugin-author/SKILL.md (or your agent's skills folder).
name
plugin-author
description
Use this skill when creating, reviewing, or refactoring a WrongStack plugin in `packages/plugins/`. Covers the Plugin interface, tool registration, config schema, the H1 audit pattern (teardown + health), PluginAPI extension for host data, and the entry-point registration steps (package.json and index.ts). Triggers: user says "new plugin", "add a plugin", "plugin teardown", "plugin health", "register a tool", "PluginAPI extension".
audience
roster
version
1.1.0
required-capabilities
filesystem.read, filesystem.write, execution.shell
required-tools
bash, cron_cancel, cron_list, cron_schedule, edit, fetch, git, git_autocommit, json, read, search, secret_scanner_test, semver_bump, semver_changelog…
optional-capabilities
verification.run

Plugin Author — WrongStack

Overview

Guides the creation and maintenance of first-party plugins in packages/plugins/. A plugin is a TypeScript module that implements the Plugin interface from @wrongstack/core, registering tools, hooks, slash commands, or pipelines into the agent's runtime.

There are currently 21 official plugins in the suite:

PluginToolsHooksStateful
auto-docauto_doc—✅ teardown+health
git-autocommitgit_autocommit—✅ teardown+health
shell-checkshellcheck—✅ teardown+health
cost-trackercost_summary, cost_reset, cost_export—✅ teardown+health
file-watcherwatch_start, watch_stop, watch_list—✅ teardown+health
croncron_schedule, cron_list, cron_cancel—✅ teardown+health
template-enginetemplate_expand, template_render, template_create, template_list—✅ teardown+health
semver-bumpsemver_bump, semver_current, semver_changelog—✅ teardown+health
secret-scannersecret_scanner_status, secret_scanner_testPreToolUse + PostToolUse✅ teardown+health
todo-trackertodo_tracker_list/add/complete/drop/remove/pull/status—✅ teardown+health
token-budgettoken_budget_statusStop + PostToolUse✅ teardown+health
lint-gatelint_gate_statusPreToolUse (write|edit)✅ teardown+health
branch-guardbranch_guard_statusPreToolUse (bash|git_autocommit)✅ teardown+health
diff-summarydiff_summary_statusPostToolUse (write|edit)✅ teardown+health
commit-validatorcommit_validator_statusPreToolUse (bash|git_autocommit)✅ teardown+health
format-on-saveformat_on_save_statusPostToolUse (write|edit)✅ teardown+health
test-runner-gatetest_gate_statusPostToolUse (write|edit)✅ teardown+health
import-organizerimport_organizer_statusPostToolUse (write|edit)✅ teardown+health
todo-listenertodo_listener_statusPostToolUse (todo)✅ teardown+health
session-recapsession_recap_statusStop✅ teardown+health
spec-linkerspec_linker_statusPostToolUse (write|edit)✅ teardown+health

Rules

  1. Every plugin must implement teardown() and health(). Even stateless plugins (shell-check, semver-bump) add both — the teardown logs a completion line with per-session counters, and health() reports ok: true + counters for /diag plugins. This is the H1 audit pattern (see below).
  2. State at module scope, not in the setup() closure. The Plugin interface does not thread state from setup() → teardown(). If teardown needs to clean up a resource (timer, watcher, counter), the reference must live at module scope. State in the setup closure is unreachable from teardown and leaks on reload.
  3. setup() is idempotent. It must zero/clear state before re-initializing. Calling setup() twice (e.g. across a hot-reload) leaves a clean slate, not accumulated state.
  4. teardown() never deletes on-disk state. File-based plugins (todo-tracker) leave the file in place — the user may return. Only in-memory counters and resource handles (timers, watchers) are cleaned up.
  5. Tool names follow snake_case. Plugin-level tools registered via api.tools.register() must be unique across the suite. The built-in tools (bash, write, read, edit, fetch, search, json, todo, git, etc.) are always present; don't collide.
  6. apiVersion must satisfy ^0.1 (current kernel API = 0.1.10). Bump only when the PluginAPI surface breaks. Additive changes (new optional fields on PluginAPI) do NOT require a bump.
  7. Config goes under config.extensions['<plugin-name>'], not config.plugins. The loader's buildPluginOptions merges both surfaces; plugins read from api.config.extensions.

The Plugin interface

typescript
import type { Plugin } from '@wrongstack/core';

const plugin: Plugin = {
  name: 'my-plugin',
  version: '0.1.0',
  description: 'One-line summary for wstack plugins list',
  apiVersion: '^0.1.10',
  capabilities: { tools: true }, // hints for /diag

  // Optional: JSON Schema for config validation
  defaultConfig: { enabled: true },
  configSchema: {
    type: 'object',
    properties: {
      enabled: { type: 'boolean', default: true },
    },
  },

  // Called by the host to activate the plugin.
  setup(api) { /* register tools, hooks, events */ },

  // Called by the host during unload. Same api instance as setup.
  teardown(api) { /* clear state, release resources, log */ },

  // Called by /diag plugins. Return ok + message + counters.
  async health() {
    return { ok: true, message: 'healthy', invocationCount: 0 };
  },
};

export default plugin;

H1 audit pattern

After the 2026-06-03 audit found that several plugins leaked resources on reload (timers, chokidar watchers, in-memory caches unreachable from teardown), the following lifecycle pattern was formalized. Every plugin in the suite follows it.

1. State at module scope
typescript
// ✅ Module scope — teardown can reach this
const state = {
  invocationCount: 0,
  timers: new Map<string, NodeJS.Timeout>(),
  lastRun: null as null | { when: string; result: string },
};

// ❌ NEVER — setup closure, unreachable from teardown
setup(api) {
  const timers = new Map();  // LEAKS on reload
}
2. Idempotent setup
typescript
setup(api) {
  // Clear everything first, then re-init from config.
  state.invocationCount = 0;
  for (const t of state.timers.values()) clearTimeout(t);
  state.timers.clear();
  state.lastRun = null;

  // Now register tools, apply config, subscribe to events.
  api.tools.register({ /* ... */ });
}
3. Teardown releases resources
typescript
teardown(api) {
  const count = state.invocationCount;
  state.invocationCount = 0;
  state.lastRun = null;
  // Release every resource that was acquired in setup().
  for (const t of state.timers.values()) clearTimeout(t);
  state.timers.clear();
  api.log.info('my-plugin: teardown complete', { invocations: count });
}
4. Health reports per-session visibility
typescript
async health() {
  return {
    ok: true,
    message: state.lastRun === null
      ? 'my-plugin: no calls yet'
      : `my-plugin: last call at ${state.lastRun.when}`,
    invocationCount: state.invocationCount,
    lastRun: state.lastRun,
  };
}

Tool registration

typescript
api.tools.register({
  name: 'my_tool',
  description: 'What this tool does. Include when to use and what it returns.',
  inputSchema: {
    type: 'object',
    properties: {
      path: { type: 'string', description: 'File path' },
    },
    required: ['path'],
  },
  permission: 'auto',     // 'auto' | 'confirm'
  mutating: false,         // does it change external state?
  category: 'Project',
  async execute(input: Record<string, unknown>) {
    const path = input['path'] as string;
    // ... do the work ...
    return { path, result: '...' };
  },
});

Signal failure by throwing. The executor marks a call failed only when execute() throws (throw a ToolValidationError for bad input). A returned { ok: false }, { status: 'error' }, or "Error: ..." string is recorded and shown as a SUCCESS. Return normally only for real data outcomes (zero results, a check that computed "no").

Permission levels
PermissionWhen
autoSafe operations (read, list, query). No user confirmation.
confirmDestructive or side-effecting operations (write, commit, delete). User must approve.

Config surface

Two surfaces exist. The loader merges them:

  1. config.plugins — loading control: [{ name: 'my-plugin', enabled: false }]
  2. config.extensions['my-plugin'] — options: { option1: value1 }

Plugins read from api.config.extensions:

typescript
setup(api) {
  const ext = api.config.extensions?.['my-plugin'] as Record<string, unknown> | undefined;
  const myOption = (ext?.['myOption'] as string) ?? 'default';
}

If the plugin declares configSchema, the loader validates the options section before calling setup and rejects the plugin with a clear error on failure.

Hook registration (PreToolUse, PostToolUse, etc.)

typescript
// secret-scanner pattern: block tools whose args contain secrets
api.registerHook('PreToolUse', 'bash|write|edit', (input) => {
  const text = JSON.stringify(input.toolInput ?? {});
  if (detectSecret(text)) {
    return {
      decision: 'block',
      reason: 'Plaintext credential detected in tool arguments',
    };
  }
  // Omitted decision = allow (no-op)
});

Available events: PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, Stop, plus the observational Notification, SubagentStart, SubagentStop, PreCompact, PostCompact and SessionEnd (their outcome is ignored — they cannot block or add context).

HookOutcome fields:

  • decision: 'block' | 'allow' — block stops the action
  • reason: string — surfaced to the model when blocking
  • modifiedInput: Record<string, unknown> — PreToolUse replacement args
  • additionalContext: string — extra context folded back to the model

PluginAPI extension (cross-package host data)

When a plugin needs host data not yet on PluginAPI (e.g. modelsRegistry, projectDir), extend the surface in three steps:

  1. packages/core/src/types/plugin.ts — add the optional field to PluginAPI
  2. packages/core/src/plugin/api.ts — add to PluginAPIInit + DefaultPluginAPI
  3. packages/cli/src/wiring/plugins.ts — destructure + forward in setupPlugins

Precedent: commit 9bed619f added modelsRegistry?: ModelsRegistry for cost-tracker's pricing hydration.

Entry-point registration

After writing src/<name>/index.ts, wire it into two package files. The central scripts/build-package.mjs driver discovers plugin entry points from the exports map automatically.

1. src/index.ts — named re-export
typescript
export { default as myPluginPlugin } from './my-plugin/index.js';
2. package.json — subpath export
json
"./my-plugin": {
  "types": "./dist/my-plugin.d.ts",
  "import": "./dist/my-plugin.js"
}
3. packages/cli/src/wiring/plugins.ts — built-in factory
typescript
async () => (await import('@wrongstack/plugins/my-plugin')).default,

Tests

Every plugin gets two test files:

  • tests/<name>.test.ts — unit tests (mock API, tool registration, config validation, teardown log line, health() shape)
  • tests/<name>-exec.test.ts — integration tests (real filesystem, real CLI tools if applicable)

For the H1 pattern, extend tests/plugin-teardown.test.ts with a describe('<name>') block covering:

  • teardown logs a completion line and does not throw
  • health() reports ok + non-empty message
  • teardown zeros counters
Show full SKILL.md (536 more words)Show less

Anti-patterns

  • State in setup closure — leaks on reload. Always module scope.
  • Missing teardown — /diag plugins shows a gap; reload leaks.
  • Missing health() — operator can't confirm the plugin is alive.
  • Tool name collision — read, write, bash, etc. are built-in.
  • Deleting on-disk state in teardown — the user may return.
  • Blocking setup with async hydration — use void (async () => { ... })() for fire-and-forget; let the first call fall through to fallback if the async hasn't completed yet.
  • Not lowercasing model/config keys — case-insensitive lookup is the convention; model.toLowerCase() everywhere.

Workflow

  1. Create the plugin directory: src/<name>/index.ts
  2. Write the Plugin object: name, version, apiVersion, setup, teardown, health
  3. Register tools/hooks in setup()
  4. Add state + teardown + health following the H1 pattern
  5. Wire the package entry: index.ts and package.json
  6. Add to BUILTIN_PLUGIN_FACTORIES in CLI wiring
  7. Write tests: <name>.test.ts (unit) + extend plugin-teardown.test.ts
  8. Run verification: pnpm --filter @wrongstack/plugins test + pnpm --filter @wrongstack/plugins typecheck + pnpm --filter @wrongstack/plugins build
  9. Update src/index.ts doc comment — bump the plugin count

Out of scope

  • Don't put state in the setup() closure. State must live at module scope; the Plugin interface does not thread state from setup() to teardown(). Closure state leaks on reload.
  • Don't ship a plugin without teardown() and health(). Even stateless plugins add both. The H1 audit pattern is the floor; /diag plugins exposes the gap.
  • Don't make setup() non-idempotent. Calling setup() twice must leave a clean slate. Hot-reload must not accumulate state.
  • Don't delete on-disk state in teardown(). File-based plugins leave the file in place. Only in-memory counters and resource handles (timers, watchers) are cleaned.
  • Don't collide with built-in tool names. read, write, bash, edit, fetch, search, json, todo, git are reserved. Pick unique names; api.tools.register() enforces uniqueness.
  • Don't bump apiVersion for additive changes. New optional fields on PluginAPI don't break the contract. Bump only when the surface breaks.
  • Don't read config from config.plugins. Config options go under config.extensions['<plugin-name>']. The loader's buildPluginOptions merges both, but the convention is extensions.
  • Don't block setup() with async hydration. Use void (async () => { ... })() for fire-and-forget. The first call should fall through to fallback if the async hasn't completed.
  • Don't skip the test files. tests/<name>.test.ts (unit) and tests/<name>-exec.test.ts (integration) are required. Plugins without tests rot fast.
  • Don't lower-case-skip the model and config keys. Case-insensitive lookup is the convention; model.toLowerCase() everywhere.

Before returning

  • name, version, apiVersion: '^0.1.x' (current), description, capabilities set
  • Module-scope state, never in setup() closure
  • setup() idempotent: clears state before re-initializing
  • teardown() releases every resource acquired in setup(), never deletes on-disk state
  • health() returns { ok, message, invocationCount, lastRun? }
  • Tool names are unique snake_case; no collision with built-ins
  • Config read from api.config.extensions['<plugin-name>'], validated by configSchema
  • Hooks are registered via api.registerHook(...) with the correct event/matcher; HookOutcome shape honored
  • src/index.ts re-exports the plugin; package.json adds the subpath export
  • packages/cli/src/wiring/plugins.ts adds the built-in factory
  • Tests: <name>.test.ts + <name>-exec.test.ts + plugin-teardown.test.ts block
  • Verification: pnpm --filter @wrongstack/plugins test && typecheck && build all pass
  • src/index.ts doc comment updated with the new plugin count
  • <nextsteps> lists each open follow-up (config, hooks, tests, build)

Skills in scope

  • skill-creator — for the SKILL.md format and frontmatter rules
  • prompt-engineering — for crafting tool descriptions and usageHint
  • typescript-strict — for strict TypeScript patterns in plugin code
  • node-modern — for ESM imports, AbortSignal, and async patterns
  • testing — for vitest patterns and mock API construction
  • output-standards — for standardized <nextsteps> formatting

© WrongStack, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in packages/core/skills/plugin-author of WrongStack/WrongStack.

Open the folder on GitHubat commit 57f6018

Compare with similar skills

Plugin Author next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Plugin Author compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Plugin Author this skillWrongStack/WrongStack370—~4.1kAutomated safety check: PassMIT
Migrate Internal Package into GhostTryGhost/Ghost55k—~3.8kAutomated safety check: PassMIT
Open Code Review CLIalibaba/open-code-review44k—~3.1kAutomated safety check: PassApache-2.0
Codexskills-directory/skill-codex1.5k3 repos~1.8kAutomated safety check: PassMIT
Open Code Review Delegatealibaba/open-code-review44k—~2kAutomated safety check: PassApache-2.0
Verdaccio Pull Request Workflowverdaccio/verdaccio18k—~1.9kAutomated safety check: PassMIT

Similar skills

  • Moves a package from another TryGhost repository into Ghost as an internal workspace package while keeping its Git history, with checkpoints for the steps that need an administrator.

    55k GitHub stars~3.8k tokensUpdated today
    DevelopmentAuto-check passed
  • Open Code Review CLI

    alibaba/open-code-review

    Runs the ocr command-line tool to review Git changes, a commit or a branch comparison with an AI model, returning line-level comments and optionally applying fixes.

    44k GitHub stars~3.1k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Codex

    skills-directory/skill-codex

    A skill your agent uses when the user asks to run Codex CLI (codex exec, codex resume) or references OpenAI Codex for code analysis, refactoring, or automated editing

    1.5k GitHub starsUsed in 3 repos~1.8k tokens
    DevelopmentAuto-check passed
  • Open Code Review Delegate

    alibaba/open-code-review

    Has the host agent do the code review itself while the ocr CLI handles file selection and rule lookup, covering workspace changes, branch ranges or single commits.

    44k GitHub stars~2k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Takes a change through a verdaccio pull request: branch, local checks, changeset, title and body, labels, CI and review rounds, and ports to other release lines.

    18k GitHub stars~1.9k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Code Review

    yaklang/yakit

    对 Yakit 仓库的代码改动做规范化 code review:按代码逻辑、TS 定义、UI 引用与 Props、CSS 样式、依赖版本、配置项六个维度审查,检查测试用例缺失,强制执行 tsc 类型检查与 vitest 测试验证,输出「结果汇总 / 明细解释 / 合并结论」三块报告,经用户确认后写入文件。当用户要求 review、审查、评审代码改动,或在提交、合并、提 PR…

    7.8k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check: notes

More from WrongStack/WrongStack

All 38 skills in this repo
  • Design Craft

    WrongStack/WrongStack

    Design or substantially improve user-facing interfaces with a product-specific visual direction, content hierarchy, and rendered critique.

    370 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Design Critique

    WrongStack/WrongStack

    A skill your agent uses to audit an interface that already exists and say precisely why it looks generated, templated, or unfinished — a scored rubric across composition, typography, color, states…

    370 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Mailbox Bridge

    WrongStack/WrongStack

    A skill your agent uses when external coding agents (Claude Code, Aider, custom scripts) need to participate in the project's shared WrongStack mailbox, or when a user asks to "expose the mailbox"…

    370 GitHub stars~3.9k tokensUpdated today
    Auto-check passed
  • Multi Agent

    WrongStack/WrongStack

    A skill your agent uses whenever work can be split across multiple AI agents running in parallel, or when orchestrating leader/worker patterns in WrongStack.

    370 GitHub stars~3.6k tokensUpdated today
    Auto-check passed
  • Web Platform Baseline

    WrongStack/WrongStack

    Use this skill before asserting that a CSS, HTML or accessibility capability is available, unavailable, or the right tool — it carries dated, refreshable platform facts and refuses to let stale…

    370 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Wrongstack Mailbox

    WrongStack/WrongStack

    A skill your agent uses when the user wants to communicate with WrongStack's shared project mailbox from outside WrongStack — read messages sent by WrongStack agents, send replies, broadcast to all…

    370 GitHub stars~3.5k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Plugin Author

What does Plugin Author do?

A skill your agent uses when creating, reviewing, or refactoring a WrongStack plugin in packages/plugins/. Plugin Author is an agent skill from WrongStack/WrongStack. Use this skill when creating, reviewing, or refactoring a WrongStack plugin in packages/plugins/.

When should I use Plugin Author?

Plugin Author fits situations like: refactoring a WrongStack plugin in packages/plugins/; tasks that involve Refactoring.

How do I install Plugin Author in Claude Code?

Run `npx skills add WrongStack/WrongStack --skill plugin-author -a claude-code`. Or copy the skill folder (packages/core/skills/plugin-author in WrongStack/WrongStack) into .claude/skills/plugin-author in your project. Claude Code loads it when a task matches its description.

How do I install Plugin Author in Codex?

Run `npx skills add WrongStack/WrongStack --skill plugin-author -a codex`. Or copy the skill folder (packages/core/skills/plugin-author in WrongStack/WrongStack) into .agents/skills/plugin-author in your project. Codex loads it when a task matches its description.

Can I use Plugin Author in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add WrongStack/WrongStack --skill plugin-author -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/plugin-author, .gemini/skills/plugin-author, .github/skills/plugin-author and .opencode/skills/plugin-author in your project.

What does Plugin Author need to run?

Going by SKILL.md and its folder, Plugin Author needs the command-line tools its instructions call (pnpm). Our summary lists: Node.js.

Does Plugin Author access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Plugin Author safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Plugin Author use?

Plugin Author is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Plugin Author use?

About 4.1k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Plugin Author?

Skills that share tags, products or a category with Plugin Author: Migrate Internal Package into Ghost (TryGhost/Ghost, 55k stars), Open Code Review CLI (alibaba/open-code-review, 44k stars), Codex (skills-directory/skill-codex, 1.5k stars) and Open Code Review Delegate (alibaba/open-code-review, 44k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Plugin Author?

WrongStack (a GitHub organization) maintains it in WrongStack/WrongStack, which has 370 GitHub stars. The repository holds 38 skills in this directory. The repository was last updated on October 7, 2026.

Source: WrongStack/WrongStack on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.