Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
4736575
docs: establish Joomla-authoritative JCB architecture and delivery co…
Llewellynvdm Sep 17, 2026
fba74db
docs: specify complete PHP migration, database catalogue and exact Jo…
Llewellynvdm Sep 17, 2026
423a8a2
feat: add PHP authority, safe binding and handler runtime with contra…
Llewellynvdm Sep 17, 2026
0363ae7
test: export immutable upstream MCP contracts and checksummed Joomla …
Llewellynvdm Sep 17, 2026
0217802
build: migrate native PHP behaviour and source contracts onto the exi…
Llewellynvdm Sep 17, 2026
d7627e8
fix: align native behavioural tests with component-owned source paths
Llewellynvdm Sep 17, 2026
03d8730
feat: migrate pinned native PHP handlers, behavioural tests and full …
github-actions[bot] Sep 17, 2026
8f4c185
feat: add portable Joomla persistence and principal-bound encrypted e…
Llewellynvdm Sep 17, 2026
6b3ab50
feat: resolve MCP definitions from ACL-filtered database snapshots an…
Llewellynvdm Sep 17, 2026
c252eca
feat: compose native actions from reviewed database bindings and scop…
Llewellynvdm Sep 17, 2026
95afa14
feat: add bounded PHP HTTP transport and source-compatible Joomla API…
Llewellynvdm Sep 17, 2026
6af683d
feat: persist principal-bound grants, confirmation plans and atomic e…
Llewellynvdm Sep 17, 2026
cfcec9a
feat: execute confirmed actions with stale-plan checks, read-back ver…
Llewellynvdm Sep 17, 2026
6e15642
build: generate relational capability seeds and portable Joomla insta…
Llewellynvdm Sep 17, 2026
b450d66
fix: preserve exact source export keys, action names and binding cont…
Llewellynvdm Sep 17, 2026
4f3b2ce
build: generate portable install SQL and the complete database capabi…
github-actions[bot] Sep 17, 2026
4bd7352
test: enforce catalogue parity, dependency visibility and confirmed-w…
Llewellynvdm Sep 17, 2026
4217e11
fix: correct recorded API fixture syntax and unblock execution CI
Llewellynvdm Sep 17, 2026
1c8171f
feat: integrate database-defined MCP tools resources prompts and encr…
Llewellynvdm Sep 17, 2026
7e62e21
feat: wire Joomla API tokens HTTP routes native DI and shared trusted…
Llewellynvdm Sep 17, 2026
89353e8
test: provide a minimal disposable PHP and PostgreSQL integration too…
Llewellynvdm Sep 17, 2026
a3fb48c
feat: add native installer, customization-preserving seed upgrades an…
Llewellynvdm Sep 18, 2026
daeed22
refactor: separate external client ownership and require complete JCB…
Llewellynvdm Sep 18, 2026
985fbcc
test: preserve pinned JCB implementation and command-plugin fixtures …
Llewellynvdm Sep 18, 2026
ecc77db
feat: add native administrator models and atomic catalogue assets wit…
Llewellynvdm Sep 18, 2026
6a9759a
test: require real Joomla installation, administrator and HTTP lifecy…
Llewellynvdm Sep 18, 2026
58c3909
build: synchronize checksum-verified tested component source onto the…
Llewellynvdm Sep 18, 2026
28225f8
fix: normalize the SQL generator comment before materializing the run…
Llewellynvdm Sep 18, 2026
87c2ad4
feat: complete installable component administration and real Joomla H…
github-actions[bot] Sep 18, 2026
0ef23f8
test: boot installed MVC fixtures with native console context and rem…
Llewellynvdm Sep 18, 2026
907fe5a
test: enable native MySQL JCB integration in the disposable developme…
Llewellynvdm Sep 18, 2026
2c6dcbf
test: install and exercise the component inside the JCB golden Docker…
Llewellynvdm Sep 18, 2026
d2e9ed8
test: supply native Joomla user binding by reference in the golden-im…
Llewellynvdm Sep 18, 2026
16dbcce
test: inspect the native JCB command registry through Joomla lifecycl…
Llewellynvdm Sep 18, 2026
6024cfe
test: verify administrator-to-MCP, restricted Joomla ACL and native u…
Llewellynvdm Sep 18, 2026
7cdb1f6
fix: make every shipped capability editable and preserve canonical AP…
Llewellynvdm Sep 18, 2026
9db5fb0
fix: preserve empty JSON Schema objects and defaults in the PHP catal…
Llewellynvdm Sep 18, 2026
f92143b
build: generate portable install SQL and the complete database capabi…
github-actions[bot] Sep 18, 2026
f262a7d
test: drive real Joomla CRUD through MCP stdio and verify source JSON…
Llewellynvdm Sep 18, 2026
4c9cb5b
feat: add reviewed native JCB command contracts and bounded isolated …
Llewellynvdm Sep 20, 2026
b3a7571
test: connect installed console and HTTPS client acceptance
Llewellynvdm Sep 21, 2026
f77e5be
feat: connect installed JCB commands to durable authorized jobs and p…
Llewellynvdm Sep 21, 2026
080e189
test: verify native JCB jobs and archives through local and remote MCP
Llewellynvdm Sep 21, 2026
856f9d6
test: retain actionable JCB failures and verify inspected job recovery
Llewellynvdm Sep 22, 2026
48c40f4
test: provision PHP process control in the installed JCB fixture
Llewellynvdm Sep 22, 2026
ae57f1e
Complete native PHP style and independent JCB package effect verifica…
Llewellynvdm Sep 22, 2026
79789d4
Support native JCB console tables in bounded jobs and normalize file …
Llewellynvdm Sep 22, 2026
08fc10f
Verify native package results through plain local readers and pin rev…
Llewellynvdm Sep 22, 2026
fb8b534
Complete installed worker recovery and compiler-install acceptance; f…
Llewellynvdm Sep 22, 2026
e6a2249
Retain native JCB effects and archives when installation throws
Llewellynvdm Sep 22, 2026
795d61a
Initialize native Joomla CLI requirements before isolated JCB execution
Llewellynvdm Sep 22, 2026
4109cd3
Keep native compiler output private and isolate repeated installation…
Llewellynvdm Sep 22, 2026
d5e3223
fix: accept authorized installed provider permission scopes
Llewellynvdm Sep 24, 2026
a782170
Reject oversized NDJSON frames before blank input handling
Llewellynvdm Sep 24, 2026
020803b
Preserve bounded native Joomla API validation diagnostics
Llewellynvdm Sep 24, 2026
ae00443
test: cover installed console and client across core matrix
Llewellynvdm Sep 24, 2026
4c05f41
Expose redacted frozen JCB command approval previews
Llewellynvdm Sep 24, 2026
730d86b
Bind synchronized JCB definitions to their native registration plugins
Llewellynvdm Sep 24, 2026
75d9685
Test coordinated console and Docker client revisions with JCB plan co…
Llewellynvdm Sep 24, 2026
64a1595
Record complete installed JCB and client acceptance with final compan…
Llewellynvdm Sep 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = tab

