From ff5794d0ccbe4d516bf91d8a64d3987d89e2d16a Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 6 Jun 2026 12:09:14 -0500 Subject: [PATCH 1/4] fix: remove dead definitionParser reference in RepositorySynchronizer The definitionParser property was never initialized or implemented. synchronizeRepository() crashed with "Call to a member function parseForPlatform() on null". Replaced with direct use of getSharedWorkflows() which provides all files to sync. --- lib/Enterprise/RepositorySynchronizer.php | 34 ++++------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/lib/Enterprise/RepositorySynchronizer.php b/lib/Enterprise/RepositorySynchronizer.php index e997434..ff3dc38 100644 --- a/lib/Enterprise/RepositorySynchronizer.php +++ b/lib/Enterprise/RepositorySynchronizer.php @@ -173,37 +173,15 @@ class RepositorySynchronizer $platform = $this->detectPlatform($repoInfo); $this->logger->logInfo("Detected platform for {$repo}: {$platform}"); - // Load file list from the Terraform definition for this platform - $filesToSync = $this->definitionParser->parseForPlatform($platform, $repoRoot); - - // Append shared workflows — the parser can't extract them from nested - // subdirectories blocks due to heredoc interference in .tf files. - $sharedFiles = $this->getSharedWorkflows($platform, $repoRoot); - - // Deduplicate by destination — shared workflows take precedence over parser entries - $seen = []; - foreach ($filesToSync as $f) { - $seen[$f['destination']] = true; - } - foreach ($sharedFiles as $f) { - if (!isset($seen[$f['destination']])) { - $filesToSync[] = $f; - } - } - - $defCount = count($filesToSync) - count($sharedFiles); - $sharedAdded = count($filesToSync) - $defCount; - $sharedTotal = count($sharedFiles); + // Load shared workflows and config files for this platform from templates + $filesToSync = $this->getSharedWorkflows($platform, $repoRoot); + $sharedTotal = count($filesToSync); $this->logger->logInfo( - "Loaded " . count($filesToSync) . " sync entries for {$platform}" - . " (def={$defCount}, shared={$sharedAdded}/{$sharedTotal} added, " - . ($sharedTotal - $sharedAdded) . " deduped)" + "Loaded {$sharedTotal} sync entries for {$platform}" ); - // Log shared workflow destinations for debugging - foreach ($sharedFiles as $sf) { + foreach ($filesToSync as $sf) { $dest = $sf['destination'] ?? '?'; - $added = !isset($seen[$dest]) ? 'ADDED' : 'DEDUPED'; - $this->logger->logInfo(" shared: {$dest} [{$added}]"); + $this->logger->logInfo(" sync: {$dest}"); } if (empty($filesToSync)) { From e7bdf7cbc734b986b1bd0ed9937c21e4b43555ed Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 6 Jun 2026 12:34:33 -0500 Subject: [PATCH 2/4] fix: load Composer autoloader in CliFramework constructor (#248) CLI tools failed with "Class MokoEnterprise\SourceResolver not found" because the Composer autoloader was never loaded. The require_once for CliFramework.php loaded the framework but not the PSR-4 autoloader that maps MokoEnterprise\ to lib/Enterprise/. Adding require_once for vendor/autoload.php in the constructor ensures all Enterprise classes (SourceResolver, etc.) are available to every CLI tool that extends CliFramework. Closes #248 Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/Enterprise/CliFramework.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/Enterprise/CliFramework.php b/lib/Enterprise/CliFramework.php index 91a9a0b..ab4534e 100644 --- a/lib/Enterprise/CliFramework.php +++ b/lib/Enterprise/CliFramework.php @@ -171,6 +171,13 @@ abstract class CliFramework */ public function __construct(string $name = '', string $version = '04.00.15') { + // Load Composer autoloader for Enterprise classes (SourceResolver, etc.) + $autoloader = __DIR__ . '/../../vendor/autoload.php'; + + if (file_exists($autoloader)) { + require_once $autoloader; + } + $this->scriptName = $name ?: basename($_SERVER['argv'][0] ?? 'script', '.php'); $this->scriptVersion = $version; $this->startTime = microtime(true); From 19b504526b2037b49882bf16e00ee285c7771342 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 6 Jun 2026 12:44:44 -0500 Subject: [PATCH 3/4] fix: remove double quotes from shell commands in workflow YAML act_runner passes run: | blocks through a shell that treats double quotes as literal characters in some contexts. Removed all double quotes from echo, test, and git clone commands. Git clone URL is now built in a variable to avoid quoting issues with the token. Fixes pre-release and auto-release workflows failing with: fatal: protocol '"https' is not supported Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) --- .mokogitea/workflows/auto-release.yml | 38 +++++++++++++-------------- .mokogitea/workflows/pre-release.yml | 19 +++++++------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/.mokogitea/workflows/auto-release.yml b/.mokogitea/workflows/auto-release.yml index fae65eb..ca40435 100644 --- a/.mokogitea/workflows/auto-release.yml +++ b/.mokogitea/workflows/auto-release.yml @@ -71,21 +71,20 @@ jobs: MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting run: | - if [ -f "/opt/moko-platform/cli/version_bump.php" ] && [ -f "/opt/moko-platform/vendor/autoload.php" ]; then - echo "Using pre-installed /opt/moko-platform" - echo "MOKO_CLI=/opt/moko-platform/cli" >> "$GITHUB_ENV" + if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then + echo Using pre-installed /opt/moko-platform + echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV else - echo "Falling back to fresh clone" - if ! command -v composer &> /dev/null; then - sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer >/dev/null 2>&1 + echo Falling back to fresh clone + if ! command -v composer > /dev/null 2>&1; then + sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1 fi rm -rf /tmp/moko-platform-api - git clone --depth 1 --branch main --quiet \ - "https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git" \ - /tmp/moko-platform-api + CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git + git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api cd /tmp/moko-platform-api composer install --no-dev --no-interaction --quiet - echo "MOKO_CLI=/tmp/moko-platform-api/cli" >> "$GITHUB_ENV" + echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV fi - name: Rename branch to rc @@ -156,21 +155,20 @@ jobs: MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_MIRROR_TOKEN }}"}}' run: | - if [ -f "/opt/moko-platform/cli/version_bump.php" ] && [ -f "/opt/moko-platform/vendor/autoload.php" ]; then - echo "Using pre-installed /opt/moko-platform" - echo "MOKO_CLI=/opt/moko-platform/cli" >> "$GITHUB_ENV" + if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then + echo Using pre-installed /opt/moko-platform + echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV else - echo "Falling back to fresh clone" - if ! command -v composer &> /dev/null; then - sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer >/dev/null 2>&1 + echo Falling back to fresh clone + if ! command -v composer > /dev/null 2>&1; then + sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1 fi rm -rf /tmp/moko-platform-api - git clone --depth 1 --branch main --quiet \ - "https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git" \ - /tmp/moko-platform-api + CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git + git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api cd /tmp/moko-platform-api composer install --no-dev --no-interaction --quiet - echo "MOKO_CLI=/tmp/moko-platform-api/cli" >> "$GITHUB_ENV" + echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV fi - name: "Publish stable release" diff --git a/.mokogitea/workflows/pre-release.yml b/.mokogitea/workflows/pre-release.yml index 424fdf4..31540a7 100644 --- a/.mokogitea/workflows/pre-release.yml +++ b/.mokogitea/workflows/pre-release.yml @@ -64,20 +64,19 @@ jobs: MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting run: | # Use pre-installed /opt/moko-platform if available (updated by cron every 6h) - if [ -f "/opt/moko-platform/cli/version_bump.php" ] && [ -f "/opt/moko-platform/vendor/autoload.php" ]; then - echo "Using pre-installed /opt/moko-platform" - echo "MOKO_CLI=/opt/moko-platform/cli" >> "$GITHUB_ENV" + if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then + echo Using pre-installed /opt/moko-platform + echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV else - echo "Falling back to fresh clone" - if ! command -v composer &> /dev/null; then - sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer >/dev/null 2>&1 + echo Falling back to fresh clone + if ! command -v composer > /dev/null 2>&1; then + sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer > /dev/null 2>&1 fi rm -rf /tmp/moko-platform-api - git clone --depth 1 --branch main --quiet \ - "https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git" \ - /tmp/moko-platform-api + CLONE_URL=https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git + git clone --depth 1 --branch main --quiet $CLONE_URL /tmp/moko-platform-api cd /tmp/moko-platform-api && composer install --no-dev --no-interaction --quiet - echo "MOKO_CLI=/tmp/moko-platform-api/cli" >> "$GITHUB_ENV" + echo MOKO_CLI=/tmp/moko-platform-api/cli >> $GITHUB_ENV fi - name: Detect platform From 6bd26698c491da0417172c75bf28673e180896af Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 6 Jun 2026 12:53:27 -0500 Subject: [PATCH 4/4] fix: check for manifest_element.php in pre-installed tools validation Runner image has stale /opt/moko-platform missing manifest_element.php. Adding it to the existence check forces a fresh clone until the image is rebuilt. Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) --- .mokogitea/workflows/pre-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mokogitea/workflows/pre-release.yml b/.mokogitea/workflows/pre-release.yml index 31540a7..86908c2 100644 --- a/.mokogitea/workflows/pre-release.yml +++ b/.mokogitea/workflows/pre-release.yml @@ -64,7 +64,7 @@ jobs: MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting run: | # Use pre-installed /opt/moko-platform if available (updated by cron every 6h) - if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then + if [ -f /opt/moko-platform/cli/version_bump.php ] && [ -f /opt/moko-platform/cli/manifest_element.php ] && [ -f /opt/moko-platform/vendor/autoload.php ]; then echo Using pre-installed /opt/moko-platform echo MOKO_CLI=/opt/moko-platform/cli >> $GITHUB_ENV else