plugins/lt-dev/skills/developing-claude-plugins/SKILL.md
Develops, optimizes, and validates Claude Code plugins, skills (SKILL.md), commands, agents, hooks (hooks.json), and scripts. Ensures consistency with official best practices. Activates when creating, editing, or reviewing files in plugins/ directory, .claude-plugin/, plugin.json, permissions.json, or marketplace.json. Covers YAML frontmatter, element structure, cross-references, naming conventions, and plugin manifest validation. NOT for application development (use domain-specific skills).
npx skillsauth add lennetech/claude-code developing-claude-pluginsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an expert in developing Claude Code marketplaces and plugins. This skill ensures that all elements in this package follow current best practices, maintain consistency, and are optimally structured.
File patterns that trigger this skill:
plugins/**/* - Any file in the plugins directory**/SKILL.md - Skill definition files**/commands/**/*.md - Command files**/agents/**/*.md - Agent files**/hooks/**/* - Hook configurations and scriptsmarketplace.json - Marketplace definitionplugin.json - Plugin manifestsargument-hint with [...] brackets MUST be quoted — argument-hint: [branch-name] is parsed by YAML as a list (["branch-name"]) and breaks the command silently. Always write argument-hint: "[branch-name]". This is the #1 cause of broken commands across the marketplace.description with embedded "..." MUST use single-quote wrapping — description: 'Activates when user says "rebase"' works. description: "Activates when user says "rebase"" is invalid YAML. Always verify with claude plugin validate <plugin-dir>.permissionMode, mcpServers, and hooks — Security restriction since docs 2.1.78+. Setting them looks valid but silently has no effect. Plugin-agents needing MCP must add a body note that MCP must be configured in the user's session.model: and effort: on agents DEGRADES the user's setup — If developers run with Opus 4.7 + effort: high, an agent with model: sonnet, effort: medium runs SLOWER and WORSE than the user's default. Use model: inherit + no effort field (inherit) unless explicitly upgrading (effort: max for security/review-critical agents).Agent tool does NOT work in subagents — Listing Agent in a subagent's tools: is silently ignored. Subagents cannot spawn sub-subagents. For parallel work inside an agent, use isolation: worktree instead.Skill and LSP are NOT valid Claude Code tools — Listing them in tools: causes frontmatter validation to fail. Skills load via skills: frontmatter, LSP runs implicitly.permissions.json usedBy arrays drift silently — When you rename an agent or skill, the usedBy references in permissions.json don't auto-update. Run grep -r "old-name" plugins/*/permissions.json before finalizing a rename.${CLAUDE_PLUGIN_DATA} (since 2.1.78), not the skill directory itself.Actions that trigger this skill:
CRITICAL: Before ANY implementation or optimization, fetch the latest official documentation.
Fetch these GitHub sources first:
WebFetch: https://github.com/anthropics/claude-code/blob/main/plugins/README.md
WebFetch: https://github.com/anthropics/skills/blob/main/README.md
For specific topics, use targeted searches:
WebSearch: "Claude Code [topic] documentation site:claude.com"
Topics to search when relevant:
Apply the patterns and requirements from these sources.
Purpose: Provide contextual expertise that enhances Claude's capabilities in specific domains.
Structure:
skills/
└── skill-name/
├── SKILL.md # Main skill definition (REQUIRED)
├── reference.md # Detailed reference documentation
├── examples.md # Usage examples
└── [topic].md # Additional topic-specific files
SKILL.md Template:
---
name: skill-name-kebab-case
description: Concise description (max 1024 chars, ideal 500-700). Formula: [What it does] + [When to use it] + [Key capabilities]. Must trigger auto-detection correctly.
---
# Skill Title
[Introductory paragraph explaining the skill's purpose]
## When to Use This Skill
- [Trigger condition 1]
- [Trigger condition 2]
## Core Capabilities
[Main content organized by capability]
## Related Skills
- `related-skill-1` - [relationship]
- `related-skill-2` - [relationship]
Key Principles:
Purpose: User-triggered actions invoked via /command-name.
Structure:
commands/
├── simple-command.md
└── category/
├── sub-command-1.md
└── sub-command-2.md
Template:
---
description: What this command does (shown in /help and command list)
argument-hint: "[optional-args]" # Optional: shown in autocomplete (MUST quote if value contains brackets)
allowed-tools: Read, Grep, Bash # Optional: restrict tool access
model: claude-3-5-sonnet-20241022 # Optional: force specific model
---
# Command Title
[Brief description of what this command accomplishes]
## When to Use This Command
- [Use case 1]
- [Use case 2]
## Workflow
### Step 1: [Action]
[Instructions]
### Step 2: [Action]
[Instructions]
## Examples
[Practical examples of command usage]
Naming: Use kebab-case, e.g., create-story.md, git/commit-message.md
Purpose: Autonomous agents that handle complex, multi-step tasks with specific tool access.
File: agents/agent-name.md
Template:
---
name: agent-name
description: When to use this agent and what tasks it handles autonomously
model: sonnet | opus | haiku
tools: Bash, Read, Grep, Glob, Write, Edit
permissionMode: default | bypassPermissions
skills: optional-comma-separated-skills
---
[Agent persona and mission]
## Use Cases
- [When to spawn this agent]
- [Specific task types it handles]
## Execution Protocol
[Detailed workflow and phases]
## Output Format
[Expected output structure]
Key Principles:
Purpose: Automated responses to Claude Code events.
Structure:
hooks/
├── hooks.json # Hook definitions
└── scripts/ # Hook handler scripts
└── handler.ts
hooks.json Template:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "/path/to/script.sh"
}
]
}
]
}
}
Fields:
| Field | Type | Description |
|-------|------|-------------|
| matcher | string | Tool filter: "Write", "Write\|Edit", "Bash(npm test*)", or omit for all |
| type | string | "command" (shell) or "prompt" (Claude evaluation) |
| command | string | Shell command (for type="command") |
| timeout | number | Seconds before timeout (default: 60, optional) |
Events:
PreToolUse - Before a tool executesPostToolUse - After a tool executesPermissionRequest - When permission is requestedUserPromptSubmit - When user submits a promptSessionStart - Session initializationSessionEnd - Session teardownStop - When main agent finishesSubagentStart - When subagent startsSubagentStop - When subagent finishesTeammateIdle - Agent Teams: teammate waiting for workTaskCompleted - Agent Teams: task finishedPreCompact - Before context compactionWhen optimizing existing elements:
1. Read the element completely
2. Identify the element type and purpose
3. Fetch current best practices from documentation
4. Compare against other elements in the same category
5. List specific issues and improvements
1. Present findings to the user
2. Propose specific changes with rationale
3. Highlight any breaking changes or dependencies
4. Get approval before implementation
1. Make changes incrementally
2. Maintain backwards compatibility where possible
3. Update cross-references in related elements
4. Verify no broken references
1. Validate YAML frontmatter syntax
2. Check markdown rendering
3. Verify all cross-references work
4. Test any commands or workflows
| User Intent | Correct Skill | |------------|---------------| | "Create a new skill" | THIS SKILL | | "Optimize plugin.json" | THIS SKILL | | "Add a hook for validation" | THIS SKILL | | "Create a NestJS module" | generating-nest-servers | | "Build a Vue component" | developing-lt-frontend | | "Update npm packages" | maintaining-npm-packages |
Works closely with:
using-lt-cli skill - For Git operations in this packagegenerating-nest-servers skill - When adding NestJS-related commands or skillsdeveloping-lt-frontend skill - When adding Nuxt-related commands or skillsmaintaining-npm-packages skill - When adding maintenance-related commandsWhen modifying any skill, command, or agent in this package, this expertise should inform the changes.
development
Single source of truth for the lenne.tech fullstack production-readiness checklist. Defines the eight pillars (configuration & secrets, observability & logging, health & lifecycle, security hardening, data durability, resilience under load, deployment hygiene, runbook & rollback) with concrete file/line evidence requirements per pillar, severity classification (Critical / Major / Minor), and a canonical machine-parseable report block. Activates whenever an agent or command needs to gate a release on production-readiness — currently used by /lt-dev:production-ready, lt-dev:production-readiness-orchestrator, and the devops-reviewer (read-only). NOT for OWASP-style code-level security review (use security-reviewer). NOT for npm dependency audits (use maintaining-npm-packages).
development
Single source of truth for executing GitLab CI/CD pipelines locally with the same image, env vars, and service containers as the real runner — so pipeline failures are caught before push. Defines pipeline discovery (.gitlab-ci.yml + includes), per-job execution via gitlab-runner exec, service-container orchestration (Mongo, Redis, MailHog), env injection without secrets, cache/artifact handling, and a job-by-job verdict report. Also describes the GitHub Actions equivalent via act for projects that mirror to GitHub. Activates whenever an agent or command needs to validate that the CI pipeline will pass — currently used by /lt-dev:production-ready and lt-dev:production-readiness-orchestrator. NOT for running the local check script (use running-check-script). NOT for writing or refactoring CI configs (use the devops agent).
development
Single source of truth for designing, running, and interpreting k6 load tests against lenne.tech fullstack APIs. Defines installation paths (brew, docker, npm), the three canonical scenarios (smoke / load / soak), endpoint discovery from the generated SDK, realistic Better-Auth login flows, threshold defaults for ~10 concurrent users (p95 < 500ms, error rate < 1%, http_req_failed < 1%), result interpretation, and the optimisation ladder when the system fails (DB indices, query rewrites, caching, connection pool sizing, rate-limit relaxation, payload trimming). Activates whenever an agent or command needs to validate that the API is stable for ~10 concurrent users performing many actions in short time, or to detect performance regressions via k6. Currently used by /lt-dev:production-ready, lt-dev:production-readiness-orchestrator, and lt-dev:performance-reviewer. NOT for Lighthouse frontend performance (use a11y-reviewer). NOT for unit performance assertions (use the test runner directly).
tools
Migrates lenne.tech projects from the legacy jest+eslint+prettier toolchain to the current vitest+oxlint+oxfmt baseline used by nest-server-starter and nuxt-base-starter. Covers swc decoratorMetadata config, the @Prop union-type fix for SWC, supertest default-import correction, ESM/CJS interop, the Nitro PORT-vs-NITRO_PORT bug, ANSI escape stripping in workspace runners (lerna/nx), free-port logic for check-server-start.sh, the offers-pattern config.env.ts (NSC__-only + fail-fast + auto-derived appUrl), and the multi-phase check-envs.sh smoke test. Activates whenever someone is migrating an existing project to the new toolchain, debugging "Cannot determine a type for the X field" Mongoose errors, ERR_SOCKET_BAD_PORT crashes from check-server-start, or wants to align an existing project with the current starter conventions.