[*.{yml,yaml,json,xml,md}]
indent_style = space
indent_size = 2
65 changes: 65 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: PHP contracts and migration evidence

on:
pull_request:
push:
branches: [main, feature/jcb-mcp-runtime]

permissions:
contents: read

concurrency:
group: php-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
contracts:
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
php: ['8.3', '8.4']
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: curl, json, mbstring, sodium, zip, fileinfo, pcntl, posix
tools: composer:v2
coverage: none
- name: Validate Composer metadata
run: composer validate --no-check-publish
- name: Install PHP dependencies
run: composer install --no-interaction --prefer-dist --no-progress
- name: PHP syntax
run: find . -type d \( -name vendor -o -name .git -o -name .reference -o -name build \) -prune -o -type f -name '*.php' -print0 | xargs -0 -r -n1 php -l
- name: Verify source-pinned seed reproducibility
run: |
set -euo pipefail
php tools/generate-catalogue.php
git diff --exit-code -- admin/sql data/catalogue-seed.json docs/migration/parity.json
- name: Behavioural and source-parity contracts
run: |
set -euo pipefail
mkdir -p build/evidence
for suite in run catalogue schema-shapes execution actions planned jobs process job-process jcb jcb-plan-preview protocol http ownership native/run; do
php "tests/$suite.php" | tee "build/evidence/${suite//\//-}.log"
done
- name: Preserve the tested PHP runtime for reproducible investigation
if: always() && matrix.php == '8.3'
run: |
set -euo pipefail
mkdir -p build
git rev-parse HEAD > build/tested-commit.txt
tar --exclude-vcs --exclude='./build' --exclude='./.reference' -czf build/tested-php-runtime.tar.gz .
sha256sum build/tested-php-runtime.tar.gz > build/tested-php-runtime.sha256
- uses: actions/upload-artifact@v7
if: always()
with:
name: php-evidence-${{ matrix.php }}
path: build/
if-no-files-found: error
retention-days: 7
84 changes: 84 additions & 0 deletions .github/workflows/development-runtime.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Disposable PHP integration toolchain

