maestro-skills
AGENTS.md5 starsChanged 3 months agoMITView on GitHub
Instructions for AI agents working in this repository. CLAUDE.md at the repo root is a symlink to this file, so Claude Code follows the same rules; Codex CLI reads AGENTS.md directly. Edit AGENTS.md only — never edit CLAUDE.md directly or replace the symlink with a copy. Every change to this repository MUST follow the Superpowers skill workflow, in order: 1. brainstorming — explore intent and design before writing anything; record the outcome in the PR description (YYYY-MM-DD-<topic>-design.md style). 2. writing-plans…
- Pipes a download into a shell
- Commits and pushes
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,542 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository32 other files it gives its agents.
- brainstormingSkill
- diagnosing-superpowersSkill
- diagram-studioSkill
- dispatching-parallel-agentsSkill
- executing-plansSkill
- finishing-a-development-branchSkill
- govard-laravelSkill
- govard-magentoSkill
- govard-symfonySkill
- govard-toolboxSkill
- govard-wordpressSkill
- maestro-designSkill
- magento2-backend-devSkill
- magento2-code-reviewSkill
- magento2-dev-coreSkill
- magento2-frontend-devSkill
- magento2-hyva-devSkill
- magento2-linterSkill
- magento2-performance-auditSkill
- magento2-security-scanSkill
- php-dev-coreSkill
- receiving-code-reviewSkill
- requesting-code-reviewSkill
- review-in-worktreeSkill
- subagent-driven-developmentSkill
- systematic-debuggingSkill
- test-driven-developmentSkill
- using-git-worktreesSkill
- using-superpowersSkill
- verification-before-completionSkill
- writing-plansSkill
- writing-skillsSkill
The file
Show its rules and text
We split this AGENTS.md into the rules it gives an agent
13 rules. About 0 are common, 3 are distinctive, and 10 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Distinctive: line 10
Every change to this repository MUST follow the Superpowers skill workflow, in order:
- Distinctive: line 20
Do not skip ahead to implementation or commit while a task's tests are red.
- Very specific: line 33
Never commit to master directly.
- Very specific: line 57
Every skill lives under skills/<name>/SKILL.md and nowhere else.
- Very specific: line 99
Every skill follows the Agent Skills standard (a SKILL.md file with name/description YAML frontmatter) — a format Claude Code, OpenCode, …
- Very specific: line 189
When editing a dependency's SKILL.md (magento2-dev-core, govard-toolbox), check whether the change invalidates guidance in the skills that …
- Very specific: line 259
Manifest-based safety: every path it creates is recorded in $CACHE_DIR/.manifest.
- Distinctive: line 263
Don't remove this check to "simplify" the linking loop.
- Very specific: line 325
Add a new ## [X.Y.Z] - YYYY-MM-DD section at the top of CHANGELOG.md (Keep a Changelog format: ### Added / ### Changed / ### Fixed etc.).
- Very specific: line 338
If skills/ changed, run claude plugin validate .
- Very specific: line 360
If the workflow fails on the changelog-extraction step, it's almost always because the ## [X.Y.Z] header in CHANGELOG.md doesn't exactly …
- Very specific: line 387
Forked superpowers skills stay verbatim: Never edit their prose or frontmatter locally (not even to add compatibility).
- Very specific: line 399
Always request approval before merge or release: never merge a PR/MR or publish a release (git tag/pnpm publish/gh release) without an …
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md 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.
Files
AGENTS.md
Instructions for AI agents working in this repository. CLAUDE.md at the repo
root is a symlink to this file, so Claude Code follows the same rules; Codex CLI
reads AGENTS.md directly. Edit AGENTS.md only — never edit CLAUDE.md
directly or replace the symlink with a copy.
Workflow: Superpowers skills are mandatory
Every change to this repository MUST follow the Superpowers skill workflow, in order:
- brainstorming — explore intent and design before writing anything; record the
outcome in the PR description (
YYYY-MM-DD-<topic>-design.mdstyle). - writing-plans — turn the approved spec into a task-by-task plan with exact test and implementation sketches; plans are transient working files, deleted once their batch ships.
- executing-plans — implement task by task with strict TDD: failing test first, verify RED, implement, verify GREEN, then commit that task before starting the next.
Do not skip ahead to implementation or commit while a task's tests are red.
Specs and plans: active work lives at the meta root, in
maestro-harness/docs/specs/ and maestro-harness/docs/plans/, named
YYYY-MM-DD-maestro-skills-<name>.md. Plans are transient and deleted once the
batch ships. Once shipped, this repo commits the design record under
docs/superpowers/{specs,plans}/, as the meta-root AGENTS.md states. That
docs/ directory does not exist in this checkout yet; create it with the first
record you commit, and never create it for in-progress work. Describe durable
outcomes in the PR description as well.
Git workflow
- Never commit to
masterdirectly; start a feature branch per work session (fix/...,feat/...,docs/...). One TDD task = one commit while executing a plan; squash at merge time if the history reads better squashed. - Conventional commit subjects (
fix:,feat:,docs:,chore:), imperative mood. - Open a pull request once the branch is green; link it to the plan that produced it.
What this repo is
A dual-ecosystem plugin (maestro-skills, npm @ddtcorex/maestro-skills)
bundling its skills in two halves: the Magento 2 / Govard domain skills written
here (ls skills, minus the forked names), plus the superpowers process library forked verbatim from
obra/superpowers v7.0.0 (MIT — see
THIRD-PARTY-NOTICES.md). Distributed via self-listing marketplaces for both
Claude Code and Codex CLI, and as a DeepSeek Harness Cordis plugin. There is no
application code beyond src/ (the Cordis plugin); tests/ is a vitest suite
that guards the packaged skill catalog and the plugin's own contracts, and
pnpm verify + pnpm test are the local gate. The repository is the plugin
(in every ecosystem at once), and its content is Markdown (SKILL.md) plus
four JSON manifests, one install script, and one sync script.
Architecture
Single source of truth: skills/<name>/SKILL.md
Every skill lives under skills/<name>/SKILL.md and nowhere else. This is
not a stylistic choice — it's a hard requirement of the Claude Code plugin
loader, which only auto-discovers skills/<subdir>/SKILL.md at the plugin
root. Earlier iterations of this repo kept skills in a flat top-level layout
(magento2-dev-core/SKILL.md) plus generated copies/symlinks in skills/ for
plugin compatibility; that dual-location approach was deliberately abandoned
in favor of one location. Do not reintroduce a second copy of skill content
anywhere in the repo (no symlinks, no build-generated duplicates) — if a
change needs skill content in a different shape, change how it's consumed,
not where it lives.
The plugin self-lists its own marketplace — for two ecosystems
This repo ships two independent plugin manifests, one per ecosystem, that
both point at the same skills/ directory so neither duplicates content:
- Claude Code:
.claude-plugin/plugin.jsonand.claude-plugin/marketplace.jsonlive side by side.marketplace.jsonhas exactly one entry, with"source": "./", pointing back at the repo root whereplugin.jsonitself lives — this repo is simultaneously "a plugin" and "the marketplace that hosts that one plugin." - Codex CLI: since Codex's plugin marketplace launched (March 2026), it
reads the exact same
skills/<name>/SKILL.mdlayout through its own.codex-plugin/plugin.json(with an explicit"skills": "./skills/"pointer, since Codex does not auto-discover a rootskills/folder the way Claude's plugin loader does) plus a repo-scoped.agents/plugins/marketplace.jsonthat self-lists this repo the same way ("source": {"source": "local", "path": "./"}). Verified end-to-end against the realcodexbinary:codex plugin marketplace add .thencodex plugin add maestro-skills@ddtcorexresolves every skill underskills/with zero copying.
The marketplace top-level name is ddtcorex and the plugin's name is maestro-skills,
so plugin install maestro-skills@ddtcorex reads as <plugin>@<publisher> on either tool.
The version field must be bumped in three places together —
.claude-plugin/plugin.json's version, .claude-plugin/marketplace.json's
plugins[0].version / metadata.version, and .codex-plugin/plugin.json's
version (Codex's .agents/plugins/marketplace.json has no version field of
its own) — nothing enforces they match automatically.
One SKILL.md format, four incompatible project-level paths, two plugin loaders
Every skill follows the Agent Skills standard (a
SKILL.md file with name/description YAML frontmatter) — a format Claude
Code, OpenCode, Codex CLI, and GitHub Copilot all read identically. What
differs is which directory name each tool scans in a consuming project for
loose (non-plugin) skills, and none of them can be pointed at an arbitrary
path:
| Tool | Project-level path |
| Claude Code | .claude/skills/ |
| OpenCode | .opencode/skills/ (also checks .claude/skills/, .agents/skills/) |
| Codex CLI | .agents/skills/ only |
| GitHub Copilot | .github/skills/ (also checks .claude/skills/, .agents/skills/, or chat.agentSkillsLocations) |
This repo's own bare skills/ folder matches none of those project-level
paths — it works for two tools, but for two different reasons:
- Claude Code's plugin loader (a separate mechanism from project-level
skill scanning) specifically looks for
skills/at plugin root. - Codex CLI, since its plugin marketplace launch, has an equivalent
separate plugin loader — a
.codex-plugin/plugin.jsonwith its ownskillspointer — that is likewise independent of the.agents/skills/project-level scan in the table above.
OpenCode and GitHub Copilot have no plugin-loader equivalent as of this
writing. install.sh exists to bridge the gap for direct (non-plugin) use on
those two tools only: it never tries to make one folder satisfy both tools,
it links per-tool into whichever directory each one actually scans. Claude
Code, Codex CLI and DSH are not installer targets — each has its own plugin
loader, and a loose copy linked beside a plugin install shadows it with a
stale cache. On DSH the Cordis plugin is the single source of truth
there, so dsh plugin add alone is a complete skill install. The agent preset is a
separate step — see the next section.
The agent preset is a declaration row, not a directory (2026-09-22)
A DSH agent preset is an @deepseek-ai/dsh-agent-preset declaration row
carried by some bundle: row id preset-<id>, config with id, plugins,
and optional name / description / order. Nothing reads
$DSH_HOME/.agent-presets/<id>/ any more — upstream states it outright:
"Before declaration rows, a user preset was a directory … Nothing reads that
directory any more."
This plugin used to materialize the base preset and the subagents variant into
that dead directory on every boot and log DSH agent preset installed at ….
The write changed nothing and the log misled, so the path, the
installPreset / installSubagentPreset / presetUpgrade config fields and
src/preset-materialize.ts were removed on 2026-09-29. The shipped profile
carries the real rows — preset-maestro-skills and
preset-maestro-skills-subagents in ~/.dsh/profiles/web/cordis.patch.yml.
.dsh-plugin/ still ships (package.json#files) and is the source the
declaration rows are hand-copied from; tests/preset-persona-row.spec.ts
guards the base template. tests/no-preset-materialization.spec.ts fails the
build if the write path or its success log ever comes back.
Optional subagents-enabled preset variant
src/subagent-variant.ts is the executable definition of the
maestro-skills-subagents derivation: the identical .dsh-plugin/ template
with disabled: true stripped from the tool-subagent-codex and
tool-subagent-claude-code rows and a preset.yml advertising "Maestro
Skills + Subagents (Codex + Claude)". The shipped base template keeps both rows
disabled (upstream default). The functions are not called at runtime —
regenerating the declaration row from the template is a manual edit, and these
are the tested steps for it.
Machines that installed the optional @deepseek-ai/dsh-subagent-codex /
@deepseek-ai/dsh-subagent-claude-code bundles get both delegation tools by
picking that preset; sessions must be started after the preset appears
(presets bind at session start). Design record:
docs/specs/2026-09-02-dsh-maestro-preset-materialize-design.md.
Skill dependency chain
Some skills declare a non-enforced depends: frontmatter field documenting a
conceptual prerequisite (Claude Code's schema ignores it; it's a
cross-tool-sharing convention along with compatibility and metadata):
magento2-dev-coreis the foundation;magento2-linter,magento2-performance-audit,magento2-security-scan,magento2-hyva-dev,magento2-frontend-dev,magento2-backend-dev, andmagento2-code-reviewall declaredepends: [magento2-dev-core].govard-toolboxis the foundation;govard-magentodeclaresdepends: [govard-toolbox], andgovard-laravel,govard-symfonyandgovard-wordpressdeclaredepends: [govard-toolbox, php-dev-core].php-dev-coreitself declaresdepends: [govard-toolbox].maestro-design,diagram-studioandreview-in-worktreedeclare nodepends:field.
When editing a dependency's SKILL.md (magento2-dev-core, govard-toolbox),
check whether the change invalidates guidance in the skills that depend on it.
Superpowers fork governance
The process skills under skills/ (brainstorming,
diagnosing-superpowers, dispatching-parallel-
agents, executing-plans, finishing-a-development-branch, receiving-code-review,
requesting-code-review, subagent-driven-development, systematic-debugging,
test-driven-development, using-git-worktrees, using-superpowers,
verification-before-completion, writing-plans, writing-skills) are not
hand-maintained — they are a verbatim fork of obra/superpowers v7.0.0:
- Do not edit forked skill bodies. Upstream is their single source of truth. This is a deliberate exception to the "single source of truth" rule above: the fork is the one location for this content, and its authority lives upstream.
- The fork carries no content additions. The only sanctioned local touch is the
fork-provenance/un-namespaced-invocation note in
using-superpowers/SKILL.md. - Refresh via
scripts/sync-superpowers.sh [ref]; it prints a diff and thePRESERVElist is intentionally empty (the fork-provenance note inusing-superpowers/SKILL.mdis re-applied by hand during review). Update the fork version inTHIRD-PARTY-NOTICES.mdafter a sync. Attribution is an MIT license requirement — never dropTHIRD-PARTY-NOTICES.md. - Skill name collisions would shadow across providers: never name a new domain skill the same as (or after renaming) a superpowers skill.
- The ~170–220 words-per-lesson budget below applies to the domain skills' reference files only, not to forked upstream content.
Adding a lesson to a skill reference file
Version/threshold tables in prose are drift candidates. Any table mapping versions, thresholds, or environment facts (e.g. "Hyvä 1.4.x ships Tailwind v4") must either be replaced by a deterministic tool call that returns the live value, or carry an explicit verified-on date + source next to it. Unstamped tables rot silently and gate wrong decisions downstream.
MUST: load the superpowers:writing-skills skill before writing content, not
just as a style check afterward — it governs testing and structure, not only length.
MUST: budget ~170–220 words of prose per lesson (a > callout or ## section
documenting one real finding), excluding code blocks — this hub's own established
house style. Measure the section in isolation before calling it done:
sed -n '/## Lesson Heading/,/## Next Heading/p' path/to/file.md | sed '/```/,/```/d' | wc -wThis has been missed and fixed after the fact twice (0.4.13→0.4.14, 0.4.14→0.4.15 — see CHANGELOG.md). Both times the overage came from narrating the investigation ("first I thought X was the cause, then I discovered Y") — state the corrected mechanism directly, don't walk the reader through how you got there.
install.sh design
One-line installer/updater (curl -fsSL .../install.sh | bash). Key points if
modifying it:
- Clone-once-to-cache, link-out-per-tool: clones this repo into
~/.maestro-skills(override:MAESTRO_SKILLS_HOME; the legacyAGENT_DEV_SKILLS_HOMEstill works when the new var is unset); re-running the same command is the update path (git pull --ff-only+ re-link) — there is no separateupdate.sh. Only tools without a plugin loader are installer targets (OpenCode, Copilot): Claude Code, Codex CLI and DSH each have their own plugin loader, and a loose copy linked beside a plugin install shadows it with a stale cache (on DSH the preset-layerskill-filesystemwins duplicate names outright). - TTY handling follows the rustup-init.sh pattern:
[ -t 0 ]for a real interactive stdin, else fall back to< /dev/ttyif[ -t 1 ](stdout is still a real terminal even though stdin was consumed by thecurl | bashpipe), else silently use defaults (CI-safe). Don't replace this with a plainread— it will hang or misbehave undercurl | bash. - Manifest-based safety: every path it creates is recorded in
$CACHE_DIR/.manifest. A pre-existing path not in that manifest is treated as user-owned and skipped unless--force— this is what stops the installer from clobbering a user's own hand-written skill of the same name. Don't remove this check to "simplify" the linking loop. - Env vars mirror the flags and are prefixed
MAESTRO_SKILLS_*(_HOME,_SCOPE,_TARGET,_SKILLS,_MODE) — keep this prefix if adding new configurable behavior. The oldAGENT_DEV_SKILLS_*names remain as fallbacks for existing setups.
Commands
The DSH plugin half is gated by pnpm verify (typecheck) and pnpm test
(vitest: packaged skill catalog, manifests, and the plugin's own contracts).
Everything else validates structurally (does the plugin manifest resolve
correctly?) and, for install.sh, behaviorally (does it actually link/unlink
files correctly?).
# Validate plugin + marketplace manifest (must be run from repo root)
claude plugin validate . --strict
# Inspect what the plugin loader actually resolves (skills found, token cost)
claude --plugin-dir . plugin details maestro-skills
# Full local install/uninstall round-trip against the working tree (not a
# published release) -- always clean up after testing, this registers real
# state in the local Claude Code config:
claude plugin marketplace add .
claude plugin install maestro-skills@ddtcorex
# ... test ...
claude plugin uninstall maestro-skills@ddtcorex
claude plugin marketplace remove ddtcorex
# Codex CLI has no `plugin validate` subcommand -- the only real check is a
# live round-trip. Use $CODEX_HOME to keep it out of your real Codex config:
export CODEX_HOME=$(mktemp -d)
codex plugin marketplace add .
codex plugin list --available --json # confirm maestro-skills@ddtcorex is listed
codex plugin add maestro-skills@ddtcorex
codex plugin list --json # confirm it installed and every skill resolved
unset CODEX_HOME # the temp dir is disposable -- nothing else to clean up
# install.sh: syntax check and dry test in an isolated scratch dir (never
# test --scope personal against your real $HOME -- override HOME and
# MAESTRO_SKILLS_HOME to a scratch path first). Note: install.sh's REPO_URL
# points at GitHub, so testing local/uncommitted changes to skills/ requires
# either a temporary local git remote (init+commit a scratch copy and point
# REPO_URL at it) or pushing first -- git clone never sees uncommitted work.
bash -n install.sh
bash install.sh --help# Superpowers fork sync (see "Superpowers fork governance" above)
scripts/sync-superpowers.sh # to upstream HEAD
scripts/sync-superpowers.sh v7.0.0 # or a specific tag; review the diff it printsRelease checklist
Pushing a vX.Y.Z tag triggers .github/workflows/release.yml, which
validates the manifests, extracts the matching ## [X.Y.Z] section from
CHANGELOG.md, and publishes a GitHub Release automatically — there is no
manual release step in the GitHub UI.
- Add a new
## [X.Y.Z] - YYYY-MM-DDsection at the top ofCHANGELOG.md(Keep a Changelog format:### Added/### Changed/### Fixedetc.). - Bump
"version"in.claude-plugin/plugin.json. - Bump
"version"in.claude-plugin/marketplace.json— bothplugins[0].versionand top-levelmetadata.version— to the same value. - Bump
"version"in.codex-plugin/plugin.jsonto the same value (.agents/plugins/marketplace.jsonhas no version field to update). - Bump
"version"inpackage.jsonto the same value — this is the npm manifest for the DeepSeek Harness/Cordis distribution (@ddtcorex/maestro-skills), a separate publish target from the Claude/Codex plugin manifests above. The release workflow does not validate or read it, so nothing enforces this automatically; keep it in sync by hand. - If
skills/changed, runclaude plugin validate . --strictandclaude --plugin-dir . plugin details maestro-skillslocally first; for a change that affects Codex specifically, also run thecodex plugin marketplace add ./codex plugin addround-trip from the Commands section above. Ifsrc/(the DSH Cordis plugin) changed, runnpm run build(tsc) — this is the only local DSH-side check available; there is no local equivalent of the Claude/Codex marketplace-add round-trip (npx cordisfails locally: the installed@deepseek-ai/cordispackage depends on@deepseek-ai/cordis-plugin-loader, which is not a project dependency here). The real DSH validation gate is external and CI-only — theawesome-dsh-pluginsubmission check that readsdsh.bundle.patch(see the[1.0.4]CHANGELOG entry for the manifest shape it expects). - Merge the release-prep PR first (master is never a push target), then tag and push only the tag:
git tag -a vX.Y.Z -m "vX.Y.Z - <one-line summary>" git push origin vX.Y.Z - Confirm the workflow succeeded and the release published:
gh run list --repo ddtcorex/maestro-skills --limit 1 gh release view vX.Y.Z --repo ddtcorex/maestro-skills - If the workflow fails on the changelog-extraction step, it's almost always
because the
## [X.Y.Z]header inCHANGELOG.mddoesn't exactly match the pushed tag's version (the workflow strips a leadingvfrom the tag and looks for[X.Y.Z]literally). The release workflow's manifest-validation step also runsjq emptyon.codex-plugin/plugin.jsonand.agents/plugins/marketplace.jsonnow — a JSON syntax error in either fails the release the same way a bad.claude-plugin/*.jsonalways did.
Lessons from past incidents
- Hand-rolled frontmatter parsing must be tested against real skill files.
The original parser silently returned an empty description for every
description: |block scalar, which crippled skill selection in plugin mode for all domain skills.src/frontmatter.tsfolds block scalars andtests/skills-catalog.spec.tsguards the whole catalog against the filesystem — extend that spec (not ad-hoc greps) when adding catalog rules. - Command samples must match how Govard actually dispatches.
govard toolis a host-side Cobra command; no Govard binary ships inside project containers, sogovard sh -c "govard tool …"nests a missing binary and always fails. The catalog spec rejects that nesting pattern — keep it that way when writing new command examples. - Do not claim Govard-native coverage the audit subsystem lacks.
govard auditimplements thelintcheck (PHPCS + PHPStan + the pub/media PHP guard), theprofilercheck (since v1.64.0), and the container-freeintegritycheck; any other--checksvalue is rejected. QA-trio skills must state that boundary instead of implying native security/performance gates exist. - Forked superpowers skills stay verbatim. Never edit their prose or
frontmatter locally (not even to add
compatibility); the fork carries no content additions (PRESERVEinscripts/sync-superpowers.shis empty), and the catalog spec asserts forked frontmatter shape stays upstream-clean. - Skill lists are duplicated across README and AGENTS.md. README prose
carries no skill counts on purpose (
ls skillsis the truth). When adding or removing a skill, update the README tree and compatibility matrix and thedepends:chain above in the same change; the catalog spec fails when a shipped domain skill is missing from README or a dependent skill is missing from AGENTS.md.package.jsonand.dsh-plugin/descriptions still carry counts and must be kept in step by hand. - Always request approval before merge or release: never merge a PR/MR or publish a release (
git tag/pnpm publish/gh release) without an explicit human approval — request review (gh pr ready/gh pr request-review/ ask in chat) and wait forAPPROVED.
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
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.

