Plugin Submission Checklist¶
Use this checklist to prepare your plugin for submission to maid-contrib. Complete all required items before submitting your plugin.
Quick Check¶
Run the automated quality checker to verify most requirements:
This will check protocol compliance, tests, coverage, linting, type hints, and documentation.
Pre-Submission Checklist¶
Required Files¶
Your plugin repository must contain these files:
- [ ]
pyproject.toml- Package configuration with correct metadata - [ ]
README.md- Comprehensive documentation - [ ]
LICENSE- OSI-approved open source license - [ ]
CHANGELOG.md- Version history - [ ]
src/<package>/__init__.py- Package entry point with exports - [ ]
src/<package>/pack.py- ContentPack implementation - [ ]
src/<package>/py.typed- Type hint marker file - [ ]
tests/- Test directory with test files - [ ]
tests/conftest.py- Pytest fixtures
pyproject.toml Requirements¶
Verify your pyproject.toml includes:
[project]
name = "maid-your-plugin-name" # Must start with "maid-"
version = "x.y.z" # Semantic version
description = "Clear description" # One-line description
readme = "README.md"
license = {text = "MIT"} # Or other OSI-approved license
requires-python = ">=3.12"
authors = [
{name = "Your Name", email = "you@example.com"},
]
keywords = ["maid", "mud", ...] # Include "maid"
classifiers = [
"Development Status :: ...",
"Programming Language :: Python :: 3.12",
"Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)",
]
dependencies = [
"maid-engine>=0.2.0", # Declare MAID dependency
]
[project.entry-points."maid.content_packs"]
your-plugin = "your_plugin:YourContentPack" # Entry point for discovery
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
- [ ] Name starts with
maid- - [ ] Version follows semantic versioning
- [ ] Description is clear and concise
- [ ] License is specified
- [ ] Python 3.12+ required
- [ ] Authors with valid email
- [ ] Keywords include "maid"
- [ ] MUD classifier present
- [ ] MAID dependencies declared
- [ ] Entry point configured
- [ ] Build system specified
README.md Requirements¶
Your README must include these sections:
- [ ] Title and Badge - Plugin name with relevant badges
- [ ] Description - What the plugin does (2-3 sentences)
- [ ] Features - Bulleted list of features
- [ ] Installation - How to install (
uv addorpip install) - [ ] Quick Start - Minimal working example with code
- [ ] Commands - Table of all commands with usage
- [ ] Events - Table of events emitted/handled (if any)
- [ ] Components - Table of components provided (if any)
- [ ] Configuration - Environment variables and settings
- [ ] Requirements - MAID version and other dependencies
- [ ] License - License type
Example README structure:
# Your Plugin Name
Brief description of what your plugin does.
## Features
- Feature 1
- Feature 2
## Installation
\`\`\`bash
uv add maid-your-plugin
\`\`\`
## Quick Start
\`\`\`python
from maid_engine import GameEngine
from your_plugin import YourContentPack
engine = GameEngine(settings)
engine.load_content_pack(YourContentPack())
await engine.start()
\`\`\`
## Commands
| Command | Description | Usage |
|---------|-------------|-------|
| `cmd1` | Does thing | `cmd1 <arg>` |
## Configuration
| Variable | Default | Description |
|----------|---------|-------------|
| `MAID_YOUR_PLUGIN__SETTING` | `value` | What it does |
## Requirements
- MAID Engine >= 0.2.0
- Python >= 3.12
## License
MIT License
Testing Requirements¶
- [ ] Tests exist -
tests/directory with test files - [ ] Tests pass - All tests pass with
uv run pytest - [ ] Coverage >= 80% - Minimum 80% line coverage
- [ ] Protocol tests - Tests verify ContentPack protocol compliance
- [ ] Component tests - Unit tests for all components
- [ ] System tests - Unit tests for all systems
- [ ] Command tests - Unit tests for all command handlers
- [ ] Integration tests - Tests for plugin loading and interactions
Verify coverage:
Code Quality Requirements¶
- [ ] Linting passes -
uv run ruff check src/ - [ ] Formatting passes -
uv run ruff format --check src/ - [ ] Type checking passes -
uv run mypy src/ - [ ] No TODO comments - Resolve or document all TODOs
- [ ] No commented code - Remove unused commented code
- [ ] Consistent style - Follow PEP 8 conventions
Documentation Requirements¶
- [ ] All public classes documented - Google-style docstrings
- [ ] All public functions documented - Args, Returns, Raises sections
- [ ] Module docstrings - Each module has a top-level docstring
- [ ] Type hints complete - All public APIs have type hints
- [ ] Examples in docstrings - Complex functions include examples
Example docstring:
def process_command(player: Entity, args: list[str]) -> str:
"""Process the custom command for a player.
Executes the command logic and returns the result message
to be displayed to the player.
Args:
player: The entity executing the command.
args: Command arguments provided by the player.
Returns:
The message to display to the player.
Raises:
CommandError: If the command cannot be executed.
Example:
>>> result = process_command(player, ["arg1", "arg2"])
>>> print(result)
"Command executed successfully!"
"""
Security Requirements¶
- [ ] No hardcoded secrets - No API keys, passwords, or tokens in code
- [ ] Input validation - All user input is validated
- [ ] No unsafe operations - No
eval(),exec(), orpickle.loads()with untrusted data - [ ] Safe file operations - Path traversal prevention
- [ ] Dependency audit - No known vulnerabilities in dependencies
Check for vulnerabilities:
Protocol Compliance¶
Your ContentPack must implement:
- [ ]
manifestproperty - Returns validContentPackManifest - [ ]
get_dependencies()- Returns list of dependency pack names - [ ]
get_systems()- Returns list of System instances - [ ]
get_events()- Returns list of Event types - [ ]
register_commands()- Registers commands with registry - [ ]
register_document_schemas()- Registers persistence schemas - [ ]
on_load()async - Handles pack loading - [ ]
on_unload()async - Handles pack unloading
Example implementation:
from maid_engine.plugins.protocol import ContentPack, ContentPackManifest
class YourContentPack(ContentPack):
@property
def manifest(self) -> ContentPackManifest:
return ContentPackManifest(
name="your-plugin",
version="1.0.0",
description="Plugin description",
author="Your Name",
)
def get_dependencies(self) -> list[str]:
return ["maid-stdlib"]
def get_systems(self, world: World) -> list[System]:
return [YourSystem(world)]
def get_events(self) -> list[type[Event]]:
return [YourEvent]
def register_commands(self, registry: CommandRegistry) -> None:
registry.register("yourcommand", your_command_handler)
def register_document_schemas(self, store: DocumentStore) -> None:
store.register_collection("your_data", YourDataSchema)
async def on_load(self, engine: GameEngine) -> None:
pass # Initialization logic
async def on_unload(self, engine: GameEngine) -> None:
pass # Cleanup logic
Submission Form Preparation¶
Before filling out the submission form, prepare these items:
Required Information¶
- [ ] Plugin Name - Name of your plugin (without
maid-prefix) - [ ] Repository URL - Public GitHub/GitLab URL
- [ ] PyPI Name - Package name if published to PyPI (optional)
- [ ] Description - 2-3 sentence description of functionality
- [ ] Category - Select the most appropriate category
- [ ] Compatible MAID Version - Minimum version (e.g.,
>=0.2.0) - [ ] Dependencies - List of MAID plugin dependencies
- [ ] Installation Instructions - Command to install
- [ ] Usage Example - Code showing how to use the plugin
- [ ] License - License type
Optional Information¶
- [ ] Documentation URL - Link to full documentation
- [ ] Demo/Screenshots - Visual examples
- [ ] Video Tutorial - Link to demo video
Final Verification¶
Run these final checks before submitting:
# Run all quality checks
uv run maid plugin check /path/to/plugin
# Verify the package builds
uv build
# Verify the package installs
uv pip install dist/maid_your_plugin-*.whl
# Verify entry point works
python -c "from your_plugin import YourContentPack; print(YourContentPack().manifest)"
Submission Confirmation¶
Before submitting, confirm the following:
- [ ] I have read and understand the Plugin Review Process
- [ ] I have read and understand the maid-contrib guidelines
- [ ] All items in this checklist are complete
- [ ] I am the author or have permission to submit this plugin
- [ ] I agree to maintain this plugin and respond to issues
- [ ] I agree to the contribution license agreement
After Submission¶
- Monitor your submission issue for feedback
- Respond promptly to reviewer questions
- Make requested changes in a timely manner
- Celebrate when your plugin is approved!
Getting Help¶
If you have questions while preparing your submission:
- GitHub Discussions - Ask the community
- Plugin Review Process - Understand review criteria
- Publishing Guide - Detailed publishing instructions
- Testing Guide - How to write good tests