on:
push:
branches: [feature/jcb-mcp-runtime]
paths: [.github/workflows/development-runtime.yml]
workflow_dispatch:

permissions:
contents: read

jobs:
toolchain:
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: '8.4'
extensions: curl, dom, fileinfo, gd, intl, mbstring, mysqli, pdo_mysql, pdo_pgsql, pgsql, simplexml, sodium, xml, xmlreader, xmlwriter, zip
tools: composer:v2
coverage: none
- name: Collect only public runtime binaries and linked libraries for offline integration testing
shell: bash
run: |
set -euo pipefail
if [ ! -x /usr/lib/postgresql/16/bin/initdb ]; then
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends postgresql-16
fi
work="$(mktemp -d)"
runtime="$work/runtime"
mkdir -p "$runtime"/{bin,lib,php/bin,php/modules,postgresql/bin,postgresql/lib,postgresql/share}
cp -L "$(command -v php)" "$runtime/php/bin/php"
cp -L "$(command -v composer)" "$runtime/php/composer.phar"
extension_dir="$(php -r 'echo ini_get("extension_dir");')"
printf '%s\n' 'date.timezone=UTC' 'memory_limit=512M' 'display_errors=stderr' 'log_errors=0' > "$runtime/php/php.ini"
for module in ctype curl dom fileinfo gd iconv intl mbstring mysqlnd mysqli pdo pdo_mysql pdo_pgsql pgsql phar simplexml sodium tokenizer xml xmlreader xmlwriter zip; do
if [ -f "$extension_dir/$module.so" ]; then
cp -L "$extension_dir/$module.so" "$runtime/php/modules/$module.so"
printf 'extension=%s.so\n' "$module" >> "$runtime/php/php.ini"
fi
done
cp -a /usr/lib/postgresql/16/bin/. "$runtime/postgresql/bin/"
cp -a /usr/lib/postgresql/16/lib/. "$runtime/postgresql/lib/"
cp -a /usr/share/postgresql/16/. "$runtime/postgresql/share/"
find "$runtime/postgresql/lib" -type d -name bitcode -prune -exec rm -rf -- {} +
while IFS= read -r -d '' binary; do
while IFS= read -r library; do
case "$(basename "$library")" in
libc.so.*|libm.so.*|libpthread.so.*|libdl.so.*|librt.so.*|ld-linux*|libresolv.so.*|libutil.so.*) continue ;;
esac
[ -f "$library" ] && cp -L "$library" "$runtime/lib/$(basename "$library")"
done < <(ldd "$binary" 2>/dev/null | awk '/=> \/[a-zA-Z]/{print $3} /^\s*\/[a-zA-Z]/{print $1}' || true)
done < <(find "$runtime/php/bin" "$runtime/php/modules" "$runtime/postgresql/bin" "$runtime/postgresql/lib" -type f \( -name php -o -name '*.so' -o -perm /111 \) -print0)
cat > "$runtime/bin/php" <<'BASH'
#!/usr/bin/env bash
set -euo pipefail
root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
export LD_LIBRARY_PATH="$root/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export PHP_INI_SCAN_DIR=''
exec "$root/php/bin/php" -c "$root/php/php.ini" -d "extension_dir=$root/php/modules" "$@"
BASH
cat > "$runtime/bin/composer" <<'BASH'
#!/usr/bin/env bash
set -euo pipefail
root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
exec "$root/bin/php" "$root/php/composer.phar" "$@"
BASH
chmod +x "$runtime/bin/php" "$runtime/bin/composer"
"$runtime/bin/php" -v
"$runtime/bin/php" -m
"$runtime/bin/composer" --version
LD_LIBRARY_PATH="$runtime/lib" "$runtime/postgresql/bin/postgres" --version
printf '%s\n' 'Development-only runtime binaries from the GitHub Ubuntu runner and setup-php.' 'No repository, environment, credentials, database contents or runner configuration is included.' > "$runtime/NOTICE.txt"
mkdir -p "$RUNNER_TEMP/integration-toolchain"
tar -czf "$RUNNER_TEMP/integration-toolchain/runtime.tar.gz" -C "$work" runtime
sha256sum "$RUNNER_TEMP/integration-toolchain/runtime.tar.gz" > "$RUNNER_TEMP/integration-toolchain/runtime.sha256"
- uses: actions/upload-artifact@v7
with:
name: disposable-integration-toolchain
path: ${{ runner.temp }}/integration-toolchain/
if-no-files-found: error
retention-days: 2
51 changes: 51 additions & 0 deletions .github/workflows/generate-catalogue.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Generate reviewed Joomla installation catalogue

