diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 447ad5c..bd005a3 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,4 +1,4 @@
-name: Release component with OctoJPack and OctoShoom
+name: Release component with OctoShoom and OctoJPack
on:
workflow_dispatch:
@@ -54,24 +54,23 @@ jobs:
git tag -a "$tag" -m "Release $tag"
git push --atomic origin HEAD:main "refs/tags/$tag"
fi
- - name: Build and push the package
- id: package
- uses: octoleo/octojpack@master
- with:
- config: .octojpack
- push: 'true'
- - name: Update the package download entry
+ - name: Update the component download entry
env:
- VERSION: ${{ steps.package.outputs.version }}
+ VERSION: ${{ inputs.version }}
run: |
php tools/release.php feed "$VERSION"
git add joomengine_mcp_update_server.xml
if ! git diff --cached --quiet; then
- git commit -m "Publish package $VERSION update metadata"
+ git commit -m "Publish component $VERSION update metadata"
git push origin HEAD:main
fi
- - name: Hash the published package
+ - name: Hash the published component
uses: octoleo/octoshoom@master
with:
config-json: |
{"update_servers":[{"owner":"joomengine","repo":"mcp_component","branch":"main","path":"joomengine_mcp_update_server.xml"}]}
+ - name: Build and push the package
+ uses: octoleo/octojpack@master
+ with:
+ config: .octojpack
+ push: 'true'
diff --git a/.octojpack b/.octojpack
index ab60efb..9ba0e59 100644
--- a/.octojpack
+++ b/.octojpack
@@ -20,7 +20,7 @@
"author_url": "https://dev.vdm.io/",
"description": "JoomEngine MCP component, webservices routing, and local console server.",
"version_id": "com_joomengine_mcp",
- "update_servers": "https://raw.githubusercontent.com/joomengine/mcp_component/main/joomengine_mcp_update_server.xml",
+ "update_servers": "https://raw.githubusercontent.com/joomengine/mcp_package/main/.github/joomengine_mcp_update_server.xml",
"changelog_servers": "https://raw.githubusercontent.com/joomengine/mcp_component/main/changelog.xml"
},
"repository": {
@@ -32,12 +32,14 @@
{
"owner": "joomengine",
"repo": "mcp_component",
+ "mode": "tags",
"id": "com_joomengine_mcp",
"type": "component"
},
{
"owner": "joomengine",
"repo": "mcp_plugin",
+ "mode": "tags",
"id": "joomengine_mcp",
"type": "plugin",
"group": "console"
@@ -45,6 +47,7 @@
{
"owner": "joomengine",
"repo": "mcp_webservices",
+ "mode": "tags",
"id": "joomengine_mcp",
"type": "plugin",
"group": "webservices"
diff --git a/AGENTS.md b/AGENTS.md
index a976aed..46cbbef 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -34,8 +34,9 @@ PHP style authority: https://github.com/extension-builder/joomla/blob/main/docs/
- This is exclusively the component repository. A GitHub source ZIP of any reviewed branch or tag must install directly in Joomla, with every manifest file, production Composer dependency, licence and seed already tracked. No downstream Composer run, staging, compilation or packaging is allowed.
- Keep production dependencies in `admin/vendor` and the installation seed in `admin/data`. When changing dependencies, run Composer as a maintainer, commit the lock and complete resolved runtime, and verify its autoload paths after relocation to Joomla's administrator component directory. Never hand-edit third-party vendor source.
- Preserve SQL installation/schema updates and the JSON-driven customization-preserving seed updater. They are approved installation mechanisms; do not replace them merely to change the release process.
-- OctoJPack alone combines `mcp_component`, `mcp_plugin` (console) and `mcp_webservices` (HTTP routing), then writes to `joomengine/mcp_package` on `main`. Every plugin belongs in its own repository. Component installation, update and uninstall must never install, change or remove either plugin. The generated package manifest and assembly belong in the package repository. The package update feed `joomengine_mcp_update_server.xml` and shared `changelog.xml` deliberately remain in this component repository, as requested by the maintainer. Keep `.octojpack` concrete and usable from any machine: hardcode stable source/destination repositories, branch, raw GitHub update/changelog URLs and the raw licence URL. Use native latest-tag selection and `version_id`; do not render placeholders or rewrite the configuration during releases. Never change the shared Octo engines without an explicit request.
-- The manual Release workflow takes the next version and freezes component metadata before creating its tag. Call `octoleo/git-user@v2` once, then `octoleo/octojpack@master` with `.octojpack`, update the package feed with the published version, and call `octoleo/octoshoom@master`. Hashing must follow package publication because the feed downloads the package ZIP. Both actions inherit the same Git setup and environment. The feed contains the current `pkg_joomengine_mcp` / `package` / client `site` entry, downloads only `mcp_package` tag archives, and uses the component version. Clear the previous archive checksum when advancing the feed; OctoShoom supplies the new one. Keep credentials in GitHub secrets. Do not duplicate authentication, hashing, archive checks, packaging, configuration rendering or repository preflight logic locally. Local release code only edits the component version, changelogs and package update entry. Never move a released tag.
+- OctoJPack alone combines `mcp_component`, `mcp_plugin` (console) and `mcp_webservices` (HTTP routing), then writes to `joomengine/mcp_package` on `main`. Every plugin belongs in its own repository. Component installation, update and uninstall must never install, change or remove either plugin. The generated package manifest, package update feed and package hash workflow belong in the package repository. This repository's `joomengine_mcp_update_server.xml` serves only the component. Keep `.octojpack` concrete and usable from any machine: hardcode stable source/destination repositories, raw GitHub update/changelog URLs and the raw licence URL. Use explicit `mode: "tags"` on each extension and `version_id: com_joomengine_mcp`; the destination branch is independent of source-tag selection. Never render placeholders or rewrite the configuration during releases. Never change the shared Octo engines without an explicit request.
+- The manual Release workflow freezes component metadata and creates its tag, updates the component feed, calls `octoleo/octoshoom@master` to hash that component tag ZIP, then calls `octoleo/octojpack@master`. Configure `octoleo/git-user@v2` once; both actions inherit its setup. The component feed identifies `com_joomengine_mcp` / `component` / client `administrator` and downloads this repository's tag ZIP. Clear its previous checksum when advancing the feed; OctoShoom supplies the new one. The package tag independently triggers its package-repository workflow to update and hash its own feed. Keep credentials in GitHub secrets. Do not duplicate authentication, hashing, archive checks, packaging or repository preflight logic locally. Local release code only edits the component version, changelogs and component update entry. Never move a released tag.
+- The package feed URL is `https://raw.githubusercontent.com/joomengine/mcp_package/main/.github/joomengine_mcp_update_server.xml`. Keep the package workflow, feed, helper and maintenance docs under `.github`: native OctoJPack replacement already preserves this hidden folder. There is no ignore-folder action input to invent. The package manifest uses this package-only feed. The shared versioned changelog may continue to use this repository's raw `changelog.xml`.
- Update **both** `CHANGELOG.md` and `changelog.xml` with every meaningful change. Put pending entries under the exact literal `[[[NEXT_VERSION]]]`; create a new pending section after the previous one is released. Do not invent a version or modify historical released entries. The workflow replaces this marker with its input version in both files.
- Joomla changelog identity is `com_joomengine_mcp` / `component`. Use native categories `security`, `fix`, `language`, `addition`, `change`, `remove`, and `note`, each containing `item` children. Use matching human headings in Markdown. Record compatibility warnings under Note, errors fixed under Fix, and security fixes under Security. Keep both changelogs consistent and the manifest's `changelogurl` valid.
- Check workflow syntax and changed metadata behavior. Source installation checks inspect the tracked source archive. Do not copy upstream action tests or restore package builders to make a test pass. See `docs/RELEASE.md`.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 66da596..21db710 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,14 +12,15 @@
### Addition
- Document the complete first-package workflow order, valid first versions and secret scope for both plugins and the component.
-- Add a manual version release workflow that freezes both changelogs, creates an immutable tag, publishes the package with OctoJPack, updates the package feed and runs OctoShoom against the published package.
+- Add a manual version release workflow that freezes both changelogs, creates an immutable tag, updates and hashes the component feed, then publishes the package with OctoJPack.
- Document GitHub secrets and the source-installation contract for future agents.
### Change
-- Follow the Octoleo quick starts: set up Git once, let OctoJPack read `.octojpack` directly, then let OctoShoom hash the package download.
+- Follow the Octoleo quick starts: set up Git once, let OctoShoom hash the component download, then let OctoJPack read `.octojpack` directly.
-- Publish combined Joomla packages to `joomengine/mcp_package`; keep the package feed and shared changelog here, with the package version derived from the component.
+- Separate component and package update feeds: the component feed stays here; the package feed and tag-triggered OctoShoom workflow live in `mcp_package/.github`, preserved by native OctoJPack replacement.
+- Select each extension's latest tag explicitly; derive the package version from the component and retain the shared versioned changelog.
- Extract webservices routing into its own `mcp_webservices` repository and include it as a separate OctoJPack extension.
- Verify tracked source archives in component and console installation tests.
diff --git a/README.md b/README.md
index 34005cd..9ec88a2 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@ For native JCB background jobs, provide a PHP CLI executable compatible with the
Remote AI applications can use the independent client's [Docker Compose launcher](https://github.com/joomengine/mcp_client/blob/feature/standalone-php-client/docs/DOCKER.md). Supply the HTTPS Joomla installation URL and native API token; the client discovers capabilities from this component. The console plugin is required for direct local Joomla MCP commands, while the remote client connects to the component's authenticated HTTP endpoint.
-The combined package is built exclusively by [OctoJPack](https://github.com/octoleo/octojpack), using the fixed `.octojpack` configuration, and published to [mcp_package](https://github.com/joomengine/mcp_package). The component version determines the package version. Run the manual **Release** workflow to freeze the changelogs, tag the component, publish the package, update the package feed here, and let OctoShoom hash that package ZIP. [Release instructions](docs/RELEASE.md) list the required secrets.
+The combined package is built exclusively by [OctoJPack](https://github.com/octoleo/octojpack), using the fixed `.octojpack` configuration and each extension's latest tag, and published to [mcp_package](https://github.com/joomengine/mcp_package). The component version determines the package version. Run the manual **Release** workflow to freeze the changelogs, tag the component, update its own feed and hash its tagged ZIP with OctoShoom, then publish the package. The package tag automatically starts its separate feed and OctoShoom workflow in `mcp_package`. [Release instructions](docs/RELEASE.md) list the required secrets and both workflow runs.
## Required capabilities
diff --git a/changelog.xml b/changelog.xml
index e4e3d55..5d64131 100644
--- a/changelog.xml
+++ b/changelog.xml
@@ -11,12 +11,13 @@
- Document the complete first-package workflow order, valid first versions and secret scope for both plugins and the component.
- - Add manual version releases with changelog freezing, immutable tags, OctoJPack package publication and subsequent OctoShoom package hashing.
+ - Add manual version releases with changelog freezing, immutable tags, component update-feed hashing and subsequent OctoJPack package publication.
- Document release secrets and source installation requirements for maintainers and agents.
- - Follow the Octoleo quick starts: set up Git once, let OctoJPack read .octojpack directly, then let OctoShoom hash the package download.
- - Publish packages to joomengine/mcp_package with the component version, keeping the package feed and shared changelog in this component repository.
+ - Follow the Octoleo quick starts: set up Git once, let OctoShoom hash the component download, then let OctoJPack read .octojpack directly.
+ - Keep the component-only feed here and the package-only feed and tag-triggered OctoShoom workflow in mcp_package/.github, preserved by native OctoJPack replacement.
+ - Select each extension's latest tag explicitly, derive the package version from the component and retain the shared versioned changelog.
- Extract webservices routing into its own mcp_webservices repository and include it as a separate OctoJPack extension.
- Verify tracked source archives in component and console installation tests.
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index b687e95..ec4ce4c 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -52,7 +52,7 @@ JCB source-code fields remain permitted inert definition data under appropriate
## Distribution and references
-This repository is a directly installable component source tree, with production dependencies and installation data committed in place. MySQL/MariaDB and PostgreSQL schema updates and customization-preserving JSON seed updates remain installer-owned. Both plugins have independent repositories and native installers. Manual version releases tag the component, use the standalone `.octojpack` configuration to publish the combined package with the same version, update the package feed in this component repository, then run OctoShoom against the package archive. See RELEASE.md.
+This repository is a directly installable component source tree, with production dependencies and installation data committed in place. MySQL/MariaDB and PostgreSQL schema updates and customization-preserving JSON seed updates remain installer-owned. Both plugins have independent repositories and native installers. Manual version releases tag the component, update its component-only feed and hash its tagged archive, then use the standalone `.octojpack` configuration to publish the combined package with the same version. The package tag starts its own update-feed and OctoShoom workflow in `mcp_package`, whose `.github` directory survives package replacement. See RELEASE.md.
- Original MCP: https://github.com/joomengine/joomla-mcp/tree/2cff50f4f6b440da3c684f9995a77efad32e1a36
- Joomla/JCB layout: https://github.com/joomengine/Joomla-Component-Builder/tree/6.x
diff --git a/docs/IMPLEMENTATION.md b/docs/IMPLEMENTATION.md
index 8457719..65b67c3 100644
--- a/docs/IMPLEMENTATION.md
+++ b/docs/IMPLEMENTATION.md
@@ -22,9 +22,9 @@ Approval previews show the selected definitions, frozen option layers, repositor
The administrator Operations screen includes jobs/artifact metadata and cancellation. The `joomla_job_*` tools expose owned listing, status, cancellation, queued redispatch and bounded artifact reads. An API worker reloads the requesting Joomla user and rechecks authority; it does not become the trusted console owner.
-The tracked component source contains production dependencies, installation data and its administrator licence. Source ZIP installation replaces local archive builders. The manual release freezes metadata and tags the component, then OctoJPack publishes the package with that version. Its current-version update feed and shared changelog stay in this component repository; OctoShoom hashes the published package ZIP. See [RELEASE.md](RELEASE.md).
+The tracked component source contains production dependencies, installation data and its administrator licence. Source ZIP installation replaces local archive builders. The manual release freezes metadata and tags the component, updates its component-only feed and hashes its tagged ZIP, then OctoJPack publishes the package with that version. The package tag triggers its own feed and OctoShoom workflow in `mcp_package`. The shared versioned changelog remains here. See [RELEASE.md](RELEASE.md).
-PR #3 uses the native Octoleo actions with one Git setup and fully concrete `.octojpack` values. The feed is populated with the current 0.1.1 metadata; the first release run replaces it with the published package version and adds the real hash. No package tag has been published by this PR. The webservices plugin is extracted into `joomengine/mcp_webservices`, PR #1. Installed CI checks use its exact source revision to verify independent plugin install, upgrade and uninstall. Local metadata, source-installation, ownership, PHP and workflow syntax checks pass; the latest installed run is recorded in PR #3.
+The native Octoleo actions use one Git setup and fully concrete `.octojpack` values. Each extension explicitly selects its latest tag. The component feed has the current 0.1.1 prepared metadata; the first release run updates it to the published component version and adds its real hash. Package automation and its separate feed stay under `mcp_package/.github`, which native OctoJPack preserves during replacement. The extracted webservices plugin remains independently installed, upgraded and uninstalled; no component runtime changes are needed for feed separation.
The first-package follow-up adds the missing webservices version/feed/OctoShoom workflow and completes the rollout instructions in [RELEASE.md](RELEASE.md). Release both plugins through their manual workflows, then release the component; no hand-edited release metadata is required. Repository secrets and an authorized release run remain deployment setup, not something inferred from green source/installation CI. This follow-up does not create release tags or publish a package.
diff --git a/docs/RELEASE.md b/docs/RELEASE.md
index 3bf4a7f..6c7a511 100644
--- a/docs/RELEASE.md
+++ b/docs/RELEASE.md
@@ -1,65 +1,57 @@
# Installation and releases
-This is exclusively the component repository. Its source ZIP installs directly in Joomla with production dependencies and installation data already included. The [console plugin](https://github.com/joomengine/mcp_plugin) and [webservices plugin](https://github.com/joomengine/mcp_webservices) are independent extensions. The component installer does not install, update or remove them.
+This repository contains only the component. Its source ZIP installs directly in Joomla with production dependencies and installation data already included. The [console plugin](https://github.com/joomengine/mcp_plugin) and [webservices plugin](https://github.com/joomengine/mcp_webservices) are independent extensions with their own installers and update feeds.
-[OctoJPack](https://github.com/octoleo/octojpack#quick-start) combines all three extensions using the concrete `.octojpack` file and publishes to **joomengine/mcp_package**, branch **main**. Native `version_id: com_joomengine_mcp` makes the package version follow the component tag. Default tag selection works both in the workflow and from a standalone OctoJPack installation.
+[OctoJPack](https://github.com/octoleo/octojpack#quick-start) combines all three extensions using the concrete `.octojpack` file and publishes to **joomengine/mcp_package**, branch **main**. Each source uses `mode: "tags"`, so OctoJPack selects its latest tag and bundles that exact tagged archive. `version_id: com_joomengine_mcp` makes the package version follow the component tag. This works both through the action and from a standalone OctoJPack installation.
-## Fixed update URLs
+## Separate update feeds
-The package files and generated package manifest belong in `mcp_package`. The package update server and shared changelog deliberately remain in this component repository:
+| Extension | Feed URL | Joomla identity | Download |
+| --- | --- | --- | --- |
+| Component | https://raw.githubusercontent.com/joomengine/mcp_component/main/joomengine_mcp_update_server.xml | `com_joomengine_mcp`, component, administrator | `mcp_component/archive/refs/tags/vVERSION.zip` |
+| Package | https://raw.githubusercontent.com/joomengine/mcp_package/main/.github/joomengine_mcp_update_server.xml | `pkg_joomengine_mcp`, package, site | `mcp_package/archive/refs/tags/vVERSION.zip` |
-- Update server: https://raw.githubusercontent.com/joomengine/mcp_component/main/joomengine_mcp_update_server.xml
-- Changelog: https://raw.githubusercontent.com/joomengine/mcp_component/main/changelog.xml
-- Licence: https://raw.githubusercontent.com/joomengine/mcp_component/main/LICENSE
+The component manifest references the component feed. OctoJPack writes the package manifest with the package feed URL from `.octojpack`. OctoShoom hashes the exact GitHub tag ZIP named in each feed, so each checksum belongs to that extension's download. The component's initial 0.1.1 entry is prepared metadata; its first release replaces the version and adds a real checksum after publishing the tag.
-The feed identifies `pkg_joomengine_mcp`, type `package`, client `site` (Joomla installs packages with client ID 0). Its download is the matching `mcp_package/archive/refs/tags/vVERSION.zip`, never a component-only ZIP. The feed keeps the current supported package version; changelogs retain release history. The initial 0.1.1 entry is prepared metadata. The first release run publishes the selected package version before replacing that entry and adding its real checksum.
+The shared, versioned changelog remains https://raw.githubusercontent.com/joomengine/mcp_component/main/changelog.xml. The licence remains https://raw.githubusercontent.com/joomengine/mcp_component/main/LICENSE. Package versions follow component versions, so Joomla can use the same changelog by version.
-Joomla updates through this feed require the combined package to be installed. Standalone component installation remains available; HTTP routing requires the separately installed webservices plugin.
+## Preserved package automation
+
+Merge the package repository's workflow before publishing the first package. Its maintained workflow, update feed, metadata helper and instructions live under `.github`. Current native OctoJPack replacement removes non-hidden package contents and leaves `.github` intact. It needs no ignore-folder input or wrapper. Keeping the feed in this preserved folder also retains earlier entries and hashes across package builds.
+
+The package workflow triggers on `v*` tag pushes. OctoJPack pushes its generated package commit and tag together over SSH; the retained workflow starts from that tag. It reads the generated manifest from that exact tag, updates the package feed on `main`, and calls OctoShoom. Feed/hash commits on `main` do not retrigger the tag workflow. See [package maintenance instructions](https://github.com/joomengine/mcp_package/blob/main/.github/README.md).
## GitHub setup
-Follow the native [git-user](https://github.com/octoleo/git-user#workflows), OctoJPack and [OctoShoom](https://github.com/octoleo/octoshoom#quick-start) examples. Configure these Actions secrets:
+Follow the native [git-user](https://github.com/octoleo/git-user#workflows), OctoJPack and [OctoShoom](https://github.com/octoleo/octoshoom#quick-start) examples. Make these Actions secrets available to **all four repositories** (both plugins, component and package), directly or through organization secrets:
| Secret | Value |
| --- | --- |
| `GIT_USER`, `GIT_EMAIL` | Release Git identity. |
| `GPG_KEY`, `GPG_USER` | Signing key and its user ID. |
-| `SSH_KEY`, `SSH_PUB` | Matching SSH keypair with write access to component and package repositories. |
-| `GIT_TOKEN` | GitHub API token for OctoJPack to read the source repositories. |
+| `SSH_KEY`, `SSH_PUB` | Matching SSH keypair. |
-`git-user` runs once. Both actions inherit its Git setup; OctoJPack reads `VDM_GLOBAL_TOKEN`. Configuration is passed directly to the actions. No repository placeholders, temporary action checkouts, configuration rendering or local package builders are needed.
+Each plugin and the package workflow needs permission to push to its own repository. The component's SSH identity needs permission to push to both `mcp_component` and `mcp_package`. The component additionally uses `GIT_TOKEN` for OctoJPack's source API access, exposed as `VDM_GLOBAL_TOKEN`. The package workflow does not invoke OctoJPack and needs no packaging token.
-## Release sequence
+Git User runs once per workflow. The shared actions inherit that Git setup; credentials stay in GitHub secrets. No repository placeholders, configuration rendering, local package builder or duplicate hash implementation is needed.
-All three extension repositories provide a manual version release. In each repository, open **Actions**, select the workflow below, choose **Run workflow**, select `main` and enter the release version. The workflow creates the tag; pushing a tag by itself does not start a release.
+## First release
-For the first package, run these in order and wait for each to succeed:
+In each extension repository, open **Actions**, select its release workflow, choose **Run workflow**, select `main` and enter an unused version. For example, `0.1.2` works above all current development baselines; `v0.1.2` is also accepted. The component's 0.1.0 and 0.1.1 changelog entries cannot be reused. The workflow creates the tag; pushing an extension tag manually does not start these manual release workflows.
-| Order | Repository and workflow | Result |
+| Order | Workflow | Result |
| --- | --- | --- |
-| 1 | [mcp_plugin — Release console plugin with OctoShoom](https://github.com/joomengine/mcp_plugin/actions/workflows/release.yml) | Console tag, plugin update entry and checksum. |
-| 2 | [mcp_webservices — Release webservices plugin with OctoShoom](https://github.com/joomengine/mcp_webservices/actions/workflows/release.yml) | Webservices tag, plugin update entry and checksum. |
-| 3 | [mcp_component — Release component with OctoJPack and OctoShoom](https://github.com/joomengine/mcp_component/actions/workflows/release.yml) | Component tag, combined package tag, package update entry and checksum. |
-
-Choose an unused version above the development baselines. For example, `0.1.2` is suitable for all three first releases; `v0.1.2` is also accepted. The component's `0.1.0` and `0.1.1` changelog entries already describe development baselines and cannot be reused. Plugin versions may differ from the component version; the combined package always follows the component.
-
-The six Git identity/signing/SSH secrets above must be available to **each extension repository**. An organization secret can be shared with all three. The component additionally needs `GIT_TOKEN`; its SSH identity must be able to push to both `mcp_component` and `mcp_package`. Each plugin's SSH identity must be able to push to its own repository. The package repository needs no separate release workflow or secrets: OctoJPack publishes it from the component workflow.
+| 1 | [Console release](https://github.com/joomengine/mcp_plugin/actions/workflows/release.yml) | Console tag, plugin feed and OctoShoom checksum. |
+| 2 | [Webservices release](https://github.com/joomengine/mcp_webservices/actions/workflows/release.yml) | Webservices tag, plugin feed and OctoShoom checksum. |
+| 3 | [Component release](https://github.com/joomengine/mcp_component/actions/workflows/release.yml) | Component tag, component feed, OctoShoom checksum, then OctoJPack package publication. |
+| 4 (automatic) | [Package update](https://github.com/joomengine/mcp_package/actions/workflows/update.yml) | Package feed and OctoShoom checksum for the pushed package tag. |
-Once plugin tags exist, subsequent package releases can reuse them. Release a plugin again only when its source changes. Keep a pending changelog section in each repository being released.
+Wait for both plugin releases before starting the component release. Wait for **both the component run and the automatically triggered package run** before declaring the combined release complete. A component hashing failure stops OctoJPack; a package hashing failure appears in the separate package run and can be retried there without rebuilding the package. Published tags remain unchanged.
-The component workflow performs these steps:
-
-1. Freeze component/changelog metadata, commit and create its version tag.
-2. OctoJPack builds and publishes the three-extension package using the component version.
-3. Update this repository's feed with the package version and tagged package URL, clearing the previous archive hash.
-4. OctoShoom hashes the published package archive and commits the checksum here.
-
-The package must exist before its hash can be calculated. A failed packaging step stops feed publication and hashing. Neither shared tool's work is duplicated locally. Rerunning keeps existing tags and preserves a matching feed entry/hash. A successful component workflow makes the package tag ZIP installable from `mcp_package` and publishes its checksum in this repository's update feed; no manual packaging or XML editing is needed.
+Later component releases can reuse existing plugin tags when those plugins have not changed. Plugin versions may differ; the package always follows the component version. A completed release needs no manual ZIP upload, packaging or update-XML editing.
## Changelogs and dependencies
-Keep `CHANGELOG.md` and `changelog.xml` consistent, with new changes under one literal `[[[NEXT_VERSION]]]` section in each file. The release replaces the marker with its version. Create another pending section when subsequent changes begin; preserve released history. The shared XML keeps component identity and Joomla selects the changelog by version.
-
-Use Joomla categories `security`, `fix`, `language`, `addition`, `change`, `remove` and `note`, with `item` children and matching Markdown headings.
+Keep `CHANGELOG.md` and `changelog.xml` consistent, with new changes under one literal `[[[NEXT_VERSION]]]` section in each file. Release replaces the marker with its version. Create another pending section when subsequent changes begin; preserve released history. Use Joomla categories `security`, `fix`, `language`, `addition`, `change`, `remove` and `note`, with `item` children and matching Markdown headings.
-Maintainers resolve changed dependencies with Composer and commit the lock and complete production runtime under `admin/vendor`. CI checks source installation, relocated dependencies, native metadata, and separately installed plugins. No downstream Composer run is required.
+Maintainers resolve changed dependencies with Composer and commit the lock and complete production runtime under `admin/vendor`. CI checks source installation, relocated dependencies, native metadata and separately installed plugins. No downstream Composer run is required. Source and metadata checks do not claim an actual release or prove configured publication credentials.
diff --git a/joomengine_mcp_update_server.xml b/joomengine_mcp_update_server.xml
index 0290a8b..83e60d0 100644
--- a/joomengine_mcp_update_server.xml
+++ b/joomengine_mcp_update_server.xml
@@ -1,16 +1,16 @@
-
+
- JoomEngine MCP Package
- JoomEngine MCP component, console plugin and webservices plugin.
- pkg_joomengine_mcp
- package
- site
+ JoomEngine MCP Component
+ JoomEngine MCP component for Joomla.
+ com_joomengine_mcp
+ component
+ administrator
0.1.1
- https://github.com/joomengine/mcp_package/tree/v0.1.1
+ https://github.com/joomengine/mcp_component/tree/v0.1.1
- https://github.com/joomengine/mcp_package/archive/refs/tags/v0.1.1.zip
+ https://github.com/joomengine/mcp_component/archive/refs/tags/v0.1.1.zip
stable
Llewellyn van der Merwe
diff --git a/tests/release.php b/tests/release.php
index 7a98842..e3b8a29 100644
--- a/tests/release.php
+++ b/tests/release.php
@@ -70,9 +70,9 @@
'Preparing a tag does not advertise its download before the tag exists.');
mcpRelease(['feed', '1.1.0'], $root);
$feed = mcpReleaseXml($root . '/joomengine_mcp_update_server.xml');
- $check((string) $feed->update->downloads->downloadurl === 'https://github.com/joomengine/mcp_package/archive/refs/tags/v1.1.0.zip',
- 'Update uses the immutable package tag ZIP.');
- $check((string) $feed->update->client === 'site' && (string) $feed->update->element === 'pkg_joomengine_mcp' && (string) $feed->update->type === 'package' && (string) $feed->update->php_minimum === '8.3.0'
+ $check((string) $feed->update->downloads->downloadurl === 'https://github.com/joomengine/mcp_component/archive/refs/tags/v1.1.0.zip',
+ 'Update uses the component tag ZIP.');
+ $check((string) $feed->update->client === 'administrator' && (string) $feed->update->element === 'com_joomengine_mcp' && (string) $feed->update->type === 'component' && (string) $feed->update->php_minimum === '8.3.0'
&& (string) $feed->update->targetplatform['version'] === '6\\.[1-9][0-9]*', 'Update carries supported Joomla/PHP versions.');
$check(!isset($feed->update->sha512), 'OctoShoom supplies the checksum.');
$feed->update->addChild('sha512', str_repeat('a', 128));
@@ -88,8 +88,8 @@
mcpRelease(['feed', '1.2.0'], $root);
$feed = mcpReleaseXml($root . '/joomengine_mcp_update_server.xml');
$check(count($feed->update) === 1 && (string) $feed->update->version === '1.2.0' && !isset($feed->update->sha512),
- 'Next package release replaces the current feed entry and clears the previous archive checksum.');
- $check((string) $feed->update->downloads->downloadurl === 'https://github.com/joomengine/mcp_package/archive/refs/tags/v1.2.0.zip', 'The next download stays in the package repository.');
+ 'Next component release replaces the current feed entry and clears the previous archive checksum.');
+ $check((string) $feed->update->downloads->downloadurl === 'https://github.com/joomengine/mcp_component/archive/refs/tags/v1.2.0.zip', 'The next download stays in the component repository.');
$check((string) mcpReleaseXml($root . '/changelog.xml')->changelog[1]->version === '1.1.0', 'Next release retains the previous changelog.');
echo json_encode(['checks' => $checks, 'metadataTransitions' => 'passed'], JSON_THROW_ON_ERROR) . "\n";
diff --git a/tools/release.php b/tools/release.php
index 397b0ea..f40b24f 100644
--- a/tools/release.php
+++ b/tools/release.php
@@ -19,7 +19,7 @@ function mcpReleaseXml(string $path): SimpleXMLElement
return $xml;
}
-/** Freeze the pending version or add its tag archive to the package update feed. */
+/** Freeze the pending version or add its tag archive to the component update feed. */
function mcpRelease(array $arguments, string $root): void
{
[$command, $version] = array_pad($arguments, 2, '');
@@ -57,12 +57,13 @@ function mcpRelease(array $arguments, string $root): void
{
$feed = mcpReleaseXml($root . '/joomengine_mcp_update_server.xml');
$entry = $feed->update;
- $archive = 'https://github.com/joomengine/mcp_package/archive/refs/tags/v' . $version . '.zip';
+ $archive = 'https://github.com/joomengine/mcp_component/archive/refs/tags/v' . $version . '.zip';
- if (count($feed->update) !== 1 || (string) $entry->element !== 'pkg_joomengine_mcp'
- || (string) $entry->type !== 'package' || version_compare($version, (string) $manifest->version, '>'))
+ if (count($feed->update) !== 1 || (string) $entry->element !== 'com_joomengine_mcp'
+ || (string) $entry->type !== 'component' || (string) $entry->client !== 'administrator'
+ || version_compare($version, (string) $manifest->version, '>'))
{
- throw new RuntimeException('Expected the current package update entry and a prepared component version.');
+ throw new RuntimeException('Expected the current component update entry and a prepared component version.');
}
if ((string) $entry->version === $version && (string) $entry->downloads->downloadurl === $archive)
@@ -72,7 +73,7 @@ function mcpRelease(array $arguments, string $root): void
$entry->version = $version;
$entry->downloads->downloadurl = $archive;
- $entry->infourl = 'https://github.com/joomengine/mcp_package/tree/v' . $version;
+ $entry->infourl = 'https://github.com/joomengine/mcp_component/tree/v' . $version;
unset($entry->md5, $entry->sha256, $entry->sha384, $entry->sha512);
$writes['joomengine_mcp_update_server.xml'] = $feed->asXML();
}