All notable changes to the Joomla skill are documented here. The format follows Keep a Changelog, and this project uses Semantic Versioning where the SKILL.md content is treated as the public surface:
- Major — sections removed or restructured in a way that changes how the skill is used
- Minor — new guidance, new reference files, expanded coverage
- Patch — fixes, typos, clarifications, broken-link repairs
## Canonical sourcessection inSKILL.mdlisting the upstream references the skill is built from (joomla-cms repo, manual.joomla.org, api.joomla.org, framework.joomla.org, docs.joomla.org wiki) with WebFetch-first / fallback guidance and a preference for commit-pinned permalinks. Mirrored inCONTRIBUTING.mdandREADME.md.CONTRIBUTING.mdcovering testing flow, authoring guidelines, PR process, issue guidelines, and versioning.CODE_OF_CONDUCT.md(Contributor Covenant 2.1, summarized + linked).- Issue forms:
.github/ISSUE_TEMPLATE/bug_report.ymlandfeature_request.yml, plusconfig.ymlredirecting Joomla-CMS questions to upstream. scripts/validate.sh— structural lints for SKILL.md frontmatter, reference resolution, andmarketplace.jsonsource paths..github/workflows/validate.yml— runs the validation script on every push tomainand every PR.developbranch as the integration target;mainis now release-only.references/editor-api.md— extracted fromSKILL.mdso the editor JS/PHP API surface is loaded only when needed.references/form-fields.md— extracted built-in field reference and custom-field authoring guide.references/testing.md— extracted PHPUnit + Jest patterns including real-CMS bootstrap and four high-stakes test gotchas.references/gotchas.md— extracted hard-won J5/J6 pitfalls (controller parents, routing, WAM, Bootstrap 5.3 dark mode, modal cleanup,getStoreId(), etc.).- Quick Start now lists the four new cross-cutting references alongside the existing
component.md/module.md/plugin.md/library.mdset. references/component-router.md— extracted the 304-line Router (SEF URLs) walkthrough fromreferences/component.mdso it loads on demand.component.mdkeeps a short stub at the same anchor.references/install-script.md— extracted the install/update lifecycle PHP pattern out ofreferences/component.mdbecause it is cross-cutting: components, modules, and plugins all use the samepreflight/install/update/postflight/uninstallhooks via<scriptfile>, with only the script-class name (Com_*,Mod_*,Plg<Group><Element>*) and manifest path differing. The new reference includes the hook table, the per-extension class-naming convention, a full component example, and short module + plugin skeletons.component.mdkeeps a stub pointing here.references/module.mdandreferences/plugin.mdstill need cross-references; that's noted as follow-up for #3 and #4.references/language-files.md— extracted fromreferences/component.md(where the section had been added in this same release). Cross-cutting: every extension type uses the same_FIELD_<NAME>_LABEL/_DESCform, the sameText::plural()_0/_1/_MOREplural keys, the sameText::script()JS-registration model, and the same.sys.inivs.inisplit. Only the prefix differs (COM_*/MOD_*/PLG_*/LIB_*/TPL_*). The new reference includes a per-type prefix table, file-naming and -location matrix, full naming conventions, plurals, JS-registration rules, and a "what NOT to do" list.component.mdkeeps a 2-paragraph stub at the same anchor.references/service-provider.md— extracted the universalservices/provider.phpwrapping pattern out ofreferences/component.md. TheServiceProviderInterface+ anonymous-classregister()+Container::registerServiceProvider()+Container::set()shape is identical across components, modules, and plugins; only which factories get registered differs. The new reference covers the pattern, the per-type interface-and-factory table, the brittle parts (router 3-part contract, namespace mismatches, bound-class init failures), and DI rules of thumb.component.mdkeeps the worked component example with a one-paragraph cross-link intro at the section head.references/manifest.md— extracted the universal manifest XML elements out ofreferences/component.md's Manifest XML Template. Covers<extension>root attributes, the universal metadata block,<scriptfile>,<files>,<media>,<languages>,<update>/<updateservers>/ update-server XML format,<install>SQL block, and the type-specific blocks (NOT covered here, with cross-links to each type's reference).component.mdkeeps the full component manifest example with a cross-link intro flagging which parts are universal vs component-specific.references/component.mdTable of Contents updated to flag, on each affected line, which content lives in the new shared references.references/component.md— new Language Files section withen-GB.com_<element>.ini/.sys.iniexamples, key-naming conventions, and a note on plural/script-registered strings. Closes the gap flagged in #2 where the manifest declared<languages>but no.inicontent was ever shown.references/component.md— new Database Schema & Migrations section withsql/install.mysql.utf8.sqlexample (standard core columns, indexes, charset),sql/updates/mysql/X.Y.Z.sqlper-version delta example, the DDL-only / idempotent / no-rollback rules, and the#__schemastracking explanation.references/component.md— new Other View Types subsection at the end of View Patterns coveringJsonView,RawView(viaformat=raw), andFeedView, with a cross-link to the Webservices API section for JSON:API.
marketplace.jsonnow uses an explicit GitHub object source pinned tov0.1.0({"source":"github","repo":"...","ref":"v0.1.0"}) instead of a relative./path. This means/plugin updateonly delivers a new version once therefis bumped onmain, so audit work in progress ondevelopdoesn't reach end users prematurely.SKILL.mdPHP requirement headline updated from "8.2+ (Joomla 6 minimum), 8.3+ recommended" to "8.3+ minimum and supported, 8.4 recommended" for Joomla 6.x, with a citation to manual.joomla.org/docs/get-started/technical-requirements. The previous wording understated the J6.x minimum.- All four in-file PHP-version code examples bumped from 8.2 → 8.3 to match the J6.x floor (changelog
<note>, update-server<php_minimum>, install-script$minimumPhp,composer.jsonphpconstraint). The$minimumJoomlaexample value is unchanged because it declares which Joomla versions the extension supports — independent of PHP — and a J6-native extension that also supports J5.x must still pin PHP to 8.3.0 (the highest supported-Joomla floor). SKILL.mdshrunk from 3594 to ~1180 fewer lines by replacing the in-file Editor API, Form Fields, Testing, and Common Gotchas sections with short pointer stubs that name the topics covered. Reduces the per-load token cost without losing any content (full text preserved in the newreferences/*.mdfiles).references/component.mdTable of Contents updated to reflect the new sections (Language Files, Database Schema & Migrations, Other View Types) and the Router stub pointing atcomponent-router.md.
references/component.md—\Namespace\Component\Example\…typos in two@vartype-hint comments (List and Edit views) replaced with\Vendor\…so IDEs resolve the model class correctly.references/component.md—CustomlistFieldexample was callingHTMLHelper::_('select.option', …)without importingJoomla\CMS\HTML\HTMLHelper. Added the missingusestatement so the example runs as-is.references/component.md— Install/Update Script section now opens with an explicit scope split: PHP lifecycle hooks here, DDL in the new Database Schema & Migrations section. Adds a forward cross-link to the schema section, a reverse note in the migrations section, and a one-line guard against the common mistake of puttingALTER TABLEinpostflight()(races during partial upgrades because schema files run first). Bumped the install-script$minimumPhpexample from'8.2.0'to'8.3.0'to match the J6.x floor; the previous value was missed in the SKILL.md PHP audit because it lives in the reference, not the SKILL itself.references/plugin.md— Service-provider example updated to the Joomla 6.1+CMSPlugin::__construct($config = [])signature (single arg, noDispatcherInterface). The legacy two-arg form is documented as a J5/J6.0 backward-compat option that emitsE_USER_DEPRECATEDon J6.1 and will be removed in J7.0. Quote of the deprecation message and a permalink tolibraries/src/Plugin/CMSPlugin.phponjoomla-cms6.1-devincluded so the citation doesn't drift. Verified against PR #46683 and the migratedplg_captcha_powcaptchaprovider.references/plugin.md— Removed the now-deaduse Joomla\Event\DispatcherInterface;import from the plugin class example (it was only there to satisfy the old constructor's typed parameter).references/service-provider.md— Plugin row in the "what each extension type registers" table updated: plugins don't use anyService\Provider\*factory shorthand; the provider justnews the class with$config. Added the J6.0 → J6.1+ deprecation note pointing atreferences/plugin.mdfor the full story.
references/module.md— Table of Contents rebuilt to flag the universal-content references (manifest.md,language-files.md,service-provider.md,install-script.md) on each affected line, and to expose the new sections.references/module.md— Cross-link intros on the Manifest XML and Service Provider sections, deferring universal content to the shared references and keeping module-specific concretizations (client="site"/administrator",<config><fields name="params">;ModuleDispatcherFactory+HelperFactory+Modulefactory triple).references/module.md— New Language Files section withMOD_*prefix specifics, the no-folder=""<languages>quirk, and a pointer tolanguage-files.mdfor the full conventions.references/module.md— New Web Asset Manager registration from the dispatcher subsection inside Dispatcher, showing how to useuseStyle/useScriptagainstjoomla.asset.json-resolved URIs and where to registerText::script()keys. Cross-referencesgotchas.mdfor URI-auto-resolution and the truthy-key trap.references/module.md— New Caching section explaining default per-instance keying, the two cases that need user attention (URL-dependent output, session-state-dependent output), and the absence of a public dispatcher-level cache-key hook.references/module.md— New Install Script (Optional) section noting that modules rarely need a<scriptfile>and pointing toinstall-script.mdfor the shared lifecycle pattern.references/module.md— New Joomla 6.1 capabilities section covering PR #46772 (Versions for Modules /#__ucm_history) and PR #46622 (#__extensions.custom_dataJSON column). Neither requires existing module code to change; both are additive.
references/module.mdDispatcher section now citesAbstractModuleDispatcheronjoomla-cms6.1-devfor the constructor andgetLayoutData()signatures.references/module.mdService Provider section now citesmod_articles_news/services/provider.phponjoomla-cms6.1-devfor the factory triple. Both confirm the existing patterns are current as of 6.1.
- Removed brand-specific references (CWM / Proclaim / EventBooking) from
SKILL.mdandreferences/module.md. The skill is generic Joomla guidance and shouldn't lean on specific third-party extension code or naming conventions as canonical examples. Replaced with vendor-neutral placeholders (<Vendor>,Acme, genericbookings/items) and a generic note about projects shipping admin + site modules in one source tree. TheJoomla-Bible-Study/claude-skill-joomlaGitHub URL stays — that's the skill's own home, not borrowed code.
0.1.0 — 2026-04-29
- Initial release of the Joomla 5+/6 skill packaged as a Claude Code plugin.
SKILL.mdcovering coding standards, modern Joomla MVC architecture, PSR-4 namespaces, dependency injection, service providers, and the Web Asset Manager.references/component.md— full component scaffolding (frontend + backend).references/module.md— module structure with dispatchers.references/plugin.md— plugin event subscribers (SubscriberInterface).references/library.md— shared library packages..claude-plugin/plugin.jsonand.claude-plugin/marketplace.jsonso users can install via/plugin marketplace add Joomla-Bible-Study/claude-skill-joomla.- GitHub Actions workflow that builds and attaches a
joomla-skill-vX.Y.Z.zipto each release for upload into the Claude.ai consumer app.