on:
push:
branches: [feature/jcb-mcp-runtime]
paths:
- tools/generate-catalogue.php
- admin/src/Database/Structure.php
- .github/workflows/generate-catalogue.yml
workflow_dispatch:

permissions:
contents: read

concurrency:
group: generate-joomla-mcp-catalogue
cancel-in-progress: false

jobs:
generate:
if: github.repository == 'joomengine/mcp_component' && github.ref == 'refs/heads/feature/jcb-mcp-runtime'
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: write
steps:
- uses: actions/checkout@v7
with:
ref: ${{ github.sha }}
persist-credentials: true
- uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
coverage: none
- name: Generate portable SQL and the complete source-parity map
run: |
set -euo pipefail
php -l tools/generate-catalogue.php
php tools/generate-catalogue.php
git diff --check
- name: Commit only generated catalogue files to the existing PR branch
run: |
set -euo pipefail
git add -- admin/sql data/catalogue-seed.json docs/migration/parity.json
if git diff --cached --quiet; then
exit 0
fi
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git commit -m 'build: generate portable install SQL and the complete database capability graph'
git push origin HEAD:refs/heads/feature/jcb-mcp-runtime
69 changes: 69 additions & 0 deletions .github/workflows/golden-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Installed JCB golden image

on:
pull_request:
push:
branches: [main, feature/jcb-mcp-runtime]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: jcb-installed-${{ github.ref }}
cancel-in-progress: true

