agentleFS
mohitkalemohitkale/wordpress-devkit/skills/plugin-scaffold/SKILL.md

plugin-scaffold

Skill1 starsChanged 4 months agoMITView on GitHub

Scaffold a WordPress plugin. Use this when the user asks to create a new WordPress plugin, start a plugin from scratch, or generate the plugin header and required files. Produces the main plugin file with a valid header, uninstall.php, an includes directory, and readme.txt.

  • Deletes or force-pushes

1 other project uses a version of this.

Adopted by

Most recently taken up by

  • Other versions1 project uses a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 1

    1. brianshepardpss/plugin-creator-plugin★ 0same name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • In this repository5 other files it gives its agents.

The file

We split this skill into the rules it gives an agent

10 rules. About 0 are common, 5 are distinctive, and 5 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈5

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Create a minimal, production-ready plugin skeleton with a valid header, an ABSPATH guard, a class-based bootstrap, an uninstall hook, and a …

    line 10
  2. Very specific:

    If $ARGUMENTS is empty, ask for a slug before writing any files.

    line 16
  3. Distinctive:

    Use Glob to check that the target directory does not already contain a file with the plugin header.

    line 21
  4. Distinctive:

    Write the five files listed in the Output section.

    line 23
  5. Very specific:

    After writing, print the activation command (wp plugin activate <slug>) and the admin alternative (Plugins > Installed Plugins > Activate).

    line 24
  6. Distinctive:

    Write exactly these files relative to the plugin root.

    line 36
  7. Very specific:

    Do not leave an empty index.php as a security placeholder.

    line 206
  8. Very specific:

    Do not delete user data in the deactivation hook.

    line 207
  9. Very specific:

    Do not start at version 1.0.0.

    line 208
  10. Distinctive:

    Do not hardcode the slug in more than one place.

    line 209

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Scaffold a WordPress plugin

Create a minimal, production-ready plugin skeleton with a valid header, an ABSPATH guard, a class-based bootstrap, an uninstall hook, and a readme.txt that wordpress.org accepts.

Inputs

$ARGUMENTS is the plugin slug. It must be lowercase, use hyphens, and match the final plugin directory name. Example: acme-forms.

If $ARGUMENTS is empty, ask for a slug before writing any files.

Workflow

  1. Confirm the target directory is wp-content/plugins/<slug>/. If the current working directory is not a WordPress install, ask the user where to scaffold the plugin.
  2. Use Glob to check that the target directory does not already contain a file with the plugin header. If it does, stop and ask the user whether to overwrite.
  3. Announce each file you are about to write.
  4. Write the five files listed in the Output section.
  5. After writing, print the activation command (wp plugin activate <slug>) and the admin alternative (Plugins > Installed Plugins > Activate).

Naming convention

Given slug acme-forms:

  • Directory: acme-forms
  • Main file: acme-forms.php
  • Text domain: acme-forms
  • Prefix for functions, classes, constants: acme_forms_ or Acme_Forms_

Output

Write exactly these files relative to the plugin root.

acme-forms.php

<?php
/**
 * Plugin Name:       Acme Forms
 * Plugin URI:        https://example.com/acme-forms
 * Description:       Short description of what the plugin does.
 * Version:           0.1.0
 * Requires at least: 6.6
 * Requires PHP:      8.1
 * Author:            Your Name
 * Author URI:        https://example.com
 * License:           GPL-2.0-or-later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       acme-forms
 * Domain Path:       /languages
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

define( 'ACME_FORMS_VERSION', '0.1.0' );
define( 'ACME_FORMS_PATH', plugin_dir_path( __FILE__ ) );
define( 'ACME_FORMS_URL', plugin_dir_url( __FILE__ ) );

require_once ACME_FORMS_PATH . 'includes/class-acme-forms.php';

register_activation_hook( __FILE__, array( 'Acme_Forms', 'activate' ) );
register_deactivation_hook( __FILE__, array( 'Acme_Forms', 'deactivate' ) );

add_action( 'plugins_loaded', array( 'Acme_Forms', 'instance' ) );

includes/class-acme-forms.php

<?php
/**
 * Main plugin class.
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

class Acme_Forms {

    private static $instance = null;

    public static function instance() {
        if ( null === self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
        add_action( 'init', array( $this, 'load_textdomain' ) );
    }

    public function load_textdomain() {
        load_plugin_textdomain( 'acme-forms', false, basename( ACME_FORMS_PATH ) . '/languages' );
    }

    public static function activate() {
        // Runs once on activation. Flush rewrite rules if the plugin adds custom post types.
        flush_rewrite_rules();
    }

    public static function deactivate() {
        // Runs on deactivation. Do not delete data here.
        flush_rewrite_rules();
    }
}

uninstall.php

<?php
/**
 * Runs only when the user deletes the plugin from the admin.
 * Delete options, custom tables, and scheduled events here.
 */

if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
    exit;
}

delete_option( 'acme_forms_settings' );
delete_option( 'acme_forms_version' );

// Example: drop a custom table if the plugin created one.
// global $wpdb;
// $table = $wpdb->prefix . 'acme_forms_submissions';
// $wpdb->query( "DROP TABLE IF EXISTS {$table}" );

// Example: clear scheduled cron.
// wp_clear_scheduled_hook( 'acme_forms_daily_cleanup' );

readme.txt

=== Acme Forms ===
Contributors: yourname
Tags: forms, contact
Requires at least: 6.6
Requires PHP: 8.1
Stable tag: 0.1.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

One-line description of the plugin.

== Description ==

A longer description of the plugin. Explain the problem it solves and the main features.

== Installation ==

1. Upload the plugin folder to `/wp-content/plugins/`.
2. Activate the plugin through the Plugins menu in WordPress.

== Frequently Asked Questions ==

= Does it work with classic themes? =

Yes.

== Changelog ==

= 0.1.0 =
* Initial release.

.gitignore

vendor/
node_modules/
*.log
.DS_Store
.vscode/
.idea/

Example

User runs /wordpress-devkit:plugin-scaffold acme-forms.

The skill writes these files:

wp-content/plugins/acme-forms/
  acme-forms.php
  uninstall.php
  readme.txt
  .gitignore
  includes/class-acme-forms.php

The user then activates with wp plugin activate acme-forms.

Do not

  • Do not leave an empty index.php as a security placeholder. Use the ABSPATH guard at the top of every PHP file instead.
  • Do not delete user data in the deactivation hook. Deletion belongs in uninstall.php.
  • Do not start at version 1.0.0. Start at 0.1.0 and move up with real releases.
  • Do not hardcode the slug in more than one place. Derive constants and text domains from a single prefix.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.