jobs:
installed:
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: shivammathur/setup-php@v2
with:
php-version: '8.4'
extensions: curl, dom, fileinfo, intl, json, mbstring, sodium, xml, zip
tools: composer:v2
coverage: none
- name: Build the actual installable component
run: bash tools/build.sh && php tests/package.php
- name: Check out the JCB implementation under test
uses: actions/checkout@v7
with:
repository: extension-builder/joomla
ref: 5ee658dd07eb749dca43ed4722f6cca7eb8208cf
path: build/jcb-source
persist-credentials: false
- name: Check out the reviewed console plugin under test
uses: actions/checkout@v7
with:
repository: joomengine/mcp_plugin
ref: fe387b962dab605191ef18efe4d5cb94821165d9
path: build/plugin-source
persist-credentials: false
- name: Check out the remote client bridge under test
uses: actions/checkout@v7
with:
repository: joomengine/mcp_client
ref: 881b1006b67afc24d35d17b82cd32d16a5593a44
path: build/client-source
persist-credentials: false
- name: Install the client dependencies for the remote acceptance scenario
working-directory: build/client-source
run: composer install --no-interaction --prefer-dist --no-progress
- name: Install the component into the JCB golden image and exercise native Joomla
env:
COMPOSE_PROJECT_NAME: mcp-${{ github.run_id }}-${{ github.run_attempt }}
MCP_PLUGIN_SOURCE: ${{ github.workspace }}/build/plugin-source
MCP_CLIENT_SOURCE: ${{ github.workspace }}/build/client-source
run: bash tests/golden-image/run.sh
- name: Preserve redacted installation and execution evidence
if: always()
uses: actions/upload-artifact@v7
with:
name: installed-jcb-golden-image
path: build/evidence/golden/
retention-days: 14
if-no-files-found: error
82 changes: 82 additions & 0 deletions .github/workflows/import-runtime.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Import pinned PHP runtime and catalogue

on:
push:
branches: [feature/jcb-mcp-runtime]
paths:
- .github/workflows/import-runtime.yml
- tools/migration/import-native.php
- tools/migration/align-native-tests.php
workflow_dispatch:

permissions:
contents: read

concurrency:
group: import-pinned-runtime
cancel-in-progress: false

jobs:
import:
if: github.repository == 'joomengine/mcp_component' && github.ref == 'refs/heads/feature/jcb-mcp-runtime'
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: write
steps:
- uses: actions/checkout@v7
with:
ref: ${{ github.sha }}
persist-credentials: true
- name: Check whether the one-time import was already committed
id: state
shell: bash
run: |
set -euo pipefail
if test -f data/upstream-native.json; then
echo 'needed=false' >> "$GITHUB_OUTPUT"
else
echo 'needed=true' >> "$GITHUB_OUTPUT"
fi
- uses: actions/checkout@v7
if: steps.state.outputs.needed == 'true'
with:
repository: joomengine/joomla-mcp
ref: 2cff50f4f6b440da3c684f9995a77efad32e1a36
path: .reference/joomla-mcp
persist-credentials: false
- uses: actions/setup-node@v7
if: steps.state.outputs.needed == 'true'
with:
node-version: 22
- uses: shivammathur/setup-php@v2
if: steps.state.outputs.needed == 'true'
with:
php-version: '8.3'
extensions: json, mbstring
coverage: none
- name: Export and migrate the immutable source without invoking Joomla actions
if: steps.state.outputs.needed == 'true'
shell: bash
run: |
set -euo pipefail
test "$(git -C .reference/joomla-mcp rev-parse HEAD)" = 2cff50f4f6b440da3c684f9995a77efad32e1a36
npm --prefix .reference/joomla-mcp ci --ignore-scripts --no-audit
npm --prefix .reference/joomla-mcp run build
mkdir -p data
node tools/migration/export-upstream.mjs .reference/joomla-mcp data/upstream-contracts.json
php tools/migration/import-native.php .reference/joomla-mcp .
php tools/migration/align-native-tests.php
find admin/src/Native tests/native -type f -name '*.php' -print0 | xargs -0 -n1 php -l
php tests/native/run.php
git diff --check
- name: Commit the verified import to this existing PR branch only
if: steps.state.outputs.needed == 'true'
shell: bash
run: |
set -euo pipefail
git add -- admin/src/Native tests/native data/upstream-contracts.json data/upstream-native.json docs/migration/native-source-map.json LICENSES/joomla-mcp.txt
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git commit -m 'feat: migrate pinned native PHP handlers, behavioural tests and full action contracts'
git push origin HEAD:refs/heads/feature/jcb-mcp-runtime
Loading
Loading